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/button.hxx>
32 : #include <vcl/combobox.hxx>
33 : #include <vcl/edit.hxx>
34 : #include <vcl/fixed.hxx>
35 : #include <vcl/layout.hxx>
36 :
37 : #include "helpids.h"
38 : #include "Outliner.hxx"
39 : #include "dialogs.hrc"
40 : #include "headerfooterdlg.hxx"
41 : #include "DrawDocShell.hxx"
42 : #include "drawdoc.hxx"
43 : #include "ViewShell.hxx"
44 :
45 :
46 : // preview control for presentation layout
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 );
79 : virtual ~PresLayoutPreview();
80 :
81 : virtual void Paint( const Rectangle& rRect ) SAL_OVERRIDE;
82 : virtual Size GetOptimalSize() const SAL_OVERRIDE;
83 :
84 : void init( SdPage* pMaster );
85 : void update( HeaderFooterSettings& rSettings );
86 : };
87 :
88 : }
89 :
90 :
91 : // tab page for slide & header'n'notes
92 :
93 :
94 : namespace sd
95 : {
96 :
97 : const int nDateTimeFormatsCount = 12;
98 : int nDateTimeFormats[nDateTimeFormatsCount] =
99 : {
100 : SVXDATEFORMAT_A,
101 : SVXDATEFORMAT_B,
102 : SVXDATEFORMAT_C,
103 : SVXDATEFORMAT_D,
104 : SVXDATEFORMAT_E,
105 : SVXDATEFORMAT_F,
106 :
107 : SVXDATEFORMAT_A | (SVXTIMEFORMAT_24_HM << 4),
108 : SVXDATEFORMAT_A | (SVXTIMEFORMAT_12_HM << 4),
109 :
110 : (SVXTIMEFORMAT_24_HM << 4),
111 : (SVXTIMEFORMAT_24_HMS <<4),
112 :
113 : (SVXTIMEFORMAT_12_HM << 4 ),
114 : (SVXTIMEFORMAT_12_HMS << 4 )
115 : };
116 :
117 : class HeaderFooterTabPage : public TabPage
118 : {
119 : private:
120 :
121 : FixedText* mpFTIncludeOn;
122 :
123 : CheckBox* mpCBHeader;
124 : VclContainer* mpHeaderBox;
125 : Edit* mpTBHeader;
126 :
127 : CheckBox* mpCBDateTime;
128 : RadioButton* mpRBDateTimeFixed;
129 : RadioButton* mpRBDateTimeAutomatic;
130 : Edit* mpTBDateTimeFixed;
131 : ListBox* mpCBDateTimeFormat;
132 : FixedText* mpFTDateTimeLanguage;
133 : SvxLanguageBox* mpCBDateTimeLanguage;
134 :
135 : CheckBox* mpCBFooter;
136 : VclContainer* mpFooterBox;
137 : Edit* mpTBFooter;
138 :
139 : CheckBox* mpCBSlideNumber;
140 : FixedText* mpFTPageNumber;
141 :
142 : CheckBox* mpCBNotOnTitle;
143 :
144 : PresLayoutPreview* mpCTPreview;
145 :
146 : SdPage* mpCurrentPage;
147 : SdDrawDocument* mpDoc;
148 : HeaderFooterDialog* mpDialog;
149 : LanguageType meOldLanguage;
150 :
151 : bool mbHandoutMode;
152 :
153 : DECL_LINK( UpdateOnClickHdl, void * );
154 :
155 : DECL_LINK( LanguageChangeHdl, void * );
156 :
157 : void FillFormatList(int eFormat);
158 : void GetOrSetDateTimeLanguage( LanguageType &rLanguage, bool bSet );
159 : void GetOrSetDateTimeLanguage( LanguageType &rLanguage, bool bSet, SdPage* pPage );
160 :
161 : public:
162 : HeaderFooterTabPage( HeaderFooterDialog* pDialog, ::Window* pParent, SdDrawDocument* pDoc, SdPage* pActualPage, bool bHandoutMode );
163 : virtual ~HeaderFooterTabPage();
164 :
165 : static SfxTabPage* Create( ::Window*, const SfxItemSet& );
166 : static sal_uInt16* GetRanges();
167 :
168 : void init( const HeaderFooterSettings& rSettings, bool bNotOnTitle );
169 : void getData( HeaderFooterSettings& rSettings, bool& rNotOnTitle );
170 : void update();
171 : };
172 :
173 : }
174 :
175 :
176 :
177 : using namespace ::sd;
178 :
179 :
180 0 : HeaderFooterDialog::HeaderFooterDialog( ViewShell* pViewShell, ::Window* pParent, SdDrawDocument* pDoc, SdPage* pCurrentPage ) :
181 : TabDialog ( pParent, "HeaderFooterDialog", "modules/simpress/ui/headerfooterdialog.ui" ),
182 : mpDoc( pDoc ),
183 : mpCurrentPage( pCurrentPage ),
184 0 : mpViewShell( pViewShell )
185 : {
186 0 : get(mpTabCtrl, "tabs" );
187 :
188 : SdPage* pSlide;
189 : SdPage* pNotes;
190 0 : if( pCurrentPage->GetPageKind() == PK_STANDARD )
191 : {
192 0 : pSlide = pCurrentPage;
193 0 : pNotes = (SdPage*)pDoc->GetPage( pCurrentPage->GetPageNum() + 1 );
194 : }
195 0 : else if( pCurrentPage->GetPageKind() == PK_NOTES )
196 : {
197 0 : pNotes = pCurrentPage;
198 0 : pSlide = (SdPage*)pDoc->GetPage( pCurrentPage->GetPageNum() -1 );
199 0 : mpCurrentPage = pSlide;
200 : }
201 : else
202 : {
203 : // handout
204 0 : pSlide = pDoc->GetSdPage( 0, PK_STANDARD );
205 0 : pNotes = pDoc->GetSdPage( 0, PK_NOTES );
206 0 : mpCurrentPage = NULL;
207 : }
208 :
209 0 : pDoc->StopWorkStartupDelay();
210 0 : mpTabCtrl->Show();
211 :
212 0 : mnSlidesId = mpTabCtrl->GetPageId("slides");
213 0 : mpSlideTabPage = new HeaderFooterTabPage( this, mpTabCtrl, pDoc, pSlide, false );
214 0 : mpTabCtrl->SetTabPage( mnSlidesId, mpSlideTabPage );
215 :
216 0 : Size aSiz = mpSlideTabPage->GetSizePixel();
217 0 : Size aCtrlSiz = mpTabCtrl->GetOutputSizePixel();
218 : // set size on TabControl only if smaller than TabPage
219 0 : if ( aCtrlSiz.Width() < aSiz.Width() || aCtrlSiz.Height() < aSiz.Height() )
220 : {
221 0 : mpTabCtrl->SetOutputSizePixel( aSiz );
222 0 : aCtrlSiz = aSiz;
223 : }
224 :
225 0 : mnNotesId = mpTabCtrl->GetPageId("notes");
226 0 : mpNotesHandoutsTabPage = new HeaderFooterTabPage( this, mpTabCtrl, pDoc, pNotes, true );
227 0 : mpTabCtrl->SetTabPage( mnNotesId, mpNotesHandoutsTabPage );
228 :
229 0 : get(maPBApplyToAll, "apply_all" );
230 0 : get(maPBApply, "apply" );
231 0 : get(maPBCancel, "cancel" );
232 :
233 0 : ActivatePageHdl( mpTabCtrl );
234 :
235 0 : mpTabCtrl->SetActivatePageHdl( LINK( this, HeaderFooterDialog, ActivatePageHdl ) );
236 0 : mpTabCtrl->SetDeactivatePageHdl( LINK( this, HeaderFooterDialog, DeactivatePageHdl ) );
237 :
238 0 : maPBApplyToAll->SetClickHdl( LINK( this, HeaderFooterDialog, ClickApplyToAllHdl ) );
239 0 : maPBApply->SetClickHdl( LINK( this, HeaderFooterDialog, ClickApplyHdl ) );
240 0 : maPBCancel->SetClickHdl( LINK( this, HeaderFooterDialog, ClickCancelHdl ) );
241 :
242 0 : maSlideSettings = pSlide->getHeaderFooterSettings();
243 :
244 0 : const HeaderFooterSettings& rTitleSettings = mpDoc->GetSdPage(0, PK_STANDARD)->getHeaderFooterSettings();
245 0 : bool bNotOnTitle = !rTitleSettings.mbFooterVisible && !rTitleSettings.mbSlideNumberVisible && !rTitleSettings.mbDateTimeVisible;
246 :
247 0 : mpSlideTabPage->init( maSlideSettings, bNotOnTitle );
248 :
249 0 : maNotesHandoutSettings = pNotes->getHeaderFooterSettings();
250 0 : mpNotesHandoutsTabPage->init( maNotesHandoutSettings, false );
251 0 : }
252 :
253 :
254 :
255 0 : HeaderFooterDialog::~HeaderFooterDialog()
256 : {
257 0 : delete mpSlideTabPage;
258 0 : delete mpNotesHandoutsTabPage;
259 0 : }
260 :
261 :
262 :
263 0 : IMPL_LINK( HeaderFooterDialog, ActivatePageHdl, TabControl *, pTabCtrl )
264 : {
265 0 : const sal_uInt16 nId = pTabCtrl->GetCurPageId();
266 0 : TabPage* pTabPage = pTabCtrl->GetTabPage( nId );
267 0 : pTabPage->Show();
268 0 : maPBApply->Show( nId == mnSlidesId );
269 0 : maPBApply->Enable( mpCurrentPage != NULL );
270 :
271 0 : return 0;
272 : }
273 :
274 :
275 :
276 0 : IMPL_LINK_NOARG(HeaderFooterDialog, DeactivatePageHdl)
277 : {
278 0 : return sal_True;
279 : }
280 :
281 :
282 :
283 0 : IMPL_LINK_NOARG(HeaderFooterDialog, ClickApplyToAllHdl)
284 : {
285 0 : ApplyToAll();
286 0 : return 0;
287 : }
288 :
289 :
290 :
291 0 : IMPL_LINK_NOARG(HeaderFooterDialog, ClickApplyHdl)
292 : {
293 0 : Apply();
294 0 : return 0;
295 : }
296 :
297 :
298 :
299 0 : IMPL_LINK_NOARG(HeaderFooterDialog, ClickCancelHdl)
300 : {
301 0 : Cancel();
302 0 : return 0;
303 : }
304 :
305 :
306 :
307 0 : short HeaderFooterDialog::Execute()
308 : {
309 0 : sal_uInt16 nRet = TabDialog::Execute();
310 0 : if( nRet )
311 0 : mpViewShell->GetDocSh()->SetModified();
312 0 : return nRet;
313 : }
314 :
315 :
316 :
317 0 : void HeaderFooterDialog::ApplyToAll()
318 : {
319 0 : sal_uInt16 tabId = mpTabCtrl->GetCurPageId();
320 0 : apply( true, tabId == mnSlidesId );
321 0 : EndDialog(1);
322 0 : }
323 :
324 :
325 :
326 0 : void HeaderFooterDialog::Apply()
327 : {
328 0 : sal_uInt16 tabId = mpTabCtrl->GetCurPageId();
329 0 : apply( false, tabId == mnSlidesId );
330 0 : EndDialog(1);
331 0 : }
332 :
333 :
334 :
335 0 : void HeaderFooterDialog::Cancel()
336 : {
337 0 : EndDialog();
338 0 : }
339 :
340 :
341 :
342 0 : void HeaderFooterDialog::apply( bool bToAll, bool bForceSlides )
343 : {
344 0 : SdUndoGroup* pUndoGroup = new SdUndoGroup(mpDoc);
345 0 : OUString aComment( GetText() );
346 0 : pUndoGroup->SetComment( aComment );
347 :
348 0 : HeaderFooterSettings aNewSettings;
349 : bool bNewNotOnTitle;
350 :
351 : // change slide settings first ...
352 :
353 0 : mpSlideTabPage->getData( aNewSettings, bNewNotOnTitle );
354 :
355 : // only if we pressed apply or apply all on the slide tab page or if the slide settings
356 : // have been changed
357 0 : if( bForceSlides || !(aNewSettings == maSlideSettings) )
358 : {
359 : // apply to all slides
360 0 : if( bToAll )
361 : {
362 0 : int nPageCount = mpDoc->GetSdPageCount( PK_STANDARD );
363 : int nPage;
364 0 : for( nPage = 0; nPage < nPageCount; nPage++ )
365 : {
366 0 : SdPage* pPage = mpDoc->GetSdPage( (sal_uInt16)nPage, PK_STANDARD );
367 0 : change( pUndoGroup, pPage, aNewSettings );
368 : }
369 : }
370 : else
371 : {
372 : // apply only to the current slide
373 : DBG_ASSERT( mpCurrentPage && mpCurrentPage->GetPageKind() == PK_STANDARD, "no current page to apply to!" );
374 0 : if( mpCurrentPage && (mpCurrentPage->GetPageKind() == PK_STANDARD) )
375 : {
376 0 : change( pUndoGroup, mpCurrentPage, aNewSettings );
377 : }
378 : }
379 : }
380 :
381 : // if we don't want to have header&footer on the first slide
382 0 : if( bNewNotOnTitle )
383 : {
384 : // just hide them, plain simple UI feature
385 0 : HeaderFooterSettings aTempSettings = mpDoc->GetSdPage( 0, PK_STANDARD )->getHeaderFooterSettings();
386 :
387 0 : aTempSettings.mbFooterVisible = false;
388 0 : aTempSettings.mbSlideNumberVisible = false;
389 0 : aTempSettings.mbDateTimeVisible = false;
390 :
391 0 : change( pUndoGroup, mpDoc->GetSdPage( 0, PK_STANDARD ), aTempSettings );
392 : }
393 :
394 : // now notes settings
395 :
396 0 : mpNotesHandoutsTabPage->getData( aNewSettings, bNewNotOnTitle );
397 :
398 : // only if we pressed apply or apply all on the notes tab page or if the notes settings
399 : // have been changed
400 0 : if( !bForceSlides || !(aNewSettings == maNotesHandoutSettings) )
401 : {
402 : // first set to all notes pages
403 0 : int nPageCount = mpDoc->GetSdPageCount( PK_NOTES );
404 : int nPage;
405 0 : for( nPage = 0; nPage < nPageCount; nPage++ )
406 : {
407 0 : SdPage* pPage = mpDoc->GetSdPage( (sal_uInt16)nPage, PK_NOTES );
408 :
409 0 : change( pUndoGroup, pPage, aNewSettings );
410 : }
411 :
412 : // and last but not least to the handout page
413 0 : change( pUndoGroup, mpDoc->GetMasterSdPage( 0, PK_HANDOUT ), aNewSettings );
414 : }
415 :
416 : // give the undo group to the undo manager
417 0 : mpViewShell->GetViewFrame()->GetObjectShell()->GetUndoManager()->AddUndoAction(pUndoGroup);
418 0 : }
419 :
420 :
421 :
422 0 : void HeaderFooterDialog::change( SdUndoGroup* pUndoGroup, SdPage* pPage, const HeaderFooterSettings& rNewSettings )
423 : {
424 0 : pUndoGroup->AddAction(new SdHeaderFooterUndoAction(mpDoc, pPage, rNewSettings ));
425 0 : pPage->setHeaderFooterSettings( rNewSettings );
426 0 : }
427 :
428 :
429 :
430 0 : HeaderFooterTabPage::HeaderFooterTabPage( HeaderFooterDialog* pDialog, ::Window* pWindow, SdDrawDocument* pDoc, SdPage* pActualPage, bool bHandoutMode ) :
431 : TabPage( pWindow, "HeaderFooterTab", "modules/simpress/ui/headerfootertab.ui" ),
432 : mpCurrentPage(pActualPage),
433 : mpDoc(pDoc),
434 : mpDialog(pDialog),
435 0 : mbHandoutMode( bHandoutMode )
436 : {
437 0 : get(mpFTIncludeOn, "include_label");
438 0 : get(mpCBHeader, "header_cb" );
439 0 : get(mpHeaderBox, "header_box" );
440 0 : get(mpTBHeader, "header_text" );
441 0 : get(mpCBDateTime, "datetime_cb" );
442 0 : get(mpRBDateTimeFixed, "rb_fixed" );
443 0 : get(mpRBDateTimeAutomatic, "rb_auto" );
444 0 : get(mpTBDateTimeFixed, "datetime_value" );
445 0 : get(mpCBDateTimeFormat, "datetime_format_list" );
446 0 : get(mpFTDateTimeLanguage, "language_label" );
447 0 : get(mpCBDateTimeLanguage, "language_list" );
448 :
449 0 : get(mpCBFooter, "footer_cb" );
450 0 : get(mpFooterBox, "footer_box" );
451 0 : get(mpTBFooter, "footer_text" );
452 :
453 0 : get(mpCBSlideNumber, "slide_number" );
454 :
455 0 : get(mpCBNotOnTitle, "not_on_title" );
456 :
457 0 : get(mpCTPreview, "preview");
458 : mpCTPreview->init( pActualPage ?
459 0 : (pActualPage->IsMasterPage() ? pActualPage : (SdPage*)(&(pActualPage->TRG_GetMasterPage()))) :
460 0 : (pDoc->GetMasterSdPage( 0, bHandoutMode ? PK_NOTES : PK_STANDARD )) );
461 :
462 0 : if( mbHandoutMode )
463 : {
464 0 : OUString sPageNo = get<FixedText>("replacement_a")->GetText();
465 0 : mpCBSlideNumber->SetText( sPageNo );
466 :
467 0 : OUString sFrameTitle = get<FixedText>("replacement_b")->GetText();
468 0 : mpFTIncludeOn->SetText( sFrameTitle );
469 : }
470 :
471 0 : mpCBHeader->Show( mbHandoutMode );
472 0 : mpHeaderBox->Show( mbHandoutMode );
473 0 : mpCBNotOnTitle->Show( !mbHandoutMode );
474 :
475 0 : mpCBDateTime->SetClickHdl( LINK( this, HeaderFooterTabPage, UpdateOnClickHdl ) );
476 0 : mpRBDateTimeFixed->SetClickHdl( LINK( this, HeaderFooterTabPage, UpdateOnClickHdl ) );
477 0 : mpRBDateTimeAutomatic->SetClickHdl( LINK( this, HeaderFooterTabPage, UpdateOnClickHdl ) );
478 0 : mpCBFooter->SetClickHdl( LINK( this, HeaderFooterTabPage, UpdateOnClickHdl ) );
479 0 : mpCBHeader->SetClickHdl( LINK( this, HeaderFooterTabPage, UpdateOnClickHdl ) );
480 0 : mpCBSlideNumber->SetClickHdl( LINK( this, HeaderFooterTabPage, UpdateOnClickHdl ) );
481 :
482 0 : mpCBDateTimeLanguage->SetLanguageList( LANG_LIST_ALL|LANG_LIST_ONLY_KNOWN, false );
483 0 : mpCBDateTimeLanguage->SetSelectHdl( LINK( this, HeaderFooterTabPage, LanguageChangeHdl ) );
484 :
485 0 : GetOrSetDateTimeLanguage( meOldLanguage, false );
486 0 : meOldLanguage = MsLangId::getRealLanguage( meOldLanguage );
487 0 : mpCBDateTimeLanguage->SelectLanguage( meOldLanguage );
488 :
489 0 : FillFormatList(SVXDATEFORMAT_A);
490 0 : }
491 :
492 :
493 0 : HeaderFooterTabPage::~HeaderFooterTabPage()
494 : {
495 0 : }
496 :
497 :
498 :
499 0 : IMPL_LINK_NOARG(HeaderFooterTabPage, LanguageChangeHdl)
500 : {
501 0 : FillFormatList( (int)(sal_IntPtr)mpCBDateTimeFormat->GetEntryData( mpCBDateTimeFormat->GetSelectEntryPos() ) );
502 :
503 :
504 0 : return 0L;
505 : }
506 :
507 :
508 :
509 0 : void HeaderFooterTabPage::FillFormatList( int eFormat )
510 : {
511 0 : LanguageType eLanguage = mpCBDateTimeLanguage->GetSelectLanguage();
512 :
513 0 : mpCBDateTimeFormat->Clear();
514 :
515 0 : Date aDate( Date::SYSTEM );
516 0 : Time aTime( Time::SYSTEM );
517 :
518 : int nFormat;
519 0 : for( nFormat = 0; nFormat < nDateTimeFormatsCount; nFormat++ )
520 : {
521 : OUString aStr( SvxDateTimeField::GetFormatted(
522 : aDate, aTime, nDateTimeFormats[nFormat],
523 0 : *(SD_MOD()->GetNumberFormatter()), eLanguage ) );
524 0 : sal_uInt16 nEntry = mpCBDateTimeFormat->InsertEntry( aStr );
525 0 : mpCBDateTimeFormat->SetEntryData( nEntry, (void*)(sal_IntPtr)nDateTimeFormats[nFormat] );
526 0 : if( nDateTimeFormats[nFormat] == eFormat )
527 : {
528 0 : mpCBDateTimeFormat->SelectEntryPos( nEntry );
529 0 : mpCBDateTimeFormat->SetText( aStr );
530 : }
531 0 : }
532 0 : }
533 :
534 :
535 :
536 0 : void HeaderFooterTabPage::init( const HeaderFooterSettings& rSettings, bool bNotOnTitle )
537 : {
538 0 : mpCBDateTime->Check( rSettings.mbDateTimeVisible );
539 0 : mpRBDateTimeFixed->Check( rSettings.mbDateTimeIsFixed );
540 0 : mpRBDateTimeAutomatic->Check( !rSettings.mbDateTimeIsFixed );
541 0 : mpTBDateTimeFixed->SetText( rSettings.maDateTimeText );
542 :
543 0 : mpCBHeader->Check( rSettings.mbHeaderVisible );
544 0 : mpTBHeader->SetText( rSettings.maHeaderText );
545 :
546 0 : mpCBFooter->Check( rSettings.mbFooterVisible );
547 0 : mpTBFooter->SetText( rSettings.maFooterText );
548 :
549 0 : mpCBSlideNumber->Check( rSettings.mbSlideNumberVisible );
550 :
551 0 : mpCBNotOnTitle->Check( bNotOnTitle );
552 :
553 0 : mpCBDateTimeLanguage->SelectLanguage( meOldLanguage );
554 :
555 : sal_uInt16 nPos;
556 0 : for( nPos = 0; nPos < mpCBDateTimeFormat->GetEntryCount(); nPos++ )
557 : {
558 0 : int nFormat = (int)(sal_IntPtr)mpCBDateTimeFormat->GetEntryData( nPos );
559 0 : if( nFormat == rSettings.meDateTimeFormat )
560 : {
561 0 : mpCBDateTimeFormat->SelectEntryPos( nPos );
562 0 : mpCBDateTimeFormat->SetText( mpCBDateTimeFormat->GetEntry(nPos) );
563 0 : break;
564 : }
565 : }
566 :
567 0 : update();
568 0 : }
569 :
570 :
571 :
572 0 : void HeaderFooterTabPage::getData( HeaderFooterSettings& rSettings, bool& rNotOnTitle )
573 : {
574 0 : rSettings.mbDateTimeVisible = mpCBDateTime->IsChecked();
575 0 : rSettings.mbDateTimeIsFixed = mpRBDateTimeFixed->IsChecked();
576 0 : rSettings.maDateTimeText = mpTBDateTimeFixed->GetText();
577 0 : rSettings.mbFooterVisible = mpCBFooter->IsChecked();
578 0 : rSettings.maFooterText = mpTBFooter->GetText();
579 0 : rSettings.mbSlideNumberVisible = mpCBSlideNumber->IsChecked();
580 0 : rSettings.mbHeaderVisible = mpCBHeader->IsChecked();
581 0 : rSettings.maHeaderText = mpTBHeader->GetText();
582 :
583 0 : if( mpCBDateTimeFormat->GetSelectEntryCount() == 1 )
584 0 : rSettings.meDateTimeFormat = (int)(sal_IntPtr)mpCBDateTimeFormat->GetEntryData( mpCBDateTimeFormat->GetSelectEntryPos() );
585 :
586 0 : LanguageType eLanguage = mpCBDateTimeLanguage->GetSelectLanguage();
587 0 : if( eLanguage != meOldLanguage )
588 0 : GetOrSetDateTimeLanguage( eLanguage, true );
589 :
590 0 : rNotOnTitle = mpCBNotOnTitle->IsChecked();
591 0 : }
592 :
593 :
594 :
595 0 : void HeaderFooterTabPage::update()
596 : {
597 0 : mpRBDateTimeFixed->Enable( mpCBDateTime->IsChecked() );
598 0 : mpTBDateTimeFixed->Enable( mpRBDateTimeFixed->IsChecked() && mpCBDateTime->IsChecked() );
599 0 : mpRBDateTimeAutomatic->Enable( mpCBDateTime->IsChecked() );
600 0 : mpCBDateTimeFormat->Enable( mpCBDateTime->IsChecked() && mpRBDateTimeAutomatic->IsChecked() );
601 0 : mpFTDateTimeLanguage->Enable( mpCBDateTime->IsChecked() && mpRBDateTimeAutomatic->IsChecked() );
602 0 : mpCBDateTimeLanguage->Enable( mpCBDateTime->IsChecked() && mpRBDateTimeAutomatic->IsChecked() );
603 :
604 0 : mpFooterBox->Enable( mpCBFooter->IsChecked() );
605 :
606 0 : mpHeaderBox->Enable( mpCBHeader->IsChecked() );
607 :
608 0 : HeaderFooterSettings aSettings;
609 : bool bNotOnTitle;
610 0 : getData( aSettings, bNotOnTitle );
611 0 : mpCTPreview->update( aSettings );
612 0 : }
613 :
614 :
615 :
616 0 : IMPL_LINK_NOARG(HeaderFooterTabPage, UpdateOnClickHdl)
617 : {
618 0 : update();
619 :
620 0 : return 0;
621 : }
622 :
623 :
624 :
625 0 : void HeaderFooterTabPage::GetOrSetDateTimeLanguage( LanguageType &rLanguage, bool bSet )
626 : {
627 0 : if( mbHandoutMode )
628 : {
629 : // if set, set it on all notes master pages
630 0 : if( bSet )
631 : {
632 0 : sal_uInt16 nPageCount = mpDoc->GetMasterSdPageCount( PK_NOTES );
633 : sal_uInt16 nPage;
634 0 : for( nPage = 0; nPage < nPageCount; nPage++ )
635 : {
636 0 : GetOrSetDateTimeLanguage( rLanguage, bSet, mpDoc->GetMasterSdPage( nPage, PK_NOTES ) );
637 : }
638 : }
639 :
640 : // #i119985# and set it, or just get it from the notes master page
641 0 : GetOrSetDateTimeLanguage( rLanguage, bSet, mpDoc->GetMasterSdPage( 0, PK_NOTES ) );
642 : }
643 : else
644 : {
645 : // get the language from the first master page
646 : // or set it to all master pages
647 0 : sal_uInt16 nPageCount = bSet ? mpDoc->GetMasterSdPageCount( PK_NOTES ) : 1;
648 : sal_uInt16 nPage;
649 0 : for( nPage = 0; nPage < nPageCount; nPage++ )
650 : {
651 0 : GetOrSetDateTimeLanguage( rLanguage, bSet, mpDoc->GetMasterSdPage( nPage, PK_STANDARD ) );
652 : }
653 : }
654 0 : }
655 :
656 :
657 :
658 0 : void HeaderFooterTabPage::GetOrSetDateTimeLanguage( LanguageType &rLanguage, bool bSet, SdPage* pPage )
659 : {
660 0 : if( pPage )
661 : {
662 0 : SdrTextObj* pObj = (SdrTextObj*)pPage->GetPresObj( PRESOBJ_DATETIME );
663 0 : if( pObj )
664 : {
665 0 : Outliner* pOutl = mpDoc->GetInternalOutliner();
666 0 : pOutl->Init( OUTLINERMODE_TEXTOBJECT );
667 0 : sal_uInt16 nOutlMode = pOutl->GetMode();
668 :
669 0 : EditEngine* pEdit = const_cast< EditEngine* >(&pOutl->GetEditEngine());
670 :
671 0 : OutlinerParaObject* pOPO = pObj->GetOutlinerParaObject();
672 0 : if( pOPO )
673 0 : pOutl->SetText( *pOPO );
674 :
675 0 : EFieldInfo aFieldInfo;
676 0 : aFieldInfo.pFieldItem = NULL;
677 :
678 0 : sal_Int32 nParaCount = pEdit->GetParagraphCount();
679 : sal_Int32 nPara;
680 0 : for( nPara = 0; (nPara < nParaCount) && (aFieldInfo.pFieldItem == NULL); nPara++ )
681 : {
682 0 : sal_uInt16 nFieldCount = pEdit->GetFieldCount( nPara );
683 : sal_uInt16 nField;
684 0 : for( nField = 0; (nField < nFieldCount) && (aFieldInfo.pFieldItem == NULL); nField++ )
685 : {
686 0 : aFieldInfo = pEdit->GetFieldInfo( nPara, nField );
687 0 : if( aFieldInfo.pFieldItem )
688 : {
689 0 : const SvxFieldData* pFieldData = aFieldInfo.pFieldItem->GetField();
690 0 : if( pFieldData && (pFieldData->ISA( SvxDateTimeField ) || pFieldData->ISA( SvxDateField )) )
691 : {
692 0 : break;
693 : }
694 : }
695 0 : aFieldInfo.pFieldItem = NULL;
696 : }
697 : }
698 :
699 :
700 0 : if( aFieldInfo.pFieldItem != NULL )
701 : {
702 0 : if( bSet )
703 : {
704 0 : SfxItemSet aSet( pEdit->GetAttribs( aFieldInfo.aPosition.nPara, aFieldInfo.aPosition.nIndex, aFieldInfo.aPosition.nIndex+1, bSet ? GETATTRIBS_CHARATTRIBS : GETATTRIBS_ALL ) );
705 :
706 0 : SvxLanguageItem aItem( rLanguage, EE_CHAR_LANGUAGE );
707 0 : aSet.Put( aItem );
708 :
709 0 : SvxLanguageItem aItemCJK( rLanguage, EE_CHAR_LANGUAGE_CJK );
710 0 : aSet.Put( aItemCJK );
711 :
712 0 : SvxLanguageItem aItemCTL( rLanguage, EE_CHAR_LANGUAGE_CTL );
713 0 : aSet.Put( aItemCTL );
714 :
715 0 : ESelection aSel( aFieldInfo.aPosition.nPara, aFieldInfo.aPosition.nIndex, aFieldInfo.aPosition.nPara, aFieldInfo.aPosition.nIndex+1 );
716 0 : pEdit->QuickSetAttribs( aSet, aSel );
717 :
718 0 : pObj->SetOutlinerParaObject( pOutl->CreateParaObject() );
719 0 : pOutl->UpdateFields();
720 : }
721 : else
722 : {
723 0 : rLanguage = pOutl->GetLanguage( aFieldInfo.aPosition.nPara, aFieldInfo.aPosition.nIndex );
724 : }
725 : }
726 :
727 0 : pOutl->Clear();
728 0 : pOutl->Init( nOutlMode );
729 : }
730 : }
731 0 : }
732 :
733 :
734 :
735 0 : PresLayoutPreview::PresLayoutPreview( ::Window* pParent )
736 : : Control(pParent)
737 0 : , mpMaster(NULL)
738 : {
739 0 : }
740 :
741 :
742 :
743 0 : extern "C" SAL_DLLPUBLIC_EXPORT ::Window* SAL_CALL makePresLayoutPreview( ::Window *pParent, VclBuilder::stringmap & )
744 : {
745 0 : return new PresLayoutPreview( pParent );
746 : }
747 :
748 0 : PresLayoutPreview::~PresLayoutPreview()
749 : {
750 0 : }
751 :
752 0 : Size PresLayoutPreview::GetOptimalSize() const
753 : {
754 0 : return LogicToPixel(Size(80, 80), MAP_APPFONT);
755 : }
756 :
757 :
758 :
759 0 : void PresLayoutPreview::init( SdPage *pMaster )
760 : {
761 0 : mpMaster = pMaster;
762 0 : maPageSize = pMaster->GetSize();
763 0 : }
764 :
765 0 : void PresLayoutPreview::update( HeaderFooterSettings& rSettings )
766 : {
767 0 : maSettings = rSettings;
768 0 : Invalidate();
769 0 : }
770 :
771 :
772 :
773 0 : void PresLayoutPreview::Paint( OutputDevice& aOut, SdrTextObj* pObj, bool bVisible, bool bDotted /* = false*/ )
774 : {
775 : // get object transformation
776 0 : basegfx::B2DHomMatrix aObjectTransform;
777 0 : basegfx::B2DPolyPolygon aObjectPolyPolygon;
778 0 : pObj->TRGetBaseGeometry(aObjectTransform, aObjectPolyPolygon);
779 :
780 : // build complete transformation by adding view transformation from
781 : // logic page coordinates to local pixel coordinates
782 0 : const double fScaleX((double)maOutRect.getWidth() / (double)maPageSize.Width());
783 0 : const double fScaleY((double)maOutRect.getHeight() / (double)maPageSize.Height());
784 0 : aObjectTransform.scale(fScaleX, fScaleY);
785 0 : aObjectTransform.translate(maOutRect.TopLeft().X(), maOutRect.TopLeft().Y());
786 :
787 : // create geometry using unit range and object transform
788 0 : basegfx::B2DPolyPolygon aGeometry(basegfx::tools::createUnitPolygon());
789 0 : aGeometry.transform(aObjectTransform);
790 :
791 : // apply line pattern if wanted
792 0 : if(bDotted)
793 : {
794 0 : ::std::vector<double> aPattern;
795 : static double fFactor(1.0);
796 0 : aPattern.push_back(3.0 * fFactor);
797 0 : aPattern.push_back(1.0 * fFactor);
798 :
799 0 : basegfx::B2DPolyPolygon aDashed;
800 0 : basegfx::tools::applyLineDashing(aGeometry, aPattern, &aDashed);
801 0 : aGeometry = aDashed;
802 : }
803 :
804 : // determine line color
805 0 : svtools::ColorConfig aColorConfig;
806 0 : svtools::ColorConfigValue aColor( aColorConfig.GetColorValue( bVisible ? svtools::FONTCOLOR : svtools::OBJECTBOUNDARIES ) );
807 :
808 : // paint at OutDev
809 0 : aOut.SetLineColor(Color(aColor.nColor));
810 0 : aOut.SetFillColor();
811 :
812 0 : for(sal_uInt32 a(0); a < aGeometry.count(); a++)
813 : {
814 0 : aOut.DrawPolyLine(aGeometry.getB2DPolygon(a));
815 0 : }
816 0 : }
817 :
818 :
819 :
820 0 : void PresLayoutPreview::Paint( const Rectangle& )
821 : {
822 0 : Push();
823 :
824 0 : maOutRect = Rectangle( Point(0,0), GetOutputSize() );
825 :
826 : // calculate page size with correct aspect ratio
827 : int nWidth, nHeight;
828 0 : if( maPageSize.Width() > maPageSize.Height() )
829 : {
830 0 : nWidth = maOutRect.GetWidth();
831 0 : nHeight = long( (double)(nWidth * maPageSize.Height()) / (double)maPageSize.Width() );
832 : }
833 : else
834 : {
835 0 : nHeight = maOutRect.GetHeight();
836 0 : nWidth = long( (double)(nHeight * maPageSize.Width()) / (double)maPageSize.Height() );
837 : }
838 :
839 0 : maOutRect.Left() += (maOutRect.GetWidth() - nWidth) >> 1;
840 0 : maOutRect.Right() = maOutRect.Left() + nWidth - 1;
841 0 : maOutRect.Top() += (maOutRect.GetHeight() - nHeight) >> 1;
842 0 : maOutRect.Bottom() = maOutRect.Top() + nHeight - 1;
843 :
844 : // draw decoration frame
845 0 : DecorationView aDecoView( this );
846 0 : maOutRect = aDecoView.DrawFrame( maOutRect, FRAME_HIGHLIGHT_IN );
847 :
848 : // draw page background
849 0 : SetFillColor( Color(COL_WHITE) );
850 0 : DrawRect( maOutRect );
851 :
852 : // paint presentation objects from masterpage
853 0 : SdrTextObj* pMasterTitle = (SdrTextObj*)mpMaster->GetPresObj( PRESOBJ_TITLE );
854 0 : SdrTextObj* pMasterOutline = (SdrTextObj*)mpMaster->GetPresObj( mpMaster->GetPageKind()==PK_NOTES ? PRESOBJ_NOTES : PRESOBJ_OUTLINE );
855 0 : SdrTextObj* pHeader = (SdrTextObj*)mpMaster->GetPresObj( PRESOBJ_HEADER );
856 0 : SdrTextObj* pFooter = (SdrTextObj*)mpMaster->GetPresObj( PRESOBJ_FOOTER );
857 0 : SdrTextObj* pDate = (SdrTextObj*)mpMaster->GetPresObj( PRESOBJ_DATETIME );
858 0 : SdrTextObj* pNumber = (SdrTextObj*)mpMaster->GetPresObj( PRESOBJ_SLIDENUMBER );
859 :
860 0 : if( pMasterTitle )
861 0 : Paint( *this, pMasterTitle, true, true );
862 0 : if( pMasterOutline )
863 0 : Paint( *this, pMasterOutline, true, true );
864 0 : if( pHeader )
865 0 : Paint( *this, pHeader, maSettings.mbHeaderVisible );
866 0 : if( pFooter )
867 0 : Paint( *this, pFooter, maSettings.mbFooterVisible );
868 0 : if( pDate )
869 0 : Paint( *this, pDate, maSettings.mbDateTimeVisible );
870 0 : if( pNumber )
871 0 : Paint( *this, pNumber, maSettings.mbSlideNumberVisible );
872 :
873 0 : Pop();
874 0 : }
875 :
876 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|