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 #include <svl/style.hxx> 33 #include <errhdl.hxx> 34 #include <wrtsh.hxx> 35 #ifndef _VIEW_HXX 36 #include <view.hxx> 37 #endif 38 #ifndef _DOCSH_HXX 39 #include <docsh.hxx> 40 #endif 41 #include <docfnote.hxx> 42 #include <impfnote.hxx> 43 #include <ftninfo.hxx> 44 #include <fmtcol.hxx> 45 #include <pagedesc.hxx> 46 #include <charfmt.hxx> 47 #include <docstyle.hxx> 48 #include <wdocsh.hxx> 49 #include <uitool.hxx> 50 #include <poolfmt.hxx> 51 #include <swstyle.h> 52 #ifndef _HELPID_H 53 #include <helpid.h> 54 #endif 55 #ifndef _MISC_HRC 56 #include <misc.hrc> 57 #endif 58 #ifndef _DOCFNOTE_HRC 59 #include <docfnote.hrc> 60 #endif 61 #ifndef _FRMUI_HRC 62 #include <frmui.hrc> 63 #endif 64 #include <SwStyleNameMapper.hxx> 65 66 SwFootNoteOptionDlg::SwFootNoteOptionDlg( Window *pParent, SwWrtShell &rS ) : 67 SfxTabDialog( pParent, SW_RES(DLG_DOC_FOOTNOTE) ), 68 rSh( rS ) 69 { 70 FreeResource(); 71 RemoveResetButton(); 72 73 aOldOkHdl = GetOKButton().GetClickHdl(); 74 GetOKButton().SetClickHdl( LINK( this, SwFootNoteOptionDlg, OkHdl ) ); 75 76 AddTabPage( TP_FOOTNOTEOPTION, SwFootNoteOptionPage::Create, 0 ); 77 AddTabPage( TP_ENDNOTEOPTION, SwEndNoteOptionPage::Create, 0 ); 78 } 79 80 void SwFootNoteOptionDlg::PageCreated( sal_uInt16 /*nId*/, SfxTabPage &rPage ) 81 { 82 ((SwEndNoteOptionPage&)rPage).SetShell( rSh ); 83 } 84 85 SwFootNoteOptionDlg::~SwFootNoteOptionDlg() 86 { 87 } 88 89 IMPL_LINK( SwFootNoteOptionDlg, OkHdl, Button *, pBtn ) 90 { 91 SfxItemSet aDummySet(rSh.GetAttrPool(), 1, 1 ); 92 SfxTabPage *pPage = GetTabPage( TP_FOOTNOTEOPTION ); 93 if ( pPage ) 94 pPage->FillItemSet( aDummySet ); 95 pPage = GetTabPage( TP_ENDNOTEOPTION ); 96 if ( pPage ) 97 pPage->FillItemSet( aDummySet ); 98 aOldOkHdl.Call( pBtn ); 99 return 0; 100 } 101 102 103 //---------------------------------------------------------------------- 104 105 106 SwEndNoteOptionPage::SwEndNoteOptionPage( Window *pParent, sal_Bool bEN, 107 const SfxItemSet &rSet ) : 108 SfxTabPage( pParent, SW_RES(bEN ? TP_ENDNOTEOPTION : TP_FOOTNOTEOPTION), rSet ), 109 aNumFL (this, SW_RES( FL_NUM )), 110 111 aNumTypeFT (this, SW_RES( FT_NUMTYPE )), 112 aNumViewBox (this, SW_RES( LB_NUMVIEW ), INSERT_NUM_EXTENDED_TYPES), 113 aOffsetLbl (this, SW_RES( FT_OFFSET )), 114 aOffsetFld (this, SW_RES( FLD_OFFSET )), 115 aNumCountFT (this, SW_RES( FT_NUMCOUNT )), 116 aNumCountBox (this, SW_RES( LB_NUMCOUNT )), 117 aPrefixFT (this, SW_RES( FT_PREFIX )), 118 aPrefixED (this, SW_RES( ED_PREFIX )), 119 aSuffixFT (this, SW_RES( FT_SUFFIX )), 120 aSuffixED (this, SW_RES( ED_SUFFIX )), 121 aPosFT (this, SW_RES( FT_POS )), 122 aPosPageBox (this, SW_RES( RB_POS_PAGE )), 123 aPosChapterBox (this, SW_RES( RB_POS_CHAPTER)), 124 125 aTemplFL (this, SW_RES( FL_TEMPL )), 126 aParaTemplLbl (this, SW_RES( FT_PARA_TEMPL)), 127 aParaTemplBox (this, SW_RES( LB_PARA_TEMPL)), 128 aPageTemplLbl (this, SW_RES( FT_PAGE_TEMPL)), 129 aPageTemplBox (this, SW_RES( LB_PAGE_TEMPL)), 130 131 aCharTemplFL( this, SW_RES(FL_CHAR_TEMPL)), 132 aFtnCharAnchorTemplLbl( this, SW_RES( FT_ANCHR_CHARFMT)), 133 aFtnCharAnchorTemplBox( this, SW_RES( LB_ANCHR_CHARFMT)), 134 aFtnCharTextTemplLbl( this, SW_RES( FT_TEXT_CHARFMT)), 135 aFtnCharTextTemplBox( this, SW_RES( LB_TEXT_CHARFMT)), 136 137 aContFL (this, SW_RES( FL_CONT )), 138 aContLbl (this, SW_RES( FT_CONT )), 139 aContEdit (this, SW_RES( ED_CONT )), 140 aContFromLbl (this, SW_RES( FT_CONT_FROM )), 141 aContFromEdit (this, SW_RES( ED_CONT_FROM )), 142 143 aNumDoc(aNumCountBox.GetEntry(FTNNUM_DOC)), 144 aNumPage(aNumCountBox.GetEntry(FTNNUM_PAGE)), 145 aNumChapter(aNumCountBox.GetEntry(FTNNUM_CHAPTER)), 146 pSh( 0 ), 147 bPosDoc(sal_False), 148 bEndNote( bEN ) 149 { 150 FreeResource(); 151 152 aPosPageBox.SetClickHdl(LINK(this, SwEndNoteOptionPage, PosPageHdl)); 153 aPosChapterBox.SetClickHdl(LINK(this, SwEndNoteOptionPage, PosChapterHdl)); 154 aNumCountBox.SetSelectHdl(LINK(this, SwEndNoteOptionPage, NumCountHdl)); 155 156 aPosPageBox.SetAccessibleRelationMemberOf(&aPosFT); 157 aPosChapterBox.SetAccessibleRelationMemberOf(&aPosFT); 158 } 159 160 void SwEndNoteOptionPage::Reset( const SfxItemSet& ) 161 { 162 SwEndNoteInfo *pInf = bEndNote ? new SwEndNoteInfo( pSh->GetEndNoteInfo() ) 163 : new SwFtnInfo( pSh->GetFtnInfo() ); 164 SfxObjectShell * pDocSh = SfxObjectShell::Current(); 165 sal_uInt16 i; 166 167 if(PTR_CAST(SwWebDocShell, pDocSh)) 168 { 169 aParaTemplLbl .Hide(); 170 aParaTemplBox .Hide(); 171 aPageTemplLbl .Hide(); 172 aPageTemplBox .Hide(); 173 aFtnCharTextTemplLbl.Hide(); 174 aFtnCharTextTemplBox.Hide(); 175 aFtnCharAnchorTemplLbl.Hide(); 176 aFtnCharAnchorTemplBox.Hide(); 177 aCharTemplFL .Hide(); 178 aTemplFL .Hide(); 179 } 180 if ( bEndNote ) 181 { 182 aPosPageBox.Hide(); 183 aPosChapterBox.Hide(); 184 aNumCountBox.Hide(); 185 aContLbl.Hide(); 186 aContEdit.Hide(); 187 aContFromLbl.Hide(); 188 aContFromEdit.Hide(); 189 aContFL.Hide(); 190 bPosDoc = sal_True; 191 } 192 else 193 { 194 const SwFtnInfo &rInf = pSh->GetFtnInfo(); 195 // Position (Seite, Kapitel) setzen 196 if ( rInf.ePos == FTNPOS_PAGE ) 197 { 198 aPosPageBox.Check(); 199 aPageTemplLbl.Enable(sal_False); 200 aPageTemplBox.Enable(sal_False); 201 } 202 else // if ( rInf.ePos == FTNPOS_CHAPTER ) 203 { 204 aPosChapterBox.Check(); 205 aNumCountBox.RemoveEntry(aNumPage); 206 aNumCountBox.RemoveEntry(aNumChapter); 207 bPosDoc = sal_True; 208 } 209 // Verweistexte 210 aContEdit.SetText(rInf.aQuoVadis); 211 aContFromEdit.SetText(rInf.aErgoSum); 212 213 // gesammelt wo 214 SelectNumbering(rInf.eNum); 215 } 216 217 // Numerierung 218 // Art 219 aNumViewBox.SelectNumberingType( pInf->aFmt.GetNumberingType()); 220 aOffsetFld.SetValue(pInf->nFtnOffset + 1); 221 aPrefixED.SetText(pInf->GetPrefix()); 222 aSuffixED.SetText(pInf->GetSuffix()); 223 224 const SwCharFmt* pCharFmt = pInf->GetCharFmt( 225 *pSh->GetView().GetDocShell()->GetDoc()); 226 aFtnCharTextTemplBox.SelectEntry(pCharFmt->GetName()); 227 aFtnCharTextTemplBox.SaveValue(); 228 229 pCharFmt = pInf->GetAnchorCharFmt( *pSh->GetDoc() ); 230 aFtnCharAnchorTemplBox.SelectEntry( pCharFmt->GetName() ); 231 aFtnCharAnchorTemplBox.SaveValue(); 232 233 // Vorlagen - Sonderbereiche 234 // Absatz 235 SfxStyleSheetBasePool* pStyleSheetPool = pSh->GetView().GetDocShell()->GetStyleSheetPool(); 236 pStyleSheetPool->SetSearchMask(SFX_STYLE_FAMILY_PARA, SWSTYLEBIT_EXTRA); 237 SfxStyleSheetBase *pStyle = pStyleSheetPool->First(); 238 while(pStyle) 239 { 240 aParaTemplBox.InsertEntry(pStyle->GetName()); 241 pStyle = pStyleSheetPool->Next(); 242 } 243 244 String sStr; 245 SwStyleNameMapper::FillUIName( static_cast< sal_uInt16 >(bEndNote ? RES_POOLCOLL_ENDNOTE 246 : RES_POOLCOLL_FOOTNOTE), sStr ); 247 if(LISTBOX_ENTRY_NOTFOUND == aParaTemplBox.GetEntryPos( sStr ) ) 248 aParaTemplBox.InsertEntry( sStr ); 249 250 SwTxtFmtColl* pColl = pInf->GetFtnTxtColl(); 251 if( !pColl ) 252 aParaTemplBox.SelectEntry( sStr ); // Default 253 else 254 { 255 ASSERT(!pColl->IsDefault(), "Defaultvorlage fuer Fussnoten ist falsch."); 256 const sal_uInt16 nPos = aParaTemplBox.GetEntryPos(pColl->GetName()); 257 if( LISTBOX_ENTRY_NOTFOUND != nPos ) 258 aParaTemplBox.SelectEntryPos( nPos ); 259 else 260 { 261 aParaTemplBox.InsertEntry(pColl->GetName()); 262 aParaTemplBox.SelectEntry(pColl->GetName()); 263 } 264 } 265 266 // Seite 267 for( i = RES_POOLPAGE_BEGIN; i < RES_POOLPAGE_END; ++i ) 268 aPageTemplBox.InsertEntry(SwStyleNameMapper::GetUIName( i, aEmptyStr )); 269 270 sal_uInt16 nCount = pSh->GetPageDescCnt(); 271 for(i = 0; i < nCount; ++i) 272 { 273 const SwPageDesc &rPageDesc = pSh->GetPageDesc(i); 274 if(LISTBOX_ENTRY_NOTFOUND == aPageTemplBox.GetEntryPos(rPageDesc.GetName())) 275 aPageTemplBox.InsertEntry(rPageDesc.GetName()); 276 } 277 278 aPageTemplBox.SelectEntry( pInf->GetPageDesc( *pSh->GetDoc() )->GetName()); 279 delete pInf; 280 } 281 282 SwEndNoteOptionPage::~SwEndNoteOptionPage() 283 { 284 } 285 286 SfxTabPage *SwEndNoteOptionPage::Create( Window *pParent, const SfxItemSet &rSet ) 287 { 288 return new SwEndNoteOptionPage( pParent, sal_True, rSet ); 289 } 290 291 /*------------------------------------------------------------------------ 292 Beschreibung: Unterschiedliche Arten der Numerierung; da die Listbox 293 unterschiedlich viele Eintraege hat, hier Funktionen 294 fuer das Setzen und Erfragen der gemeinten Art 295 der Numerierung. 296 ------------------------------------------------------------------------*/ 297 void SwEndNoteOptionPage::SelectNumbering(int eNum) 298 { 299 String sSelect; 300 switch(eNum) 301 { 302 case FTNNUM_DOC: 303 sSelect = aNumDoc; 304 break; 305 case FTNNUM_PAGE: 306 sSelect = aNumPage; 307 break; 308 case FTNNUM_CHAPTER: 309 sSelect = aNumChapter; 310 break; 311 #ifdef DBG_UTIL 312 default: 313 DBG_ERROR("Which numbering type?"); 314 #endif 315 } 316 aNumCountBox.SelectEntry(sSelect); 317 NumCountHdl( &aNumCountBox ); 318 } 319 320 321 322 int SwEndNoteOptionPage::GetNumbering() const 323 { 324 const sal_uInt16 nPos = aNumCountBox.GetSelectEntryPos(); 325 return (int) bPosDoc? nPos + 1: nPos; 326 } 327 328 /*-----------------09.02.98 11:17------------------- 329 330 --------------------------------------------------*/ 331 void SwEndNoteOptionPage::SetShell( SwWrtShell &rShell ) 332 { 333 pSh = &rShell; 334 // Zeichenvorlagen sammeln 335 aFtnCharTextTemplBox.Clear(); 336 aFtnCharAnchorTemplBox.Clear(); 337 ::FillCharStyleListBox(aFtnCharTextTemplBox, 338 pSh->GetView().GetDocShell()); 339 340 ::FillCharStyleListBox(aFtnCharAnchorTemplBox, 341 pSh->GetView().GetDocShell()); 342 } 343 344 /*------------------------------------------------------------------------ 345 Beschreibung: Handler hinter dem Button fuer Sammeln der Fussnote 346 auf der Seite. 347 In diesem Fall koennen alle Numerierungsarten verwendet 348 werden. 349 ------------------------------------------------------------------------*/ 350 351 352 IMPL_LINK( SwEndNoteOptionPage, PosPageHdl, Button *, EMPTYARG ) 353 { 354 const SwFtnNum eNum = (const SwFtnNum)GetNumbering(); 355 bPosDoc = sal_False; 356 if(LISTBOX_ENTRY_NOTFOUND == aNumCountBox.GetEntryPos(aNumPage)) 357 { 358 aNumCountBox.InsertEntry(aNumPage, FTNNUM_PAGE); 359 aNumCountBox.InsertEntry(aNumChapter, FTNNUM_CHAPTER); 360 SelectNumbering(eNum); 361 } 362 aPageTemplLbl.Enable(sal_False); 363 aPageTemplBox.Enable(sal_False); 364 365 return 0; 366 } 367 368 /*------------------------------------------------------------------------ 369 Beschreibung: 370 ------------------------------------------------------------------------*/ 371 372 373 IMPL_LINK( SwEndNoteOptionPage, NumCountHdl, ListBox*, EMPTYARG ) 374 { 375 sal_Bool bEnable = sal_True; 376 if( aNumCountBox.GetEntryCount() - 1 != aNumCountBox.GetSelectEntryPos() ) 377 { 378 bEnable = sal_False; 379 aOffsetFld.SetValue(1); 380 } 381 aOffsetLbl.Enable(bEnable); 382 aOffsetFld.Enable(bEnable); 383 return 0; 384 } 385 386 /*------------------------------------------------------------------------ 387 Beschreibung: Handler hinter dem Button fuer Sammeln der Fussnote 388 am Kapitel oder Dokumentende. 389 In diesem Fall kann keine seitenweise Numerierung verwendet 390 werden. 391 ------------------------------------------------------------------------*/ 392 393 394 IMPL_LINK_INLINE_START( SwEndNoteOptionPage, PosChapterHdl, Button *, EMPTYARG ) 395 { 396 if ( !bPosDoc ) 397 SelectNumbering(FTNNUM_DOC); 398 399 bPosDoc = sal_True; 400 aNumCountBox.RemoveEntry(aNumPage); 401 aNumCountBox.RemoveEntry(aNumChapter); 402 aPageTemplLbl.Enable(); 403 aPageTemplBox.Enable(); 404 return 0; 405 } 406 IMPL_LINK_INLINE_END( SwEndNoteOptionPage, PosChapterHdl, Button *, EMPTYARG ) 407 408 SwCharFmt* lcl_GetCharFormat( SwWrtShell* pSh, const String& rCharFmtName ) 409 { 410 SwCharFmt* pFmt = 0; 411 sal_uInt16 nChCount = pSh->GetCharFmtCount(); 412 for(sal_uInt16 i = 0; i< nChCount; i++) 413 { 414 SwCharFmt& rChFmt = pSh->GetCharFmt(i); 415 if(rChFmt.GetName() == rCharFmtName ) 416 { 417 pFmt = &rChFmt; 418 break; 419 } 420 } 421 if(!pFmt) 422 { 423 SfxStyleSheetBasePool* pPool = pSh->GetView().GetDocShell()->GetStyleSheetPool(); 424 SfxStyleSheetBase* pBase; 425 pBase = pPool->Find(rCharFmtName, SFX_STYLE_FAMILY_CHAR); 426 if(!pBase) 427 pBase = &pPool->Make(rCharFmtName, SFX_STYLE_FAMILY_CHAR); 428 pFmt = ((SwDocStyleSheet*)pBase)->GetCharFmt(); 429 } 430 return pFmt; 431 } 432 433 sal_Bool SwEndNoteOptionPage::FillItemSet( SfxItemSet & ) 434 { 435 SwEndNoteInfo *pInf = bEndNote ? new SwEndNoteInfo() : new SwFtnInfo(); 436 437 pInf->nFtnOffset = static_cast< sal_uInt16 >(aOffsetFld.GetValue() -1); 438 pInf->aFmt.SetNumberingType(aNumViewBox.GetSelectedNumberingType() ); 439 pInf->SetPrefix(aPrefixED.GetText()); 440 pInf->SetSuffix(aSuffixED.GetText()); 441 442 pInf->SetCharFmt( lcl_GetCharFormat( pSh, 443 aFtnCharTextTemplBox.GetSelectEntry() ) ); 444 pInf->SetAnchorCharFmt( lcl_GetCharFormat( pSh, 445 aFtnCharAnchorTemplBox.GetSelectEntry() ) ); 446 447 // Absatzvorlage 448 sal_uInt16 nPos = aParaTemplBox.GetSelectEntryPos(); 449 if(LISTBOX_ENTRY_NOTFOUND != nPos) 450 { 451 const String aFmtName( aParaTemplBox.GetSelectEntry() ); 452 SwTxtFmtColl *pColl = pSh->GetParaStyle(aFmtName, SwWrtShell::GETSTYLE_CREATEANY); 453 ASSERT(pColl, "Absatzvorlage nicht gefunden."); 454 pInf->SetFtnTxtColl(*pColl); 455 } 456 457 // Seitenvorlage 458 pInf->ChgPageDesc( pSh->FindPageDescByName( 459 aPageTemplBox.GetSelectEntry(), sal_True ) ); 460 461 if ( bEndNote ) 462 { 463 if ( !(*pInf == pSh->GetEndNoteInfo()) ) 464 pSh->SetEndNoteInfo( *pInf ); 465 } 466 else 467 { 468 SwFtnInfo *pI = (SwFtnInfo*)pInf; 469 pI->ePos = aPosPageBox.IsChecked() ? FTNPOS_PAGE : FTNPOS_CHAPTER; 470 pI->eNum = (SwFtnNum)GetNumbering(); 471 pI->aQuoVadis = aContEdit.GetText(); 472 pI->aErgoSum = aContFromEdit.GetText(); 473 if ( !(*pI == pSh->GetFtnInfo()) ) 474 pSh->SetFtnInfo( *pI ); 475 } 476 delete pInf; 477 return sal_True; 478 } 479 480 SwFootNoteOptionPage::SwFootNoteOptionPage( Window *pParent, const SfxItemSet &rSet ) : 481 SwEndNoteOptionPage( pParent, sal_False, rSet ) 482 { 483 } 484 485 SwFootNoteOptionPage::~SwFootNoteOptionPage() 486 { 487 } 488 489 SfxTabPage *SwFootNoteOptionPage::Create(Window *pParent, const SfxItemSet &rSet ) 490 { 491 return new SwFootNoteOptionPage( pParent, rSet ); 492 } 493 494 495 496 497 498 499 500