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 nFieldDlgFormatSel = 0;
46 :
47 : #define USER_DATA_VERSION_1 "1"
48 : #define USER_DATA_VERSION USER_DATA_VERSION_1
49 :
50 0 : SwFieldRefPage::SwFieldRefPage(vcl::Window* pParent, const SfxItemSet& rCoreSet )
51 : : SwFieldPage(pParent, "FieldRefPage",
52 : "modules/swriter/ui/fldrefpage.ui", rCoreSet)
53 : , maOutlineNodes()
54 : , maNumItems()
55 : , mpSavedSelectedTextNode(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 : sBookmarkText = m_pTypeLB->GetEntry(0);
71 0 : sFootnoteText = m_pTypeLB->GetEntry(1);
72 0 : sEndnoteText = m_pTypeLB->GetEntry(2);
73 : // #i83479#
74 0 : sHeadingText = m_pTypeLB->GetEntry(3);
75 0 : sNumItemText = 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, SwFieldRefPage, ModifyHdl));
93 :
94 0 : m_pTypeLB->SetDoubleClickHdl (LINK(this, SwFieldRefPage, InsertHdl));
95 0 : m_pTypeLB->SetSelectHdl (LINK(this, SwFieldRefPage, TypeHdl));
96 0 : m_pSelectionLB->SetSelectHdl (LINK(this, SwFieldRefPage, SubTypeHdl));
97 0 : m_pSelectionLB->SetDoubleClickHdl (LINK(this, SwFieldRefPage, InsertHdl));
98 0 : m_pFormatLB->SetDoubleClickHdl (LINK(this, SwFieldRefPage, InsertHdl));
99 :
100 : // #i83479#
101 0 : m_pSelectionToolTipLB->SetSelectHdl( LINK(this, SwFieldRefPage, SubTypeHdl) );
102 0 : m_pSelectionToolTipLB->SetDoubleClickHdl( LINK(this, SwFieldRefPage, 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 : SwFieldRefPage::~SwFieldRefPage()
109 : {
110 0 : disposeOnce();
111 0 : }
112 :
113 0 : void SwFieldRefPage::dispose()
114 : {
115 0 : m_pTypeLB.clear();
116 0 : m_pSelection.clear();
117 0 : m_pSelectionLB.clear();
118 0 : m_pSelectionToolTipLB.clear();
119 0 : m_pFormat.clear();
120 0 : m_pFormatLB.clear();
121 0 : m_pNameFT.clear();
122 0 : m_pNameED.clear();
123 0 : m_pValueED.clear();
124 0 : SwFieldPage::dispose();
125 0 : }
126 :
127 : // #i83479#
128 0 : void SwFieldRefPage::SaveSelectedTextNode()
129 : {
130 0 : mpSavedSelectedTextNode = 0;
131 0 : mnSavedSelectedPos = 0;
132 0 : if ( m_pSelectionToolTipLB->IsVisible() )
133 : {
134 0 : SvTreeListEntry* pEntry = m_pSelectionToolTipLB->GetCurEntry();
135 0 : if ( pEntry )
136 : {
137 0 : const sal_uInt16 nTypeId = (sal_uInt16)reinterpret_cast<sal_uLong>(m_pTypeLB->GetEntryData(GetTypeSel()));
138 :
139 0 : if ( nTypeId == REFFLDFLAG_HEADING )
140 : {
141 0 : mnSavedSelectedPos = static_cast<size_t>(reinterpret_cast<sal_uLong>(pEntry->GetUserData()));
142 0 : if ( mnSavedSelectedPos < maOutlineNodes.size() )
143 : {
144 0 : mpSavedSelectedTextNode = maOutlineNodes[mnSavedSelectedPos];
145 : }
146 : }
147 0 : else if ( nTypeId == REFFLDFLAG_NUMITEM )
148 : {
149 0 : mnSavedSelectedPos = static_cast<size_t>(reinterpret_cast<sal_uLong>(pEntry->GetUserData()));
150 0 : if ( mnSavedSelectedPos < maNumItems.size() )
151 : {
152 0 : mpSavedSelectedTextNode = maNumItems[mnSavedSelectedPos]->GetTextNode();
153 : }
154 : }
155 : }
156 : }
157 0 : }
158 :
159 0 : void SwFieldRefPage::Reset(const SfxItemSet* )
160 : {
161 0 : if (!IsFieldEdit())
162 : {
163 0 : SavePos(m_pTypeLB);
164 : // #i83479#
165 0 : SaveSelectedTextNode();
166 : }
167 0 : SetSelectionSel(LISTBOX_ENTRY_NOTFOUND);
168 0 : SetTypeSel(LISTBOX_ENTRY_NOTFOUND);
169 0 : Init(); // general initialisation
170 :
171 : // initialise TypeListBox
172 0 : m_pTypeLB->SetUpdateMode(false);
173 0 : m_pTypeLB->Clear();
174 :
175 : // fill Type-Listbox
176 :
177 : sal_Int32 nPos;
178 : // set/insert reference
179 0 : const SwFieldGroupRgn& rRg = SwFieldMgr::GetGroupRange(IsFieldDlgHtmlMode(), GetGroup());
180 :
181 0 : for (short i = rRg.nStart; i < rRg.nEnd; ++i)
182 : {
183 0 : const sal_uInt16 nTypeId = SwFieldMgr::GetTypeId(i);
184 :
185 0 : if (!IsFieldEdit() || nTypeId != TYP_SETREFFLD)
186 : {
187 0 : nPos = m_pTypeLB->InsertEntry(SwFieldMgr::GetTypeStr(i), i - rRg.nStart);
188 0 : m_pTypeLB->SetEntryData(nPos, reinterpret_cast<void*>(nTypeId));
189 : }
190 : }
191 :
192 : // #i83479#
193 : // entries for headings and numbered items
194 0 : nPos = m_pTypeLB->InsertEntry(sHeadingText);
195 0 : m_pTypeLB->SetEntryData(nPos, reinterpret_cast<void*>(REFFLDFLAG_HEADING));
196 0 : nPos = m_pTypeLB->InsertEntry(sNumItemText);
197 0 : m_pTypeLB->SetEntryData(nPos, reinterpret_cast<void*>(REFFLDFLAG_NUMITEM));
198 :
199 : // fill up with the sequence types
200 0 : SwWrtShell *pSh = GetWrtShell();
201 0 : if (!pSh)
202 0 : pSh = ::GetActiveWrtShell();
203 :
204 0 : if (!pSh)
205 0 : return;
206 :
207 0 : const size_t nFieldTypeCnt = pSh->GetFieldTypeCount(RES_SETEXPFLD);
208 :
209 : OSL_ENSURE( nFieldTypeCnt < static_cast<size_t>(REFFLDFLAG), "<SwFieldRefPage::Reset> - Item index will overlap flags!" );
210 :
211 0 : for (size_t n = 0; n < nFieldTypeCnt; ++n)
212 : {
213 0 : SwSetExpFieldType* pType = static_cast<SwSetExpFieldType*>(pSh->GetFieldType(n, RES_SETEXPFLD));
214 :
215 0 : if ((nsSwGetSetExpType::GSE_SEQ & pType->GetType()) && pType->HasWriterListeners() && pSh->IsUsed(*pType))
216 : {
217 0 : nPos = m_pTypeLB->InsertEntry(pType->GetName());
218 0 : m_pTypeLB->SetEntryData(nPos, reinterpret_cast<void*>((sal_uIntPtr)(REFFLDFLAG | n)));
219 : }
220 : }
221 :
222 : // text marks - now always (because of globaldocuments)
223 0 : nPos = m_pTypeLB->InsertEntry(sBookmarkText);
224 0 : m_pTypeLB->SetEntryData(nPos, reinterpret_cast<void*>(REFFLDFLAG_BOOKMARK));
225 :
226 : // footnotes:
227 0 : if( pSh->HasFootnotes() )
228 : {
229 0 : nPos = m_pTypeLB->InsertEntry(sFootnoteText);
230 0 : m_pTypeLB->SetEntryData(nPos, reinterpret_cast<void*>(REFFLDFLAG_FOOTNOTE));
231 : }
232 :
233 : // endnotes:
234 0 : if ( pSh->HasFootnotes(true) )
235 : {
236 0 : nPos = m_pTypeLB->InsertEntry(sEndnoteText);
237 0 : m_pTypeLB->SetEntryData(nPos, reinterpret_cast<void*>(REFFLDFLAG_ENDNOTE));
238 : }
239 :
240 : // select old Pos
241 0 : if (!IsFieldEdit())
242 0 : RestorePos(m_pTypeLB);
243 :
244 0 : m_pTypeLB->SetUpdateMode(true);
245 :
246 0 : nFieldDlgFormatSel = 0;
247 :
248 0 : if( !IsRefresh() )
249 : {
250 0 : OUString sUserData = GetUserData();
251 0 : if(!IsRefresh() && sUserData.getToken(0, ';').
252 0 : equalsIgnoreAsciiCase(USER_DATA_VERSION_1))
253 : {
254 0 : OUString sVal = sUserData.getToken(1, ';');
255 0 : const sal_uInt16 nVal = static_cast< sal_uInt16 >(sVal.toInt32());
256 0 : if(nVal != USHRT_MAX)
257 : {
258 0 : for(sal_Int32 i = 0; i < m_pTypeLB->GetEntryCount(); i++)
259 0 : if(nVal == (sal_uInt16)reinterpret_cast<sal_uLong>(m_pTypeLB->GetEntryData(i)))
260 : {
261 0 : m_pTypeLB->SelectEntryPos(i);
262 0 : break;
263 : }
264 0 : }
265 0 : }
266 : }
267 0 : TypeHdl(0);
268 :
269 0 : if (IsFieldEdit())
270 : {
271 0 : m_pTypeLB->SaveValue();
272 0 : m_pSelectionLB->SaveValue();
273 0 : m_pFormatLB->SaveValue();
274 0 : m_pNameED->SaveValue();
275 0 : m_pValueED->SaveValue();
276 : }
277 : }
278 :
279 0 : IMPL_LINK_NOARG(SwFieldRefPage, TypeHdl)
280 : {
281 : // save old ListBoxPos
282 0 : const sal_Int32 nOld = GetTypeSel();
283 :
284 : // current ListBoxPos
285 0 : SetTypeSel(m_pTypeLB->GetSelectEntryPos());
286 :
287 0 : if(GetTypeSel() == LISTBOX_ENTRY_NOTFOUND)
288 : {
289 0 : if (IsFieldEdit())
290 : {
291 : // select positions
292 0 : OUString sName;
293 0 : sal_uInt16 nFlag = 0;
294 :
295 0 : switch( GetCurField()->GetSubType() )
296 : {
297 : case REF_BOOKMARK:
298 : {
299 : // #i83479#
300 0 : SwGetRefField* pRefField = dynamic_cast<SwGetRefField*>(GetCurField());
301 0 : if ( pRefField &&
302 0 : pRefField->IsRefToHeadingCrossRefBookmark() )
303 : {
304 0 : sName = sHeadingText;
305 0 : nFlag = REFFLDFLAG_HEADING;
306 : }
307 0 : else if ( pRefField &&
308 0 : pRefField->IsRefToNumItemCrossRefBookmark() )
309 : {
310 0 : sName = sNumItemText;
311 0 : nFlag = REFFLDFLAG_NUMITEM;
312 : }
313 : else
314 : {
315 0 : sName = sBookmarkText;
316 0 : nFlag = REFFLDFLAG_BOOKMARK;
317 : }
318 : }
319 0 : break;
320 :
321 : case REF_FOOTNOTE:
322 0 : sName = sFootnoteText;
323 0 : nFlag = REFFLDFLAG_FOOTNOTE;
324 0 : break;
325 :
326 : case REF_ENDNOTE:
327 0 : sName = sEndnoteText;
328 0 : nFlag = REFFLDFLAG_ENDNOTE;
329 0 : break;
330 :
331 : case REF_SETREFATTR:
332 0 : sName = SW_RESSTR(STR_GETREFFLD);
333 0 : nFlag = REF_SETREFATTR;
334 0 : break;
335 :
336 : case REF_SEQUENCEFLD:
337 0 : sName = static_cast<SwGetRefField*>(GetCurField())->GetSetRefName();
338 0 : nFlag = REFFLDFLAG;
339 0 : break;
340 : }
341 :
342 0 : if (m_pTypeLB->GetEntryPos(sName) == LISTBOX_ENTRY_NOTFOUND) // reference to deleted mark
343 : {
344 0 : sal_Int32 nPos = m_pTypeLB->InsertEntry(sName);
345 0 : m_pTypeLB->SetEntryData(nPos, reinterpret_cast<void*>(nFlag));
346 : }
347 :
348 0 : m_pTypeLB->SelectEntry(sName);
349 0 : SetTypeSel(m_pTypeLB->GetSelectEntryPos());
350 : }
351 : else
352 : {
353 0 : SetTypeSel(0);
354 0 : m_pTypeLB->SelectEntryPos(0);
355 : }
356 : }
357 :
358 0 : if (nOld != GetTypeSel())
359 : {
360 0 : sal_uInt16 nTypeId = (sal_uInt16)reinterpret_cast<sal_uLong>(m_pTypeLB->GetEntryData(GetTypeSel()));
361 :
362 : // fill selection-ListBox
363 0 : UpdateSubType();
364 :
365 0 : bool bName = false;
366 0 : nFieldDlgFormatSel = 0;
367 :
368 0 : if ( ( !IsFieldEdit() || m_pSelectionLB->GetEntryCount() ) &&
369 : nOld != LISTBOX_ENTRY_NOTFOUND )
370 : {
371 0 : m_pNameED->SetText(aEmptyOUStr);
372 0 : m_pValueED->SetText(aEmptyOUStr);
373 : }
374 :
375 0 : switch (nTypeId)
376 : {
377 : case TYP_GETREFFLD:
378 0 : if (REFFLDFLAG & (sal_uInt16)reinterpret_cast<sal_uLong>(m_pTypeLB->GetEntryData(nOld)))
379 : // the old one stays
380 0 : nFieldDlgFormatSel = m_pFormatLB->GetSelectEntryPos();
381 0 : bName = true;
382 0 : break;
383 :
384 : case TYP_SETREFFLD:
385 0 : bName = true;
386 0 : break;
387 :
388 : case REFFLDFLAG_BOOKMARK:
389 0 : bName = true;
390 : // no break!!!
391 : default:
392 0 : if( REFFLDFLAG & nTypeId )
393 : {
394 0 : const sal_uInt16 nOldId = (sal_uInt16)reinterpret_cast<sal_uLong>(m_pTypeLB->GetEntryData(nOld));
395 0 : if( nOldId & REFFLDFLAG || nOldId == TYP_GETREFFLD )
396 : // then the old one stays
397 0 : nFieldDlgFormatSel = m_pFormatLB->GetSelectEntryPos();
398 : }
399 0 : break;
400 : }
401 :
402 0 : m_pNameED->Enable(bName);
403 0 : m_pNameFT->Enable(bName);
404 :
405 : // fill Format-Listbox
406 0 : sal_Int32 nSize = FillFormatLB(nTypeId);
407 0 : bool bFormat = nSize != 0;
408 0 : m_pFormat->Enable(bFormat);
409 :
410 0 : SubTypeHdl();
411 0 : ModifyHdl();
412 : }
413 :
414 0 : return 0;
415 : }
416 :
417 0 : IMPL_LINK_NOARG(SwFieldRefPage, SubTypeHdl)
418 : {
419 0 : sal_uInt16 nTypeId = (sal_uInt16)reinterpret_cast<sal_uLong>(m_pTypeLB->GetEntryData(GetTypeSel()));
420 :
421 0 : switch(nTypeId)
422 : {
423 : case TYP_GETREFFLD:
424 0 : if (!IsFieldEdit() || m_pSelectionLB->GetSelectEntryCount())
425 : {
426 0 : m_pNameED->SetText(m_pSelectionLB->GetSelectEntry());
427 0 : ModifyHdl(m_pNameED);
428 : }
429 0 : break;
430 :
431 : case TYP_SETREFFLD:
432 : {
433 0 : SwWrtShell *pSh = GetWrtShell();
434 0 : if(!pSh)
435 0 : pSh = ::GetActiveWrtShell();
436 0 : if(pSh)
437 : {
438 0 : m_pValueED->SetText(pSh->GetSelText());
439 : }
440 :
441 : }
442 0 : break;
443 : // #i83479#
444 : case REFFLDFLAG_HEADING:
445 : case REFFLDFLAG_NUMITEM:
446 : {
447 0 : if ( m_pSelectionToolTipLB->GetCurEntry() )
448 : {
449 0 : m_pNameED->SetText( m_pSelectionToolTipLB->GetEntryText(
450 0 : m_pSelectionToolTipLB->GetCurEntry() ) );
451 : }
452 : }
453 0 : break;
454 :
455 : default:
456 0 : if (!IsFieldEdit() || m_pSelectionLB->GetSelectEntryCount())
457 0 : m_pNameED->SetText(m_pSelectionLB->GetSelectEntry());
458 0 : break;
459 : }
460 :
461 0 : return 0;
462 : }
463 :
464 : // renew types in SelectionLB
465 0 : void SwFieldRefPage::UpdateSubType()
466 : {
467 0 : SwWrtShell *pSh = GetWrtShell();
468 0 : if(!pSh)
469 0 : pSh = ::GetActiveWrtShell();
470 0 : SwGetRefField* pRefField = static_cast<SwGetRefField*>(GetCurField());
471 0 : const sal_uInt16 nTypeId = (sal_uInt16)reinterpret_cast<sal_uLong>(m_pTypeLB->GetEntryData(GetTypeSel()));
472 :
473 0 : OUString sOldSel;
474 : // #i83479#
475 0 : if ( m_pSelectionLB->IsVisible() )
476 : {
477 0 : const sal_Int32 nSelectionSel = m_pSelectionLB->GetSelectEntryPos();
478 0 : if (nSelectionSel != LISTBOX_ENTRY_NOTFOUND)
479 : {
480 0 : sOldSel = m_pSelectionLB->GetEntry(nSelectionSel);
481 : }
482 : }
483 0 : if (IsFieldEdit() && sOldSel.isEmpty())
484 0 : sOldSel = OUString::number( pRefField->GetSeqNo() + 1 );
485 :
486 0 : m_pSelectionLB->SetUpdateMode(false);
487 0 : m_pSelectionLB->Clear();
488 : // #i83479#
489 0 : m_pSelectionToolTipLB->SetUpdateMode(false);
490 0 : m_pSelectionToolTipLB->Clear();
491 0 : bool bShowSelectionToolTipLB( false );
492 :
493 0 : if( REFFLDFLAG & nTypeId )
494 : {
495 0 : if (nTypeId == REFFLDFLAG_BOOKMARK) // text marks!
496 : {
497 0 : m_pSelectionLB->SetStyle(m_pSelectionLB->GetStyle()|WB_SORT);
498 : // get all text marks
499 0 : IDocumentMarkAccess* const pMarkAccess = pSh->getIDocumentMarkAccess();
500 0 : for(IDocumentMarkAccess::const_iterator_t ppMark = pMarkAccess->getBookmarksBegin();
501 0 : ppMark != pMarkAccess->getBookmarksEnd();
502 : ++ppMark)
503 : {
504 0 : const ::sw::mark::IMark* pBkmk = ppMark->get();
505 0 : if(IDocumentMarkAccess::MarkType::BOOKMARK == IDocumentMarkAccess::GetType(*pBkmk))
506 0 : m_pSelectionLB->InsertEntry( pBkmk->GetName() );
507 : }
508 0 : if (IsFieldEdit())
509 0 : sOldSel = pRefField->GetSetRefName();
510 : }
511 0 : else if (nTypeId == REFFLDFLAG_FOOTNOTE)
512 : {
513 0 : m_pSelectionLB->SetStyle(m_pSelectionLB->GetStyle() & ~WB_SORT);
514 0 : SwSeqFieldList aArr;
515 0 : const size_t nCnt = pSh->GetSeqFootnoteList( aArr );
516 :
517 0 : for( size_t n = 0; n < nCnt; ++n )
518 : {
519 0 : m_pSelectionLB->InsertEntry( aArr[ n ]->sDlgEntry );
520 0 : if (IsFieldEdit() && pRefField->GetSeqNo() == aArr[ n ]->nSeqNo)
521 0 : sOldSel = aArr[n]->sDlgEntry;
522 0 : }
523 : }
524 0 : else if (nTypeId == REFFLDFLAG_ENDNOTE)
525 : {
526 0 : m_pSelectionLB->SetStyle(m_pSelectionLB->GetStyle() & ~WB_SORT);
527 0 : SwSeqFieldList aArr;
528 0 : const size_t nCnt = pSh->GetSeqFootnoteList( aArr, true );
529 :
530 0 : for( size_t n = 0; n < nCnt; ++n )
531 : {
532 0 : m_pSelectionLB->InsertEntry( aArr[ n ]->sDlgEntry );
533 0 : if (IsFieldEdit() && pRefField->GetSeqNo() == aArr[ n ]->nSeqNo)
534 0 : sOldSel = aArr[n]->sDlgEntry;
535 0 : }
536 : }
537 : // #i83479#
538 0 : else if ( nTypeId == REFFLDFLAG_HEADING )
539 : {
540 0 : bShowSelectionToolTipLB = true;
541 :
542 0 : const IDocumentOutlineNodes* pIDoc( pSh->getIDocumentOutlineNodesAccess() );
543 0 : pIDoc->getOutlineNodes( maOutlineNodes );
544 0 : bool bCertainTextNodeSelected( false );
545 0 : for ( size_t nOutlIdx = 0; nOutlIdx < maOutlineNodes.size(); ++nOutlIdx )
546 : {
547 0 : SvTreeListEntry* pEntry = m_pSelectionToolTipLB->InsertEntry(
548 0 : pIDoc->getOutlineText( nOutlIdx, true, true, false ) );
549 0 : pEntry->SetUserData( reinterpret_cast<void*>(nOutlIdx) );
550 0 : if ( ( IsFieldEdit() &&
551 0 : pRefField->GetReferencedTextNode() == maOutlineNodes[nOutlIdx] ) ||
552 0 : mpSavedSelectedTextNode == maOutlineNodes[nOutlIdx] )
553 : {
554 0 : m_pSelectionToolTipLB->Select( pEntry );
555 0 : sOldSel.clear();
556 0 : bCertainTextNodeSelected = true;
557 : }
558 0 : else if ( !bCertainTextNodeSelected && mnSavedSelectedPos == nOutlIdx )
559 : {
560 0 : m_pSelectionToolTipLB->Select( pEntry );
561 0 : sOldSel.clear();
562 : }
563 : }
564 : }
565 0 : else if ( nTypeId == REFFLDFLAG_NUMITEM )
566 : {
567 0 : bShowSelectionToolTipLB = true;
568 :
569 0 : const IDocumentListItems* pIDoc( pSh->getIDocumentListItemsAccess() );
570 0 : pIDoc->getNumItems( maNumItems );
571 0 : bool bCertainTextNodeSelected( false );
572 0 : for ( size_t nNumItemIdx = 0; nNumItemIdx < maNumItems.size(); ++nNumItemIdx )
573 : {
574 0 : SvTreeListEntry* pEntry = m_pSelectionToolTipLB->InsertEntry(
575 0 : pIDoc->getListItemText( *maNumItems[nNumItemIdx], true, true ) );
576 0 : pEntry->SetUserData( reinterpret_cast<void*>(nNumItemIdx) );
577 0 : if ( ( IsFieldEdit() &&
578 0 : pRefField->GetReferencedTextNode() == maNumItems[nNumItemIdx]->GetTextNode() ) ||
579 0 : mpSavedSelectedTextNode == maNumItems[nNumItemIdx]->GetTextNode() )
580 : {
581 0 : m_pSelectionToolTipLB->Select( pEntry );
582 0 : sOldSel.clear();
583 0 : bCertainTextNodeSelected = true;
584 : }
585 0 : else if ( !bCertainTextNodeSelected && mnSavedSelectedPos == nNumItemIdx )
586 : {
587 0 : m_pSelectionToolTipLB->Select( pEntry );
588 0 : sOldSel.clear();
589 : }
590 : }
591 : }
592 : else
593 : {
594 0 : m_pSelectionLB->SetStyle(m_pSelectionLB->GetStyle()|WB_SORT);
595 : // get the fields to Seq-FieldType:
596 :
597 : SwSetExpFieldType* pType = static_cast<SwSetExpFieldType*>(pSh->GetFieldType(
598 0 : nTypeId & ~REFFLDFLAG, RES_SETEXPFLD ));
599 0 : if( pType )
600 : {
601 0 : SwSeqFieldList aArr;
602 : // old selection should be kept in non-edit mode
603 0 : if(IsFieldEdit())
604 0 : sOldSel.clear();
605 :
606 0 : const size_t nCnt = pType->GetSeqFieldList( aArr );
607 0 : for( size_t n = 0; n < nCnt; ++n )
608 : {
609 0 : m_pSelectionLB->InsertEntry( aArr[ n ]->sDlgEntry );
610 0 : if (IsFieldEdit() && sOldSel.isEmpty() &&
611 0 : aArr[ n ]->nSeqNo == pRefField->GetSeqNo())
612 0 : sOldSel = aArr[ n ]->sDlgEntry;
613 : }
614 :
615 0 : if (IsFieldEdit() && sOldSel.isEmpty())
616 0 : sOldSel = OUString::number( pRefField->GetSeqNo() + 1);
617 : }
618 : }
619 : }
620 : else
621 : {
622 0 : std::vector<OUString> aLst;
623 0 : GetFieldMgr().GetSubTypes(nTypeId, aLst);
624 0 : for(size_t i = 0; i < aLst.size(); ++i)
625 0 : m_pSelectionLB->InsertEntry(aLst[i]);
626 :
627 0 : if (IsFieldEdit())
628 0 : sOldSel = pRefField->GetSetRefName();
629 : }
630 :
631 : // #i83479#
632 0 : m_pSelectionToolTipLB->Show( bShowSelectionToolTipLB );
633 0 : m_pSelectionLB->Show( !bShowSelectionToolTipLB );
634 0 : if ( bShowSelectionToolTipLB )
635 : {
636 0 : m_pSelectionToolTipLB->SetUpdateMode(true);
637 :
638 0 : bool bEnable = m_pSelectionToolTipLB->GetEntryCount() != 0;
639 0 : m_pSelection->Enable( bEnable );
640 :
641 0 : if ( m_pSelectionToolTipLB->GetCurEntry() != 0 )
642 : {
643 0 : m_pSelectionToolTipLB->MakeVisible( m_pSelectionToolTipLB->GetCurEntry() );
644 : }
645 :
646 0 : if ( IsFieldEdit() && m_pSelectionToolTipLB->GetCurEntry() == 0 )
647 : {
648 0 : m_pNameED->SetText(sOldSel);
649 : }
650 : }
651 : else
652 : {
653 0 : m_pSelectionLB->SetUpdateMode(true);
654 :
655 : // enable or disable
656 0 : bool bEnable = m_pSelectionLB->GetEntryCount() != 0;
657 0 : m_pSelection->Enable( bEnable );
658 :
659 0 : if ( bEnable )
660 : {
661 0 : m_pSelectionLB->SelectEntry(sOldSel);
662 0 : if (!m_pSelectionLB->GetSelectEntryCount() && !IsFieldEdit())
663 0 : m_pSelectionLB->SelectEntryPos(0);
664 : }
665 :
666 0 : if (IsFieldEdit() && !m_pSelectionLB->GetSelectEntryCount()) // in case the reference was already deleted...
667 0 : m_pNameED->SetText(sOldSel);
668 0 : }
669 0 : }
670 :
671 0 : sal_Int32 SwFieldRefPage::FillFormatLB(sal_uInt16 nTypeId)
672 : {
673 0 : OUString sOldSel;
674 :
675 0 : sal_Int32 nFormatSel = m_pFormatLB->GetSelectEntryPos();
676 0 : if (nFormatSel != LISTBOX_ENTRY_NOTFOUND)
677 0 : sOldSel = m_pFormatLB->GetEntry(nFormatSel);
678 :
679 : // fill Format-Listbox
680 0 : m_pFormatLB->Clear();
681 :
682 : // reference has less that the annotation
683 0 : sal_uInt16 nSize( 0 );
684 0 : bool bAddCrossRefFormats( false );
685 0 : switch (nTypeId)
686 : {
687 : // #i83479#
688 : case REFFLDFLAG_HEADING:
689 : case REFFLDFLAG_NUMITEM:
690 0 : bAddCrossRefFormats = true;
691 : // intentional no break here
692 :
693 : case TYP_GETREFFLD:
694 : case REFFLDFLAG_BOOKMARK:
695 : case REFFLDFLAG_FOOTNOTE:
696 : case REFFLDFLAG_ENDNOTE:
697 0 : nSize = FMT_REF_PAGE_PGDSC - FMT_REF_BEGIN + 1;
698 0 : break;
699 :
700 : default:
701 : // #i83479#
702 :
703 0 : if ( REFFLDFLAG & nTypeId )
704 : {
705 0 : nSize = FMT_REF_ONLYSEQNO - FMT_REF_BEGIN + 1;
706 : }
707 : else
708 : {
709 0 : nSize = GetFieldMgr().GetFormatCount( nTypeId, false, IsFieldDlgHtmlMode() );
710 : }
711 0 : break;
712 : }
713 :
714 0 : if (REFFLDFLAG & nTypeId)
715 0 : nTypeId = TYP_GETREFFLD;
716 :
717 0 : for (sal_uInt16 i = 0; i < nSize; i++)
718 : {
719 0 : sal_Int32 nPos = m_pFormatLB->InsertEntry(GetFieldMgr().GetFormatStr( nTypeId, i ));
720 0 : m_pFormatLB->SetEntryData( nPos, reinterpret_cast<void*>(GetFieldMgr().GetFormatId( nTypeId, i )));
721 : }
722 : // #i83479#
723 0 : if ( bAddCrossRefFormats )
724 : {
725 0 : sal_uInt16 nFormat = FMT_REF_NUMBER - FMT_REF_BEGIN;
726 0 : sal_Int32 nPos = m_pFormatLB->InsertEntry(GetFieldMgr().GetFormatStr( nTypeId, nFormat ));
727 0 : m_pFormatLB->SetEntryData( nPos, reinterpret_cast<void*>(GetFieldMgr().GetFormatId( nTypeId, nFormat )));
728 0 : nFormat = FMT_REF_NUMBER_NO_CONTEXT - FMT_REF_BEGIN;
729 0 : nPos = m_pFormatLB->InsertEntry(GetFieldMgr().GetFormatStr( nTypeId, nFormat ));
730 0 : m_pFormatLB->SetEntryData( nPos, reinterpret_cast<void*>(GetFieldMgr().GetFormatId( nTypeId, nFormat )));
731 0 : nFormat = FMT_REF_NUMBER_FULL_CONTEXT - FMT_REF_BEGIN;
732 0 : nPos = m_pFormatLB->InsertEntry(GetFieldMgr().GetFormatStr( nTypeId, nFormat ));
733 0 : m_pFormatLB->SetEntryData( nPos, reinterpret_cast<void*>(GetFieldMgr().GetFormatId( nTypeId, nFormat )));
734 0 : nSize += 3;
735 : }
736 :
737 : // select a certain entry
738 0 : if (nSize)
739 : {
740 0 : if (!IsFieldEdit())
741 0 : m_pFormatLB->SelectEntry(sOldSel);
742 : else
743 0 : m_pFormatLB->SelectEntry(SW_RESSTR(FMT_REF_BEGIN + GetCurField()->GetFormat()));
744 :
745 0 : if (!m_pFormatLB->GetSelectEntryCount())
746 : {
747 0 : m_pFormatLB->SelectEntryPos(nFieldDlgFormatSel);
748 0 : if (!m_pFormatLB->GetSelectEntryCount())
749 0 : m_pFormatLB->SelectEntryPos(0);
750 : }
751 : }
752 :
753 0 : return nSize;
754 : }
755 :
756 : // Modify
757 0 : IMPL_LINK_NOARG(SwFieldRefPage, ModifyHdl)
758 : {
759 0 : OUString aName(m_pNameED->GetText());
760 0 : const bool bEmptyName = aName.isEmpty();
761 :
762 0 : bool bEnable = true;
763 0 : sal_uInt16 nTypeId = (sal_uInt16)reinterpret_cast<sal_uLong>(m_pTypeLB->GetEntryData(GetTypeSel()));
764 :
765 0 : if ((nTypeId == TYP_SETREFFLD && !GetFieldMgr().CanInsertRefMark(aName)) ||
766 0 : (bEmptyName && (nTypeId == TYP_GETREFFLD || nTypeId == TYP_SETREFFLD ||
767 : nTypeId == REFFLDFLAG_BOOKMARK)))
768 0 : bEnable = false;
769 :
770 0 : EnableInsert(bEnable);
771 :
772 0 : m_pSelectionLB->SelectEntry(aName);
773 :
774 0 : return 0;
775 : }
776 :
777 0 : bool SwFieldRefPage::FillItemSet(SfxItemSet* )
778 : {
779 0 : bool bModified = false;
780 0 : sal_uInt16 nTypeId = (sal_uInt16)reinterpret_cast<sal_uLong>(m_pTypeLB->GetEntryData(GetTypeSel()));
781 :
782 0 : sal_uInt16 nSubType = 0;
783 0 : const sal_Int32 nEntryPos = m_pFormatLB->GetSelectEntryPos();
784 : const sal_uLong nFormat = (nEntryPos == LISTBOX_ENTRY_NOTFOUND)
785 0 : ? 0 : reinterpret_cast<sal_uLong>(m_pFormatLB->GetEntryData(nEntryPos));
786 :
787 0 : OUString aVal(m_pValueED->GetText());
788 0 : OUString aName(m_pNameED->GetText());
789 :
790 0 : switch(nTypeId)
791 : {
792 : case TYP_GETREFFLD:
793 0 : nSubType = REF_SETREFATTR;
794 0 : break;
795 :
796 : case TYP_SETREFFLD:
797 : {
798 0 : SwFieldType* pType = GetFieldMgr().GetFieldType(RES_SETEXPFLD, aName);
799 :
800 0 : if(!pType) // Only insert when the name doesn't exist yet
801 : {
802 0 : m_pSelectionLB->InsertEntry(aName);
803 0 : m_pSelection->Enable();
804 : }
805 0 : break;
806 : }
807 : }
808 :
809 0 : SwGetRefField* pRefField = static_cast<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 = m_pNameED->GetText();
821 0 : nTypeId = TYP_GETREFFLD;
822 0 : nSubType = REF_BOOKMARK;
823 : }
824 0 : else if (REFFLDFLAG_FOOTNOTE == nTypeId) // footnotes
825 : {
826 0 : SwSeqFieldList aArr;
827 0 : _SeqFieldLstElem aElem( m_pSelectionLB->GetSelectEntry(), 0 );
828 :
829 0 : size_t nPos = 0;
830 :
831 0 : nTypeId = TYP_GETREFFLD;
832 0 : nSubType = REF_FOOTNOTE;
833 0 : aName.clear();
834 :
835 0 : if (pSh->GetSeqFootnoteList(aArr) && aArr.SeekEntry(aElem, &nPos))
836 : {
837 0 : aVal = OUString::number( aArr[nPos]->nSeqNo );
838 :
839 0 : if (IsFieldEdit() && aArr[nPos]->nSeqNo == pRefField->GetSeqNo())
840 0 : bModified = true; // can happen with fields of which the references were deleted
841 : }
842 0 : else if (IsFieldEdit())
843 0 : aVal = OUString::number( pRefField->GetSeqNo() );
844 : }
845 0 : else if (REFFLDFLAG_ENDNOTE == nTypeId) // endnotes
846 : {
847 0 : SwSeqFieldList aArr;
848 0 : _SeqFieldLstElem aElem( m_pSelectionLB->GetSelectEntry(), 0 );
849 :
850 0 : size_t nPos = 0;
851 :
852 0 : nTypeId = TYP_GETREFFLD;
853 0 : nSubType = REF_ENDNOTE;
854 0 : aName.clear();
855 :
856 0 : if (pSh->GetSeqFootnoteList(aArr, true) && aArr.SeekEntry(aElem, &nPos))
857 : {
858 0 : aVal = OUString::number( aArr[nPos]->nSeqNo );
859 :
860 0 : if (IsFieldEdit() && aArr[nPos]->nSeqNo == pRefField->GetSeqNo())
861 0 : bModified = true; // can happen with fields of which the reference was deleted
862 : }
863 0 : else if (IsFieldEdit())
864 0 : aVal = OUString::number( pRefField->GetSeqNo() );
865 : }
866 : // #i83479#
867 0 : else if ( nTypeId == REFFLDFLAG_HEADING )
868 : {
869 0 : SvTreeListEntry* pEntry = m_pSelectionToolTipLB->GetCurEntry();
870 : OSL_ENSURE( pEntry,
871 : "<SwFieldRefPage::FillItemSet(..)> - no entry selected in selection tool tip listbox!" );
872 0 : if ( pEntry )
873 : {
874 : const size_t nOutlIdx( static_cast<size_t>
875 0 : (reinterpret_cast<sal_uLong>(pEntry->GetUserData())) );
876 0 : pSh->getIDocumentOutlineNodesAccess()->getOutlineNodes( maOutlineNodes );
877 0 : if ( nOutlIdx < maOutlineNodes.size() )
878 : {
879 0 : ::sw::mark::IMark const * const pMark = pSh->getIDocumentMarkAccess()->getMarkForTextNode(
880 0 : *(maOutlineNodes[nOutlIdx]),
881 0 : IDocumentMarkAccess::MarkType::CROSSREF_HEADING_BOOKMARK);
882 0 : aName = pMark->GetName();
883 0 : nTypeId = TYP_GETREFFLD;
884 0 : nSubType = REF_BOOKMARK;
885 : }
886 : }
887 : }
888 0 : else if ( nTypeId == REFFLDFLAG_NUMITEM )
889 : {
890 0 : SvTreeListEntry* pEntry = m_pSelectionToolTipLB->GetCurEntry();
891 : OSL_ENSURE( pEntry,
892 : "<SwFieldRefPage::FillItemSet(..)> - no entry selected in selection tool tip listbox!" );
893 0 : if ( pEntry )
894 : {
895 : const size_t nNumItemIdx( static_cast<size_t>
896 0 : (reinterpret_cast<sal_uLong>(pEntry->GetUserData())) );
897 0 : pSh->getIDocumentListItemsAccess()->getNumItems( maNumItems );
898 0 : if ( nNumItemIdx < maNumItems.size() )
899 : {
900 0 : ::sw::mark::IMark const * const pMark = pSh->getIDocumentMarkAccess()->getMarkForTextNode(
901 0 : *(maNumItems[nNumItemIdx]->GetTextNode()),
902 0 : IDocumentMarkAccess::MarkType::CROSSREF_NUMITEM_BOOKMARK);
903 0 : aName = pMark->GetName();
904 0 : nTypeId = TYP_GETREFFLD;
905 0 : nSubType = REF_BOOKMARK;
906 : }
907 : }
908 : }
909 : else // SeqenceFields
910 : {
911 : // get fields for Seq-FeldType:
912 : SwSetExpFieldType* pType = static_cast<SwSetExpFieldType*>(pSh->GetFieldType(
913 0 : nTypeId & ~REFFLDFLAG, RES_SETEXPFLD ));
914 0 : if( pType )
915 : {
916 0 : SwSeqFieldList aArr;
917 0 : _SeqFieldLstElem aElem( m_pSelectionLB->GetSelectEntry(), 0 );
918 :
919 0 : size_t nPos = 0;
920 :
921 0 : nTypeId = TYP_GETREFFLD;
922 0 : nSubType = REF_SEQUENCEFLD;
923 0 : aName = pType->GetName();
924 :
925 0 : if (pType->GetSeqFieldList(aArr) && aArr.SeekEntry(aElem, &nPos))
926 : {
927 0 : aVal = OUString::number( aArr[nPos]->nSeqNo );
928 :
929 0 : if (IsFieldEdit() && aArr[nPos]->nSeqNo == pRefField->GetSeqNo())
930 0 : bModified = true; // can happen with fields of which the reference was deleted
931 : }
932 0 : else if (IsFieldEdit())
933 0 : aVal = OUString::number( pRefField->GetSeqNo() );
934 : }
935 : }
936 : }
937 :
938 0 : if (IsFieldEdit() && nTypeId == TYP_GETREFFLD)
939 : {
940 0 : aVal = OUString::number(nSubType) + "|" + aVal;
941 : }
942 :
943 0 : if (!IsFieldEdit() || bModified ||
944 0 : m_pNameED->IsValueChangedFromSaved() ||
945 0 : m_pValueED->IsValueChangedFromSaved() ||
946 0 : m_pTypeLB->IsValueChangedFromSaved() ||
947 0 : m_pSelectionLB->IsValueChangedFromSaved() ||
948 0 : m_pFormatLB->IsValueChangedFromSaved())
949 : {
950 0 : InsertField( nTypeId, nSubType, aName, aVal, nFormat );
951 : }
952 :
953 0 : ModifyHdl(); // enable/disable insert if applicable
954 :
955 0 : return false;
956 : }
957 :
958 0 : VclPtr<SfxTabPage> SwFieldRefPage::Create( vcl::Window* pParent,
959 : const SfxItemSet* rAttrSet )
960 : {
961 0 : return VclPtr<SwFieldRefPage>::Create( pParent, *rAttrSet );
962 : }
963 :
964 0 : sal_uInt16 SwFieldRefPage::GetGroup()
965 : {
966 0 : return GRP_REF;
967 : }
968 :
969 0 : void SwFieldRefPage::FillUserData()
970 : {
971 0 : const sal_Int32 nEntryPos = m_pTypeLB->GetSelectEntryPos();
972 : const sal_uInt16 nTypeSel = ( LISTBOX_ENTRY_NOTFOUND == nEntryPos )
973 : ? USHRT_MAX
974 : : sal::static_int_cast< sal_uInt16 >
975 0 : (reinterpret_cast< sal_uIntPtr >(m_pTypeLB->GetEntryData( nEntryPos )));
976 0 : SetUserData( USER_DATA_VERSION ";" + OUString::number( nTypeSel ));
977 0 : }
978 :
979 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|