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 <globals.hrc>
31 : #include <SwNodeNum.hxx>
32 : #include <IDocumentMarkAccess.hxx>
33 : #include <ndtxt.hxx>
34 :
35 : #include <svtools/treelistentry.hxx>
36 :
37 : #define REFFLDFLAG 0x4000
38 : #define REFFLDFLAG_BOOKMARK 0x4800
39 : #define REFFLDFLAG_FOOTNOTE 0x5000
40 : #define REFFLDFLAG_ENDNOTE 0x6000
41 : // #i83479#
42 : #define REFFLDFLAG_HEADING 0x7100
43 : #define REFFLDFLAG_NUMITEM 0x7200
44 :
45 : static sal_uInt16 nFldDlgFmtSel = 0;
46 :
47 : #define USER_DATA_VERSION_1 "1"
48 : #define USER_DATA_VERSION USER_DATA_VERSION_1
49 :
50 0 : SwFldRefPage::SwFldRefPage(vcl::Window* pParent, const SfxItemSet& rCoreSet )
51 : : SwFldPage(pParent, "FldRefPage",
52 : "modules/swriter/ui/fldrefpage.ui", rCoreSet)
53 : , maOutlineNodes()
54 : , maNumItems()
55 : , mpSavedSelectedTxtNode(0)
56 0 : , mnSavedSelectedPos(0)
57 : {
58 0 : get(m_pTypeLB, "type");
59 0 : get(m_pSelection, "selectframe");
60 0 : get(m_pSelectionLB, "select");
61 0 : m_pSelectionLB->SetStyle(m_pSelectionLB->GetStyle() | WB_SORT);
62 : // #i83479#
63 0 : get(m_pSelectionToolTipLB, "selecttip");
64 0 : get(m_pFormat, "formatframe");
65 0 : get(m_pFormatLB, "format");
66 0 : get(m_pNameFT, "nameft");
67 0 : get(m_pNameED, "name");
68 0 : get(m_pValueED, "value");
69 :
70 0 : sBookmarkTxt = m_pTypeLB->GetEntry(0);
71 0 : sFootnoteTxt = m_pTypeLB->GetEntry(1);
72 0 : sEndnoteTxt = m_pTypeLB->GetEntry(2);
73 : // #i83479#
74 0 : sHeadingTxt = m_pTypeLB->GetEntry(3);
75 0 : sNumItemTxt = m_pTypeLB->GetEntry(4);
76 0 : m_pTypeLB->Clear();
77 :
78 0 : long nHeight = m_pTypeLB->GetTextHeight() * 20;
79 0 : m_pSelection->set_height_request(nHeight);
80 0 : m_pSelectionToolTipLB->set_height_request(nHeight);
81 :
82 0 : nHeight = m_pTypeLB->GetTextHeight() * 8;
83 0 : m_pTypeLB->set_height_request(nHeight);
84 0 : m_pFormatLB->set_height_request(nHeight);
85 :
86 0 : long nWidth = m_pTypeLB->LogicToPixel(Size(FIELD_COLUMN_WIDTH, 0), MapMode(MAP_APPFONT)).Width();
87 0 : m_pTypeLB->set_width_request(nWidth);
88 0 : m_pFormatLB->set_width_request(nWidth);
89 0 : m_pSelection->set_width_request(nWidth*2);
90 0 : m_pSelectionToolTipLB->set_width_request(nWidth*2);
91 :
92 0 : m_pNameED->SetModifyHdl(LINK(this, SwFldRefPage, ModifyHdl));
93 :
94 0 : m_pTypeLB->SetDoubleClickHdl (LINK(this, SwFldRefPage, InsertHdl));
95 0 : m_pTypeLB->SetSelectHdl (LINK(this, SwFldRefPage, TypeHdl));
96 0 : m_pSelectionLB->SetSelectHdl (LINK(this, SwFldRefPage, SubTypeHdl));
97 0 : m_pSelectionLB->SetDoubleClickHdl (LINK(this, SwFldRefPage, InsertHdl));
98 0 : m_pFormatLB->SetDoubleClickHdl (LINK(this, SwFldRefPage, InsertHdl));
99 :
100 : // #i83479#
101 0 : m_pSelectionToolTipLB->SetSelectHdl( LINK(this, SwFldRefPage, SubTypeHdl) );
102 0 : m_pSelectionToolTipLB->SetDoubleClickHdl( LINK(this, SwFldRefPage, InsertHdl) );
103 0 : m_pSelectionToolTipLB->SetStyle( m_pSelectionToolTipLB->GetStyle() | WB_HSCROLL );
104 0 : m_pSelectionToolTipLB->SetSpaceBetweenEntries(1);
105 0 : m_pSelectionToolTipLB->SetHighlightRange();
106 0 : }
107 :
108 0 : SwFldRefPage::~SwFldRefPage()
109 : {
110 0 : }
111 :
112 : // #i83479#
113 0 : void SwFldRefPage::SaveSelectedTxtNode()
114 : {
115 0 : mpSavedSelectedTxtNode = 0;
116 0 : mnSavedSelectedPos = 0;
117 0 : if ( m_pSelectionToolTipLB->IsVisible() )
118 : {
119 0 : SvTreeListEntry* pEntry = m_pSelectionToolTipLB->GetCurEntry();
120 0 : if ( pEntry )
121 : {
122 0 : const sal_uInt16 nTypeId = (sal_uInt16)(sal_uLong)m_pTypeLB->GetEntryData(GetTypeSel());
123 :
124 0 : if ( nTypeId == REFFLDFLAG_HEADING )
125 : {
126 0 : mnSavedSelectedPos = static_cast<size_t>(reinterpret_cast<sal_uLong>(pEntry->GetUserData()));
127 0 : if ( mnSavedSelectedPos < maOutlineNodes.size() )
128 : {
129 0 : mpSavedSelectedTxtNode = maOutlineNodes[mnSavedSelectedPos];
130 : }
131 : }
132 0 : else if ( nTypeId == REFFLDFLAG_NUMITEM )
133 : {
134 0 : mnSavedSelectedPos = static_cast<size_t>(reinterpret_cast<sal_uLong>(pEntry->GetUserData()));
135 0 : if ( mnSavedSelectedPos < maNumItems.size() )
136 : {
137 0 : mpSavedSelectedTxtNode = maNumItems[mnSavedSelectedPos]->GetTxtNode();
138 : }
139 : }
140 : }
141 : }
142 0 : }
143 :
144 0 : void SwFldRefPage::Reset(const SfxItemSet* )
145 : {
146 0 : if (!IsFldEdit())
147 : {
148 0 : SavePos(m_pTypeLB);
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 : m_pTypeLB->SetUpdateMode(false);
158 0 : m_pTypeLB->Clear();
159 :
160 : // fill Type-Listbox
161 :
162 : sal_Int32 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 = SwFldMgr::GetTypeId(i);
169 :
170 0 : if (!IsFldEdit() || nTypeId != TYP_SETREFFLD)
171 : {
172 0 : nPos = m_pTypeLB->InsertEntry(SwFldMgr::GetTypeStr(i), i - rRg.nStart);
173 0 : m_pTypeLB->SetEntryData(nPos, reinterpret_cast<void*>(nTypeId));
174 : }
175 : }
176 :
177 : // #i83479#
178 : // entries for headings and numbered items
179 0 : nPos = m_pTypeLB->InsertEntry(sHeadingTxt);
180 0 : m_pTypeLB->SetEntryData(nPos, (void*)REFFLDFLAG_HEADING);
181 0 : nPos = m_pTypeLB->InsertEntry(sNumItemTxt);
182 0 : m_pTypeLB->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 : const 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 = m_pTypeLB->InsertEntry(pType->GetName());
198 0 : m_pTypeLB->SetEntryData(nPos, (void*)(sal_uIntPtr)(REFFLDFLAG | n));
199 : }
200 : }
201 :
202 : // text marks - now always (because of globaldocuments)
203 0 : nPos = m_pTypeLB->InsertEntry(sBookmarkTxt);
204 0 : m_pTypeLB->SetEntryData(nPos, (void*)REFFLDFLAG_BOOKMARK);
205 :
206 : // footnotes:
207 0 : if( pSh->HasFtns() )
208 : {
209 0 : nPos = m_pTypeLB->InsertEntry(sFootnoteTxt);
210 0 : m_pTypeLB->SetEntryData(nPos, (void*)REFFLDFLAG_FOOTNOTE);
211 : }
212 :
213 : // endnotes:
214 0 : if ( pSh->HasFtns(true) )
215 : {
216 0 : nPos = m_pTypeLB->InsertEntry(sEndnoteTxt);
217 0 : m_pTypeLB->SetEntryData(nPos, (void*)REFFLDFLAG_ENDNOTE);
218 : }
219 :
220 : // select old Pos
221 0 : if (!IsFldEdit())
222 0 : RestorePos(m_pTypeLB);
223 :
224 0 : m_pTypeLB->SetUpdateMode(true);
225 :
226 0 : nFldDlgFmtSel = 0;
227 :
228 0 : if( !IsRefresh() )
229 : {
230 0 : OUString sUserData = GetUserData();
231 0 : if(!IsRefresh() && sUserData.getToken(0, ';').
232 0 : equalsIgnoreAsciiCase(USER_DATA_VERSION_1))
233 : {
234 0 : OUString sVal = sUserData.getToken(1, ';');
235 0 : const sal_uInt16 nVal = static_cast< sal_uInt16 >(sVal.toInt32());
236 0 : if(nVal != USHRT_MAX)
237 : {
238 0 : for(sal_Int32 i = 0; i < m_pTypeLB->GetEntryCount(); i++)
239 0 : if(nVal == (sal_uInt16)(sal_uLong)m_pTypeLB->GetEntryData(i))
240 : {
241 0 : m_pTypeLB->SelectEntryPos(i);
242 0 : break;
243 : }
244 0 : }
245 0 : }
246 : }
247 0 : TypeHdl(0);
248 :
249 0 : if (IsFldEdit())
250 : {
251 0 : m_pTypeLB->SaveValue();
252 0 : m_pSelectionLB->SaveValue();
253 0 : m_pFormatLB->SaveValue();
254 0 : m_pNameED->SaveValue();
255 0 : m_pValueED->SaveValue();
256 : }
257 0 : }
258 :
259 0 : IMPL_LINK_NOARG(SwFldRefPage, TypeHdl)
260 : {
261 : // save old ListBoxPos
262 0 : const sal_Int32 nOld = GetTypeSel();
263 :
264 : // current ListBoxPos
265 0 : SetTypeSel(m_pTypeLB->GetSelectEntryPos());
266 :
267 0 : if(GetTypeSel() == LISTBOX_ENTRY_NOTFOUND)
268 : {
269 0 : if (IsFldEdit())
270 : {
271 : // select positions
272 0 : OUString 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 (m_pTypeLB->GetEntryPos(sName) == LISTBOX_ENTRY_NOTFOUND) // reference to deleted mark
323 : {
324 0 : sal_Int32 nPos = m_pTypeLB->InsertEntry(sName);
325 0 : m_pTypeLB->SetEntryData(nPos, reinterpret_cast<void*>(nFlag));
326 : }
327 :
328 0 : m_pTypeLB->SelectEntry(sName);
329 0 : SetTypeSel(m_pTypeLB->GetSelectEntryPos());
330 : }
331 : else
332 : {
333 0 : SetTypeSel(0);
334 0 : m_pTypeLB->SelectEntryPos(0);
335 : }
336 : }
337 :
338 0 : if (nOld != GetTypeSel())
339 : {
340 0 : sal_uInt16 nTypeId = (sal_uInt16)(sal_uLong)m_pTypeLB->GetEntryData(GetTypeSel());
341 :
342 : // fill selection-ListBox
343 0 : UpdateSubType();
344 :
345 0 : bool bName = false;
346 0 : nFldDlgFmtSel = 0;
347 :
348 0 : if ( ( !IsFldEdit() || m_pSelectionLB->GetEntryCount() ) &&
349 : nOld != LISTBOX_ENTRY_NOTFOUND )
350 : {
351 0 : m_pNameED->SetText(aEmptyOUStr);
352 0 : m_pValueED->SetText(aEmptyOUStr);
353 : }
354 :
355 0 : switch (nTypeId)
356 : {
357 : case TYP_GETREFFLD:
358 0 : if (REFFLDFLAG & (sal_uInt16)(sal_uLong)m_pTypeLB->GetEntryData(nOld))
359 : // the old one stays
360 0 : nFldDlgFmtSel = m_pFormatLB->GetSelectEntryPos();
361 0 : bName = true;
362 0 : break;
363 :
364 : case TYP_SETREFFLD:
365 0 : bName = true;
366 0 : break;
367 :
368 : case REFFLDFLAG_BOOKMARK:
369 0 : bName = true;
370 : // no break!!!
371 : default:
372 0 : if( REFFLDFLAG & nTypeId )
373 : {
374 0 : const sal_uInt16 nOldId = (sal_uInt16)(sal_uLong)m_pTypeLB->GetEntryData(nOld);
375 0 : if( nOldId & REFFLDFLAG || nOldId == TYP_GETREFFLD )
376 : // then the old one stays
377 0 : nFldDlgFmtSel = m_pFormatLB->GetSelectEntryPos();
378 : }
379 0 : break;
380 : }
381 :
382 0 : m_pNameED->Enable(bName);
383 0 : m_pNameFT->Enable(bName);
384 :
385 : // fill Format-Listbox
386 0 : sal_Int32 nSize = FillFormatLB(nTypeId);
387 0 : bool bFormat = nSize != 0;
388 0 : m_pFormat->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)m_pTypeLB->GetEntryData(GetTypeSel());
400 :
401 0 : switch(nTypeId)
402 : {
403 : case TYP_GETREFFLD:
404 0 : if (!IsFldEdit() || m_pSelectionLB->GetSelectEntryCount())
405 : {
406 0 : m_pNameED->SetText(m_pSelectionLB->GetSelectEntry());
407 0 : ModifyHdl(m_pNameED);
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 : m_pValueED->SetText(pSh->GetSelTxt());
419 : }
420 :
421 : }
422 0 : break;
423 : // #i83479#
424 : case REFFLDFLAG_HEADING:
425 : case REFFLDFLAG_NUMITEM:
426 : {
427 0 : if ( m_pSelectionToolTipLB->GetCurEntry() )
428 : {
429 : m_pNameED->SetText( m_pSelectionToolTipLB->GetEntryText(
430 0 : m_pSelectionToolTipLB->GetCurEntry() ) );
431 : }
432 : }
433 0 : break;
434 :
435 : default:
436 0 : if (!IsFldEdit() || m_pSelectionLB->GetSelectEntryCount())
437 0 : m_pNameED->SetText(m_pSelectionLB->GetSelectEntry());
438 0 : break;
439 : }
440 :
441 0 : return 0;
442 : }
443 :
444 : // renew types in SelectionLB
445 0 : void SwFldRefPage::UpdateSubType()
446 : {
447 0 : SwWrtShell *pSh = GetWrtShell();
448 0 : if(!pSh)
449 0 : pSh = ::GetActiveWrtShell();
450 0 : SwGetRefField* pRefFld = (SwGetRefField*)GetCurField();
451 0 : const sal_uInt16 nTypeId = (sal_uInt16)(sal_uLong)m_pTypeLB->GetEntryData(GetTypeSel());
452 :
453 0 : OUString sOldSel;
454 : // #i83479#
455 0 : if ( m_pSelectionLB->IsVisible() )
456 : {
457 0 : const sal_Int32 nSelectionSel = m_pSelectionLB->GetSelectEntryPos();
458 0 : if (nSelectionSel != LISTBOX_ENTRY_NOTFOUND)
459 : {
460 0 : sOldSel = m_pSelectionLB->GetEntry(nSelectionSel);
461 : }
462 : }
463 0 : if (IsFldEdit() && sOldSel.isEmpty())
464 0 : sOldSel = OUString::number( pRefFld->GetSeqNo() + 1 );
465 :
466 0 : m_pSelectionLB->SetUpdateMode(false);
467 0 : m_pSelectionLB->Clear();
468 : // #i83479#
469 0 : m_pSelectionToolTipLB->SetUpdateMode(false);
470 0 : m_pSelectionToolTipLB->Clear();
471 0 : bool bShowSelectionToolTipLB( false );
472 :
473 0 : if( REFFLDFLAG & nTypeId )
474 : {
475 0 : if (nTypeId == REFFLDFLAG_BOOKMARK) // text marks!
476 : {
477 0 : m_pSelectionLB->SetStyle(m_pSelectionLB->GetStyle()|WB_SORT);
478 : // get all text marks
479 0 : IDocumentMarkAccess* const pMarkAccess = pSh->getIDocumentMarkAccess();
480 0 : for(IDocumentMarkAccess::const_iterator_t ppMark = pMarkAccess->getBookmarksBegin();
481 0 : ppMark != pMarkAccess->getBookmarksEnd();
482 : ++ppMark)
483 : {
484 0 : const ::sw::mark::IMark* pBkmk = ppMark->get();
485 0 : if(IDocumentMarkAccess::BOOKMARK == IDocumentMarkAccess::GetType(*pBkmk))
486 0 : m_pSelectionLB->InsertEntry( pBkmk->GetName() );
487 : }
488 0 : if (IsFldEdit())
489 0 : sOldSel = pRefFld->GetSetRefName();
490 : }
491 0 : else if (nTypeId == REFFLDFLAG_FOOTNOTE)
492 : {
493 0 : m_pSelectionLB->SetStyle(m_pSelectionLB->GetStyle() & ~WB_SORT);
494 0 : SwSeqFldList aArr;
495 0 : const size_t nCnt = pSh->GetSeqFtnList( aArr );
496 :
497 0 : for( size_t n = 0; n < nCnt; ++n )
498 : {
499 0 : m_pSelectionLB->InsertEntry( aArr[ n ]->sDlgEntry );
500 0 : if (IsFldEdit() && pRefFld->GetSeqNo() == aArr[ n ]->nSeqNo)
501 0 : sOldSel = aArr[n]->sDlgEntry;
502 0 : }
503 : }
504 0 : else if (nTypeId == REFFLDFLAG_ENDNOTE)
505 : {
506 0 : m_pSelectionLB->SetStyle(m_pSelectionLB->GetStyle() & ~WB_SORT);
507 0 : SwSeqFldList aArr;
508 0 : const size_t nCnt = pSh->GetSeqFtnList( aArr, true );
509 :
510 0 : for( size_t n = 0; n < nCnt; ++n )
511 : {
512 0 : m_pSelectionLB->InsertEntry( aArr[ n ]->sDlgEntry );
513 0 : if (IsFldEdit() && pRefFld->GetSeqNo() == aArr[ n ]->nSeqNo)
514 0 : sOldSel = aArr[n]->sDlgEntry;
515 0 : }
516 : }
517 : // #i83479#
518 0 : else if ( nTypeId == REFFLDFLAG_HEADING )
519 : {
520 0 : bShowSelectionToolTipLB = true;
521 :
522 0 : const IDocumentOutlineNodes* pIDoc( pSh->getIDocumentOutlineNodesAccess() );
523 0 : pIDoc->getOutlineNodes( maOutlineNodes );
524 0 : bool bCertainTxtNodeSelected( false );
525 0 : SvTreeListEntry* pEntry = 0;
526 0 : for ( size_t nOutlIdx = 0; nOutlIdx < maOutlineNodes.size(); ++nOutlIdx )
527 : {
528 : pEntry = m_pSelectionToolTipLB->InsertEntry(
529 0 : pIDoc->getOutlineText( nOutlIdx, true, true, false ) );
530 0 : pEntry->SetUserData( reinterpret_cast<void*>(nOutlIdx) );
531 0 : if ( ( IsFldEdit() &&
532 0 : pRefFld->GetReferencedTxtNode() == maOutlineNodes[nOutlIdx] ) ||
533 0 : mpSavedSelectedTxtNode == maOutlineNodes[nOutlIdx] )
534 : {
535 0 : m_pSelectionToolTipLB->Select( pEntry );
536 0 : sOldSel = "";
537 0 : bCertainTxtNodeSelected = true;
538 : }
539 0 : else if ( !bCertainTxtNodeSelected && mnSavedSelectedPos == nOutlIdx )
540 : {
541 0 : m_pSelectionToolTipLB->Select( pEntry );
542 0 : sOldSel = "";
543 : }
544 : }
545 : }
546 0 : else if ( nTypeId == REFFLDFLAG_NUMITEM )
547 : {
548 0 : bShowSelectionToolTipLB = true;
549 :
550 0 : const IDocumentListItems* pIDoc( pSh->getIDocumentListItemsAccess() );
551 0 : pIDoc->getNumItems( maNumItems );
552 0 : bool bCertainTxtNodeSelected( false );
553 0 : SvTreeListEntry* pEntry = 0;
554 0 : for ( size_t nNumItemIdx = 0; nNumItemIdx < maNumItems.size(); ++nNumItemIdx )
555 : {
556 : pEntry = m_pSelectionToolTipLB->InsertEntry(
557 0 : pIDoc->getListItemText( *maNumItems[nNumItemIdx], true, true ) );
558 0 : pEntry->SetUserData( reinterpret_cast<void*>(nNumItemIdx) );
559 0 : if ( ( IsFldEdit() &&
560 0 : pRefFld->GetReferencedTxtNode() == maNumItems[nNumItemIdx]->GetTxtNode() ) ||
561 0 : mpSavedSelectedTxtNode == maNumItems[nNumItemIdx]->GetTxtNode() )
562 : {
563 0 : m_pSelectionToolTipLB->Select( pEntry );
564 0 : sOldSel = "";
565 0 : bCertainTxtNodeSelected = true;
566 : }
567 0 : else if ( !bCertainTxtNodeSelected && mnSavedSelectedPos == nNumItemIdx )
568 : {
569 0 : m_pSelectionToolTipLB->Select( pEntry );
570 0 : sOldSel = "";
571 : }
572 : }
573 : }
574 : else
575 : {
576 0 : m_pSelectionLB->SetStyle(m_pSelectionLB->GetStyle()|WB_SORT);
577 : // get the fields to Seq-FieldType:
578 :
579 : SwSetExpFieldType* pType = (SwSetExpFieldType*)pSh->GetFldType(
580 0 : nTypeId & ~REFFLDFLAG, RES_SETEXPFLD );
581 0 : if( pType )
582 : {
583 0 : SwSeqFldList aArr;
584 : // old selection should be kept in non-edit mode
585 0 : if(IsFldEdit())
586 0 : sOldSel = "";
587 :
588 0 : const size_t nCnt = pType->GetSeqFldList( aArr );
589 0 : for( size_t n = 0; n < nCnt; ++n )
590 : {
591 0 : m_pSelectionLB->InsertEntry( aArr[ n ]->sDlgEntry );
592 0 : if (IsFldEdit() && sOldSel.isEmpty() &&
593 0 : aArr[ n ]->nSeqNo == pRefFld->GetSeqNo())
594 0 : sOldSel = aArr[ n ]->sDlgEntry;
595 : }
596 :
597 0 : if (IsFldEdit() && sOldSel.isEmpty())
598 0 : sOldSel = OUString::number( pRefFld->GetSeqNo() + 1);
599 : }
600 : }
601 : }
602 : else
603 : {
604 0 : std::vector<OUString> aLst;
605 0 : GetFldMgr().GetSubTypes(nTypeId, aLst);
606 0 : for(size_t i = 0; i < aLst.size(); ++i)
607 0 : m_pSelectionLB->InsertEntry(aLst[i]);
608 :
609 0 : if (IsFldEdit())
610 0 : sOldSel = pRefFld->GetSetRefName();
611 : }
612 :
613 : // #i83479#
614 0 : m_pSelectionToolTipLB->Show( bShowSelectionToolTipLB );
615 0 : m_pSelectionLB->Show( !bShowSelectionToolTipLB );
616 0 : if ( bShowSelectionToolTipLB )
617 : {
618 0 : m_pSelectionToolTipLB->SetUpdateMode(true);
619 :
620 0 : bool bEnable = m_pSelectionToolTipLB->GetEntryCount() != 0;
621 0 : m_pSelection->Enable( bEnable );
622 :
623 0 : if ( m_pSelectionToolTipLB->GetCurEntry() != 0 )
624 : {
625 0 : m_pSelectionToolTipLB->MakeVisible( m_pSelectionToolTipLB->GetCurEntry() );
626 : }
627 :
628 0 : if ( IsFldEdit() && m_pSelectionToolTipLB->GetCurEntry() == 0 )
629 : {
630 0 : m_pNameED->SetText(sOldSel);
631 : }
632 : }
633 : else
634 : {
635 0 : m_pSelectionLB->SetUpdateMode(true);
636 :
637 : // enable or disable
638 0 : bool bEnable = m_pSelectionLB->GetEntryCount() != 0;
639 0 : m_pSelection->Enable( bEnable );
640 :
641 0 : if ( bEnable )
642 : {
643 0 : m_pSelectionLB->SelectEntry(sOldSel);
644 0 : if (!m_pSelectionLB->GetSelectEntryCount() && !IsFldEdit())
645 0 : m_pSelectionLB->SelectEntryPos(0);
646 : }
647 :
648 0 : if (IsFldEdit() && !m_pSelectionLB->GetSelectEntryCount()) // in case the reference was already deleted...
649 0 : m_pNameED->SetText(sOldSel);
650 0 : }
651 0 : }
652 :
653 0 : sal_Int32 SwFldRefPage::FillFormatLB(sal_uInt16 nTypeId)
654 : {
655 0 : OUString sOldSel;
656 :
657 0 : sal_Int32 nFormatSel = m_pFormatLB->GetSelectEntryPos();
658 0 : if (nFormatSel != LISTBOX_ENTRY_NOTFOUND)
659 0 : sOldSel = m_pFormatLB->GetEntry(nFormatSel);
660 :
661 : // fill Format-Listbox
662 0 : m_pFormatLB->Clear();
663 :
664 : // refernce has less that the annotation
665 0 : sal_uInt16 nSize( 0 );
666 0 : bool bAddCrossRefFormats( false );
667 0 : switch (nTypeId)
668 : {
669 : // #i83479#
670 : case REFFLDFLAG_HEADING:
671 : case REFFLDFLAG_NUMITEM:
672 0 : bAddCrossRefFormats = true;
673 : // intentional no break here
674 :
675 : case TYP_GETREFFLD:
676 : case REFFLDFLAG_BOOKMARK:
677 : case REFFLDFLAG_FOOTNOTE:
678 : case REFFLDFLAG_ENDNOTE:
679 0 : nSize = FMT_REF_PAGE_PGDSC - FMT_REF_BEGIN + 1;
680 0 : break;
681 :
682 : default:
683 : // #i83479#
684 :
685 0 : if ( REFFLDFLAG & nTypeId )
686 : {
687 0 : nSize = FMT_REF_ONLYSEQNO - FMT_REF_BEGIN + 1;
688 : }
689 : else
690 : {
691 0 : nSize = GetFldMgr().GetFormatCount( nTypeId, false, IsFldDlgHtmlMode() );
692 : }
693 0 : break;
694 : }
695 :
696 0 : if (REFFLDFLAG & nTypeId)
697 0 : nTypeId = TYP_GETREFFLD;
698 :
699 0 : for (sal_uInt16 i = 0; i < nSize; i++)
700 : {
701 0 : sal_Int32 nPos = m_pFormatLB->InsertEntry(GetFldMgr().GetFormatStr( nTypeId, i ));
702 0 : m_pFormatLB->SetEntryData( nPos, reinterpret_cast<void*>(GetFldMgr().GetFormatId( nTypeId, i )));
703 : }
704 : // #i83479#
705 0 : if ( bAddCrossRefFormats )
706 : {
707 0 : sal_uInt16 nFormat = FMT_REF_NUMBER - FMT_REF_BEGIN;
708 0 : sal_Int32 nPos = m_pFormatLB->InsertEntry(GetFldMgr().GetFormatStr( nTypeId, nFormat ));
709 0 : m_pFormatLB->SetEntryData( nPos, reinterpret_cast<void*>(GetFldMgr().GetFormatId( nTypeId, nFormat )));
710 0 : nFormat = FMT_REF_NUMBER_NO_CONTEXT - FMT_REF_BEGIN;
711 0 : nPos = m_pFormatLB->InsertEntry(GetFldMgr().GetFormatStr( nTypeId, nFormat ));
712 0 : m_pFormatLB->SetEntryData( nPos, reinterpret_cast<void*>(GetFldMgr().GetFormatId( nTypeId, nFormat )));
713 0 : nFormat = FMT_REF_NUMBER_FULL_CONTEXT - FMT_REF_BEGIN;
714 0 : nPos = m_pFormatLB->InsertEntry(GetFldMgr().GetFormatStr( nTypeId, nFormat ));
715 0 : m_pFormatLB->SetEntryData( nPos, reinterpret_cast<void*>(GetFldMgr().GetFormatId( nTypeId, nFormat )));
716 0 : nSize += 3;
717 : }
718 :
719 : // select a certain entry
720 0 : if (nSize)
721 : {
722 0 : if (!IsFldEdit())
723 0 : m_pFormatLB->SelectEntry(sOldSel);
724 : else
725 0 : m_pFormatLB->SelectEntry(SW_RESSTR(FMT_REF_BEGIN + GetCurField()->GetFormat()));
726 :
727 0 : if (!m_pFormatLB->GetSelectEntryCount())
728 : {
729 0 : m_pFormatLB->SelectEntryPos(nFldDlgFmtSel);
730 0 : if (!m_pFormatLB->GetSelectEntryCount())
731 0 : m_pFormatLB->SelectEntryPos(0);
732 : }
733 : }
734 :
735 0 : return nSize;
736 : }
737 :
738 : // Modify
739 0 : IMPL_LINK_NOARG(SwFldRefPage, ModifyHdl)
740 : {
741 0 : OUString aName(m_pNameED->GetText());
742 0 : const bool bEmptyName = aName.isEmpty();
743 :
744 0 : bool bEnable = true;
745 0 : sal_uInt16 nTypeId = (sal_uInt16)(sal_uLong)m_pTypeLB->GetEntryData(GetTypeSel());
746 :
747 0 : if ((nTypeId == TYP_SETREFFLD && !GetFldMgr().CanInsertRefMark(aName)) ||
748 0 : (bEmptyName && (nTypeId == TYP_GETREFFLD || nTypeId == TYP_SETREFFLD ||
749 : nTypeId == REFFLDFLAG_BOOKMARK)))
750 0 : bEnable = false;
751 :
752 0 : EnableInsert(bEnable);
753 :
754 0 : m_pSelectionLB->SelectEntry(aName);
755 :
756 0 : return 0;
757 : }
758 :
759 0 : bool SwFldRefPage::FillItemSet(SfxItemSet* )
760 : {
761 0 : bool bModified = false;
762 0 : sal_uInt16 nTypeId = (sal_uInt16)(sal_uLong)m_pTypeLB->GetEntryData(GetTypeSel());
763 :
764 0 : sal_uInt16 nSubType = 0;
765 0 : const sal_Int32 nEntryPos = m_pFormatLB->GetSelectEntryPos();
766 : const sal_uLong nFormat = (nEntryPos == LISTBOX_ENTRY_NOTFOUND)
767 0 : ? 0 : (sal_uLong)m_pFormatLB->GetEntryData(nEntryPos);
768 :
769 0 : OUString aVal(m_pValueED->GetText());
770 0 : OUString aName(m_pNameED->GetText());
771 :
772 0 : switch(nTypeId)
773 : {
774 : case TYP_GETREFFLD:
775 0 : nSubType = REF_SETREFATTR;
776 0 : break;
777 :
778 : case TYP_SETREFFLD:
779 : {
780 0 : SwFieldType* pType = GetFldMgr().GetFldType(RES_SETEXPFLD, aName);
781 :
782 0 : if(!pType) // Only insert when the name doesn't exist yet
783 : {
784 0 : m_pSelectionLB->InsertEntry(aName);
785 0 : m_pSelection->Enable();
786 : }
787 0 : break;
788 : }
789 : }
790 :
791 0 : SwGetRefField* pRefFld = (SwGetRefField*)GetCurField();
792 :
793 0 : if (REFFLDFLAG & nTypeId)
794 : {
795 0 : SwWrtShell *pSh = GetWrtShell();
796 0 : if(!pSh)
797 : {
798 0 : pSh = ::GetActiveWrtShell();
799 : }
800 0 : if (nTypeId == REFFLDFLAG_BOOKMARK) // text marks!
801 : {
802 0 : aName = m_pNameED->GetText();
803 0 : nTypeId = TYP_GETREFFLD;
804 0 : nSubType = REF_BOOKMARK;
805 : }
806 0 : else if (REFFLDFLAG_FOOTNOTE == nTypeId) // footnotes
807 : {
808 0 : SwSeqFldList aArr;
809 0 : _SeqFldLstElem aElem( m_pSelectionLB->GetSelectEntry(), 0 );
810 :
811 0 : size_t nPos = 0;
812 :
813 0 : nTypeId = TYP_GETREFFLD;
814 0 : nSubType = REF_FOOTNOTE;
815 0 : aName = "";
816 :
817 0 : if (pSh->GetSeqFtnList(aArr) && aArr.SeekEntry(aElem, &nPos))
818 : {
819 0 : aVal = OUString::number( aArr[nPos]->nSeqNo );
820 :
821 0 : if (IsFldEdit() && aArr[nPos]->nSeqNo == pRefFld->GetSeqNo())
822 0 : bModified = true; // can happen with fields of which the references were deleted
823 : }
824 0 : else if (IsFldEdit())
825 0 : aVal = OUString::number( pRefFld->GetSeqNo() );
826 : }
827 0 : else if (REFFLDFLAG_ENDNOTE == nTypeId) // endnotes
828 : {
829 0 : SwSeqFldList aArr;
830 0 : _SeqFldLstElem aElem( m_pSelectionLB->GetSelectEntry(), 0 );
831 :
832 0 : size_t nPos = 0;
833 :
834 0 : nTypeId = TYP_GETREFFLD;
835 0 : nSubType = REF_ENDNOTE;
836 0 : aName = "";
837 :
838 0 : if (pSh->GetSeqFtnList(aArr, true) && aArr.SeekEntry(aElem, &nPos))
839 : {
840 0 : aVal = OUString::number( aArr[nPos]->nSeqNo );
841 :
842 0 : if (IsFldEdit() && aArr[nPos]->nSeqNo == pRefFld->GetSeqNo())
843 0 : bModified = true; // can happen with fields of which the reference was deleted
844 : }
845 0 : else if (IsFldEdit())
846 0 : aVal = OUString::number( pRefFld->GetSeqNo() );
847 : }
848 : // #i83479#
849 0 : else if ( nTypeId == REFFLDFLAG_HEADING )
850 : {
851 0 : SvTreeListEntry* pEntry = m_pSelectionToolTipLB->GetCurEntry();
852 : OSL_ENSURE( pEntry,
853 : "<SwFldRefPage::FillItemSet(..)> - no entry selected in selection tool tip listbox!" );
854 0 : if ( pEntry )
855 : {
856 : const size_t nOutlIdx( static_cast<size_t>
857 0 : (reinterpret_cast<sal_uLong>(pEntry->GetUserData())) );
858 0 : pSh->getIDocumentOutlineNodesAccess()->getOutlineNodes( maOutlineNodes );
859 0 : if ( nOutlIdx < maOutlineNodes.size() )
860 : {
861 0 : ::sw::mark::IMark const * const pMark = pSh->getIDocumentMarkAccess()->getMarkForTxtNode(
862 0 : *(maOutlineNodes[nOutlIdx]),
863 0 : IDocumentMarkAccess::CROSSREF_HEADING_BOOKMARK);
864 0 : aName = pMark->GetName();
865 0 : nTypeId = TYP_GETREFFLD;
866 0 : nSubType = REF_BOOKMARK;
867 : }
868 : }
869 : }
870 0 : else if ( nTypeId == REFFLDFLAG_NUMITEM )
871 : {
872 0 : SvTreeListEntry* pEntry = m_pSelectionToolTipLB->GetCurEntry();
873 : OSL_ENSURE( pEntry,
874 : "<SwFldRefPage::FillItemSet(..)> - no entry selected in selection tool tip listbox!" );
875 0 : if ( pEntry )
876 : {
877 : const size_t nNumItemIdx( static_cast<size_t>
878 0 : (reinterpret_cast<sal_uLong>(pEntry->GetUserData())) );
879 0 : pSh->getIDocumentListItemsAccess()->getNumItems( maNumItems );
880 0 : if ( nNumItemIdx < maNumItems.size() )
881 : {
882 0 : ::sw::mark::IMark const * const pMark = pSh->getIDocumentMarkAccess()->getMarkForTxtNode(
883 0 : *(maNumItems[nNumItemIdx]->GetTxtNode()),
884 0 : IDocumentMarkAccess::CROSSREF_NUMITEM_BOOKMARK);
885 0 : aName = pMark->GetName();
886 0 : nTypeId = TYP_GETREFFLD;
887 0 : nSubType = REF_BOOKMARK;
888 : }
889 : }
890 : }
891 : else // SeqenceFields
892 : {
893 : // get fields for Seq-FeldType:
894 : SwSetExpFieldType* pType = (SwSetExpFieldType*)pSh->GetFldType(
895 0 : nTypeId & ~REFFLDFLAG, RES_SETEXPFLD );
896 0 : if( pType )
897 : {
898 0 : SwSeqFldList aArr;
899 0 : _SeqFldLstElem aElem( m_pSelectionLB->GetSelectEntry(), 0 );
900 :
901 0 : size_t nPos = 0;
902 :
903 0 : nTypeId = TYP_GETREFFLD;
904 0 : nSubType = REF_SEQUENCEFLD;
905 0 : aName = pType->GetName();
906 :
907 0 : if (pType->GetSeqFldList(aArr) && aArr.SeekEntry(aElem, &nPos))
908 : {
909 0 : aVal = OUString::number( aArr[nPos]->nSeqNo );
910 :
911 0 : if (IsFldEdit() && aArr[nPos]->nSeqNo == pRefFld->GetSeqNo())
912 0 : bModified = true; // can happen with fields of which the reference was deleted
913 : }
914 0 : else if (IsFldEdit())
915 0 : aVal = OUString::number( pRefFld->GetSeqNo() );
916 : }
917 : }
918 : }
919 :
920 0 : if (IsFldEdit() && nTypeId == TYP_GETREFFLD)
921 : {
922 0 : aVal = OUString::number(nSubType) + "|" + aVal;
923 : }
924 :
925 0 : if (!IsFldEdit() || bModified ||
926 0 : m_pNameED->IsValueChangedFromSaved() ||
927 0 : m_pValueED->IsValueChangedFromSaved() ||
928 0 : m_pTypeLB->IsValueChangedFromSaved() ||
929 0 : m_pSelectionLB->IsValueChangedFromSaved() ||
930 0 : m_pFormatLB->IsValueChangedFromSaved())
931 : {
932 0 : InsertFld( nTypeId, nSubType, aName, aVal, nFormat );
933 : }
934 :
935 0 : ModifyHdl(); // enable/disable insert if applicable
936 :
937 0 : return false;
938 : }
939 :
940 0 : SfxTabPage* SwFldRefPage::Create( vcl::Window* pParent,
941 : const SfxItemSet* rAttrSet )
942 : {
943 0 : return ( new SwFldRefPage( pParent, *rAttrSet ) );
944 : }
945 :
946 0 : sal_uInt16 SwFldRefPage::GetGroup()
947 : {
948 0 : return GRP_REF;
949 : }
950 :
951 0 : void SwFldRefPage::FillUserData()
952 : {
953 0 : const sal_Int32 nEntryPos = m_pTypeLB->GetSelectEntryPos();
954 : const sal_uInt16 nTypeSel = ( LISTBOX_ENTRY_NOTFOUND == nEntryPos )
955 : ? USHRT_MAX
956 : : sal::static_int_cast< sal_uInt16 >
957 0 : (reinterpret_cast< sal_uIntPtr >(m_pTypeLB->GetEntryData( nEntryPos )));
958 0 : SetUserData( USER_DATA_VERSION ";" + OUString::number( nTypeSel ));
959 0 : }
960 :
961 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|