xref: /AOO41X/main/sw/source/ui/misc/docfnote.cxx (revision efeef26f81c84063fb0a91bde3856d4a51172d90)
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 
SwFootNoteOptionDlg(Window * pParent,SwWrtShell & rS)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 
PageCreated(sal_uInt16,SfxTabPage & rPage)80 void SwFootNoteOptionDlg::PageCreated( sal_uInt16 /*nId*/, SfxTabPage &rPage )
81 {
82     ((SwEndNoteOptionPage&)rPage).SetShell( rSh );
83 }
84 
~SwFootNoteOptionDlg()85 SwFootNoteOptionDlg::~SwFootNoteOptionDlg()
86 {
87 }
88 
IMPL_LINK(SwFootNoteOptionDlg,OkHdl,Button *,pBtn)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 
SwEndNoteOptionPage(Window * pParent,sal_Bool bEN,const SfxItemSet & rSet)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 
Reset(const SfxItemSet &)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 
~SwEndNoteOptionPage()282 SwEndNoteOptionPage::~SwEndNoteOptionPage()
283 {
284 }
285 
Create(Window * pParent,const SfxItemSet & rSet)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 ------------------------------------------------------------------------*/
SelectNumbering(int eNum)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 
GetNumbering() const322 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 --------------------------------------------------*/
SetShell(SwWrtShell & rShell)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 
IMPL_LINK(SwEndNoteOptionPage,PosPageHdl,Button *,EMPTYARG)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 
IMPL_LINK(SwEndNoteOptionPage,NumCountHdl,ListBox *,EMPTYARG)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 
IMPL_LINK_INLINE_START(SwEndNoteOptionPage,PosChapterHdl,Button *,EMPTYARG)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 }
IMPL_LINK_INLINE_END(SwEndNoteOptionPage,PosChapterHdl,Button *,EMPTYARG)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 
FillItemSet(SfxItemSet &)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 
SwFootNoteOptionPage(Window * pParent,const SfxItemSet & rSet)480 SwFootNoteOptionPage::SwFootNoteOptionPage( Window *pParent, const SfxItemSet &rSet ) :
481     SwEndNoteOptionPage( pParent, sal_False, rSet )
482 {
483 }
484 
~SwFootNoteOptionPage()485 SwFootNoteOptionPage::~SwFootNoteOptionPage()
486 {
487 }
488 
Create(Window * pParent,const SfxItemSet & rSet)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