summaryrefslogtreecommitdiff
path: root/cui/source/tabpages/page.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'cui/source/tabpages/page.cxx')
-rw-r--r--cui/source/tabpages/page.cxx1772
1 files changed, 1772 insertions, 0 deletions
diff --git a/cui/source/tabpages/page.cxx b/cui/source/tabpages/page.cxx
new file mode 100644
index 000000000000..27db31f684fa
--- /dev/null
+++ b/cui/source/tabpages/page.cxx
@@ -0,0 +1,1772 @@
+/*************************************************************************
+ *
+ * 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: page.cxx,v $
+ * $Revision: 1.42 $
+ *
+ * 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_cui.hxx"
+
+// include ---------------------------------------------------------------
+#include <sfx2/app.hxx>
+#include <sfx2/objsh.hxx>
+#include <tools/resary.hxx>
+#include <vcl/graph.hxx>
+#include <sfx2/viewsh.hxx>
+#include <svl/itemiter.hxx>
+#include <svl/languageoptions.hxx>
+#include <vcl/msgbox.hxx>
+#include <unotools/configitem.hxx>
+#include "svx/htmlmode.hxx"
+
+#define _SVX_PAGE_CXX
+
+#include <cuires.hrc>
+#include "page.hrc"
+#include "helpid.hrc"
+#include "page.hxx"
+#include <svx/pageitem.hxx>
+#include <svx/brshitem.hxx>
+#include <svx/boxitem.hxx>
+#include <svx/shaditem.hxx>
+#include <svx/pbinitem.hxx>
+#include <svx/lrspitem.hxx>
+#include <svx/ulspitem.hxx>
+#include <svx/sizeitem.hxx>
+#include <svx/frmdiritem.hxx>
+#include "svx/dlgutil.hxx"
+#include <dialmgr.hxx>
+#include <svx/paperinf.hxx>
+#include <dialmgr.hxx>
+#include <sfx2/module.hxx>
+#include <svl/stritem.hxx>
+#include <svx/dialmgr.hxx> // for RID_SVXSTR_PAPERBIN...
+#include <svx/dialogs.hrc> // for RID_SVXSTR_PAPERBIN..., RID_SVXPAGE_PAGE
+
+// #i4219#
+#include <svtools/optionsdrawinglayer.hxx>
+#include <svl/slstitm.hxx> //CHINA001
+#include <svl/aeitem.hxx> //CHINA001
+#include <sfx2/request.hxx> //CHINA001
+// configuration helper =======================================================
+
+/** Helper to get a configuration setting.
+ @descr This is a HACK to get a configuration item directly. Normally the
+ OfaHtmlOptions class from 'offmgr' project would do the job, but we cannot
+ use it here. On the other hand, the OfaHtmlOptions cannot be moved to
+ 'svtools', because it uses 'svx' itself...
+ The correct way would be to move OfaHtmlOptions to 'svtools' anyway, and to
+ remove the dependency from 'svx' (a call to the static function
+ SvxTextEncodingBox::GetBestMimeEncoding(), which contains low level
+ operations that can be moved to lower projects, i.e. 'rtl'). Then this
+ class can be removed, and the OfaHtmlOptions can be used instead. */
+class SvxHtmlExportModeConfigItem_Impl : public utl::ConfigItem
+{
+public:
+ explicit SvxHtmlExportModeConfigItem_Impl();
+
+ /** Returns the HTML export mode, as read from the configuration. */
+ inline sal_Int32 GetExportMode() const { return mnExpMode; }
+
+ /** Returns true, if the current HTML export mode is set to HTML 3.2. */
+ inline bool IsExportModeHTML32() const { return mnExpMode == 0; } // 0 == HTML_CFG_HTML32, see offmgr/htmlcfg.hxx
+
+ virtual void Commit();
+ virtual void Notify( const com::sun::star::uno::Sequence< rtl::OUString >& _rPropertyNames);
+
+private:
+ sal_Int32 mnExpMode;
+};
+
+SvxHtmlExportModeConfigItem_Impl::SvxHtmlExportModeConfigItem_Impl() :
+ utl::ConfigItem( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Office.Common/Filter/HTML/Export" ) ) ),
+ mnExpMode( 3 ) // default to 3 == HTML_CFG_NS40, see offmgr/htmlcfg.hxx
+{
+ using com::sun::star::uno::Sequence;
+ using com::sun::star::uno::Any;
+
+ Sequence< rtl::OUString > aPropNames( 1 );
+ aPropNames[ 0 ] = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Browser" ) );
+ Sequence< Any > aPropValues( GetProperties( aPropNames ) );
+ if( aPropValues.getLength() == 1 )
+ aPropValues[ 0 ] >>= mnExpMode;
+}
+
+void SvxHtmlExportModeConfigItem_Impl::Commit()
+{
+}
+
+void SvxHtmlExportModeConfigItem_Impl::Notify( const com::sun::star::uno::Sequence< rtl::OUString >& )
+{
+}
+
+// static ----------------------------------------------------------------
+
+static const long MINBODY = 284; // 0,5cm in twips aufgerundet
+//static const long PRINT_OFFSET = 17; // 0,03cm in twips abgerundet
+static const long PRINT_OFFSET = 0; // why was this ever set to 17 ? it led to wrong right and bottom margins.
+
+static USHORT pRanges[] =
+{
+ SID_ATTR_BORDER_OUTER,
+ SID_ATTR_BORDER_SHADOW,
+ SID_ATTR_LRSPACE,
+ SID_ATTR_PAGE_SHARED,
+ SID_SWREGISTER_COLLECTION,
+ SID_SWREGISTER_MODE,
+ 0
+};
+
+// ------- Mapping Seitenlayout ------------------------------------------
+
+USHORT aArr[] =
+{
+ SVX_PAGE_ALL,
+ SVX_PAGE_MIRROR,
+ SVX_PAGE_RIGHT,
+ SVX_PAGE_LEFT
+};
+
+// -----------------------------------------------------------------------
+
+USHORT PageUsageToPos_Impl( USHORT nUsage )
+{
+ const USHORT nCount = sizeof(aArr) / sizeof(USHORT);
+
+ for ( USHORT i = 0; i < nCount; ++i )
+ if ( aArr[i] == ( nUsage & 0x000f ) )
+ return i;
+ return SVX_PAGE_ALL;
+}
+
+// -----------------------------------------------------------------------
+
+USHORT PosToPageUsage_Impl( USHORT nPos )
+{
+ const USHORT nCount = sizeof(aArr) / sizeof(USHORT);
+
+ if ( nPos >= nCount )
+ return 0;
+ return aArr[nPos];
+}
+
+// -----------------------------------------------------------------------
+
+Size GetMinBorderSpace_Impl( const SvxShadowItem& rShadow, const SvxBoxItem& rBox )
+{
+ Size aSz;
+ aSz.Height() = rShadow.CalcShadowSpace( SHADOW_BOTTOM ) + rBox.CalcLineSpace( BOX_LINE_BOTTOM );
+ aSz.Height() += rShadow.CalcShadowSpace( SHADOW_TOP ) + rBox.CalcLineSpace( BOX_LINE_TOP );
+ aSz.Width() = rShadow.CalcShadowSpace( SHADOW_LEFT ) + rBox.CalcLineSpace( BOX_LINE_LEFT );
+ aSz.Width() += rShadow.CalcShadowSpace( SHADOW_RIGHT ) + rBox.CalcLineSpace( BOX_LINE_RIGHT );
+ return aSz;
+}
+
+// -----------------------------------------------------------------------
+
+long ConvertLong_Impl( const long nIn, SfxMapUnit eUnit )
+{
+ return OutputDevice::LogicToLogic( nIn, (MapUnit)eUnit, MAP_TWIP );
+}
+
+BOOL IsEqualSize_Impl( const SvxSizeItem* pSize, const Size& rSize )
+{
+ if ( pSize )
+ {
+ Size aSize = pSize->GetSize();
+ long nDiffW = Abs( rSize.Width () - aSize.Width () );
+ long nDiffH = Abs( rSize.Height() - aSize.Height() );
+ return ( nDiffW < 10 && nDiffH < 10 );
+ }
+ else
+ return FALSE;
+}
+
+// -----------------------------------------------------------------------
+
+#define MARGIN_LEFT ( (MarginPosition)0x0001 )
+#define MARGIN_RIGHT ( (MarginPosition)0x0002 )
+#define MARGIN_TOP ( (MarginPosition)0x0004 )
+#define MARGIN_BOTTOM ( (MarginPosition)0x0008 )
+
+struct SvxPage_Impl
+{
+ MarginPosition m_nPos;
+ Printer* mpDefPrinter;
+ bool mbDelPrinter;
+
+ SvxPage_Impl() :
+ m_nPos( 0 ),
+ mpDefPrinter( 0 ),
+ mbDelPrinter( false ) {}
+
+ ~SvxPage_Impl() { if ( mbDelPrinter ) delete mpDefPrinter; }
+};
+
+// class SvxPageDescPage --------------------------------------------------
+
+// gibt den Bereich der Which-Werte zur"uck
+
+USHORT* SvxPageDescPage::GetRanges()
+{
+ return pRanges;
+}
+
+// -----------------------------------------------------------------------
+
+SfxTabPage* SvxPageDescPage::Create( Window* pParent, const SfxItemSet& rSet )
+{
+ return new SvxPageDescPage( pParent, rSet );
+}
+
+// -----------------------------------------------------------------------
+
+SvxPageDescPage::SvxPageDescPage( Window* pParent, const SfxItemSet& rAttr ) :
+
+ SfxTabPage( pParent, CUI_RES( RID_SVXPAGE_PAGE ), rAttr ),
+
+ aPaperSizeFl ( this, CUI_RES( FL_PAPER_SIZE ) ),
+ aPaperFormatText ( this, CUI_RES( FT_PAPER_FORMAT ) ),
+ aPaperSizeBox ( this, CUI_RES( LB_PAPER_SIZE ) ),
+ aPaperWidthText ( this, CUI_RES( FT_PAPER_WIDTH ) ),
+ aPaperWidthEdit ( this, CUI_RES( ED_PAPER_WIDTH ) ),
+ aPaperHeightText ( this, CUI_RES( FT_PAPER_HEIGHT ) ),
+ aPaperHeightEdit ( this, CUI_RES( ED_PAPER_HEIGHT ) ),
+ aOrientationFT ( this, CUI_RES( FT_ORIENTATION ) ),
+ aPortraitBtn ( this, CUI_RES( RB_PORTRAIT ) ),
+ aLandscapeBtn ( this, CUI_RES( RB_LANDSCAPE ) ),
+ aBspWin ( this, CUI_RES( WN_BSP ) ),
+ aTextFlowLbl ( this, CUI_RES( FT_TEXT_FLOW ) ),
+ aTextFlowBox ( this, CUI_RES( LB_TEXT_FLOW ) ),
+ aPaperTrayLbl ( this, CUI_RES( FT_PAPER_TRAY ) ),
+ aPaperTrayBox ( this, CUI_RES( LB_PAPER_TRAY ) ),
+ aMarginFl ( this, CUI_RES( FL_MARGIN ) ),
+ aLeftMarginLbl ( this, CUI_RES( FT_LEFT_MARGIN ) ),
+ aLeftMarginEdit ( this, CUI_RES( ED_LEFT_MARGIN ) ),
+ aRightMarginLbl ( this, CUI_RES( FT_RIGHT_MARGIN ) ),
+ aRightMarginEdit ( this, CUI_RES( ED_RIGHT_MARGIN ) ),
+ aTopMarginLbl ( this, CUI_RES( FT_TOP_MARGIN ) ),
+ aTopMarginEdit ( this, CUI_RES( ED_TOP_MARGIN ) ),
+ aBottomMarginLbl ( this, CUI_RES( FT_BOTTOM_MARGIN ) ),
+ aBottomMarginEdit ( this, CUI_RES( ED_BOTTOM_MARGIN ) ),
+
+ aLayoutFL ( this, CUI_RES( FL_LAYOUT ) ),
+ aPageText ( this, CUI_RES( FT_PAGELAYOUT ) ),
+ aLayoutBox ( this, CUI_RES( LB_LAYOUT ) ),
+ aNumberFormatText ( this, CUI_RES( FT_NUMBER_FORMAT ) ),
+ aNumberFormatBox ( this, CUI_RES( LB_NUMBER_FORMAT ) ),
+ aBottomSeparatorFl ( this, CUI_RES( FL_BOTTOM_SEP ) ),
+ aTblAlignFT ( this, CUI_RES( FT_TBL_ALIGN ) ),
+ aHorzBox ( this, CUI_RES( CB_HORZ ) ),
+ aVertBox ( this, CUI_RES( CB_VERT ) ),
+ aAdaptBox ( this, CUI_RES( CB_ADAPT ) ),
+ aRegisterCB ( this, CUI_RES( CB_REGISTER ) ),
+ aRegisterFT ( this, CUI_RES( FT_REGISTER ) ),
+ aRegisterLB ( this, CUI_RES( LB_REGISTER ) ),
+
+ aInsideText ( CUI_RES( STR_INSIDE ) ),
+ aOutsideText ( CUI_RES( STR_OUTSIDE ) ),
+ aPrintRangeQueryText( CUI_RES( STR_QUERY_PRINTRANGE ) ),
+
+ bLandscape ( FALSE ),
+ eMode ( SVX_PAGE_MODE_STANDARD ),
+ ePaperStart ( PAPER_A3 ),
+ ePaperEnd ( PAPER_ENV_DL ),
+ pImpl ( new SvxPage_Impl )
+
+{
+ bBorderModified = FALSE;
+ FreeResource();
+ aBspWin.EnableRTL( FALSE );
+
+ // diese Page braucht ExchangeSupport
+ SetExchangeSupport();
+
+ SvtLanguageOptions aLangOptions;
+ sal_Bool bCJK = aLangOptions.IsAsianTypographyEnabled();
+ sal_Bool bCTL = aLangOptions.IsCTLFontEnabled();
+ sal_Bool bWeb = sal_False;
+ const SfxPoolItem* pItem;
+
+ SfxObjectShell* pShell;
+ if(SFX_ITEM_SET == rAttr.GetItemState(SID_HTML_MODE, FALSE, &pItem) ||
+ ( 0 != (pShell = SfxObjectShell::Current()) &&
+ 0 != (pItem = pShell->GetItem(SID_HTML_MODE))))
+ bWeb = 0 != (((const SfxUInt16Item*)pItem)->GetValue() & HTMLMODE_ON);
+
+ // #109989# get the HTML export setting from configuration.
+ // !! This is a hack, see comments in SvxHtmlExportModeConfigItem_Impl class above.
+ bool bHTML32 = SvxHtmlExportModeConfigItem_Impl().IsExportModeHTML32();
+
+ // fill text flow listbox with valid entries
+ aTextFlowBox.InsertEntryValue( CUI_RESSTR( RID_SVXSTR_PAGEDIR_LTR_HORI ), FRMDIR_HORI_LEFT_TOP );
+ if( bCTL )
+ aTextFlowBox.InsertEntryValue( CUI_RESSTR( RID_SVXSTR_PAGEDIR_RTL_HORI ), FRMDIR_HORI_RIGHT_TOP );
+ // #109989# do not show vertical directions in Writer/Web
+ if( !bWeb )
+ {
+ if( bCJK )
+ aTextFlowBox.InsertEntryValue( CUI_RESSTR( RID_SVXSTR_PAGEDIR_RTL_VERT ), FRMDIR_VERT_TOP_RIGHT );
+// if( ... )
+// aTextFlowBox.InsertEntryValue( CUI_RESSTR( RID_SVXSTR_PAGEDIR_LTR_VERT ), FRMDIR_VERT_TOP_LEFT );
+ }
+
+ // #109989# show the text direction box in Writer/Web too, but only, if HTML export mode is not HTML3.2.
+ if( !(bWeb && bHTML32) && (bCJK || bCTL) &&
+ SFX_ITEM_UNKNOWN < rAttr.GetItemState(GetWhich( SID_ATTR_FRAMEDIRECTION )))
+ {
+ aTextFlowLbl.Show();
+ aTextFlowBox.Show();
+ aTextFlowBox.SetSelectHdl(LINK(this, SvxPageDescPage, FrameDirectionModify_Impl ));
+
+ aBspWin.EnableFrameDirection(sal_True);
+ }
+ Init_Impl();
+
+ FieldUnit eFUnit = GetModuleFieldUnit( &rAttr );
+ SetFieldUnit( aLeftMarginEdit, eFUnit );
+ SetFieldUnit( aRightMarginEdit, eFUnit );
+ SetFieldUnit( aTopMarginEdit, eFUnit );
+ SetFieldUnit( aBottomMarginEdit, eFUnit );
+ SetFieldUnit( aPaperWidthEdit, eFUnit );
+ SetFieldUnit( aPaperHeightEdit, eFUnit );
+
+ if ( SfxViewShell::Current() && SfxViewShell::Current()->GetPrinter() )
+ pImpl->mpDefPrinter = (Printer*)SfxViewShell::Current()->GetPrinter();
+ else
+ {
+ pImpl->mpDefPrinter = new Printer;
+ pImpl->mbDelPrinter = true;
+ }
+
+ MapMode aOldMode = pImpl->mpDefPrinter->GetMapMode();
+ pImpl->mpDefPrinter->SetMapMode( MAP_TWIP );
+
+ // First- und Last-Werte f"ur die R"ander setzen
+ Size aPaperSize = pImpl->mpDefPrinter->GetPaperSize();
+ Size aPrintSize = pImpl->mpDefPrinter->GetOutputSize();
+ /*
+ * einen Punkt ( 0,0 ) in logische Koordinaten zu konvertieren,
+ * sieht aus wie Unsinn; ist aber sinnvoll, wenn der Ursprung des
+ * Koordinatensystems verschoben ist.
+ */
+ Point aPrintOffset = pImpl->mpDefPrinter->GetPageOffset() -
+ pImpl->mpDefPrinter->PixelToLogic( Point() );
+ pImpl->mpDefPrinter->SetMapMode( aOldMode );
+
+ long nOffset = !aPrintOffset.X() && !aPrintOffset.Y() ? 0 : PRINT_OFFSET;
+ aLeftMarginEdit.SetFirst( aLeftMarginEdit.Normalize( aPrintOffset.X() ), FUNIT_TWIP );
+ nFirstLeftMargin = static_cast<long>(aLeftMarginEdit.GetFirst());
+ aRightMarginEdit.SetFirst( aRightMarginEdit.Normalize(
+ aPaperSize.Width() - aPrintSize.Width() - aPrintOffset.X() + nOffset ), FUNIT_TWIP);
+ nFirstRightMargin = static_cast<long>(aRightMarginEdit.GetFirst());
+ aTopMarginEdit.SetFirst( aTopMarginEdit.Normalize( aPrintOffset.Y() ), FUNIT_TWIP );
+ nFirstTopMargin = static_cast<long>(aTopMarginEdit.GetFirst());
+ aBottomMarginEdit.SetFirst( aBottomMarginEdit.Normalize(
+ aPaperSize.Height() - aPrintSize.Height() - aPrintOffset.Y() + nOffset ), FUNIT_TWIP );
+ nFirstBottomMargin = static_cast<long>(aBottomMarginEdit.GetFirst());
+ aLeftMarginEdit.SetLast( aLeftMarginEdit.Normalize(
+ aPrintOffset.X() + aPrintSize.Width() ), FUNIT_TWIP );
+ nLastLeftMargin = static_cast<long>(aLeftMarginEdit.GetLast());
+ aRightMarginEdit.SetLast( aRightMarginEdit.Normalize(
+ aPrintOffset.X() + aPrintSize.Width() ), FUNIT_TWIP );
+ nLastRightMargin = static_cast<long>(aRightMarginEdit.GetLast());
+ aTopMarginEdit.SetLast( aTopMarginEdit.Normalize(
+ aPrintOffset.Y() + aPrintSize.Height() ), FUNIT_TWIP );
+ nLastTopMargin = static_cast<long>(aTopMarginEdit.GetLast());
+ aBottomMarginEdit.SetLast( aBottomMarginEdit.Normalize(
+ aPrintOffset.Y() + aPrintSize.Height() ), FUNIT_TWIP );
+ nLastBottomMargin = static_cast<long>(aBottomMarginEdit.GetLast());
+
+ // #i4219# get DrawingLayer options
+ const SvtOptionsDrawinglayer aDrawinglayerOpt;
+
+ // #i4219# take Maximum now from configuration (1/100th cm)
+ // was: 11900 -> 119 cm ;new value 3 meters -> 300 cm -> 30000
+ aPaperWidthEdit.SetMax(aPaperWidthEdit.Normalize(aDrawinglayerOpt.GetMaximumPaperWidth()), FUNIT_CM);
+ aPaperWidthEdit.SetLast(aPaperWidthEdit.Normalize(aDrawinglayerOpt.GetMaximumPaperWidth()), FUNIT_CM);
+ aPaperHeightEdit.SetMax(aPaperHeightEdit.Normalize(aDrawinglayerOpt.GetMaximumPaperHeight()), FUNIT_CM);
+ aPaperHeightEdit.SetLast(aPaperHeightEdit.Normalize(aDrawinglayerOpt.GetMaximumPaperHeight()), FUNIT_CM);
+
+ // #i4219# also for margins (1/100th cm). Was: 9999, keeping.
+ aLeftMarginEdit.SetMax(aDrawinglayerOpt.GetMaximumPaperLeftMargin());
+ aLeftMarginEdit.SetLast(aDrawinglayerOpt.GetMaximumPaperLeftMargin());
+ aRightMarginEdit.SetMax(aDrawinglayerOpt.GetMaximumPaperRightMargin());
+ aRightMarginEdit.SetLast(aDrawinglayerOpt.GetMaximumPaperRightMargin());
+ aTopMarginEdit.SetMax(aDrawinglayerOpt.GetMaximumPaperTopMargin());
+ aTopMarginEdit.SetLast(aDrawinglayerOpt.GetMaximumPaperTopMargin());
+ aBottomMarginEdit.SetMax(aDrawinglayerOpt.GetMaximumPaperBottomMargin());
+ aBottomMarginEdit.SetLast(aDrawinglayerOpt.GetMaximumPaperBottomMargin());
+}
+
+// -----------------------------------------------------------------------
+
+SvxPageDescPage::~SvxPageDescPage()
+{
+ delete pImpl;
+}
+
+// -----------------------------------------------------------------------
+
+void SvxPageDescPage::Init_Impl()
+{
+ aLeftText = aLeftMarginLbl.GetText();
+ aRightText = aRightMarginLbl.GetText();
+
+ // Handler einstellen
+ aLayoutBox.SetSelectHdl( LINK( this, SvxPageDescPage, LayoutHdl_Impl ) );
+ aPaperSizeBox.SetDropDownLineCount(10);
+
+ aPaperTrayBox.SetGetFocusHdl(
+ LINK( this, SvxPageDescPage, PaperBinHdl_Impl ) );
+ aPaperSizeBox.SetSelectHdl(
+ LINK( this, SvxPageDescPage, PaperSizeSelect_Impl ) );
+ aPaperWidthEdit.SetModifyHdl(
+ LINK( this, SvxPageDescPage, PaperSizeModify_Impl ) );
+ aPaperHeightEdit.SetModifyHdl(
+ LINK( this, SvxPageDescPage, PaperSizeModify_Impl ) );
+ aLandscapeBtn.SetClickHdl(
+ LINK( this, SvxPageDescPage, SwapOrientation_Impl ) );
+ aPortraitBtn.SetClickHdl(
+ LINK( this, SvxPageDescPage, SwapOrientation_Impl ) );
+
+ Link aLink = LINK( this, SvxPageDescPage, BorderModify_Impl );
+ aLeftMarginEdit.SetModifyHdl( aLink );
+ aRightMarginEdit.SetModifyHdl( aLink );
+ aTopMarginEdit.SetModifyHdl( aLink );
+ aBottomMarginEdit.SetModifyHdl( aLink );
+
+ aLink = LINK( this, SvxPageDescPage, RangeHdl_Impl );
+ aPaperWidthEdit.SetLoseFocusHdl( aLink );
+ aPaperHeightEdit.SetLoseFocusHdl( aLink );
+ aLeftMarginEdit.SetLoseFocusHdl( aLink );
+ aRightMarginEdit.SetLoseFocusHdl( aLink );
+ aTopMarginEdit.SetLoseFocusHdl( aLink );
+ aBottomMarginEdit.SetLoseFocusHdl( aLink );
+
+ aHorzBox.SetClickHdl( LINK( this, SvxPageDescPage, CenterHdl_Impl ) );
+ aVertBox.SetClickHdl( LINK( this, SvxPageDescPage, CenterHdl_Impl ) );
+
+}
+
+// -----------------------------------------------------------------------
+
+void SvxPageDescPage::Reset( const SfxItemSet& rSet )
+{
+ SfxItemPool* pPool = rSet.GetPool();
+ DBG_ASSERT( pPool, "Wo ist der Pool" );
+ SfxMapUnit eUnit = pPool->GetMetric( GetWhich( SID_ATTR_LRSPACE ) );
+
+ // R"ander (Links/Rechts) einstellen
+ const SfxPoolItem* pItem = GetItem( rSet, SID_ATTR_LRSPACE );
+
+ if ( pItem )
+ {
+ const SvxLRSpaceItem& rLRSpace = (const SvxLRSpaceItem&)*pItem;
+ SetMetricValue( aLeftMarginEdit, rLRSpace.GetLeft(), eUnit );
+ aBspWin.SetLeft(
+ (USHORT)ConvertLong_Impl( (long)rLRSpace.GetLeft(), eUnit ) );
+ SetMetricValue( aRightMarginEdit, rLRSpace.GetRight(), eUnit );
+ aBspWin.SetRight(
+ (USHORT)ConvertLong_Impl( (long)rLRSpace.GetRight(), eUnit ) );
+ }
+
+ // R"ander (Oben/Unten) einstellen
+ pItem = GetItem( rSet, SID_ATTR_ULSPACE );
+
+ if ( pItem )
+ {
+ const SvxULSpaceItem& rULSpace = (const SvxULSpaceItem&)*pItem;
+ SetMetricValue( aTopMarginEdit, rULSpace.GetUpper(), eUnit );
+ aBspWin.SetTop(
+ (USHORT)ConvertLong_Impl( (long)rULSpace.GetUpper(), eUnit ) );
+ SetMetricValue( aBottomMarginEdit, rULSpace.GetLower(), eUnit );
+ aBspWin.SetBottom(
+ (USHORT)ConvertLong_Impl( (long)rULSpace.GetLower(), eUnit ) );
+ }
+
+ // allgemeine Seitendaten
+ SvxNumType eNumType = SVX_ARABIC;
+ bLandscape = ( pImpl->mpDefPrinter->GetOrientation() == ORIENTATION_LANDSCAPE );
+ USHORT nUse = (USHORT)SVX_PAGE_ALL;
+ pItem = GetItem( rSet, SID_ATTR_PAGE );
+
+ if ( pItem )
+ {
+ const SvxPageItem& rItem = (const SvxPageItem&)*pItem;
+ eNumType = rItem.GetNumType();
+ nUse = rItem.GetPageUsage();
+ bLandscape = rItem.IsLandscape();
+ }
+
+ // Ausrichtung
+ aLayoutBox.SelectEntryPos( ::PageUsageToPos_Impl( nUse ) );
+ aBspWin.SetUsage( nUse );
+ LayoutHdl_Impl( 0 );
+
+ // Numerierungsart der Seitenvorlage einstellen
+ aNumberFormatBox.SelectEntryPos( sal::static_int_cast< USHORT >(eNumType) );
+
+ // Aktueller Papierschacht
+ aPaperTrayBox.Clear();
+ BYTE nPaperBin = PAPERBIN_PRINTER_SETTINGS;
+ pItem = GetItem( rSet, SID_ATTR_PAGE_PAPERBIN );
+
+ if ( pItem )
+ {
+ nPaperBin = ( (const SvxPaperBinItem*)pItem )->GetValue();
+
+ if ( nPaperBin >= pImpl->mpDefPrinter->GetPaperBinCount() )
+ nPaperBin = PAPERBIN_PRINTER_SETTINGS;
+ }
+
+ String aBinName;
+
+ if ( PAPERBIN_PRINTER_SETTINGS == nPaperBin )
+ aBinName = SVX_RESSTR( RID_SVXSTR_PAPERBIN_SETTINGS );
+ else
+ aBinName = pImpl->mpDefPrinter->GetPaperBinName( (USHORT)nPaperBin );
+
+ USHORT nEntryPos = aPaperTrayBox.InsertEntry( aBinName );
+ aPaperTrayBox.SetEntryData( nEntryPos, (void*)(ULONG)nPaperBin );
+ aPaperTrayBox.SelectEntry( aBinName );
+
+ // Size rausholen
+ Size aPaperSize = SvxPaperInfo::GetPaperSize( pImpl->mpDefPrinter );
+ pItem = GetItem( rSet, SID_ATTR_PAGE_SIZE );
+
+ if ( pItem )
+ aPaperSize = ( (const SvxSizeItem*)pItem )->GetSize();
+
+ FASTBOOL bOrientationSupport =
+ pImpl->mpDefPrinter->HasSupport( SUPPORT_SET_ORIENTATION );
+#ifdef OS2
+ // unter OS/2 wird bei HasSupport() immer TRUE returned
+ // aber nur als Dummy, deshalb FALSE
+ bOrientationSupport = FALSE;
+#endif
+
+ if ( !bOrientationSupport &&
+ aPaperSize.Width() > aPaperSize.Height() )
+ bLandscape = TRUE;
+
+ aLandscapeBtn.Check( bLandscape );
+ aPortraitBtn.Check( !bLandscape );
+
+ aBspWin.SetSize( Size( ConvertLong_Impl( aPaperSize.Width(), eUnit ),
+ ConvertLong_Impl( aPaperSize.Height(), eUnit ) ) );
+
+ aPaperSize = OutputDevice::LogicToLogic(aPaperSize, (MapUnit)eUnit, MAP_100TH_MM);
+ if ( bLandscape )
+ Swap( aPaperSize );
+
+ // Actual Paper Format
+ Paper ePaper = SvxPaperInfo::GetSvxPaper( aPaperSize, MAP_100TH_MM, TRUE );
+
+ if ( PAPER_USER != ePaper )
+ aPaperSize = SvxPaperInfo::GetPaperSize( ePaper, MAP_100TH_MM );
+
+ if ( bLandscape )
+ Swap( aPaperSize );
+
+ // Werte in die Edits eintragen
+ SetMetricValue( aPaperHeightEdit, aPaperSize.Height(), SFX_MAPUNIT_100TH_MM );
+ SetMetricValue( aPaperWidthEdit, aPaperSize.Width(), SFX_MAPUNIT_100TH_MM );
+ aPaperSizeBox.Clear();
+
+ USHORT nActPos = LISTBOX_ENTRY_NOTFOUND;
+ USHORT nAryId = RID_SVXSTRARY_PAPERSIZE_STD;
+
+ if ( ePaperStart != PAPER_A3 )
+ nAryId = RID_SVXSTRARY_PAPERSIZE_DRAW;
+ ResStringArray aPaperAry( CUI_RES( nAryId ) );
+ sal_uInt32 nCnt = aPaperAry.Count();
+
+ for ( sal_uInt32 i = 0; i < nCnt; ++i )
+ {
+ String aStr = aPaperAry.GetString(i);
+ Paper eSize = (Paper)aPaperAry.GetValue(i);
+ USHORT nPos = aPaperSizeBox.InsertEntry( aStr );
+ aPaperSizeBox.SetEntryData( nPos, (void*)(ULONG)eSize );
+
+ if ( eSize == ePaper )
+ nActPos = nPos;
+ }
+ // aktuelles Papierformat selektieren
+ aPaperSizeBox.SelectEntryPos( nActPos );
+
+ // Applikationsspezifisch
+
+ switch ( eMode )
+ {
+ case SVX_PAGE_MODE_CENTER:
+ {
+ aTblAlignFT.Show();
+ aHorzBox.Show();
+ aVertBox.Show();
+ DisableVerticalPageDir();
+
+ // Horizontale Ausrichtung
+ pItem = GetItem( rSet, SID_ATTR_PAGE_EXT1 );
+ aHorzBox.Check( pItem ? ( (const SfxBoolItem*)pItem )->GetValue()
+ : FALSE );
+
+ // Vertikale Ausrichtung
+ pItem = GetItem( rSet, SID_ATTR_PAGE_EXT2 );
+ aVertBox.Check( pItem ? ( (const SfxBoolItem*)pItem )->GetValue()
+ : FALSE );
+
+ // Beispiel-Fenster auf Tabelle setzen
+ aBspWin.SetTable( TRUE );
+ aBspWin.SetHorz( aHorzBox.IsChecked() );
+ aBspWin.SetVert( aVertBox.IsChecked() );
+
+ break;
+ }
+
+ case SVX_PAGE_MODE_PRESENTATION:
+ {
+ DisableVerticalPageDir();
+ aAdaptBox.Show();
+ pItem = GetItem( rSet, SID_ATTR_PAGE_EXT1 );
+ aAdaptBox.Check( pItem ?
+ ( (const SfxBoolItem*)pItem )->GetValue() : FALSE );
+
+ //!!! hidden, weil von StarDraw nicht implementiert
+ aLayoutBox.Hide();
+ aPageText.Hide();
+
+ break;
+ }
+ default: ;//prevent warning
+ }
+
+
+ // im Beispiel Hintergrund und Umrandung anzeigen
+ ResetBackground_Impl( rSet );
+//! UpdateExample_Impl();
+ RangeHdl_Impl( 0 );
+
+ // Header Footer anzeigen
+ InitHeadFoot_Impl( rSet );
+
+ // R"ander auf Hoch/Quer updaten, dann Beispiel updaten
+ bBorderModified = FALSE;
+ SwapFirstValues_Impl( FALSE );
+ UpdateExample_Impl();
+
+ // Alte Werte sichern
+ aLeftMarginEdit.SaveValue();
+ aRightMarginEdit.SaveValue();
+ aTopMarginEdit.SaveValue();
+ aBottomMarginEdit.SaveValue();
+ aLayoutBox.SaveValue();
+ aNumberFormatBox.SaveValue();
+ aPaperSizeBox.SaveValue();
+ aPaperWidthEdit.SaveValue();
+ aPaperHeightEdit.SaveValue();
+ aPortraitBtn.SaveValue();
+ aLandscapeBtn.SaveValue();
+ aPaperTrayBox.SaveValue();
+ aVertBox.SaveValue();
+ aHorzBox.SaveValue();
+ aAdaptBox.SaveValue();
+
+ CheckMarginEdits( true );
+
+ // Registerhaltigkeit
+ if(SFX_ITEM_SET == rSet.GetItemState(SID_SWREGISTER_MODE))
+ {
+ aRegisterCB.Check(((const SfxBoolItem&)rSet.Get(
+ SID_SWREGISTER_MODE)).GetValue());
+ aRegisterCB.SaveValue();
+ RegisterModify(&aRegisterCB);
+ }
+ if(SFX_ITEM_SET == rSet.GetItemState(SID_SWREGISTER_COLLECTION))
+ {
+ aRegisterLB.SelectEntry(
+ ((const SfxStringItem&)rSet.Get(SID_SWREGISTER_COLLECTION)).GetValue());
+ aRegisterLB.SaveValue();
+ }
+
+ SfxItemState eState = rSet.GetItemState( GetWhich( SID_ATTR_FRAMEDIRECTION ),
+ TRUE, &pItem );
+ if( SFX_ITEM_UNKNOWN != eState )
+ {
+ sal_uInt32 nVal = SFX_ITEM_SET == eState
+ ? ((SvxFrameDirectionItem*)pItem)->GetValue()
+ : 0;
+ aTextFlowBox.SelectEntryValue( static_cast< SvxFrameDirection >( nVal ) );
+ aTextFlowBox.SaveValue();
+ aBspWin.SetFrameDirection(nVal);
+ }
+}
+
+// -----------------------------------------------------------------------
+
+void SvxPageDescPage::FillUserData()
+{
+ if ( SVX_PAGE_MODE_PRESENTATION == eMode )
+ SetUserData( UniString::CreateFromInt32( (sal_Int32)aAdaptBox.IsChecked() ) );
+}
+
+// -----------------------------------------------------------------------
+
+BOOL SvxPageDescPage::FillItemSet( SfxItemSet& rSet )
+{
+ BOOL bModified = FALSE;
+ const SfxItemSet& rOldSet = GetItemSet();
+ SfxItemPool* pPool = rOldSet.GetPool();
+ DBG_ASSERT( pPool, "Wo ist der Pool" );
+ USHORT nWhich = GetWhich( SID_ATTR_LRSPACE );
+ SfxMapUnit eUnit = pPool->GetMetric( nWhich );
+ const SfxPoolItem* pOld = 0;
+
+ // alten linken und rechten Rand kopieren
+ SvxLRSpaceItem aMargin( (const SvxLRSpaceItem&)rOldSet.Get( nWhich ) );
+
+ // alten oberen und unteren Rand kopieren
+ nWhich = GetWhich( SID_ATTR_ULSPACE );
+ SvxULSpaceItem aTopMargin( (const SvxULSpaceItem&)rOldSet.Get( nWhich ) );
+
+ if ( aLeftMarginEdit.GetText() != aLeftMarginEdit.GetSavedValue() )
+ {
+ aMargin.SetLeft( (USHORT)GetCoreValue( aLeftMarginEdit, eUnit ) );
+ bModified |= TRUE;
+ }
+
+ if ( aRightMarginEdit.GetText() != aRightMarginEdit.GetSavedValue() )
+ {
+ aMargin.SetRight( (USHORT)GetCoreValue( aRightMarginEdit, eUnit ) );
+ bModified |= TRUE;
+ }
+
+ // Linken und rechten Rand setzen
+ if ( bModified )
+ {
+ pOld = GetOldItem( rSet, SID_ATTR_LRSPACE );
+
+ if ( !pOld || !( *(const SvxLRSpaceItem*)pOld == aMargin ) )
+ rSet.Put( aMargin );
+ else
+ bModified = FALSE;
+ }
+
+ BOOL bMod = FALSE;
+
+ if ( aTopMarginEdit.GetText() != aTopMarginEdit.GetSavedValue() )
+ {
+ aTopMargin.SetUpper( (USHORT)GetCoreValue( aTopMarginEdit, eUnit ) );
+ bMod |= TRUE;
+ }
+
+ if ( aBottomMarginEdit.GetText() != aBottomMarginEdit.GetSavedValue() )
+ {
+ aTopMargin.SetLower( (USHORT)GetCoreValue( aBottomMarginEdit, eUnit ) );
+ bMod |= TRUE;
+ }
+
+ // unteren oberen Rand setzen
+ //
+ if ( bMod )
+ {
+ pOld = GetOldItem( rSet, SID_ATTR_ULSPACE );
+
+ if ( !pOld || !( *(const SvxULSpaceItem*)pOld == aTopMargin ) )
+ {
+ bModified |= TRUE;
+ rSet.Put( aTopMargin );
+ }
+ }
+
+ // Druckerschacht
+ nWhich = GetWhich( SID_ATTR_PAGE_PAPERBIN );
+ USHORT nPos = aPaperTrayBox.GetSelectEntryPos();
+ USHORT nBin = (USHORT)(ULONG)aPaperTrayBox.GetEntryData( nPos );
+ pOld = GetOldItem( rSet, SID_ATTR_PAGE_PAPERBIN );
+
+ if ( !pOld || ( (const SvxPaperBinItem*)pOld )->GetValue() != nBin )
+ {
+ rSet.Put( SvxPaperBinItem( nWhich, (BYTE)nBin ) );
+ bModified |= TRUE;
+ }
+
+ nPos = aPaperSizeBox.GetSelectEntryPos();
+ Paper ePaper = (Paper)(ULONG)aPaperSizeBox.GetEntryData( nPos );
+ const USHORT nOld = aPaperSizeBox.GetSavedValue();
+ BOOL bChecked = aLandscapeBtn.IsChecked();
+
+ if ( PAPER_USER == ePaper )
+ {
+ if ( nOld != nPos ||
+ aPaperWidthEdit.IsValueModified() ||
+ aPaperHeightEdit.IsValueModified() ||
+ bChecked != aLandscapeBtn.GetSavedValue() )
+ {
+ Size aSize( GetCoreValue( aPaperWidthEdit, eUnit ),
+ GetCoreValue( aPaperHeightEdit, eUnit ) );
+ pOld = GetOldItem( rSet, SID_ATTR_PAGE_SIZE );
+
+ if ( !pOld || ( (const SvxSizeItem*)pOld )->GetSize() != aSize )
+ {
+ rSet.Put( SvxSizeItem( GetWhich(SID_ATTR_PAGE_SIZE), aSize ) );
+ bModified |= TRUE;
+ }
+ }
+ }
+ else
+ {
+ if ( nOld != nPos || bChecked != aLandscapeBtn.GetSavedValue() )
+ {
+ Size aSize( SvxPaperInfo::GetPaperSize( ePaper, (MapUnit)eUnit ) );
+
+ if ( bChecked )
+ Swap( aSize );
+
+ pOld = GetOldItem( rSet, SID_ATTR_PAGE_SIZE );
+
+ if ( !pOld || ( (const SvxSizeItem*)pOld )->GetSize() != aSize )
+ {
+ rSet.Put( SvxSizeItem( GetWhich(SID_ATTR_PAGE_SIZE), aSize ) );
+ bModified |= TRUE;
+ }
+ }
+ }
+
+ // sonstiges Zeug der Page
+ nWhich = GetWhich( SID_ATTR_PAGE );
+ SvxPageItem aPage( (const SvxPageItem&)rOldSet.Get( nWhich ) );
+ bMod = aLayoutBox.GetSelectEntryPos() != aLayoutBox.GetSavedValue();
+
+ if ( bMod )
+ aPage.SetPageUsage(
+ ::PosToPageUsage_Impl( aLayoutBox.GetSelectEntryPos() ) );
+
+ if ( bChecked != aLandscapeBtn.GetSavedValue() )
+ {
+ aPage.SetLandscape(bChecked);
+ bMod |= TRUE;
+ }
+
+ // Einstellen der Numerierungsart der Seite
+ nPos = aNumberFormatBox.GetSelectEntryPos();
+
+ if ( nPos != aNumberFormatBox.GetSavedValue() )
+ {
+ aPage.SetNumType( (SvxNumType)nPos );
+ bMod |= TRUE;
+ }
+
+ if ( bMod )
+ {
+ pOld = GetOldItem( rSet, SID_ATTR_PAGE );
+
+ if ( !pOld || !( *(const SvxPageItem*)pOld == aPage ) )
+ {
+ rSet.Put( aPage );
+ bModified |= TRUE;
+ }
+ }
+ else if ( SFX_ITEM_DEFAULT == rOldSet.GetItemState( nWhich ) )
+ rSet.ClearItem( nWhich );
+ else
+ rSet.Put( rOldSet.Get( nWhich ) );
+
+ // Modispezifische Controls auswerten
+
+ switch ( eMode )
+ {
+ case SVX_PAGE_MODE_CENTER:
+ {
+ if ( aHorzBox.IsChecked() != aHorzBox.GetSavedValue() )
+ {
+ SfxBoolItem aHorz( GetWhich( SID_ATTR_PAGE_EXT1 ),
+ aHorzBox.IsChecked() );
+ rSet.Put( aHorz );
+ bModified |= TRUE;
+ }
+
+ if ( aVertBox.IsChecked() != aVertBox.GetSavedValue() )
+ {
+ SfxBoolItem aVert( GetWhich( SID_ATTR_PAGE_EXT2 ),
+ aVertBox.IsChecked() );
+ rSet.Put( aVert );
+ bModified |= TRUE;
+ }
+ break;
+ }
+
+ case SVX_PAGE_MODE_PRESENTATION:
+ {
+ // immer putten, damit Draw das auswerten kann
+ rSet.Put( SfxBoolItem( GetWhich( SID_ATTR_PAGE_EXT1 ),
+ aAdaptBox.IsChecked() ) );
+ bModified |= TRUE;
+ break;
+ }
+ default: ;//prevent warning
+
+ }
+
+ if(aRegisterCB.IsVisible() &&
+ (aRegisterCB.IsChecked() || aRegisterCB.GetSavedValue() != aRegisterCB.IsChecked()))
+ {
+ const SfxBoolItem& rRegItem = (const SfxBoolItem&)rOldSet.Get(SID_SWREGISTER_MODE);
+ SfxBoolItem* pRegItem = (SfxBoolItem*)rRegItem.Clone();
+ BOOL bCheck = aRegisterCB.IsChecked();
+ pRegItem->SetValue(bCheck);
+ rSet.Put(*pRegItem);
+ bModified |= TRUE;
+ if(bCheck)
+ {
+ bModified |= TRUE;
+ rSet.Put(SfxStringItem(SID_SWREGISTER_COLLECTION,
+ aRegisterLB.GetSelectEntry()));
+ }
+ delete pRegItem;
+ }
+
+ SvxFrameDirection eDirection = aTextFlowBox.GetSelectEntryValue();
+ if( aTextFlowBox.IsVisible() && (eDirection != aTextFlowBox.GetSavedValue()) )
+ {
+ rSet.Put( SvxFrameDirectionItem( eDirection, GetWhich( SID_ATTR_FRAMEDIRECTION ) ) );
+ bModified = TRUE;
+ }
+
+ return bModified;
+}
+
+// -----------------------------------------------------------------------
+
+IMPL_LINK( SvxPageDescPage, LayoutHdl_Impl, ListBox *, EMPTYARG )
+{
+ // innen au\sen umschalten
+ const USHORT nPos = PosToPageUsage_Impl( aLayoutBox.GetSelectEntryPos() );
+
+ if ( nPos == SVX_PAGE_MIRROR )
+ {
+ if ( aLeftMarginLbl.GetText() != aInsideText )
+ aLeftMarginLbl.SetText( aInsideText );
+
+ if ( aRightMarginLbl.GetText() != aOutsideText )
+ aRightMarginLbl.SetText( aOutsideText );
+ }
+ else
+ {
+ if ( aLeftMarginLbl.GetText() != aLeftText )
+ aLeftMarginLbl.SetText( aLeftText );
+
+ if ( aRightMarginLbl.GetText() != aRightText )
+ aRightMarginLbl.SetText( aRightText );
+ }
+ UpdateExample_Impl( true );
+ return 0;
+}
+
+// -----------------------------------------------------------------------
+
+IMPL_LINK( SvxPageDescPage, PaperBinHdl_Impl, ListBox *, EMPTYARG )
+{
+ if ( aPaperTrayBox.GetEntryCount() > 1 )
+ // schon gef"ullt
+ return 0;
+
+ // Schacht-Box initialisieren
+ String aOldName = aPaperTrayBox.GetSelectEntry();
+ aPaperTrayBox.SetUpdateMode( FALSE );
+ aPaperTrayBox.Clear();
+ USHORT nEntryPos = aPaperTrayBox.InsertEntry(
+ SVX_RESSTR( RID_SVXSTR_PAPERBIN_SETTINGS ) );
+ aPaperTrayBox.SetEntryData( nEntryPos,
+ (void*)(ULONG)PAPERBIN_PRINTER_SETTINGS );
+ String aPaperBin( SVX_RES( RID_SVXSTR_PAPERBIN ) );
+ USHORT nBinCount = pImpl->mpDefPrinter->GetPaperBinCount();
+
+ for ( USHORT i = 0; i < nBinCount; ++i )
+ {
+ String aName = pImpl->mpDefPrinter->GetPaperBinName(i);
+
+ if ( !aName.Len() )
+ {
+ aName = aPaperBin;
+ aName.Append( sal_Unicode(' ') );
+ aName.Append( UniString::CreateFromInt32( i+1 ) );
+ }
+ nEntryPos = aPaperTrayBox.InsertEntry( aName );
+ aPaperTrayBox.SetEntryData( nEntryPos, (void*)(ULONG)i );
+ }
+ aPaperTrayBox.SelectEntry( aOldName );
+ aPaperTrayBox.SetUpdateMode( TRUE );
+
+ return 0;
+}
+
+// -----------------------------------------------------------------------
+
+IMPL_LINK( SvxPageDescPage, PaperSizeSelect_Impl, ListBox *, pBox )
+{
+ const USHORT nPos = pBox->GetSelectEntryPos();
+ Paper ePaper = (Paper)(ULONG)aPaperSizeBox.GetEntryData( nPos );
+
+ if ( ePaper != PAPER_USER )
+ {
+ Size aSize( SvxPaperInfo::GetPaperSize( ePaper, MAP_100TH_MM ) );
+
+ if ( aLandscapeBtn.IsChecked() )
+ Swap( aSize );
+
+ if ( aSize.Height() < aPaperHeightEdit.GetMin( FUNIT_100TH_MM ) )
+ aPaperHeightEdit.SetMin(
+ aPaperHeightEdit.Normalize( aSize.Height() ), FUNIT_100TH_MM );
+ if ( aSize.Width() < aPaperWidthEdit.GetMin( FUNIT_100TH_MM ) )
+ aPaperWidthEdit.SetMin(
+ aPaperWidthEdit.Normalize( aSize.Width() ), FUNIT_100TH_MM );
+ SetMetricValue( aPaperHeightEdit, aSize.Height(), SFX_MAPUNIT_100TH_MM );
+ SetMetricValue( aPaperWidthEdit, aSize.Width(), SFX_MAPUNIT_100TH_MM );
+
+ // R"ander ggf. neu berechnen
+ CalcMargin_Impl();
+
+ RangeHdl_Impl( 0 );
+ UpdateExample_Impl( true );
+
+ if ( eMode == SVX_PAGE_MODE_PRESENTATION )
+ {
+ // Draw: bei Papierformat soll der Rand 1cm betragen
+ long nTmp = 0;
+ BOOL bScreen = ( PAPER_SCREEN == ePaper );
+
+ if ( !bScreen )
+ // bei Bildschirm keinen Rand
+ nTmp = 1; // entspr. 1cm
+
+ // Abfragen, ob fuer Raender 0 gesetzt ist:
+ if ( bScreen || aRightMarginEdit.GetValue() == 0 )
+ {
+ SetMetricValue( aRightMarginEdit, nTmp, SFX_MAPUNIT_CM );
+ if ( !bScreen &&
+ aRightMarginEdit.GetFirst() > aRightMarginEdit.GetValue() )
+ aRightMarginEdit.SetValue( aRightMarginEdit.GetFirst() );
+ }
+ if ( bScreen || aLeftMarginEdit.GetValue() == 0 )
+ {
+ SetMetricValue( aLeftMarginEdit, nTmp, SFX_MAPUNIT_CM );
+ if ( !bScreen &&
+ aLeftMarginEdit.GetFirst() > aLeftMarginEdit.GetValue() )
+ aLeftMarginEdit.SetValue( aLeftMarginEdit.GetFirst() );
+ }
+ if ( bScreen || aBottomMarginEdit.GetValue() == 0 )
+ {
+ SetMetricValue( aBottomMarginEdit, nTmp, SFX_MAPUNIT_CM );
+ if ( !bScreen &&
+ aBottomMarginEdit.GetFirst() > aBottomMarginEdit.GetValue() )
+ aBottomMarginEdit.SetValue( aBottomMarginEdit.GetFirst() );
+ }
+ if ( bScreen || aTopMarginEdit.GetValue() == 0 )
+ {
+ SetMetricValue( aTopMarginEdit, nTmp, SFX_MAPUNIT_CM );
+ if ( !bScreen &&
+ aTopMarginEdit.GetFirst() > aTopMarginEdit.GetValue() )
+ aTopMarginEdit.SetValue( aTopMarginEdit.GetFirst() );
+ }
+ UpdateExample_Impl( true );
+ }
+ }
+ return 0;
+}
+
+// -----------------------------------------------------------------------
+
+IMPL_LINK( SvxPageDescPage, PaperSizeModify_Impl, Edit *, EMPTYARG )
+{
+ USHORT nWhich = GetWhich( SID_ATTR_LRSPACE );
+ SfxMapUnit eUnit = GetItemSet().GetPool()->GetMetric( nWhich );
+ Size aSize( GetCoreValue( aPaperWidthEdit, eUnit ),
+ GetCoreValue( aPaperHeightEdit, eUnit ) );
+ Paper ePaper = SvxPaperInfo::GetSvxPaper( aSize, (MapUnit)eUnit, TRUE );
+ USHORT nEntryCount = aPaperSizeBox.GetEntryCount();
+
+ for ( USHORT i = 0; i < nEntryCount; ++i )
+ {
+ Paper eTmp = (Paper)(ULONG)aPaperSizeBox.GetEntryData(i);
+
+ if ( eTmp == ePaper )
+ {
+ aPaperSizeBox.SelectEntryPos(i);
+ break;
+ }
+ }
+ UpdateExample_Impl( true );
+ return 0;
+}
+
+// -----------------------------------------------------------------------
+
+IMPL_LINK( SvxPageDescPage, SwapOrientation_Impl, RadioButton *, pBtn )
+{
+ if (
+ (!bLandscape && pBtn == &aLandscapeBtn) ||
+ (bLandscape && pBtn == &aPortraitBtn)
+ )
+ {
+ bLandscape = aLandscapeBtn.IsChecked();
+
+ const long lWidth = GetCoreValue( aPaperWidthEdit, SFX_MAPUNIT_100TH_MM );
+ const long lHeight = GetCoreValue( aPaperHeightEdit, SFX_MAPUNIT_100TH_MM );
+
+ // swap with and height
+ SetMetricValue( aPaperWidthEdit, lHeight, SFX_MAPUNIT_100TH_MM );
+ SetMetricValue( aPaperHeightEdit, lWidth, SFX_MAPUNIT_100TH_MM );
+
+ // recalculate margins if necessary
+ CalcMargin_Impl();
+
+ PaperSizeSelect_Impl( &aPaperSizeBox );
+ RangeHdl_Impl( 0 );
+ SwapFirstValues_Impl( bBorderModified );
+ UpdateExample_Impl( true );
+ }
+ return 0;
+}
+
+// -----------------------------------------------------------------------
+
+void SvxPageDescPage::SwapFirstValues_Impl( FASTBOOL bSet )
+{
+ MapMode aOldMode = pImpl->mpDefPrinter->GetMapMode();
+ Orientation eOri = ORIENTATION_PORTRAIT;
+
+ if ( bLandscape )
+ eOri = ORIENTATION_LANDSCAPE;
+ Orientation eOldOri = pImpl->mpDefPrinter->GetOrientation();
+ pImpl->mpDefPrinter->SetOrientation( eOri );
+ pImpl->mpDefPrinter->SetMapMode( MAP_TWIP );
+
+ // First- und Last-Werte f"ur die R"ander setzen
+ Size aPaperSize = pImpl->mpDefPrinter->GetPaperSize();
+ Size aPrintSize = pImpl->mpDefPrinter->GetOutputSize();
+ /*
+ * einen Punkt ( 0,0 ) in logische Koordinaten zu konvertieren,
+ * sieht aus wie Unsinn; ist aber sinnvoll, wenn der Ursprung des
+ * Koordinatensystems verschoben ist.
+ */
+ Point aPrintOffset = pImpl->mpDefPrinter->GetPageOffset() -
+ pImpl->mpDefPrinter->PixelToLogic( Point() );
+ pImpl->mpDefPrinter->SetMapMode( aOldMode );
+ pImpl->mpDefPrinter->SetOrientation( eOldOri );
+
+ sal_Int64 nSetL = aLeftMarginEdit.Denormalize(
+ aLeftMarginEdit.GetValue( FUNIT_TWIP ) );
+ sal_Int64 nSetR = aRightMarginEdit.Denormalize(
+ aRightMarginEdit.GetValue( FUNIT_TWIP ) );
+ sal_Int64 nSetT = aTopMarginEdit.Denormalize(
+ aTopMarginEdit.GetValue( FUNIT_TWIP ) );
+ sal_Int64 nSetB = aBottomMarginEdit.Denormalize(
+ aBottomMarginEdit.GetValue( FUNIT_TWIP ) );
+
+ long nOffset = !aPrintOffset.X() && !aPrintOffset.Y() ? 0 : PRINT_OFFSET;
+ long nNewL = aPrintOffset.X();
+ long nNewR =
+ aPaperSize.Width() - aPrintSize.Width() - aPrintOffset.X() + nOffset;
+ long nNewT = aPrintOffset.Y();
+ long nNewB =
+ aPaperSize.Height() - aPrintSize.Height() - aPrintOffset.Y() + nOffset;
+
+ aLeftMarginEdit.SetFirst( aLeftMarginEdit.Normalize( nNewL ), FUNIT_TWIP );
+ nFirstLeftMargin = static_cast<long>(aLeftMarginEdit.GetFirst());
+ aRightMarginEdit.SetFirst( aRightMarginEdit.Normalize( nNewR ), FUNIT_TWIP );
+ nFirstRightMargin = static_cast<long>(aRightMarginEdit.GetFirst());
+ aTopMarginEdit.SetFirst( aTopMarginEdit.Normalize( nNewT ), FUNIT_TWIP );
+ nFirstTopMargin = static_cast<long>(aTopMarginEdit.GetFirst());
+ aBottomMarginEdit.SetFirst( aBottomMarginEdit.Normalize( nNewB ), FUNIT_TWIP );
+ nFirstBottomMargin = static_cast<long>(aBottomMarginEdit.GetFirst());
+
+ if ( bSet )
+ {
+ // ggf. auch die Werte umsetzen,
+ if ( nSetL < nNewL )
+ aLeftMarginEdit.SetValue( aLeftMarginEdit.Normalize( nNewL ),
+ FUNIT_TWIP );
+ if ( nSetR < nNewR )
+ aRightMarginEdit.SetValue( aRightMarginEdit.Normalize( nNewR ),
+ FUNIT_TWIP );
+ if ( nSetT < nNewT )
+ aTopMarginEdit.SetValue( aTopMarginEdit.Normalize( nNewT ),
+ FUNIT_TWIP );
+ if ( nSetB < nNewB )
+ aBottomMarginEdit.SetValue( aBottomMarginEdit.Normalize( nNewB ),
+ FUNIT_TWIP );
+ }
+}
+
+// -----------------------------------------------------------------------
+
+IMPL_LINK_INLINE_START( SvxPageDescPage, BorderModify_Impl, MetricField *, EMPTYARG )
+{
+ if ( !bBorderModified )
+ bBorderModified = TRUE;
+ UpdateExample_Impl();
+ return 0;
+}
+IMPL_LINK_INLINE_END( SvxPageDescPage, BorderModify_Impl, MetricField *, EMPTYARG )
+
+// -----------------------------------------------------------------------
+
+void SvxPageDescPage::UpdateExample_Impl( bool bResetbackground )
+{
+ // Size
+ Size aSize( GetCoreValue( aPaperWidthEdit, SFX_MAPUNIT_TWIP ),
+ GetCoreValue( aPaperHeightEdit, SFX_MAPUNIT_TWIP ) );
+
+ aBspWin.SetSize( aSize );
+
+ // R"ander
+ aBspWin.SetTop( GetCoreValue( aTopMarginEdit, SFX_MAPUNIT_TWIP ) );
+ aBspWin.SetBottom( GetCoreValue( aBottomMarginEdit, SFX_MAPUNIT_TWIP ) );
+ aBspWin.SetLeft( GetCoreValue( aLeftMarginEdit, SFX_MAPUNIT_TWIP ) );
+ aBspWin.SetRight( GetCoreValue( aRightMarginEdit, SFX_MAPUNIT_TWIP ) );
+
+ // Layout
+ aBspWin.SetUsage( PosToPageUsage_Impl( aLayoutBox.GetSelectEntryPos() ) );
+ if ( bResetbackground )
+ aBspWin.ResetBackground();
+ aBspWin.Invalidate();
+}
+
+// -----------------------------------------------------------------------
+
+void SvxPageDescPage::ResetBackground_Impl( const SfxItemSet& rSet )
+{
+ USHORT nWhich = GetWhich( SID_ATTR_PAGE_HEADERSET );
+
+ if ( rSet.GetItemState( nWhich, FALSE ) == SFX_ITEM_SET )
+ {
+ const SvxSetItem& rSetItem =
+ (const SvxSetItem&)rSet.Get( nWhich, FALSE );
+ const SfxItemSet& rTmpSet = rSetItem.GetItemSet();
+ const SfxBoolItem& rOn =
+ (const SfxBoolItem&)rTmpSet.Get( GetWhich( SID_ATTR_PAGE_ON ) );
+
+ if ( rOn.GetValue() )
+ {
+ nWhich = GetWhich( SID_ATTR_BRUSH );
+
+ if ( rTmpSet.GetItemState( nWhich ) == SFX_ITEM_SET )
+ {
+ const SvxBrushItem& rItem =
+ (const SvxBrushItem&)rTmpSet.Get( nWhich );
+ aBspWin.SetHdColor( rItem.GetColor() );
+ }
+ nWhich = GetWhich( SID_ATTR_BORDER_OUTER );
+
+ if ( rTmpSet.GetItemState( nWhich ) == SFX_ITEM_SET )
+ {
+ const SvxBoxItem& rItem =
+ (const SvxBoxItem&)rTmpSet.Get( nWhich );
+ aBspWin.SetHdBorder( rItem );
+ }
+ }
+ }
+
+ nWhich = GetWhich( SID_ATTR_PAGE_FOOTERSET );
+
+ if ( rSet.GetItemState( nWhich, FALSE ) == SFX_ITEM_SET )
+ {
+ const SvxSetItem& rSetItem =
+ (const SvxSetItem&)rSet.Get( nWhich, FALSE );
+ const SfxItemSet& rTmpSet = rSetItem.GetItemSet();
+ const SfxBoolItem& rOn =
+ (const SfxBoolItem&)rTmpSet.Get( GetWhich( SID_ATTR_PAGE_ON ) );
+
+ if ( rOn.GetValue() )
+ {
+ nWhich = GetWhich( SID_ATTR_BRUSH );
+
+ if ( rTmpSet.GetItemState( nWhich ) == SFX_ITEM_SET )
+ {
+ const SvxBrushItem& rItem =
+ (const SvxBrushItem&)rTmpSet.Get( nWhich );
+ aBspWin.SetFtColor( rItem.GetColor() );
+ }
+ nWhich = GetWhich( SID_ATTR_BORDER_OUTER );
+
+ if ( rTmpSet.GetItemState( nWhich ) == SFX_ITEM_SET )
+ {
+ const SvxBoxItem& rItem =
+ (const SvxBoxItem&)rTmpSet.Get( nWhich );
+ aBspWin.SetFtBorder( rItem );
+ }
+ }
+ }
+
+ const SfxPoolItem* pItem = GetItem( rSet, SID_ATTR_BRUSH );
+
+ if ( pItem )
+ {
+ aBspWin.SetColor( ( (const SvxBrushItem*)pItem )->GetColor() );
+ const Graphic* pGrf = ( (const SvxBrushItem*)pItem )->GetGraphic();
+
+ if ( pGrf )
+ {
+ Bitmap aBitmap = pGrf->GetBitmap();
+ aBspWin.SetBitmap( &aBitmap );
+ }
+ else
+ aBspWin.SetBitmap( NULL );
+ }
+
+ pItem = GetItem( rSet, SID_ATTR_BORDER_OUTER );
+
+ if ( pItem )
+ aBspWin.SetBorder( (SvxBoxItem&)*pItem );
+}
+
+// -----------------------------------------------------------------------
+
+void SvxPageDescPage::InitHeadFoot_Impl( const SfxItemSet& rSet )
+{
+ bLandscape = aLandscapeBtn.IsChecked();
+ const SfxPoolItem* pItem = GetItem( rSet, SID_ATTR_PAGE_SIZE );
+
+ if ( pItem )
+ aBspWin.SetSize( ( (const SvxSizeItem*)pItem )->GetSize() );
+
+ const SvxSetItem* pSetItem = 0;
+
+ // Kopfzeilen-Attribute auswerten
+
+ if ( SFX_ITEM_SET ==
+ rSet.GetItemState( GetWhich( SID_ATTR_PAGE_HEADERSET ),
+ FALSE, (const SfxPoolItem**)&pSetItem ) )
+ {
+ const SfxItemSet& rHeaderSet = pSetItem->GetItemSet();
+ const SfxBoolItem& rHeaderOn =
+ (const SfxBoolItem&)rHeaderSet.Get( GetWhich( SID_ATTR_PAGE_ON ) );
+
+ if ( rHeaderOn.GetValue() )
+ {
+ const SvxSizeItem& rSize = (const SvxSizeItem&)
+ rHeaderSet.Get( GetWhich( SID_ATTR_PAGE_SIZE ) );
+ const SvxULSpaceItem& rUL = (const SvxULSpaceItem&)
+ rHeaderSet.Get( GetWhich( SID_ATTR_ULSPACE ) );
+ long nDist = rUL.GetLower();
+ aBspWin.SetHdHeight( rSize.GetSize().Height() - nDist );
+ aBspWin.SetHdDist( nDist );
+ const SvxLRSpaceItem& rLR = (const SvxLRSpaceItem&)
+ rHeaderSet.Get( GetWhich( SID_ATTR_LRSPACE ) );
+ aBspWin.SetHdLeft( rLR.GetLeft() );
+ aBspWin.SetHdRight( rLR.GetRight() );
+ aBspWin.SetHeader( TRUE );
+ }
+ else
+ aBspWin.SetHeader( FALSE );
+
+ // im Beispiel Hintergrund und Umrandung anzeigen
+ USHORT nWhich = GetWhich( SID_ATTR_BRUSH );
+
+ if ( rHeaderSet.GetItemState( nWhich ) >= SFX_ITEM_AVAILABLE )
+ {
+ const SvxBrushItem& rItem =
+ (const SvxBrushItem&)rHeaderSet.Get( nWhich );
+ aBspWin.SetHdColor( rItem.GetColor() );
+ }
+ nWhich = GetWhich( SID_ATTR_BORDER_OUTER );
+
+ if ( rHeaderSet.GetItemState( nWhich ) >= SFX_ITEM_AVAILABLE )
+ {
+ const SvxBoxItem& rItem =
+ (const SvxBoxItem&)rHeaderSet.Get( nWhich );
+ aBspWin.SetHdBorder( rItem );
+ }
+ }
+
+ // Fusszeilen-Attribute auswerten
+
+ if ( SFX_ITEM_SET ==
+ rSet.GetItemState( GetWhich( SID_ATTR_PAGE_FOOTERSET ),
+ FALSE, (const SfxPoolItem**)&pSetItem ) )
+ {
+ const SfxItemSet& rFooterSet = pSetItem->GetItemSet();
+ const SfxBoolItem& rFooterOn =
+ (const SfxBoolItem&)rFooterSet.Get( GetWhich( SID_ATTR_PAGE_ON ) );
+
+ if ( rFooterOn.GetValue() )
+ {
+ const SvxSizeItem& rSize = (const SvxSizeItem&)
+ rFooterSet.Get( GetWhich( SID_ATTR_PAGE_SIZE ) );
+ const SvxULSpaceItem& rUL = (const SvxULSpaceItem&)
+ rFooterSet.Get( GetWhich( SID_ATTR_ULSPACE ) );
+ long nDist = rUL.GetUpper();
+ aBspWin.SetFtHeight( rSize.GetSize().Height() - nDist );
+ aBspWin.SetFtDist( nDist );
+ const SvxLRSpaceItem& rLR = (const SvxLRSpaceItem&)
+ rFooterSet.Get( GetWhich( SID_ATTR_LRSPACE ) );
+ aBspWin.SetFtLeft( rLR.GetLeft() );
+ aBspWin.SetFtRight( rLR.GetRight() );
+ aBspWin.SetFooter( TRUE );
+ }
+ else
+ aBspWin.SetFooter( FALSE );
+
+ // im Beispiel Hintergrund und Umrandung anzeigen
+ USHORT nWhich = GetWhich( SID_ATTR_BRUSH );
+
+ if ( rFooterSet.GetItemState( nWhich ) >= SFX_ITEM_AVAILABLE )
+ {
+ const SvxBrushItem& rItem =
+ (const SvxBrushItem&)rFooterSet.Get( nWhich );
+ aBspWin.SetFtColor( rItem.GetColor() );
+ }
+ nWhich = GetWhich( SID_ATTR_BORDER_OUTER );
+
+ if ( rFooterSet.GetItemState( nWhich ) >= SFX_ITEM_AVAILABLE )
+ {
+ const SvxBoxItem& rItem =
+ (const SvxBoxItem&)rFooterSet.Get( nWhich );
+ aBspWin.SetFtBorder( rItem );
+ }
+ }
+}
+
+// -----------------------------------------------------------------------
+
+void SvxPageDescPage::ActivatePage( const SfxItemSet& rSet )
+{
+ InitHeadFoot_Impl( rSet );
+ ResetBackground_Impl( rSet );
+ RangeHdl_Impl( 0 );
+}
+
+// -----------------------------------------------------------------------
+
+int SvxPageDescPage::DeactivatePage( SfxItemSet* _pSet )
+{
+ // Abfrage, ob die Seitenr"ander ausserhalb des Druckbereichs liegen
+ // Wenn nicht, dann den Anwender fragen, ob sie "ubernommen werden sollen.
+ // Wenn nicht, dann auf der TabPage bleiben.
+ USHORT nPos = aPaperSizeBox.GetSelectEntryPos();
+ Paper ePaper = (Paper)(ULONG)aPaperSizeBox.GetEntryData( nPos );
+
+ if ( ePaper != PAPER_SCREEN && IsMarginOutOfRange() )
+ {
+ if ( QueryBox( this, WB_YES_NO | WB_DEF_NO, aPrintRangeQueryText ).Execute() == RET_NO )
+ {
+ MetricField* pField = NULL;
+ if ( IsPrinterRangeOverflow( aLeftMarginEdit, nFirstLeftMargin, nLastLeftMargin, MARGIN_LEFT ) )
+ pField = &aLeftMarginEdit;
+ if ( IsPrinterRangeOverflow( aRightMarginEdit, nFirstRightMargin, nLastRightMargin, MARGIN_RIGHT )
+ && !pField )
+ pField = &aRightMarginEdit;
+ if ( IsPrinterRangeOverflow( aTopMarginEdit, nFirstTopMargin, nLastTopMargin, MARGIN_TOP )
+ && !pField )
+ pField = &aTopMarginEdit;
+ if ( IsPrinterRangeOverflow( aBottomMarginEdit, nFirstBottomMargin, nLastBottomMargin, MARGIN_BOTTOM )
+ && !pField )
+ pField = &aBottomMarginEdit;
+ if ( pField )
+ pField->GrabFocus();
+ UpdateExample_Impl();
+ return KEEP_PAGE;
+ }
+ else
+ CheckMarginEdits( false );
+ }
+
+ if ( _pSet )
+ {
+ FillItemSet( *_pSet );
+
+ // ggf. hoch/quer putten
+ USHORT nWh = GetWhich( SID_ATTR_PAGE_SIZE );
+ SfxMapUnit eUnit = GetItemSet().GetPool()->GetMetric( nWh );
+ Size aSize( GetCoreValue( aPaperWidthEdit, eUnit ),
+ GetCoreValue( aPaperHeightEdit, eUnit ) );
+
+ // putten, wenn aktuelle Gr"o/se unterschiedlich zum Wert in _pSet
+ const SvxSizeItem* pSize = (const SvxSizeItem*)GetItem( *_pSet, SID_ATTR_PAGE_SIZE );
+ if ( aSize.Width() && ( !pSize || !IsEqualSize_Impl( pSize, aSize ) ) )
+ _pSet->Put( SvxSizeItem( nWh, aSize ) );
+ }
+
+ return LEAVE_PAGE;
+}
+
+// -----------------------------------------------------------------------
+
+IMPL_LINK( SvxPageDescPage, RangeHdl_Impl, Edit *, EMPTYARG )
+{
+ // Aktuelle Header-Breite/H"ohe aus dem Bsp
+ long nHHeight = aBspWin.GetHdHeight();
+ long nHDist = aBspWin.GetHdDist();
+
+ // Aktuelle Footer-Breite/H"ohe aus dem Bsp
+ long nFHeight = aBspWin.GetFtHeight();
+ long nFDist = aBspWin.GetFtDist();
+
+ // Aktuelle Header/Footer-R"ander aus dem Bsp
+ long nHFLeft = Max( aBspWin.GetHdLeft(), aBspWin.GetFtLeft() );
+ long nHFRight = Max( aBspWin.GetHdRight(), aBspWin.GetFtRight() );
+
+ // Aktuelle Werte der Seitenr"ander
+ long nBT = static_cast<long>(aTopMarginEdit.Denormalize(aTopMarginEdit.GetValue(FUNIT_TWIP)));
+ long nBB = static_cast<long>(aBottomMarginEdit.Denormalize(aBottomMarginEdit.GetValue(FUNIT_TWIP)));
+ long nBL = static_cast<long>(aLeftMarginEdit.Denormalize(aLeftMarginEdit.GetValue(FUNIT_TWIP)));
+ long nBR = static_cast<long>(aRightMarginEdit.Denormalize(aRightMarginEdit.GetValue(FUNIT_TWIP)));
+
+ // Breite Umrandung der Seite berechnen
+ const SfxItemSet* _pSet = &GetItemSet();
+ Size aBorder;
+
+ if ( _pSet->GetItemState( GetWhich(SID_ATTR_BORDER_SHADOW) ) >=
+ SFX_ITEM_AVAILABLE &&
+ _pSet->GetItemState( GetWhich(SID_ATTR_BORDER_OUTER) ) >=
+ SFX_ITEM_AVAILABLE )
+ {
+ aBorder = ( GetMinBorderSpace_Impl(
+ (const SvxShadowItem&)_pSet->Get(GetWhich(SID_ATTR_BORDER_SHADOW)),
+ (const SvxBoxItem&)_pSet->Get(GetWhich(SID_ATTR_BORDER_OUTER))));
+ }
+
+ long nH = static_cast<long>(aPaperHeightEdit.Denormalize(aPaperHeightEdit.GetValue(FUNIT_TWIP)));
+ long nW = static_cast<long>(aPaperWidthEdit.Denormalize(aPaperWidthEdit.GetValue(FUNIT_TWIP)));
+
+ // Grenzen Papier
+ // Maximum liegt bei 54cm
+ //
+ long nMin = nHHeight + nHDist + nFDist + nFHeight + nBT + nBB +
+ MINBODY + aBorder.Height();
+ aPaperHeightEdit.SetMin(aPaperHeightEdit.Normalize(nMin), FUNIT_TWIP);
+
+ nMin = MINBODY + nBL + nBR + aBorder.Width();
+ aPaperWidthEdit.SetMin(aPaperWidthEdit.Normalize(nMin), FUNIT_TWIP);
+
+ // Falls sich die Papiergr"o\se ge"adert hat
+ nH = static_cast<long>(aPaperHeightEdit.Denormalize(aPaperHeightEdit.GetValue(FUNIT_TWIP)));
+ nW = static_cast<long>(aPaperWidthEdit.Denormalize(aPaperWidthEdit.GetValue(FUNIT_TWIP)));
+
+ // Top
+ long nMax = nH - nBB - aBorder.Height() - MINBODY -
+ nFDist - nFHeight - nHDist - nHHeight;
+
+ aTopMarginEdit.SetMax(aTopMarginEdit.Normalize(nMax), FUNIT_TWIP);
+
+ // Bottom
+ nMax = nH - nBT - aBorder.Height() - MINBODY -
+ nFDist - nFHeight - nHDist - nHHeight;
+
+ aBottomMarginEdit.SetMax(aTopMarginEdit.Normalize(nMax), FUNIT_TWIP);
+
+ // Left
+ nMax = nW - nBR - MINBODY - aBorder.Width() - nHFLeft - nHFRight;
+ aLeftMarginEdit.SetMax(aLeftMarginEdit.Normalize(nMax), FUNIT_TWIP);
+
+ // Right
+ nMax = nW - nBL - MINBODY - aBorder.Width() - nHFLeft - nHFRight;
+ aRightMarginEdit.SetMax(aRightMarginEdit.Normalize(nMax), FUNIT_TWIP);
+ return 0;
+}
+
+// -----------------------------------------------------------------------
+
+void SvxPageDescPage::CalcMargin_Impl()
+{
+ // Aktuelle Werte der Seitenr"ander
+ long nBT = GetCoreValue( aTopMarginEdit, SFX_MAPUNIT_TWIP );
+ long nBB = GetCoreValue( aBottomMarginEdit, SFX_MAPUNIT_TWIP );
+
+ long nBL = GetCoreValue( aLeftMarginEdit, SFX_MAPUNIT_TWIP );
+ long nBR = GetCoreValue( aRightMarginEdit, SFX_MAPUNIT_TWIP );
+
+ long nH = GetCoreValue( aPaperHeightEdit, SFX_MAPUNIT_TWIP );
+ long nW = GetCoreValue( aPaperWidthEdit, SFX_MAPUNIT_TWIP );
+
+ long nWidth = nBL + nBR + MINBODY;
+ long nHeight = nBT + nBB + MINBODY;
+
+ if ( nWidth > nW || nHeight > nH )
+ {
+ if ( nWidth > nW )
+ {
+ long nTmp = nBL <= nBR ? nBR : nBL;
+ nTmp -= nWidth - nW;
+
+ if ( nBL <= nBR )
+ SetMetricValue( aRightMarginEdit, nTmp, SFX_MAPUNIT_TWIP );
+ else
+ SetMetricValue( aLeftMarginEdit, nTmp, SFX_MAPUNIT_TWIP );
+ }
+
+ if ( nHeight > nH )
+ {
+ long nTmp = nBT <= nBB ? nBB : nBT;
+ nTmp -= nHeight - nH;
+
+ if ( nBT <= nBB )
+ SetMetricValue( aBottomMarginEdit, nTmp, SFX_MAPUNIT_TWIP );
+ else
+ SetMetricValue( aTopMarginEdit, nTmp, SFX_MAPUNIT_TWIP );
+ }
+ }
+}
+
+// -----------------------------------------------------------------------
+
+IMPL_LINK_INLINE_START( SvxPageDescPage, CenterHdl_Impl, CheckBox *, EMPTYARG )
+{
+ aBspWin.SetHorz( aHorzBox.IsChecked() );
+ aBspWin.SetVert( aVertBox.IsChecked() );
+ UpdateExample_Impl();
+ return 0;
+}
+IMPL_LINK_INLINE_END( SvxPageDescPage, CenterHdl_Impl, CheckBox *, EMPTYARG )
+
+// -----------------------------------------------------------------------
+
+void SvxPageDescPage::SetCollectionList(const List* pList)
+{
+ sStandardRegister = *(String*)pList->GetObject(0);
+ for( USHORT i = 1; i < pList->Count(); i++ )
+ {
+ aRegisterLB.InsertEntry(*(String*)pList->GetObject(i));
+ }
+
+ aRegisterCB .Show();
+ aRegisterFT .Show();
+ aRegisterLB.Show();
+ aRegisterCB.SetClickHdl(LINK(this, SvxPageDescPage, RegisterModify));
+}
+
+// -----------------------------------------------------------------------
+
+IMPL_LINK( SvxPageDescPage, RegisterModify, CheckBox*, pBox )
+{
+ BOOL bEnable = FALSE;
+ if(pBox->IsChecked())
+ {
+ bEnable = TRUE;
+ if(USHRT_MAX == aRegisterLB.GetSelectEntryPos())
+ aRegisterLB.SelectEntry(sStandardRegister);
+ }
+ aRegisterFT.Enable( bEnable );
+ aRegisterLB.Enable( bEnable );
+ return 0;
+}
+
+// ----------------------------------------------------------------------------
+
+void SvxPageDescPage::DisableVerticalPageDir()
+{
+ aTextFlowBox.RemoveEntryValue( FRMDIR_VERT_TOP_RIGHT );
+ aTextFlowBox.RemoveEntryValue( FRMDIR_VERT_TOP_LEFT );
+ if( aTextFlowBox.GetEntryCount() < 2 )
+ {
+ aTextFlowLbl.Hide();
+ aTextFlowBox.Hide();
+ aBspWin.EnableFrameDirection( sal_False );
+ }
+}
+
+IMPL_LINK( SvxPageDescPage, FrameDirectionModify_Impl, ListBox*, EMPTYARG)
+{
+ aBspWin.SetFrameDirection( (sal_uInt32) aTextFlowBox.GetSelectEntryValue() );
+ aBspWin.Invalidate();
+ return 0;
+}
+
+bool SvxPageDescPage::IsPrinterRangeOverflow(
+ MetricField& rField, long nFirstMargin, long nLastMargin, MarginPosition nPos )
+{
+ bool bRet = false;
+ bool bCheck = ( ( pImpl->m_nPos & nPos ) == 0 );
+ long nValue = static_cast<long>(rField.GetValue());
+ if ( bCheck &&
+ ( nValue < nFirstMargin || nValue > nLastMargin ) &&
+ rField.GetText() != rField.GetSavedValue() )
+ {
+ rField.SetValue( nValue < nFirstMargin ? nFirstMargin : nLastMargin );
+ bRet = true;
+ }
+
+ return bRet;
+}
+
+/** Check if a value of a margin edit is outside the printer paper margins
+ and save this information.
+*/
+void SvxPageDescPage::CheckMarginEdits( bool _bClear )
+{
+ if ( _bClear )
+ pImpl->m_nPos = 0;
+
+ sal_Int64 nValue = aLeftMarginEdit.GetValue();
+ if ( nValue < nFirstLeftMargin || nValue > nLastLeftMargin )
+ pImpl->m_nPos |= MARGIN_LEFT;
+ nValue = aRightMarginEdit.GetValue();
+ if ( nValue < nFirstRightMargin || nValue > nLastRightMargin )
+ pImpl->m_nPos |= MARGIN_RIGHT;
+ nValue = aTopMarginEdit.GetValue();
+ if ( nValue < nFirstTopMargin || nValue > nLastTopMargin )
+ pImpl->m_nPos |= MARGIN_TOP;
+ nValue = aBottomMarginEdit.GetValue();
+ if ( nValue < nFirstBottomMargin || nValue > nLastBottomMargin )
+ pImpl->m_nPos |= MARGIN_BOTTOM;
+}
+
+bool SvxPageDescPage::IsMarginOutOfRange()
+{
+ bool bRet = ( ( ( !( pImpl->m_nPos & MARGIN_LEFT ) &&
+ ( aLeftMarginEdit.GetText() != aLeftMarginEdit.GetSavedValue() ) ) &&
+ ( aLeftMarginEdit.GetValue() < nFirstLeftMargin ||
+ aLeftMarginEdit.GetValue() > nLastLeftMargin ) ) ||
+ ( ( !( pImpl->m_nPos & MARGIN_RIGHT ) &&
+ ( aRightMarginEdit.GetText() != aRightMarginEdit.GetSavedValue() ) ) &&
+ ( aRightMarginEdit.GetValue() < nFirstRightMargin ||
+ aRightMarginEdit.GetValue() > nLastRightMargin ) ) ||
+ ( ( !( pImpl->m_nPos & MARGIN_TOP ) &&
+ ( aTopMarginEdit.GetText() != aTopMarginEdit.GetSavedValue() ) ) &&
+ ( aTopMarginEdit.GetValue() < nFirstTopMargin ||
+ aTopMarginEdit.GetValue() > nLastTopMargin ) ) ||
+ ( ( !( pImpl->m_nPos & MARGIN_BOTTOM ) &&
+ ( aBottomMarginEdit.GetText() != aBottomMarginEdit.GetSavedValue() ) ) &&
+ ( aBottomMarginEdit.GetValue() < nFirstBottomMargin ||
+ aBottomMarginEdit.GetValue() > nLastBottomMargin ) ) );
+ return bRet;
+}
+
+void SvxPageDescPage::PageCreated (SfxAllItemSet aSet) //add CHINA001
+{
+ SFX_ITEMSET_ARG (&aSet,pModeItem,SfxAllEnumItem,SID_ENUM_PAGE_MODE,sal_False);
+ SFX_ITEMSET_ARG (&aSet,pPaperStartItem,SfxAllEnumItem,SID_PAPER_START,sal_False);
+ SFX_ITEMSET_ARG (&aSet,pPaperEndItem,SfxAllEnumItem,SID_PAPER_END,sal_False);
+ SFX_ITEMSET_ARG (&aSet,pCollectListItem,SfxStringListItem,SID_COLLECT_LIST,sal_False);
+ if (pModeItem)
+ SetMode((SvxModeType)pModeItem->GetEnumValue());
+ if (pPaperStartItem && pPaperEndItem)
+ SetPaperFormatRanges( (Paper)pPaperStartItem->GetEnumValue(), (Paper)pPaperEndItem->GetEnumValue() );
+ if (pCollectListItem)
+ SetCollectionList(pCollectListItem->GetList());
+}