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