diff options
Diffstat (limited to 'sd/source/ui/dlg/headerfooterdlg.cxx')
-rwxr-xr-x | sd/source/ui/dlg/headerfooterdlg.cxx | 942 |
1 files changed, 942 insertions, 0 deletions
diff --git a/sd/source/ui/dlg/headerfooterdlg.cxx b/sd/source/ui/dlg/headerfooterdlg.cxx new file mode 100755 index 000000000000..b48a1682bba6 --- /dev/null +++ b/sd/source/ui/dlg/headerfooterdlg.cxx @@ -0,0 +1,942 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_sd.hxx" + +#ifdef SD_DLLIMPLEMENTATION +#undef SD_DLLIMPLEMENTATION +#endif + +#ifndef _SVX_DIALOGS_HRC +#include <svx/dialogs.hrc> +#endif +#include <editeng/eeitem.hxx> +#include <editeng/flditem.hxx> +#include <editeng/langitem.hxx> +#include <svx/langbox.hxx> +#include <svx/svdotext.hxx> +#include <editeng/editeng.hxx> +#include <sfx2/viewfrm.hxx> + +#ifndef _SD_SDRESID_HXX +#include "sdresid.hxx" +#endif + +#include <vcl/fixed.hxx> +#include <vcl/button.hxx> +#include <vcl/edit.hxx> +#include <vcl/combobox.hxx> + +#include "helpids.h" +#include "Outliner.hxx" +#include "dialogs.hrc" +#include "headerfooterdlg.hxx" +#include "DrawDocShell.hxx" +#include "drawdoc.hxx" +#include "ViewShell.hxx" + +/////////////////////////////////////////////////////////////////////// +// preview control for presentation layout +/////////////////////////////////////////////////////////////////////// +#include <vcl/ctrl.hxx> +#ifndef _SV_COLOR_HXX +#include <tools/color.hxx> +#endif +#include <i18npool/mslangid.hxx> +#include <svtools/colorcfg.hxx> +#include <svx/xlndsit.hxx> +#include <svx/xlineit0.hxx> +#include <svx/xlnclit.hxx> +#include <vcl/decoview.hxx> + +#include "undoheaderfooter.hxx" +#include "sdundogr.hxx" +#include "ViewShell.hxx" + +#include <basegfx/matrix/b2dhommatrix.hxx> +#include <basegfx/polygon/b2dpolygontools.hxx> +#include <basegfx/polygon/b2dpolypolygontools.hxx> + +namespace sd +{ + +class PresLayoutPreview : public Control +{ +private: + SdPage* mpMaster; + HeaderFooterSettings maSettings; + Size maPageSize; + Rectangle maOutRect; + +private: + void Paint( OutputDevice& aOut, SdrTextObj* pObj, bool bVisible, bool bDotted = false ); + +public: + PresLayoutPreview( ::Window* pParent, const ResId& rResId, SdPage* pMaster ); + ~PresLayoutPreview(); + + virtual void Paint( const Rectangle& rRect ); + + void update( HeaderFooterSettings& rSettings ); +}; + +} + +/////////////////////////////////////////////////////////////////////// +// tab page for slide & header'n'notes +/////////////////////////////////////////////////////////////////////// + +namespace sd +{ + +const int nDateTimeFormatsCount = 10; +int nDateTimeFormats[nDateTimeFormatsCount] = +{ + SVXDATEFORMAT_A, + SVXDATEFORMAT_F, + SVXDATEFORMAT_D, + SVXDATEFORMAT_C, + + SVXDATEFORMAT_A | (SVXTIMEFORMAT_24_HM << 4), + SVXDATEFORMAT_A | (SVXTIMEFORMAT_12_HM << 4), + + (SVXTIMEFORMAT_24_HM << 4), + (SVXTIMEFORMAT_24_HMS <<4), + + (SVXTIMEFORMAT_12_HM << 4 ), + (SVXTIMEFORMAT_12_HMS << 4 ) +}; + +class HeaderFooterTabPage : public TabPage +{ +private: + FixedLine maFLIncludeOnPage; + + CheckBox maCBHeader; + FixedText maFTHeader; + Edit maTBHeader; + + FixedLine maFLDateTime; + CheckBox maCBDateTime; + RadioButton maRBDateTimeFixed; + RadioButton maRBDateTimeAutomatic; + Edit maTBDateTimeFixed; + ListBox maCBDateTimeFormat; + FixedText maFTDateTimeLanguage; + SvxLanguageBox maCBDateTimeLanguage; + + FixedLine maFLFooter; + CheckBox maCBFooter; + FixedText maFTFooter; + Edit maTBFooter; + + FixedLine maFLSlideNumber; + CheckBox maCBSlideNumber; + + FixedLine maFLNotOnTitle; + CheckBox maCBNotOnTitle; + + PushButton maPBApplyToAll; + PushButton maPBApply; + CancelButton maPBCancel; + HelpButton maPBHelp; + + PresLayoutPreview maCTPreview; + + SdPage* mpCurrentPage; + SdDrawDocument * mpDoc; + HeaderFooterDialog* mpDialog; + LanguageType meOldLanguage; + + bool mbHandoutMode; + + DECL_LINK( UpdateOnClickHdl, void * ); + + DECL_LINK( ClickApplyToAllHdl, void * ); + DECL_LINK( ClickApplyHdl, void * ); + DECL_LINK( ClickCancelHdl, void * ); + + DECL_LINK( LanguageChangeHdl, void * ); + + void FillFormatList(int eFormat); + void GetOrSetDateTimeLanguage( LanguageType &rLanguage, bool bSet ); + void GetOrSetDateTimeLanguage( LanguageType &rLanguage, bool bSet, SdPage* pPage ); + +public: + HeaderFooterTabPage( HeaderFooterDialog* pDialog, ::Window* pParent, SdDrawDocument* pDoc, SdPage* pActualPage, bool bHandoutMode ); + ~HeaderFooterTabPage(); + + static SfxTabPage* Create( ::Window*, const SfxItemSet& ); + static USHORT* GetRanges(); + + void init( const HeaderFooterSettings& rSettings, bool bNotOnTitle, bool bHasApply ); + void getData( HeaderFooterSettings& rSettings, bool& rNotOnTitle ); + void update(); +}; + +} + +/////////////////////////////////////////////////////////////////////// + +using namespace ::sd; + + +HeaderFooterDialog::HeaderFooterDialog( ViewShell* pViewShell, ::Window* pParent, SdDrawDocument* pDoc, SdPage* pCurrentPage ) : + TabDialog ( pParent, SdResId( RID_SD_DLG_HEADERFOOTER ) ), + maTabCtrl( this, SdResId( 1 ) ), + mpDoc( pDoc ), + mpCurrentPage( pCurrentPage ), + mpViewShell( pViewShell ) +{ + FreeResource(); + + SdPage* pSlide; + SdPage* pNotes; + if( pCurrentPage->GetPageKind() == PK_STANDARD ) + { + pSlide = pCurrentPage; + pNotes = (SdPage*)pDoc->GetPage( pCurrentPage->GetPageNum() + 1 ); + } + else if( pCurrentPage->GetPageKind() == PK_NOTES ) + { + pNotes = pCurrentPage; + pSlide = (SdPage*)pDoc->GetPage( pCurrentPage->GetPageNum() -1 ); + mpCurrentPage = pSlide; + } + else + { + // handout + pSlide = pDoc->GetSdPage( 0, PK_STANDARD ); + pNotes = pDoc->GetSdPage( 0, PK_NOTES ); + mpCurrentPage = NULL; + } + +// maTabCtrl.SetHelpId( HID_XML_FILTER_TABPAGE_CTRL ); + maTabCtrl.Show(); + + mpSlideTabPage = new HeaderFooterTabPage( this, &maTabCtrl, pDoc, pSlide, false ); + mpSlideTabPage->SetHelpId( HID_SD_TABPAGE_HEADERFOOTER_SLIDE ); + maTabCtrl.SetTabPage( RID_SD_TABPAGE_HEADERFOOTER_SLIDE, mpSlideTabPage ); + + Size aSiz = mpSlideTabPage->GetSizePixel(); + Size aCtrlSiz = maTabCtrl.GetOutputSizePixel(); + // set size on TabControl only if smaller than TabPage + if ( aCtrlSiz.Width() < aSiz.Width() || aCtrlSiz.Height() < aSiz.Height() ) + { + maTabCtrl.SetOutputSizePixel( aSiz ); + aCtrlSiz = aSiz; + } + + mpNotesHandoutsTabPage = new HeaderFooterTabPage( this, &maTabCtrl, pDoc, pNotes, true ); + mpNotesHandoutsTabPage->SetHelpId( HID_SD_TABPAGE_HEADERFOOTER_NOTESHANDOUT ); + maTabCtrl.SetTabPage( RID_SD_TABPAGE_HEADERFOOTER_NOTESHANDOUT, mpNotesHandoutsTabPage ); + + aSiz = mpNotesHandoutsTabPage->GetSizePixel(); + if ( aCtrlSiz.Width() < aSiz.Width() || aCtrlSiz.Height() < aSiz.Height() ) + { + maTabCtrl.SetOutputSizePixel( aSiz ); + aCtrlSiz = aSiz; + } + + ActivatePageHdl( &maTabCtrl ); + + AdjustLayout(); + + maTabCtrl.SetActivatePageHdl( LINK( this, HeaderFooterDialog, ActivatePageHdl ) ); + maTabCtrl.SetDeactivatePageHdl( LINK( this, HeaderFooterDialog, DeactivatePageHdl ) ); + + maSlideSettings = pSlide->getHeaderFooterSettings(); + + const HeaderFooterSettings& rTitleSettings = mpDoc->GetSdPage(0, PK_STANDARD)->getHeaderFooterSettings(); + bool bNotOnTitle = !rTitleSettings.mbFooterVisible && !rTitleSettings.mbSlideNumberVisible && !rTitleSettings.mbDateTimeVisible; + + mpSlideTabPage->init( maSlideSettings, bNotOnTitle, mpCurrentPage != NULL ); + + maNotesHandoutSettings = pNotes->getHeaderFooterSettings(); + mpNotesHandoutsTabPage->init( maNotesHandoutSettings, false, false ); +} + +// ----------------------------------------------------------------------- + +HeaderFooterDialog::~HeaderFooterDialog() +{ + delete mpSlideTabPage; + delete mpNotesHandoutsTabPage; +} + +// ----------------------------------------------------------------------- + +IMPL_LINK( HeaderFooterDialog, ActivatePageHdl, TabControl *, pTabCtrl ) +{ + const USHORT nId = pTabCtrl->GetCurPageId(); + TabPage* pTabPage = pTabCtrl->GetTabPage( nId ); + pTabPage->Show(); + + return 0; +} + +// ----------------------------------------------------------------------- + +IMPL_LINK( HeaderFooterDialog, DeactivatePageHdl, TabControl *, EMPTYARG ) +{ + return TRUE; +} + +// ----------------------------------------------------------------------- + +short HeaderFooterDialog::Execute() +{ + USHORT nRet = TabDialog::Execute(); + if( nRet ) + mpViewShell->GetDocSh()->SetModified(); + return nRet; +} + +// ----------------------------------------------------------------------- + +void HeaderFooterDialog::ApplyToAll( TabPage* pPage ) +{ + apply( true, pPage == mpSlideTabPage ); + EndDialog(1); +} + +// ----------------------------------------------------------------------- + +void HeaderFooterDialog::Apply( TabPage* pPage ) +{ + apply( false, pPage == mpSlideTabPage ); + EndDialog(1); +} + +// ----------------------------------------------------------------------- + +void HeaderFooterDialog::Cancel( TabPage* ) +{ + EndDialog(); +} + +// ----------------------------------------------------------------------- + +void HeaderFooterDialog::apply( bool bToAll, bool bForceSlides ) +{ + SdUndoGroup* pUndoGroup = new SdUndoGroup(mpDoc); + String aComment( GetText() ); + pUndoGroup->SetComment( aComment ); + + HeaderFooterSettings aNewSettings; + bool bNewNotOnTitle; + + // change slide settings first ... + + mpSlideTabPage->getData( aNewSettings, bNewNotOnTitle ); + + // only if we pressed apply or apply all on the slide tab page or if the slide settings + // have been changed + if( bForceSlides || !(aNewSettings == maSlideSettings) ) + { + // apply to all slides + if( bToAll ) + { + int nPageCount = mpDoc->GetSdPageCount( PK_STANDARD ); + int nPage; + for( nPage = 0; nPage < nPageCount; nPage++ ) + { + SdPage* pPage = mpDoc->GetSdPage( (USHORT)nPage, PK_STANDARD ); + change( pUndoGroup, pPage, aNewSettings ); + } + } + else + { + // apply only to the current slide + DBG_ASSERT( mpCurrentPage && mpCurrentPage->GetPageKind() == PK_STANDARD, "no current page to apply to!" ); + if( mpCurrentPage && (mpCurrentPage->GetPageKind() == PK_STANDARD) ) + { + change( pUndoGroup, mpCurrentPage, aNewSettings ); + } + } + } + + // if we don't want to have header&footer on the first slide + if( bNewNotOnTitle ) + { + // just hide them, plain simple UI feature + HeaderFooterSettings aTempSettings = mpDoc->GetSdPage( 0, PK_STANDARD )->getHeaderFooterSettings(); + + aTempSettings.mbFooterVisible = false; + aTempSettings.mbSlideNumberVisible = false; + aTempSettings.mbDateTimeVisible = false; + + change( pUndoGroup, mpDoc->GetSdPage( 0, PK_STANDARD ), aTempSettings ); + } + + // now notes settings + + mpNotesHandoutsTabPage->getData( aNewSettings, bNewNotOnTitle ); + + // only if we pressed apply or apply all on the notes tab page or if the notes settings + // have been changed + if( !bForceSlides || !(aNewSettings == maNotesHandoutSettings) ) + { + // first set to all notes pages + int nPageCount = mpDoc->GetSdPageCount( PK_NOTES ); + int nPage; + for( nPage = 0; nPage < nPageCount; nPage++ ) + { + SdPage* pPage = mpDoc->GetSdPage( (USHORT)nPage, PK_NOTES ); + + change( pUndoGroup, pPage, aNewSettings ); + } + + // and last but not least to the handout page + change( pUndoGroup, mpDoc->GetMasterSdPage( 0, PK_HANDOUT ), aNewSettings ); + } + + // Undo Gruppe dem Undo Manager uebergeben + mpViewShell->GetViewFrame()->GetObjectShell()->GetUndoManager()->AddUndoAction(pUndoGroup); +} + +// ----------------------------------------------------------------------- + +void HeaderFooterDialog::change( SdUndoGroup* pUndoGroup, SdPage* pPage, const HeaderFooterSettings& rNewSettings ) +{ + pUndoGroup->AddAction(new SdHeaderFooterUndoAction(mpDoc, pPage, rNewSettings )); + pPage->setHeaderFooterSettings( rNewSettings ); +} + +/////////////////////////////////////////////////////////////////////// + +inline void moveY( ::Window& rWin, int deltaY ) +{ + Point aPos = rWin.GetPosPixel(); + aPos.Y() += deltaY; + rWin.SetPosPixel( aPos ); +} + +HeaderFooterTabPage::HeaderFooterTabPage( HeaderFooterDialog* pDialog, ::Window* pWindow, SdDrawDocument* pDoc, SdPage* pActualPage, bool bHandoutMode ) : + TabPage( pWindow, SdResId( RID_SD_TABPAGE_HEADERFOOTER ) ), + maFLIncludeOnPage( this, SdResId( FL_INCLUDE_ON_PAGE ) ), + maCBHeader( this, SdResId( CB_HEADER ) ), + maFTHeader( this, SdResId( FT_HEADER ) ), + maTBHeader( this, SdResId( TB_HEADER_FIXED ) ), + maFLDateTime( this, SdResId( FL_DATETIME ) ), + maCBDateTime( this, SdResId( CB_DATETIME ) ), + maRBDateTimeFixed( this, SdResId( RB_DATETIME_FIXED ) ), + maRBDateTimeAutomatic( this, SdResId( RB_DATETIME_AUTOMATIC ) ), + maTBDateTimeFixed( this, SdResId( TB_DATETIME_FIXED ) ), + maCBDateTimeFormat( this, SdResId( CB_DATETIME_FORMAT ) ), + maFTDateTimeLanguage( this, SdResId( FT_DATETIME_LANGUAGE ) ), + maCBDateTimeLanguage( this, SdResId( CB_DATETIME_LANGUAGE ) ), + + maFLFooter( this, SdResId( FL_FOOTER ) ), + maCBFooter( this, SdResId( CB_FOOTER ) ), + maFTFooter( this, SdResId( FT_FOOTER ) ), + maTBFooter( this, SdResId( TB_FOOTER_FIXED ) ), + + maFLSlideNumber( this, SdResId( FL_SLIDENUMBER ) ), + maCBSlideNumber( this, SdResId( CB_SLIDENUMBER ) ), + + maFLNotOnTitle( this, SdResId( FL_NOTONTITLE ) ), + maCBNotOnTitle( this, SdResId( CB_NOTONTITLE ) ), + + maPBApplyToAll( this, SdResId( BT_APPLYTOALL ) ), + maPBApply( this, SdResId( BT_APPLY ) ), + maPBCancel( this, SdResId( BT_CANCEL ) ), + maPBHelp( this, SdResId( BT_HELP ) ), + + maCTPreview( this, SdResId( CT_PREVIEW ), + pActualPage ? + (pActualPage->IsMasterPage() ? pActualPage : (SdPage*)(&(pActualPage->TRG_GetMasterPage()))) : + (pDoc->GetMasterSdPage( 0, bHandoutMode ? PK_NOTES : PK_STANDARD )) ), + mpCurrentPage(pActualPage), + mpDoc(pDoc), + mpDialog(pDialog), + mbHandoutMode( bHandoutMode ) + +{ + pDoc->StopWorkStartupDelay(); + + if( !mbHandoutMode ) + { + int deltaY = maCBHeader.GetPosPixel().Y() - maCBDateTime.GetPosPixel().Y(); + + moveY( maCBDateTime, deltaY ); + moveY( maRBDateTimeFixed, deltaY ); + moveY( maRBDateTimeAutomatic, deltaY ); + moveY( maTBDateTimeFixed, deltaY ); + moveY( maCBDateTimeFormat, deltaY ); + moveY( maFTDateTimeLanguage, deltaY ); + moveY( maCBDateTimeLanguage, deltaY ); + moveY( maFLFooter, deltaY ); + moveY( maCBFooter, deltaY ); + moveY( maFTFooter, deltaY ); + moveY( maTBFooter, deltaY ); + moveY( maFLSlideNumber, deltaY ); + moveY( maCBSlideNumber, deltaY ); + moveY( maFLNotOnTitle, deltaY ); + moveY( maCBNotOnTitle, deltaY ); + } + else + { + int deltaY = maPBApply.GetPosPixel().Y() - maPBCancel.GetPosPixel().Y(); + + moveY( maPBCancel, deltaY ); + moveY( maPBHelp, deltaY ); + + String aPageNumberStr( SdResId( STR_PAGE_NUMBER ) ); + maCBSlideNumber.SetText( aPageNumberStr ); + + String aIncludeOnPageStr( SdResId( STR_INCLUDE_ON_PAGE ) ); + maFLIncludeOnPage.SetText( aIncludeOnPageStr ); + } + + FreeResource(); + + maPBApply.Show( !mbHandoutMode ); + maCBHeader.Show( mbHandoutMode ); + maFTHeader.Show( mbHandoutMode ); + maTBHeader.Show( mbHandoutMode ); + maFLDateTime.Show( mbHandoutMode ); + maFLNotOnTitle.Show( !mbHandoutMode ); + maCBNotOnTitle.Show( !mbHandoutMode ); + + maCBDateTime.SetClickHdl( LINK( this, HeaderFooterTabPage, UpdateOnClickHdl ) ); + maRBDateTimeFixed.SetClickHdl( LINK( this, HeaderFooterTabPage, UpdateOnClickHdl ) ); + maRBDateTimeAutomatic.SetClickHdl( LINK( this, HeaderFooterTabPage, UpdateOnClickHdl ) ); + maCBFooter.SetClickHdl( LINK( this, HeaderFooterTabPage, UpdateOnClickHdl ) ); + maCBHeader.SetClickHdl( LINK( this, HeaderFooterTabPage, UpdateOnClickHdl ) ); + maCBSlideNumber.SetClickHdl( LINK( this, HeaderFooterTabPage, UpdateOnClickHdl ) ); + + maPBApplyToAll.SetClickHdl( LINK( this, HeaderFooterTabPage, ClickApplyToAllHdl ) ); + maPBApply.SetClickHdl( LINK( this, HeaderFooterTabPage, ClickApplyHdl ) ); + maPBCancel.SetClickHdl( LINK( this, HeaderFooterTabPage, ClickCancelHdl ) ); + + maCBDateTimeLanguage.SetLanguageList( LANG_LIST_ALL|LANG_LIST_ONLY_KNOWN, false ); + maCBDateTimeLanguage.SetSelectHdl( LINK( this, HeaderFooterTabPage, LanguageChangeHdl ) ); + + GetOrSetDateTimeLanguage( meOldLanguage, false ); + meOldLanguage = MsLangId::getRealLanguage( meOldLanguage ); + maCBDateTimeLanguage.SelectLanguage( meOldLanguage ); + + FillFormatList(SVXDATEFORMAT_A); + +} +// ----------------------------------------------------------------------- + +HeaderFooterTabPage::~HeaderFooterTabPage() +{ +} + +// ----------------------------------------------------------------------- + +IMPL_LINK( HeaderFooterTabPage, LanguageChangeHdl, void *, EMPTYARG ) +{ + FillFormatList( (int)(sal_IntPtr)maCBDateTimeFormat.GetEntryData( maCBDateTimeFormat.GetSelectEntryPos() ) ); + + + return 0L; +} + +// ----------------------------------------------------------------------- + +void HeaderFooterTabPage::FillFormatList( int eFormat ) +{ + LanguageType eLanguage = maCBDateTimeLanguage.GetSelectLanguage(); + + maCBDateTimeFormat.Clear(); + + Date aDate; + Time aTime; + + int nFormat; + for( nFormat = 0; nFormat < nDateTimeFormatsCount; nFormat++ ) + { + String aStr( SvxDateTimeField::GetFormatted( aDate, aTime, nDateTimeFormats[nFormat], *(SD_MOD()->GetNumberFormatter()), eLanguage ) ); + USHORT nEntry = maCBDateTimeFormat.InsertEntry( aStr ); + maCBDateTimeFormat.SetEntryData( nEntry, (void*)nDateTimeFormats[nFormat] ); + if( nDateTimeFormats[nFormat] == eFormat ) + { + maCBDateTimeFormat.SelectEntryPos( nEntry ); + maCBDateTimeFormat.SetText( aStr ); + } + } +} + +// ----------------------------------------------------------------------- + +void HeaderFooterTabPage::init( const HeaderFooterSettings& rSettings, bool bNotOnTitle, bool bHasApply ) +{ + maCBDateTime.Check( rSettings.mbDateTimeVisible ); + maRBDateTimeFixed.Check( rSettings.mbDateTimeIsFixed ); + maRBDateTimeAutomatic.Check( !rSettings.mbDateTimeIsFixed ); + maTBDateTimeFixed.SetText( rSettings.maDateTimeText ); + + maCBHeader.Check( rSettings.mbHeaderVisible ); + maTBHeader.SetText( rSettings.maHeaderText ); + + maCBFooter.Check( rSettings.mbFooterVisible ); + maTBFooter.SetText( rSettings.maFooterText ); + + maCBSlideNumber.Check( rSettings.mbSlideNumberVisible ); + + maCBNotOnTitle.Check( bNotOnTitle ); + maPBApply.Enable( bHasApply ); + + maCBDateTimeLanguage.SelectLanguage( meOldLanguage ); + + USHORT nPos; + for( nPos = 0; nPos < maCBDateTimeFormat.GetEntryCount(); nPos++ ) + { + int nFormat = (int)(sal_IntPtr)maCBDateTimeFormat.GetEntryData( nPos ); + if( nFormat == rSettings.meDateTimeFormat ) + { + maCBDateTimeFormat.SelectEntryPos( nPos ); + maCBDateTimeFormat.SetText( maCBDateTimeFormat.GetEntry(nPos) ); + break; + } + } + + update(); +} + +// ----------------------------------------------------------------------- + +void HeaderFooterTabPage::getData( HeaderFooterSettings& rSettings, bool& rNotOnTitle ) +{ + rSettings.mbDateTimeVisible = maCBDateTime.IsChecked(); + rSettings.mbDateTimeIsFixed = maRBDateTimeFixed.IsChecked(); + rSettings.maDateTimeText = maTBDateTimeFixed.GetText(); + rSettings.mbFooterVisible = maCBFooter.IsChecked(); + rSettings.maFooterText = maTBFooter.GetText(); + rSettings.mbSlideNumberVisible = maCBSlideNumber.IsChecked(); + rSettings.mbHeaderVisible = maCBHeader.IsChecked(); + rSettings.maHeaderText = maTBHeader.GetText(); + + if( maCBDateTimeFormat.GetSelectEntryCount() == 1 ) + rSettings.meDateTimeFormat = (int)(sal_IntPtr)maCBDateTimeFormat.GetEntryData( maCBDateTimeFormat.GetSelectEntryPos() ); + + LanguageType eLanguage = maCBDateTimeLanguage.GetSelectLanguage(); + if( eLanguage != meOldLanguage ) + GetOrSetDateTimeLanguage( eLanguage, true ); + + rNotOnTitle = maCBNotOnTitle.IsChecked(); +} + +// ----------------------------------------------------------------------- + +void HeaderFooterTabPage::update() +{ + maRBDateTimeFixed.Enable( maCBDateTime.IsChecked() ); + maTBDateTimeFixed.Enable( maRBDateTimeFixed.IsChecked() && maCBDateTime.IsChecked() ); + maRBDateTimeAutomatic.Enable( maCBDateTime.IsChecked() ); + maCBDateTimeFormat.Enable( maCBDateTime.IsChecked() && maRBDateTimeAutomatic.IsChecked() ); + maFTDateTimeLanguage.Enable( maCBDateTime.IsChecked() && maRBDateTimeAutomatic.IsChecked() ); + maCBDateTimeLanguage.Enable( maCBDateTime.IsChecked() && maRBDateTimeAutomatic.IsChecked() ); + + maFTFooter.Enable( maCBFooter.IsChecked() ); + maTBFooter.Enable( maCBFooter.IsChecked() ); + + maFTHeader.Enable( maCBHeader.IsChecked() ); + maTBHeader.Enable( maCBHeader.IsChecked() ); + + HeaderFooterSettings aSettings; + bool bNotOnTitle; + getData( aSettings, bNotOnTitle ); + maCTPreview.update( aSettings ); +} + +// ----------------------------------------------------------------------- + +IMPL_LINK( HeaderFooterTabPage, UpdateOnClickHdl, void *, EMPTYARG ) +{ + update(); + + return 0; +} + +// ----------------------------------------------------------------------- + +IMPL_LINK( HeaderFooterTabPage, ClickApplyToAllHdl, void *, EMPTYARG ) +{ + mpDialog->ApplyToAll( this ); + return 0; +} + +// ----------------------------------------------------------------------- + +IMPL_LINK( HeaderFooterTabPage, ClickApplyHdl, void *, EMPTYARG ) +{ + mpDialog->Apply( this ); + return 0; +} + +// ----------------------------------------------------------------------- + +IMPL_LINK( HeaderFooterTabPage, ClickCancelHdl, void *, EMPTYARG ) +{ + mpDialog->Cancel( this ); + return 0; +} + +// ----------------------------------------------------------------------- + +void HeaderFooterTabPage::GetOrSetDateTimeLanguage( LanguageType &rLanguage, bool bSet ) +{ + if( mbHandoutMode ) + { + // if set, set it on all notes master pages + if( bSet ) + { + USHORT nPageCount = mpDoc->GetMasterSdPageCount( PK_NOTES ); + USHORT nPage; + for( nPage = 0; nPage < nPageCount; nPage++ ) + { + GetOrSetDateTimeLanguage( rLanguage, bSet, mpDoc->GetMasterSdPage( nPage, PK_NOTES ) ); + } + } + + // and set it, or just get it from the handout master page + GetOrSetDateTimeLanguage( rLanguage, bSet, mpDoc->GetMasterSdPage( 0, PK_HANDOUT ) ); + } + else + { + // get the language from the first master page + // or set it to all master pages + USHORT nPageCount = bSet ? mpDoc->GetMasterSdPageCount( PK_NOTES ) : 1; + USHORT nPage; + for( nPage = 0; nPage < nPageCount; nPage++ ) + { + GetOrSetDateTimeLanguage( rLanguage, bSet, mpDoc->GetMasterSdPage( nPage, PK_STANDARD ) ); + } + } +} + +// ----------------------------------------------------------------------- + +void HeaderFooterTabPage::GetOrSetDateTimeLanguage( LanguageType &rLanguage, bool bSet, SdPage* pPage ) +{ + if( pPage ) + { + SdrTextObj* pObj = (SdrTextObj*)pPage->GetPresObj( PRESOBJ_DATETIME ); + if( pObj ) + { + Outliner* pOutl = mpDoc->GetInternalOutliner(); + pOutl->Init( OUTLINERMODE_TEXTOBJECT ); + USHORT nOutlMode = pOutl->GetMode(); + + EditEngine* pEdit = const_cast< EditEngine* >(&pOutl->GetEditEngine()); + + OutlinerParaObject* pOPO = pObj->GetOutlinerParaObject(); + if( pOPO ) + pOutl->SetText( *pOPO ); + + EFieldInfo aFieldInfo; + aFieldInfo.pFieldItem = NULL; + + USHORT nParaCount = pEdit->GetParagraphCount(); + USHORT nPara; + for( nPara = 0; (nPara < nParaCount) && (aFieldInfo.pFieldItem == NULL); nPara++ ) + { + USHORT nFieldCount = pEdit->GetFieldCount( nPara ); + USHORT nField; + for( nField = 0; (nField < nFieldCount) && (aFieldInfo.pFieldItem == NULL); nField++ ) + { + aFieldInfo = pEdit->GetFieldInfo( nPara, nField ); + if( aFieldInfo.pFieldItem ) + { + const SvxFieldData* pFieldData = aFieldInfo.pFieldItem->GetField(); + if( pFieldData && pFieldData->ISA( SvxDateTimeField ) ) + { + break; + } + } + aFieldInfo.pFieldItem = NULL; + } + } + + + if( aFieldInfo.pFieldItem != NULL ) + { + if( bSet ) + { + SfxItemSet aSet( pEdit->GetAttribs( aFieldInfo.aPosition.nPara, aFieldInfo.aPosition.nIndex, aFieldInfo.aPosition.nIndex+1, bSet ? GETATTRIBS_CHARATTRIBS : GETATTRIBS_ALL ) ); + + SvxLanguageItem aItem( rLanguage, EE_CHAR_LANGUAGE ); + aSet.Put( aItem ); + + SvxLanguageItem aItemCJK( rLanguage, EE_CHAR_LANGUAGE_CJK ); + aSet.Put( aItemCJK ); + + SvxLanguageItem aItemCTL( rLanguage, EE_CHAR_LANGUAGE_CTL ); + aSet.Put( aItemCTL ); + + ESelection aSel( aFieldInfo.aPosition.nPara, aFieldInfo.aPosition.nIndex, aFieldInfo.aPosition.nPara, aFieldInfo.aPosition.nIndex+1 ); + pEdit->QuickSetAttribs( aSet, aSel ); + + pObj->SetOutlinerParaObject( pOutl->CreateParaObject() ); + pOutl->UpdateFields(); + } + else + { + rLanguage = pOutl->GetLanguage( aFieldInfo.aPosition.nPara, aFieldInfo.aPosition.nIndex ); + } + } + + pOutl->Clear(); + pOutl->Init( nOutlMode ); + } + } +} + +/////////////////////////////////////////////////////////////////////// + +PresLayoutPreview::PresLayoutPreview( ::Window* pParent, const ResId& rResId, SdPage* pMaster ) +:Control( pParent, rResId ), mpMaster( pMaster ), maPageSize( pMaster->GetSize() ) +{ +} + +// ----------------------------------------------------------------------- + +PresLayoutPreview::~PresLayoutPreview() +{ +} + +// ----------------------------------------------------------------------- + +void PresLayoutPreview::update( HeaderFooterSettings& rSettings ) +{ + maSettings = rSettings; + Invalidate(); +} + +// ----------------------------------------------------------------------- + +void PresLayoutPreview::Paint( OutputDevice& aOut, SdrTextObj* pObj, bool bVisible, bool bDotted /* = false*/ ) +{ + // get object transformation + basegfx::B2DHomMatrix aObjectTransform; + basegfx::B2DPolyPolygon aObjectPolyPolygon; + pObj->TRGetBaseGeometry(aObjectTransform, aObjectPolyPolygon); + + // build complete transformation by adding view transformation from + // logic page coordinates to local pixel coordinates + const double fScaleX((double)maOutRect.getWidth() / (double)maPageSize.Width()); + const double fScaleY((double)maOutRect.getHeight() / (double)maPageSize.Height()); + aObjectTransform.scale(fScaleX, fScaleY); + aObjectTransform.translate(maOutRect.TopLeft().X(), maOutRect.TopLeft().Y()); + + // create geometry using unit range and object transform + basegfx::B2DPolyPolygon aGeometry(basegfx::tools::createUnitPolygon()); + aGeometry.transform(aObjectTransform); + + // apply line pattern if wanted + if(bDotted) + { + ::std::vector<double> aPattern; + static double fFactor(1.0); + aPattern.push_back(3.0 * fFactor); + aPattern.push_back(1.0 * fFactor); + + basegfx::B2DPolyPolygon aDashed; + basegfx::tools::applyLineDashing(aGeometry, aPattern, &aDashed); + aGeometry = aDashed; + } + + // determine line color + svtools::ColorConfig aColorConfig; + svtools::ColorConfigValue aColor( aColorConfig.GetColorValue( bVisible ? svtools::FONTCOLOR : svtools::OBJECTBOUNDARIES ) ); + + // paint at OutDev + aOut.SetLineColor(Color(aColor.nColor)); + aOut.SetFillColor(); + + for(sal_uInt32 a(0); a < aGeometry.count(); a++) + { + aOut.DrawPolyLine(aGeometry.getB2DPolygon(a)); + } +} + +// ----------------------------------------------------------------------- + +void PresLayoutPreview::Paint( const Rectangle& ) +{ + Push(); + + svtools::ColorConfig aColorConfig; + svtools::ColorConfigValue aColor( aColorConfig.GetColorValue( svtools::APPBACKGROUND ) ); + + maOutRect = Rectangle( Point(0,0), GetOutputSize() ); + + // calculate page size with correct aspect ratio + int nWidth, nHeight; + if( maPageSize.Width() > maPageSize.Height() ) + { + nWidth = maOutRect.GetWidth(); + nHeight = long( (double)(nWidth * maPageSize.Height()) / (double)maPageSize.Width() ); + } + else + { + nHeight = maOutRect.GetHeight(); + nWidth = long( (double)(nHeight * maPageSize.Width()) / (double)maPageSize.Height() ); + } + + maOutRect.nLeft += (maOutRect.GetWidth() - nWidth) >> 1; + maOutRect.nRight = maOutRect.nLeft + nWidth - 1; + maOutRect.nTop += (maOutRect.GetHeight() - nHeight) >> 1; + maOutRect.nBottom = maOutRect.nTop + nHeight - 1; + + // draw decoration frame + DecorationView aDecoView( this ); + maOutRect = aDecoView.DrawFrame( maOutRect, FRAME_HIGHLIGHT_IN ); + + // draw page background + SetFillColor( Color(COL_WHITE) ); + DrawRect( maOutRect ); + + // paint presentation objects from masterpage + SdrTextObj* pMasterTitle = (SdrTextObj*)mpMaster->GetPresObj( PRESOBJ_TITLE ); + SdrTextObj* pMasterOutline = (SdrTextObj*)mpMaster->GetPresObj( mpMaster->GetPageKind()==PK_NOTES ? PRESOBJ_NOTES : PRESOBJ_OUTLINE ); + SdrTextObj* pHeader = (SdrTextObj*)mpMaster->GetPresObj( PRESOBJ_HEADER ); + SdrTextObj* pFooter = (SdrTextObj*)mpMaster->GetPresObj( PRESOBJ_FOOTER ); + SdrTextObj* pDate = (SdrTextObj*)mpMaster->GetPresObj( PRESOBJ_DATETIME ); + SdrTextObj* pNumber = (SdrTextObj*)mpMaster->GetPresObj( PRESOBJ_SLIDENUMBER ); + + if( pMasterTitle ) + Paint( *this, pMasterTitle, true, true ); + if( pMasterOutline ) + Paint( *this, pMasterOutline, true, true ); + if( pHeader ) + Paint( *this, pHeader, maSettings.mbHeaderVisible ); + if( pFooter ) + Paint( *this, pFooter, maSettings.mbFooterVisible ); + if( pDate ) + Paint( *this, pDate, maSettings.mbDateTimeVisible ); + if( pNumber ) + Paint( *this, pNumber, maSettings.mbSlideNumberVisible ); + + Pop(); +} |