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
27 #ifdef SW_DLLIMPLEMENTATION
28 #undef SW_DLLIMPLEMENTATION
29 #endif
30
31
32
33 #include "swtypes.hxx"
34 #include <view.hxx>
35 #include <IMark.hxx>
36 #include <expfld.hxx>
37 #include <swmodule.hxx>
38 #ifndef _FLDREF_HXX
39 #include <fldref.hxx>
40 #endif
41 #include <reffld.hxx>
42 #include <wrtsh.hxx>
43
44 #ifndef _FLDUI_HRC
45 #include <fldui.hrc>
46 #endif
47 #ifndef _FLDTDLG_HRC
48 #include <fldtdlg.hrc>
49 #endif
50 #ifndef _GLOBALS_HRC
51 #include <globals.hrc>
52 #endif
53 // --> OD 2007-11-14 #i83479#
54 #include <SwNodeNum.hxx>
55 #include <IDocumentMarkAccess.hxx>
56 #include <ndtxt.hxx>
57 // <--
58
59 // sw/inc/expfld.hxx
60 SV_IMPL_PTRARR( _SwSeqFldList, _SeqFldLstElem* )
61
62 #define REFFLDFLAG 0x4000
63 #define REFFLDFLAG_BOOKMARK 0x4800
64 #define REFFLDFLAG_FOOTNOTE 0x5000
65 #define REFFLDFLAG_ENDNOTE 0x6000
66 // --> OD 2007-11-09 #i83479#
67 #define REFFLDFLAG_HEADING 0x7100
68 #define REFFLDFLAG_NUMITEM 0x7200
69 // <--
70
71 sal_uInt16 nFldDlgFmtSel = 0;
72
73 #define USER_DATA_VERSION_1 "1"
74 #define USER_DATA_VERSION USER_DATA_VERSION_1
75
76
77 /*--------------------------------------------------------------------
78 Beschreibung:
79 --------------------------------------------------------------------*/
80
SwFldRefPage(Window * pParent,const SfxItemSet & rCoreSet)81 SwFldRefPage::SwFldRefPage(Window* pParent, const SfxItemSet& rCoreSet ) :
82 SwFldPage( pParent, SW_RES( TP_FLD_REF ), rCoreSet ),
83
84 aTypeFT (this, SW_RES(FT_REFTYPE)),
85 aTypeLB (this, SW_RES(LB_REFTYPE)),
86 aSelectionFT (this, SW_RES(FT_REFSELECTION)),
87 aSelectionLB (this, SW_RES(LB_REFSELECTION)),
88 // --> OD 2007-11-21 #i83479#
89 aSelectionToolTipLB( this, SW_RES(LB_REFSELECTION_TOOLTIP) ),
90 // <--
91 aFormatFT (this, SW_RES(FT_REFFORMAT)),
92 aFormatLB (this, SW_RES(LB_REFFORMAT)),
93 aNameFT (this, SW_RES(FT_REFNAME)),
94 aNameED (this, SW_RES(ED_REFNAME)),
95 aValueFT (this, SW_RES(FT_REFVALUE)),
96 aValueED (this, SW_RES(ED_REFVALUE)),
97
98 sBookmarkTxt (SW_RES(STR_REFBOOKMARK)),
99 sFootnoteTxt (SW_RES(STR_REFFOOTNOTE)),
100 sEndnoteTxt (SW_RES(STR_REFENDNOTE)),
101 // --> OD 2007-11-09 #i83479#
102 sHeadingTxt (SW_RES(STR_REFHEADING)),
103 sNumItemTxt (SW_RES(STR_REFNUMITEM)),
104 maOutlineNodes(),
105 maNumItems(),
106 mpSavedSelectedTxtNode( 0 ),
107 mnSavedSelectedPos( 0 )
108 // <--
109 {
110 FreeResource();
111
112 aNameED.SetModifyHdl(LINK(this, SwFldRefPage, ModifyHdl));
113
114 aTypeLB.SetDoubleClickHdl (LINK(this, SwFldRefPage, InsertHdl));
115 aTypeLB.SetSelectHdl (LINK(this, SwFldRefPage, TypeHdl));
116 aSelectionLB.SetSelectHdl (LINK(this, SwFldRefPage, SubTypeHdl));
117 aSelectionLB.SetDoubleClickHdl (LINK(this, SwFldRefPage, InsertHdl));
118 aFormatLB.SetDoubleClickHdl (LINK(this, SwFldRefPage, InsertHdl));
119
120 // --> OD 2007-11-21 #i83479#
121 aSelectionToolTipLB.SetSelectHdl( LINK(this, SwFldRefPage, SubTypeHdl) );
122 aSelectionToolTipLB.SetDoubleClickHdl( LINK(this, SwFldRefPage, InsertHdl) );
123 aSelectionToolTipLB.SetStyle( aSelectionToolTipLB.GetStyle() | WB_HSCROLL );
124 aSelectionToolTipLB.SetSpaceBetweenEntries(1);
125 aSelectionToolTipLB.SetHighlightRange();
126 // <--
127 }
128
129 /*--------------------------------------------------------------------
130 Beschreibung:
131 --------------------------------------------------------------------*/
132
~SwFldRefPage()133 SwFldRefPage::~SwFldRefPage()
134 {
135 }
136
137 // --> OD 2007-11-22 #i83479#
SaveSelectedTxtNode()138 void SwFldRefPage::SaveSelectedTxtNode()
139 {
140 mpSavedSelectedTxtNode = 0;
141 mnSavedSelectedPos = 0;
142 if ( aSelectionToolTipLB.IsVisible() )
143 {
144 SvLBoxEntry* pEntry = aSelectionToolTipLB.GetCurEntry();
145 if ( pEntry )
146 {
147 const sal_uInt16 nTypeId = (sal_uInt16)(sal_uLong)aTypeLB.GetEntryData(GetTypeSel());
148 SwWrtShell *pSh = GetWrtShell();
149 if ( !pSh )
150 {
151 pSh = ::GetActiveWrtShell();
152 }
153 if ( nTypeId == REFFLDFLAG_HEADING )
154 {
155 mnSavedSelectedPos = static_cast<sal_uInt16>(reinterpret_cast<sal_uLong>(pEntry->GetUserData()));
156 if ( mnSavedSelectedPos < maOutlineNodes.size() )
157 {
158 mpSavedSelectedTxtNode = maOutlineNodes[mnSavedSelectedPos];
159 }
160 }
161 else if ( nTypeId == REFFLDFLAG_NUMITEM )
162 {
163 mnSavedSelectedPos = static_cast<sal_uInt16>(reinterpret_cast<sal_uLong>(pEntry->GetUserData()));
164 if ( mnSavedSelectedPos < maNumItems.size() )
165 {
166 mpSavedSelectedTxtNode = maNumItems[mnSavedSelectedPos]->GetTxtNode();
167 }
168 }
169 }
170 }
171 }
172
GetSavedSelectedTxtNode() const173 const SwTxtNode* SwFldRefPage::GetSavedSelectedTxtNode() const
174 {
175 return mpSavedSelectedTxtNode;
176 }
177
GetSavedSelectedPos() const178 sal_uInt16 SwFldRefPage::GetSavedSelectedPos() const
179 {
180 return mnSavedSelectedPos;
181 }
182
183 // <--
184
185 /*--------------------------------------------------------------------
186 Beschreibung:
187 --------------------------------------------------------------------*/
188
Reset(const SfxItemSet &)189 void SwFldRefPage::Reset(const SfxItemSet& )
190 {
191 if (!IsFldEdit())
192 {
193 SavePos(&aTypeLB);
194 // --> OD 2007-11-22 #i83479#
195 SaveSelectedTxtNode();
196 // <--
197 }
198 SetSelectionSel(LISTBOX_ENTRY_NOTFOUND);
199 SetTypeSel(LISTBOX_ENTRY_NOTFOUND);
200 Init(); // Allgemeine initialisierung
201
202 // TypeListBox initialisieren
203 aTypeLB.SetUpdateMode(sal_False);
204 aTypeLB.Clear();
205
206 // Typ-Listbox fuellen
207
208 sal_uInt16 nPos;
209 // Referenz setzen / einfuegen
210 const SwFldGroupRgn& rRg = GetFldMgr().GetGroupRange(IsFldDlgHtmlMode(), GetGroup());
211
212 for (short i = rRg.nStart; i < rRg.nEnd; ++i)
213 {
214 const sal_uInt16 nTypeId = GetFldMgr().GetTypeId(i);
215
216 if (!IsFldEdit() || nTypeId != TYP_SETREFFLD)
217 {
218 nPos = aTypeLB.InsertEntry(GetFldMgr().GetTypeStr(i), i - rRg.nStart);
219 aTypeLB.SetEntryData(nPos, reinterpret_cast<void*>(nTypeId));
220 }
221 }
222
223 // --> OD 2007-11-09 #i83479#
224 // entries for headings and numbered items
225 nPos = aTypeLB.InsertEntry(sHeadingTxt);
226 aTypeLB.SetEntryData(nPos, (void*)REFFLDFLAG_HEADING);
227 nPos = aTypeLB.InsertEntry(sNumItemTxt);
228 aTypeLB.SetEntryData(nPos, (void*)REFFLDFLAG_NUMITEM);
229 // <--
230
231 // mit den Sequence-Typen auffuellen
232 SwWrtShell *pSh = GetWrtShell();
233 if(!pSh)
234 pSh = ::GetActiveWrtShell();
235
236 sal_uInt16 nFldTypeCnt = pSh->GetFldTypeCount(RES_SETEXPFLD);
237
238 for (sal_uInt16 n = 0; n < nFldTypeCnt; ++n)
239 {
240 SwSetExpFieldType* pType = (SwSetExpFieldType*)pSh->GetFldType(n, RES_SETEXPFLD);
241
242 if ((nsSwGetSetExpType::GSE_SEQ & pType->GetType()) && pType->GetDepends() && pSh->IsUsed(*pType))
243 {
244 nPos = aTypeLB.InsertEntry(pType->GetName());
245 aTypeLB.SetEntryData(nPos, (void*)(REFFLDFLAG | n));
246 }
247 }
248
249 // Textmarken - jetzt immer (wegen Globaldokumenten)
250 nPos = aTypeLB.InsertEntry(sBookmarkTxt);
251 aTypeLB.SetEntryData(nPos, (void*)REFFLDFLAG_BOOKMARK);
252
253 // Fussnoten:
254 if( pSh->HasFtns() )
255 {
256 nPos = aTypeLB.InsertEntry(sFootnoteTxt);
257 aTypeLB.SetEntryData(nPos, (void*)REFFLDFLAG_FOOTNOTE);
258 }
259
260 // Endnoten:
261 if ( pSh->HasFtns(true) )
262 {
263 nPos = aTypeLB.InsertEntry(sEndnoteTxt);
264 aTypeLB.SetEntryData(nPos, (void*)REFFLDFLAG_ENDNOTE);
265 }
266
267 // alte Pos selektieren
268 if (!IsFldEdit())
269 RestorePos(&aTypeLB);
270
271 aTypeLB.SetUpdateMode(sal_True);
272
273 nFldDlgFmtSel = 0;
274
275 if( !IsRefresh() )
276 {
277 String sUserData = GetUserData();
278 if(!IsRefresh() && sUserData.GetToken(0, ';').
279 EqualsIgnoreCaseAscii(USER_DATA_VERSION_1))
280 {
281 String sVal = sUserData.GetToken(1, ';');
282 sal_uInt16 nVal = static_cast< sal_uInt16 >(sVal.ToInt32());
283 if(nVal != USHRT_MAX)
284 {
285 for(sal_uInt16 i = 0; i < aTypeLB.GetEntryCount(); i++)
286 if(nVal == (sal_uInt16)(sal_uLong)aTypeLB.GetEntryData(i))
287 {
288 aTypeLB.SelectEntryPos(i);
289 break;
290 }
291 }
292 }
293 }
294 TypeHdl(0);
295
296 if (IsFldEdit())
297 {
298 aTypeLB.SaveValue();
299 aSelectionLB.SaveValue();
300 aFormatLB.SaveValue();
301 aNameED.SaveValue();
302 aValueED.SaveValue();
303 }
304 }
305
306 /*--------------------------------------------------------------------
307 Beschreibung:
308 --------------------------------------------------------------------*/
309
IMPL_LINK(SwFldRefPage,TypeHdl,ListBox *,EMPTYARG)310 IMPL_LINK( SwFldRefPage, TypeHdl, ListBox *, EMPTYARG )
311 {
312 // Alte ListBoxPos sichern
313 const sal_uInt16 nOld = GetTypeSel();
314
315 // Aktuelle ListBoxPos
316 SetTypeSel(aTypeLB.GetSelectEntryPos());
317
318 if(GetTypeSel() == LISTBOX_ENTRY_NOTFOUND)
319 {
320 if (IsFldEdit())
321 {
322 // Positionen selektieren
323 String sName;
324 sal_uInt16 nFlag = 0;
325
326 switch( GetCurField()->GetSubType() )
327 {
328 case REF_BOOKMARK:
329 {
330 // --> OD 2007-11-14 #i83479#
331 // sName = sBookmarkTxt;
332 // nFlag = REFFLDFLAG_BOOKMARK;
333 SwGetRefField* pRefFld = dynamic_cast<SwGetRefField*>(GetCurField());
334 if ( pRefFld &&
335 pRefFld->IsRefToHeadingCrossRefBookmark() )
336 {
337 sName = sHeadingTxt;
338 nFlag = REFFLDFLAG_HEADING;
339 }
340 else if ( pRefFld &&
341 pRefFld->IsRefToNumItemCrossRefBookmark() )
342 {
343 sName = sNumItemTxt;
344 nFlag = REFFLDFLAG_NUMITEM;
345 }
346 else
347 {
348 sName = sBookmarkTxt;
349 nFlag = REFFLDFLAG_BOOKMARK;
350 }
351 // <--
352 }
353 break;
354
355 case REF_FOOTNOTE:
356 sName = sFootnoteTxt;
357 nFlag = REFFLDFLAG_FOOTNOTE;
358 break;
359
360 case REF_ENDNOTE:
361 sName = sEndnoteTxt;
362 nFlag = REFFLDFLAG_ENDNOTE;
363 break;
364
365 case REF_SETREFATTR:
366 sName = SW_RESSTR(STR_GETREFFLD);
367 nFlag = REF_SETREFATTR;
368 break;
369
370 case REF_SEQUENCEFLD:
371 sName = ((SwGetRefField*)GetCurField())->GetSetRefName();
372 nFlag = REFFLDFLAG;
373 break;
374 }
375
376 if (aTypeLB.GetEntryPos(sName) == LISTBOX_ENTRY_NOTFOUND) // Referenz zu gel?schter Marke
377 {
378 sal_uInt16 nPos = aTypeLB.InsertEntry(sName);
379 aTypeLB.SetEntryData(nPos, reinterpret_cast<void*>(nFlag));
380 }
381
382 aTypeLB.SelectEntry(sName);
383 SetTypeSel(aTypeLB.GetSelectEntryPos());
384 }
385 else
386 {
387 SetTypeSel(0);
388 aTypeLB.SelectEntryPos(0);
389 }
390 }
391
392 if (nOld != GetTypeSel())
393 {
394 sal_uInt16 nTypeId = (sal_uInt16)(sal_uLong)aTypeLB.GetEntryData(GetTypeSel());
395
396 // Auswahl-Listbox fuellen
397 UpdateSubType();
398
399 sal_Bool bName = sal_False; nFldDlgFmtSel = 0;
400
401 if ( ( !IsFldEdit() || aSelectionLB.GetEntryCount() ) &&
402 nOld != LISTBOX_ENTRY_NOTFOUND )
403 {
404 aNameED.SetText(aEmptyStr);
405 aValueED.SetText(aEmptyStr);
406 }
407
408 switch (nTypeId)
409 {
410 case TYP_GETREFFLD:
411 if (REFFLDFLAG & (sal_uInt16)(sal_uLong)aTypeLB.GetEntryData(nOld))
412 // dann bleibt die alte bestehen
413 nFldDlgFmtSel = aFormatLB.GetSelectEntryPos();
414 bName = sal_True;
415 break;
416
417 case TYP_SETREFFLD:
418 bName = sal_True;
419 break;
420
421 case REFFLDFLAG_BOOKMARK:
422 bName = sal_True;
423 // kein break!!!
424 default:
425 if( REFFLDFLAG & nTypeId )
426 {
427 sal_uInt16 nOldId = (sal_uInt16)(sal_uLong)aTypeLB.GetEntryData(nOld);
428 if( nOldId & REFFLDFLAG || nOldId == TYP_GETREFFLD )
429 // dann bleibt die alte bestehen
430 nFldDlgFmtSel = aFormatLB.GetSelectEntryPos();
431 }
432 break;
433 }
434
435 aNameED.Enable(bName);
436 aNameFT.Enable(bName);
437
438 // Format-Listbox fuellen
439 sal_uInt16 nSize = FillFormatLB(nTypeId);
440 sal_Bool bFormat = nSize != 0;
441 aFormatLB.Enable(bFormat);
442 aFormatFT.Enable(bFormat);
443
444 SubTypeHdl();
445 ModifyHdl();
446 }
447
448 return 0;
449 }
450
451 /*--------------------------------------------------------------------
452 Beschreibung:
453 --------------------------------------------------------------------*/
454
IMPL_LINK(SwFldRefPage,SubTypeHdl,ListBox *,EMPTYARG)455 IMPL_LINK( SwFldRefPage, SubTypeHdl, ListBox *, EMPTYARG )
456 {
457 sal_uInt16 nTypeId = (sal_uInt16)(sal_uLong)aTypeLB.GetEntryData(GetTypeSel());
458
459 switch(nTypeId)
460 {
461 case TYP_GETREFFLD:
462 if (!IsFldEdit() || aSelectionLB.GetSelectEntryCount())
463 {
464 aNameED.SetText(aSelectionLB.GetSelectEntry());
465 ModifyHdl(&aNameED);
466 }
467 break;
468
469 case TYP_SETREFFLD:
470 {
471 SwWrtShell *pSh = GetWrtShell();
472 if(!pSh)
473 pSh = ::GetActiveWrtShell();
474 if(pSh)
475 {
476 aValueED.SetText(pSh->GetSelTxt());
477 }
478
479 }
480 break;
481 // --> OD 2007-11-21 #i83479#
482 case REFFLDFLAG_HEADING:
483 case REFFLDFLAG_NUMITEM:
484 {
485 if ( aSelectionToolTipLB.GetCurEntry() )
486 {
487 aNameED.SetText( aSelectionToolTipLB.GetEntryText(
488 aSelectionToolTipLB.GetCurEntry() ) );
489 }
490 }
491 break;
492 // <--
493
494 default:
495 if (!IsFldEdit() || aSelectionLB.GetSelectEntryCount())
496 aNameED.SetText(aSelectionLB.GetSelectEntry());
497 break;
498 }
499
500 return 0;
501 }
502
503 /*--------------------------------------------------------------------
504 Beschreibung: Typen in SelectionLB erneuern
505 --------------------------------------------------------------------*/
506
UpdateSubType()507 void SwFldRefPage::UpdateSubType()
508 {
509 SwWrtShell *pSh = GetWrtShell();
510 if(!pSh)
511 pSh = ::GetActiveWrtShell();
512 SwGetRefField* pRefFld = (SwGetRefField*)GetCurField();
513 const sal_uInt16 nTypeId = (sal_uInt16)(sal_uLong)aTypeLB.GetEntryData(GetTypeSel());
514
515 String sOldSel;
516 if ( aSelectionLB.IsVisible() )
517 {
518 const sal_uInt16 nSelectionSel = aSelectionLB.GetSelectEntryPos();
519 if (nSelectionSel != LISTBOX_ENTRY_NOTFOUND)
520 {
521 sOldSel = aSelectionLB.GetEntry(nSelectionSel);
522 }
523 }
524 if (IsFldEdit() && !sOldSel.Len())
525 sOldSel = String::CreateFromInt32( pRefFld->GetSeqNo() + 1 );
526
527 aSelectionLB.SetUpdateMode(sal_False);
528 aSelectionLB.Clear();
529 aSelectionToolTipLB.SetUpdateMode(sal_False);
530 aSelectionToolTipLB.Clear();
531 bool bShowSelectionToolTipLB( false );
532
533 if( REFFLDFLAG & nTypeId )
534 {
535 if (nTypeId == REFFLDFLAG_BOOKMARK) // TextMarken!
536 {
537 aSelectionLB.SetStyle(aSelectionLB.GetStyle()|WB_SORT);
538 // alle Textmarken besorgen
539 IDocumentMarkAccess* const pMarkAccess = pSh->getIDocumentMarkAccess();
540 for(IDocumentMarkAccess::const_iterator_t ppMark = pMarkAccess->getBookmarksBegin();
541 ppMark != pMarkAccess->getBookmarksEnd();
542 ppMark++)
543 {
544 const ::sw::mark::IMark* pBkmk = ppMark->get();
545 if(IDocumentMarkAccess::BOOKMARK == IDocumentMarkAccess::GetType(*pBkmk))
546 aSelectionLB.InsertEntry( pBkmk->GetName() );
547 }
548 if (IsFldEdit())
549 sOldSel = pRefFld->GetSetRefName();
550 }
551 else if (nTypeId == REFFLDFLAG_FOOTNOTE)
552 {
553 aSelectionLB.SetStyle(aSelectionLB.GetStyle() & ~WB_SORT);
554 SwSeqFldList aArr;
555 sal_uInt16 nCnt = pSh->GetSeqFtnList( aArr );
556
557 for( sal_uInt16 n = 0; n < nCnt; ++n )
558 {
559 aSelectionLB.InsertEntry( aArr[ n ]->sDlgEntry );
560 if (IsFldEdit() && pRefFld->GetSeqNo() == aArr[ n ]->nSeqNo)
561 sOldSel = aArr[n]->sDlgEntry;
562 }
563 }
564 else if (nTypeId == REFFLDFLAG_ENDNOTE)
565 {
566 aSelectionLB.SetStyle(aSelectionLB.GetStyle() & ~WB_SORT);
567 SwSeqFldList aArr;
568 sal_uInt16 nCnt = pSh->GetSeqFtnList( aArr, true );
569
570 for( sal_uInt16 n = 0; n < nCnt; ++n )
571 {
572 aSelectionLB.InsertEntry( aArr[ n ]->sDlgEntry );
573 if (IsFldEdit() && pRefFld->GetSeqNo() == aArr[ n ]->nSeqNo)
574 sOldSel = aArr[n]->sDlgEntry;
575 }
576 }
577 else if ( nTypeId == REFFLDFLAG_HEADING )
578 {
579 bShowSelectionToolTipLB = true;
580
581 const IDocumentOutlineNodes* pIDoc( pSh->getIDocumentOutlineNodesAccess() );
582 pIDoc->getOutlineNodes( maOutlineNodes );
583 bool bCertainTxtNodeSelected( false );
584 SvLBoxEntry* pEntry = 0;
585 sal_uInt16 nOutlIdx = 0;
586 for ( nOutlIdx = 0; nOutlIdx < maOutlineNodes.size(); ++nOutlIdx )
587 {
588 pEntry = aSelectionToolTipLB.InsertEntry(
589 pIDoc->getOutlineText( nOutlIdx, true, true ) );
590 pEntry->SetUserData( reinterpret_cast<void*>(nOutlIdx) );
591 if ( ( IsFldEdit() &&
592 pRefFld->GetReferencedTxtNode() == maOutlineNodes[nOutlIdx] ) ||
593 GetSavedSelectedTxtNode() == maOutlineNodes[nOutlIdx] )
594 {
595 aSelectionToolTipLB.Select( pEntry );
596 sOldSel.Erase();
597 bCertainTxtNodeSelected = true;
598 }
599 else if ( !bCertainTxtNodeSelected &&
600 GetSavedSelectedPos() == nOutlIdx )
601 {
602 aSelectionToolTipLB.Select( pEntry );
603 sOldSel.Erase();
604 }
605 }
606 }
607 else if ( nTypeId == REFFLDFLAG_NUMITEM )
608 {
609 bShowSelectionToolTipLB = true;
610
611 const IDocumentListItems* pIDoc( pSh->getIDocumentListItemsAccess() );
612 pIDoc->getNumItems( maNumItems );
613 bool bCertainTxtNodeSelected( false );
614 SvLBoxEntry* pEntry = 0;
615 sal_uInt16 nNumItemIdx = 0;
616 for ( nNumItemIdx = 0; nNumItemIdx < maNumItems.size(); ++nNumItemIdx )
617 {
618 pEntry = aSelectionToolTipLB.InsertEntry(
619 pIDoc->getListItemText( *maNumItems[nNumItemIdx], true, true ) );
620 pEntry->SetUserData( reinterpret_cast<void*>(nNumItemIdx) );
621 if ( ( IsFldEdit() &&
622 pRefFld->GetReferencedTxtNode() == maNumItems[nNumItemIdx]->GetTxtNode() ) ||
623 GetSavedSelectedTxtNode() == maNumItems[nNumItemIdx]->GetTxtNode() )
624 {
625 aSelectionToolTipLB.Select( pEntry );
626 sOldSel.Erase();
627 bCertainTxtNodeSelected = true;
628 }
629 else if ( !bCertainTxtNodeSelected &&
630 GetSavedSelectedPos() == nNumItemIdx )
631 {
632 aSelectionToolTipLB.Select( pEntry );
633 sOldSel.Erase();
634 }
635 }
636 }
637 else
638 {
639 aSelectionLB.SetStyle(aSelectionLB.GetStyle()|WB_SORT);
640 // zum Seq-FeldTyp die Felder besorgen:
641
642 SwSetExpFieldType* pType = (SwSetExpFieldType*)pSh->GetFldType(
643 nTypeId & ~REFFLDFLAG, RES_SETEXPFLD );
644 if( pType )
645 {
646 SwSeqFldList aArr;
647 // old selection should be kept in non-edit mode
648 if(IsFldEdit())
649 sOldSel.Erase();
650
651 sal_uInt16 nCnt = pType->GetSeqFldList( aArr );
652 for( sal_uInt16 n = 0; n < nCnt; ++n )
653 {
654 aSelectionLB.InsertEntry( aArr[ n ]->sDlgEntry );
655 if (IsFldEdit() && !sOldSel.Len() &&
656 aArr[ n ]->nSeqNo == pRefFld->GetSeqNo())
657 sOldSel = aArr[ n ]->sDlgEntry;
658 }
659
660 if (IsFldEdit() && !sOldSel.Len())
661 sOldSel = String::CreateFromInt32( pRefFld->GetSeqNo() + 1);
662 }
663 }
664 }
665 else
666 {
667 SvStringsDtor aLst;
668 GetFldMgr().GetSubTypes(nTypeId, aLst);
669 for (sal_uInt16 i = 0; i < aLst.Count(); ++i)
670 aSelectionLB.InsertEntry(*aLst[i]);
671
672 if (IsFldEdit())
673 sOldSel = pRefFld->GetSetRefName();
674 }
675
676 // --> OD 2007-11-21 #i83479#
677 aSelectionToolTipLB.Show( bShowSelectionToolTipLB );
678 aSelectionLB.Show( !bShowSelectionToolTipLB );
679 if ( bShowSelectionToolTipLB )
680 {
681 aSelectionToolTipLB.SetUpdateMode(sal_True);
682
683 sal_Bool bEnable = aSelectionToolTipLB.GetEntryCount() != 0;
684 aSelectionToolTipLB.Enable( bEnable );
685 aSelectionFT.Enable( bEnable );
686
687 if ( aSelectionToolTipLB.GetCurEntry() != 0 )
688 {
689 aSelectionToolTipLB.MakeVisible( aSelectionToolTipLB.GetCurEntry() );
690 }
691
692 if ( IsFldEdit() && aSelectionToolTipLB.GetCurEntry() == 0 )
693 {
694 aNameED.SetText(sOldSel);
695 }
696 }
697 else
698 {
699 aSelectionLB.SetUpdateMode(sal_True);
700
701 // Enable oder Disable
702 sal_Bool bEnable = aSelectionLB.GetEntryCount() != 0;
703 aSelectionLB.Enable( bEnable );
704 aSelectionFT.Enable( bEnable );
705
706 if ( bEnable )
707 {
708 aSelectionLB.SelectEntry(sOldSel);
709 if (!aSelectionLB.GetSelectEntryCount() && !IsFldEdit())
710 aSelectionLB.SelectEntryPos(0);
711 }
712
713 if (IsFldEdit() && !aSelectionLB.GetSelectEntryCount()) // Falls die Referenz schon geloescht wurde...
714 aNameED.SetText(sOldSel);
715 }
716 // <--
717 }
718
719 /*--------------------------------------------------------------------
720 Beschreibung:
721 --------------------------------------------------------------------*/
722
FillFormatLB(sal_uInt16 nTypeId)723 sal_uInt16 SwFldRefPage::FillFormatLB(sal_uInt16 nTypeId)
724 {
725 String sOldSel;
726
727 sal_uInt16 nFormatSel = aFormatLB.GetSelectEntryPos();
728 if (nFormatSel != LISTBOX_ENTRY_NOTFOUND)
729 sOldSel = aFormatLB.GetEntry(nFormatSel);
730
731 // Format-Listbox fuellen
732 aFormatLB.Clear();
733
734 // Referenz hat weniger als die Beschriftung
735 sal_uInt16 nSize( 0 );
736 bool bAddCrossRefFormats( false );
737 switch (nTypeId)
738 {
739 // --> OD 2007-11-16 #i83479#
740 case REFFLDFLAG_HEADING:
741 case REFFLDFLAG_NUMITEM:
742 bAddCrossRefFormats = true;
743 // intentional no break here
744 // <--
745
746 case TYP_GETREFFLD:
747 case REFFLDFLAG_BOOKMARK:
748 case REFFLDFLAG_FOOTNOTE:
749 case REFFLDFLAG_ENDNOTE:
750 nSize = FMT_REF_PAGE_PGDSC - FMT_REF_BEGIN + 1;
751 break;
752
753 default:
754 // --> OD 2007-11-16 #i83479#
755 // nSize = GetFldMgr().GetFormatCount( (REFFLDFLAG & nTypeId)
756 // ? (sal_uInt16)TYP_GETREFFLD : nTypeId,
757 // sal_False, IsFldDlgHtmlMode() );
758 if ( REFFLDFLAG & nTypeId )
759 {
760 nSize = FMT_REF_ONLYSEQNO - FMT_REF_BEGIN + 1;
761 }
762 else
763 {
764 nSize = GetFldMgr().GetFormatCount( nTypeId, sal_False, IsFldDlgHtmlMode() );
765 }
766 break;
767 }
768
769 if (REFFLDFLAG & nTypeId)
770 nTypeId = TYP_GETREFFLD;
771
772 for (sal_uInt16 i = 0; i < nSize; i++)
773 {
774 sal_uInt16 nPos = aFormatLB.InsertEntry(GetFldMgr().GetFormatStr( nTypeId, i ));
775 aFormatLB.SetEntryData( nPos, reinterpret_cast<void*>(GetFldMgr().GetFormatId( nTypeId, i )));
776 }
777 // --> OD 2007-11-16 #i83479#
778 if ( bAddCrossRefFormats )
779 {
780 sal_uInt16 nFormat = FMT_REF_NUMBER - FMT_REF_BEGIN;
781 sal_uInt16 nPos = aFormatLB.InsertEntry(GetFldMgr().GetFormatStr( nTypeId, nFormat ));
782 aFormatLB.SetEntryData( nPos, reinterpret_cast<void*>(GetFldMgr().GetFormatId( nTypeId, nFormat )));
783 nFormat = FMT_REF_NUMBER_NO_CONTEXT - FMT_REF_BEGIN;
784 nPos = aFormatLB.InsertEntry(GetFldMgr().GetFormatStr( nTypeId, nFormat ));
785 aFormatLB.SetEntryData( nPos, reinterpret_cast<void*>(GetFldMgr().GetFormatId( nTypeId, nFormat )));
786 nFormat = FMT_REF_NUMBER_FULL_CONTEXT - FMT_REF_BEGIN;
787 nPos = aFormatLB.InsertEntry(GetFldMgr().GetFormatStr( nTypeId, nFormat ));
788 aFormatLB.SetEntryData( nPos, reinterpret_cast<void*>(GetFldMgr().GetFormatId( nTypeId, nFormat )));
789 nSize += 3;
790 }
791 // <--
792
793 // select a certain entry
794 if (nSize)
795 {
796 if (!IsFldEdit())
797 aFormatLB.SelectEntry(sOldSel);
798 else
799 aFormatLB.SelectEntry(SW_RESSTR(FMT_REF_BEGIN + (sal_uInt16)GetCurField()->GetFormat()));
800
801 if (!aFormatLB.GetSelectEntryCount())
802 {
803 aFormatLB.SelectEntryPos(nFldDlgFmtSel);
804 if (!aFormatLB.GetSelectEntryCount())
805 aFormatLB.SelectEntryPos(0);
806 }
807 }
808
809 return nSize;
810 }
811
812 /*--------------------------------------------------------------------
813 Beschreibung: Modify
814 --------------------------------------------------------------------*/
815
IMPL_LINK(SwFldRefPage,ModifyHdl,Edit *,EMPTYARG)816 IMPL_LINK( SwFldRefPage, ModifyHdl, Edit *, EMPTYARG )
817 {
818 String aName(aNameED.GetText());
819 const sal_uInt16 nLen = aName.Len();
820
821 sal_Bool bEnable = sal_True;
822 sal_uInt16 nTypeId = (sal_uInt16)(sal_uLong)aTypeLB.GetEntryData(GetTypeSel());
823
824 if ((nTypeId == TYP_SETREFFLD && !GetFldMgr().CanInsertRefMark(aName)) ||
825 (nLen == 0 && (nTypeId == TYP_GETREFFLD || nTypeId == TYP_SETREFFLD ||
826 nTypeId == REFFLDFLAG_BOOKMARK)))
827 bEnable = sal_False;
828
829 EnableInsert(bEnable);
830
831 aSelectionLB.SelectEntry(aName);
832
833 return 0;
834 }
835
836 /*--------------------------------------------------------------------
837 Beschreibung:
838 --------------------------------------------------------------------*/
839
FillItemSet(SfxItemSet &)840 sal_Bool SwFldRefPage::FillItemSet(SfxItemSet& )
841 {
842 sal_Bool bModified = sal_False;
843 sal_uInt16 nTypeId = (sal_uInt16)(sal_uLong)aTypeLB.GetEntryData(GetTypeSel());
844
845 sal_uInt16 nSubType = 0;
846 sal_uLong nFormat;
847
848 nFormat = aFormatLB.GetSelectEntryPos();
849
850 if(nFormat == LISTBOX_ENTRY_NOTFOUND)
851 nFormat = 0;
852 else
853 nFormat = (sal_uLong)aFormatLB.GetEntryData((sal_uInt16)nFormat);
854
855 String aVal(aValueED.GetText());
856 String aName(aNameED.GetText());
857
858 switch(nTypeId)
859 {
860 case TYP_GETREFFLD:
861 // aName = aSelectionLB.GetSelectEntry();
862 nSubType = REF_SETREFATTR;
863 break;
864
865 case TYP_SETREFFLD:
866 {
867 SwFieldType* pType = GetFldMgr().GetFldType(RES_SETEXPFLD, aName);
868
869 if(!pType) // Nur einfuegen, wenn es den Namen noch nicht gibt
870 {
871 aSelectionLB.InsertEntry(aName);
872 aSelectionLB.Enable();
873 aSelectionFT.Enable();
874 }
875 break;
876 }
877 }
878
879 SwGetRefField* pRefFld = (SwGetRefField*)GetCurField();
880
881 if (REFFLDFLAG & nTypeId)
882 {
883 SwWrtShell *pSh = GetWrtShell();
884 if(!pSh)
885 {
886 pSh = ::GetActiveWrtShell();
887 }
888 if (nTypeId == REFFLDFLAG_BOOKMARK) // TextMarken!
889 {
890 aName = aNameED.GetText();
891 nTypeId = TYP_GETREFFLD;
892 nSubType = REF_BOOKMARK;
893 }
894 else if (REFFLDFLAG_FOOTNOTE == nTypeId) // Fussnoten
895 {
896 SwSeqFldList aArr;
897 _SeqFldLstElem aElem( aSelectionLB.GetSelectEntry(), 0 );
898
899 sal_uInt16 nPos;
900
901 nTypeId = TYP_GETREFFLD;
902 nSubType = REF_FOOTNOTE;
903 aName.Erase();
904
905 if (pSh->GetSeqFtnList(aArr) && aArr.SeekEntry(aElem, &nPos))
906 {
907 aVal = String::CreateFromInt32( aArr[nPos]->nSeqNo );
908
909 if (IsFldEdit() && aArr[nPos]->nSeqNo == pRefFld->GetSeqNo())
910 bModified = sal_True; // Kann bei Feldern passieren, deren Referenz geloescht wurde
911 }
912 else if (IsFldEdit())
913 aVal = String::CreateFromInt32( pRefFld->GetSeqNo() );
914 }
915 else if (REFFLDFLAG_ENDNOTE == nTypeId) // Endnoten
916 {
917 SwSeqFldList aArr;
918 _SeqFldLstElem aElem( aSelectionLB.GetSelectEntry(), 0 );
919
920 sal_uInt16 nPos;
921
922 nTypeId = TYP_GETREFFLD;
923 nSubType = REF_ENDNOTE;
924 aName.Erase();
925
926 if (pSh->GetSeqFtnList(aArr, true) && aArr.SeekEntry(aElem, &nPos))
927 {
928 aVal = String::CreateFromInt32( aArr[nPos]->nSeqNo );
929
930 if (IsFldEdit() && aArr[nPos]->nSeqNo == pRefFld->GetSeqNo())
931 bModified = sal_True; // Kann bei Feldern passieren, deren Referenz geloescht wurde
932 }
933 else if (IsFldEdit())
934 aVal = String::CreateFromInt32( pRefFld->GetSeqNo() );
935 }
936 // --> OD 2007-11-16 #i83479#
937 else if ( nTypeId == REFFLDFLAG_HEADING )
938 {
939 SvLBoxEntry* pEntry = aSelectionToolTipLB.GetCurEntry();
940 ASSERT( pEntry,
941 "<SwFldRefPage::FillItemSet(..)> - no entry selected in selection tool tip listbox!" );
942 if ( pEntry )
943 {
944 const sal_uInt16 nOutlIdx( static_cast<sal_uInt16>(reinterpret_cast<sal_uLong>(pEntry->GetUserData())) );
945 pSh->getIDocumentOutlineNodesAccess()->getOutlineNodes( maOutlineNodes );
946 if ( nOutlIdx < maOutlineNodes.size() )
947 {
948 ::sw::mark::IMark const * const pMark = pSh->getIDocumentMarkAccess()->getMarkForTxtNode(
949 *(maOutlineNodes[nOutlIdx]),
950 IDocumentMarkAccess::CROSSREF_HEADING_BOOKMARK);
951 aName = pMark->GetName();
952 nTypeId = TYP_GETREFFLD;
953 nSubType = REF_BOOKMARK;
954 }
955 }
956 }
957 else if ( nTypeId == REFFLDFLAG_NUMITEM )
958 {
959 SvLBoxEntry* pEntry = aSelectionToolTipLB.GetCurEntry();
960 ASSERT( pEntry,
961 "<SwFldRefPage::FillItemSet(..)> - no entry selected in selection tool tip listbox!" );
962 if ( pEntry )
963 {
964 const sal_uInt16 nNumItemIdx( static_cast<sal_uInt16>(reinterpret_cast<sal_uLong>(pEntry->GetUserData())) );
965 pSh->getIDocumentListItemsAccess()->getNumItems( maNumItems );
966 if ( nNumItemIdx < maNumItems.size() )
967 {
968 ::sw::mark::IMark const * const pMark = pSh->getIDocumentMarkAccess()->getMarkForTxtNode(
969 *(maNumItems[nNumItemIdx]->GetTxtNode()),
970 IDocumentMarkAccess::CROSSREF_NUMITEM_BOOKMARK);
971 aName = pMark->GetName();
972 nTypeId = TYP_GETREFFLD;
973 nSubType = REF_BOOKMARK;
974 }
975 }
976 }
977 // <--
978 else // SeqenceFelder
979 {
980 // zum Seq-FeldTyp die Felder besorgen:
981 SwSetExpFieldType* pType = (SwSetExpFieldType*)pSh->GetFldType(
982 nTypeId & ~REFFLDFLAG, RES_SETEXPFLD );
983 if( pType )
984 {
985 SwSeqFldList aArr;
986 _SeqFldLstElem aElem( aSelectionLB.GetSelectEntry(), 0 );
987
988 sal_uInt16 nPos;
989
990 nTypeId = TYP_GETREFFLD;
991 nSubType = REF_SEQUENCEFLD;
992 aName = pType->GetName();
993
994 if (pType->GetSeqFldList(aArr) && aArr.SeekEntry(aElem, &nPos))
995 {
996 aVal = String::CreateFromInt32( aArr[nPos]->nSeqNo );
997
998 if (IsFldEdit() && aArr[nPos]->nSeqNo == pRefFld->GetSeqNo())
999 bModified = sal_True; // Kann bei Feldern passieren, deren Referenz geloescht wurde
1000 }
1001 else if (IsFldEdit())
1002 aVal = String::CreateFromInt32( pRefFld->GetSeqNo() );
1003 }
1004 }
1005 }
1006
1007 if (IsFldEdit() && nTypeId == TYP_GETREFFLD)
1008 {
1009 aVal.Insert('|', 0);
1010 aVal.Insert(String::CreateFromInt32(nSubType), 0);
1011 }
1012
1013 if (!IsFldEdit() || bModified ||
1014 aNameED.GetSavedValue() != aNameED.GetText() ||
1015 aValueED.GetSavedValue() != aValueED.GetText() ||
1016 aTypeLB.GetSavedValue() != aTypeLB.GetSelectEntryPos() ||
1017 aSelectionLB.GetSavedValue() != aSelectionLB.GetSelectEntryPos() ||
1018 aFormatLB.GetSavedValue() != aFormatLB.GetSelectEntryPos())
1019 {
1020 InsertFld( nTypeId, nSubType, aName, aVal, nFormat );
1021 }
1022
1023 ModifyHdl(); // Insert ggf enablen/disablen
1024
1025 return sal_False;
1026 }
1027
1028 /*--------------------------------------------------------------------
1029 Beschreibung:
1030 --------------------------------------------------------------------*/
1031
Create(Window * pParent,const SfxItemSet & rAttrSet)1032 SfxTabPage* SwFldRefPage::Create( Window* pParent,
1033 const SfxItemSet& rAttrSet )
1034 {
1035 return ( new SwFldRefPage( pParent, rAttrSet ) );
1036 }
1037
1038 /*--------------------------------------------------------------------
1039 Beschreibung:
1040 --------------------------------------------------------------------*/
1041
GetGroup()1042 sal_uInt16 SwFldRefPage::GetGroup()
1043 {
1044 return GRP_REF;
1045 }
1046
1047 /* -----------------12.01.99 10:09-------------------
1048 *
1049 * --------------------------------------------------*/
FillUserData()1050 void SwFldRefPage::FillUserData()
1051 {
1052 String sData( String::CreateFromAscii(
1053 RTL_CONSTASCII_STRINGPARAM( USER_DATA_VERSION )));
1054 sData += ';';
1055 sal_uInt16 nTypeSel = aTypeLB.GetSelectEntryPos();
1056 if( LISTBOX_ENTRY_NOTFOUND == nTypeSel )
1057 nTypeSel = USHRT_MAX;
1058 else
1059 nTypeSel = sal::static_int_cast< sal_uInt16 >(reinterpret_cast< sal_uIntPtr >(aTypeLB.GetEntryData( nTypeSel )));
1060 sData += String::CreateFromInt32( nTypeSel );
1061 SetUserData(sData);
1062 }
1063
1064