diff options
Diffstat (limited to 'sw/source/ui/uiview/pview.cxx')
-rw-r--r-- | sw/source/ui/uiview/pview.cxx | 2718 |
1 files changed, 2718 insertions, 0 deletions
diff --git a/sw/source/ui/uiview/pview.cxx b/sw/source/ui/uiview/pview.cxx new file mode 100644 index 000000000000..801a5fa68f6a --- /dev/null +++ b/sw/source/ui/uiview/pview.cxx @@ -0,0 +1,2718 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: pview.cxx,v $ + * $Revision: 1.70 $ + * + * 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_sw.hxx" + + + +#include <sfx2/objface.hxx> +#include <vcl/timer.hxx> +#include <vcl/field.hxx> +#include <vcl/fixed.hxx> +#include <vcl/help.hxx> +#include <vcl/cmdevt.hxx> +#include <vcl/button.hxx> +#include <svtools/printdlg.hxx> +#include <svl/whiter.hxx> +#include <svl/stritem.hxx> +#include <svl/eitem.hxx> +#include <sfx2/printer.hxx> +#include <sfx2/progress.hxx> +#include <sfx2/app.hxx> +#include <sfx2/topfrm.hxx> +#include <sfx2/bindings.hxx> +#include <sfx2/request.hxx> +#include <sfx2/dispatch.hxx> +#include <vcl/msgbox.hxx> +#include <svx/stddlg.hxx> +#include <svx/paperinf.hxx> +#include <svx/srchitem.hxx> +#include <svx/svdview.hxx> +#include <svx/dlgutil.hxx> +#include <svx/zoomslideritem.hxx> +#ifndef _SVX_SVXIDS_HRC //autogen +#include <svx/svxids.hrc> +#endif + + +#include <swwait.hxx> +#include <globdoc.hxx> +#include <wdocsh.hxx> +#include <pvprtdat.hxx> +#include <swmodule.hxx> +#include <modcfg.hxx> +#include <wrtsh.hxx> +#include <docsh.hxx> +#include <viewopt.hxx> +#include <doc.hxx> +#include <pview.hxx> +#include <view.hxx> +#include <textsh.hxx> +#include <scroll.hxx> +#include <swprtopt.hxx> +#include <docstat.hxx> +#include <usrpref.hxx> +#include <viewfunc.hxx> + + +#ifndef _HELPID_H +#include <helpid.h> +#endif +#ifndef _CMDID_H +#include <cmdid.h> +#endif +#ifndef _GLOBALS_HRC +#include <globals.hrc> +#endif +#ifndef _POPUP_HRC +#include <popup.hrc> +#endif +#ifndef _PVIEW_HRC +#include <pview.hrc> +#endif + +#define SwPagePreView +#include <sfx2/msg.hxx> +#include <swslots.hxx> +// OD 12.12.2002 #103492# +#include <pagepreviewlayout.hxx> + +#include <svx/svxdlg.hxx> +#include <svx/dialogs.hrc> +#include <vos/mutex.hxx> + +using namespace ::com::sun::star; + + +SFX_IMPL_VIEWFACTORY(SwPagePreView, SW_RES(STR_NONAME)) +{ + SFX_VIEW_REGISTRATION(SwDocShell); + SFX_VIEW_REGISTRATION(SwWebDocShell); + SFX_VIEW_REGISTRATION(SwGlobalDocShell); +} + +SFX_IMPL_INTERFACE(SwPagePreView, SfxViewShell, SW_RES(RID_PVIEW_TOOLBOX)) +{ + SFX_POPUPMENU_REGISTRATION(SW_RES(MN_PPREVIEW_POPUPMENU)); + SFX_OBJECTBAR_REGISTRATION( SFX_OBJECTBAR_OBJECT|SFX_VISIBILITY_STANDARD| + SFX_VISIBILITY_CLIENT|SFX_VISIBILITY_FULLSCREEN| + SFX_VISIBILITY_READONLYDOC, + SW_RES(RID_PVIEW_TOOLBOX)); +} + + +TYPEINIT1(SwPagePreView,SfxViewShell) + +#define SWVIEWFLAGS ( SFX_VIEW_MAXIMIZE_FIRST|SFX_VIEW_OPTIMIZE_EACH| \ + SFX_VIEW_CAN_PRINT|SFX_VIEW_HAS_PRINTOPTIONS ) + +#define MIN_PREVIEW_ZOOM 25 +#define MAX_PREVIEW_ZOOM 600 +/* */ +/* -----------------26.11.2002 10:41----------------- + * + * --------------------------------------------------*/ +USHORT lcl_GetNextZoomStep(USHORT nCurrentZoom, BOOL bZoomIn) +{ + static USHORT aZoomArr[] = + { + 25, 50, 75, 100, 150, 200, 400, 600 + }; + const sal_uInt16 nZoomArrSize = sizeof(aZoomArr)/sizeof(USHORT); + if(bZoomIn) + for(int i = nZoomArrSize - 1; i >= 0; --i) + { + if(nCurrentZoom > aZoomArr[i] || !i) + return aZoomArr[i]; + } + else + for(int i = 0; i < nZoomArrSize; ++i) + { + if(nCurrentZoom < aZoomArr[i]) + return aZoomArr[i]; + } + return bZoomIn ? MAX_PREVIEW_ZOOM : MIN_PREVIEW_ZOOM; +}; +/* -----------------02.12.2002 09:11----------------- + * + * --------------------------------------------------*/ +void lcl_InvalidateZoomSlots(SfxBindings& rBindings) +{ + static USHORT __READONLY_DATA aInval[] = + { + SID_ATTR_ZOOM, SID_ZOOM_OUT, SID_ZOOM_IN, SID_ATTR_ZOOMSLIDER, FN_PREVIEW_ZOOM, FN_STAT_ZOOM, + 0 + }; + rBindings.Invalidate( aInval ); +} +/*-------------------------------------------------------------------- + Beschreibung: + --------------------------------------------------------------------*/ + +// erstmal der Zoom-Dialog + +class SwPreViewZoomDlg : public SvxStandardDialog +{ + FixedText aRowLbl; + NumericField aRowEdit; + FixedText aColLbl; + NumericField aColEdit; + + OKButton aOkBtn; + CancelButton aCancelBtn; + HelpButton aHelpBtn; + + virtual void Apply(); + +public: + SwPreViewZoomDlg( SwPagePreViewWin& rParent ); + ~SwPreViewZoomDlg(); +}; + +/*-------------------------------------------------------------------- + Beschreibung: + --------------------------------------------------------------------*/ + + +SwPreViewZoomDlg::SwPreViewZoomDlg( SwPagePreViewWin& rParent ) : + SvxStandardDialog( &rParent, SW_RES(DLG_PAGEPREVIEW_ZOOM) ), + aRowLbl(this,SW_RES(FT_ROW)), + aRowEdit(this,SW_RES(ED_ROW)), + aColLbl(this,SW_RES(FT_COL)), + aColEdit(this,SW_RES(ED_COL)), + aOkBtn(this,SW_RES(BT_OK)), + aCancelBtn(this,SW_RES(BT_CANCEL)), + aHelpBtn(this,SW_RES(BT_HELP)) +{ + FreeResource(); + + aRowEdit.SetValue( rParent.GetRow() ); + aColEdit.SetValue( rParent.GetCol() ); +} + +/*-------------------------------------------------------------------- + Beschreibung: + --------------------------------------------------------------------*/ + + + SwPreViewZoomDlg::~SwPreViewZoomDlg() {} + + +void SwPreViewZoomDlg::Apply() +{ + ((SwPagePreViewWin*)GetParent())->CalcWish( + BYTE(aRowEdit.GetValue()), + BYTE(aColEdit.GetValue()) ); +} + +/* */ +/* -----------------20.08.98 15:25------------------- + * Vorschau fuer den Seitendruck + * --------------------------------------------------*/ +struct PrintSettingsStruct; +class PrtPrvWindow : public Window +{ + const PrintSettingsStruct& rSettings; + + virtual void Paint(const Rectangle&); +public : + PrtPrvWindow(Window* pParent, const ResId& rResId, const PrintSettingsStruct& rSett) : + Window(pParent, rResId), rSettings(rSett){} +}; +/*-------------------------------------------------------------------- + Beschreibung: Optionen fuer das Drucken der Preview + --------------------------------------------------------------------*/ +struct PrintSettingsStruct +{ + Size aPageMaxSize; // groesste Seite + Size aPrtSize; // Papiergroesse + Size aPrvPrtSize; // Groesse innerhalb der LRTB-Raender + Size aGridSize; // Groesse fuer jede Seite, enthaelt je + // die Haelfte von H- und V-Distance + + long nLeft; + long nRight; + long nTop; + long nBottom; + long nHori; + long nVert; + + USHORT nRows; + USHORT nCols; + + BOOL bPrinterLandscape; // Ausrichtung +}; + +class SwPreviewPrintOptionsDialog : public SvxStandardDialog +{ + FixedLine aRowColFL; + FixedText aRowsFT; + NumericField aRowsNF; + FixedText aColsFT; + NumericField aColsNF; + + FixedLine aMarginFL; + FixedText aLSpaceFT; + MetricField aLSpaceMF; + FixedText aRSpaceFT; + MetricField aRSpaceMF; + FixedText aTSpaceFT; + MetricField aTSpaceMF; + FixedText aBSpaceFT; + MetricField aBSpaceMF; + FixedLine aDistanceFL; + FixedText aHSpaceFT; + MetricField aHSpaceMF; + FixedText aVSpaceFT; + MetricField aVSpaceMF; + + RadioButton aLandscapeRB; + RadioButton aPortraitRB; + FixedLine aOrientationFL; + + PrtPrvWindow aPreviewWin; + + OKButton aOkBtn; + CancelButton aCancelBtn; + HelpButton aHelpBtn; + + PushButton aStandardPB; + + SwPagePreView& rPreView; + SwPagePreViewWin& rParentWin; + PrintSettingsStruct aSettings; +/* Size aPageMaxSize; + Size aPrtSize; + + BOOL bOrientation; +*/ + BOOL bStandard; + + virtual void Apply(); + void FillControls(SwPagePreViewPrtData& rData); + + DECL_LINK( ModifyHdl, Edit* ); + DECL_LINK( StandardHdl, PushButton* ); + +public: + SwPreviewPrintOptionsDialog(SwPagePreViewWin& rParent, SwPagePreView& rView); + ~SwPreviewPrintOptionsDialog(); +}; + +/* -----------------19.08.98 13:35------------------- + * + * --------------------------------------------------*/ +SwPreviewPrintOptionsDialog::SwPreviewPrintOptionsDialog( SwPagePreViewWin& rParent, SwPagePreView& rView ) : + SvxStandardDialog( &rParent, SW_RES(DLG_PAGEPREVIEW_PRINTOPTIONS) ), + aRowColFL(this,SW_RES( FL_ROWCOL)), + aRowsFT(this,SW_RES( FT_ROWS)), + aRowsNF(this,SW_RES( NF_ROWS)), + aColsFT(this,SW_RES( FT_COLS)), + aColsNF(this,SW_RES( NF_COLS)), + aMarginFL(this,SW_RES( FL_MARGINS)), + aLSpaceFT(this,SW_RES( FT_LMARGIN)), + aLSpaceMF(this,SW_RES( MF_LMARGIN)), + aRSpaceFT(this,SW_RES( FT_RMARGIN)), + aRSpaceMF(this,SW_RES( MF_RMARGIN)), + aTSpaceFT(this,SW_RES( FT_TMARGIN)), + aTSpaceMF(this,SW_RES( MF_TMARGIN)), + aBSpaceFT(this,SW_RES( FT_BMARGIN)), + aBSpaceMF(this,SW_RES( MF_BMARGIN)), + aDistanceFL(this,SW_RES(FL_DISTANCE)), + aHSpaceFT(this,SW_RES( FT_HMARGIN)), + aHSpaceMF(this,SW_RES( MF_HMARGIN)), + aVSpaceFT(this,SW_RES( FT_VMARGIN)), + aVSpaceMF(this,SW_RES( MF_VMARGIN)), + aLandscapeRB(this,SW_RES( RB_LANDSCAPE)), + aPortraitRB(this,SW_RES( RB_PORTRAIT)), + aOrientationFL(this,SW_RES( FL_ORIENTATION)), + aPreviewWin(this,SW_RES( WIN_PREVIEW), aSettings), + aOkBtn(this,SW_RES(BT_OK)), + aCancelBtn(this,SW_RES(BT_CANCEL)), + aHelpBtn(this,SW_RES(BT_HELP)), + aStandardPB(this,SW_RES(PB_STANDARD)), + rPreView(rView), + rParentWin(rParent), + bStandard(TRUE) +{ + FreeResource(); + ViewShell& rViewSh = *rPreView.GetViewShell(); + // OD 18.12.2002 #103492# + aSettings.aPageMaxSize = rViewSh.PagePreviewLayout()->GetMaxPageSize(); + SfxPrinter* pPrinter = rViewSh.getIDocumentDeviceAccess()->getPrinter( true ); + aSettings.aPrtSize = pPrinter->GetPaperSize(); + //#97682# make sure that no division by zero occurs + if(!aSettings.aPrtSize.Width() || !aSettings.aPrtSize.Height()) + aSettings.aPrtSize = SvxPaperInfo::GetPaperSize(PAPER_A4); + aSettings.bPrinterLandscape = pPrinter->GetOrientation() == ORIENTATION_LANDSCAPE; + + + SwDocShell* pDocShell = rPreView.GetDocShell(); + const SwMasterUsrPref *pUsrPref = SW_MOD()->GetUsrPref(0 != PTR_CAST(SwWebDocShell, pDocShell)); + FieldUnit eFieldUnit = pUsrPref->GetMetric(); + ::SetFieldUnit( aLSpaceMF, eFieldUnit ); + ::SetFieldUnit( aRSpaceMF, eFieldUnit ); + ::SetFieldUnit( aTSpaceMF, eFieldUnit ); + ::SetFieldUnit( aBSpaceMF, eFieldUnit ); + ::SetFieldUnit( aHSpaceMF, eFieldUnit ); + ::SetFieldUnit( aVSpaceMF, eFieldUnit ); + + SwDoc* pDoc = pDocShell->GetDoc(); + SwPagePreViewPrtData aData; + if(pDoc->GetPreViewPrtData()) + { + aData = *pDoc->GetPreViewPrtData(); + bStandard = FALSE; + } + else + { + // Orientation der PreviewData an den Drucker anpassen + aData.SetLandscape(aSettings.bPrinterLandscape); + aData.SetRow(rParent.GetRow()); + aData.SetCol(rParent.GetCol()); + } + FillControls(aData); + + aLSpaceMF.SaveValue(); + aRSpaceMF.SaveValue(); + aTSpaceMF.SaveValue(); + aBSpaceMF.SaveValue(); + aHSpaceMF.SaveValue(); + aVSpaceMF.SaveValue(); + aRowsNF.SaveValue(); + aColsNF.SaveValue(); + aLandscapeRB.SaveValue(); + aPortraitRB.SaveValue(); + + aStandardPB.SetClickHdl(LINK(this, SwPreviewPrintOptionsDialog, StandardHdl)); + Link aLk = LINK(this, SwPreviewPrintOptionsDialog, ModifyHdl); + aLSpaceMF.SetUpHdl(aLk); + aRSpaceMF.SetUpHdl(aLk); + aTSpaceMF.SetUpHdl(aLk); + aBSpaceMF.SetUpHdl(aLk); + aHSpaceMF.SetUpHdl(aLk); + aVSpaceMF.SetUpHdl(aLk); + aRowsNF.SetUpHdl(aLk); + aColsNF.SetUpHdl(aLk); + aLSpaceMF.SetDownHdl(aLk); + aRSpaceMF.SetDownHdl(aLk); + aTSpaceMF.SetDownHdl(aLk); + aBSpaceMF.SetDownHdl(aLk); + aHSpaceMF.SetDownHdl(aLk); + aVSpaceMF.SetDownHdl(aLk); + aRowsNF.SetDownHdl(aLk); + aColsNF.SetDownHdl(aLk); + aLSpaceMF.SetLoseFocusHdl(aLk); + aRSpaceMF.SetLoseFocusHdl(aLk); + aTSpaceMF.SetLoseFocusHdl(aLk); + aBSpaceMF.SetLoseFocusHdl(aLk); + aHSpaceMF.SetLoseFocusHdl(aLk); + aVSpaceMF.SetLoseFocusHdl(aLk); + aRowsNF.SetLoseFocusHdl(aLk); + aColsNF.SetLoseFocusHdl(aLk); + aLandscapeRB.SetClickHdl(aLk); + aPortraitRB.SetClickHdl(aLk); + + ModifyHdl(0); + if(bStandard) + StandardHdl(&aStandardPB); +} + + +/* -----------------19.08.98 13:36------------------- + * + * --------------------------------------------------*/ +SwPreviewPrintOptionsDialog::~SwPreviewPrintOptionsDialog() +{ +} +/* -----------------12.11.98 11:32------------------- + * + * --------------------------------------------------*/ +void SwPreviewPrintOptionsDialog::FillControls(SwPagePreViewPrtData& rData) +{ + aLSpaceMF.SetValue(aLSpaceMF.Normalize(rData.GetLeftSpace() ), FUNIT_TWIP); + aRSpaceMF.SetValue(aRSpaceMF.Normalize(rData.GetRightSpace() ), FUNIT_TWIP); + aTSpaceMF.SetValue(aTSpaceMF.Normalize(rData.GetTopSpace() ), FUNIT_TWIP); + aBSpaceMF.SetValue(aBSpaceMF.Normalize(rData.GetBottomSpace()), FUNIT_TWIP); + aHSpaceMF.SetValue(aHSpaceMF.Normalize(rData.GetHorzSpace() ), FUNIT_TWIP); + aVSpaceMF.SetValue(aVSpaceMF.Normalize(rData.GetVertSpace() ), FUNIT_TWIP); + aRowsNF.SetValue(rData.GetRow()); + aColsNF.SetValue(rData.GetCol()); + aSettings.bPrinterLandscape ? aLandscapeRB.Check() : aPortraitRB.Check(); + // wenn Drucker und Einstellungen nicht uebereinstimmen, dann Seiten tauschen + if( rData.GetLandscape() != aSettings.bPrinterLandscape ) + { + Size aTmp(aSettings.aPrtSize.Height(), aSettings.aPrtSize.Width()); + aSettings.aPrtSize = aTmp; + aSettings.bPrinterLandscape = !aSettings.bPrinterLandscape; + // nochmal setzen, denn auch wenn nur die Default-Orientierung dem Drucker + // angepasst wurde, sollen die Einstellungen gespeichert werden + aSettings.bPrinterLandscape ? aLandscapeRB.Check() : aPortraitRB.Check(); + } + aLandscapeRB.SaveValue(); + aPortraitRB.SaveValue(); + + aSettings.nLeft = rData.GetLeftSpace() ; + aSettings.nRight = rData.GetRightSpace() ; + aSettings.nTop = rData.GetTopSpace() ; + aSettings.nBottom = rData.GetBottomSpace(); + aSettings.nHori = rData.GetHorzSpace() ; + aSettings.nVert = rData.GetVertSpace() ; + aSettings.nRows = rData.GetRow() ; + aSettings.nCols = rData.GetCol() ; + aSettings.aPrvPrtSize = aSettings.aPrtSize ; +} + +/* -----------------19.08.98 14:31------------------- + * + * --------------------------------------------------*/ +void SwPreviewPrintOptionsDialog::Apply() +{ + + SwDoc* pDoc = rPreView.GetDocShell()->GetDoc(); + if(bStandard) + pDoc->SetPreViewPrtData(0); + else if( aLSpaceMF.GetSavedValue() != aLSpaceMF.GetText() || + aRSpaceMF.GetSavedValue() != aRSpaceMF.GetText() || + aTSpaceMF.GetSavedValue() != aTSpaceMF.GetText() || + aBSpaceMF.GetSavedValue() != aBSpaceMF.GetText() || + aHSpaceMF.GetSavedValue() != aHSpaceMF.GetText() || + aVSpaceMF.GetSavedValue() != aVSpaceMF.GetText() || + aRowsNF.GetSavedValue() != aRowsNF.GetText() || + aColsNF.GetSavedValue() != aColsNF.GetText() || + aLandscapeRB.GetSavedValue() != aLandscapeRB.IsChecked() || + aPortraitRB.GetSavedValue() != aPortraitRB.IsChecked() ) + { + SwPagePreViewPrtData aData; + if(pDoc->GetPreViewPrtData()) + aData = *pDoc->GetPreViewPrtData(); + aData.SetLeftSpace( static_cast< ULONG >(aLSpaceMF.Denormalize(aLSpaceMF.GetValue(FUNIT_TWIP))) ); + aData.SetRightSpace( static_cast< ULONG >(aRSpaceMF.Denormalize(aRSpaceMF.GetValue(FUNIT_TWIP))) ); + aData.SetTopSpace( static_cast< ULONG >(aTSpaceMF.Denormalize(aTSpaceMF.GetValue(FUNIT_TWIP))) ); + aData.SetBottomSpace( static_cast< ULONG >(aBSpaceMF.Denormalize(aBSpaceMF.GetValue(FUNIT_TWIP))) ); + + aData.SetHorzSpace( static_cast< ULONG >(aHSpaceMF.Denormalize(aHSpaceMF.GetValue(FUNIT_TWIP))) ); + aData.SetVertSpace( static_cast< ULONG >(aVSpaceMF.Denormalize(aVSpaceMF.GetValue(FUNIT_TWIP))) ); + aData.SetRow((BYTE)aRowsNF.GetValue()); + aData.SetCol((BYTE)aColsNF.GetValue()); + aData.SetLandscape(aLandscapeRB.IsChecked()); + + ViewShell& rViewSh = *rPreView.GetViewShell(); + SfxPrinter* pPrinter = rViewSh.getIDocumentDeviceAccess()->getPrinter( true ); + if((pPrinter->GetOrientation() == ORIENTATION_LANDSCAPE) + != aData.GetLandscape()) + pPrinter->SetOrientation(aData.GetLandscape() ? ORIENTATION_LANDSCAPE : ORIENTATION_PORTRAIT); + + + pDoc->SetPreViewPrtData(&aData); + + } +} +/* -----------------20.08.98 08:48------------------- + * + * --------------------------------------------------*/ +IMPL_LINK( SwPreviewPrintOptionsDialog, ModifyHdl, Edit*, pEdit ) +{ + if(bStandard && pEdit) + { + aLSpaceMF.SetUserValue(aLSpaceMF.GetValue()); + aRSpaceMF.SetUserValue(aRSpaceMF.GetValue()); + aTSpaceMF.SetUserValue(aTSpaceMF.GetValue()); + aBSpaceMF.SetUserValue(aBSpaceMF.GetValue()); + aHSpaceMF.SetUserValue(aHSpaceMF.GetValue()); + aVSpaceMF.SetUserValue(aVSpaceMF.GetValue()); + aRowsNF. SetUserValue(aRowsNF .GetValue()); + aColsNF. SetUserValue(aColsNF .GetValue()); + + bStandard = FALSE; + } + BOOL bOrientChanged = aSettings.bPrinterLandscape != aLandscapeRB.IsChecked();; + if(pEdit == &aLSpaceMF) + aSettings.nLeft = static_cast< long >(aLSpaceMF.Denormalize(aLSpaceMF.GetValue(FUNIT_TWIP))); + else if(pEdit == &aRSpaceMF) + aSettings.nRight = static_cast< long >(aRSpaceMF.Denormalize(aRSpaceMF.GetValue(FUNIT_TWIP))); + else if(pEdit == &aTSpaceMF) + aSettings.nTop = static_cast< long >(aTSpaceMF.Denormalize(aTSpaceMF.GetValue(FUNIT_TWIP))); + else if(pEdit == &aBSpaceMF) + aSettings.nBottom = static_cast< long >(aBSpaceMF.Denormalize(aBSpaceMF.GetValue(FUNIT_TWIP))); + else if(pEdit == &aHSpaceMF) + aSettings.nHori = static_cast< long >(aHSpaceMF.Denormalize(aHSpaceMF.GetValue(FUNIT_TWIP))); + else if(pEdit == &aVSpaceMF) + aSettings.nVert = static_cast< long >(aVSpaceMF.Denormalize(aVSpaceMF.GetValue(FUNIT_TWIP))); + else if(pEdit == &aRowsNF) + aSettings.nRows = (USHORT)aRowsNF.GetValue(); + else if(pEdit == &aColsNF) + aSettings.nCols = (USHORT)aColsNF.GetValue(); + else if(pEdit == (Edit*)&aLandscapeRB) + aSettings.bPrinterLandscape = aLandscapeRB.IsChecked(); + else if(pEdit == (Edit*)&aPortraitRB) + aSettings.bPrinterLandscape = aLandscapeRB.IsChecked(); + + if(bOrientChanged) + { + Size aTmp(aSettings.aPrtSize.Height(), aSettings.aPrtSize.Width()); + aSettings.aPrtSize = aTmp; + } + + + aSettings.aPrvPrtSize = Size(aSettings.aPrtSize.Width() - aSettings.nRight - aSettings.nLeft, + aSettings.aPrtSize.Height() - aSettings.nTop - aSettings.nBottom); + aSettings.aGridSize = Size(aSettings.aPrvPrtSize.Width() / aSettings.nCols, + aSettings.aPrvPrtSize.Height() / aSettings.nRows ); + // was fehlt noch: Orientation auswerten, minimalrand ausrechnen, Beispiel fuettern + + + //am Ende Maximalwerte setzen + long n20Percent = aSettings.aPrtSize.Width() / 5; + aLSpaceMF.SetMax(aLSpaceMF.Normalize(aSettings.aPrtSize.Width() - aSettings.nRight - n20Percent), FUNIT_TWIP); + aRSpaceMF.SetMax(aRSpaceMF.Normalize(aSettings.aPrtSize.Width() - aSettings.nLeft - n20Percent), FUNIT_TWIP); + n20Percent = aSettings.aPrtSize.Height() / 5; + aTSpaceMF.SetMax(aTSpaceMF.Normalize(aSettings.aPrtSize.Height() - aSettings.nBottom - n20Percent), FUNIT_TWIP); + aBSpaceMF.SetMax(aBSpaceMF.Normalize(aSettings.aPrtSize.Height() - aSettings.nTop - n20Percent), FUNIT_TWIP); + + long n80Percent = aSettings.aPrvPrtSize.Width() * 4 / 5; + aHSpaceMF.SetMax(aHSpaceMF.Normalize(n80Percent / aSettings.nRows), FUNIT_TWIP); + n80Percent = aSettings.aPrvPrtSize.Height()* 4 / 5; + aVSpaceMF.SetMax(aVSpaceMF.Normalize(n80Percent / aSettings.nCols), FUNIT_TWIP); + aHSpaceMF.Enable(aSettings.nCols > 1); + aVSpaceMF.Enable(aSettings.nRows > 1); + aRowsNF.SetMin(1);// nur damit auch nach Standard wieder der Inhalt angezeigt wird + aColsNF.SetMin(1); + + + aPreviewWin.Invalidate(); + return 0; +} +/* -----------------28.08.98 14:59------------------- + * + * --------------------------------------------------*/ +IMPL_LINK( SwPreviewPrintOptionsDialog, StandardHdl, PushButton*, EMPTYARG ) +{ + SetUpdateMode(TRUE); + SwPagePreViewPrtData aData; + aData.SetRow(rParentWin.GetRow()); + aData.SetCol(rParentWin.GetCol()); + FillControls(aData); + bStandard = TRUE; + aLSpaceMF.SetText(aEmptyStr); + aRSpaceMF.SetText(aEmptyStr); + aTSpaceMF.SetText(aEmptyStr); + aBSpaceMF.SetText(aEmptyStr); + aHSpaceMF.SetText(aEmptyStr); + aVSpaceMF.SetText(aEmptyStr); + aPreviewWin.Invalidate(); + SetUpdateMode(FALSE); + return 0; +} +/* -----------------20.08.98 15:28------------------- + * Preview anzeigen + * --------------------------------------------------*/ +void PrtPrvWindow::Paint(const Rectangle&) +{ + Size aWinSize(GetOutputSizePixel()); + long nWidth = rSettings.aPrtSize.Width(); + long nHeight = rSettings.aPrtSize.Height(); + BOOL bHoriValid = (aWinSize.Width() * 100 / aWinSize.Height()) < + (rSettings.aPrtSize.Width() * 100/ rSettings.aPrtSize.Height()); + Fraction aXScale( aWinSize.Width(), Max( nWidth , 1L ) ); + Fraction aYScale( aWinSize.Height(), Max( nHeight, 1L ) ); + MapMode aMapMode( GetMapMode() ); + aMapMode.SetScaleX( bHoriValid ? aXScale : aYScale); + aMapMode.SetScaleY( bHoriValid ? aXScale : aYScale); + SetMapMode( aMapMode ); + + aWinSize = GetOutputSize(); + + Point aOffset(0,0); + if(bHoriValid) + aOffset.Y() = (aWinSize.Height() - rSettings.aPrtSize.Height()) / 2; + else + aOffset.X() = (aWinSize.Width() - rSettings.aPrtSize.Width()) / 2;; + + + BOOL bUseSystemColors = SvtAccessibilityOptions().GetIsForPagePreviews() + && GetSettings().GetStyleSettings().GetHighContrastMode(); + + //der weisse Seitenhintergrund + Rectangle aRect(aOffset, rSettings.aPrtSize); + if(bUseSystemColors) + { + SetFillColor( GetSettings().GetStyleSettings().GetWindowColor() ); + SetLineColor( SwViewOption::GetFontColor() ); + } + else + { + SetFillColor( Color( COL_WHITE ) ); + SetLineColor(Color( COL_BLACK ) ); + } + + DrawRect(aRect); + + Point aTL(aOffset); + aTL.X() += rSettings.nLeft; + aTL.Y() += rSettings.nTop; + + Size aPrvPageSize((rSettings.aPrvPrtSize.Width() - (rSettings.nCols - 1) * rSettings.nHori) / rSettings.nCols, + (rSettings.aPrvPrtSize.Height() - (rSettings.nRows - 1) * rSettings.nVert) / rSettings.nRows); + // jetzt muss noch das unterschiedliche Groessenverhaeltnis berechnet werden, um es an + // der richtigen Seite abzuziehen. + //... + long nSourceScale = rSettings.aPageMaxSize.Width() * 100 / rSettings.aPageMaxSize.Height(); + long nDestScale = aPrvPageSize.Width() * 100 / aPrvPageSize.Height() ; + if(nSourceScale > nDestScale) // die Seite ist relativ breiter als das vorhandene Rechteck + { + aPrvPageSize.Height() = aPrvPageSize.Width() * 100 / nSourceScale; + } + else + { + aPrvPageSize.Width() = aPrvPageSize.Height() * nSourceScale / 100; + } + + if(bUseSystemColors) + SetFillColor( GetSettings().GetStyleSettings().GetWindowColor() ); + else + SetFillColor( Color( COL_GRAY ) ); + + + aRect = Rectangle(aTL, aPrvPageSize); + for(USHORT i = 0; i < rSettings.nRows; i++) + { + for(USHORT j = 0; j < rSettings.nCols; j++) + { + DrawRect(aRect); + aRect.Move(aPrvPageSize.Width() + rSettings.nHori, 0); + } + + aRect.Move( 0, aPrvPageSize.Height() + rSettings.nVert); + aRect.SetPos(Point(aTL.X(), aRect.TopLeft().Y())); + } + //rSettings; +} + +/* */ +/*-------------------------------------------------------------------- + Beschreibung: + --------------------------------------------------------------------*/ + +// alles fuers SwPagePreViewWin + + +SwPagePreViewWin::SwPagePreViewWin( Window *pParent, SwPagePreView& rPView ) + : Window( pParent, WinBits( WB_CLIPCHILDREN) ), + mpViewShell( 0 ), + mrView( rPView ), + mbCalcScaleForPreviewLayout( true ), + maPaintedPreviewDocRect( Rectangle(0,0,0,0) ) +{ + SetOutDevViewType( OUTDEV_VIEWTYPE_PRINTPREVIEW ); //#106611# + SetHelpId(HID_PAGEPREVIEW); + SetFillColor( GetBackground().GetColor() ); + SetLineColor( GetBackground().GetColor()); + SetMapMode( MapMode(MAP_TWIP) ); + + const SwMasterUsrPref *pUsrPref = SW_MOD()->GetUsrPref(FALSE); + mnRow = pUsrPref->GetPagePrevRow(); // 1 Zeile + mnCol = pUsrPref->GetPagePrevCol(); // 1 Spalte + // OD 24.03.2003 #108282# - member <mnVirtPage> no longer exists. + mnSttPage = USHRT_MAX; +} + +/*-------------------------------------------------------------------- + Beschreibung: + --------------------------------------------------------------------*/ + + +SwPagePreViewWin::~SwPagePreViewWin() +{ + if( mpViewShell ) + delete mpViewShell; +} + +/*-------------------------------------------------------------------- + Beschreibung: + --------------------------------------------------------------------*/ + + +void SwPagePreViewWin::Paint( const Rectangle& rRect ) +{ + if( !mpViewShell || !mpViewShell->GetLayout() ) + return; + + if( USHRT_MAX == mnSttPage ) // wurde noch nie berechnet ? (Init-Phase!) + { + // das ist die Size, auf die ich mich immer beziehe + if( !maPxWinSize.Height() || !maPxWinSize.Width() ) + maPxWinSize = GetOutputSizePixel(); + + Rectangle aRect( LogicToPixel( rRect )); + mpPgPrevwLayout->Prepare( 1, Point(0,0), maPxWinSize, + mnSttPage, maPaintedPreviewDocRect ); + SetSelectedPage( 1 ); + mpPgPrevwLayout->Paint( PixelToLogic( aRect ) ); + SetPagePreview(mnRow, mnCol); + } + else + { + MapMode aMM( GetMapMode() ); + aMM.SetScaleX( maScale ); + aMM.SetScaleY( maScale ); + SetMapMode( aMM ); + mpPgPrevwLayout->Paint( rRect ); + } +} + +/*-------------------------------------------------------------------- + Beschreibung: + --------------------------------------------------------------------*/ +void SwPagePreViewWin::CalcWish( BYTE nNewRow, BYTE nNewCol ) +{ + if( !mpViewShell || !mpViewShell->GetLayout() ) + return; + + USHORT nOldCol = mnCol; + // OD 02.12.2002 #103492# - update <mnRow> and <mnCol>. + mnRow = nNewRow; + mnCol = nNewCol; + USHORT nPages = mnRow * mnCol, + nLastSttPg = mrView.GetPageCount()+1 > nPages + ? mrView.GetPageCount()+1 - nPages : 0; + if( mnSttPage > nLastSttPg ) + mnSttPage = nLastSttPg; + + mpPgPrevwLayout->Init( mnCol, mnRow, maPxWinSize, true ); + mpPgPrevwLayout->Prepare( mnSttPage, Point(0,0), maPxWinSize, + mnSttPage, maPaintedPreviewDocRect ); + SetSelectedPage( mnSttPage ); + SetPagePreview(mnRow, mnCol); + maScale = GetMapMode().GetScaleX(); + + // falls an der Spaltigkeit gedreht wurde, so muss der Sonderfall + // Einspaltig beachtet und ggfs. der Scrollbar korrigiert werden + if( (1 == nOldCol) ^ (1 == mnCol) ) + mrView.ScrollDocSzChg(); + + // Sortierung muss eingehalten werden!! + // OD 24.03.2003 #108282# - additional invalidate page status. + static USHORT __READONLY_DATA aInval[] = + { + SID_ATTR_ZOOM, SID_ZOOM_OUT, SID_ZOOM_IN, + FN_PREVIEW_ZOOM, + FN_START_OF_DOCUMENT, FN_END_OF_DOCUMENT, FN_PAGEUP, FN_PAGEDOWN, + FN_STAT_PAGE, FN_STAT_ZOOM, + FN_SHOW_TWO_PAGES, FN_SHOW_MULTIPLE_PAGES, + 0 + }; + SfxBindings& rBindings = mrView.GetViewFrame()->GetBindings(); + rBindings.Invalidate( aInval ); + rBindings.Update( FN_SHOW_TWO_PAGES ); + rBindings.Update( FN_SHOW_MULTIPLE_PAGES ); + // OD 18.12.2002 #103492# - adjust scrollbars + mrView.ScrollViewSzChg(); +} +/*-------------------------------------------------------------------- + Beschreibung:, mnSttPage is Absolute + --------------------------------------------------------------------*/ + + +int SwPagePreViewWin::MovePage( int eMoveMode ) +{ + // soviele Seiten hoch + USHORT nPages = mnRow * mnCol; + USHORT nNewSttPage = mnSttPage; + // OD 04.12.2002 #103492# + USHORT nPageCount = mrView.GetPageCount(); + USHORT nDefSttPg = GetDefSttPage(); + // OD 06.12.2002 #103492# + bool bPaintPageAtFirstCol = true; + + switch( eMoveMode ) + { + case MV_PAGE_UP: + { + const sal_uInt16 nRelSttPage = mpPgPrevwLayout->ConvertAbsoluteToRelativePageNum( mnSttPage ); + const sal_uInt16 nNewAbsSttPage = nRelSttPage - nPages > 0 ? + mpPgPrevwLayout->ConvertRelativeToAbsolutePageNum( nRelSttPage - nPages ) : + nDefSttPg; + nNewSttPage = nNewAbsSttPage; + + const sal_uInt16 nRelSelPage = mpPgPrevwLayout->ConvertAbsoluteToRelativePageNum( SelectedPage() ); + const sal_uInt16 nNewRelSelPage = nRelSelPage - nPages > 0 ? + nRelSelPage - nPages : + 1; + SetSelectedPage( mpPgPrevwLayout->ConvertRelativeToAbsolutePageNum( nNewRelSelPage ) ); + + break; + } + case MV_PAGE_DOWN: + { + const sal_uInt16 nRelSttPage = mpPgPrevwLayout->ConvertAbsoluteToRelativePageNum( mnSttPage ); + const sal_uInt16 nNewAbsSttPage = mpPgPrevwLayout->ConvertRelativeToAbsolutePageNum( nRelSttPage + nPages ); + nNewSttPage = nNewAbsSttPage < nPageCount ? nNewAbsSttPage : nPageCount; + + const sal_uInt16 nRelSelPage = mpPgPrevwLayout->ConvertAbsoluteToRelativePageNum( SelectedPage() ); + const sal_uInt16 nNewAbsSelPage = mpPgPrevwLayout->ConvertRelativeToAbsolutePageNum( nRelSelPage + nPages ); + SetSelectedPage( nNewAbsSelPage < nPageCount ? nNewAbsSelPage : nPageCount ); + + break; + } + case MV_DOC_STT: + nNewSttPage = nDefSttPg; + SetSelectedPage( mpPgPrevwLayout->ConvertRelativeToAbsolutePageNum( nNewSttPage ? nNewSttPage : 1 ) ); + break; + case MV_DOC_END: + // OD 03.12.2002 #103492# - correct calculation of new start page. + nNewSttPage = nPageCount; + SetSelectedPage( nPageCount ); + break; + // OD 12.12.2002 #103492# - add new move mode + case MV_SELPAGE: + // <nNewSttPage> and <SelectedPage()> are already set. + // OD 20.02.2003 #107369# - not start at first column, only if the + // complete preview layout columns doesn't fit into window. + if ( !mpPgPrevwLayout->DoesPreviewLayoutColsFitIntoWindow() ) + bPaintPageAtFirstCol = false; + break; + case MV_SCROLL: + // OD 17.01.2003 #103492# - check, if paint page at first column + // has to be avoided + if ( !mpPgPrevwLayout->DoesPreviewLayoutRowsFitIntoWindow() || + !mpPgPrevwLayout->DoesPreviewLayoutColsFitIntoWindow() ) + bPaintPageAtFirstCol = false; + break; + case MV_NEWWINSIZE: + // OD 18.12.2002 #103492# - nothing special to do. + break; + case MV_CALC: + // OD 18.12.2002 #103492# - re-init page preview layout. + mpPgPrevwLayout->ReInit(); + + // OD 03.12.2002 #103492# - correct calculation of new start page. + if( nNewSttPage > nPageCount ) + nNewSttPage = nPageCount; + + // OD 18.12.2002 #103492# - correct selected page number + if( SelectedPage() > nPageCount ) + SetSelectedPage( nNewSttPage ? nNewSttPage : 1 ); + } + + mpPgPrevwLayout->Prepare( nNewSttPage, Point(0,0), maPxWinSize, + nNewSttPage, + maPaintedPreviewDocRect, bPaintPageAtFirstCol ); + if( nNewSttPage == mnSttPage && + eMoveMode != MV_SELPAGE ) + return FALSE; + + SetPagePreview(mnRow, mnCol); + mnSttPage = nNewSttPage; + + // OD 24.03.2003 #108282# - additional invalidate page status. + static USHORT __READONLY_DATA aInval[] = + { + FN_START_OF_DOCUMENT, FN_END_OF_DOCUMENT, FN_PAGEUP, FN_PAGEDOWN, + FN_STAT_PAGE, 0 + }; + + SfxBindings& rBindings = mrView.GetViewFrame()->GetBindings(); + rBindings.Invalidate( aInval ); + + return TRUE; +} + +/*-------------------------------------------------------------------- + Beschreibung: + --------------------------------------------------------------------*/ + + +void SwPagePreViewWin::SetWinSize( const Size& rNewSize ) +{ + // die Size wollen wir aber immer in Pixel-Einheiten haben + maPxWinSize = LogicToPixel( rNewSize ); + + if( USHRT_MAX == mnSttPage ) + { + mnSttPage = GetDefSttPage(); + SetSelectedPage( GetDefSttPage() ); + } + + if ( mbCalcScaleForPreviewLayout ) + { + mpPgPrevwLayout->Init( mnCol, mnRow, maPxWinSize, true ); + maScale = GetMapMode().GetScaleX(); + } + mpPgPrevwLayout->Prepare( mnSttPage, Point(0,0), maPxWinSize, + mnSttPage, maPaintedPreviewDocRect ); + if ( mbCalcScaleForPreviewLayout ) + { + SetSelectedPage( mnSttPage ); + mbCalcScaleForPreviewLayout = false; + } + SetPagePreview(mnRow, mnCol); + maScale = GetMapMode().GetScaleX(); +} + + +/*-------------------------------------------------------------------- + Beschreibung: + --------------------------------------------------------------------*/ + + +void SwPagePreViewWin::GetStatusStr( String& rStr, USHORT nPageCnt ) const +{ + // OD 24.03.2003 #108282# - show physical and virtual page number of + // selected page, if it's visible. + sal_uInt16 nPageNum; + if ( mpPgPrevwLayout->IsPageVisible( mpPgPrevwLayout->SelectedPage() ) ) + { + nPageNum = mpPgPrevwLayout->SelectedPage(); + } + else + { + nPageNum = mnSttPage > 1 ? mnSttPage : 1; + } + sal_uInt16 nVirtPageNum = mpPgPrevwLayout->GetVirtPageNumByPageNum( nPageNum ); + if( nVirtPageNum && nVirtPageNum != nPageNum ) + { + rStr += String::CreateFromInt32( nVirtPageNum ); + rStr += ' '; + } + rStr += String::CreateFromInt32( nPageNum ); + rStr.AppendAscii( RTL_CONSTASCII_STRINGPARAM(" / ")); + rStr += String::CreateFromInt32( nPageCnt ); +} + +/*-------------------------------------------------------------------- + Beschreibung: + --------------------------------------------------------------------*/ + + +void SwPagePreViewWin::KeyInput( const KeyEvent &rKEvt ) +{ + const KeyCode& rKeyCode = rKEvt.GetKeyCode(); + USHORT nKey = rKeyCode.GetCode(); + BOOL bHandled = FALSE; + if(!rKeyCode.GetModifier()) + { + USHORT nSlot = 0; + switch(nKey) + { + case KEY_ADD : nSlot = SID_ZOOM_OUT; break; + case KEY_ESCAPE: nSlot = FN_CLOSE_PAGEPREVIEW; break; + case KEY_SUBTRACT : nSlot = SID_ZOOM_IN; break; + } + if(nSlot) + { + bHandled = TRUE; + mrView.GetViewFrame()->GetDispatcher()->Execute( + nSlot, SFX_CALLMODE_ASYNCHRON ); + } + } + if( !bHandled && !mrView.KeyInput( rKEvt ) ) + Window::KeyInput( rKEvt ); +} + +/****************************************************************************** + * Beschreibung: + ******************************************************************************/ + +void SwPagePreViewWin::Command( const CommandEvent& rCEvt ) +{ + BOOL bCallBase = TRUE; + switch( rCEvt.GetCommand() ) + { + case COMMAND_CONTEXTMENU: + mrView.GetViewFrame()->GetDispatcher()->ExecutePopup(); + bCallBase = FALSE; + break; + + case COMMAND_WHEEL: + case COMMAND_STARTAUTOSCROLL: + case COMMAND_AUTOSCROLL: + { + const CommandWheelData* pData = rCEvt.GetWheelData(); + if( pData ) + { + const CommandWheelData aDataNew(pData->GetDelta(),pData->GetNotchDelta(),COMMAND_WHEEL_PAGESCROLL, + pData->GetMode(),pData->GetModifier(),pData->IsHorz()); + const CommandEvent aEvent( rCEvt.GetMousePosPixel(),rCEvt.GetCommand(),rCEvt.IsMouseEvent(),&aDataNew); + bCallBase = !mrView.HandleWheelCommands( aEvent ); + } + else + bCallBase = !mrView.HandleWheelCommands( rCEvt ); + } + break; + default: + // OD 17.12.2002 #103492# - delete assertion + ; + } + + if( bCallBase ) + Window::Command( rCEvt ); +} + +void SwPagePreViewWin::MouseButtonDown( const MouseEvent& rMEvt ) +{ + // OD 17.12.2002 #103492# - consider single-click to set selected page + if( MOUSE_LEFT == ( rMEvt.GetModifier() + rMEvt.GetButtons() ) ) + { + Point aPrevwPos( PixelToLogic( rMEvt.GetPosPixel() ) ); + Point aDocPos; + bool bPosInEmptyPage; + sal_uInt16 nNewSelectedPage; + bool bIsDocPos = + mpPgPrevwLayout->IsPrevwPosInDocPrevwPage( aPrevwPos, + aDocPos, bPosInEmptyPage, nNewSelectedPage ); + if ( bIsDocPos && rMEvt.GetClicks() == 2 ) + { + // close page preview, set new cursor position and switch to + // normal view. + String sNewCrsrPos( String::CreateFromInt32( aDocPos.X() )); + ((( sNewCrsrPos += ';' ) + += String::CreateFromInt32( aDocPos.Y() )) ) + += ';'; + mrView.SetNewCrsrPos( sNewCrsrPos ); + + SfxViewFrame *pTmpFrm = mrView.GetViewFrame(); + pTmpFrm->GetBindings().Execute( SID_VIEWSHELL0, NULL, 0, + SFX_CALLMODE_ASYNCHRON ); + } + else if ( bIsDocPos || bPosInEmptyPage ) + // OD 2004-03-04 #i20684# - add missing parenthesis + { + // show clicked page as the selected one + mpPgPrevwLayout->MarkNewSelectedPage( nNewSelectedPage ); + GetViewShell()->ShowPreViewSelection( nNewSelectedPage ); + // OD 19.02.2003 #107369# - adjust position at vertical scrollbar. + if ( mpPgPrevwLayout->DoesPreviewLayoutRowsFitIntoWindow() ) + { + mrView.SetVScrollbarThumbPos( nNewSelectedPage ); + } + // OD 24.03.2003 #108282# - invalidate page status. + static USHORT __READONLY_DATA aInval[] = + { + FN_STAT_PAGE, 0 + }; + SfxBindings& rBindings = mrView.GetViewFrame()->GetBindings(); + rBindings.Invalidate( aInval ); + } + } +} + +/****************************************************************************** + * Beschreibung: Userprefs bzw Viewoptions setzen + ******************************************************************************/ + + +void SwPagePreViewWin::SetPagePreview( BYTE nRow, BYTE nCol ) +{ + SwMasterUsrPref *pOpt = (SwMasterUsrPref *)SW_MOD()->GetUsrPref(FALSE); + + if (nRow != pOpt->GetPagePrevRow() || nCol != pOpt->GetPagePrevCol()) + { + pOpt->SetPagePrevRow( nRow ); + pOpt->SetPagePrevCol( nCol ); + pOpt->SetModified(); + + //Scrollbar updaten! + mrView.ScrollViewSzChg(); + } +} + +/** get selected page in document preview + + OD 13.12.2002 #103492# + + @author OD +*/ +sal_uInt16 SwPagePreViewWin::SelectedPage() const +{ + return mpPgPrevwLayout->SelectedPage(); +} + +/** set selected page number in document preview + + OD 13.12.2002 #103492# + + @author OD +*/ +void SwPagePreViewWin::SetSelectedPage( sal_uInt16 _nSelectedPageNum ) +{ + mpPgPrevwLayout->SetSelectedPage( _nSelectedPageNum ); +} + +/** method to enable/disable book preview + + OD 2004-03-05 #i18143# + + @author OD +*/ +bool SwPagePreViewWin::SetBookPreviewMode( const bool _bBookPreview ) +{ + return mpPgPrevwLayout->SetBookPreviewMode( _bBookPreview, + mnSttPage, + maPaintedPreviewDocRect ); +} + +void SwPagePreViewWin::DataChanged( const DataChangedEvent& rDCEvt ) +{ + Window::DataChanged( rDCEvt ); + + switch( rDCEvt.GetType() ) + { + case DATACHANGED_SETTINGS: + // ScrollBars neu anordnen bzw. Resize ausloesen, da sich + // ScrollBar-Groesse geaendert haben kann. Dazu muss dann im + // Resize-Handler aber auch die Groesse der ScrollBars aus + // den Settings abgefragt werden. + if( rDCEvt.GetFlags() & SETTINGS_STYLE ) + mrView.InvalidateBorder(); //Scrollbarbreiten + //#106746# zoom has to be disabled if Accessibility support is switched on + lcl_InvalidateZoomSlots(mrView.GetViewFrame()->GetBindings()); + break; + + case DATACHANGED_PRINTER: + case DATACHANGED_DISPLAY: + case DATACHANGED_FONTS: + case DATACHANGED_FONTSUBSTITUTION: + mrView.GetDocShell()->UpdateFontList(); //Fontwechsel + if ( mpViewShell->GetWin() ) + mpViewShell->GetWin()->Invalidate(); + break; + } +} + +/** help method to execute SfxRequest FN_PAGEUP and FN_PAGEDOWN + + OD 04.03.2003 #107369# + + @author OD +*/ +void SwPagePreView::_ExecPgUpAndPgDown( const bool _bPgUp, + SfxRequest* _pReq ) +{ + SwPagePreviewLayout* pPagePrevwLay = GetViewShell()->PagePreviewLayout(); + // check, if top/bottom of preview is *not* already visible. + if( pPagePrevwLay->GetWinPagesScrollAmount( _bPgUp ? -1 : 1 ) != 0 ) + { + if ( pPagePrevwLay->DoesPreviewLayoutRowsFitIntoWindow() && + pPagePrevwLay->DoesPreviewLayoutColsFitIntoWindow() ) + { + const int eMvMode = _bPgUp ? + SwPagePreViewWin::MV_PAGE_UP : + SwPagePreViewWin::MV_PAGE_DOWN; + if ( ChgPage( eMvMode, TRUE ) ) + aViewWin.Invalidate(); + } + else + { + SwTwips nScrollAmount; + sal_uInt16 nNewSelectedPageNum = 0; + const sal_uInt16 nVisPages = aViewWin.GetRow() * aViewWin.GetCol(); + if( _bPgUp ) + { + if ( pPagePrevwLay->DoesPreviewLayoutRowsFitIntoWindow() ) + { + nScrollAmount = pPagePrevwLay->GetWinPagesScrollAmount( -1 ); + if ( (aViewWin.SelectedPage() - nVisPages) > 0 ) + nNewSelectedPageNum = aViewWin.SelectedPage() - nVisPages; + else + nNewSelectedPageNum = 1; + } + else + nScrollAmount = - Min( aViewWin.GetOutputSize().Height(), + aViewWin.GetPaintedPreviewDocRect().Top() ); + } + else + { + if ( pPagePrevwLay->DoesPreviewLayoutRowsFitIntoWindow() ) + { + nScrollAmount = pPagePrevwLay->GetWinPagesScrollAmount( 1 ); + if ( (aViewWin.SelectedPage() + nVisPages) <= mnPageCount ) + nNewSelectedPageNum = aViewWin.SelectedPage() + nVisPages; + else + nNewSelectedPageNum = mnPageCount; + } + else + nScrollAmount = Min( aViewWin.GetOutputSize().Height(), + ( pPagePrevwLay->GetPrevwDocSize().Height() - + aViewWin.GetPaintedPreviewDocRect().Bottom() ) ); + } + aViewWin.Scroll( 0, nScrollAmount ); + if ( nNewSelectedPageNum != 0 ) + { + aViewWin.SetSelectedPage( nNewSelectedPageNum ); + } + ScrollViewSzChg(); + // OD 24.03.2003 #108282# - additional invalidate page status. + static USHORT __READONLY_DATA aInval[] = + { + FN_START_OF_DOCUMENT, FN_END_OF_DOCUMENT, FN_PAGEUP, FN_PAGEDOWN, + FN_STAT_PAGE, 0 + }; + SfxBindings& rBindings = GetViewFrame()->GetBindings(); + rBindings.Invalidate( aInval ); + aViewWin.Invalidate(); + } + } + + if ( _pReq ) + _pReq->Done(); +} + +/*-------------------------------------------------------------------- + Beschreibung: + --------------------------------------------------------------------*/ +// dann mal alles fuer die SwPagePreView +void SwPagePreView::Execute( SfxRequest &rReq ) +{ + int eMvMode; + BYTE nRow = 1; + BOOL bRetVal = FALSE; + bool bRefresh = true; + + switch(rReq.GetSlot()) + { + case FN_REFRESH_VIEW: + case FN_STAT_PAGE: + case FN_STAT_ZOOM: + break; + + case FN_SHOW_MULTIPLE_PAGES: + { + const SfxItemSet *pArgs = rReq.GetArgs(); + if( pArgs && pArgs->Count() >= 2 ) + { + BYTE nCols = (BYTE)((SfxUInt16Item &)pArgs->Get( + SID_ATTR_TABLE_COLUMN)).GetValue(); + BYTE nRows = (BYTE)((SfxUInt16Item &)pArgs->Get( + SID_ATTR_TABLE_ROW)).GetValue(); + aViewWin.CalcWish( nRows, nCols ); + + } + else + SwPreViewZoomDlg( aViewWin ).Execute(); + + } + break; + case FN_SHOW_BOOKVIEW: + { + const SfxItemSet* pArgs = rReq.GetArgs(); + const SfxPoolItem* pItem; + bool bBookPreview = GetViewShell()->GetViewOptions()->IsPagePrevBookview(); + if( pArgs && SFX_ITEM_SET == pArgs->GetItemState( FN_SHOW_BOOKVIEW, FALSE, &pItem ) ) + { + bBookPreview = static_cast< const SfxBoolItem* >( pItem )->GetValue(); + ( ( SwViewOption* ) GetViewShell()->GetViewOptions() )->SetPagePrevBookview( bBookPreview ); + // cast is not gentleman like, but it's common use in writer and in this case + } + if ( aViewWin.SetBookPreviewMode( bBookPreview ) ) + { + // book preview mode changed. Thus, adjust scrollbars and + // invalidate corresponding states. + ScrollViewSzChg(); + static USHORT __READONLY_DATA aInval[] = + { + FN_START_OF_DOCUMENT, FN_END_OF_DOCUMENT, FN_PAGEUP, FN_PAGEDOWN, + FN_STAT_PAGE, FN_SHOW_BOOKVIEW, 0 + }; + SfxBindings& rBindings = GetViewFrame()->GetBindings(); + rBindings.Invalidate( aInval ); + aViewWin.Invalidate(); + } + + } + break; + case FN_SHOW_TWO_PAGES: + aViewWin.CalcWish( nRow, 2 ); + break; + + case FN_PREVIEW_ZOOM: + case SID_ATTR_ZOOM: + { + const SfxItemSet *pArgs = rReq.GetArgs(); + const SfxPoolItem* pItem; + AbstractSvxZoomDialog *pDlg = 0; + if(!pArgs) + { + SfxItemSet aCoreSet(GetPool(), SID_ATTR_ZOOM, SID_ATTR_ZOOM); + const SwViewOption* pVOpt = GetViewShell()->GetViewOptions(); + SvxZoomItem aZoom( (SvxZoomType)pVOpt->GetZoomType(), + pVOpt->GetZoom() ); + aZoom.SetValueSet( + SVX_ZOOM_ENABLE_50| + SVX_ZOOM_ENABLE_75| + SVX_ZOOM_ENABLE_100| + SVX_ZOOM_ENABLE_150| + SVX_ZOOM_ENABLE_200| + SVX_ZOOM_ENABLE_WHOLEPAGE); + aCoreSet.Put( aZoom ); + + SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); + if(pFact) + { + pDlg = pFact->CreateSvxZoomDialog(&GetViewFrame()->GetWindow(), aCoreSet); + DBG_ASSERT(pDlg, "Dialogdiet fail!"); + } + + pDlg->SetLimits( MINZOOM, MAXZOOM ); + + if( pDlg->Execute() != RET_CANCEL ) + pArgs = pDlg->GetOutputItemSet(); + } + if( pArgs ) + { + enum SvxZoomType eType = SVX_ZOOM_PERCENT; + USHORT nZoomFactor = USHRT_MAX; + if(SFX_ITEM_SET == pArgs->GetItemState(SID_ATTR_ZOOM, TRUE, &pItem)) + { + eType = ((const SvxZoomItem *)pItem)->GetType(); + nZoomFactor = ((const SvxZoomItem *)pItem)->GetValue(); + } + else if(SFX_ITEM_SET == pArgs->GetItemState(FN_PREVIEW_ZOOM, TRUE, &pItem)) + nZoomFactor = ((const SfxUInt16Item *)pItem)->GetValue(); + if(USHRT_MAX != nZoomFactor) + SetZoom(eType, nZoomFactor); + } + delete pDlg; + } + break; + case SID_ATTR_ZOOMSLIDER : + { + const SfxItemSet *pArgs = rReq.GetArgs(); + const SfxPoolItem* pItem; + + if ( pArgs && SFX_ITEM_SET == pArgs->GetItemState(SID_ATTR_ZOOMSLIDER, TRUE, &pItem ) ) + { + const USHORT nCurrentZoom = ((const SvxZoomSliderItem *)pItem)->GetValue(); + SetZoom( SVX_ZOOM_PERCENT, nCurrentZoom ); + } + } + break; + case SID_ZOOM_IN: + case SID_ZOOM_OUT: + { + enum SvxZoomType eType = SVX_ZOOM_PERCENT; + const SwViewOption* pVOpt = GetViewShell()->GetViewOptions(); + SetZoom(eType, + lcl_GetNextZoomStep(pVOpt->GetZoom(), SID_ZOOM_IN == rReq.GetSlot())); + } + break; + case FN_CHAR_LEFT: + case FN_CHAR_RIGHT: + case FN_LINE_UP: + case FN_LINE_DOWN: + { + SwPagePreviewLayout* pPagePrevwLay = GetViewShell()->PagePreviewLayout(); + sal_uInt16 nNewSelectedPage; + sal_uInt16 nNewStartPage; + Point aNewStartPos; + sal_Int16 nHoriMove = 0; + sal_Int16 nVertMove = 0; + switch(rReq.GetSlot()) + { + case FN_CHAR_LEFT: nHoriMove = -1; break; + case FN_CHAR_RIGHT: nHoriMove = 1; break; + case FN_LINE_UP: nVertMove = -1; break; + case FN_LINE_DOWN: nVertMove = 1; break; + } + pPagePrevwLay->CalcStartValuesForSelectedPageMove( nHoriMove, nVertMove, + nNewSelectedPage, nNewStartPage, aNewStartPos ); + if ( aViewWin.SelectedPage() != nNewSelectedPage ) + { + if ( pPagePrevwLay->IsPageVisible( nNewSelectedPage ) ) + { + pPagePrevwLay->MarkNewSelectedPage( nNewSelectedPage ); + // OD 19.02.2003 #107369# - adjust position at vertical scrollbar. + SetVScrollbarThumbPos( nNewSelectedPage ); + bRefresh = false; + } + else + { + aViewWin.SetSelectedPage( nNewSelectedPage ); + aViewWin.SetSttPage( nNewStartPage ); + int nRet = ChgPage( SwPagePreViewWin::MV_SELPAGE, TRUE ); + bRefresh = 0 != nRet; + } + GetViewShell()->ShowPreViewSelection( nNewSelectedPage ); + // OD 24.03.2003 #108282# - invalidate page status. + static USHORT __READONLY_DATA aInval[] = + { + FN_STAT_PAGE, 0 + }; + SfxBindings& rBindings = GetViewFrame()->GetBindings(); + rBindings.Invalidate( aInval ); + rReq.Done(); + } + else + { + bRefresh = false; + } + break; + } + case FN_PAGEUP: + case FN_PAGEDOWN: + { + _ExecPgUpAndPgDown( rReq.GetSlot() == FN_PAGEUP, &rReq ); + break; + } + case FN_START_OF_LINE: + case FN_START_OF_DOCUMENT: + aViewWin.SetSelectedPage( 1 ); + eMvMode = SwPagePreViewWin::MV_DOC_STT; bRetVal = TRUE; goto MOVEPAGE; + case FN_END_OF_LINE: + case FN_END_OF_DOCUMENT: + aViewWin.SetSelectedPage( mnPageCount ); + eMvMode = SwPagePreViewWin::MV_DOC_END; bRetVal = TRUE; goto MOVEPAGE; +MOVEPAGE: + { + int nRet = ChgPage( eMvMode, TRUE ); + // return value fuer Basic + if(bRetVal) + rReq.SetReturnValue(SfxBoolItem(rReq.GetSlot(), nRet == 0)); + + bRefresh = 0 != nRet; + rReq.Done(); + } + break; + + case FN_PRINT_PAGEPREVIEW: + { + const SwPagePreViewPrtData* pPPVPD = aViewWin.GetViewShell()->GetDoc()->GetPreViewPrtData(); + // die Sache mit der Orientation + if(pPPVPD) + { + SfxPrinter* pPrinter = GetPrinter( TRUE ); + if((pPrinter->GetOrientation() == ORIENTATION_LANDSCAPE) + != pPPVPD->GetLandscape()) + pPrinter->SetOrientation(pPPVPD->GetLandscape() ? ORIENTATION_LANDSCAPE : ORIENTATION_PORTRAIT); + } + ::SetAppPrintOptions( aViewWin.GetViewShell(), FALSE ); + bNormalPrint = FALSE; + USHORT nPrtSlot = SID_PRINTDOC; + rReq.SetSlot( nPrtSlot ); + SfxViewShell::ExecuteSlot( rReq, SfxViewShell::GetInterface() ); + rReq.SetSlot( FN_PRINT_PAGEPREVIEW ); + return; + } + case SID_PRINTDOCDIRECT: + case SID_PRINTDOC: + ::SetAppPrintOptions( aViewWin.GetViewShell(), FALSE ); + bNormalPrint = TRUE; + SfxViewShell::ExecuteSlot( rReq, SfxViewShell::GetInterface() ); + return; + case FN_CLOSE_PAGEPREVIEW: + case SID_PRINTPREVIEW: + // print preview is now always in the same frame as the tab view + // -> always switch this frame back to normal view + // (ScTabViewShell ctor reads stored view data) + GetViewFrame()->GetDispatcher()->Execute( SID_VIEWSHELL0, 0, 0, SFX_CALLMODE_ASYNCHRON ); + break; + case FN_INSERT_BREAK: + { + USHORT nSelPage = aViewWin.SelectedPage(); + //if a dummy page is selected (e.g. a non-existing right/left page) + //the direct neighbor is used + if(GetViewShell()->IsDummyPage( nSelPage ) && GetViewShell()->IsDummyPage( --nSelPage )) + nSelPage +=2; + SetNewPage( nSelPage ); + SfxViewFrame *pTmpFrm = GetViewFrame(); + pTmpFrm->GetBindings().Execute( SID_VIEWSHELL0, NULL, 0, + SFX_CALLMODE_ASYNCHRON ); + } + break; + default: + ASSERT(!this, falscher Dispatcher); + return; + } + + if( bRefresh ) + aViewWin.Invalidate(); +} + +/*-------------------------------------------------------------------- + Beschreibung: + --------------------------------------------------------------------*/ + + +void SwPagePreView::GetState( SfxItemSet& rSet ) +{ + SfxWhichIter aIter(rSet); + BYTE nRow = 1; + USHORT nWhich = aIter.FirstWhich(); + ASSERT(nWhich, leeres Set); + SwPagePreviewLayout* pPagePrevwLay = GetViewShell()->PagePreviewLayout(); + //#106746# zoom has to be disabled if Accessibility support is switched on + BOOL bZoomEnabled = !Application::GetSettings().GetMiscSettings().GetEnableATToolSupport(); + + while(nWhich) + { + switch(nWhich) + { + case SID_BROWSER_MODE: + case FN_PRINT_LAYOUT: + rSet.DisableItem(nWhich); + break; + case FN_START_OF_DOCUMENT: + { + if ( pPagePrevwLay->IsPageVisible( 1 ) ) + rSet.DisableItem(nWhich); + break; + } + case FN_END_OF_DOCUMENT: + { + if ( pPagePrevwLay->IsPageVisible( mnPageCount ) ) + rSet.DisableItem(nWhich); + break; + } + case FN_PAGEUP: + { + if( pPagePrevwLay->GetWinPagesScrollAmount( -1 ) == 0 ) + rSet.DisableItem(nWhich); + break; + } + case FN_PAGEDOWN: + { + if( pPagePrevwLay->GetWinPagesScrollAmount( 1 ) == 0 ) + rSet.DisableItem(nWhich); + break; + } + + case FN_STAT_PAGE: + { + String aStr( sPageStr ); + aViewWin.GetStatusStr( aStr, mnPageCount ); + rSet.Put( SfxStringItem( nWhich, aStr) ); + } + break; + + case SID_ATTR_ZOOM: + case FN_STAT_ZOOM: + { + if(bZoomEnabled) + { + const SwViewOption* pVOpt = GetViewShell()->GetViewOptions(); + SvxZoomItem aZoom((SvxZoomType)pVOpt->GetZoomType(), + pVOpt->GetZoom()); + aZoom.SetValueSet( + SVX_ZOOM_ENABLE_50| + SVX_ZOOM_ENABLE_75| + SVX_ZOOM_ENABLE_100| + SVX_ZOOM_ENABLE_150| + SVX_ZOOM_ENABLE_200); + rSet.Put( aZoom ); + } + else + rSet.DisableItem(nWhich); + } + break; + case SID_ATTR_ZOOMSLIDER : + { + if(bZoomEnabled) + { + const SwViewOption* pVOpt = GetViewShell()->GetViewOptions(); + const USHORT nCurrentZoom = pVOpt->GetZoom(); + SvxZoomSliderItem aZoomSliderItem( nCurrentZoom, MINZOOM, MAXZOOM ); + aZoomSliderItem.AddSnappingPoint( 100 ); + rSet.Put( aZoomSliderItem ); + } + else + rSet.DisableItem(nWhich); + } + break; + case FN_PREVIEW_ZOOM: + { + if(bZoomEnabled) + { + const SwViewOption* pVOpt = GetViewShell()->GetViewOptions(); + rSet.Put(SfxUInt16Item(nWhich, pVOpt->GetZoom())); + } + else + rSet.DisableItem(nWhich); + } + break; + case SID_ZOOM_IN: + case SID_ZOOM_OUT: + { + const SwViewOption* pVOpt = GetViewShell()->GetViewOptions(); + if(!bZoomEnabled || (SID_ZOOM_OUT == nWhich && pVOpt->GetZoom() >= MAX_PREVIEW_ZOOM)|| + (SID_ZOOM_IN == nWhich && pVOpt->GetZoom() <= MIN_PREVIEW_ZOOM)) + { + rSet.DisableItem(nWhich); + } + } + break; + case FN_SHOW_MULTIPLE_PAGES: + //should never be disabled + break; + case FN_SHOW_BOOKVIEW: + { + BOOL b = GetViewShell()->GetViewOptions()->IsPagePrevBookview(); + rSet.Put(SfxBoolItem(nWhich, b)); + } + break; + + case FN_SHOW_TWO_PAGES: + if( 2 == aViewWin.GetCol() && nRow == aViewWin.GetRow() ) + rSet.DisableItem( nWhich ); + break; + + case FN_PRINT_PAGEPREVIEW: + // hat den gleichen Status wie das normale Drucken + { + const SfxPoolItem* pItem; + SfxItemSet aSet( *rSet.GetPool(), SID_PRINTDOC, SID_PRINTDOC ); + GetSlotState( SID_PRINTDOC, SfxViewShell::GetInterface(), &aSet ); + if( SFX_ITEM_DISABLED == aSet.GetItemState( SID_PRINTDOC, + FALSE, &pItem )) + rSet.DisableItem( nWhich ); + else if( SFX_ITEM_SET == aSet.GetItemState( SID_PRINTDOC, + FALSE, &pItem )) + { + ((SfxPoolItem*)pItem)->SetWhich( FN_PRINT_PAGEPREVIEW ); + rSet.Put( *pItem ); + } + } + break; + + case SID_PRINTPREVIEW: + rSet.Put( SfxBoolItem( nWhich, TRUE ) ); + break; + + case SID_PRINTDOC: + case SID_PRINTDOCDIRECT: + GetSlotState( nWhich, SfxViewShell::GetInterface(), &rSet ); + break; + } + nWhich = aIter.NextWhich(); + } +} + +/*-------------------------------------------------------------------- + Beschreibung: + --------------------------------------------------------------------*/ + + +void SwPagePreView::StateUndo(SfxItemSet& rSet) +{ + SfxWhichIter aIter(rSet); + USHORT nWhich = aIter.FirstWhich(); + + while (nWhich) + { + rSet.DisableItem(nWhich); + nWhich = aIter.NextWhich(); + } +} + +/*-------------------------------------------------------------------- + Beschreibung: + --------------------------------------------------------------------*/ + + +void SwPagePreView::Init(const SwViewOption * pPrefs) +{ + if ( GetViewShell()->HasDrawView() ) + GetViewShell()->GetDrawView()->SetAnimationEnabled( FALSE ); + + bNormalPrint = TRUE; + + // Die DocSize erfragen und verarbeiten. Ueber die Handler konnte + // die Shell nicht gefunden werden, weil die Shell innerhalb CTOR-Phase + // nicht in der SFX-Verwaltung bekannt ist. + + if( !pPrefs ) + pPrefs = SW_MOD()->GetUsrPref(FALSE); + + // die Felder aktualisieren + // ACHTUNG: hochcasten auf die EditShell, um die SS zu nutzen. + // In den Methoden wird auf die akt. Shell abgefragt! + SwEditShell* pESh = (SwEditShell*)GetViewShell(); + BOOL bIsModified = pESh->IsModified(); + + + SwViewOption aOpt( *pPrefs ); + aOpt.SetPagePreview(TRUE); + aOpt.SetTab( FALSE ); + aOpt.SetBlank( FALSE ); + aOpt.SetHardBlank( FALSE ); + aOpt.SetParagraph( FALSE ); + aOpt.SetLineBreak( FALSE ); + aOpt.SetPageBreak( FALSE ); + aOpt.SetColumnBreak( FALSE ); + aOpt.SetSoftHyph( FALSE ); + aOpt.SetFldName( FALSE ); + aOpt.SetPostIts( FALSE ); + aOpt.SetShowHiddenChar( FALSE ); + aOpt.SetShowHiddenField( FALSE ); + aOpt.SetShowHiddenPara( FALSE ); + aOpt.SetViewHRuler( FALSE ); + aOpt.SetViewVRuler( FALSE ); + aOpt.SetGraphic( TRUE ); + aOpt.SetTable( TRUE ); + aOpt.SetSnap( FALSE ); + aOpt.SetGridVisible( FALSE ); + GetViewShell()->ApplyViewOptions( aOpt ); + GetViewShell()->ApplyAccessiblityOptions(SW_MOD()->GetAccessibilityOptions()); + + // OD 09.01.2003 #i6467# - adjust view shell option to the same as for print + SwPrtOptions aPrintOptions( GetViewFrame()->GetObjectShell()->GetTitle(0) ); + aPrintOptions.MakeOptions( false ); + GetViewShell()->AdjustOptionsForPagePreview( aPrintOptions ); + + IDocumentSettingAccess* pIDSA = pESh->getIDocumentSettingAccess(); + if( pIDSA->get(IDocumentSettingAccess::BROWSE_MODE)) + { + pIDSA->set(IDocumentSettingAccess::BROWSE_MODE, false); + pESh->CheckBrowseView( TRUE ); + } + + GetViewShell()->CalcLayout(); + DocSzChgd( GetViewShell()->GetDocSize() ); + + if( !bIsModified ) + pESh->ResetModified(); + + pVScrollbar->ExtendedShow(pPrefs->IsViewVScrollBar()); + pHScrollbar->ExtendedShow(pPrefs->IsViewHScrollBar()); + pScrollFill->Show(pPrefs->IsViewVScrollBar() && pPrefs->IsViewHScrollBar()); +} + + +/*-------------------------------------------------------------------- + Beschreibung: + --------------------------------------------------------------------*/ + + +SwPagePreView::SwPagePreView(SfxViewFrame *pViewFrame, SfxViewShell* pOldSh): + SfxViewShell( pViewFrame, SWVIEWFLAGS ), + aViewWin( &pViewFrame->GetWindow(), *this ), + nNewPage(USHRT_MAX), + pHScrollbar(0), + pVScrollbar(0), + pPageUpBtn(0), + pPageDownBtn(0), + pScrollFill(new ScrollBarBox( &pViewFrame->GetWindow(), + pViewFrame->GetFrame()->GetParentFrame() ? 0 : WB_SIZEABLE )), + mnPageCount( 0 ), + // OD 09.01.2003 #106334# + mbResetFormDesignMode( false ), + mbFormDesignModeToReset( false ) +{ + SetName(String::CreateFromAscii("PageView" )); + SetWindow( &aViewWin ); + SetHelpId(SW_PAGEPREVIEW); + _CreateScrollbar( TRUE ); + _CreateScrollbar( FALSE ); + + SfxObjectShell* pObjShell = pViewFrame->GetObjectShell(); + if ( !pOldSh ) + { + //Gibt es schon eine Sicht auf das Dokument? + SfxViewFrame *pF = SfxViewFrame::GetFirst( pObjShell ); + if ( pF == pViewFrame ) + pF = SfxViewFrame::GetNext( *pF, pObjShell ); + if ( pF ) + pOldSh = pF->GetViewShell(); + } + + ViewShell *pVS, *pNew; + + if( pOldSh && pOldSh->IsA( TYPE( SwPagePreView ) ) ) + pVS = ((SwPagePreView*)pOldSh)->GetViewShell(); + else + { + if( pOldSh && pOldSh->IsA( TYPE( SwView ) ) ) + { + pVS = ((SwView*)pOldSh)->GetWrtShellPtr(); + // save the current ViewData of the previous SwView + pOldSh->WriteUserData( sSwViewData, FALSE ); + } + else + pVS = GetDocShell()->GetWrtShell(); + if( pVS ) + { + // setze die akt. Seite als die erste + USHORT nPhysPg, nVirtPg; + ((SwCrsrShell*)pVS)->GetPageNum( nPhysPg, nVirtPg, /*FALSE*/TRUE, FALSE ); + if( 1 != aViewWin.GetCol() && 1 == nPhysPg ) + --nPhysPg; + aViewWin.SetSttPage( nPhysPg ); + } + } + + // OD 09.01.2003 #106334# - for form shell remember design mode of draw view + // of previous view shell + if ( pVS && pVS->HasDrawView() ) + { + mbResetFormDesignMode = true; + mbFormDesignModeToReset = pVS->GetDrawView()->IsDesignMode(); + } + + if( pVS ) + pNew = new ViewShell( *pVS, &aViewWin, 0, VSHELLFLAG_ISPREVIEW ); + else + pNew = new ViewShell( + *((SwDocShell*)pViewFrame->GetObjectShell())->GetDoc(), + &aViewWin, 0, 0, VSHELLFLAG_ISPREVIEW ); + + aViewWin.SetViewShell( pNew ); + pNew->SetSfxViewShell( this ); + Init(); +} + + +/*-------------------------------------------------------------------- + Beschreibung: + --------------------------------------------------------------------*/ + + + SwPagePreView::~SwPagePreView() +{ + SetWindow( 0 ); + + delete pScrollFill; + delete pHScrollbar; + delete pVScrollbar; + delete pPageUpBtn; + delete pPageDownBtn; + +/* SfxObjectShell* pDocSh = GetDocShell(); + TypeId aType = TYPE( SfxTopViewFrame ); + + for( SfxViewFrame *pFrame = SfxViewFrame::GetFirst( pDocSh, aType ); + pFrame; pFrame = SfxViewFrame::GetNext( *pFrame, pDocSh, aType ) ) + if( pFrame != GetViewFrame() ) + { + // es gibt noch eine weitere Sicht auf unser Dokument, also + // aktiviere dieses + pFrame->GetFrame()->Appear(); + break; + } +*/} + +/*-------------------------------------------------------------------- + Beschreibung: + --------------------------------------------------------------------*/ + + +SwDocShell* SwPagePreView::GetDocShell() +{ + return PTR_CAST(SwDocShell, GetViewFrame()->GetObjectShell()); +} + +/*-------------------------------------------------------------------- + Beschreibung: + --------------------------------------------------------------------*/ + + +int SwPagePreView::_CreateScrollbar( BOOL bHori ) +{ + Window *pMDI = &GetViewFrame()->GetWindow(); + SwScrollbar** ppScrollbar = bHori ? &pHScrollbar : &pVScrollbar; + + ASSERT( !*ppScrollbar, "vorher abpruefen!" ) + + if( !bHori ) + { + + pPageUpBtn = new ImageButton(pMDI, SW_RES( BTN_PAGEUP ) ); + pPageUpBtn->SetHelpId(FN_PAGEUP); + pPageDownBtn = new ImageButton(pMDI, SW_RES( BTN_PAGEDOWN ) ); + pPageDownBtn->SetHelpId(FN_PAGEDOWN); + Link aLk( LINK( this, SwPagePreView, BtnPage ) ); + pPageUpBtn->SetClickHdl( aLk ); + pPageDownBtn->SetClickHdl( aLk ); + pPageUpBtn->Show(); + pPageDownBtn->Show(); + } + + *ppScrollbar = new SwScrollbar( pMDI, bHori ); + + ScrollDocSzChg(); + (*ppScrollbar)->EnableDrag( TRUE ); + (*ppScrollbar)->SetEndScrollHdl( LINK( this, SwPagePreView, EndScrollHdl )); + + + (*ppScrollbar)->SetScrollHdl( LINK( this, SwPagePreView, ScrollHdl )); + + InvalidateBorder(); + (*ppScrollbar)->ExtendedShow(); + return 1; +} + +/*-------------------------------------------------------------------- + Beschreibung: + --------------------------------------------------------------------*/ + + + +/*-------------------------------------------------------------------- + Beschreibung: + --------------------------------------------------------------------*/ + +/* + * Button-Handler + */ +IMPL_LINK_INLINE_START( SwPagePreView, BtnPage, Button *, pButton ) +{ + // OD 04.03.2003 #107369# - use new helper method to perform page up + // respectively page down. + _ExecPgUpAndPgDown( pButton == pPageUpBtn ); + return 0; +} +IMPL_LINK_INLINE_END( SwPagePreView, BtnPage, Button *, pButton ) + +/*-------------------------------------------------------------------- + Beschreibung: + --------------------------------------------------------------------*/ + + +int SwPagePreView::ChgPage( int eMvMode, int bUpdateScrollbar ) +{ + Rectangle aPixVisArea( aViewWin.LogicToPixel( aVisArea ) ); + int bChg = aViewWin.MovePage( eMvMode ) || + eMvMode == SwPagePreViewWin::MV_CALC || + eMvMode == SwPagePreViewWin::MV_NEWWINSIZE; + aVisArea = aViewWin.PixelToLogic( aPixVisArea ); + + if( bChg ) + { + // Statusleiste updaten + String aStr( sPageStr ); + aViewWin.GetStatusStr( aStr, mnPageCount ); + SfxBindings& rBindings = GetViewFrame()->GetBindings(); + + if( bUpdateScrollbar ) + { + ScrollViewSzChg(); + + static USHORT __READONLY_DATA aInval[] = + { + FN_START_OF_DOCUMENT, FN_END_OF_DOCUMENT, + FN_PAGEUP, FN_PAGEDOWN, 0 + }; + rBindings.Invalidate( aInval ); + } + rBindings.SetState( SfxStringItem( FN_STAT_PAGE, aStr ) ); + } + return bChg; +} + + +/* */ +/*-------------------------------------------------------------------- + Beschreibung: + --------------------------------------------------------------------*/ + + +// ab hier alles aus der SwView uebernommen + + +void SwPagePreView::CalcAndSetBorderPixel( SvBorder &rToFill, BOOL /*bInner*/ ) +{ +// const long nAdd = bInner ? 0 : ScrollBar::GetWindowOverlapPixel(); + const StyleSettings &rSet = aViewWin.GetSettings().GetStyleSettings(); + const long nTmp = rSet.GetScrollBarSize();// - nAdd; + if ( pVScrollbar->IsVisible( FALSE )) + rToFill.Right() = nTmp; + if ( pHScrollbar->IsVisible( FALSE ) ) + rToFill.Bottom() = nTmp; + SetBorderPixel( rToFill ); +} + +/*-------------------------------------------------------------------- + Beschreibung: + --------------------------------------------------------------------*/ + + +void SwPagePreView::InnerResizePixel( const Point &rOfst, const Size &rSize ) +{ + SvBorder aBorder; + CalcAndSetBorderPixel( aBorder, TRUE ); + Rectangle aRect( rOfst, rSize ); + aRect += aBorder; + ViewResizePixel( aViewWin, aRect.TopLeft(), aRect.GetSize(), + aViewWin.GetOutputSizePixel(), + TRUE, + *pVScrollbar, *pHScrollbar, pPageUpBtn, pPageDownBtn, 0, + *pScrollFill ); + + //EditWin niemals einstellen! + //VisArea niemals einstellen! +} + +/*-------------------------------------------------------------------- + Beschreibung: + --------------------------------------------------------------------*/ + + +void SwPagePreView::OuterResizePixel( const Point &rOfst, const Size &rSize ) +{ + SvBorder aBorder; + CalcAndSetBorderPixel( aBorder, FALSE ); + ViewResizePixel( aViewWin, rOfst, rSize, aViewWin.GetOutputSizePixel(), + FALSE, *pVScrollbar, + *pHScrollbar, pPageUpBtn, pPageDownBtn, 0, *pScrollFill ); + + //EditWin niemals einstellen! + + Size aTmpSize( aViewWin.GetOutputSizePixel() ); + Point aBottomRight( aViewWin.PixelToLogic( Point( aTmpSize.Width(), aTmpSize.Height() ) ) ); + SetVisArea( Rectangle( Point(), aBottomRight ) ); + + //Aufruf der DocSzChgd-Methode der Scrollbars ist noetig, da vom maximalen + //Scrollrange immer die halbe Hoehe der VisArea abgezogen wird. + if ( pVScrollbar ) + ScrollDocSzChg(); +} + +/*-------------------------------------------------------------------- + Beschreibung: + --------------------------------------------------------------------*/ + + +void SwPagePreView::SetVisArea( const Rectangle &rRect, BOOL bUpdateScrollbar ) +{ + const Point aTopLeft(AlignToPixel(rRect.TopLeft())); + const Point aBottomRight(AlignToPixel(rRect.BottomRight())); + Rectangle aLR(aTopLeft,aBottomRight); + + if(aLR == aVisArea) + return; + // keine negative Position, keine neg. Groesse + + if(aLR.Top() < 0) + { + aLR.Bottom() += Abs(aLR.Top()); + aLR.Top() = 0; + } + + if(aLR.Left() < 0) + { + aLR.Right() += Abs(aLR.Left()); + aLR.Left() = 0; + } + if(aLR.Right() < 0) aLR.Right() = 0; + if(aLR.Bottom() < 0) aLR.Bottom() = 0; + if(aLR == aVisArea || + // JP 29.10.97: Bug 45173 - Leeres Rechteck nicht beachten + ( 0 == aLR.Bottom() - aLR.Top() && 0 == aLR.Right() - aLR.Left() ) ) + return; + + if( aLR.Left() > aLR.Right() || aLR.Top() > aLR.Bottom() ) + return; + + //Bevor die Daten veraendert werden ggf. ein Update rufen. Dadurch wird + //sichergestellt, da? anliegende Paints korrekt in Dokumentkoordinaten + //umgerechnet werden. + //Vorsichtshalber tun wir das nur wenn an der Shell eine Action laeuft, + //denn dann wir nicht wirklich gepaintet sondern die Rechtecke werden + //lediglich (in Dokumentkoordinaten) vorgemerkt. + if( GetViewShell()->ActionPend() ) + aViewWin.Update(); + + // setze am View-Win die aktuelle Size + aVisArea = aLR; + aViewWin.SetWinSize( aLR.GetSize() ); + // OD 18.12.2002 #103492# - use new mode + ChgPage( SwPagePreViewWin::MV_NEWWINSIZE, bUpdateScrollbar ); + + aViewWin.Invalidate(); +} + +/*-------------------------------------------------------------------- + Beschreibung: + --------------------------------------------------------------------*/ + + +IMPL_LINK( SwPagePreView, ScrollHdl, SwScrollbar *, pScrollbar ) +{ + if(!GetViewShell()) + return 0; + if( !pScrollbar->IsHoriScroll() && + pScrollbar->GetType() == SCROLL_DRAG && + Help::IsQuickHelpEnabled() && + GetViewShell()->PagePreviewLayout()->DoesPreviewLayoutRowsFitIntoWindow()) + { + // wieviele Seiten scrollen ?? + String sStateStr(sPageStr); + USHORT nThmbPos = (USHORT)pScrollbar->GetThumbPos(); + if( 1 == aViewWin.GetCol() || !nThmbPos ) + ++nThmbPos; + sStateStr += String::CreateFromInt32( nThmbPos ); + Point aPos = pScrollbar->GetParent()->OutputToScreenPixel( + pScrollbar->GetPosPixel()); + aPos.Y() = pScrollbar->OutputToScreenPixel(pScrollbar->GetPointerPosPixel()).Y(); + Size aSize = pScrollbar->GetSizePixel(); + Rectangle aRect; + aRect.Left() = aPos.X() -8; + aRect.Right() = aRect.Left(); + aRect.Top() = aPos.Y(); + aRect.Bottom() = aRect.Top(); + + Help::ShowQuickHelp(pScrollbar, aRect, sStateStr, + QUICKHELP_RIGHT|QUICKHELP_VCENTER); + + } + else + EndScrollHdl( pScrollbar ); + return 0; +} + +/*-------------------------------------------------------------------- + Beschreibung: + --------------------------------------------------------------------*/ + + +IMPL_LINK( SwPagePreView, EndScrollHdl, SwScrollbar *, pScrollbar ) +{ + if(!GetViewShell()) + return 0; + + // OD 04.03.2003 #107369# - boolean to avoid unnecessary invalidation of the window. + bool bInvalidateWin = true; + + if( !pScrollbar->IsHoriScroll() ) // scroll vertically + { + if ( Help::IsQuickHelpEnabled() ) + Help::ShowQuickHelp(pScrollbar, Rectangle(), aEmptyStr, 0); + if ( GetViewShell()->PagePreviewLayout()->DoesPreviewLayoutRowsFitIntoWindow() ) + { + // wieviele Seiten scrollen ?? + USHORT nThmbPos = (USHORT)pScrollbar->GetThumbPos(); + // OD 05.12.2002 #103492# - adjust to new preview functionality + if( nThmbPos != aViewWin.SelectedPage() ) + { + // OD 17.01.2003 #103492# - consider case that page <nThmbPos> + // is already visible + SwPagePreviewLayout* pPagePrevwLay = GetViewShell()->PagePreviewLayout(); + if ( pPagePrevwLay->IsPageVisible( nThmbPos ) ) + { + pPagePrevwLay->MarkNewSelectedPage( nThmbPos ); + // OD 04.03.2003 #107369# - invalidation of window is unnecessary + bInvalidateWin = false; + } + else + { + // OD 17.01.2003 #103492# - consider whether layout columns + // fit or not. + if ( !pPagePrevwLay->DoesPreviewLayoutColsFitIntoWindow() ) + { + aViewWin.SetSttPage( nThmbPos ); + aViewWin.SetSelectedPage( nThmbPos ); + ChgPage( SwPagePreViewWin::MV_SCROLL, FALSE ); + // OD 20.01.2003 #103492# - update scrollbars + ScrollViewSzChg(); + } + else + { + // OD 04.03.2003 #107369# - correct scroll amount + const sal_Int16 nPageDiff = nThmbPos - aViewWin.SelectedPage(); + const sal_uInt16 nVisPages = aViewWin.GetRow() * aViewWin.GetCol(); + sal_Int16 nWinPagesToScroll = nPageDiff / nVisPages; + if ( nPageDiff % nVisPages ) + { + // decrease/increase number of preview pages to scroll + nPageDiff < 0 ? --nWinPagesToScroll : ++nWinPagesToScroll; + } + aViewWin.SetSelectedPage( nThmbPos ); + aViewWin.Scroll( 0, pPagePrevwLay->GetWinPagesScrollAmount( nWinPagesToScroll ) ); + } + } + // OD 17.01.2003 #103492# - update accessibility + GetViewShell()->ShowPreViewSelection( nThmbPos ); + } + else + { + // OD 04.03.2003 #107369# - invalidation of window is unnecessary + bInvalidateWin = false; + } + } + else + { + long nThmbPos = pScrollbar->GetThumbPos(); + aViewWin.Scroll(0, nThmbPos - aViewWin.GetPaintedPreviewDocRect().Top()); + } + } + else + { + long nThmbPos = pScrollbar->GetThumbPos(); + aViewWin.Scroll(nThmbPos - aViewWin.GetPaintedPreviewDocRect().Left(), 0); + } + // OD 24.03.2003 #108282# - additional invalidate page status. + static USHORT __READONLY_DATA aInval[] = + { + FN_START_OF_DOCUMENT, FN_END_OF_DOCUMENT, FN_PAGEUP, FN_PAGEDOWN, + FN_STAT_PAGE, 0 + }; + SfxBindings& rBindings = GetViewFrame()->GetBindings(); + rBindings.Invalidate( aInval ); + // OD 04.03.2003 #107369# - control invalidation of window + if ( bInvalidateWin ) + { + aViewWin.Invalidate(); + } + return 0; +} +/*-------------------------------------------------------------------- + Beschreibung: + --------------------------------------------------------------------*/ + + +Point SwPagePreView::AlignToPixel(const Point &rPt) const +{ + return aViewWin.PixelToLogic( aViewWin.LogicToPixel( rPt ) ); +} + +/*-------------------------------------------------------------------- + Beschreibung: + --------------------------------------------------------------------*/ + + +void SwPagePreView::DocSzChgd( const Size &rSz ) +{ + if( aDocSz == rSz ) + return; + + aDocSz = rSz; + + // --> OD 2009-08-20 #i96726# + // Due to the multiple page layout it is needed to trigger recalculation + // of the page preview layout, even if the count of pages is not changing. + mnPageCount = GetViewShell()->GetNumPages(); + + if( aVisArea.GetWidth() ) + { + ChgPage( SwPagePreViewWin::MV_CALC, TRUE ); + ScrollDocSzChg(); + + aViewWin.Invalidate(); + } + // <-- +} + +/*-------------------------------------------------------------------- + Beschreibung: + --------------------------------------------------------------------*/ + + +void SwPagePreView::ScrollViewSzChg() +{ + if(!GetViewShell()) + return ; + if(pVScrollbar) + { + if(GetViewShell()->PagePreviewLayout()->DoesPreviewLayoutRowsFitIntoWindow()) + { + //vertical scrolling by row + // OD 04.12.2002 #103492# - adjust to new preview functionality + USHORT nVisPages = aViewWin.GetRow() * aViewWin.GetCol(); + pVScrollbar->SetVisibleSize( nVisPages ); + // OD 19.02.2003 #107369# - set selected page as scroll bar position, + // if it is visible. + SwPagePreviewLayout* pPagePrevwLay = GetViewShell()->PagePreviewLayout(); + if ( pPagePrevwLay->IsPageVisible( aViewWin.SelectedPage() ) ) + { + pVScrollbar->SetThumbPos( aViewWin.SelectedPage() ); + } + else + { + pVScrollbar->SetThumbPos( aViewWin.GetSttPage() ); + } + pVScrollbar->SetLineSize( aViewWin.GetCol() ); + pVScrollbar->SetPageSize( nVisPages ); + // calculate and set scrollbar range + Range aScrollbarRange( 1, mnPageCount ); + // increase range by one, because left-top-corner is left blank. + ++aScrollbarRange.Max(); + // OD 17.01.2003 #103492# - increase range in order to access all pages + aScrollbarRange.Max() += ( nVisPages - 1 ); + pVScrollbar->SetRange( aScrollbarRange ); + } + else //vertical scrolling by pixel + { + const Rectangle& rDocRect = aViewWin.GetPaintedPreviewDocRect(); + const Size& rPreviewSize = + GetViewShell()->PagePreviewLayout()->GetPrevwDocSize(); + pVScrollbar->SetRangeMax(rPreviewSize.Height()) ; + long nVisHeight = rDocRect.GetHeight(); + pVScrollbar->SetVisibleSize( nVisHeight ); + pVScrollbar->SetThumbPos( rDocRect.Top() ); + pVScrollbar->SetLineSize( nVisHeight / 10 ); + pVScrollbar->SetPageSize( nVisHeight / 2 ); + } + } + if(pHScrollbar) + { + const Rectangle& rDocRect = aViewWin.GetPaintedPreviewDocRect(); + const Size& rPreviewSize = + GetViewShell()->PagePreviewLayout()->GetPrevwDocSize(); + long nVisWidth = 0; + long nThumb = 0; + Range aRange(0,0); + + if(rDocRect.GetWidth() < rPreviewSize.Width()) + { + nVisWidth = rDocRect.GetWidth(); + nThumb = rDocRect.Left(); + aRange = Range(0, rPreviewSize.Width()); + } + pHScrollbar->SetRange( aRange ); + pHScrollbar->SetVisibleSize( nVisWidth ); + pHScrollbar->SetThumbPos( nThumb ); + pHScrollbar->SetLineSize( nVisWidth / 10 ); + pHScrollbar->SetPageSize( nVisWidth / 2 ); + } +} + +/*-------------------------------------------------------------------- + Beschreibung: + --------------------------------------------------------------------*/ + + +void SwPagePreView::ScrollDocSzChg() +{ + ScrollViewSzChg(); +} + + +/* */ +/*-------------------------------------------------------------------- + Beschreibung: + --------------------------------------------------------------------*/ + + +// alles zum Thema Drucken + +SfxPrinter* SwPagePreView::GetPrinter( BOOL bCreate ) +{ + return aViewWin.GetViewShell()->getIDocumentDeviceAccess()->getPrinter( bCreate ); +} + +/*-------------------------------------------------------------------- + Beschreibung: + --------------------------------------------------------------------*/ + + +USHORT SwPagePreView::SetPrinter( SfxPrinter *pNew, USHORT nDiffFlags, bool ) +{ + ViewShell &rSh = *GetViewShell(); + SfxPrinter* pOld = rSh.getIDocumentDeviceAccess()->getPrinter( false ); + if ( pOld && pOld->IsPrinting() ) + return SFX_PRINTERROR_BUSY; + + SwEditShell &rESh = (SwEditShell&)rSh; //Buh... + if( ( SFX_PRINTER_PRINTER | SFX_PRINTER_JOBSETUP ) & nDiffFlags ) + { + rSh.getIDocumentDeviceAccess()->setPrinter( pNew, true, true ); + if( nDiffFlags & SFX_PRINTER_PRINTER ) + rESh.SetModified(); + } + if ( ( nDiffFlags & SFX_PRINTER_OPTIONS ) == SFX_PRINTER_OPTIONS ) + ::SetPrinter( rSh.getIDocumentDeviceAccess(), pNew, FALSE ); + + const BOOL bChgOri = nDiffFlags & SFX_PRINTER_CHG_ORIENTATION ? TRUE : FALSE; + const BOOL bChgSize= nDiffFlags & SFX_PRINTER_CHG_SIZE ? TRUE : FALSE; + if ( bChgOri || bChgSize ) + { + rESh.StartAllAction(); + if ( bChgOri ) + rSh.ChgAllPageOrientation( USHORT(pNew->GetOrientation()) ); + if ( bChgSize ) + { + Size aSz( SvxPaperInfo::GetPaperSize( pNew ) ); + rSh.ChgAllPageSize( aSz ); + } + if( !bNormalPrint ) + aViewWin.CalcWish( aViewWin.GetRow(), aViewWin.GetCol() ); + rESh.SetModified(); + rESh.EndAllAction(); + + static USHORT __READONLY_DATA aInval[] = + { + SID_ATTR_LONG_ULSPACE, SID_ATTR_LONG_LRSPACE, + SID_RULER_BORDERS, SID_RULER_PAGE_POS, 0 + }; +#ifdef DBG_UTIL + { + const USHORT* pPtr = aInval + 1; + do { + ASSERT( *(pPtr - 1) < *pPtr, "falsche Sortierung!" ); + } while( *++pPtr ); + } +#endif + + GetViewFrame()->GetBindings().Invalidate(aInval); + } + + return 0; +} + +/*-------------------------------------------------------------------- + Beschreibung: + --------------------------------------------------------------------*/ + + +SfxTabPage* SwPagePreView::CreatePrintOptionsPage( Window *pParent, + const SfxItemSet &rOptions ) +{ + return ::CreatePrintOptionsPage( pParent, rOptions, !bNormalPrint ); +} + +/*-------------------------------------------------------------------- + Beschreibung: + --------------------------------------------------------------------*/ + + +PrintDialog* SwPagePreView::CreatePrintDialog( Window *pParent ) +{ + PrintDialog *pDlg = ::CreatePrintDialog( pParent, 1, 0 ); + pDlg->DisableRange( PRINTDIALOG_SELECTION ); + return pDlg; +} + +/*-------------------------------------------------------------------- + Beschreibung: + --------------------------------------------------------------------*/ + + +// OD 18.12.2002 #103492# - no longer needed ?? +Size SwPagePreView::GetOptimalSizePixel() const +{ + ASSERT( false, "overloaded virtual method <SwPagePreView::GetOptimalSizePixel()> needed ??" ) + return Size( -1, -1 ); +/* + //JP 09.06.99: was wird hier errechnet ????? +// ALT: +// SfxApplicationWindow* pWin = SFX_APPWINDOW ; +// Rectangle aRect = pWin->GetClientAreaPixel(); + + Window& rWin = GetViewFrame()->GetWindow(); + Rectangle aRect( Point(0, 0), rWin.GetOutputSizePixel() ); + Size aMaxSize( aRect.GetWidth(), aRect.GetHeight() ); + Size aInSize = rWin.GetOutputSizePixel(); + Size aOutSize = rWin.GetSizePixel(); + USHORT nXBorder = USHORT(aOutSize.Width() - aInSize.Width()); + USHORT nYBorder = USHORT(aOutSize.Height() - aInSize.Height()); + aMaxSize.Width() -= nXBorder; + //'auf Verdacht' etwas vom Border abziehen (Menue) + nYBorder -= (nYBorder - nXBorder) / 2; + aMaxSize.Height() -= nYBorder; + //mit der max. moeglichen Outputsize guenstigstes Verhaeltnis ausrechnen + aViewWin.GetOptimalSize(aMaxSize); + // Border wieder dazuzaehlen + aMaxSize.Height() += nYBorder; + aMaxSize.Width() += nXBorder; + return aMaxSize; +*/ +} + +/*-------------------------------------------------------------------- + Beschreibung: + --------------------------------------------------------------------*/ + +// OD 12.12.2002 #103492# +void SwPagePreViewWin::SetViewShell( ViewShell* pShell ) +{ + mpViewShell = pShell; + if ( mpViewShell && mpViewShell->IsPreView() ) + { + mpPgPrevwLayout = mpViewShell->PagePreviewLayout(); + } +} + +void SwPagePreViewWin::RepaintCoreRect( const SwRect& rRect ) +{ + // OD 2004-03-04 #i24183# + if ( mpPgPrevwLayout->PreviewLayoutValid() ) + { + mpPgPrevwLayout->Repaint( Rectangle( rRect.Pos(), rRect.SSize() ) ); + } +} + +/** method to adjust preview to a new zoom factor + + OD 02.12.2002 #103492# + OD 24.09.2003 #i19975# - also consider zoom type - adding parameter <_eZoomType> +*/ +void SwPagePreViewWin::AdjustPreviewToNewZoom( const sal_uInt16 _nZoomFactor, + const SvxZoomType _eZoomType ) +{ + // OD 24.09.2003 #i19975# - consider zoom type + if ( _eZoomType == SVX_ZOOM_WHOLEPAGE ) + { + mnRow = 1; + mnCol = 1; + mpPgPrevwLayout->Init( mnCol, mnRow, maPxWinSize, true ); + mpPgPrevwLayout->Prepare( mnSttPage, Point(0,0), maPxWinSize, + mnSttPage, maPaintedPreviewDocRect ); + SetSelectedPage( mnSttPage ); + SetPagePreview(mnRow, mnCol); + maScale = GetMapMode().GetScaleX(); + } + else if ( _nZoomFactor != 0 ) + { + // calculate new scaling and set mapping mode appropriately. + Fraction aNewScale( _nZoomFactor, 100 ); + MapMode aNewMapMode = GetMapMode(); + aNewMapMode.SetScaleX( aNewScale ); + aNewMapMode.SetScaleY( aNewScale ); + SetMapMode( aNewMapMode ); + + // calculate new start position for preview paint + Size aNewWinSize = PixelToLogic( maPxWinSize ); + Point aNewPaintStartPos = + mpPgPrevwLayout->GetPreviewStartPosForNewScale( aNewScale, maScale, aNewWinSize ); + + // remember new scaling and prepare preview paint + // Note: paint of preview will be performed by a corresponding invalidate + // due to property changes. + maScale = aNewScale; + mpPgPrevwLayout->Prepare( 0, aNewPaintStartPos, maPxWinSize, + mnSttPage, maPaintedPreviewDocRect ); + } + +} +/* -----------------04.12.2002 10:46----------------- + * pixel scrolling - horizontally always or vertically + * when less than the desired number of rows fits into + * the view + * --------------------------------------------------*/ +void SwPagePreViewWin::Scroll(long nXMove, long nYMove, USHORT /*nFlags*/) +{ + maPaintedPreviewDocRect.Move(nXMove, nYMove); + mpPgPrevwLayout->Prepare( 0, maPaintedPreviewDocRect.TopLeft(), + maPxWinSize, mnSttPage, + maPaintedPreviewDocRect ); + +} + +BOOL SwPagePreView::HandleWheelCommands( const CommandEvent& rCEvt ) +{ + BOOL bOk = FALSE; + const CommandWheelData* pWData = rCEvt.GetWheelData(); + if( pWData && COMMAND_WHEEL_ZOOM == pWData->GetMode() ) + { + if(!Application::GetSettings().GetMiscSettings().GetEnableATToolSupport()) + { + USHORT nFactor = GetViewShell()->GetViewOptions()->GetZoom(); + const USHORT nOffset = 10; + if( 0L > pWData->GetDelta() ) + { + nFactor -= nOffset; + if(nFactor < MIN_PREVIEW_ZOOM) + nFactor = MIN_PREVIEW_ZOOM; + } + else + { + nFactor += nOffset; + if(nFactor > MAX_PREVIEW_ZOOM) + nFactor = MAX_PREVIEW_ZOOM; + } + SetZoom(SVX_ZOOM_PERCENT, nFactor); + } + bOk = TRUE; + } + else + bOk = aViewWin.HandleScrollCommand( rCEvt, pHScrollbar, pVScrollbar ); + return bOk; +} + + +uno::Reference< ::com::sun::star::accessibility::XAccessible > + SwPagePreViewWin::CreateAccessible() +{ + vos::OGuard aGuard(Application::GetSolarMutex()); // this should have + // happend already!!! + + DBG_ASSERT( GetViewShell() != NULL, "We need a view shell" ); + return GetViewShell()->CreateAccessiblePreview(); +} + +/* -----------------------------06.05.2002 13:18------------------------------ + + ---------------------------------------------------------------------------*/ +void SwPagePreView::ApplyAccessiblityOptions(SvtAccessibilityOptions& rAccessibilityOptions) +{ + GetViewShell()->ApplyAccessiblityOptions(rAccessibilityOptions); +} +/* -----------------------------2002/06/26 14:30------------------------------ + + ---------------------------------------------------------------------------*/ +void SwPagePreView::ShowHScrollbar(sal_Bool bShow) +{ + pHScrollbar->Show(bShow); + InvalidateBorder(); +} + +/* -----------------------------2002/06/26 14:30------------------------------ + + ---------------------------------------------------------------------------*/ +void SwPagePreView::ShowVScrollbar(sal_Bool bShow) +{ + pVScrollbar->Show(bShow); + InvalidateBorder(); +} + +/* -----------------25.11.2002 16:36----------------- + * + * --------------------------------------------------*/ +void SwPagePreView::SetZoom(SvxZoomType eType, USHORT nFactor) +{ + ViewShell& rSh = *GetViewShell(); + SwViewOption aOpt(*rSh.GetViewOptions()); + // OD 16.12.2002 #103492# - perform action only on changes of zoom or zoom type. + if ( aOpt.GetZoom() != nFactor || + aOpt.GetZoomType() != eType ) + { + aOpt.SetZoom(nFactor); + aOpt.SetZoomType(eType); + rSh.ApplyViewOptions( aOpt ); + lcl_InvalidateZoomSlots(GetViewFrame()->GetBindings()); + // OD 02.12.2002 #103492# + // OD 24.09.2003 #i19975# - also consider zoom type + aViewWin.AdjustPreviewToNewZoom( nFactor, eType ); + ScrollViewSzChg(); + } +} + +/** adjust position of vertical scrollbar + + OD 19.02.2003 #107369 + + @author OD +*/ +void SwPagePreView::SetVScrollbarThumbPos( const sal_uInt16 _nNewThumbPos ) +{ + if ( pVScrollbar ) + { + pVScrollbar->SetThumbPos( _nNewThumbPos ); + } +} |