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