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