Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include "swtypes.hxx"
21 : #include <view.hxx>
22 : #include <IMark.hxx>
23 : #include <expfld.hxx>
24 : #include <swmodule.hxx>
25 : #include <fldref.hxx>
26 : #include <reffld.hxx>
27 : #include <wrtsh.hxx>
28 :
29 : #include <fldui.hrc>
30 : #include <fldtdlg.hrc>
31 : #include <globals.hrc>
32 : // #i83479#
33 : #include <SwNodeNum.hxx>
34 : #include <IDocumentMarkAccess.hxx>
35 : #include <ndtxt.hxx>
36 :
37 : #include "svtools/treelistentry.hxx"
38 :
39 : #define REFFLDFLAG 0x4000
40 : #define REFFLDFLAG_BOOKMARK 0x4800
41 : #define REFFLDFLAG_FOOTNOTE 0x5000
42 : #define REFFLDFLAG_ENDNOTE 0x6000
43 : // #i83479#
44 : #define REFFLDFLAG_HEADING 0x7100
45 : #define REFFLDFLAG_NUMITEM 0x7200
46 :
47 : sal_uInt16 nFldDlgFmtSel = 0;
48 :
49 : #define USER_DATA_VERSION_1 "1"
50 : #define USER_DATA_VERSION USER_DATA_VERSION_1
51 :
52 0 : SwFldRefPage::SwFldRefPage(Window* pParent, const SfxItemSet& rCoreSet ) :
53 : SwFldPage( pParent, SW_RES( TP_FLD_REF ), rCoreSet ),
54 :
55 : aTypeFT (this, SW_RES(FT_REFTYPE)),
56 : aTypeLB (this, SW_RES(LB_REFTYPE)),
57 : aSelectionFT (this, SW_RES(FT_REFSELECTION)),
58 : aSelectionLB (this, SW_RES(LB_REFSELECTION)),
59 : // #i83479#
60 : aSelectionToolTipLB( this, SW_RES(LB_REFSELECTION_TOOLTIP) ),
61 : aFormatFT (this, SW_RES(FT_REFFORMAT)),
62 : aFormatLB (this, SW_RES(LB_REFFORMAT)),
63 : aNameFT (this, SW_RES(FT_REFNAME)),
64 : aNameED (this, SW_RES(ED_REFNAME)),
65 : aValueFT (this, SW_RES(FT_REFVALUE)),
66 : aValueED (this, SW_RES(ED_REFVALUE)),
67 :
68 : sBookmarkTxt (SW_RES(STR_REFBOOKMARK)),
69 : sFootnoteTxt (SW_RES(STR_REFFOOTNOTE)),
70 : sEndnoteTxt (SW_RES(STR_REFENDNOTE)),
71 : // #i83479#
72 : sHeadingTxt (SW_RES(STR_REFHEADING)),
73 : sNumItemTxt (SW_RES(STR_REFNUMITEM)),
74 : maOutlineNodes(),
75 : maNumItems(),
76 : mpSavedSelectedTxtNode( 0 ),
77 0 : mnSavedSelectedPos( 0 )
78 : {
79 0 : FreeResource();
80 :
81 0 : aNameED.SetModifyHdl(LINK(this, SwFldRefPage, ModifyHdl));
82 :
83 0 : aTypeLB.SetDoubleClickHdl (LINK(this, SwFldRefPage, InsertHdl));
84 0 : aTypeLB.SetSelectHdl (LINK(this, SwFldRefPage, TypeHdl));
85 0 : aSelectionLB.SetSelectHdl (LINK(this, SwFldRefPage, SubTypeHdl));
86 0 : aSelectionLB.SetDoubleClickHdl (LINK(this, SwFldRefPage, InsertHdl));
87 0 : aFormatLB.SetDoubleClickHdl (LINK(this, SwFldRefPage, InsertHdl));
88 :
89 : // #i83479#
90 0 : aSelectionToolTipLB.SetSelectHdl( LINK(this, SwFldRefPage, SubTypeHdl) );
91 0 : aSelectionToolTipLB.SetDoubleClickHdl( LINK(this, SwFldRefPage, InsertHdl) );
92 0 : aSelectionToolTipLB.SetStyle( aSelectionToolTipLB.GetStyle() | WB_HSCROLL );
93 0 : aSelectionToolTipLB.SetSpaceBetweenEntries(1);
94 0 : aSelectionToolTipLB.SetHighlightRange();
95 0 : }
96 :
97 0 : SwFldRefPage::~SwFldRefPage()
98 : {
99 0 : }
100 :
101 : // #i83479#
102 0 : void SwFldRefPage::SaveSelectedTxtNode()
103 : {
104 0 : mpSavedSelectedTxtNode = 0;
105 0 : mnSavedSelectedPos = 0;
106 0 : if ( aSelectionToolTipLB.IsVisible() )
107 : {
108 0 : SvTreeListEntry* pEntry = aSelectionToolTipLB.GetCurEntry();
109 0 : if ( pEntry )
110 : {
111 0 : const sal_uInt16 nTypeId = (sal_uInt16)(sal_uLong)aTypeLB.GetEntryData(GetTypeSel());
112 :
113 0 : if ( nTypeId == REFFLDFLAG_HEADING )
114 : {
115 0 : mnSavedSelectedPos = static_cast<sal_uInt16>(reinterpret_cast<sal_uLong>(pEntry->GetUserData()));
116 0 : if ( mnSavedSelectedPos < maOutlineNodes.size() )
117 : {
118 0 : mpSavedSelectedTxtNode = maOutlineNodes[mnSavedSelectedPos];
119 : }
120 : }
121 0 : else if ( nTypeId == REFFLDFLAG_NUMITEM )
122 : {
123 0 : mnSavedSelectedPos = static_cast<sal_uInt16>(reinterpret_cast<sal_uLong>(pEntry->GetUserData()));
124 0 : if ( mnSavedSelectedPos < maNumItems.size() )
125 : {
126 0 : mpSavedSelectedTxtNode = maNumItems[mnSavedSelectedPos]->GetTxtNode();
127 : }
128 : }
129 : }
130 : }
131 0 : }
132 :
133 0 : const SwTxtNode* SwFldRefPage::GetSavedSelectedTxtNode() const
134 : {
135 0 : return mpSavedSelectedTxtNode;
136 : }
137 :
138 0 : sal_uInt16 SwFldRefPage::GetSavedSelectedPos() const
139 : {
140 0 : return mnSavedSelectedPos;
141 : }
142 :
143 :
144 0 : void SwFldRefPage::Reset(const SfxItemSet& )
145 : {
146 0 : if (!IsFldEdit())
147 : {
148 0 : SavePos(&aTypeLB);
149 : // #i83479#
150 0 : SaveSelectedTxtNode();
151 : }
152 0 : SetSelectionSel(LISTBOX_ENTRY_NOTFOUND);
153 0 : SetTypeSel(LISTBOX_ENTRY_NOTFOUND);
154 0 : Init(); // general initialisation
155 :
156 : // initialise TypeListBox
157 0 : aTypeLB.SetUpdateMode(sal_False);
158 0 : aTypeLB.Clear();
159 :
160 : // fill Type-Listbox
161 :
162 : sal_uInt16 nPos;
163 : // set/insert reference
164 0 : const SwFldGroupRgn& rRg = GetFldMgr().GetGroupRange(IsFldDlgHtmlMode(), GetGroup());
165 :
166 0 : for (short i = rRg.nStart; i < rRg.nEnd; ++i)
167 : {
168 0 : const sal_uInt16 nTypeId = GetFldMgr().GetTypeId(i);
169 :
170 0 : if (!IsFldEdit() || nTypeId != TYP_SETREFFLD)
171 : {
172 0 : nPos = aTypeLB.InsertEntry(GetFldMgr().GetTypeStr(i), i - rRg.nStart);
173 0 : aTypeLB.SetEntryData(nPos, reinterpret_cast<void*>(nTypeId));
174 : }
175 : }
176 :
177 : // #i83479#
178 : // entries for headings and numbered items
179 0 : nPos = aTypeLB.InsertEntry(sHeadingTxt);
180 0 : aTypeLB.SetEntryData(nPos, (void*)REFFLDFLAG_HEADING);
181 0 : nPos = aTypeLB.InsertEntry(sNumItemTxt);
182 0 : aTypeLB.SetEntryData(nPos, (void*)REFFLDFLAG_NUMITEM);
183 :
184 : // fill up with the sequence types
185 0 : SwWrtShell *pSh = GetWrtShell();
186 0 : if(!pSh)
187 0 : pSh = ::GetActiveWrtShell();
188 :
189 0 : sal_uInt16 nFldTypeCnt = pSh->GetFldTypeCount(RES_SETEXPFLD);
190 :
191 0 : for (sal_uInt16 n = 0; n < nFldTypeCnt; ++n)
192 : {
193 0 : SwSetExpFieldType* pType = (SwSetExpFieldType*)pSh->GetFldType(n, RES_SETEXPFLD);
194 :
195 0 : if ((nsSwGetSetExpType::GSE_SEQ & pType->GetType()) && pType->GetDepends() && pSh->IsUsed(*pType))
196 : {
197 0 : nPos = aTypeLB.InsertEntry(pType->GetName());
198 0 : aTypeLB.SetEntryData(nPos, (void*)(sal_uIntPtr)(REFFLDFLAG | n));
199 : }
200 : }
201 :
202 : // text marks - now always (because of globaldocuments)
203 0 : nPos = aTypeLB.InsertEntry(sBookmarkTxt);
204 0 : aTypeLB.SetEntryData(nPos, (void*)REFFLDFLAG_BOOKMARK);
205 :
206 : // footnotes:
207 0 : if( pSh->HasFtns() )
208 : {
209 0 : nPos = aTypeLB.InsertEntry(sFootnoteTxt);
210 0 : aTypeLB.SetEntryData(nPos, (void*)REFFLDFLAG_FOOTNOTE);
211 : }
212 :
213 : // endnotes:
214 0 : if ( pSh->HasFtns(true) )
215 : {
216 0 : nPos = aTypeLB.InsertEntry(sEndnoteTxt);
217 0 : aTypeLB.SetEntryData(nPos, (void*)REFFLDFLAG_ENDNOTE);
218 : }
219 :
220 : // select old Pos
221 0 : if (!IsFldEdit())
222 0 : RestorePos(&aTypeLB);
223 :
224 0 : aTypeLB.SetUpdateMode(sal_True);
225 :
226 0 : nFldDlgFmtSel = 0;
227 :
228 0 : if( !IsRefresh() )
229 : {
230 0 : String sUserData = GetUserData();
231 0 : if(!IsRefresh() && sUserData.GetToken(0, ';').
232 0 : EqualsIgnoreCaseAscii(USER_DATA_VERSION_1))
233 : {
234 0 : String sVal = sUserData.GetToken(1, ';');
235 0 : sal_uInt16 nVal = static_cast< sal_uInt16 >(sVal.ToInt32());
236 0 : if(nVal != USHRT_MAX)
237 : {
238 0 : for(sal_uInt16 i = 0; i < aTypeLB.GetEntryCount(); i++)
239 0 : if(nVal == (sal_uInt16)(sal_uLong)aTypeLB.GetEntryData(i))
240 : {
241 0 : aTypeLB.SelectEntryPos(i);
242 0 : break;
243 : }
244 0 : }
245 0 : }
246 : }
247 0 : TypeHdl(0);
248 :
249 0 : if (IsFldEdit())
250 : {
251 0 : aTypeLB.SaveValue();
252 0 : aSelectionLB.SaveValue();
253 0 : aFormatLB.SaveValue();
254 0 : aNameED.SaveValue();
255 0 : aValueED.SaveValue();
256 : }
257 0 : }
258 :
259 0 : IMPL_LINK_NOARG(SwFldRefPage, TypeHdl)
260 : {
261 : // save old ListBoxPos
262 0 : const sal_uInt16 nOld = GetTypeSel();
263 :
264 : // current ListBoxPos
265 0 : SetTypeSel(aTypeLB.GetSelectEntryPos());
266 :
267 0 : if(GetTypeSel() == LISTBOX_ENTRY_NOTFOUND)
268 : {
269 0 : if (IsFldEdit())
270 : {
271 : // select positions
272 0 : String sName;
273 0 : sal_uInt16 nFlag = 0;
274 :
275 0 : switch( GetCurField()->GetSubType() )
276 : {
277 : case REF_BOOKMARK:
278 : {
279 : // #i83479#
280 0 : SwGetRefField* pRefFld = dynamic_cast<SwGetRefField*>(GetCurField());
281 0 : if ( pRefFld &&
282 0 : pRefFld->IsRefToHeadingCrossRefBookmark() )
283 : {
284 0 : sName = sHeadingTxt;
285 0 : nFlag = REFFLDFLAG_HEADING;
286 : }
287 0 : else if ( pRefFld &&
288 0 : pRefFld->IsRefToNumItemCrossRefBookmark() )
289 : {
290 0 : sName = sNumItemTxt;
291 0 : nFlag = REFFLDFLAG_NUMITEM;
292 : }
293 : else
294 : {
295 0 : sName = sBookmarkTxt;
296 0 : nFlag = REFFLDFLAG_BOOKMARK;
297 : }
298 : }
299 0 : break;
300 :
301 : case REF_FOOTNOTE:
302 0 : sName = sFootnoteTxt;
303 0 : nFlag = REFFLDFLAG_FOOTNOTE;
304 0 : break;
305 :
306 : case REF_ENDNOTE:
307 0 : sName = sEndnoteTxt;
308 0 : nFlag = REFFLDFLAG_ENDNOTE;
309 0 : break;
310 :
311 : case REF_SETREFATTR:
312 0 : sName = SW_RESSTR(STR_GETREFFLD);
313 0 : nFlag = REF_SETREFATTR;
314 0 : break;
315 :
316 : case REF_SEQUENCEFLD:
317 0 : sName = ((SwGetRefField*)GetCurField())->GetSetRefName();
318 0 : nFlag = REFFLDFLAG;
319 0 : break;
320 : }
321 :
322 0 : if (aTypeLB.GetEntryPos(sName) == LISTBOX_ENTRY_NOTFOUND) // reference to deleted mark
323 : {
324 0 : sal_uInt16 nPos = aTypeLB.InsertEntry(sName);
325 0 : aTypeLB.SetEntryData(nPos, reinterpret_cast<void*>(nFlag));
326 : }
327 :
328 0 : aTypeLB.SelectEntry(sName);
329 0 : SetTypeSel(aTypeLB.GetSelectEntryPos());
330 : }
331 : else
332 : {
333 0 : SetTypeSel(0);
334 0 : aTypeLB.SelectEntryPos(0);
335 : }
336 : }
337 :
338 0 : if (nOld != GetTypeSel())
339 : {
340 0 : sal_uInt16 nTypeId = (sal_uInt16)(sal_uLong)aTypeLB.GetEntryData(GetTypeSel());
341 :
342 : // fill selection-ListBox
343 0 : UpdateSubType();
344 :
345 0 : sal_Bool bName = sal_False; nFldDlgFmtSel = 0;
346 :
347 0 : if ( ( !IsFldEdit() || aSelectionLB.GetEntryCount() ) &&
348 : nOld != LISTBOX_ENTRY_NOTFOUND )
349 : {
350 0 : aNameED.SetText(aEmptyStr);
351 0 : aValueED.SetText(aEmptyStr);
352 : }
353 :
354 0 : switch (nTypeId)
355 : {
356 : case TYP_GETREFFLD:
357 0 : if (REFFLDFLAG & (sal_uInt16)(sal_uLong)aTypeLB.GetEntryData(nOld))
358 : // the the old one stays
359 0 : nFldDlgFmtSel = aFormatLB.GetSelectEntryPos();
360 0 : bName = sal_True;
361 0 : break;
362 :
363 : case TYP_SETREFFLD:
364 0 : bName = sal_True;
365 0 : break;
366 :
367 : case REFFLDFLAG_BOOKMARK:
368 0 : bName = sal_True;
369 : // no break!!!
370 : default:
371 0 : if( REFFLDFLAG & nTypeId )
372 : {
373 0 : sal_uInt16 nOldId = (sal_uInt16)(sal_uLong)aTypeLB.GetEntryData(nOld);
374 0 : if( nOldId & REFFLDFLAG || nOldId == TYP_GETREFFLD )
375 : // then the old one stays
376 0 : nFldDlgFmtSel = aFormatLB.GetSelectEntryPos();
377 : }
378 0 : break;
379 : }
380 :
381 0 : aNameED.Enable(bName);
382 0 : aNameFT.Enable(bName);
383 :
384 : // fill Format-Listbox
385 0 : sal_uInt16 nSize = FillFormatLB(nTypeId);
386 0 : sal_Bool bFormat = nSize != 0;
387 0 : aFormatLB.Enable(bFormat);
388 0 : aFormatFT.Enable(bFormat);
389 :
390 0 : SubTypeHdl();
391 0 : ModifyHdl();
392 : }
393 :
394 0 : return 0;
395 : }
396 :
397 0 : IMPL_LINK_NOARG(SwFldRefPage, SubTypeHdl)
398 : {
399 0 : sal_uInt16 nTypeId = (sal_uInt16)(sal_uLong)aTypeLB.GetEntryData(GetTypeSel());
400 :
401 0 : switch(nTypeId)
402 : {
403 : case TYP_GETREFFLD:
404 0 : if (!IsFldEdit() || aSelectionLB.GetSelectEntryCount())
405 : {
406 0 : aNameED.SetText(aSelectionLB.GetSelectEntry());
407 0 : ModifyHdl(&aNameED);
408 : }
409 0 : break;
410 :
411 : case TYP_SETREFFLD:
412 : {
413 0 : SwWrtShell *pSh = GetWrtShell();
414 0 : if(!pSh)
415 0 : pSh = ::GetActiveWrtShell();
416 0 : if(pSh)
417 : {
418 0 : aValueED.SetText(pSh->GetSelTxt());
419 : }
420 :
421 : }
422 0 : break;
423 : // #i83479#
424 : case REFFLDFLAG_HEADING:
425 : case REFFLDFLAG_NUMITEM:
426 : {
427 0 : if ( aSelectionToolTipLB.GetCurEntry() )
428 : {
429 : aNameED.SetText( aSelectionToolTipLB.GetEntryText(
430 0 : aSelectionToolTipLB.GetCurEntry() ) );
431 : }
432 : }
433 0 : break;
434 :
435 : default:
436 0 : if (!IsFldEdit() || aSelectionLB.GetSelectEntryCount())
437 0 : aNameED.SetText(aSelectionLB.GetSelectEntry());
438 0 : break;
439 : }
440 :
441 0 : return 0;
442 : }
443 :
444 : /*--------------------------------------------------------------------
445 : Description: renew types in SelectionLB
446 : --------------------------------------------------------------------*/
447 :
448 0 : void SwFldRefPage::UpdateSubType()
449 : {
450 0 : SwWrtShell *pSh = GetWrtShell();
451 0 : if(!pSh)
452 0 : pSh = ::GetActiveWrtShell();
453 0 : SwGetRefField* pRefFld = (SwGetRefField*)GetCurField();
454 0 : const sal_uInt16 nTypeId = (sal_uInt16)(sal_uLong)aTypeLB.GetEntryData(GetTypeSel());
455 :
456 0 : String sOldSel;
457 : // #i83479#
458 0 : if ( aSelectionLB.IsVisible() )
459 : {
460 0 : const sal_uInt16 nSelectionSel = aSelectionLB.GetSelectEntryPos();
461 0 : if (nSelectionSel != LISTBOX_ENTRY_NOTFOUND)
462 : {
463 0 : sOldSel = aSelectionLB.GetEntry(nSelectionSel);
464 : }
465 : }
466 0 : if (IsFldEdit() && !sOldSel.Len())
467 0 : sOldSel = String::CreateFromInt32( pRefFld->GetSeqNo() + 1 );
468 :
469 0 : aSelectionLB.SetUpdateMode(sal_False);
470 0 : aSelectionLB.Clear();
471 : // #i83479#
472 0 : aSelectionToolTipLB.SetUpdateMode(sal_False);
473 0 : aSelectionToolTipLB.Clear();
474 0 : bool bShowSelectionToolTipLB( false );
475 :
476 0 : if( REFFLDFLAG & nTypeId )
477 : {
478 0 : if (nTypeId == REFFLDFLAG_BOOKMARK) // text marks!
479 : {
480 0 : aSelectionLB.SetStyle(aSelectionLB.GetStyle()|WB_SORT);
481 : // get all text marks
482 0 : IDocumentMarkAccess* const pMarkAccess = pSh->getIDocumentMarkAccess();
483 0 : for(IDocumentMarkAccess::const_iterator_t ppMark = pMarkAccess->getBookmarksBegin();
484 0 : ppMark != pMarkAccess->getBookmarksEnd();
485 : ++ppMark)
486 : {
487 0 : const ::sw::mark::IMark* pBkmk = ppMark->get();
488 0 : if(IDocumentMarkAccess::BOOKMARK == IDocumentMarkAccess::GetType(*pBkmk))
489 0 : aSelectionLB.InsertEntry( pBkmk->GetName() );
490 : }
491 0 : if (IsFldEdit())
492 0 : sOldSel = pRefFld->GetSetRefName();
493 : }
494 0 : else if (nTypeId == REFFLDFLAG_FOOTNOTE)
495 : {
496 0 : aSelectionLB.SetStyle(aSelectionLB.GetStyle() & ~WB_SORT);
497 0 : SwSeqFldList aArr;
498 0 : sal_uInt16 nCnt = pSh->GetSeqFtnList( aArr );
499 :
500 0 : for( sal_uInt16 n = 0; n < nCnt; ++n )
501 : {
502 0 : aSelectionLB.InsertEntry( aArr[ n ]->sDlgEntry );
503 0 : if (IsFldEdit() && pRefFld->GetSeqNo() == aArr[ n ]->nSeqNo)
504 0 : sOldSel = aArr[n]->sDlgEntry;
505 0 : }
506 : }
507 0 : else if (nTypeId == REFFLDFLAG_ENDNOTE)
508 : {
509 0 : aSelectionLB.SetStyle(aSelectionLB.GetStyle() & ~WB_SORT);
510 0 : SwSeqFldList aArr;
511 0 : sal_uInt16 nCnt = pSh->GetSeqFtnList( aArr, true );
512 :
513 0 : for( sal_uInt16 n = 0; n < nCnt; ++n )
514 : {
515 0 : aSelectionLB.InsertEntry( aArr[ n ]->sDlgEntry );
516 0 : if (IsFldEdit() && pRefFld->GetSeqNo() == aArr[ n ]->nSeqNo)
517 0 : sOldSel = aArr[n]->sDlgEntry;
518 0 : }
519 : }
520 : // #i83479#
521 0 : else if ( nTypeId == REFFLDFLAG_HEADING )
522 : {
523 0 : bShowSelectionToolTipLB = true;
524 :
525 0 : const IDocumentOutlineNodes* pIDoc( pSh->getIDocumentOutlineNodesAccess() );
526 0 : pIDoc->getOutlineNodes( maOutlineNodes );
527 0 : bool bCertainTxtNodeSelected( false );
528 0 : SvTreeListEntry* pEntry = 0;
529 0 : sal_uInt16 nOutlIdx = 0;
530 0 : for ( nOutlIdx = 0; nOutlIdx < maOutlineNodes.size(); ++nOutlIdx )
531 : {
532 : pEntry = aSelectionToolTipLB.InsertEntry(
533 0 : pIDoc->getOutlineText( nOutlIdx, true, true ) );
534 0 : pEntry->SetUserData( reinterpret_cast<void*>(nOutlIdx) );
535 0 : if ( ( IsFldEdit() &&
536 0 : pRefFld->GetReferencedTxtNode() == maOutlineNodes[nOutlIdx] ) ||
537 0 : GetSavedSelectedTxtNode() == maOutlineNodes[nOutlIdx] )
538 : {
539 0 : aSelectionToolTipLB.Select( pEntry );
540 0 : sOldSel.Erase();
541 0 : bCertainTxtNodeSelected = true;
542 : }
543 0 : else if ( !bCertainTxtNodeSelected &&
544 0 : GetSavedSelectedPos() == nOutlIdx )
545 : {
546 0 : aSelectionToolTipLB.Select( pEntry );
547 0 : sOldSel.Erase();
548 : }
549 : }
550 : }
551 0 : else if ( nTypeId == REFFLDFLAG_NUMITEM )
552 : {
553 0 : bShowSelectionToolTipLB = true;
554 :
555 0 : const IDocumentListItems* pIDoc( pSh->getIDocumentListItemsAccess() );
556 0 : pIDoc->getNumItems( maNumItems );
557 0 : bool bCertainTxtNodeSelected( false );
558 0 : SvTreeListEntry* pEntry = 0;
559 0 : sal_uInt16 nNumItemIdx = 0;
560 0 : for ( nNumItemIdx = 0; nNumItemIdx < maNumItems.size(); ++nNumItemIdx )
561 : {
562 : pEntry = aSelectionToolTipLB.InsertEntry(
563 0 : pIDoc->getListItemText( *maNumItems[nNumItemIdx], true, true ) );
564 0 : pEntry->SetUserData( reinterpret_cast<void*>(nNumItemIdx) );
565 0 : if ( ( IsFldEdit() &&
566 0 : pRefFld->GetReferencedTxtNode() == maNumItems[nNumItemIdx]->GetTxtNode() ) ||
567 0 : GetSavedSelectedTxtNode() == maNumItems[nNumItemIdx]->GetTxtNode() )
568 : {
569 0 : aSelectionToolTipLB.Select( pEntry );
570 0 : sOldSel.Erase();
571 0 : bCertainTxtNodeSelected = true;
572 : }
573 0 : else if ( !bCertainTxtNodeSelected &&
574 0 : GetSavedSelectedPos() == nNumItemIdx )
575 : {
576 0 : aSelectionToolTipLB.Select( pEntry );
577 0 : sOldSel.Erase();
578 : }
579 : }
580 : }
581 : else
582 : {
583 0 : aSelectionLB.SetStyle(aSelectionLB.GetStyle()|WB_SORT);
584 : // get the fields to Seq-FieldType:
585 :
586 : SwSetExpFieldType* pType = (SwSetExpFieldType*)pSh->GetFldType(
587 0 : nTypeId & ~REFFLDFLAG, RES_SETEXPFLD );
588 0 : if( pType )
589 : {
590 0 : SwSeqFldList aArr;
591 : // old selection should be kept in non-edit mode
592 0 : if(IsFldEdit())
593 0 : sOldSel.Erase();
594 :
595 0 : sal_uInt16 nCnt = pType->GetSeqFldList( aArr );
596 0 : for( sal_uInt16 n = 0; n < nCnt; ++n )
597 : {
598 0 : aSelectionLB.InsertEntry( aArr[ n ]->sDlgEntry );
599 0 : if (IsFldEdit() && !sOldSel.Len() &&
600 0 : aArr[ n ]->nSeqNo == pRefFld->GetSeqNo())
601 0 : sOldSel = aArr[ n ]->sDlgEntry;
602 : }
603 :
604 0 : if (IsFldEdit() && !sOldSel.Len())
605 0 : sOldSel = String::CreateFromInt32( pRefFld->GetSeqNo() + 1);
606 : }
607 : }
608 : }
609 : else
610 : {
611 0 : std::vector<rtl::OUString> aLst;
612 0 : GetFldMgr().GetSubTypes(nTypeId, aLst);
613 0 : for(size_t i = 0; i < aLst.size(); ++i)
614 0 : aSelectionLB.InsertEntry(aLst[i]);
615 :
616 0 : if (IsFldEdit())
617 0 : sOldSel = pRefFld->GetSetRefName();
618 : }
619 :
620 : // #i83479#
621 0 : aSelectionToolTipLB.Show( bShowSelectionToolTipLB );
622 0 : aSelectionLB.Show( !bShowSelectionToolTipLB );
623 0 : if ( bShowSelectionToolTipLB )
624 : {
625 0 : aSelectionToolTipLB.SetUpdateMode(sal_True);
626 :
627 0 : sal_Bool bEnable = aSelectionToolTipLB.GetEntryCount() != 0;
628 0 : aSelectionToolTipLB.Enable( bEnable );
629 0 : aSelectionFT.Enable( bEnable );
630 :
631 0 : if ( aSelectionToolTipLB.GetCurEntry() != 0 )
632 : {
633 0 : aSelectionToolTipLB.MakeVisible( aSelectionToolTipLB.GetCurEntry() );
634 : }
635 :
636 0 : if ( IsFldEdit() && aSelectionToolTipLB.GetCurEntry() == 0 )
637 : {
638 0 : aNameED.SetText(sOldSel);
639 : }
640 : }
641 : else
642 : {
643 0 : aSelectionLB.SetUpdateMode(sal_True);
644 :
645 : // enable or disable
646 0 : sal_Bool bEnable = aSelectionLB.GetEntryCount() != 0;
647 0 : aSelectionLB.Enable( bEnable );
648 0 : aSelectionFT.Enable( bEnable );
649 :
650 0 : if ( bEnable )
651 : {
652 0 : aSelectionLB.SelectEntry(sOldSel);
653 0 : if (!aSelectionLB.GetSelectEntryCount() && !IsFldEdit())
654 0 : aSelectionLB.SelectEntryPos(0);
655 : }
656 :
657 0 : if (IsFldEdit() && !aSelectionLB.GetSelectEntryCount()) // in case the reference was already deleted...
658 0 : aNameED.SetText(sOldSel);
659 0 : }
660 0 : }
661 :
662 0 : sal_uInt16 SwFldRefPage::FillFormatLB(sal_uInt16 nTypeId)
663 : {
664 0 : String sOldSel;
665 :
666 0 : sal_uInt16 nFormatSel = aFormatLB.GetSelectEntryPos();
667 0 : if (nFormatSel != LISTBOX_ENTRY_NOTFOUND)
668 0 : sOldSel = aFormatLB.GetEntry(nFormatSel);
669 :
670 : // fill Format-Listbox
671 0 : aFormatLB.Clear();
672 :
673 : // refernce has less that the annotation
674 0 : sal_uInt16 nSize( 0 );
675 0 : bool bAddCrossRefFormats( false );
676 0 : switch (nTypeId)
677 : {
678 : // #i83479#
679 : case REFFLDFLAG_HEADING:
680 : case REFFLDFLAG_NUMITEM:
681 0 : bAddCrossRefFormats = true;
682 : // intentional no break here
683 :
684 : case TYP_GETREFFLD:
685 : case REFFLDFLAG_BOOKMARK:
686 : case REFFLDFLAG_FOOTNOTE:
687 : case REFFLDFLAG_ENDNOTE:
688 0 : nSize = FMT_REF_PAGE_PGDSC - FMT_REF_BEGIN + 1;
689 0 : break;
690 :
691 : default:
692 : // #i83479#
693 :
694 0 : if ( REFFLDFLAG & nTypeId )
695 : {
696 0 : nSize = FMT_REF_ONLYSEQNO - FMT_REF_BEGIN + 1;
697 : }
698 : else
699 : {
700 0 : nSize = GetFldMgr().GetFormatCount( nTypeId, sal_False, IsFldDlgHtmlMode() );
701 : }
702 0 : break;
703 : }
704 :
705 0 : if (REFFLDFLAG & nTypeId)
706 0 : nTypeId = TYP_GETREFFLD;
707 :
708 0 : for (sal_uInt16 i = 0; i < nSize; i++)
709 : {
710 0 : sal_uInt16 nPos = aFormatLB.InsertEntry(GetFldMgr().GetFormatStr( nTypeId, i ));
711 0 : aFormatLB.SetEntryData( nPos, reinterpret_cast<void*>(GetFldMgr().GetFormatId( nTypeId, i )));
712 : }
713 : // #i83479#
714 0 : if ( bAddCrossRefFormats )
715 : {
716 0 : sal_uInt16 nFormat = FMT_REF_NUMBER - FMT_REF_BEGIN;
717 0 : sal_uInt16 nPos = aFormatLB.InsertEntry(GetFldMgr().GetFormatStr( nTypeId, nFormat ));
718 0 : aFormatLB.SetEntryData( nPos, reinterpret_cast<void*>(GetFldMgr().GetFormatId( nTypeId, nFormat )));
719 0 : nFormat = FMT_REF_NUMBER_NO_CONTEXT - FMT_REF_BEGIN;
720 0 : nPos = aFormatLB.InsertEntry(GetFldMgr().GetFormatStr( nTypeId, nFormat ));
721 0 : aFormatLB.SetEntryData( nPos, reinterpret_cast<void*>(GetFldMgr().GetFormatId( nTypeId, nFormat )));
722 0 : nFormat = FMT_REF_NUMBER_FULL_CONTEXT - FMT_REF_BEGIN;
723 0 : nPos = aFormatLB.InsertEntry(GetFldMgr().GetFormatStr( nTypeId, nFormat ));
724 0 : aFormatLB.SetEntryData( nPos, reinterpret_cast<void*>(GetFldMgr().GetFormatId( nTypeId, nFormat )));
725 0 : nSize += 3;
726 : }
727 :
728 : // select a certain entry
729 0 : if (nSize)
730 : {
731 0 : if (!IsFldEdit())
732 0 : aFormatLB.SelectEntry(sOldSel);
733 : else
734 0 : aFormatLB.SelectEntry(SW_RESSTR(FMT_REF_BEGIN + (sal_uInt16)GetCurField()->GetFormat()));
735 :
736 0 : if (!aFormatLB.GetSelectEntryCount())
737 : {
738 0 : aFormatLB.SelectEntryPos(nFldDlgFmtSel);
739 0 : if (!aFormatLB.GetSelectEntryCount())
740 0 : aFormatLB.SelectEntryPos(0);
741 : }
742 : }
743 :
744 0 : return nSize;
745 : }
746 :
747 : /*--------------------------------------------------------------------
748 : Description: Modify
749 : --------------------------------------------------------------------*/
750 :
751 0 : IMPL_LINK_NOARG(SwFldRefPage, ModifyHdl)
752 : {
753 0 : String aName(aNameED.GetText());
754 0 : const sal_uInt16 nLen = aName.Len();
755 :
756 0 : sal_Bool bEnable = sal_True;
757 0 : sal_uInt16 nTypeId = (sal_uInt16)(sal_uLong)aTypeLB.GetEntryData(GetTypeSel());
758 :
759 0 : if ((nTypeId == TYP_SETREFFLD && !GetFldMgr().CanInsertRefMark(aName)) ||
760 : (nLen == 0 && (nTypeId == TYP_GETREFFLD || nTypeId == TYP_SETREFFLD ||
761 : nTypeId == REFFLDFLAG_BOOKMARK)))
762 0 : bEnable = sal_False;
763 :
764 0 : EnableInsert(bEnable);
765 :
766 0 : aSelectionLB.SelectEntry(aName);
767 :
768 0 : return 0;
769 : }
770 :
771 0 : sal_Bool SwFldRefPage::FillItemSet(SfxItemSet& )
772 : {
773 0 : sal_Bool bModified = sal_False;
774 0 : sal_uInt16 nTypeId = (sal_uInt16)(sal_uLong)aTypeLB.GetEntryData(GetTypeSel());
775 :
776 0 : sal_uInt16 nSubType = 0;
777 : sal_uLong nFormat;
778 :
779 0 : nFormat = aFormatLB.GetSelectEntryPos();
780 :
781 0 : if(nFormat == LISTBOX_ENTRY_NOTFOUND)
782 0 : nFormat = 0;
783 : else
784 0 : nFormat = (sal_uLong)aFormatLB.GetEntryData((sal_uInt16)nFormat);
785 :
786 0 : String aVal(aValueED.GetText());
787 0 : String aName(aNameED.GetText());
788 :
789 0 : switch(nTypeId)
790 : {
791 : case TYP_GETREFFLD:
792 0 : nSubType = REF_SETREFATTR;
793 0 : break;
794 :
795 : case TYP_SETREFFLD:
796 : {
797 0 : SwFieldType* pType = GetFldMgr().GetFldType(RES_SETEXPFLD, aName);
798 :
799 0 : if(!pType) // Only insert when the name doesn't exist yet
800 : {
801 0 : aSelectionLB.InsertEntry(aName);
802 0 : aSelectionLB.Enable();
803 0 : aSelectionFT.Enable();
804 : }
805 0 : break;
806 : }
807 : }
808 :
809 0 : SwGetRefField* pRefFld = (SwGetRefField*)GetCurField();
810 :
811 0 : if (REFFLDFLAG & nTypeId)
812 : {
813 0 : SwWrtShell *pSh = GetWrtShell();
814 0 : if(!pSh)
815 : {
816 0 : pSh = ::GetActiveWrtShell();
817 : }
818 0 : if (nTypeId == REFFLDFLAG_BOOKMARK) // text marks!
819 : {
820 0 : aName = aNameED.GetText();
821 0 : nTypeId = TYP_GETREFFLD;
822 0 : nSubType = REF_BOOKMARK;
823 : }
824 0 : else if (REFFLDFLAG_FOOTNOTE == nTypeId) // footnotes
825 : {
826 0 : SwSeqFldList aArr;
827 0 : _SeqFldLstElem aElem( aSelectionLB.GetSelectEntry(), 0 );
828 :
829 : sal_uInt16 nPos;
830 :
831 0 : nTypeId = TYP_GETREFFLD;
832 0 : nSubType = REF_FOOTNOTE;
833 0 : aName.Erase();
834 :
835 0 : if (pSh->GetSeqFtnList(aArr) && aArr.SeekEntry(aElem, &nPos))
836 : {
837 0 : aVal = String::CreateFromInt32( aArr[nPos]->nSeqNo );
838 :
839 0 : if (IsFldEdit() && aArr[nPos]->nSeqNo == pRefFld->GetSeqNo())
840 0 : bModified = sal_True; // can happen with fields of which the references were deleted
841 : }
842 0 : else if (IsFldEdit())
843 0 : aVal = String::CreateFromInt32( pRefFld->GetSeqNo() );
844 : }
845 0 : else if (REFFLDFLAG_ENDNOTE == nTypeId) // endnotes
846 : {
847 0 : SwSeqFldList aArr;
848 0 : _SeqFldLstElem aElem( aSelectionLB.GetSelectEntry(), 0 );
849 :
850 : sal_uInt16 nPos;
851 :
852 0 : nTypeId = TYP_GETREFFLD;
853 0 : nSubType = REF_ENDNOTE;
854 0 : aName.Erase();
855 :
856 0 : if (pSh->GetSeqFtnList(aArr, true) && aArr.SeekEntry(aElem, &nPos))
857 : {
858 0 : aVal = String::CreateFromInt32( aArr[nPos]->nSeqNo );
859 :
860 0 : if (IsFldEdit() && aArr[nPos]->nSeqNo == pRefFld->GetSeqNo())
861 0 : bModified = sal_True; // can happen with fields of which the reference was deleted
862 : }
863 0 : else if (IsFldEdit())
864 0 : aVal = String::CreateFromInt32( pRefFld->GetSeqNo() );
865 : }
866 : // #i83479#
867 0 : else if ( nTypeId == REFFLDFLAG_HEADING )
868 : {
869 0 : SvTreeListEntry* pEntry = aSelectionToolTipLB.GetCurEntry();
870 : OSL_ENSURE( pEntry,
871 : "<SwFldRefPage::FillItemSet(..)> - no entry selected in selection tool tip listbox!" );
872 0 : if ( pEntry )
873 : {
874 0 : const sal_uInt16 nOutlIdx( static_cast<sal_uInt16>(reinterpret_cast<sal_uLong>(pEntry->GetUserData())) );
875 0 : pSh->getIDocumentOutlineNodesAccess()->getOutlineNodes( maOutlineNodes );
876 0 : if ( nOutlIdx < maOutlineNodes.size() )
877 : {
878 0 : ::sw::mark::IMark const * const pMark = pSh->getIDocumentMarkAccess()->getMarkForTxtNode(
879 0 : *(maOutlineNodes[nOutlIdx]),
880 0 : IDocumentMarkAccess::CROSSREF_HEADING_BOOKMARK);
881 0 : aName = pMark->GetName();
882 0 : nTypeId = TYP_GETREFFLD;
883 0 : nSubType = REF_BOOKMARK;
884 : }
885 : }
886 : }
887 0 : else if ( nTypeId == REFFLDFLAG_NUMITEM )
888 : {
889 0 : SvTreeListEntry* pEntry = aSelectionToolTipLB.GetCurEntry();
890 : OSL_ENSURE( pEntry,
891 : "<SwFldRefPage::FillItemSet(..)> - no entry selected in selection tool tip listbox!" );
892 0 : if ( pEntry )
893 : {
894 0 : const sal_uInt16 nNumItemIdx( static_cast<sal_uInt16>(reinterpret_cast<sal_uLong>(pEntry->GetUserData())) );
895 0 : pSh->getIDocumentListItemsAccess()->getNumItems( maNumItems );
896 0 : if ( nNumItemIdx < maNumItems.size() )
897 : {
898 0 : ::sw::mark::IMark const * const pMark = pSh->getIDocumentMarkAccess()->getMarkForTxtNode(
899 0 : *(maNumItems[nNumItemIdx]->GetTxtNode()),
900 0 : IDocumentMarkAccess::CROSSREF_NUMITEM_BOOKMARK);
901 0 : aName = pMark->GetName();
902 0 : nTypeId = TYP_GETREFFLD;
903 0 : nSubType = REF_BOOKMARK;
904 : }
905 : }
906 : }
907 : else // SeqenceFields
908 : {
909 : // get fields for Seq-FeldType:
910 : SwSetExpFieldType* pType = (SwSetExpFieldType*)pSh->GetFldType(
911 0 : nTypeId & ~REFFLDFLAG, RES_SETEXPFLD );
912 0 : if( pType )
913 : {
914 0 : SwSeqFldList aArr;
915 0 : _SeqFldLstElem aElem( aSelectionLB.GetSelectEntry(), 0 );
916 :
917 : sal_uInt16 nPos;
918 :
919 0 : nTypeId = TYP_GETREFFLD;
920 0 : nSubType = REF_SEQUENCEFLD;
921 0 : aName = pType->GetName();
922 :
923 0 : if (pType->GetSeqFldList(aArr) && aArr.SeekEntry(aElem, &nPos))
924 : {
925 0 : aVal = String::CreateFromInt32( aArr[nPos]->nSeqNo );
926 :
927 0 : if (IsFldEdit() && aArr[nPos]->nSeqNo == pRefFld->GetSeqNo())
928 0 : bModified = sal_True; // can happen with fields of which the reference was deleted
929 : }
930 0 : else if (IsFldEdit())
931 0 : aVal = String::CreateFromInt32( pRefFld->GetSeqNo() );
932 : }
933 : }
934 : }
935 :
936 0 : if (IsFldEdit() && nTypeId == TYP_GETREFFLD)
937 : {
938 0 : aVal.Insert('|', 0);
939 0 : aVal.Insert(String::CreateFromInt32(nSubType), 0);
940 : }
941 :
942 0 : if (!IsFldEdit() || bModified ||
943 0 : aNameED.GetSavedValue() != aNameED.GetText() ||
944 0 : aValueED.GetSavedValue() != aValueED.GetText() ||
945 0 : aTypeLB.GetSavedValue() != aTypeLB.GetSelectEntryPos() ||
946 0 : aSelectionLB.GetSavedValue() != aSelectionLB.GetSelectEntryPos() ||
947 0 : aFormatLB.GetSavedValue() != aFormatLB.GetSelectEntryPos())
948 : {
949 0 : InsertFld( nTypeId, nSubType, aName, aVal, nFormat );
950 : }
951 :
952 0 : ModifyHdl(); // enable/disable insert if applicable
953 :
954 0 : return sal_False;
955 : }
956 :
957 0 : SfxTabPage* SwFldRefPage::Create( Window* pParent,
958 : const SfxItemSet& rAttrSet )
959 : {
960 0 : return ( new SwFldRefPage( pParent, rAttrSet ) );
961 : }
962 :
963 0 : sal_uInt16 SwFldRefPage::GetGroup()
964 : {
965 0 : return GRP_REF;
966 : }
967 :
968 0 : void SwFldRefPage::FillUserData()
969 : {
970 0 : String sData(rtl::OUString(USER_DATA_VERSION));
971 0 : sData += ';';
972 0 : sal_uInt16 nTypeSel = aTypeLB.GetSelectEntryPos();
973 0 : if( LISTBOX_ENTRY_NOTFOUND == nTypeSel )
974 0 : nTypeSel = USHRT_MAX;
975 : else
976 0 : nTypeSel = sal::static_int_cast< sal_uInt16 >(reinterpret_cast< sal_uIntPtr >(aTypeLB.GetEntryData( nTypeSel )));
977 0 : sData += String::CreateFromInt32( nTypeSel );
978 0 : SetUserData(sData);
979 0 : }
980 :
981 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|