/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_sw.hxx" #ifdef SW_DLLIMPLEMENTATION #undef SW_DLLIMPLEMENTATION #endif #include #include #include #ifndef _VIEW_HXX #include #endif #ifndef _DOCSH_HXX #include #endif #include #include #include #include #include #include #include #include #include #include #include #ifndef _HELPID_H #include #endif #ifndef _MISC_HRC #include #endif #ifndef _DOCFNOTE_HRC #include #endif #ifndef _FRMUI_HRC #include #endif #include SwFootNoteOptionDlg::SwFootNoteOptionDlg( Window *pParent, SwWrtShell &rS ) : SfxTabDialog( pParent, SW_RES(DLG_DOC_FOOTNOTE) ), rSh( rS ) { FreeResource(); RemoveResetButton(); aOldOkHdl = GetOKButton().GetClickHdl(); GetOKButton().SetClickHdl( LINK( this, SwFootNoteOptionDlg, OkHdl ) ); AddTabPage( TP_FOOTNOTEOPTION, SwFootNoteOptionPage::Create, 0 ); AddTabPage( TP_ENDNOTEOPTION, SwEndNoteOptionPage::Create, 0 ); } void SwFootNoteOptionDlg::PageCreated( sal_uInt16 /*nId*/, SfxTabPage &rPage ) { ((SwEndNoteOptionPage&)rPage).SetShell( rSh ); } SwFootNoteOptionDlg::~SwFootNoteOptionDlg() { } IMPL_LINK( SwFootNoteOptionDlg, OkHdl, Button *, pBtn ) { SfxItemSet aDummySet(rSh.GetAttrPool(), 1, 1 ); SfxTabPage *pPage = GetTabPage( TP_FOOTNOTEOPTION ); if ( pPage ) pPage->FillItemSet( aDummySet ); pPage = GetTabPage( TP_ENDNOTEOPTION ); if ( pPage ) pPage->FillItemSet( aDummySet ); aOldOkHdl.Call( pBtn ); return 0; } //---------------------------------------------------------------------- SwEndNoteOptionPage::SwEndNoteOptionPage( Window *pParent, sal_Bool bEN, const SfxItemSet &rSet ) : SfxTabPage( pParent, SW_RES(bEN ? TP_ENDNOTEOPTION : TP_FOOTNOTEOPTION), rSet ), aNumFL (this, SW_RES( FL_NUM )), aNumTypeFT (this, SW_RES( FT_NUMTYPE )), aNumViewBox (this, SW_RES( LB_NUMVIEW ), INSERT_NUM_EXTENDED_TYPES), aOffsetLbl (this, SW_RES( FT_OFFSET )), aOffsetFld (this, SW_RES( FLD_OFFSET )), aNumCountFT (this, SW_RES( FT_NUMCOUNT )), aNumCountBox (this, SW_RES( LB_NUMCOUNT )), aPrefixFT (this, SW_RES( FT_PREFIX )), aPrefixED (this, SW_RES( ED_PREFIX )), aSuffixFT (this, SW_RES( FT_SUFFIX )), aSuffixED (this, SW_RES( ED_SUFFIX )), aPosFT (this, SW_RES( FT_POS )), aPosPageBox (this, SW_RES( RB_POS_PAGE )), aPosChapterBox (this, SW_RES( RB_POS_CHAPTER)), aTemplFL (this, SW_RES( FL_TEMPL )), aParaTemplLbl (this, SW_RES( FT_PARA_TEMPL)), aParaTemplBox (this, SW_RES( LB_PARA_TEMPL)), aPageTemplLbl (this, SW_RES( FT_PAGE_TEMPL)), aPageTemplBox (this, SW_RES( LB_PAGE_TEMPL)), aCharTemplFL( this, SW_RES(FL_CHAR_TEMPL)), aFtnCharAnchorTemplLbl( this, SW_RES( FT_ANCHR_CHARFMT)), aFtnCharAnchorTemplBox( this, SW_RES( LB_ANCHR_CHARFMT)), aFtnCharTextTemplLbl( this, SW_RES( FT_TEXT_CHARFMT)), aFtnCharTextTemplBox( this, SW_RES( LB_TEXT_CHARFMT)), aContFL (this, SW_RES( FL_CONT )), aContLbl (this, SW_RES( FT_CONT )), aContEdit (this, SW_RES( ED_CONT )), aContFromLbl (this, SW_RES( FT_CONT_FROM )), aContFromEdit (this, SW_RES( ED_CONT_FROM )), aNumDoc(aNumCountBox.GetEntry(FTNNUM_DOC)), aNumPage(aNumCountBox.GetEntry(FTNNUM_PAGE)), aNumChapter(aNumCountBox.GetEntry(FTNNUM_CHAPTER)), pSh( 0 ), bPosDoc(sal_False), bEndNote( bEN ) { FreeResource(); aPosPageBox.SetClickHdl(LINK(this, SwEndNoteOptionPage, PosPageHdl)); aPosChapterBox.SetClickHdl(LINK(this, SwEndNoteOptionPage, PosChapterHdl)); aNumCountBox.SetSelectHdl(LINK(this, SwEndNoteOptionPage, NumCountHdl)); aPosPageBox.SetAccessibleRelationMemberOf(&aPosFT); aPosChapterBox.SetAccessibleRelationMemberOf(&aPosFT); } void SwEndNoteOptionPage::Reset( const SfxItemSet& ) { SwEndNoteInfo *pInf = bEndNote ? new SwEndNoteInfo( pSh->GetEndNoteInfo() ) : new SwFtnInfo( pSh->GetFtnInfo() ); SfxObjectShell * pDocSh = SfxObjectShell::Current(); sal_uInt16 i; if(PTR_CAST(SwWebDocShell, pDocSh)) { aParaTemplLbl .Hide(); aParaTemplBox .Hide(); aPageTemplLbl .Hide(); aPageTemplBox .Hide(); aFtnCharTextTemplLbl.Hide(); aFtnCharTextTemplBox.Hide(); aFtnCharAnchorTemplLbl.Hide(); aFtnCharAnchorTemplBox.Hide(); aCharTemplFL .Hide(); aTemplFL .Hide(); } if ( bEndNote ) { aPosPageBox.Hide(); aPosChapterBox.Hide(); aNumCountBox.Hide(); aContLbl.Hide(); aContEdit.Hide(); aContFromLbl.Hide(); aContFromEdit.Hide(); aContFL.Hide(); bPosDoc = sal_True; } else { const SwFtnInfo &rInf = pSh->GetFtnInfo(); // Position (Seite, Kapitel) setzen if ( rInf.ePos == FTNPOS_PAGE ) { aPosPageBox.Check(); aPageTemplLbl.Enable(sal_False); aPageTemplBox.Enable(sal_False); } else // if ( rInf.ePos == FTNPOS_CHAPTER ) { aPosChapterBox.Check(); aNumCountBox.RemoveEntry(aNumPage); aNumCountBox.RemoveEntry(aNumChapter); bPosDoc = sal_True; } // Verweistexte aContEdit.SetText(rInf.aQuoVadis); aContFromEdit.SetText(rInf.aErgoSum); // gesammelt wo SelectNumbering(rInf.eNum); } // Numerierung // Art aNumViewBox.SelectNumberingType( pInf->aFmt.GetNumberingType()); aOffsetFld.SetValue(pInf->nFtnOffset + 1); aPrefixED.SetText(pInf->GetPrefix()); aSuffixED.SetText(pInf->GetSuffix()); const SwCharFmt* pCharFmt = pInf->GetCharFmt( *pSh->GetView().GetDocShell()->GetDoc()); aFtnCharTextTemplBox.SelectEntry(pCharFmt->GetName()); aFtnCharTextTemplBox.SaveValue(); pCharFmt = pInf->GetAnchorCharFmt( *pSh->GetDoc() ); aFtnCharAnchorTemplBox.SelectEntry( pCharFmt->GetName() ); aFtnCharAnchorTemplBox.SaveValue(); // Vorlagen - Sonderbereiche // Absatz SfxStyleSheetBasePool* pStyleSheetPool = pSh->GetView().GetDocShell()->GetStyleSheetPool(); pStyleSheetPool->SetSearchMask(SFX_STYLE_FAMILY_PARA, SWSTYLEBIT_EXTRA); SfxStyleSheetBase *pStyle = pStyleSheetPool->First(); while(pStyle) { aParaTemplBox.InsertEntry(pStyle->GetName()); pStyle = pStyleSheetPool->Next(); } String sStr; SwStyleNameMapper::FillUIName( static_cast< sal_uInt16 >(bEndNote ? RES_POOLCOLL_ENDNOTE : RES_POOLCOLL_FOOTNOTE), sStr ); if(LISTBOX_ENTRY_NOTFOUND == aParaTemplBox.GetEntryPos( sStr ) ) aParaTemplBox.InsertEntry( sStr ); SwTxtFmtColl* pColl = pInf->GetFtnTxtColl(); if( !pColl ) aParaTemplBox.SelectEntry( sStr ); // Default else { ASSERT(!pColl->IsDefault(), "Defaultvorlage fuer Fussnoten ist falsch."); const sal_uInt16 nPos = aParaTemplBox.GetEntryPos(pColl->GetName()); if( LISTBOX_ENTRY_NOTFOUND != nPos ) aParaTemplBox.SelectEntryPos( nPos ); else { aParaTemplBox.InsertEntry(pColl->GetName()); aParaTemplBox.SelectEntry(pColl->GetName()); } } // Seite for( i = RES_POOLPAGE_BEGIN; i < RES_POOLPAGE_END; ++i ) aPageTemplBox.InsertEntry(SwStyleNameMapper::GetUIName( i, aEmptyStr )); sal_uInt16 nCount = pSh->GetPageDescCnt(); for(i = 0; i < nCount; ++i) { const SwPageDesc &rPageDesc = pSh->GetPageDesc(i); if(LISTBOX_ENTRY_NOTFOUND == aPageTemplBox.GetEntryPos(rPageDesc.GetName())) aPageTemplBox.InsertEntry(rPageDesc.GetName()); } aPageTemplBox.SelectEntry( pInf->GetPageDesc( *pSh->GetDoc() )->GetName()); delete pInf; } SwEndNoteOptionPage::~SwEndNoteOptionPage() { } SfxTabPage *SwEndNoteOptionPage::Create( Window *pParent, const SfxItemSet &rSet ) { return new SwEndNoteOptionPage( pParent, sal_True, rSet ); } /*------------------------------------------------------------------------ Beschreibung: Unterschiedliche Arten der Numerierung; da die Listbox unterschiedlich viele Eintraege hat, hier Funktionen fuer das Setzen und Erfragen der gemeinten Art der Numerierung. ------------------------------------------------------------------------*/ void SwEndNoteOptionPage::SelectNumbering(int eNum) { String sSelect; switch(eNum) { case FTNNUM_DOC: sSelect = aNumDoc; break; case FTNNUM_PAGE: sSelect = aNumPage; break; case FTNNUM_CHAPTER: sSelect = aNumChapter; break; #ifdef DBG_UTIL default: DBG_ERROR("Which numbering type?"); #endif } aNumCountBox.SelectEntry(sSelect); NumCountHdl( &aNumCountBox ); } int SwEndNoteOptionPage::GetNumbering() const { const sal_uInt16 nPos = aNumCountBox.GetSelectEntryPos(); return (int) bPosDoc? nPos + 1: nPos; } /*-----------------09.02.98 11:17------------------- --------------------------------------------------*/ void SwEndNoteOptionPage::SetShell( SwWrtShell &rShell ) { pSh = &rShell; // Zeichenvorlagen sammeln aFtnCharTextTemplBox.Clear(); aFtnCharAnchorTemplBox.Clear(); ::FillCharStyleListBox(aFtnCharTextTemplBox, pSh->GetView().GetDocShell()); ::FillCharStyleListBox(aFtnCharAnchorTemplBox, pSh->GetView().GetDocShell()); } /*------------------------------------------------------------------------ Beschreibung: Handler hinter dem Button fuer Sammeln der Fussnote auf der Seite. In diesem Fall koennen alle Numerierungsarten verwendet werden. ------------------------------------------------------------------------*/ IMPL_LINK( SwEndNoteOptionPage, PosPageHdl, Button *, EMPTYARG ) { const SwFtnNum eNum = (const SwFtnNum)GetNumbering(); bPosDoc = sal_False; if(LISTBOX_ENTRY_NOTFOUND == aNumCountBox.GetEntryPos(aNumPage)) { aNumCountBox.InsertEntry(aNumPage, FTNNUM_PAGE); aNumCountBox.InsertEntry(aNumChapter, FTNNUM_CHAPTER); SelectNumbering(eNum); } aPageTemplLbl.Enable(sal_False); aPageTemplBox.Enable(sal_False); return 0; } /*------------------------------------------------------------------------ Beschreibung: ------------------------------------------------------------------------*/ IMPL_LINK( SwEndNoteOptionPage, NumCountHdl, ListBox*, EMPTYARG ) { sal_Bool bEnable = sal_True; if( aNumCountBox.GetEntryCount() - 1 != aNumCountBox.GetSelectEntryPos() ) { bEnable = sal_False; aOffsetFld.SetValue(1); } aOffsetLbl.Enable(bEnable); aOffsetFld.Enable(bEnable); return 0; } /*------------------------------------------------------------------------ Beschreibung: Handler hinter dem Button fuer Sammeln der Fussnote am Kapitel oder Dokumentende. In diesem Fall kann keine seitenweise Numerierung verwendet werden. ------------------------------------------------------------------------*/ IMPL_LINK_INLINE_START( SwEndNoteOptionPage, PosChapterHdl, Button *, EMPTYARG ) { if ( !bPosDoc ) SelectNumbering(FTNNUM_DOC); bPosDoc = sal_True; aNumCountBox.RemoveEntry(aNumPage); aNumCountBox.RemoveEntry(aNumChapter); aPageTemplLbl.Enable(); aPageTemplBox.Enable(); return 0; } IMPL_LINK_INLINE_END( SwEndNoteOptionPage, PosChapterHdl, Button *, EMPTYARG ) SwCharFmt* lcl_GetCharFormat( SwWrtShell* pSh, const String& rCharFmtName ) { SwCharFmt* pFmt = 0; sal_uInt16 nChCount = pSh->GetCharFmtCount(); for(sal_uInt16 i = 0; i< nChCount; i++) { SwCharFmt& rChFmt = pSh->GetCharFmt(i); if(rChFmt.GetName() == rCharFmtName ) { pFmt = &rChFmt; break; } } if(!pFmt) { SfxStyleSheetBasePool* pPool = pSh->GetView().GetDocShell()->GetStyleSheetPool(); SfxStyleSheetBase* pBase; pBase = pPool->Find(rCharFmtName, SFX_STYLE_FAMILY_CHAR); if(!pBase) pBase = &pPool->Make(rCharFmtName, SFX_STYLE_FAMILY_CHAR); pFmt = ((SwDocStyleSheet*)pBase)->GetCharFmt(); } return pFmt; } sal_Bool SwEndNoteOptionPage::FillItemSet( SfxItemSet & ) { SwEndNoteInfo *pInf = bEndNote ? new SwEndNoteInfo() : new SwFtnInfo(); pInf->nFtnOffset = static_cast< sal_uInt16 >(aOffsetFld.GetValue() -1); pInf->aFmt.SetNumberingType(aNumViewBox.GetSelectedNumberingType() ); pInf->SetPrefix(aPrefixED.GetText()); pInf->SetSuffix(aSuffixED.GetText()); pInf->SetCharFmt( lcl_GetCharFormat( pSh, aFtnCharTextTemplBox.GetSelectEntry() ) ); pInf->SetAnchorCharFmt( lcl_GetCharFormat( pSh, aFtnCharAnchorTemplBox.GetSelectEntry() ) ); // Absatzvorlage sal_uInt16 nPos = aParaTemplBox.GetSelectEntryPos(); if(LISTBOX_ENTRY_NOTFOUND != nPos) { const String aFmtName( aParaTemplBox.GetSelectEntry() ); SwTxtFmtColl *pColl = pSh->GetParaStyle(aFmtName, SwWrtShell::GETSTYLE_CREATEANY); ASSERT(pColl, "Absatzvorlage nicht gefunden."); pInf->SetFtnTxtColl(*pColl); } // Seitenvorlage pInf->ChgPageDesc( pSh->FindPageDescByName( aPageTemplBox.GetSelectEntry(), sal_True ) ); if ( bEndNote ) { if ( !(*pInf == pSh->GetEndNoteInfo()) ) pSh->SetEndNoteInfo( *pInf ); } else { SwFtnInfo *pI = (SwFtnInfo*)pInf; pI->ePos = aPosPageBox.IsChecked() ? FTNPOS_PAGE : FTNPOS_CHAPTER; pI->eNum = (SwFtnNum)GetNumbering(); pI->aQuoVadis = aContEdit.GetText(); pI->aErgoSum = aContFromEdit.GetText(); if ( !(*pI == pSh->GetFtnInfo()) ) pSh->SetFtnInfo( *pI ); } delete pInf; return sal_True; } SwFootNoteOptionPage::SwFootNoteOptionPage( Window *pParent, const SfxItemSet &rSet ) : SwEndNoteOptionPage( pParent, sal_False, rSet ) { } SwFootNoteOptionPage::~SwFootNoteOptionPage() { } SfxTabPage *SwFootNoteOptionPage::Create(Window *pParent, const SfxItemSet &rSet ) { return new SwFootNoteOptionPage( pParent, rSet ); }