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