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