xref: /AOO41X/main/sw/source/ui/index/swuiidxmrk.cxx (revision efeef26f81c84063fb0a91bde3856d4a51172d90)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sw.hxx"
26 #ifdef SW_DLLIMPLEMENTATION
27 #undef SW_DLLIMPLEMENTATION
28 #endif
29 
30 #include "swuiidxmrk.hxx"
31 #include <hintids.hxx>
32 #include <helpid.h>
33 #define _SVSTDARR_STRINGSSORT
34 #include <svl/svstdarr.hxx>
35 #include <comphelper/processfactory.hxx>
36 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
37 #include <com/sun/star/beans/PropertyValue.hpp>
38 #include <com/sun/star/beans/XPropertySet.hpp>
39 #include <com/sun/star/util/SearchOptions.hpp>
40 #include <com/sun/star/util/SearchFlags.hpp>
41 #include <com/sun/star/i18n/TransliterationModules.hpp>
42 #include <svl/stritem.hxx>
43 #include <vcl/msgbox.hxx>
44 #include <sfx2/dispatch.hxx>
45 #include <svl/eitem.hxx>
46 #include <svtools/txtcmp.hxx>
47 #include <editeng/scripttypeitem.hxx>
48 #include <svl/itemset.hxx>
49 #include <editeng/langitem.hxx>
50 #include "editeng/unolingu.hxx"
51 #include <swtypes.hxx>
52 #include <idxmrk.hxx>
53 #include <txttxmrk.hxx>
54 #include <wrtsh.hxx>
55 #include <view.hxx>
56 #include <multmrk.hxx>
57 #include <swundo.hxx>                   // fuer Undo-Ids
58 #include <cmdid.h>
59 #include <index.hrc>
60 #include <idxmrk.hrc>
61 #include <swmodule.hxx>
62 #include <fldmgr.hxx>
63 #include <fldbas.hxx>
64 #include <utlui.hrc>
65 #include <swcont.hxx>
66 #include <svl/cjkoptions.hxx>
67 #include <ndtxt.hxx>
68 #include <breakit.hxx>
69 #include <SwRewriter.hxx>
70 
71 #include "swuiidxmrk.hxx"
72 #include <unomid.h>
73 
74 
75 #define POS_CONTENT 0
76 #define POS_INDEX   1
77 #define POS_USER    2
78 
79 static sal_uInt16 nTypePos = 1; // TOX_INDEX as standard
80 static sal_uInt16 nKey1Pos = USHRT_MAX;
81 
82 static sal_uInt16 nKey2Pos = USHRT_MAX;
83 
84 using namespace com::sun::star;
85 using namespace com::sun::star::i18n;
86 using namespace com::sun::star::lang;
87 using namespace com::sun::star::util;
88 using namespace com::sun::star::i18n;
89 using ::rtl::OUString;
90 using namespace ::comphelper;
91 using namespace ::com::sun::star;
92 
93 /*--------------------------------------------------------------------
94      Beschreibung:  Dialog zum Einfuegen einer Verzeichnismarkierung
95  --------------------------------------------------------------------*/
SwIndexMarkDlg(Window * pParent,sal_Bool bNewDlg,const ResId & rResId,sal_Int32 _nOptionsId,SwWrtShell & rWrtShell)96 SwIndexMarkDlg::SwIndexMarkDlg(Window *pParent,
97                                sal_Bool bNewDlg,
98                                const ResId& rResId,
99                                sal_Int32 _nOptionsId, SwWrtShell& rWrtShell ) :
100       Window(pParent, rResId),
101     aIndexFL(this,  SW_RES(FL_INDEX )),
102     aTypeFT (this,  SW_RES(LBL_INDEX    )),
103     aTypeDCB(this,  SW_RES(DCB_INDEX    )),
104     aNewBT(this,    SW_RES(BT_NEW   )),
105 
106     aEntryFT(this,  SW_RES(LBL_ENTRY    )),
107     aEntryED(this,  SW_RES(SL_ENTRY )),
108     aPhoneticFT0(this,  SW_RES(FT_PHONETIC_1 )),
109     aPhoneticED0(this,  SW_RES(ED_PHONETIC_1 )),
110 
111     aKeyFT(this,    SW_RES(LBL_KEY  )),
112     aKeyDCB(this,   SW_RES(DCB_KEY  )),
113     aPhoneticFT1(this,  SW_RES(FT_PHONETIC_2 )),
114     aPhoneticED1(this,  SW_RES(ED_PHONETIC_2 )),
115 
116     aKey2FT(this,   SW_RES(LBL_KEY2 )),
117     aKey2DCB(this,  SW_RES(DCB_KEY2 )),
118     aPhoneticFT2(this,  SW_RES(FT_PHONETIC_3 )),
119     aPhoneticED2(this,  SW_RES(ED_PHONETIC_3 )),
120 
121     aLevelFT(this,  SW_RES(LBL_LEVEL    )),
122     aLevelED(this,  SW_RES(SL_LEVEL )),
123     aMainEntryCB(this, SW_RES(CB_MAIN_ENTRY )),
124     aApplyToAllCB(this,SW_RES(CB_APPLY_TO_ALL)),
125     aSearchCaseSensitiveCB(this,    SW_RES(CB_CASESENSITIVE )),
126     aSearchCaseWordOnlyCB(this,     SW_RES(CB_WORDONLY      )),
127 
128 
129     aOKBT(this,     SW_RES(BT_OK    )),
130     aCancelBT(this, SW_RES(BT_CANCEL )),
131     aHelpBT(this,   SW_RES(BT_HELP   )),
132     aDelBT(this,    SW_RES(BT_DEL   )),
133 
134     aPrevSameBT(this,SW_RES(BT_PREVSAME)),
135     aNextSameBT(this,SW_RES(BT_NXTSAME)),
136     aPrevBT(this,   SW_RES(BT_PREV  )),
137     aNextBT(this,   SW_RES(BT_NXT   )),
138 
139     nOptionsId( _nOptionsId ),
140     bDel(sal_False),
141     bNewMark(bNewDlg),
142     bSelected(sal_False),
143 
144     bPhoneticED0_ChangedByUser(sal_False),
145     bPhoneticED1_ChangedByUser(sal_False),
146     bPhoneticED2_ChangedByUser(sal_False),
147     nLangForPhoneticReading(2052),
148     bIsPhoneticReadingEnabled(sal_False),
149     xExtendedIndexEntrySupplier(NULL),
150     pTOXMgr(0),
151     pSh(&rWrtShell)
152 {
153     aNewBT.SetAccessibleRelationMemberOf(&aIndexFL);
154 
155     if( SvtCJKOptions().IsCJKFontEnabled() )
156     {
157         uno::Reference< lang::XMultiServiceFactory > xMSF = getProcessServiceFactory();
158 
159         xExtendedIndexEntrySupplier =
160             uno::Reference< i18n::XExtendedIndexEntrySupplier > (
161                     xMSF->createInstance( C2U("com.sun.star.i18n.IndexEntrySupplier") ),
162                                                                         uno::UNO_QUERY );
163     }
164 
165     SetStyle(GetStyle()|WB_DIALOGCONTROL);
166     FreeResource();
167     aOKBT           .SetHelpId(HID_INSERT_IDX_MRK_OK        );
168     aCancelBT       .SetHelpId(HID_INSERT_IDX_MRK_CLOSE     );
169     aDelBT          .SetHelpId(HID_INSERT_IDX_MRK_DELETE    );
170     aNewBT          .SetHelpId(HID_INSERT_IDX_MRK_NEW       );
171     aPrevBT         .SetHelpId(HID_INSERT_IDX_MRK_PREV      );
172     aPrevSameBT     .SetHelpId(HID_INSERT_IDX_MRK_PREV_SAME );
173     aNextBT         .SetHelpId(HID_INSERT_IDX_MRK_NEXT      );
174     aNextSameBT     .SetHelpId(HID_INSERT_IDX_MRK_NEXT_SAME );
175     aTypeDCB        .SetHelpId(HID_INSERT_IDX_MRK_TYPE      );
176     aEntryED        .SetHelpId(HID_INSERT_IDX_MRK_ENTRY     );
177     aKeyDCB         .SetHelpId(HID_INSERT_IDX_MRK_PRIM_KEY  );
178     aKey2DCB        .SetHelpId(HID_INSERT_IDX_MRK_SEC_KEY   );
179     aLevelED        .SetHelpId(HID_INSERT_IDX_MRK_LEVEL     );
180     aMainEntryCB    .SetHelpId(HID_INSERT_IDX_MRK_MAIN_ENTRY);
181     aApplyToAllCB   .SetHelpId(HID_INSERT_IDX_MRK_APPLY_ALL );
182     aPhoneticED0    .SetHelpId(HID_INSERT_IDX_MRK_PHONETIC_READING );
183     aPhoneticED1    .SetHelpId(HID_INSERT_IDX_MRK_PHONETIC_READING );
184     aPhoneticED2    .SetHelpId(HID_INSERT_IDX_MRK_PHONETIC_READING );
185 
186     aSearchCaseSensitiveCB.SetHelpId(   HID_INSERT_IDX_MRK_SRCH_CASESENSITIVE   );
187     aSearchCaseWordOnlyCB.SetHelpId(    HID_INSERT_IDX_MRK_SRCH_WORDONLY        );
188 
189 
190     GetParent()->SetText( SW_RESSTR( bNewMark ? STR_IDXMRK_INSERT : STR_IDXMRK_EDIT));
191 
192     aDelBT.SetClickHdl(LINK(this,SwIndexMarkDlg,        DelHdl));
193     aPrevBT.SetClickHdl(LINK(this,SwIndexMarkDlg,       PrevHdl));
194     aPrevSameBT.SetClickHdl(LINK(this,SwIndexMarkDlg,   PrevSameHdl));
195     aNextBT.SetClickHdl(LINK(this,SwIndexMarkDlg,       NextHdl));
196     aNextSameBT.SetClickHdl(LINK(this,SwIndexMarkDlg,   NextSameHdl));
197     //aTypeDCB.SetModifyHdl(LINK(this,SwIndexMarkDlg,   ModifyHdl));
198     aTypeDCB.SetSelectHdl(LINK(this,SwIndexMarkDlg,     ModifyHdl));
199     aKeyDCB.SetModifyHdl(LINK(this,SwIndexMarkDlg,      KeyDCBModifyHdl));
200     aKey2DCB.SetModifyHdl(LINK(this,SwIndexMarkDlg,     KeyDCBModifyHdl));
201     aOKBT.SetClickHdl(LINK(this,SwIndexMarkDlg,         InsertHdl));
202     aCancelBT.SetClickHdl(LINK(this,SwIndexMarkDlg,     CloseHdl));
203     aEntryED.SetModifyHdl(LINK(this,SwIndexMarkDlg,     ModifyHdl));
204     aNewBT.SetClickHdl(LINK(this, SwIndexMarkDlg,       NewUserIdxHdl));
205     aApplyToAllCB.SetClickHdl(LINK(this, SwIndexMarkDlg, SearchTypeHdl));
206     aPhoneticED0.SetModifyHdl(LINK(this,SwIndexMarkDlg, PhoneticEDModifyHdl));
207     aPhoneticED1.SetModifyHdl(LINK(this,SwIndexMarkDlg, PhoneticEDModifyHdl));
208     aPhoneticED2.SetModifyHdl(LINK(this,SwIndexMarkDlg, PhoneticEDModifyHdl));
209 
210     if(bNewMark)
211     {
212         aDelBT.Hide();
213 
214         {
215             ImageList aTempList( SW_RES( IMG_NAVI_ENTRYBMPH ) );
216             aNewBT.SetModeImage( aTempList.GetImage( SID_SW_START + CONTENT_TYPE_INDEX ), BMP_COLOR_HIGHCONTRAST );
217         }
218 
219         {
220             ImageList aTempList( SW_RES( IMG_NAVI_ENTRYBMP ) );
221             aNewBT.SetModeImage( aTempList.GetImage( SID_SW_START + CONTENT_TYPE_INDEX ), BMP_COLOR_NORMAL );
222         }
223     }
224     else
225     {
226         aNewBT.Hide();
227         OKButton aTmp(this, WB_HIDE);
228         aOKBT.SetText( aTmp.GetText() );
229     }
230 
231     aEntryED.GrabFocus();
232 }
233 
234 /*--------------------------------------------------------------------
235      Beschreibung:  Controls neu initialisieren mit der aktuellen
236                     Markierung
237  --------------------------------------------------------------------*/
238 
239 
InitControls()240 void SwIndexMarkDlg::InitControls()
241 {
242     DBG_ASSERT(pSh && pTOXMgr, "Shell nicht da?");
243     // Inhalts-Verzeichnis
244     const SwTOXType* pType = pTOXMgr->GetTOXType(TOX_CONTENT, 0);
245     ASSERT(pType, "Kein Verzeichnistyp !!");
246     String sTmpTypeSelection;
247     if(aTypeDCB.GetSelectEntryCount())
248         sTmpTypeSelection = aTypeDCB.GetSelectEntry();
249     aTypeDCB.Clear();
250     aTypeDCB.InsertEntry(pType->GetTypeName());
251 
252     // Stichwort-Verzeichnis
253     pType = pTOXMgr->GetTOXType(TOX_INDEX, 0);
254     ASSERT(pType, "Kein Verzeichnistyp !!");
255     aTypeDCB.InsertEntry(pType->GetTypeName());
256 
257     // Benutzerverzeichnisse
258     sal_uInt16 nCount = pSh->GetTOXTypeCount(TOX_USER);
259     sal_uInt16 i;
260     for( i = 0; i < nCount; ++i )
261         aTypeDCB.InsertEntry( pSh->GetTOXType(TOX_USER, i)->GetTypeName() );
262 
263     // KeyWords Primary einlesen
264     SvStringsSort aArr;
265     nCount = pSh->GetTOIKeys( TOI_PRIMARY, aArr );
266     for(i=0; i < nCount; ++i)
267         aKeyDCB.InsertEntry( *aArr[ i ] );
268 
269     // KeyWords Secondary einlesen
270     nCount = pSh->GetTOIKeys( TOI_SECONDARY, aArr );
271     for(i=0; i < nCount; ++i)
272         aKey2DCB.InsertEntry( *aArr[ i ] );
273 
274     UpdateLanguageDependenciesForPhoneticReading();
275 
276     // Aktueller Eintrag
277     const SwTOXMark* pMark = pTOXMgr->GetCurTOXMark();
278     if( pMark && !bNewMark)
279     {
280         // Controls-Handling
281 
282         // nur wenn mehr als eins vorhanden
283         // wenn gleich landet es auf dem gleichen Eintrag
284         pSh->SttCrsrMove();
285 
286         const SwTOXMark* pMoveMark;
287         sal_Bool bShow = sal_False;
288 
289         pMoveMark = &pSh->GotoTOXMark( *pMark, TOX_PRV );
290         if( pMoveMark != pMark )
291             pSh->GotoTOXMark( *pMoveMark, TOX_NXT ), bShow = sal_True;
292         aPrevBT.Enable( pMoveMark != pMark );
293         pMoveMark = &pSh->GotoTOXMark( *pMark, TOX_NXT );
294         if( pMoveMark != pMark )
295             pSh->GotoTOXMark( *pMoveMark, TOX_PRV ), bShow = sal_True;
296         aNextBT.Enable( pMoveMark != pMark );
297         if( bShow )
298         {
299             aPrevBT.Show();
300             aNextBT.Show();
301             bShow = sal_False;
302         }
303 
304         pMoveMark = &pSh->GotoTOXMark( *pMark, TOX_SAME_PRV );
305         if( pMoveMark != pMark )
306             pSh->GotoTOXMark( *pMoveMark, TOX_SAME_NXT ), bShow = sal_True;
307         aPrevSameBT.Enable( pMoveMark != pMark );
308         pMoveMark = &pSh->GotoTOXMark( *pMark, TOX_SAME_NXT );
309         if( pMoveMark != pMark )
310             pSh->GotoTOXMark( *pMoveMark, TOX_SAME_PRV ), bShow = sal_True;
311         aNextSameBT.Enable( pMoveMark != pMark );
312         if( bShow )
313         {
314             aNextSameBT.Show();
315             aPrevSameBT.Show();
316         }
317         pSh->EndCrsrMove();
318 
319         aTypeFT.Show();
320 
321         aTypeDCB.Enable(sal_False);
322         aTypeFT.Enable(sal_False);
323 
324         UpdateDialog();
325     }
326     else
327     {   // aktuelle Selektion (1.Element) anzeigen  ????
328         sal_uInt16 nCnt = pSh->GetCrsrCnt();
329         if (nCnt < 2)
330         {
331             bSelected = !pSh->HasSelection();
332             aOrgStr = pSh->GetView().GetSelectionTextParam(sal_True, sal_False);
333             aEntryED.SetText(aOrgStr);
334 
335             //alle gleichen Eintraege aufzunehmen darf nur im Body und auch da nur
336             //bei vorhandener einfacher Selektion erlaubt werden
337             const sal_uInt16 nFrmType = pSh->GetFrmType(0,sal_True);
338             aApplyToAllCB.Show();
339             aSearchCaseSensitiveCB.Show();
340             aSearchCaseWordOnlyCB.Show();
341             aApplyToAllCB.Enable(0 != aOrgStr.Len() &&
342                 0 == (nFrmType & ( FRMTYPE_HEADER | FRMTYPE_FOOTER | FRMTYPE_FLY_ANY )));
343             SearchTypeHdl(&aApplyToAllCB);
344         }
345 
346         // Verzeichnistyp ist default
347         if( sTmpTypeSelection.Len() &&
348             LISTBOX_ENTRY_NOTFOUND != aTypeDCB.GetEntryPos( sTmpTypeSelection ) )
349             aTypeDCB.SelectEntry(sTmpTypeSelection);
350         else
351             aTypeDCB.SelectEntry(aTypeDCB.GetEntry(nTypePos));
352         ModifyHdl(&aTypeDCB);
353     }
354 }
355 
UpdateLanguageDependenciesForPhoneticReading()356 void    SwIndexMarkDlg::UpdateLanguageDependenciesForPhoneticReading()
357 {
358     //no phonetic reading if no global cjk support
359     if( !xExtendedIndexEntrySupplier.is() )
360     {
361         bIsPhoneticReadingEnabled = sal_False;
362         return;
363     }
364     bIsPhoneticReadingEnabled = sal_True;
365 
366     //get the current language
367     if(!bNewMark) //if dialog is opened to iterate existing marks
368     {
369         ASSERT(pTOXMgr, "need TOXMgr")
370         if(!pTOXMgr)
371             return;
372         SwTOXMark* pMark = pTOXMgr->GetCurTOXMark();
373         ASSERT(pMark, "need current SwTOXMark");
374         if(!pMark)
375             return;
376         SwTxtTOXMark* pTxtTOXMark = pMark->GetTxtTOXMark();
377         ASSERT(pTxtTOXMark, "need current SwTxtTOXMark");
378         if(!pTxtTOXMark)
379             return;
380         const SwTxtNode* pTxtNode = pTxtTOXMark->GetpTxtNd();
381         ASSERT(pTxtNode, "need current SwTxtNode");
382         if(!pTxtNode)
383             return;
384         xub_StrLen nTextIndex = *pTxtTOXMark->GetStart();
385         nLangForPhoneticReading = pTxtNode->GetLang( nTextIndex );
386     }
387     else //if dialog is opened to create a new mark
388     {
389         sal_uInt16 nScriptType = pSh->GetScriptType();
390         sal_uInt16 nWhich;
391         switch(nScriptType)
392         {
393             case SCRIPTTYPE_ASIAN: nWhich = RES_CHRATR_CJK_LANGUAGE; break;
394             case SCRIPTTYPE_COMPLEX:nWhich = RES_CHRATR_CTL_LANGUAGE; break;
395             //case SCRIPTTYPE_LATIN:
396             default:nWhich = RES_CHRATR_LANGUAGE; break;
397         }
398         SfxItemSet aLangSet(pSh->GetAttrPool(), nWhich, nWhich);
399         pSh->GetCurAttr(aLangSet);
400         nLangForPhoneticReading = ((const SvxLanguageItem&)aLangSet.Get(nWhich)).GetLanguage();
401     }
402 
403     /*
404     //enable phonetic reading dependent on the current language
405     {
406         lang::Locale aLocale( SvxCreateLocale( LanguageType( nLangForPhoneticReading ) ) );
407         bIsPhoneticReadingEnabled = xExtendedIndexEntrySupplier->usePhoneticEntry( aLocale );
408     }
409     */
410 }
411 
GetDefaultPhoneticReading(const String & rText)412 String  SwIndexMarkDlg::GetDefaultPhoneticReading( const String& rText )
413 {
414     if( !bIsPhoneticReadingEnabled )
415         return aEmptyStr;
416 
417     lang::Locale aLocale( SvxCreateLocale( LanguageType( nLangForPhoneticReading ) ) );
418     return xExtendedIndexEntrySupplier->getPhoneticCandidate(rText, aLocale);
419 }
420 
421 /* -----------------07.09.99 10:43-------------------
422     Change the content of aEntryED if text is selected
423  --------------------------------------------------*/
424 
Activate()425 void    SwIndexMarkDlg::Activate()
426 {
427     // aktuelle Selektion (1.Element) anzeigen  ????
428     if(bNewMark)
429     {
430         sal_uInt16 nCnt = pSh->GetCrsrCnt();
431         if (nCnt < 2)
432         {
433             bSelected = !pSh->HasSelection();
434             aOrgStr = pSh->GetView().GetSelectionTextParam(sal_True, sal_False);
435             aEntryED.SetText(aOrgStr);
436 
437             //alle gleichen Eintraege aufzunehmen darf nur im Body und auch da nur
438             //bei vorhandener einfacher Selektion erlaubt werden
439             const sal_uInt16 nFrmType = pSh->GetFrmType(0,sal_True);
440             aApplyToAllCB.Show();
441             aSearchCaseSensitiveCB.Show();
442             aSearchCaseWordOnlyCB.Show();
443             aApplyToAllCB.Enable(0 != aOrgStr.Len() &&
444                 0 == (nFrmType & ( FRMTYPE_HEADER | FRMTYPE_FOOTER | FRMTYPE_FLY_ANY )));
445             SearchTypeHdl(&aApplyToAllCB);
446         }
447         ModifyHdl(&aTypeDCB);
448     }
449 }
450 
451 /*--------------------------------------------------------------------
452      Beschreibung:  Ok-Button auswerten
453  --------------------------------------------------------------------*/
Apply()454 void SwIndexMarkDlg::Apply()
455 {
456     InsertUpdate();
457     if(bSelected)
458         pSh->ResetSelect(0, sal_False);
459 }
460 
461 /*--------------------------------------------------------------------
462     Beschreibung: Aenderungen uebernehmen
463  --------------------------------------------------------------------*/
464 
465 
InsertUpdate()466 void SwIndexMarkDlg::InsertUpdate()
467 {
468     pSh->StartUndo(bDel ? UNDO_INDEX_ENTRY_DELETE : UNDO_INDEX_ENTRY_INSERT);
469     pSh->StartAllAction();
470 
471     SwRewriter aRewriter;
472 
473     if( bNewMark )
474     {
475         InsertMark();
476 
477         if ( pTOXMgr->GetCurTOXMark())
478             aRewriter.AddRule(UNDO_ARG1, pTOXMgr->GetCurTOXMark()->GetText());
479     }
480     else if( !pSh->HasReadonlySel() )
481     {
482         if ( pTOXMgr->GetCurTOXMark())
483             aRewriter.AddRule(UNDO_ARG1,
484                               pTOXMgr->GetCurTOXMark()->GetText());
485 
486         if( bDel )
487             pTOXMgr->DeleteTOXMark();
488         else if( pTOXMgr->GetCurTOXMark() )
489             UpdateMark();
490     }
491 
492     pSh->EndAllAction();
493     pSh->EndUndo(bDel ? UNDO_INDEX_ENTRY_DELETE : UNDO_INDEX_ENTRY_INSERT);
494 
495     if((nTypePos = aTypeDCB.GetEntryPos(aTypeDCB.GetSelectEntry())) == LISTBOX_ENTRY_NOTFOUND)
496         nTypePos = 0;
497 
498     nKey1Pos = aKeyDCB.GetEntryPos(aKeyDCB.GetText());
499     nKey2Pos = aKey2DCB.GetEntryPos(aKey2DCB.GetText());
500 }
501 
502 /*--------------------------------------------------------------------
503      Beschreibung:  Marke einfuegen
504  --------------------------------------------------------------------*/
lcl_SelectSameStrings(SwWrtShell & rSh,sal_Bool bWordOnly,sal_Bool bCaseSensitive)505 static void lcl_SelectSameStrings(SwWrtShell& rSh, sal_Bool bWordOnly, sal_Bool bCaseSensitive)
506 {
507     rSh.Push();
508 
509     SearchOptions aSearchOpt(
510                         SearchAlgorithms_ABSOLUTE,
511                         ( bWordOnly ? SearchFlags::NORM_WORD_ONLY : 0 ),
512                         rSh.GetSelTxt(), OUString(),
513                         SvxCreateLocale( GetAppLanguage() ),
514                         0, 0, 0,
515                         (bCaseSensitive
516                             ? 0
517                             : TransliterationModules_IGNORE_CASE) );
518 
519     rSh.ClearMark();
520     sal_Bool bCancel;
521 
522     //todo/mba: assuming that notes should not be searched
523     sal_Bool bSearchInNotes = sal_False;
524     rSh.Find( aSearchOpt,  bSearchInNotes, DOCPOS_START, DOCPOS_END, bCancel,
525                         (FindRanges)(FND_IN_SELALL|FND_IN_BODYONLY), sal_False );
526 }
527 
528 
InsertMark()529 void SwIndexMarkDlg::InsertMark()
530 {
531     sal_uInt16 nPos = aTypeDCB.GetEntryPos(aTypeDCB.GetSelectEntry());
532     TOXTypes eType = nPos == POS_CONTENT ? TOX_CONTENT :
533                         nPos == POS_INDEX ? TOX_INDEX : TOX_USER;
534 
535     SwTOXMarkDescription aDesc(eType);
536 
537     sal_uInt16 nLevel = (sal_uInt16)aLevelED.Denormalize(aLevelED.GetValue());
538     switch(nPos)
539     {
540         case POS_CONTENT : break;
541         case POS_INDEX:     // Stichwortverzeichnismarke
542         {
543             UpdateKeyBoxes();
544             String  aPrim(aKeyDCB.GetText());
545             String  aSec(aKey2DCB.GetText());
546             aDesc.SetPrimKey(aPrim);
547             aDesc.SetSecKey(aSec);
548             aDesc.SetMainEntry(aMainEntryCB.IsChecked());
549             aDesc.SetPhoneticReadingOfAltStr(aPhoneticED0.GetText());
550             aDesc.SetPhoneticReadingOfPrimKey(aPhoneticED1.GetText());
551             aDesc.SetPhoneticReadingOfSecKey(aPhoneticED2.GetText());
552         }
553         break;
554         default:            // Userdefinedverz.-Marke
555         {
556             String aName(aTypeDCB.GetSelectEntry());
557             aDesc.SetTOUName(aName);
558         }
559     }
560     if (aOrgStr != aEntryED.GetText())
561         aDesc.SetAltStr(aEntryED.GetText());
562     sal_Bool bApplyAll = aApplyToAllCB.IsChecked();
563     sal_Bool bWordOnly = aSearchCaseWordOnlyCB.IsChecked();
564     sal_Bool bCaseSensitive = aSearchCaseSensitiveCB.IsChecked();
565 
566     pSh->StartAllAction();
567     // hier muessen alle gleichen Strings selektiert werden
568     // damit der Eintrag auf alle gleichen Strings angewandt wird
569     if(bApplyAll)
570     {
571         lcl_SelectSameStrings(*pSh, bWordOnly, bCaseSensitive);
572     }
573     aDesc.SetLevel(nLevel);
574     SwTOXMgr aMgr(pSh);
575     aMgr.InsertTOXMark(aDesc);
576     if(bApplyAll)
577         pSh->Pop(sal_False);
578 
579     pSh->EndAllAction();
580 }
581 
582 /*--------------------------------------------------------------------
583      Beschreibung:  Marke Updaten
584  --------------------------------------------------------------------*/
585 
586 
UpdateMark()587 void SwIndexMarkDlg::UpdateMark()
588 {
589     String  aAltText(aEntryED.GetText());
590     String* pAltText = aOrgStr != aEntryED.GetText() ? &aAltText : 0;
591     //empty alternative texts are not allowed
592     if(pAltText && !pAltText->Len())
593         return;
594 
595     UpdateKeyBoxes();
596 
597     sal_uInt16 nPos = aTypeDCB.GetEntryPos(aTypeDCB.GetSelectEntry());
598     TOXTypes eType = TOX_USER;
599     if(POS_CONTENT == nPos)
600         eType = TOX_CONTENT;
601     else if(POS_INDEX == nPos)
602         eType = TOX_INDEX;
603 
604     SwTOXMarkDescription aDesc(eType);
605     aDesc.SetLevel( static_cast< int >(aLevelED.GetValue()) );
606     if(pAltText)
607         aDesc.SetAltStr(*pAltText);
608 
609     String  aPrim(aKeyDCB.GetText());
610     if(aPrim.Len())
611         aDesc.SetPrimKey(aPrim);
612     String  aSec(aKey2DCB.GetText());
613     if(aSec.Len())
614         aDesc.SetSecKey(aSec);
615 
616     if(eType == TOX_INDEX)
617     {
618         aDesc.SetPhoneticReadingOfAltStr(aPhoneticED0.GetText());
619         aDesc.SetPhoneticReadingOfPrimKey(aPhoneticED1.GetText());
620         aDesc.SetPhoneticReadingOfSecKey(aPhoneticED2.GetText());
621     }
622     aDesc.SetMainEntry(aMainEntryCB.IsVisible() && aMainEntryCB.IsChecked());
623     pTOXMgr->UpdateTOXMark(aDesc);
624 }
625 
626 /*--------------------------------------------------------------------
627     Beschreibung: Neue Keys eintragen
628  --------------------------------------------------------------------*/
629 
630 
UpdateKeyBoxes()631 void SwIndexMarkDlg::UpdateKeyBoxes()
632 {
633     String aKey(aKeyDCB.GetText());
634     sal_uInt16 nPos = aKeyDCB.GetEntryPos(aKey);
635 
636     if(nPos == LISTBOX_ENTRY_NOTFOUND && aKey.Len() > 0)
637     {   // neuen Key erzeugen
638         aKeyDCB.InsertEntry(aKey);
639     }
640 
641     aKey = aKey2DCB.GetText();
642     nPos = aKey2DCB.GetEntryPos(aKey);
643 
644     if(nPos == LISTBOX_ENTRY_NOTFOUND && aKey.Len() > 0)
645     {   // neuen Key erzeugen
646         aKey2DCB.InsertEntry(aKey);
647     }
648 }
649 /* -----------------13.10.99 15:10-------------------
650 
651  --------------------------------------------------*/
652 class SwNewUserIdxDlg : public ModalDialog
653 {
654     OKButton        aOKPB;
655     CancelButton    aCancelPB;
656     HelpButton      aHelpPB;
657     FixedLine       aNameFL;
658     FixedText       aNameFT;
659     Edit            aNameED;
660 
661     SwIndexMarkDlg* pDlg;
662 
663     DECL_LINK( ModifyHdl, Edit*);
664 
665     public:
SwNewUserIdxDlg(SwIndexMarkDlg * pParent)666         SwNewUserIdxDlg(SwIndexMarkDlg* pParent) :
667             ModalDialog(pParent, SW_RES(DLG_NEW_USER_IDX)),
668             aOKPB(this, SW_RES(     PB_OK       )),
669             aCancelPB(this, SW_RES( PB_CANCEL   )),
670             aHelpPB(this, SW_RES(   PB_HELP     )),
671             aNameFL(this, SW_RES(    FL_NAME     )),
672             aNameFT(this, SW_RES(   FT_NAME     )),
673             aNameED(this, SW_RES(    ED_NAME     )),
674             pDlg(pParent)
675             {
676                 FreeResource();
677                 aNameED.SetModifyHdl(LINK(this, SwNewUserIdxDlg, ModifyHdl));
678                 aOKPB.Enable(sal_False);
679                 aNameED.GrabFocus();
680             }
681 
682     virtual void    Apply();
GetName()683     String  GetName(){return aNameED.GetText();}
684 };
Apply()685 void SwNewUserIdxDlg::Apply()
686 {
687 }
688 
IMPL_LINK(SwNewUserIdxDlg,ModifyHdl,Edit *,pEdit)689 IMPL_LINK( SwNewUserIdxDlg, ModifyHdl, Edit*, pEdit)
690 {
691     aOKPB.Enable(pEdit->GetText().Len() && !pDlg->IsTOXType(pEdit->GetText()));
692     return 0;
693 }
694 
IMPL_LINK(SwIndexMarkDlg,NewUserIdxHdl,Button *,EMPTYARG)695 IMPL_LINK( SwIndexMarkDlg, NewUserIdxHdl, Button*, EMPTYARG)
696 {
697     SwNewUserIdxDlg* pDlg = new SwNewUserIdxDlg(this);
698     if(RET_OK == pDlg->Execute())
699     {
700         String sNewName(pDlg->GetName());
701         aTypeDCB.InsertEntry(sNewName);
702         aTypeDCB.SelectEntry(sNewName);
703     }
704     delete pDlg;
705     return 0;
706 }
707 /* -----------------------------17.01.00 12:18--------------------------------
708 
709  ---------------------------------------------------------------------------*/
IMPL_LINK(SwIndexMarkDlg,SearchTypeHdl,CheckBox *,pBox)710 IMPL_LINK( SwIndexMarkDlg, SearchTypeHdl, CheckBox*, pBox)
711 {
712     sal_Bool bEnable = pBox->IsChecked() && pBox->IsEnabled();
713     aSearchCaseWordOnlyCB.Enable(bEnable);
714     aSearchCaseSensitiveCB.Enable(bEnable);
715     return 0;
716 }
717 /* -----------------07.09.99 10:30-------------------
718 
719  --------------------------------------------------*/
IMPL_LINK(SwIndexMarkDlg,InsertHdl,Button *,pButton)720 IMPL_LINK( SwIndexMarkDlg, InsertHdl, Button *, pButton )
721 {
722     Apply();
723     //close the dialog if only one entry is available
724     if(!bNewMark && !aPrevBT.IsVisible() && !aNextBT.IsVisible())
725         CloseHdl(pButton);
726     return 0;
727 }
728 /* -----------------07.09.99 10:29-------------------
729 
730  --------------------------------------------------*/
IMPL_LINK(SwIndexMarkDlg,CloseHdl,Button *,EMPTYARG)731 IMPL_LINK( SwIndexMarkDlg, CloseHdl, Button *, EMPTYARG )
732 {
733     if(bNewMark)
734     {
735         sal_uInt16 nSlot = FN_INSERT_IDX_ENTRY_DLG;
736         SfxViewFrame::Current()->GetDispatcher()->Execute(nSlot,
737                     SFX_CALLMODE_ASYNCHRON|SFX_CALLMODE_RECORD);
738     }
739     else
740     {
741         ((SwIndexMarkModalDlg*)GetParent())->EndDialog(RET_CANCEL);
742     }
743     return 0;
744 }
745 /*--------------------------------------------------------------------
746      Beschreibung:  VerzeichnisTyp auswaehlen nur bei Einfuegen
747  --------------------------------------------------------------------*/
IMPL_LINK(SwIndexMarkDlg,ModifyHdl,ListBox *,pBox)748 IMPL_LINK( SwIndexMarkDlg, ModifyHdl, ListBox *, pBox )
749 {
750     if(&aTypeDCB == pBox)
751     {
752         // Verzeichnistyp setzen
753         sal_uInt16 nPos = aTypeDCB.GetEntryPos(aTypeDCB.GetSelectEntry());
754         sal_Bool bLevelEnable = sal_False,
755             bKeyEnable    = sal_False,
756             bSetKey2      = sal_False,
757             bKey2Enable  = sal_False,
758             bEntryHasText   = sal_False,
759             bKey1HasText    = sal_False,
760             bKey2HasText    = sal_False;
761         if(nPos == POS_INDEX)
762         {
763             if(aEntryED.GetText().Len())
764                 bEntryHasText = sal_True;
765             aPhoneticED0.SetText(GetDefaultPhoneticReading(aEntryED.GetText()));
766 
767             bKeyEnable = sal_True;
768             aKeyDCB.SetText(aKeyDCB.GetEntry(nKey1Pos));
769             aPhoneticED1.SetText(GetDefaultPhoneticReading(aKeyDCB.GetText()));
770             if(aKeyDCB.GetText().Len() > 0)
771             {
772                 bKey1HasText = bSetKey2 = bKey2Enable = sal_True;
773                 aKey2DCB.SetText(aKey2DCB.GetEntry(nKey2Pos));
774                 aPhoneticED2.SetText(GetDefaultPhoneticReading(aKey2DCB.GetText()));
775                 if(aKey2DCB.GetText().Len())
776                     bKey2HasText = sal_True;
777             }
778         }
779         else
780         {
781             bLevelEnable = sal_True;
782             aLevelED.SetMax(MAXLEVEL);
783             aLevelED.SetValue(aLevelED.Normalize(0));
784             bSetKey2 = sal_True;
785         }
786         aLevelFT.Show(bLevelEnable);
787         aLevelED.Show(bLevelEnable);
788         aMainEntryCB.Show(nPos == POS_INDEX);
789 
790         aKeyFT.Enable(bKeyEnable);
791         aKeyDCB.Enable(bKeyEnable);
792         if ( bSetKey2 )
793         {
794             aKey2DCB.Enable(bKey2Enable);
795             aKey2FT.Enable(bKey2Enable);
796         }
797         aPhoneticFT0.Enable(bKeyEnable&&bEntryHasText&&bIsPhoneticReadingEnabled);
798         aPhoneticED0.Enable(bKeyEnable&&bEntryHasText&&bIsPhoneticReadingEnabled);
799         aPhoneticFT1.Enable(bKeyEnable&&bKey1HasText&&bIsPhoneticReadingEnabled);
800         aPhoneticED1.Enable(bKeyEnable&&bKey1HasText&&bIsPhoneticReadingEnabled);
801         aPhoneticFT2.Enable(bKeyEnable&&bKey2HasText&&bIsPhoneticReadingEnabled);
802         aPhoneticED2.Enable(bKeyEnable&&bKey2HasText&&bIsPhoneticReadingEnabled);
803     }
804     else //aEntryED  !!aEntryED is not a ListBox but a Edit
805     {
806         sal_Bool bHasText = (aEntryED.GetText().Len()>0);
807         if(!bHasText)
808         {
809             aPhoneticED0.SetText(aEmptyStr);
810             bPhoneticED0_ChangedByUser = sal_False;
811         }
812         else if(!bPhoneticED0_ChangedByUser)
813             aPhoneticED0.SetText(GetDefaultPhoneticReading(aEntryED.GetText()));
814 
815         aPhoneticFT0.Enable(bHasText&&bIsPhoneticReadingEnabled);
816         aPhoneticED0.Enable(bHasText&&bIsPhoneticReadingEnabled);
817     }
818     aOKBT.Enable(!pSh->HasReadonlySel() &&
819         (aEntryED.GetText().Len() || pSh->GetCrsrCnt(sal_False)));
820     return 0;
821 }
822 
823 /*--------------------------------------------------------------------
824      Beschreibung:
825  --------------------------------------------------------------------*/
826 
827 
IMPL_LINK_INLINE_START(SwIndexMarkDlg,NextHdl,Button *,EMPTYARG)828 IMPL_LINK_INLINE_START( SwIndexMarkDlg, NextHdl, Button *, EMPTYARG )
829 {
830     InsertUpdate();
831     pTOXMgr->NextTOXMark();
832     UpdateDialog();
833     return 0;
834 }
IMPL_LINK_INLINE_END(SwIndexMarkDlg,NextHdl,Button *,EMPTYARG)835 IMPL_LINK_INLINE_END( SwIndexMarkDlg, NextHdl, Button *, EMPTYARG )
836 
837 
838 IMPL_LINK_INLINE_START( SwIndexMarkDlg, NextSameHdl, Button *, EMPTYARG )
839 {
840     InsertUpdate();
841     pTOXMgr->NextTOXMark(sal_True);
842     UpdateDialog();
843     return 0;
844 }
IMPL_LINK_INLINE_END(SwIndexMarkDlg,NextSameHdl,Button *,EMPTYARG)845 IMPL_LINK_INLINE_END( SwIndexMarkDlg, NextSameHdl, Button *, EMPTYARG )
846 
847 
848 IMPL_LINK_INLINE_START( SwIndexMarkDlg, PrevHdl, Button *, EMPTYARG )
849 {
850     InsertUpdate();
851     pTOXMgr->PrevTOXMark();
852     UpdateDialog();
853     return 0;
854 }
IMPL_LINK_INLINE_END(SwIndexMarkDlg,PrevHdl,Button *,EMPTYARG)855 IMPL_LINK_INLINE_END( SwIndexMarkDlg, PrevHdl, Button *, EMPTYARG )
856 
857 
858 IMPL_LINK_INLINE_START( SwIndexMarkDlg, PrevSameHdl, Button *, EMPTYARG )
859 {
860     InsertUpdate();
861     pTOXMgr->PrevTOXMark(sal_True);
862     UpdateDialog();
863 
864     return 0;
865 }
IMPL_LINK_INLINE_END(SwIndexMarkDlg,PrevSameHdl,Button *,EMPTYARG)866 IMPL_LINK_INLINE_END( SwIndexMarkDlg, PrevSameHdl, Button *, EMPTYARG )
867 
868 
869 IMPL_LINK( SwIndexMarkDlg, DelHdl, Button *, EMPTYARG )
870 {
871     bDel = sal_True;
872     InsertUpdate();
873     bDel = sal_False;
874 
875     if(pTOXMgr->GetCurTOXMark())
876         UpdateDialog();
877     else
878     {
879         CloseHdl(&aCancelBT);
880         SfxViewFrame::Current()->GetBindings().Invalidate(FN_EDIT_IDX_ENTRY_DLG);
881     }
882     return 0;
883 }
884 
885 /*--------------------------------------------------------------------
886      Beschreibung: Dialoganzeige erneuern
887  --------------------------------------------------------------------*/
888 
889 
UpdateDialog()890 void SwIndexMarkDlg::UpdateDialog()
891 {
892     DBG_ASSERT(pSh && pTOXMgr, "Shell nicht da?");
893     SwTOXMark* pMark = pTOXMgr->GetCurTOXMark();
894     ASSERT(pMark, "Keine aktuelle Markierung");
895     if(!pMark)
896         return;
897 
898     ViewShell::SetCareWin( GetParent() );
899 
900     aOrgStr = pMark->GetText();
901     aEntryED.SetText(aOrgStr);
902 
903     // Verzeichnistyp setzen
904     sal_Bool bLevelEnable = sal_True,
905          bKeyEnable   = sal_False,
906          bKey2Enable  = sal_False,
907          bEntryHasText  = sal_False,
908          bKey1HasText   = sal_False,
909          bKey2HasText   = sal_False;
910 
911     TOXTypes eCurType = pMark->GetTOXType()->GetType();
912     if(TOX_INDEX == eCurType)
913     {
914         bLevelEnable = sal_False;
915         bKeyEnable = sal_True;
916         bKey1HasText = bKey2Enable = 0 != pMark->GetPrimaryKey().Len();
917         bKey2HasText = 0 != pMark->GetSecondaryKey().Len();
918         bEntryHasText = 0 != pMark->GetText().Len();
919         aKeyDCB.SetText( pMark->GetPrimaryKey() );
920         aKey2DCB.SetText( pMark->GetSecondaryKey() );
921         aPhoneticED0.SetText( pMark->GetTextReading() );
922         aPhoneticED1.SetText( pMark->GetPrimaryKeyReading() );
923         aPhoneticED2.SetText( pMark->GetSecondaryKeyReading() );
924         aMainEntryCB.Check(pMark->IsMainEntry());
925     }
926     else if(TOX_CONTENT == eCurType || TOX_USER == eCurType)
927     {
928         aLevelED.SetValue(aLevelED.Normalize(pMark->GetLevel()));
929     }
930     aKeyFT.Enable(bKeyEnable);
931     aKeyDCB.Enable(bKeyEnable);
932     aLevelED.SetMax(MAXLEVEL);
933     aLevelFT.Show(bLevelEnable);
934     aLevelED.Show(bLevelEnable);
935     aMainEntryCB.Show(!bLevelEnable);
936     aKey2FT.Enable(bKey2Enable);
937     aKey2DCB.Enable(bKey2Enable);
938 
939     UpdateLanguageDependenciesForPhoneticReading();
940     aPhoneticFT0.Enable(bKeyEnable&&bEntryHasText&&bIsPhoneticReadingEnabled);
941     aPhoneticED0.Enable(bKeyEnable&&bEntryHasText&&bIsPhoneticReadingEnabled);
942     aPhoneticFT1.Enable(bKeyEnable&&bKey1HasText&&bIsPhoneticReadingEnabled);
943     aPhoneticED1.Enable(bKeyEnable&&bKey1HasText&&bIsPhoneticReadingEnabled);
944     aPhoneticFT2.Enable(bKeyEnable&&bKey2HasText&&bIsPhoneticReadingEnabled);
945     aPhoneticED2.Enable(bKeyEnable&&bKey2HasText&&bIsPhoneticReadingEnabled);
946 
947     // Verzeichnis-Typ setzen
948     aTypeDCB.SelectEntry(pMark->GetTOXType()->GetTypeName());
949 
950     // Next - Prev - Buttons setzen
951     pSh->SttCrsrMove();
952     if( aPrevBT.IsVisible() )
953     {
954         const SwTOXMark* pMoveMark = &pSh->GotoTOXMark( *pMark, TOX_PRV );
955         if( pMoveMark != pMark )
956             pSh->GotoTOXMark( *pMoveMark, TOX_NXT );
957         aPrevBT.Enable( pMoveMark != pMark );
958         pMoveMark = &pSh->GotoTOXMark( *pMark, TOX_NXT );
959         if( pMoveMark != pMark )
960             pSh->GotoTOXMark( *pMoveMark, TOX_PRV );
961         aNextBT.Enable( pMoveMark != pMark );
962     }
963 
964     if( aPrevSameBT.IsVisible() )
965     {
966         const SwTOXMark* pMoveMark = &pSh->GotoTOXMark( *pMark, TOX_SAME_PRV );
967         if( pMoveMark != pMark )
968             pSh->GotoTOXMark( *pMoveMark, TOX_SAME_NXT );
969         aPrevSameBT.Enable( pMoveMark != pMark );
970         pMoveMark = &pSh->GotoTOXMark( *pMark, TOX_SAME_NXT );
971         if( pMoveMark != pMark )
972             pSh->GotoTOXMark( *pMoveMark, TOX_SAME_PRV );
973         aNextSameBT.Enable( pMoveMark != pMark );
974     }
975 
976     sal_Bool bEnable = !pSh->HasReadonlySel();
977     aOKBT.Enable( bEnable );
978     aDelBT.Enable( bEnable );
979     aEntryED.SetReadOnly( !bEnable );
980     aLevelED.SetReadOnly( !bEnable );
981     aKeyDCB.SetReadOnly( !bEnable );
982     aKey2DCB.SetReadOnly( !bEnable );
983 
984     pSh->SelectTxtAttr( RES_TXTATR_TOXMARK, pMark->GetTxtTOXMark() );
985     // we need the point at the start of the attribut
986     pSh->SwapPam();
987 
988     pSh->EndCrsrMove();
989 }
990 
991 /*--------------------------------------------------------------------
992      Remind wether the edit boxes for Phonetic reading are changed manually
993  --------------------------------------------------------------------*/
994 
IMPL_LINK(SwIndexMarkDlg,PhoneticEDModifyHdl,Edit *,pEdit)995 IMPL_LINK( SwIndexMarkDlg, PhoneticEDModifyHdl, Edit *, pEdit )
996 {
997     if(&aPhoneticED0 == pEdit)
998     {
999         bPhoneticED0_ChangedByUser = pEdit->GetText().Len()>0;
1000     }
1001     else if(&aPhoneticED1 == pEdit)
1002     {
1003         bPhoneticED1_ChangedByUser = pEdit->GetText().Len()>0;
1004     }
1005     else if(&aPhoneticED2 == pEdit)
1006     {
1007         bPhoneticED2_ChangedByUser = pEdit->GetText().Len()>0;
1008     }
1009     return 0;
1010 }
1011 
1012 /*--------------------------------------------------------------------
1013      Beschreibung: Enable Disable des 2. Schluessels
1014  --------------------------------------------------------------------*/
1015 
IMPL_LINK(SwIndexMarkDlg,KeyDCBModifyHdl,ComboBox *,pBox)1016 IMPL_LINK( SwIndexMarkDlg, KeyDCBModifyHdl, ComboBox *, pBox )
1017 {
1018     if(&aKeyDCB == pBox)
1019     {
1020         sal_Bool bEnable = pBox->GetText().Len() > 0;
1021         if(!bEnable)
1022         {
1023             aKey2DCB.SetText(aEmptyStr);
1024             aPhoneticED1.SetText(aEmptyStr);
1025             aPhoneticED2.SetText(aEmptyStr);
1026             bPhoneticED1_ChangedByUser = sal_False;
1027             bPhoneticED2_ChangedByUser = sal_False;
1028         }
1029         else
1030         {
1031             if(pBox->IsInDropDown())
1032             {
1033                 //reset bPhoneticED1_ChangedByUser if a completly new string is selected
1034                 bPhoneticED1_ChangedByUser = sal_False;
1035             }
1036             if(!bPhoneticED1_ChangedByUser)
1037                 aPhoneticED1.SetText(GetDefaultPhoneticReading(pBox->GetText()));
1038         }
1039         aKey2DCB.Enable(bEnable);
1040         aKey2FT.Enable(bEnable);
1041     }
1042     else if(&aKey2DCB == pBox)
1043     {
1044         if(!(pBox->GetText().Len()>0))
1045         {
1046             aPhoneticED2.SetText(aEmptyStr);
1047             bPhoneticED2_ChangedByUser = sal_False;
1048         }
1049         else
1050         {
1051             if(pBox->IsInDropDown())
1052             {
1053                 //reset bPhoneticED1_ChangedByUser if a completly new string is selected
1054                 bPhoneticED2_ChangedByUser = sal_False;
1055             }
1056             if(!bPhoneticED2_ChangedByUser)
1057                 aPhoneticED2.SetText(GetDefaultPhoneticReading(pBox->GetText()));
1058         }
1059     }
1060     sal_Bool    bKey1HasText    = (0 != aKeyDCB.GetText().Len());
1061     sal_Bool    bKey2HasText    = (0 != aKey2DCB.GetText().Len());
1062 
1063     aPhoneticFT1.Enable(bKey1HasText&&bIsPhoneticReadingEnabled);
1064     aPhoneticED1.Enable(bKey1HasText&bIsPhoneticReadingEnabled);
1065     aPhoneticFT2.Enable(bKey2HasText&bIsPhoneticReadingEnabled);
1066     aPhoneticED2.Enable(bKey2HasText&bIsPhoneticReadingEnabled);
1067 
1068     return 0;
1069 }
1070 
1071 /*-----------------25.02.94 21:19-------------------
1072  dtor ueberladen
1073 --------------------------------------------------*/
1074 
1075 
~SwIndexMarkDlg()1076 SwIndexMarkDlg::~SwIndexMarkDlg()
1077 {
1078     delete pTOXMgr;
1079     ViewShell::SetCareWin( 0 );
1080 }
1081 /* -----------------07.09.99 08:41-------------------
1082 
1083  --------------------------------------------------*/
ReInitDlg(SwWrtShell & rWrtShell,SwTOXMark * pCurTOXMark)1084 void    SwIndexMarkDlg::ReInitDlg(SwWrtShell& rWrtShell, SwTOXMark* pCurTOXMark)
1085 {
1086     pSh = &rWrtShell;
1087     delete pTOXMgr;
1088     pTOXMgr = new SwTOXMgr(pSh);
1089     if(pCurTOXMark)
1090     {
1091         for(sal_uInt16 i = 0; i < pTOXMgr->GetTOXMarkCount(); i++)
1092             if(pTOXMgr->GetTOXMark(i) == pCurTOXMark)
1093             {
1094                 pTOXMgr->SetCurTOXMark(i);
1095                 break;
1096             }
1097     }
1098     InitControls();
1099 }
1100 /* -----------------06.10.99 10:00-------------------
1101 
1102  --------------------------------------------------*/
SwIndexMarkFloatDlg(SfxBindings * _pBindings,SfxChildWindow * pChild,Window * pParent,SfxChildWinInfo * pInfo,sal_Bool bNew)1103 SwIndexMarkFloatDlg::SwIndexMarkFloatDlg(SfxBindings* _pBindings,
1104                                 SfxChildWindow* pChild,
1105                                 Window *pParent,
1106                                 SfxChildWinInfo* pInfo,
1107                                 sal_Bool bNew) :
1108 SfxModelessDialog(_pBindings, pChild, pParent, SvtCJKOptions().IsCJKFontEnabled()?SW_RES(DLG_INSIDXMARK_CJK):SW_RES(DLG_INSIDXMARK)),
1109     aDlg(this, bNew, SW_RES(WIN_DLG), SvtCJKOptions().IsCJKFontEnabled()?DLG_INSIDXMARK_CJK:DLG_INSIDXMARK, *::GetActiveWrtShell())
1110 {
1111     FreeResource();
1112     aDlg.ReInitDlg(*::GetActiveWrtShell());
1113     Initialize(pInfo);
1114 }
1115 /* -----------------06.10.99 10:27-------------------
1116 
1117  --------------------------------------------------*/
Activate()1118 void    SwIndexMarkFloatDlg::Activate()
1119 {
1120     SfxModelessDialog::Activate();
1121     aDlg.Activate();
1122 }
1123 
ReInitDlg(SwWrtShell & rWrtShell)1124 void SwIndexMarkFloatDlg::ReInitDlg(SwWrtShell& rWrtShell)
1125 {
1126     aDlg.ReInitDlg( rWrtShell );
1127 }
1128 
1129 /* -----------------06.10.99 10:35-------------------
1130 
1131  --------------------------------------------------*/
SwIndexMarkModalDlg(Window * pParent,SwWrtShell & rSh,SwTOXMark * pCurTOXMark)1132 SwIndexMarkModalDlg::SwIndexMarkModalDlg(Window *pParent, SwWrtShell& rSh, SwTOXMark* pCurTOXMark) :
1133 SvxStandardDialog(pParent, SvtCJKOptions().IsCJKFontEnabled()?SW_RES(DLG_EDIT_IDXMARK_CJK):SW_RES(DLG_EDIT_IDXMARK)),
1134     aDlg(this, sal_False, SW_RES(WIN_DLG), SvtCJKOptions().IsCJKFontEnabled()?DLG_EDIT_IDXMARK_CJK:DLG_EDIT_IDXMARK, rSh)
1135 {
1136     FreeResource();
1137     aDlg.ReInitDlg(rSh, pCurTOXMark);
1138 }
1139 /* -----------------06.10.99 10:46-------------------
1140 
1141  --------------------------------------------------*/
Apply()1142 void    SwIndexMarkModalDlg::Apply()
1143 {
1144     aDlg.Apply();
1145 }
1146 /* -----------------16.09.99 14:19-------------------
1147 
1148  --------------------------------------------------*/
1149 class SwCreateAuthEntryDlg_Impl : public ModalDialog
1150 {
1151     FixedLine       aEntriesFL;
1152 
1153     FixedText*      pFixedTexts[AUTH_FIELD_END];
1154     ListBox*        pTypeListBox;
1155     ComboBox*       pIdentifierBox;
1156     Edit*           pEdits[AUTH_FIELD_END];
1157 
1158     OKButton        aOKBT;
1159     CancelButton    aCancelBT;
1160     HelpButton      aHelpBT;
1161 
1162     Link            aShortNameCheckLink;
1163 
1164     SwWrtShell&     rWrtSh;
1165 
1166     sal_Bool            m_bNewEntryMode;
1167     sal_Bool            m_bNameAllowed;
1168 
1169     DECL_LINK(IdentifierHdl, ComboBox*);
1170     DECL_LINK(ShortNameHdl, Edit*);
1171     DECL_LINK(EnableHdl, ListBox* pBox);
1172 
1173 public:
1174     SwCreateAuthEntryDlg_Impl(Window* pParent,
1175                             const String pFields[],
1176                             SwWrtShell& rSh,
1177                             sal_Bool bNewEntry,
1178                             sal_Bool bCreate);
1179     ~SwCreateAuthEntryDlg_Impl();
1180 
1181     String          GetEntryText(ToxAuthorityField eField) const;
1182 
SetCheckNameHdl(const Link & rLink)1183     void            SetCheckNameHdl(const Link& rLink) {aShortNameCheckLink = rLink;}
1184 
1185 };
1186 /*-- 15.09.99 08:43:24---------------------------------------------------
1187 
1188   -----------------------------------------------------------------------*/
1189 struct TextInfo
1190 {
1191     sal_uInt16 nToxField;
1192     const char* pHelpId;
1193 };
1194 
1195 static const TextInfo aTextInfoArr[] =
1196 {
1197     {AUTH_FIELD_IDENTIFIER,      HID_AUTH_FIELD_IDENTIFIER      },
1198     {AUTH_FIELD_AUTHORITY_TYPE,  HID_AUTH_FIELD_AUTHORITY_TYPE  },
1199     {AUTH_FIELD_AUTHOR,          HID_AUTH_FIELD_AUTHOR          },
1200     {AUTH_FIELD_TITLE,           HID_AUTH_FIELD_TITLE           },
1201     {AUTH_FIELD_YEAR,            HID_AUTH_FIELD_YEAR            },
1202     {AUTH_FIELD_PUBLISHER,       HID_AUTH_FIELD_PUBLISHER       },
1203     {AUTH_FIELD_ADDRESS,         HID_AUTH_FIELD_ADDRESS         },
1204     {AUTH_FIELD_ISBN,            HID_AUTH_FIELD_ISBN            },
1205     {AUTH_FIELD_CHAPTER,         HID_AUTH_FIELD_CHAPTER         },
1206     {AUTH_FIELD_PAGES,           HID_AUTH_FIELD_PAGES           },
1207     {AUTH_FIELD_EDITOR,          HID_AUTH_FIELD_EDITOR          },
1208     {AUTH_FIELD_EDITION,         HID_AUTH_FIELD_EDITION         },
1209     {AUTH_FIELD_BOOKTITLE,       HID_AUTH_FIELD_BOOKTITLE       },
1210     {AUTH_FIELD_VOLUME,          HID_AUTH_FIELD_VOLUME          },
1211     {AUTH_FIELD_HOWPUBLISHED,    HID_AUTH_FIELD_HOWPUBLISHED    },
1212     {AUTH_FIELD_ORGANIZATIONS,   HID_AUTH_FIELD_ORGANIZATIONS   },
1213     {AUTH_FIELD_INSTITUTION,     HID_AUTH_FIELD_INSTITUTION     },
1214     {AUTH_FIELD_SCHOOL,          HID_AUTH_FIELD_SCHOOL          },
1215     {AUTH_FIELD_REPORT_TYPE,     HID_AUTH_FIELD_REPORT_TYPE     },
1216     {AUTH_FIELD_MONTH,           HID_AUTH_FIELD_MONTH           },
1217     {AUTH_FIELD_JOURNAL,         HID_AUTH_FIELD_JOURNAL         },
1218     {AUTH_FIELD_NUMBER,          HID_AUTH_FIELD_NUMBER          },
1219     {AUTH_FIELD_SERIES,          HID_AUTH_FIELD_SERIES          },
1220     {AUTH_FIELD_ANNOTE,          HID_AUTH_FIELD_ANNOTE          },
1221     {AUTH_FIELD_NOTE,            HID_AUTH_FIELD_NOTE            },
1222     {AUTH_FIELD_URL,             HID_AUTH_FIELD_URL             },
1223     {AUTH_FIELD_CUSTOM1,         HID_AUTH_FIELD_CUSTOM1         },
1224     {AUTH_FIELD_CUSTOM2,         HID_AUTH_FIELD_CUSTOM2         },
1225     {AUTH_FIELD_CUSTOM3,         HID_AUTH_FIELD_CUSTOM3         },
1226     {AUTH_FIELD_CUSTOM4,         HID_AUTH_FIELD_CUSTOM4         },
1227     {AUTH_FIELD_CUSTOM5,         HID_AUTH_FIELD_CUSTOM5         }
1228 };
1229 
1230 sal_Bool SwAuthMarkDlg::bIsFromComponent = sal_True;
1231 
SwAuthMarkDlg(Window * pParent,const ResId & rResId,sal_Bool bNewDlg)1232 SwAuthMarkDlg::SwAuthMarkDlg(  Window *pParent,
1233                                const ResId& rResId,
1234                                sal_Bool bNewDlg) :
1235     Window(pParent, rResId),
1236     aFromComponentRB(   this, ResId(RB_FROMCOMPONENT, *rResId.GetResMgr()   )),
1237     aFromDocContentRB(  this, ResId(RB_FROMDOCCONTENT, *rResId.GetResMgr()  )),
1238 
1239     aAuthorFT(  this, ResId(FT_AUTHOR, *rResId.GetResMgr()       )),
1240     aAuthorFI(  this, ResId(FI_AUTHOR, *rResId.GetResMgr()   )),
1241     aTitleFT(   this, ResId(FT_TITLE, *rResId.GetResMgr()    )),
1242     aTitleFI(   this, ResId(FI_TITLE, *rResId.GetResMgr()    )),
1243     aEntryFT(   this, ResId(FT_ENTRY, *rResId.GetResMgr()    )),
1244     aEntryED(   this, ResId(ED_ENTRY, *rResId.GetResMgr()   )),
1245     aEntryLB(   this, ResId(LB_ENTRY, *rResId.GetResMgr()   )),
1246 
1247     aEntryFL(   this, ResId(FL_ENTRY, *rResId.GetResMgr()    )),
1248 
1249     aOKBT(      this, ResId(PB_OK, *rResId.GetResMgr()       )),
1250     aCancelBT(  this, ResId(PB_CANCEL, *rResId.GetResMgr()  )),
1251     aHelpBT(    this, ResId(PB_HELP, *rResId.GetResMgr()    )),
1252     aCreateEntryPB(this,ResId(PB_CREATEENTRY, *rResId.GetResMgr())),
1253     aEditEntryPB(this,  ResId(PB_EDITENTRY, *rResId.GetResMgr())),
1254 
1255     sChangeST(  ResId(ST_CHANGE, *rResId.GetResMgr())),
1256     bNewEntry(bNewDlg),
1257     bBibAccessInitialized(sal_False),
1258 
1259     pSh(0)
1260 {
1261     SetStyle(GetStyle()|WB_DIALOGCONTROL);
1262     FreeResource();
1263 
1264     aFromComponentRB.SetHelpId(HID_AUTH_MARK_DLG_FROM_COMP_RB);
1265     aFromDocContentRB.SetHelpId(HID_AUTH_MARK_DLG_FROM_DOC_RB );
1266     aEntryED.SetHelpId(HID_AUTH_MARK_DLG_ID_LISTBOX           );
1267     aEntryLB.SetHelpId(HID_AUTH_MARK_DLG_ID_LISTBOX           );
1268 
1269     aFromComponentRB.Show(bNewEntry);
1270     aFromDocContentRB.Show(bNewEntry);
1271     aFromComponentRB.Check(bIsFromComponent);
1272     aFromDocContentRB.Check(!bIsFromComponent);
1273 
1274     aOKBT       .SetHelpId(HID_INSERT_AUTH_MRK_OK   );
1275     aCancelBT   .SetHelpId(HID_INSERT_AUTH_MRK_CLOSE);
1276     aEntryED        .SetHelpId(HID_INSERT_AUTH_MRK_ENTRY        );
1277     aCreateEntryPB  .SetHelpId(HID_INSERT_AUTH_MRK_CREATE_ENTRY );
1278     aEditEntryPB    .SetHelpId(HID_INSERT_AUTH_MRK_EDIT_ENTRY   );
1279 
1280     aOKBT.SetClickHdl(LINK(this,SwAuthMarkDlg, InsertHdl));
1281     aCancelBT.SetClickHdl(LINK(this,SwAuthMarkDlg, CloseHdl));
1282     aCreateEntryPB.SetClickHdl(LINK(this,SwAuthMarkDlg, CreateEntryHdl));
1283     aEditEntryPB.SetClickHdl(LINK(this,SwAuthMarkDlg, CreateEntryHdl));
1284     aFromComponentRB.SetClickHdl(LINK(this,SwAuthMarkDlg, ChangeSourceHdl));
1285     aFromDocContentRB.SetClickHdl(LINK(this,SwAuthMarkDlg, ChangeSourceHdl));
1286     aEntryED.SetModifyHdl(LINK(this,SwAuthMarkDlg, EditModifyHdl));
1287 
1288     GetParent()->SetText(String(SW_RES(
1289                     bNewEntry ? STR_AUTHMRK_INSERT : STR_AUTHMRK_EDIT)));
1290     aEntryED.Show(!bNewEntry);
1291     aEntryLB.Show(bNewEntry);
1292     if(!bNewEntry)
1293     {
1294         aOKBT.SetText(sChangeST);
1295     }
1296     else
1297     {
1298         aEntryLB.SetSelectHdl(LINK(this, SwAuthMarkDlg, CompEntryHdl));
1299     }
1300 }
1301 /*-- 15.09.99 08:43:25---------------------------------------------------
1302 
1303   -----------------------------------------------------------------------*/
~SwAuthMarkDlg()1304 SwAuthMarkDlg::~SwAuthMarkDlg()
1305 {
1306 }
1307 /*-- 15.09.99 08:43:25---------------------------------------------------
1308 
1309   -----------------------------------------------------------------------*/
ReInitDlg(SwWrtShell & rWrtShell)1310 void    SwAuthMarkDlg::ReInitDlg(SwWrtShell& rWrtShell)
1311 {
1312     pSh = &rWrtShell;
1313     InitControls();
1314 }
1315 /* -----------------15.09.99 08:57-------------------
1316 
1317  --------------------------------------------------*/
IMPL_LINK(SwAuthMarkDlg,CloseHdl,PushButton *,EMPTYARG)1318 IMPL_LINK( SwAuthMarkDlg, CloseHdl, PushButton *, EMPTYARG )
1319 {
1320     if(bNewEntry)
1321     {
1322         sal_uInt16 nSlot = FN_INSERT_AUTH_ENTRY_DLG;
1323         SfxViewFrame::Current()->GetDispatcher()->Execute(nSlot,
1324                     SFX_CALLMODE_ASYNCHRON|SFX_CALLMODE_RECORD);
1325     }
1326     else
1327     {
1328         ((SwAuthMarkModalDlg*)GetParent())->EndDialog(RET_CANCEL);
1329     }
1330     return 0;
1331 }
1332 /* -----------------06.12.99 13:54-------------------
1333 
1334  --------------------------------------------------*/
lcl_FindColumnEntry(const beans::PropertyValue * pFields,sal_Int32 nLen,const String & rColumnTitle)1335 static String lcl_FindColumnEntry(const beans::PropertyValue* pFields, sal_Int32 nLen, const String& rColumnTitle)
1336 {
1337     String sRet;
1338     OUString uColumnTitle = rColumnTitle;
1339     for(sal_uInt16 i = 0; i < nLen; i++)
1340     {
1341         OUString uTmp;
1342         if(pFields[i].Name == uColumnTitle &&
1343             (pFields[i].Value >>= uTmp))
1344         {
1345             sRet = String(uTmp);
1346             break;
1347         }
1348     }
1349     return sRet;
1350 }
1351 /* -----------------------------07.12.99 15:39--------------------------------
1352 
1353  ---------------------------------------------------------------------------*/
IMPL_LINK(SwAuthMarkDlg,CompEntryHdl,ListBox *,pBox)1354 IMPL_LINK( SwAuthMarkDlg, CompEntryHdl, ListBox*, pBox)
1355 {
1356     String sEntry(pBox->GetSelectEntry());
1357     if(bIsFromComponent)
1358     {
1359         if(xBibAccess.is() && sEntry.Len())
1360         {
1361             OUString uEntry(sEntry);
1362             if(xBibAccess->hasByName(uEntry))
1363             {
1364                 uno::Any aEntry(xBibAccess->getByName(uEntry));
1365                 uno::Sequence<beans::PropertyValue> aFieldProps;
1366                 if(aEntry >>= aFieldProps)
1367                 {
1368                     const beans::PropertyValue* pProps = aFieldProps.getConstArray();
1369                     for(sal_uInt16 i = 0; i < AUTH_FIELD_END && i < aFieldProps.getLength(); i++)
1370                     {
1371                         m_sFields[i] = lcl_FindColumnEntry(
1372                                 pProps, aFieldProps.getLength(), m_sColumnTitles[i]);
1373                     }
1374                 }
1375             }
1376         }
1377     }
1378     else
1379     {
1380         if(sEntry.Len())
1381         {
1382             const SwAuthorityFieldType* pFType = (const SwAuthorityFieldType*)
1383                                         pSh->GetFldType(RES_AUTHORITY, aEmptyStr);
1384             const SwAuthEntry*  pEntry = pFType ? pFType->GetEntryByIdentifier(sEntry) : 0;
1385             for(sal_uInt16 i = 0; i < AUTH_FIELD_END; i++)
1386                 m_sFields[i] = pEntry ?
1387                             pEntry->GetAuthorField((ToxAuthorityField)i) : aEmptyStr;
1388         }
1389     }
1390     if(!pBox->GetSelectEntry().Len())
1391     {
1392         for(sal_uInt16 i = 0; i < AUTH_FIELD_END; i++)
1393             m_sFields[i] = aEmptyStr;
1394     }
1395     aAuthorFI.SetText(m_sFields[AUTH_FIELD_AUTHOR]);
1396     aTitleFI.SetText(m_sFields[AUTH_FIELD_TITLE]);
1397     return 0;
1398 }
1399 
1400 /* -----------------15.09.99 08:57-------------------
1401 
1402  --------------------------------------------------*/
IMPL_LINK(SwAuthMarkDlg,InsertHdl,PushButton *,EMPTYARG)1403 IMPL_LINK( SwAuthMarkDlg, InsertHdl, PushButton *, EMPTYARG )
1404 {
1405     //insert or update the SwAuthorityField...
1406     if(pSh)
1407     {
1408         sal_Bool bDifferent = sal_False;
1409         DBG_ASSERT(m_sFields[AUTH_FIELD_IDENTIFIER].Len() , "No Id is set!");
1410         DBG_ASSERT(m_sFields[AUTH_FIELD_AUTHORITY_TYPE].Len() , "No authority type is set!");
1411         //check if the entry already exists with different content
1412         const SwAuthorityFieldType* pFType = (const SwAuthorityFieldType*)
1413                                         pSh->GetFldType(RES_AUTHORITY, aEmptyStr);
1414         const SwAuthEntry*  pEntry = pFType ?
1415                 pFType->GetEntryByIdentifier( m_sFields[AUTH_FIELD_IDENTIFIER])
1416                 : 0;
1417         if(pEntry)
1418         {
1419             for(sal_uInt16 i = 0; i < AUTH_FIELD_END && !bDifferent; i++)
1420                 bDifferent |= m_sFields[i] != pEntry->GetAuthorField((ToxAuthorityField)i);
1421             if(bDifferent)
1422             {
1423                 QueryBox aQuery(this, SW_RES(DLG_CHANGE_AUTH_ENTRY));
1424                 if(RET_YES != aQuery.Execute())
1425                     return 0;
1426             }
1427         }
1428 
1429         SwFldMgr aMgr(pSh);
1430         String sFields;
1431         for(sal_uInt16 i = 0; i < AUTH_FIELD_END; i++)
1432         {
1433             sFields += m_sFields[i];
1434             sFields += TOX_STYLE_DELIMITER;
1435         }
1436         if(bNewEntry)
1437         {
1438             if(bDifferent)
1439             {
1440                 SwAuthEntry aNewData;
1441                 for(sal_uInt16 i = 0; i < AUTH_FIELD_END; i++)
1442                     aNewData.SetAuthorField((ToxAuthorityField)i, m_sFields[i]);
1443                 pSh->ChangeAuthorityData(&aNewData);
1444             }
1445             SwInsertFld_Data aData(TYP_AUTHORITY, 0, sFields, aEmptyStr, 0 );
1446             aMgr.InsertFld( aData );
1447         }
1448         else if(aMgr.GetCurFld())
1449         {
1450             aMgr.UpdateCurFld(0, sFields, aEmptyStr);
1451         }
1452     }
1453     if(!bNewEntry)
1454         CloseHdl(0);
1455     return 0;
1456 }
1457 /* -----------------17.09.99 13:06-------------------
1458 
1459  --------------------------------------------------*/
IMPL_LINK(SwAuthMarkDlg,CreateEntryHdl,PushButton *,pButton)1460 IMPL_LINK(SwAuthMarkDlg, CreateEntryHdl, PushButton*, pButton)
1461 {
1462     sal_Bool bCreate = pButton == &aCreateEntryPB;
1463     String sOldId = m_sCreatedEntry[0];
1464     for(sal_uInt16 i = 0; i < AUTH_FIELD_END; i++)
1465         m_sCreatedEntry[i] = bCreate ? aEmptyStr : m_sFields[i];
1466     SwCreateAuthEntryDlg_Impl aDlg(pButton,
1467                 bCreate ? m_sCreatedEntry : m_sFields,
1468                 *pSh, bNewEntry, bCreate);
1469     if(bNewEntry)
1470     {
1471         aDlg.SetCheckNameHdl(LINK(this, SwAuthMarkDlg, IsEntryAllowedHdl));
1472     }
1473     if(RET_OK == aDlg.Execute())
1474     {
1475         if(bCreate && sOldId.Len())
1476         {
1477             aEntryLB.RemoveEntry(sOldId);
1478         }
1479         for(sal_uInt16 i = 0; i < AUTH_FIELD_END; i++)
1480         {
1481             m_sFields[i] = aDlg.GetEntryText((ToxAuthorityField)i);
1482             m_sCreatedEntry[i] = m_sFields[i];
1483         }
1484         if(bNewEntry && !aFromDocContentRB.IsChecked())
1485         {
1486             aFromDocContentRB.Check(sal_True);
1487             ChangeSourceHdl(&aFromDocContentRB);
1488         }
1489         if(bCreate)
1490         {
1491             DBG_ASSERT(LISTBOX_ENTRY_NOTFOUND ==
1492                         aEntryLB.GetEntryPos(m_sFields[AUTH_FIELD_IDENTIFIER]),
1493                         "entry exists!");
1494             aEntryLB.InsertEntry(m_sFields[AUTH_FIELD_IDENTIFIER]);
1495             aEntryLB.SelectEntry(m_sFields[AUTH_FIELD_IDENTIFIER]);
1496         }
1497         aEntryED.SetText(m_sFields[AUTH_FIELD_IDENTIFIER]);
1498         aAuthorFI.SetText(m_sFields[AUTH_FIELD_AUTHOR]);
1499         aTitleFI.SetText(m_sFields[AUTH_FIELD_TITLE]);
1500         aOKBT.Enable();
1501     }
1502     return 0;
1503 }
1504 /* -----------------------------20.12.99 14:26--------------------------------
1505 
1506  ---------------------------------------------------------------------------*/
IMPL_LINK(SwAuthMarkDlg,ChangeSourceHdl,RadioButton *,pButton)1507 IMPL_LINK(SwAuthMarkDlg, ChangeSourceHdl, RadioButton*, pButton)
1508 {
1509     sal_Bool bFromComp = (pButton == &aFromComponentRB);
1510     bIsFromComponent = bFromComp;
1511     aCreateEntryPB.Enable(!bIsFromComponent);
1512     aEntryLB.Clear();
1513     if(bIsFromComponent)
1514     {
1515         if(!bBibAccessInitialized)
1516         {
1517             uno::Reference< lang::XMultiServiceFactory > xMSF = getProcessServiceFactory();
1518             xBibAccess = uno::Reference< container::XNameAccess > (
1519                             xMSF->createInstance( C2U("com.sun.star.frame.Bibliography") ),
1520                                                                         uno::UNO_QUERY );
1521             uno::Reference< beans::XPropertySet >  xPropSet(xBibAccess, uno::UNO_QUERY);
1522             OUString uPropName(C2U("BibliographyDataFieldNames"));
1523             if(xPropSet.is() && xPropSet->getPropertySetInfo()->hasPropertyByName(uPropName))
1524             {
1525                 uno::Any aNames = xPropSet->getPropertyValue(uPropName);
1526                 uno::Sequence<beans::PropertyValue> aSeq;
1527                 if( aNames >>= aSeq)
1528                 {
1529                     const beans::PropertyValue* pArr = aSeq.getConstArray();
1530                     for(sal_uInt16 i = 0; i < aSeq.getLength(); i++)
1531                     {
1532                         String sTitle = pArr[i].Name;
1533                         sal_Int16 nField = 0;
1534                         pArr[i].Value >>= nField;
1535                         if(nField >= 0 && nField < AUTH_FIELD_END)
1536                             m_sColumnTitles[nField] = sTitle;
1537                     }
1538                 }
1539             }
1540             bBibAccessInitialized = sal_True;
1541         }
1542         if(xBibAccess.is())
1543         {
1544             uno::Sequence<OUString> aIdentifiers = xBibAccess->getElementNames();
1545             const OUString* pNames = aIdentifiers.getConstArray();
1546             for(sal_uInt16 i = 0; i < aIdentifiers.getLength(); i++)
1547             {
1548                 aEntryLB.InsertEntry(pNames[i]);
1549             }
1550         }
1551     }
1552     else
1553     {
1554         const SwAuthorityFieldType* pFType = (const SwAuthorityFieldType*)
1555                                     pSh->GetFldType(RES_AUTHORITY, aEmptyStr);
1556         if(pFType)
1557         {
1558             SvStringsDtor aIds;
1559             pFType->GetAllEntryIdentifiers( aIds );
1560             for(sal_uInt16 n = 0; n < aIds.Count(); n++)
1561                 aEntryLB.InsertEntry(*aIds.GetObject(n));
1562         }
1563         if(m_sCreatedEntry[AUTH_FIELD_IDENTIFIER].Len())
1564             aEntryLB.InsertEntry(m_sCreatedEntry[AUTH_FIELD_IDENTIFIER]);
1565     }
1566     aEntryLB.SelectEntryPos(0);
1567     CompEntryHdl(&aEntryLB);
1568     return 0;
1569 }
1570 /* -----------------15.10.2002 13:16-----------------
1571  *
1572  * --------------------------------------------------*/
IMPL_LINK(SwAuthMarkDlg,EditModifyHdl,Edit *,pEdit)1573 IMPL_LINK(SwAuthMarkDlg, EditModifyHdl, Edit*, pEdit)
1574 {
1575     Link aAllowed = LINK(this, SwAuthMarkDlg, IsEntryAllowedHdl);
1576     long nResult = aAllowed.Call(pEdit);
1577     aOKBT.Enable(nResult > 0);
1578     if(nResult)
1579     {
1580         String sEntry(pEdit->GetText());
1581         m_sFields[AUTH_FIELD_IDENTIFIER] = sEntry;
1582         m_sCreatedEntry[AUTH_FIELD_IDENTIFIER] = sEntry;
1583     }
1584     return 0;
1585 };
1586 /* -----------------------------20.12.99 15:11--------------------------------
1587 
1588  ---------------------------------------------------------------------------*/
IMPL_LINK(SwAuthMarkDlg,IsEntryAllowedHdl,Edit *,pEdit)1589 IMPL_LINK(SwAuthMarkDlg, IsEntryAllowedHdl, Edit*, pEdit)
1590 {
1591     String sEntry = pEdit->GetText();
1592     sal_Bool bAllowed = sal_False;
1593     if(sEntry.Len())
1594     {
1595         if(aEntryLB.GetEntryPos(sEntry) != LISTBOX_ENTRY_NOTFOUND)
1596             return 0;
1597         else if(bIsFromComponent)
1598         {
1599             const SwAuthorityFieldType* pFType = (const SwAuthorityFieldType*)
1600                                         pSh->GetFldType(RES_AUTHORITY, aEmptyStr);
1601             bAllowed = !pFType || !pFType->GetEntryByIdentifier(sEntry);
1602         }
1603         else
1604         {
1605             bAllowed = !xBibAccess.is() || !xBibAccess->hasByName(sEntry);
1606         }
1607     }
1608     return bAllowed;
1609 }
1610 /* -----------------21.09.99 14:19-------------------
1611 
1612  --------------------------------------------------*/
InitControls()1613 void SwAuthMarkDlg::InitControls()
1614 {
1615     DBG_ASSERT(pSh, "Shell nicht da?");
1616     SwField* pField = pSh->GetCurFld();
1617     ASSERT(bNewEntry || pField, "Keine aktuelle Markierung");
1618     if(bNewEntry)
1619     {
1620         ChangeSourceHdl(aFromComponentRB.IsChecked() ? &aFromComponentRB : &aFromDocContentRB);
1621         aCreateEntryPB.Enable(!aFromComponentRB.IsChecked());
1622         if(!aFromComponentRB.IsChecked() && m_sCreatedEntry[0].Len())
1623             for(sal_uInt16 i = 0; i < AUTH_FIELD_END; i++)
1624                 m_sFields[i] = m_sCreatedEntry[i];
1625     }
1626     if(bNewEntry || !pField || pField->GetTyp()->Which() != RES_AUTHORITY)
1627         return;
1628 
1629     const SwAuthEntry* pEntry = ((SwAuthorityFieldType*)pField->GetTyp())->
1630             GetEntryByHandle(((SwAuthorityField*)pField)->GetHandle());
1631 
1632     DBG_ASSERT(pEntry, "No authority entry found");
1633     if(!pEntry)
1634         return;
1635     for(sal_uInt16 i = 0; i < AUTH_FIELD_END; i++)
1636         m_sFields[i] = pEntry->GetAuthorField((ToxAuthorityField)i);
1637 
1638     aEntryED.SetText(pEntry->GetAuthorField(AUTH_FIELD_IDENTIFIER));
1639     aAuthorFI.SetText(pEntry->GetAuthorField(AUTH_FIELD_AUTHOR));
1640     aTitleFI.SetText(pEntry->GetAuthorField(AUTH_FIELD_TITLE));
1641 }
1642 /* -----------------------------05.09.2002 09:44------------------------------
1643 
1644  ---------------------------------------------------------------------------*/
Activate()1645 void    SwAuthMarkDlg::Activate()
1646 {
1647     aOKBT.Enable(!pSh->HasReadonlySel());
1648     Window::Activate();
1649 }
1650 /* -----------------16.09.99 14:27-------------------
1651 
1652  --------------------------------------------------*/
SwCreateAuthEntryDlg_Impl(Window * pParent,const String pFields[],SwWrtShell & rSh,sal_Bool bNewEntry,sal_Bool bCreate)1653 SwCreateAuthEntryDlg_Impl::SwCreateAuthEntryDlg_Impl(Window* pParent,
1654         const String pFields[],
1655         SwWrtShell& rSh,
1656         sal_Bool bNewEntry,
1657         sal_Bool bCreate) :
1658     ModalDialog(pParent, SW_RES(DLG_CREATE_AUTH_ENTRY)),
1659     aEntriesFL(this,    SW_RES(FL_ENTRIES    )),
1660     pTypeListBox(0),
1661     pIdentifierBox(0),
1662     aOKBT(this,         SW_RES(PB_OK         )),
1663     aCancelBT(this,     SW_RES(PB_CANCEL        )),
1664     aHelpBT(this,       SW_RES(PB_HELP      )),
1665     rWrtSh(rSh),
1666     m_bNewEntryMode(bNewEntry),
1667     m_bNameAllowed(sal_True)
1668 {
1669     FreeResource();
1670     Point aFLPos(aEntriesFL.GetPosPixel());
1671     Point aTL1(aFLPos);
1672     Size aFLSz(aEntriesFL.GetSizePixel().Width(), GetSizePixel().Height());
1673     long nControlSpace = aFLSz.Width() / 4;
1674     long nControlWidth = nControlSpace - 2 * aTL1.X();
1675     aTL1.X() *= 2;
1676     aTL1.Y() *= 5;
1677     Point aTR1(aTL1);
1678     aTR1.X() += nControlSpace;
1679     Point aTL2(aTR1);
1680     aTL2.X() += nControlSpace;
1681     Point aTR2(aTL2);
1682     aTR2.X() += nControlSpace;
1683     Size aFixedTextSize(aFLSz);
1684     Size aTmpSz(8,10);
1685     aTmpSz = LogicToPixel(aTmpSz, MAP_APPFONT);
1686     aFixedTextSize.Height() = aTmpSz.Width();
1687     Size aEditSize(aFixedTextSize);
1688     aFixedTextSize.Width() = nControlWidth + aFLPos.X();
1689     aEditSize.Height() = aTmpSz.Height();
1690     aEditSize.Width() = nControlWidth;
1691 
1692     sal_uInt16 nOffset = static_cast< sal_uInt16 >(aTmpSz.Width() * 3 / 2);
1693     sal_Bool bLeft = sal_True;
1694     Window* pRefWindow = 0;
1695     for(sal_uInt16 nIndex = 0; nIndex < AUTH_FIELD_END; nIndex++)
1696     {
1697         const TextInfo aCurInfo = aTextInfoArr[nIndex];
1698 
1699         pFixedTexts[nIndex] = new FixedText(this);
1700         if(nIndex)
1701             pFixedTexts[nIndex]->SetZOrder( pRefWindow, WINDOW_ZORDER_BEHIND );
1702         else
1703             pFixedTexts[nIndex]->SetZOrder( 0, WINDOW_ZORDER_FIRST );
1704 
1705         pRefWindow = pFixedTexts[nIndex];
1706 
1707         pFixedTexts[nIndex]->SetSizePixel(aFixedTextSize);
1708         pFixedTexts[nIndex]->SetPosPixel(bLeft ? aTL1 : aTL2);
1709         pFixedTexts[nIndex]->SetText(SW_RES(STR_AUTH_FIELD_START + aCurInfo.nToxField));
1710         pFixedTexts[nIndex]->Show();
1711         pEdits[nIndex] = 0;
1712         if( AUTH_FIELD_AUTHORITY_TYPE == aCurInfo.nToxField )
1713         {
1714             pTypeListBox = new ListBox(this, WB_DROPDOWN|WB_BORDER);
1715             pTypeListBox->SetZOrder( pRefWindow, WINDOW_ZORDER_BEHIND );
1716             pRefWindow = pTypeListBox;
1717             for(sal_uInt16 j = 0; j < AUTH_TYPE_END; j++)
1718                 pTypeListBox->InsertEntry(String(SW_RES(STR_AUTH_TYPE_START + j)));
1719             if(pFields[aCurInfo.nToxField].Len())
1720             {
1721                 sal_uInt16 nIndexPos = static_cast< sal_uInt16 >(pFields[aCurInfo.nToxField].ToInt32());
1722                 pTypeListBox->SelectEntryPos(nIndexPos);
1723             }
1724             Size aTmp(aEditSize);
1725             aTmp.Height() *= 4;
1726             pTypeListBox->SetSizePixel(aTmp);
1727             pTypeListBox->SetPosPixel(bLeft ? aTR1 : aTR2);
1728             pTypeListBox->Show();
1729             pTypeListBox->SetSelectHdl(LINK(this, SwCreateAuthEntryDlg_Impl, EnableHdl));
1730             pTypeListBox->SetHelpId(aCurInfo.pHelpId);
1731 
1732         }
1733         else if(AUTH_FIELD_IDENTIFIER == aCurInfo.nToxField && !m_bNewEntryMode)
1734         {
1735             pIdentifierBox = new ComboBox(this, WB_BORDER|WB_DROPDOWN);
1736             pIdentifierBox->SetZOrder( pRefWindow, WINDOW_ZORDER_BEHIND );
1737             pRefWindow = pIdentifierBox;
1738 
1739             pIdentifierBox->SetSelectHdl(LINK(this,
1740                                     SwCreateAuthEntryDlg_Impl, IdentifierHdl));
1741 
1742 
1743             const SwAuthorityFieldType* pFType = (const SwAuthorityFieldType*)
1744                                         rSh.GetFldType(RES_AUTHORITY, aEmptyStr);
1745             if(pFType)
1746             {
1747                 SvStringsDtor aIds;
1748                 pFType->GetAllEntryIdentifiers( aIds );
1749                 for(sal_uInt16 n = 0; n < aIds.Count(); n++)
1750                     pIdentifierBox->InsertEntry(*aIds.GetObject(n));
1751             }
1752             pIdentifierBox->SetText(pFields[aCurInfo.nToxField]);
1753             Size aTmp(aEditSize);
1754             aTmp.Height() *= 4;
1755             pIdentifierBox->SetSizePixel(aTmp);
1756             pIdentifierBox->SetPosPixel(bLeft ? aTR1 : aTR2);
1757             pIdentifierBox->Show();
1758             pIdentifierBox->SetHelpId(aCurInfo.pHelpId);
1759         }
1760         else
1761         {
1762             pEdits[nIndex] = new Edit(this, WB_BORDER);
1763             pEdits[nIndex]->SetZOrder( pRefWindow, WINDOW_ZORDER_BEHIND );
1764             pRefWindow = pEdits[nIndex];
1765             pEdits[nIndex]->SetSizePixel(aEditSize);
1766             pEdits[nIndex]->SetPosPixel(bLeft ? aTR1 : aTR2);
1767             pEdits[nIndex]->SetText(pFields[aCurInfo.nToxField]);
1768             pEdits[nIndex]->Show();
1769             pEdits[nIndex]->SetHelpId(aCurInfo.pHelpId);
1770             if(AUTH_FIELD_IDENTIFIER == aCurInfo.nToxField)
1771             {
1772                 pEdits[nIndex]->SetModifyHdl(LINK(this, SwCreateAuthEntryDlg_Impl, ShortNameHdl));
1773                 m_bNameAllowed = pFields[nIndex].Len() > 0;
1774                 if(!bCreate)
1775                 {
1776                     pFixedTexts[nIndex]->Enable(sal_False);
1777                     pEdits[nIndex]->Enable(sal_False);
1778                 }
1779             }
1780         }
1781         if(bLeft)
1782         {
1783             aTL1.Y() += nOffset;
1784             aTR1.Y() += nOffset;
1785         }
1786         else
1787         {
1788             aTL2.Y() += nOffset;
1789             aTR2.Y() += nOffset;
1790         }
1791         bLeft = !bLeft;
1792     }
1793     EnableHdl(pTypeListBox);
1794 
1795     long nHeightDiff = - aFLSz.Height();
1796     aFLSz.Height() = aTL1.Y();
1797     nHeightDiff += aFLSz.Height();
1798 //    aEntriesFL.SetSizePixel(aFLSz);
1799     Size aDlgSize(GetSizePixel());
1800     aDlgSize.Height() += nHeightDiff;
1801     SetSizePixel(aDlgSize);
1802 
1803 }
1804 /* -----------------16.09.99 14:47-------------------
1805 
1806  --------------------------------------------------*/
~SwCreateAuthEntryDlg_Impl()1807 SwCreateAuthEntryDlg_Impl::~SwCreateAuthEntryDlg_Impl()
1808 {
1809     for(sal_uInt16 i = 0; i < AUTH_FIELD_END; i++)
1810     {
1811         delete pFixedTexts[i];
1812         delete pEdits[i];
1813     }
1814     delete pTypeListBox;
1815     delete pIdentifierBox;
1816 }
1817 /* -----------------16.09.99 14:27-------------------
1818 
1819  --------------------------------------------------*/
GetEntryText(ToxAuthorityField eField) const1820 String  SwCreateAuthEntryDlg_Impl::GetEntryText(ToxAuthorityField eField) const
1821 {
1822     String sRet;
1823     if( AUTH_FIELD_AUTHORITY_TYPE == eField )
1824     {
1825         DBG_ASSERT(pTypeListBox, "No ListBox");
1826         sRet = String::CreateFromInt32(pTypeListBox->GetSelectEntryPos());
1827     }
1828     else if( AUTH_FIELD_IDENTIFIER == eField && !m_bNewEntryMode)
1829     {
1830         DBG_ASSERT(pIdentifierBox, "No ComboBox");
1831         sRet = pIdentifierBox->GetText();
1832     }
1833     else
1834     {
1835         for(sal_uInt16 nIndex = 0; nIndex < AUTH_FIELD_END; nIndex++)
1836         {
1837             const TextInfo aCurInfo = aTextInfoArr[nIndex];
1838             if(aCurInfo.nToxField == eField)
1839             {
1840                 sRet = pEdits[nIndex]->GetText();
1841                 break;
1842             }
1843         }
1844     }
1845     return sRet;
1846 }
1847 /* -----------------21.09.99 13:54-------------------
1848 
1849  --------------------------------------------------*/
IMPL_LINK(SwCreateAuthEntryDlg_Impl,IdentifierHdl,ComboBox *,pBox)1850 IMPL_LINK(SwCreateAuthEntryDlg_Impl, IdentifierHdl, ComboBox*, pBox)
1851 {
1852     const SwAuthorityFieldType* pFType = (const SwAuthorityFieldType*)
1853                                 rWrtSh.GetFldType(RES_AUTHORITY, aEmptyStr);
1854     if(pFType)
1855     {
1856         const SwAuthEntry* pEntry = pFType->GetEntryByIdentifier(
1857                                                         pBox->GetText());
1858         if(pEntry)
1859         {
1860             for(sal_uInt16 i = 0; i < AUTH_FIELD_END; i++)
1861             {
1862                 if(AUTH_FIELD_IDENTIFIER == i)
1863                     continue;
1864                 if(AUTH_FIELD_AUTHORITY_TYPE == i)
1865                     pTypeListBox->SelectEntry(
1866                                 pEntry->GetAuthorField((ToxAuthorityField)i));
1867                 else
1868                     pEdits[i]->SetText(
1869                                 pEntry->GetAuthorField((ToxAuthorityField)i));
1870             }
1871         }
1872     }
1873     return 0;
1874 }
1875 /* -----------------------------20.12.99 15:07--------------------------------
1876 
1877  ---------------------------------------------------------------------------*/
1878 
IMPL_LINK(SwCreateAuthEntryDlg_Impl,ShortNameHdl,Edit *,pEdit)1879 IMPL_LINK(SwCreateAuthEntryDlg_Impl, ShortNameHdl, Edit*, pEdit)
1880 {
1881     if(aShortNameCheckLink.IsSet())
1882     {
1883         sal_Bool bEnable = 0 != aShortNameCheckLink.Call(pEdit);
1884         m_bNameAllowed |= bEnable;
1885         aOKBT.Enable(pTypeListBox->GetSelectEntryCount() && bEnable);
1886     }
1887     return 0;
1888 }
1889 /* -----------------------------20.12.99 15:54--------------------------------
1890 
1891  ---------------------------------------------------------------------------*/
IMPL_LINK(SwCreateAuthEntryDlg_Impl,EnableHdl,ListBox *,pBox)1892 IMPL_LINK(SwCreateAuthEntryDlg_Impl, EnableHdl, ListBox*, pBox)
1893 {
1894     aOKBT.Enable(m_bNameAllowed && pBox->GetSelectEntryCount());
1895     return 0;
1896 };
1897 /* -----------------06.10.99 10:00-------------------
1898 
1899  --------------------------------------------------*/
SwAuthMarkFloatDlg(SfxBindings * _pBindings,SfxChildWindow * pChild,Window * pParent,SfxChildWinInfo * pInfo,sal_Bool bNew)1900 SwAuthMarkFloatDlg::SwAuthMarkFloatDlg(SfxBindings* _pBindings,
1901                                 SfxChildWindow* pChild,
1902                                 Window *pParent,
1903                                 SfxChildWinInfo* pInfo,
1904                                 sal_Bool bNew) :
1905     SfxModelessDialog(_pBindings, pChild, pParent, SW_RES(DLG_INSAUTHMARK)),
1906     aDlg(this, SW_RES(WIN_DLG), bNew)
1907 {
1908     FreeResource();
1909     Initialize(pInfo);
1910     SwWrtShell* pWrtShell = ::GetActiveWrtShell();
1911     DBG_ASSERT(pWrtShell, "No shell?");
1912     aDlg.ReInitDlg(*pWrtShell);
1913 }
1914 /* -----------------06.10.99 10:27-------------------
1915 
1916  --------------------------------------------------*/
Activate()1917 void    SwAuthMarkFloatDlg::Activate()
1918 {
1919     SfxModelessDialog::Activate();
1920     aDlg.Activate();
1921 }
1922 
ReInitDlg(SwWrtShell & rWrtShell)1923 void SwAuthMarkFloatDlg::ReInitDlg(SwWrtShell& rWrtShell)
1924 {
1925     aDlg.ReInitDlg( rWrtShell );
1926 }
1927 
1928 /* -----------------06.10.99 10:35-------------------
1929 
1930  --------------------------------------------------*/
SwAuthMarkModalDlg(Window * pParent,SwWrtShell & rSh)1931 SwAuthMarkModalDlg::SwAuthMarkModalDlg(Window *pParent, SwWrtShell& rSh) :
1932     SvxStandardDialog(pParent, SW_RES(DLG_EDIT_AUTHMARK)),
1933     aDlg(this, SW_RES(WIN_DLG), sal_False)
1934 {
1935     FreeResource();
1936     aDlg.ReInitDlg(rSh);
1937 }
1938 /* -----------------06.10.99 10:46-------------------
1939 
1940  --------------------------------------------------*/
Apply()1941 void    SwAuthMarkModalDlg::Apply()
1942 {
1943     aDlg.InsertHdl(0);
1944 }
1945 
1946