xref: /trunk/main/sd/source/ui/dlg/headerfooterdlg.cxx (revision 1ecadb572e7010ff3b3382ad9bf179dbc6efadbb)
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_sd.hxx"
30 
31 #ifdef SD_DLLIMPLEMENTATION
32 #undef SD_DLLIMPLEMENTATION
33 #endif
34 
35 #ifndef _SVX_DIALOGS_HRC
36 #include <svx/dialogs.hrc>
37 #endif
38 #include <editeng/eeitem.hxx>
39 #include <editeng/flditem.hxx>
40 #include <editeng/langitem.hxx>
41 #include <svx/langbox.hxx>
42 #include <svx/svdotext.hxx>
43 #include <editeng/editeng.hxx>
44 #include <sfx2/viewfrm.hxx>
45 
46 #ifndef _SD_SDRESID_HXX
47 #include "sdresid.hxx"
48 #endif
49 
50 #include <vcl/fixed.hxx>
51 #include <vcl/button.hxx>
52 #include <vcl/edit.hxx>
53 #include <vcl/combobox.hxx>
54 
55 #include "helpids.h"
56 #include "Outliner.hxx"
57 #include "dialogs.hrc"
58 #include "headerfooterdlg.hxx"
59 #include "DrawDocShell.hxx"
60 #include "drawdoc.hxx"
61 #include "ViewShell.hxx"
62 
63 ///////////////////////////////////////////////////////////////////////
64 // preview control for presentation layout
65 ///////////////////////////////////////////////////////////////////////
66 #include <vcl/ctrl.hxx>
67 #ifndef _SV_COLOR_HXX
68 #include <tools/color.hxx>
69 #endif
70 #include <i18npool/mslangid.hxx>
71 #include <svtools/colorcfg.hxx>
72 #include <svx/xlndsit.hxx>
73 #include <svx/xlineit0.hxx>
74 #include <svx/xlnclit.hxx>
75 #include <vcl/decoview.hxx>
76 
77 #include "undoheaderfooter.hxx"
78 #include "sdundogr.hxx"
79 #include "ViewShell.hxx"
80 
81 #include <basegfx/matrix/b2dhommatrix.hxx>
82 #include <basegfx/polygon/b2dpolygontools.hxx>
83 #include <basegfx/polygon/b2dpolypolygontools.hxx>
84 
85 namespace sd
86 {
87 
88 class PresLayoutPreview : public Control
89 {
90 private:
91     SdPage* mpMaster;
92     HeaderFooterSettings maSettings;
93     Size maPageSize;
94     Rectangle maOutRect;
95 
96 private:
97     void Paint( OutputDevice& aOut, SdrTextObj* pObj, bool bVisible, bool bDotted = false );
98 
99 public:
100     PresLayoutPreview( ::Window* pParent, const ResId& rResId, SdPage* pMaster );
101     ~PresLayoutPreview();
102 
103     virtual void Paint( const Rectangle& rRect );
104 
105     void update( HeaderFooterSettings& rSettings );
106 };
107 
108 }
109 
110 ///////////////////////////////////////////////////////////////////////
111 // tab page for slide & header'n'notes
112 ///////////////////////////////////////////////////////////////////////
113 
114 namespace sd
115 {
116 
117 const int nDateTimeFormatsCount = 10;
118 int nDateTimeFormats[nDateTimeFormatsCount] =
119 {
120     SVXDATEFORMAT_A,
121     SVXDATEFORMAT_F,
122     SVXDATEFORMAT_D,
123     SVXDATEFORMAT_C,
124 
125     SVXDATEFORMAT_A | (SVXTIMEFORMAT_24_HM << 4),
126     SVXDATEFORMAT_A | (SVXTIMEFORMAT_12_HM << 4),
127 
128     (SVXTIMEFORMAT_24_HM << 4),
129     (SVXTIMEFORMAT_24_HMS <<4),
130 
131     (SVXTIMEFORMAT_12_HM << 4 ),
132     (SVXTIMEFORMAT_12_HMS << 4 )
133 };
134 
135 class HeaderFooterTabPage : public TabPage
136 {
137 private:
138     FixedLine   maFLIncludeOnPage;
139 
140     CheckBox    maCBHeader;
141     FixedText   maFTHeader;
142     Edit        maTBHeader;
143 
144     FixedLine   maFLDateTime;
145     CheckBox    maCBDateTime;
146     RadioButton maRBDateTimeFixed;
147     RadioButton maRBDateTimeAutomatic;
148     Edit        maTBDateTimeFixed;
149     ListBox     maCBDateTimeFormat;
150     FixedText   maFTDateTimeLanguage;
151     SvxLanguageBox  maCBDateTimeLanguage;
152 
153     FixedLine   maFLFooter;
154     CheckBox    maCBFooter;
155     FixedText   maFTFooter;
156     Edit        maTBFooter;
157 
158     FixedLine   maFLSlideNumber;
159     CheckBox    maCBSlideNumber;
160 
161     FixedLine   maFLNotOnTitle;
162     CheckBox    maCBNotOnTitle;
163 
164     PushButton      maPBApplyToAll;
165     PushButton      maPBApply;
166     CancelButton    maPBCancel;
167     HelpButton      maPBHelp;
168 
169     PresLayoutPreview   maCTPreview;
170 
171     SdPage*             mpCurrentPage;
172     SdDrawDocument *    mpDoc;
173     HeaderFooterDialog* mpDialog;
174     LanguageType        meOldLanguage;
175 
176     bool            mbHandoutMode;
177 
178     DECL_LINK( UpdateOnClickHdl, void * );
179 
180     DECL_LINK( ClickApplyToAllHdl, void * );
181     DECL_LINK( ClickApplyHdl, void * );
182     DECL_LINK( ClickCancelHdl, void * );
183 
184     DECL_LINK( LanguageChangeHdl, void * );
185 
186     void FillFormatList(int eFormat);
187     void GetOrSetDateTimeLanguage( LanguageType &rLanguage, bool bSet );
188     void GetOrSetDateTimeLanguage( LanguageType &rLanguage, bool bSet, SdPage* pPage );
189 
190 public:
191     HeaderFooterTabPage( HeaderFooterDialog* pDialog, ::Window* pParent, SdDrawDocument* pDoc, SdPage* pActualPage, bool bHandoutMode );
192     ~HeaderFooterTabPage();
193 
194     static  SfxTabPage* Create( ::Window*, const SfxItemSet& );
195     static  sal_uInt16*    GetRanges();
196 
197     void    init( const HeaderFooterSettings& rSettings, bool bNotOnTitle, bool bHasApply );
198     void    getData( HeaderFooterSettings& rSettings, bool& rNotOnTitle );
199     void    update();
200 };
201 
202 }
203 
204 ///////////////////////////////////////////////////////////////////////
205 
206 using namespace ::sd;
207 
208 
209 HeaderFooterDialog::HeaderFooterDialog( ViewShell* pViewShell, ::Window* pParent, SdDrawDocument* pDoc, SdPage* pCurrentPage ) :
210         TabDialog ( pParent, SdResId( RID_SD_DLG_HEADERFOOTER ) ),
211         maTabCtrl( this, SdResId( 1 ) ),
212         mpDoc( pDoc ),
213         mpCurrentPage( pCurrentPage ),
214         mpViewShell( pViewShell )
215 {
216     FreeResource();
217 
218     SdPage* pSlide;
219     SdPage* pNotes;
220     if( pCurrentPage->GetPageKind() == PK_STANDARD )
221     {
222         pSlide = pCurrentPage;
223         pNotes = (SdPage*)pDoc->GetPage( pCurrentPage->GetPageNum() + 1 );
224     }
225     else if( pCurrentPage->GetPageKind() == PK_NOTES )
226     {
227         pNotes = pCurrentPage;
228         pSlide = (SdPage*)pDoc->GetPage( pCurrentPage->GetPageNum() -1 );
229         mpCurrentPage = pSlide;
230     }
231     else
232     {
233         // handout
234         pSlide = pDoc->GetSdPage( 0, PK_STANDARD );
235         pNotes = pDoc->GetSdPage( 0, PK_NOTES );
236         mpCurrentPage = NULL;
237     }
238 
239 //  maTabCtrl.SetHelpId( HID_XML_FILTER_TABPAGE_CTRL );
240     maTabCtrl.Show();
241 
242     mpSlideTabPage = new HeaderFooterTabPage( this, &maTabCtrl, pDoc, pSlide, false );
243     mpSlideTabPage->SetHelpId( HID_SD_TABPAGE_HEADERFOOTER_SLIDE );
244     maTabCtrl.SetTabPage( RID_SD_TABPAGE_HEADERFOOTER_SLIDE, mpSlideTabPage );
245 
246     Size aSiz = mpSlideTabPage->GetSizePixel();
247     Size aCtrlSiz = maTabCtrl.GetOutputSizePixel();
248     // set size on TabControl only if smaller than TabPage
249     if ( aCtrlSiz.Width() < aSiz.Width() || aCtrlSiz.Height() < aSiz.Height() )
250     {
251         maTabCtrl.SetOutputSizePixel( aSiz );
252         aCtrlSiz = aSiz;
253     }
254 
255     mpNotesHandoutsTabPage = new HeaderFooterTabPage( this, &maTabCtrl, pDoc, pNotes, true );
256     mpNotesHandoutsTabPage->SetHelpId( HID_SD_TABPAGE_HEADERFOOTER_NOTESHANDOUT );
257     maTabCtrl.SetTabPage( RID_SD_TABPAGE_HEADERFOOTER_NOTESHANDOUT, mpNotesHandoutsTabPage );
258 
259     aSiz = mpNotesHandoutsTabPage->GetSizePixel();
260     if ( aCtrlSiz.Width() < aSiz.Width() || aCtrlSiz.Height() < aSiz.Height() )
261     {
262         maTabCtrl.SetOutputSizePixel( aSiz );
263         aCtrlSiz = aSiz;
264     }
265 
266     ActivatePageHdl( &maTabCtrl );
267 
268     AdjustLayout();
269 
270     maTabCtrl.SetActivatePageHdl( LINK( this, HeaderFooterDialog, ActivatePageHdl ) );
271     maTabCtrl.SetDeactivatePageHdl( LINK( this, HeaderFooterDialog, DeactivatePageHdl ) );
272 
273     maSlideSettings = pSlide->getHeaderFooterSettings();
274 
275     const HeaderFooterSettings& rTitleSettings = mpDoc->GetSdPage(0, PK_STANDARD)->getHeaderFooterSettings();
276     bool bNotOnTitle = !rTitleSettings.mbFooterVisible && !rTitleSettings.mbSlideNumberVisible && !rTitleSettings.mbDateTimeVisible;
277 
278     mpSlideTabPage->init( maSlideSettings, bNotOnTitle, mpCurrentPage != NULL );
279 
280     maNotesHandoutSettings = pNotes->getHeaderFooterSettings();
281     mpNotesHandoutsTabPage->init( maNotesHandoutSettings, false, false );
282 }
283 
284 // -----------------------------------------------------------------------
285 
286 HeaderFooterDialog::~HeaderFooterDialog()
287 {
288     delete mpSlideTabPage;
289     delete mpNotesHandoutsTabPage;
290 }
291 
292 // -----------------------------------------------------------------------
293 
294 IMPL_LINK( HeaderFooterDialog, ActivatePageHdl, TabControl *, pTabCtrl )
295 {
296     const sal_uInt16 nId = pTabCtrl->GetCurPageId();
297     TabPage* pTabPage = pTabCtrl->GetTabPage( nId );
298     pTabPage->Show();
299 
300     return 0;
301 }
302 
303 // -----------------------------------------------------------------------
304 
305 IMPL_LINK( HeaderFooterDialog, DeactivatePageHdl, TabControl *, EMPTYARG )
306 {
307     return sal_True;
308 }
309 
310 // -----------------------------------------------------------------------
311 
312 short HeaderFooterDialog::Execute()
313 {
314     sal_uInt16 nRet = TabDialog::Execute();
315     if( nRet )
316         mpViewShell->GetDocSh()->SetModified();
317     return nRet;
318 }
319 
320 // -----------------------------------------------------------------------
321 
322 void HeaderFooterDialog::ApplyToAll( TabPage* pPage )
323 {
324     apply( true, pPage == mpSlideTabPage );
325     EndDialog(1);
326 }
327 
328 // -----------------------------------------------------------------------
329 
330 void HeaderFooterDialog::Apply( TabPage* pPage )
331 {
332     apply( false, pPage == mpSlideTabPage );
333     EndDialog(1);
334 }
335 
336 // -----------------------------------------------------------------------
337 
338 void HeaderFooterDialog::Cancel( TabPage* )
339 {
340     EndDialog();
341 }
342 
343 // -----------------------------------------------------------------------
344 
345 void HeaderFooterDialog::apply( bool bToAll, bool bForceSlides )
346 {
347     SdUndoGroup* pUndoGroup = new SdUndoGroup(mpDoc);
348     String aComment( GetText() );
349     pUndoGroup->SetComment( aComment );
350 
351     HeaderFooterSettings aNewSettings;
352     bool bNewNotOnTitle;
353 
354     // change slide settings first ...
355 
356     mpSlideTabPage->getData( aNewSettings, bNewNotOnTitle );
357 
358     // only if we pressed apply or apply all on the slide tab page or if the slide settings
359     // have been changed
360     if( bForceSlides || !(aNewSettings == maSlideSettings) )
361     {
362         // apply to all slides
363         if( bToAll )
364         {
365             int nPageCount = mpDoc->GetSdPageCount( PK_STANDARD );
366             int nPage;
367             for( nPage = 0; nPage < nPageCount; nPage++ )
368             {
369                 SdPage* pPage = mpDoc->GetSdPage( (sal_uInt16)nPage, PK_STANDARD );
370                 change( pUndoGroup, pPage, aNewSettings );
371             }
372         }
373         else
374         {
375             // apply only to the current slide
376             DBG_ASSERT( mpCurrentPage && mpCurrentPage->GetPageKind() == PK_STANDARD, "no current page to apply to!" );
377             if( mpCurrentPage && (mpCurrentPage->GetPageKind() == PK_STANDARD) )
378             {
379                 change( pUndoGroup, mpCurrentPage, aNewSettings );
380             }
381         }
382     }
383 
384     // if we don't want to have header&footer on the first slide
385     if( bNewNotOnTitle )
386     {
387         // just hide them, plain simple UI feature
388         HeaderFooterSettings aTempSettings = mpDoc->GetSdPage( 0, PK_STANDARD )->getHeaderFooterSettings();
389 
390         aTempSettings.mbFooterVisible = false;
391         aTempSettings.mbSlideNumberVisible = false;
392         aTempSettings.mbDateTimeVisible = false;
393 
394         change( pUndoGroup, mpDoc->GetSdPage( 0, PK_STANDARD ), aTempSettings );
395     }
396 
397     // now notes settings
398 
399     mpNotesHandoutsTabPage->getData( aNewSettings, bNewNotOnTitle );
400 
401     // only if we pressed apply or apply all on the notes tab page or if the notes settings
402     // have been changed
403     if( !bForceSlides || !(aNewSettings == maNotesHandoutSettings) )
404     {
405         // first set to all notes pages
406         int nPageCount = mpDoc->GetSdPageCount( PK_NOTES );
407         int nPage;
408         for( nPage = 0; nPage < nPageCount; nPage++ )
409         {
410             SdPage* pPage = mpDoc->GetSdPage( (sal_uInt16)nPage, PK_NOTES );
411 
412             change( pUndoGroup, pPage, aNewSettings );
413         }
414 
415         // and last but not least to the handout page
416         change( pUndoGroup, mpDoc->GetMasterSdPage( 0, PK_HANDOUT ), aNewSettings );
417     }
418 
419     // Undo Gruppe dem Undo Manager uebergeben
420     mpViewShell->GetViewFrame()->GetObjectShell()->GetUndoManager()->AddUndoAction(pUndoGroup);
421 }
422 
423 // -----------------------------------------------------------------------
424 
425 void HeaderFooterDialog::change( SdUndoGroup* pUndoGroup, SdPage* pPage, const HeaderFooterSettings& rNewSettings )
426 {
427     pUndoGroup->AddAction(new SdHeaderFooterUndoAction(mpDoc, pPage, rNewSettings ));
428     pPage->setHeaderFooterSettings( rNewSettings );
429 }
430 
431 ///////////////////////////////////////////////////////////////////////
432 
433 inline void moveY( ::Window& rWin, int deltaY )
434 {
435     Point aPos = rWin.GetPosPixel();
436     aPos.Y() += deltaY;
437     rWin.SetPosPixel( aPos );
438 }
439 
440 HeaderFooterTabPage::HeaderFooterTabPage( HeaderFooterDialog* pDialog, ::Window* pWindow, SdDrawDocument* pDoc, SdPage* pActualPage, bool bHandoutMode ) :
441         TabPage( pWindow, SdResId( RID_SD_TABPAGE_HEADERFOOTER ) ),
442         maFLIncludeOnPage( this, SdResId( FL_INCLUDE_ON_PAGE ) ),
443         maCBHeader( this, SdResId( CB_HEADER ) ),
444         maFTHeader( this, SdResId( FT_HEADER ) ),
445         maTBHeader( this, SdResId( TB_HEADER_FIXED ) ),
446         maFLDateTime( this, SdResId( FL_DATETIME ) ),
447         maCBDateTime( this, SdResId( CB_DATETIME ) ),
448         maRBDateTimeFixed( this, SdResId( RB_DATETIME_FIXED ) ),
449         maRBDateTimeAutomatic( this, SdResId( RB_DATETIME_AUTOMATIC ) ),
450         maTBDateTimeFixed( this, SdResId( TB_DATETIME_FIXED ) ),
451         maCBDateTimeFormat( this, SdResId( CB_DATETIME_FORMAT ) ),
452         maFTDateTimeLanguage( this, SdResId( FT_DATETIME_LANGUAGE ) ),
453         maCBDateTimeLanguage( this, SdResId( CB_DATETIME_LANGUAGE ) ),
454 
455         maFLFooter( this, SdResId( FL_FOOTER ) ),
456         maCBFooter( this, SdResId( CB_FOOTER ) ),
457         maFTFooter( this, SdResId( FT_FOOTER ) ),
458         maTBFooter( this, SdResId( TB_FOOTER_FIXED ) ),
459 
460         maFLSlideNumber( this, SdResId( FL_SLIDENUMBER ) ),
461         maCBSlideNumber( this, SdResId( CB_SLIDENUMBER ) ),
462 
463         maFLNotOnTitle( this, SdResId( FL_NOTONTITLE ) ),
464         maCBNotOnTitle( this, SdResId( CB_NOTONTITLE ) ),
465 
466         maPBApplyToAll( this, SdResId( BT_APPLYTOALL ) ),
467         maPBApply( this, SdResId( BT_APPLY ) ),
468         maPBCancel( this, SdResId( BT_CANCEL ) ),
469         maPBHelp( this, SdResId( BT_HELP ) ),
470 
471         maCTPreview( this, SdResId( CT_PREVIEW ),
472             pActualPage ?
473                 (pActualPage->IsMasterPage() ? pActualPage : (SdPage*)(&(pActualPage->TRG_GetMasterPage()))) :
474                 (pDoc->GetMasterSdPage( 0, bHandoutMode ? PK_NOTES : PK_STANDARD )) ),
475         mpCurrentPage(pActualPage),
476         mpDoc(pDoc),
477         mpDialog(pDialog),
478         mbHandoutMode( bHandoutMode )
479 
480 {
481     pDoc->StopWorkStartupDelay();
482 
483     if( !mbHandoutMode )
484     {
485         int deltaY = maCBHeader.GetPosPixel().Y() - maCBDateTime.GetPosPixel().Y();
486 
487         moveY( maCBDateTime, deltaY );
488         moveY( maRBDateTimeFixed, deltaY );
489         moveY( maRBDateTimeAutomatic, deltaY );
490         moveY( maTBDateTimeFixed, deltaY );
491         moveY( maCBDateTimeFormat, deltaY );
492         moveY( maFTDateTimeLanguage, deltaY );
493         moveY( maCBDateTimeLanguage, deltaY );
494         moveY( maFLFooter, deltaY );
495         moveY( maCBFooter, deltaY );
496         moveY( maFTFooter, deltaY );
497         moveY( maTBFooter, deltaY );
498         moveY( maFLSlideNumber, deltaY );
499         moveY( maCBSlideNumber, deltaY );
500         moveY( maFLNotOnTitle, deltaY );
501         moveY( maCBNotOnTitle, deltaY );
502     }
503     else
504     {
505         int deltaY = maPBApply.GetPosPixel().Y() - maPBCancel.GetPosPixel().Y();
506 
507         moveY( maPBCancel, deltaY );
508         moveY( maPBHelp, deltaY );
509 
510         String aPageNumberStr( SdResId( STR_PAGE_NUMBER ) );
511         maCBSlideNumber.SetText( aPageNumberStr );
512 
513         String aIncludeOnPageStr( SdResId( STR_INCLUDE_ON_PAGE ) );
514         maFLIncludeOnPage.SetText( aIncludeOnPageStr );
515     }
516 
517     FreeResource();
518 
519     maPBApply.Show( !mbHandoutMode );
520     maCBHeader.Show( mbHandoutMode );
521     maFTHeader.Show( mbHandoutMode );
522     maTBHeader.Show( mbHandoutMode );
523     maFLDateTime.Show( mbHandoutMode );
524     maFLNotOnTitle.Show( !mbHandoutMode );
525     maCBNotOnTitle.Show( !mbHandoutMode );
526 
527     maCBDateTime.SetClickHdl( LINK( this, HeaderFooterTabPage, UpdateOnClickHdl ) );
528     maRBDateTimeFixed.SetClickHdl( LINK( this, HeaderFooterTabPage, UpdateOnClickHdl ) );
529     maRBDateTimeAutomatic.SetClickHdl( LINK( this, HeaderFooterTabPage, UpdateOnClickHdl ) );
530     maCBFooter.SetClickHdl( LINK( this, HeaderFooterTabPage, UpdateOnClickHdl ) );
531     maCBHeader.SetClickHdl( LINK( this, HeaderFooterTabPage, UpdateOnClickHdl ) );
532     maCBSlideNumber.SetClickHdl( LINK( this, HeaderFooterTabPage, UpdateOnClickHdl ) );
533 
534     maPBApplyToAll.SetClickHdl( LINK( this, HeaderFooterTabPage, ClickApplyToAllHdl ) );
535     maPBApply.SetClickHdl( LINK( this, HeaderFooterTabPage, ClickApplyHdl ) );
536     maPBCancel.SetClickHdl( LINK( this, HeaderFooterTabPage, ClickCancelHdl ) );
537 
538     maCBDateTimeLanguage.SetLanguageList( LANG_LIST_ALL|LANG_LIST_ONLY_KNOWN, false );
539     maCBDateTimeLanguage.SetSelectHdl( LINK( this, HeaderFooterTabPage, LanguageChangeHdl ) );
540 
541     GetOrSetDateTimeLanguage( meOldLanguage, false );
542     meOldLanguage = MsLangId::getRealLanguage( meOldLanguage );
543     maCBDateTimeLanguage.SelectLanguage( meOldLanguage );
544 
545     FillFormatList(SVXDATEFORMAT_A);
546 
547     maTBHeader.SetAccessibleRelationMemberOf(&maCBHeader);
548     maRBDateTimeFixed.SetAccessibleRelationMemberOf(&maCBDateTime);
549     maRBDateTimeAutomatic.SetAccessibleRelationMemberOf(&maCBDateTime);
550     maTBDateTimeFixed.SetAccessibleName(maRBDateTimeFixed.GetText());
551     maTBDateTimeFixed.SetAccessibleRelationMemberOf(&maCBDateTime);
552     maTBDateTimeFixed.SetAccessibleRelationLabeledBy(&maRBDateTimeFixed);
553     maCBDateTimeFormat.SetAccessibleRelationMemberOf(&maCBDateTime);
554     maCBDateTimeFormat.SetAccessibleName(maRBDateTimeAutomatic.GetText());
555     maCBDateTimeFormat.SetAccessibleRelationLabeledBy(&maRBDateTimeAutomatic);
556     maCBDateTimeLanguage.SetAccessibleRelationMemberOf(&maCBDateTime);
557     maTBFooter.SetAccessibleRelationMemberOf(&maCBFooter);
558     maCBSlideNumber.SetAccessibleRelationMemberOf(&maFLIncludeOnPage);
559     maCBFooter.SetAccessibleRelationMemberOf(&maFLIncludeOnPage);
560 }
561 // -----------------------------------------------------------------------
562 
563 HeaderFooterTabPage::~HeaderFooterTabPage()
564 {
565 }
566 
567 // -----------------------------------------------------------------------
568 
569 IMPL_LINK( HeaderFooterTabPage, LanguageChangeHdl, void *, EMPTYARG )
570 {
571     FillFormatList( (int)(sal_IntPtr)maCBDateTimeFormat.GetEntryData( maCBDateTimeFormat.GetSelectEntryPos() ) );
572 
573 
574     return 0L;
575 }
576 
577 // -----------------------------------------------------------------------
578 
579 void HeaderFooterTabPage::FillFormatList( int eFormat )
580 {
581     LanguageType eLanguage = maCBDateTimeLanguage.GetSelectLanguage();
582 
583     maCBDateTimeFormat.Clear();
584 
585     Date aDate;
586     Time aTime;
587 
588     int nFormat;
589     for( nFormat = 0; nFormat < nDateTimeFormatsCount; nFormat++ )
590     {
591         String aStr( SvxDateTimeField::GetFormatted( aDate, aTime, nDateTimeFormats[nFormat], *(SD_MOD()->GetNumberFormatter()), eLanguage ) );
592         sal_uInt16 nEntry = maCBDateTimeFormat.InsertEntry( aStr );
593         maCBDateTimeFormat.SetEntryData( nEntry, (void*)nDateTimeFormats[nFormat] );
594         if( nDateTimeFormats[nFormat] == eFormat )
595         {
596             maCBDateTimeFormat.SelectEntryPos( nEntry );
597             maCBDateTimeFormat.SetText( aStr );
598         }
599     }
600 }
601 
602 // -----------------------------------------------------------------------
603 
604 void HeaderFooterTabPage::init( const HeaderFooterSettings& rSettings, bool bNotOnTitle, bool bHasApply )
605 {
606     maCBDateTime.Check( rSettings.mbDateTimeVisible );
607     maRBDateTimeFixed.Check( rSettings.mbDateTimeIsFixed );
608     maRBDateTimeAutomatic.Check( !rSettings.mbDateTimeIsFixed );
609     maTBDateTimeFixed.SetText( rSettings.maDateTimeText );
610 
611     maCBHeader.Check( rSettings.mbHeaderVisible );
612     maTBHeader.SetText( rSettings.maHeaderText );
613 
614     maCBFooter.Check( rSettings.mbFooterVisible );
615     maTBFooter.SetText( rSettings.maFooterText );
616 
617     maCBSlideNumber.Check( rSettings.mbSlideNumberVisible );
618 
619     maCBNotOnTitle.Check( bNotOnTitle );
620     maPBApply.Enable( bHasApply );
621 
622     maCBDateTimeLanguage.SelectLanguage( meOldLanguage );
623 
624     sal_uInt16 nPos;
625     for( nPos = 0; nPos < maCBDateTimeFormat.GetEntryCount(); nPos++ )
626     {
627         int nFormat = (int)(sal_IntPtr)maCBDateTimeFormat.GetEntryData( nPos );
628         if( nFormat == rSettings.meDateTimeFormat )
629         {
630             maCBDateTimeFormat.SelectEntryPos( nPos );
631             maCBDateTimeFormat.SetText( maCBDateTimeFormat.GetEntry(nPos) );
632             break;
633         }
634     }
635 
636     update();
637 }
638 
639 // -----------------------------------------------------------------------
640 
641 void HeaderFooterTabPage::getData( HeaderFooterSettings& rSettings, bool& rNotOnTitle )
642 {
643     rSettings.mbDateTimeVisible = maCBDateTime.IsChecked();
644     rSettings.mbDateTimeIsFixed = maRBDateTimeFixed.IsChecked();
645     rSettings.maDateTimeText = maTBDateTimeFixed.GetText();
646     rSettings.mbFooterVisible = maCBFooter.IsChecked();
647     rSettings.maFooterText = maTBFooter.GetText();
648     rSettings.mbSlideNumberVisible = maCBSlideNumber.IsChecked();
649     rSettings.mbHeaderVisible = maCBHeader.IsChecked();
650     rSettings.maHeaderText = maTBHeader.GetText();
651 
652     if( maCBDateTimeFormat.GetSelectEntryCount() == 1 )
653         rSettings.meDateTimeFormat = (int)(sal_IntPtr)maCBDateTimeFormat.GetEntryData( maCBDateTimeFormat.GetSelectEntryPos() );
654 
655     LanguageType eLanguage = maCBDateTimeLanguage.GetSelectLanguage();
656     if( eLanguage != meOldLanguage )
657         GetOrSetDateTimeLanguage( eLanguage, true );
658 
659     rNotOnTitle = maCBNotOnTitle.IsChecked();
660 }
661 
662 // -----------------------------------------------------------------------
663 
664 void HeaderFooterTabPage::update()
665 {
666     maRBDateTimeFixed.Enable( maCBDateTime.IsChecked() );
667     maTBDateTimeFixed.Enable( maRBDateTimeFixed.IsChecked() && maCBDateTime.IsChecked() );
668     maRBDateTimeAutomatic.Enable( maCBDateTime.IsChecked() );
669     maCBDateTimeFormat.Enable( maCBDateTime.IsChecked() && maRBDateTimeAutomatic.IsChecked() );
670     maFTDateTimeLanguage.Enable( maCBDateTime.IsChecked() && maRBDateTimeAutomatic.IsChecked() );
671     maCBDateTimeLanguage.Enable( maCBDateTime.IsChecked() && maRBDateTimeAutomatic.IsChecked() );
672 
673     maFTFooter.Enable( maCBFooter.IsChecked() );
674     maTBFooter.Enable( maCBFooter.IsChecked() );
675 
676     maFTHeader.Enable( maCBHeader.IsChecked() );
677     maTBHeader.Enable( maCBHeader.IsChecked() );
678 
679     HeaderFooterSettings aSettings;
680     bool bNotOnTitle;
681     getData( aSettings, bNotOnTitle );
682     maCTPreview.update( aSettings );
683 }
684 
685 // -----------------------------------------------------------------------
686 
687 IMPL_LINK( HeaderFooterTabPage, UpdateOnClickHdl, void *, EMPTYARG )
688 {
689     update();
690 
691     return 0;
692 }
693 
694 // -----------------------------------------------------------------------
695 
696 IMPL_LINK( HeaderFooterTabPage, ClickApplyToAllHdl, void *, EMPTYARG )
697 {
698     mpDialog->ApplyToAll( this );
699     return 0;
700 }
701 
702 // -----------------------------------------------------------------------
703 
704 IMPL_LINK( HeaderFooterTabPage, ClickApplyHdl, void *, EMPTYARG )
705 {
706     mpDialog->Apply( this );
707     return 0;
708 }
709 
710 // -----------------------------------------------------------------------
711 
712 IMPL_LINK( HeaderFooterTabPage, ClickCancelHdl, void *, EMPTYARG )
713 {
714     mpDialog->Cancel( this );
715     return 0;
716 }
717 
718 // -----------------------------------------------------------------------
719 
720 void HeaderFooterTabPage::GetOrSetDateTimeLanguage( LanguageType &rLanguage, bool bSet )
721 {
722     if( mbHandoutMode )
723     {
724         // if set, set it on all notes master pages
725         if( bSet )
726         {
727             sal_uInt16 nPageCount = mpDoc->GetMasterSdPageCount( PK_NOTES );
728             sal_uInt16 nPage;
729             for( nPage = 0; nPage < nPageCount; nPage++ )
730             {
731                 GetOrSetDateTimeLanguage( rLanguage, bSet, mpDoc->GetMasterSdPage( nPage, PK_NOTES ) );
732             }
733         }
734 
735         // and set it, or just get it from the handout master page
736         GetOrSetDateTimeLanguage( rLanguage, bSet, mpDoc->GetMasterSdPage( 0, PK_HANDOUT ) );
737     }
738     else
739     {
740         // get the language from the first master page
741         // or set it to all master pages
742         sal_uInt16 nPageCount = bSet ? mpDoc->GetMasterSdPageCount( PK_NOTES ) : 1;
743         sal_uInt16 nPage;
744         for( nPage = 0; nPage < nPageCount; nPage++ )
745         {
746             GetOrSetDateTimeLanguage( rLanguage, bSet, mpDoc->GetMasterSdPage( nPage, PK_STANDARD ) );
747         }
748     }
749 }
750 
751 // -----------------------------------------------------------------------
752 
753 void HeaderFooterTabPage::GetOrSetDateTimeLanguage( LanguageType &rLanguage, bool bSet, SdPage* pPage )
754 {
755     if( pPage )
756     {
757         SdrTextObj* pObj = (SdrTextObj*)pPage->GetPresObj( PRESOBJ_DATETIME );
758         if( pObj )
759         {
760             Outliner* pOutl = mpDoc->GetInternalOutliner();
761             pOutl->Init( OUTLINERMODE_TEXTOBJECT );
762             sal_uInt16 nOutlMode = pOutl->GetMode();
763 
764             EditEngine* pEdit = const_cast< EditEngine* >(&pOutl->GetEditEngine());
765 
766             OutlinerParaObject* pOPO = pObj->GetOutlinerParaObject();
767             if( pOPO )
768                 pOutl->SetText( *pOPO );
769 
770             EFieldInfo aFieldInfo;
771             aFieldInfo.pFieldItem = NULL;
772 
773             sal_uInt16 nParaCount = pEdit->GetParagraphCount();
774             sal_uInt16 nPara;
775             for( nPara = 0; (nPara < nParaCount) && (aFieldInfo.pFieldItem == NULL); nPara++ )
776             {
777                 sal_uInt16 nFieldCount = pEdit->GetFieldCount( nPara );
778                 sal_uInt16 nField;
779                 for( nField = 0; (nField < nFieldCount) && (aFieldInfo.pFieldItem == NULL); nField++ )
780                 {
781                     aFieldInfo = pEdit->GetFieldInfo( nPara, nField );
782                     if( aFieldInfo.pFieldItem )
783                     {
784                         const SvxFieldData* pFieldData = aFieldInfo.pFieldItem->GetField();
785                         if( pFieldData && pFieldData->ISA( SvxDateTimeField ) )
786                         {
787                             break;
788                         }
789                     }
790                     aFieldInfo.pFieldItem = NULL;
791                 }
792             }
793 
794 
795             if( aFieldInfo.pFieldItem != NULL )
796             {
797                 if( bSet )
798                 {
799                     SfxItemSet aSet( pEdit->GetAttribs( aFieldInfo.aPosition.nPara, aFieldInfo.aPosition.nIndex, aFieldInfo.aPosition.nIndex+1, bSet ? GETATTRIBS_CHARATTRIBS : GETATTRIBS_ALL ) );
800 
801                     SvxLanguageItem aItem( rLanguage, EE_CHAR_LANGUAGE );
802                     aSet.Put( aItem );
803 
804                     SvxLanguageItem aItemCJK( rLanguage, EE_CHAR_LANGUAGE_CJK );
805                     aSet.Put( aItemCJK );
806 
807                     SvxLanguageItem aItemCTL( rLanguage, EE_CHAR_LANGUAGE_CTL );
808                     aSet.Put( aItemCTL );
809 
810                     ESelection aSel( aFieldInfo.aPosition.nPara, aFieldInfo.aPosition.nIndex, aFieldInfo.aPosition.nPara, aFieldInfo.aPosition.nIndex+1 );
811                     pEdit->QuickSetAttribs( aSet, aSel );
812 
813                     pObj->SetOutlinerParaObject( pOutl->CreateParaObject() );
814                     pOutl->UpdateFields();
815                 }
816                 else
817                 {
818                     rLanguage =  pOutl->GetLanguage( aFieldInfo.aPosition.nPara, aFieldInfo.aPosition.nIndex );
819                 }
820             }
821 
822             pOutl->Clear();
823             pOutl->Init( nOutlMode );
824         }
825     }
826 }
827 
828 ///////////////////////////////////////////////////////////////////////
829 
830 PresLayoutPreview::PresLayoutPreview( ::Window* pParent, const ResId& rResId, SdPage* pMaster )
831 :Control( pParent, rResId ), mpMaster( pMaster ), maPageSize( pMaster->GetSize() )
832 {
833 }
834 
835 // -----------------------------------------------------------------------
836 
837 PresLayoutPreview::~PresLayoutPreview()
838 {
839 }
840 
841 // -----------------------------------------------------------------------
842 
843 void PresLayoutPreview::update( HeaderFooterSettings& rSettings )
844 {
845     maSettings = rSettings;
846     Invalidate();
847 }
848 
849 // -----------------------------------------------------------------------
850 
851 void PresLayoutPreview::Paint( OutputDevice& aOut, SdrTextObj* pObj, bool bVisible, bool bDotted /* = false*/ )
852 {
853     // get object transformation
854     basegfx::B2DHomMatrix aObjectTransform;
855     basegfx::B2DPolyPolygon aObjectPolyPolygon;
856     pObj->TRGetBaseGeometry(aObjectTransform, aObjectPolyPolygon);
857 
858     // build complete transformation by adding view transformation from
859     // logic page coordinates to local pixel coordinates
860     const double fScaleX((double)maOutRect.getWidth() / (double)maPageSize.Width());
861     const double fScaleY((double)maOutRect.getHeight() / (double)maPageSize.Height());
862     aObjectTransform.scale(fScaleX, fScaleY);
863     aObjectTransform.translate(maOutRect.TopLeft().X(), maOutRect.TopLeft().Y());
864 
865     // create geometry using unit range and object transform
866     basegfx::B2DPolyPolygon aGeometry(basegfx::tools::createUnitPolygon());
867     aGeometry.transform(aObjectTransform);
868 
869     // apply line pattern if wanted
870     if(bDotted)
871     {
872         ::std::vector<double> aPattern;
873         static double fFactor(1.0);
874         aPattern.push_back(3.0 * fFactor);
875         aPattern.push_back(1.0 * fFactor);
876 
877         basegfx::B2DPolyPolygon aDashed;
878         basegfx::tools::applyLineDashing(aGeometry, aPattern, &aDashed);
879         aGeometry = aDashed;
880     }
881 
882     // determine line color
883     svtools::ColorConfig aColorConfig;
884     svtools::ColorConfigValue aColor( aColorConfig.GetColorValue( bVisible ? svtools::FONTCOLOR : svtools::OBJECTBOUNDARIES ) );
885 
886     // paint at OutDev
887     aOut.SetLineColor(Color(aColor.nColor));
888     aOut.SetFillColor();
889 
890     for(sal_uInt32 a(0); a < aGeometry.count(); a++)
891     {
892         aOut.DrawPolyLine(aGeometry.getB2DPolygon(a));
893     }
894 }
895 
896 // -----------------------------------------------------------------------
897 
898 void PresLayoutPreview::Paint( const Rectangle& )
899 {
900     Push();
901 
902     svtools::ColorConfig aColorConfig;
903     svtools::ColorConfigValue aColor( aColorConfig.GetColorValue( svtools::APPBACKGROUND ) );
904 
905     maOutRect = Rectangle( Point(0,0), GetOutputSize() );
906 
907     // calculate page size with correct aspect ratio
908     int nWidth, nHeight;
909     if( maPageSize.Width() > maPageSize.Height() )
910     {
911         nWidth = maOutRect.GetWidth();
912         nHeight = long( (double)(nWidth * maPageSize.Height()) / (double)maPageSize.Width() );
913     }
914     else
915     {
916         nHeight = maOutRect.GetHeight();
917         nWidth = long( (double)(nHeight * maPageSize.Width()) / (double)maPageSize.Height() );
918     }
919 
920     maOutRect.nLeft += (maOutRect.GetWidth() - nWidth) >> 1;
921     maOutRect.nRight = maOutRect.nLeft + nWidth - 1;
922     maOutRect.nTop += (maOutRect.GetHeight() - nHeight) >> 1;
923     maOutRect.nBottom = maOutRect.nTop + nHeight - 1;
924 
925     // draw decoration frame
926     DecorationView aDecoView( this );
927     maOutRect = aDecoView.DrawFrame( maOutRect, FRAME_HIGHLIGHT_IN );
928 
929     // draw page background
930     SetFillColor( Color(COL_WHITE) );
931     DrawRect( maOutRect );
932 
933     // paint presentation objects from masterpage
934     SdrTextObj* pMasterTitle = (SdrTextObj*)mpMaster->GetPresObj( PRESOBJ_TITLE );
935     SdrTextObj* pMasterOutline = (SdrTextObj*)mpMaster->GetPresObj( mpMaster->GetPageKind()==PK_NOTES ? PRESOBJ_NOTES : PRESOBJ_OUTLINE );
936     SdrTextObj* pHeader = (SdrTextObj*)mpMaster->GetPresObj( PRESOBJ_HEADER );
937     SdrTextObj* pFooter = (SdrTextObj*)mpMaster->GetPresObj( PRESOBJ_FOOTER );
938     SdrTextObj* pDate   = (SdrTextObj*)mpMaster->GetPresObj( PRESOBJ_DATETIME );
939     SdrTextObj* pNumber = (SdrTextObj*)mpMaster->GetPresObj( PRESOBJ_SLIDENUMBER );
940 
941     if( pMasterTitle )
942         Paint( *this, pMasterTitle, true, true );
943     if( pMasterOutline )
944         Paint( *this, pMasterOutline, true, true );
945     if( pHeader )
946         Paint( *this, pHeader, maSettings.mbHeaderVisible );
947     if( pFooter )
948         Paint( *this, pFooter, maSettings.mbFooterVisible );
949     if( pDate )
950         Paint( *this, pDate, maSettings.mbDateTimeVisible );
951     if( pNumber )
952         Paint( *this, pNumber, maSettings.mbSlideNumberVisible );
953 
954     Pop();
955 }
956