xref: /trunk/main/cui/source/tabpages/page.cxx (revision 2ee96f1c)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_cui.hxx"
26 
27 // include ---------------------------------------------------------------
28 #include <sfx2/app.hxx>
29 #include <sfx2/objsh.hxx>
30 #include <tools/resary.hxx>
31 #include <vcl/graph.hxx>
32 #include <sfx2/viewsh.hxx>
33 #include <svl/itemiter.hxx>
34 #include <svl/languageoptions.hxx>
35 #include <vcl/msgbox.hxx>
36 #include <unotools/configitem.hxx>
37 #include "svx/htmlmode.hxx"
38 
39 #define _SVX_PAGE_CXX
40 
41 #include <cuires.hrc>
42 #include "page.hrc"
43 #include "helpid.hrc"
44 #include "page.hxx"
45 #include <svx/pageitem.hxx>
46 #include <editeng/brshitem.hxx>
47 #include <editeng/boxitem.hxx>
48 #include <editeng/shaditem.hxx>
49 #include <editeng/pbinitem.hxx>
50 #include <editeng/lrspitem.hxx>
51 #include <editeng/ulspitem.hxx>
52 #include <editeng/sizeitem.hxx>
53 #include <editeng/frmdiritem.hxx>
54 #include "svx/dlgutil.hxx"
55 #include <dialmgr.hxx>
56 #include <editeng/paperinf.hxx>
57 #include <dialmgr.hxx>
58 #include <sfx2/module.hxx>
59 #include <svl/stritem.hxx>
60 #include <svx/dialogs.hrc>  // for RID_SVXPAGE_PAGE
61 #include <editeng/eerdll.hxx>
62 #include <editeng/editrids.hrc> // for RID_SVXSTR_PAPERBIN...,
63 #include <svx/svxids.hrc>
64 
65 // #i4219#
66 #include <svtools/optionsdrawinglayer.hxx>
67 #include <svl/slstitm.hxx> //CHINA001
68 #include <svl/aeitem.hxx> //CHINA001
69 #include <sfx2/request.hxx> //CHINA001
70 // configuration helper =======================================================
71 
72 /** Helper to get a configuration setting.
73     @descr  This is a HACK to get a configuration item directly. Normally the
74     OfaHtmlOptions class from 'offmgr' project would do the job, but we cannot
75     use it here. On the other hand, the OfaHtmlOptions cannot be moved to
76     'svtools', because it uses 'svx' itself...
77     The correct way would be to move OfaHtmlOptions to 'svtools' anyway, and to
78     remove the dependency from 'svx' (a call to the static function
79     SvxTextEncodingBox::GetBestMimeEncoding(), which contains low level
80     operations that can be moved to lower projects, i.e. 'rtl'). Then this
81     class can be removed, and the OfaHtmlOptions can be used instead. */
82 class SvxHtmlExportModeConfigItem_Impl : public utl::ConfigItem
83 {
84 public:
85     explicit                    SvxHtmlExportModeConfigItem_Impl();
86 
87     /** Returns the HTML export mode, as read from the configuration. */
88     inline sal_Int32            GetExportMode() const { return mnExpMode; }
89 
90     /** Returns true, if the current HTML export mode is set to HTML 3.2. */
91     inline bool                 IsExportModeHTML32() const { return mnExpMode == 0; } // 0 == HTML_CFG_HTML32, see offmgr/htmlcfg.hxx
92 
93     virtual void    Commit();
94 	virtual void Notify( const com::sun::star::uno::Sequence< rtl::OUString >& _rPropertyNames);
95 
96 private:
97     sal_Int32                   mnExpMode;
98 };
99 
100 SvxHtmlExportModeConfigItem_Impl::SvxHtmlExportModeConfigItem_Impl() :
101     utl::ConfigItem( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Office.Common/Filter/HTML/Export" ) ) ),
102     mnExpMode( 3 )  // default to 3 == HTML_CFG_NS40, see offmgr/htmlcfg.hxx
103 {
104     using com::sun::star::uno::Sequence;
105     using com::sun::star::uno::Any;
106 
107     Sequence< rtl::OUString > aPropNames( 1 );
108     aPropNames[ 0 ] = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Browser" ) );
109     Sequence< Any > aPropValues( GetProperties( aPropNames ) );
110     if( aPropValues.getLength() == 1 )
111         aPropValues[ 0 ] >>= mnExpMode;
112 }
113 
114 void SvxHtmlExportModeConfigItem_Impl::Commit()
115 {
116 }
117 
118 void SvxHtmlExportModeConfigItem_Impl::Notify( const com::sun::star::uno::Sequence< rtl::OUString >& )
119 {
120 }
121 
122 // static ----------------------------------------------------------------
123 
124 static const long MINBODY 		= 284;	// 0,5cm in twips aufgerundet
125 //static const long PRINT_OFFSET 	= 17;	// 0,03cm in twips abgerundet
126 static const long PRINT_OFFSET 	= 0;	// why was this ever set to 17 ? it led to wrong right and bottom margins.
127 
128 static sal_uInt16 pRanges[] =
129 {
130 	SID_ATTR_BORDER_OUTER,
131 	SID_ATTR_BORDER_SHADOW,
132 	SID_ATTR_LRSPACE,
133 	SID_ATTR_PAGE_SHARED,
134 	SID_SWREGISTER_COLLECTION,
135 	SID_SWREGISTER_MODE,
136 	0
137 };
138 
139 // ------- Mapping Seitenlayout ------------------------------------------
140 
141 sal_uInt16 aArr[] =
142 {
143 	SVX_PAGE_ALL,
144 	SVX_PAGE_MIRROR,
145 	SVX_PAGE_RIGHT,
146 	SVX_PAGE_LEFT
147 };
148 
149 // -----------------------------------------------------------------------
150 
151 sal_uInt16 PageUsageToPos_Impl( sal_uInt16 nUsage )
152 {
153 	const sal_uInt16 nCount = sizeof(aArr) / sizeof(sal_uInt16);
154 
155 	for ( sal_uInt16 i = 0; i < nCount; ++i )
156 		if ( aArr[i] == ( nUsage & 0x000f ) )
157 			return i;
158 	return SVX_PAGE_ALL;
159 }
160 
161 // -----------------------------------------------------------------------
162 
163 sal_uInt16 PosToPageUsage_Impl( sal_uInt16 nPos )
164 {
165 	const sal_uInt16 nCount = sizeof(aArr) / sizeof(sal_uInt16);
166 
167 	if ( nPos >= nCount )
168 		return 0;
169 	return aArr[nPos];
170 }
171 
172 // -----------------------------------------------------------------------
173 
174 Size GetMinBorderSpace_Impl( const SvxShadowItem& rShadow, const SvxBoxItem& rBox )
175 {
176 	Size aSz;
177 	aSz.Height() = rShadow.CalcShadowSpace( SHADOW_BOTTOM ) + rBox.CalcLineSpace( BOX_LINE_BOTTOM );
178 	aSz.Height() += rShadow.CalcShadowSpace( SHADOW_TOP ) + rBox.CalcLineSpace( BOX_LINE_TOP );
179 	aSz.Width() = rShadow.CalcShadowSpace( SHADOW_LEFT ) + rBox.CalcLineSpace( BOX_LINE_LEFT );
180 	aSz.Width() += rShadow.CalcShadowSpace( SHADOW_RIGHT ) + rBox.CalcLineSpace( BOX_LINE_RIGHT );
181 	return aSz;
182 }
183 
184 // -----------------------------------------------------------------------
185 
186 long ConvertLong_Impl( const long nIn, SfxMapUnit eUnit )
187 {
188 	return OutputDevice::LogicToLogic( nIn, (MapUnit)eUnit, MAP_TWIP );
189 }
190 
191 sal_Bool IsEqualSize_Impl( const SvxSizeItem* pSize, const Size& rSize )
192 {
193 	if ( pSize )
194 	{
195 		Size aSize = pSize->GetSize();
196 		long nDiffW = Abs( rSize.Width () - aSize.Width () );
197 		long nDiffH = Abs( rSize.Height() - aSize.Height() );
198 		return ( nDiffW < 10 && nDiffH < 10 );
199 	}
200 	else
201 		return sal_False;
202 }
203 
204 // -----------------------------------------------------------------------
205 
206 #define MARGIN_LEFT		( (MarginPosition)0x0001 )
207 #define MARGIN_RIGHT	( (MarginPosition)0x0002 )
208 #define MARGIN_TOP		( (MarginPosition)0x0004 )
209 #define MARGIN_BOTTOM	( (MarginPosition)0x0008 )
210 
211 struct SvxPage_Impl
212 {
213 	MarginPosition	m_nPos;
214     Printer*        mpDefPrinter;
215     bool            mbDelPrinter;
216 
217     SvxPage_Impl() :
218         m_nPos( 0 ),
219         mpDefPrinter( 0 ),
220         mbDelPrinter( false ) {}
221 
222     ~SvxPage_Impl() { if ( mbDelPrinter ) delete mpDefPrinter; }
223 };
224 
225 // class SvxPageDescPage --------------------------------------------------
226 
227 // gibt den Bereich der Which-Werte zur"uck
228 
229 sal_uInt16* SvxPageDescPage::GetRanges()
230 {
231 	return pRanges;
232 }
233 
234 // -----------------------------------------------------------------------
235 
236 SfxTabPage* SvxPageDescPage::Create( Window* pParent, const SfxItemSet& rSet )
237 {
238 	return new SvxPageDescPage( pParent, rSet );
239 }
240 
241 // -----------------------------------------------------------------------
242 
243 SvxPageDescPage::SvxPageDescPage( Window* pParent, const SfxItemSet& rAttr ) :
244 
245 	SfxTabPage( pParent, CUI_RES( RID_SVXPAGE_PAGE ), rAttr ),
246 
247     aPaperSizeFl        ( this, CUI_RES( FL_PAPER_SIZE ) ),
248     aPaperFormatText    ( this, CUI_RES( FT_PAPER_FORMAT ) ),
249     aPaperSizeBox       ( this, CUI_RES( LB_PAPER_SIZE ) ),
250     aPaperWidthText     ( this, CUI_RES( FT_PAPER_WIDTH ) ),
251     aPaperWidthEdit     ( this, CUI_RES( ED_PAPER_WIDTH ) ),
252     aPaperHeightText    ( this, CUI_RES( FT_PAPER_HEIGHT ) ),
253     aPaperHeightEdit    ( this, CUI_RES( ED_PAPER_HEIGHT ) ),
254     aOrientationFT      ( this, CUI_RES( FT_ORIENTATION ) ),
255 	aPortraitBtn        ( this, CUI_RES( RB_PORTRAIT ) ),
256     aLandscapeBtn       ( this, CUI_RES( RB_LANDSCAPE ) ),
257 	aBspWin             ( this, CUI_RES( WN_BSP ) ),
258     aTextFlowLbl        ( this, CUI_RES( FT_TEXT_FLOW ) ),
259     aTextFlowBox        ( this, CUI_RES( LB_TEXT_FLOW ) ),
260 	aPaperTrayLbl       ( this, CUI_RES( FT_PAPER_TRAY ) ),
261     aPaperTrayBox       ( this, CUI_RES( LB_PAPER_TRAY ) ),
262 	aMarginFl           ( this, CUI_RES( FL_MARGIN ) ),
263     aLeftMarginLbl      ( this, CUI_RES( FT_LEFT_MARGIN ) ),
264 	aLeftMarginEdit		( this, CUI_RES( ED_LEFT_MARGIN ) ),
265 	aRightMarginLbl		( this, CUI_RES( FT_RIGHT_MARGIN ) ),
266 	aRightMarginEdit	( this, CUI_RES( ED_RIGHT_MARGIN ) ),
267 	aTopMarginLbl		( this, CUI_RES( FT_TOP_MARGIN ) ),
268 	aTopMarginEdit		( this, CUI_RES( ED_TOP_MARGIN ) ),
269 	aBottomMarginLbl	( this, CUI_RES( FT_BOTTOM_MARGIN ) ),
270 	aBottomMarginEdit	( this, CUI_RES( ED_BOTTOM_MARGIN ) ),
271     aBottomSeparatorFl  ( this, CUI_RES( FL_BOTTOM_SEP ) ),
272     aLayoutFL           ( this, CUI_RES( FL_LAYOUT ) ),
273 	aPageText			( this, CUI_RES( FT_PAGELAYOUT ) ),
274     aLayoutBox          ( this, CUI_RES( LB_LAYOUT ) ),
275 	aNumberFormatText	( this, CUI_RES( FT_NUMBER_FORMAT ) ),
276 	aNumberFormatBox	( this, CUI_RES( LB_NUMBER_FORMAT ) ),
277     aTblAlignFT         ( this, CUI_RES( FT_TBL_ALIGN ) ),
278     aHorzBox            ( this, CUI_RES( CB_HORZ ) ),
279 	aVertBox			( this, CUI_RES( CB_VERT ) ),
280 	aAdaptBox			( this, CUI_RES( CB_ADAPT ) ),
281 	aRegisterCB         ( this, CUI_RES( CB_REGISTER ) ),
282 	aRegisterFT         ( this, CUI_RES( FT_REGISTER ) ),
283 	aRegisterLB       	( this, CUI_RES( LB_REGISTER ) ),
284 
285 	aInsideText			( 		CUI_RES( STR_INSIDE ) ),
286 	aOutsideText		( 		CUI_RES( STR_OUTSIDE ) ),
287 	aPrintRangeQueryText(		CUI_RES( STR_QUERY_PRINTRANGE ) ),
288 
289 	bLandscape			( sal_False ),
290 	eMode				( SVX_PAGE_MODE_STANDARD ),
291 	ePaperStart			( PAPER_A3 ),
292 	ePaperEnd 			( PAPER_ENV_DL ),
293 	pImpl				( new SvxPage_Impl )
294 
295 {
296 	bBorderModified = sal_False;
297 	FreeResource();
298     aBspWin.EnableRTL( sal_False );
299 
300 	// diese Page braucht ExchangeSupport
301 	SetExchangeSupport();
302 
303     SvtLanguageOptions aLangOptions;
304     sal_Bool bCJK = aLangOptions.IsAsianTypographyEnabled();
305     sal_Bool bCTL = aLangOptions.IsCTLFontEnabled();
306     sal_Bool bWeb = sal_False;
307     const SfxPoolItem* pItem;
308 
309     SfxObjectShell* pShell;
310     if(SFX_ITEM_SET == rAttr.GetItemState(SID_HTML_MODE, sal_False, &pItem) ||
311 		( 0 != (pShell = SfxObjectShell::Current()) &&
312 					0 != (pItem = pShell->GetItem(SID_HTML_MODE))))
313         bWeb = 0 != (((const SfxUInt16Item*)pItem)->GetValue() & HTMLMODE_ON);
314 
315     // #109989# get the HTML export setting from configuration.
316     // !! This is a hack, see comments in SvxHtmlExportModeConfigItem_Impl class above.
317     bool bHTML32 = SvxHtmlExportModeConfigItem_Impl().IsExportModeHTML32();
318 
319     //  fill text flow listbox with valid entries
320     aTextFlowBox.InsertEntryValue( CUI_RESSTR( RID_SVXSTR_PAGEDIR_LTR_HORI ), FRMDIR_HORI_LEFT_TOP );
321     if( bCTL )
322         aTextFlowBox.InsertEntryValue( CUI_RESSTR( RID_SVXSTR_PAGEDIR_RTL_HORI ), FRMDIR_HORI_RIGHT_TOP );
323     // #109989# do not show vertical directions in Writer/Web
324     if( !bWeb )
325     {
326         if( bCJK )
327         {
328             aTextFlowBox.InsertEntryValue( CUI_RESSTR( RID_SVXSTR_PAGEDIR_RTL_VERT ), FRMDIR_VERT_TOP_RIGHT );
329 //            aTextFlowBox.InsertEntryValue( CUI_RESSTR( RID_SVXSTR_PAGEDIR_LTR_VERT ), FRMDIR_VERT_TOP_LEFT );
330         }
331     }
332 
333     // #109989# show the text direction box in Writer/Web too, but only, if HTML export mode is not HTML3.2.
334     if( !(bWeb && bHTML32) && (bCJK || bCTL) &&
335         SFX_ITEM_UNKNOWN < rAttr.GetItemState(GetWhich( SID_ATTR_FRAMEDIRECTION )))
336     {
337         aTextFlowLbl.Show();
338         aTextFlowBox.Show();
339         aTextFlowBox.SetSelectHdl(LINK(this, SvxPageDescPage, FrameDirectionModify_Impl ));
340 
341         aBspWin.EnableFrameDirection(sal_True);
342     }
343     Init_Impl();
344 
345 	FieldUnit eFUnit = GetModuleFieldUnit( rAttr );
346 	SetFieldUnit( aLeftMarginEdit, eFUnit );
347 	SetFieldUnit( aRightMarginEdit, eFUnit );
348 	SetFieldUnit( aTopMarginEdit, eFUnit );
349 	SetFieldUnit( aBottomMarginEdit, eFUnit );
350 	SetFieldUnit( aPaperWidthEdit, eFUnit );
351 	SetFieldUnit( aPaperHeightEdit, eFUnit );
352 
353     if ( SfxViewShell::Current() && SfxViewShell::Current()->GetPrinter() )
354         pImpl->mpDefPrinter = (Printer*)SfxViewShell::Current()->GetPrinter();
355 	else
356 	{
357         pImpl->mpDefPrinter = new Printer;
358         pImpl->mbDelPrinter = true;
359 	}
360 
361     MapMode aOldMode = pImpl->mpDefPrinter->GetMapMode();
362     pImpl->mpDefPrinter->SetMapMode( MAP_TWIP );
363 
364 	// First- und Last-Werte f"ur die R"ander setzen
365     Size aPaperSize = pImpl->mpDefPrinter->GetPaperSize();
366     Size aPrintSize = pImpl->mpDefPrinter->GetOutputSize();
367 	/*
368 	 * einen Punkt ( 0,0 ) in logische Koordinaten zu konvertieren,
369 	 * sieht aus wie Unsinn; ist aber sinnvoll, wenn der Ursprung des
370 	 * Koordinatensystems verschoben ist.
371 	 */
372     Point aPrintOffset = pImpl->mpDefPrinter->GetPageOffset() -
373                          pImpl->mpDefPrinter->PixelToLogic( Point() );
374     pImpl->mpDefPrinter->SetMapMode( aOldMode );
375 
376     long nOffset = !aPrintOffset.X() && !aPrintOffset.Y() ? 0 : PRINT_OFFSET;
377 	aLeftMarginEdit.SetFirst( aLeftMarginEdit.Normalize( aPrintOffset.X() ), FUNIT_TWIP );
378 	nFirstLeftMargin = static_cast<long>(aLeftMarginEdit.GetFirst());
379 	aRightMarginEdit.SetFirst( aRightMarginEdit.Normalize(
380 		aPaperSize.Width() - aPrintSize.Width() - aPrintOffset.X() + nOffset ), FUNIT_TWIP);
381 	nFirstRightMargin = static_cast<long>(aRightMarginEdit.GetFirst());
382 	aTopMarginEdit.SetFirst( aTopMarginEdit.Normalize( aPrintOffset.Y() ), FUNIT_TWIP );
383 	nFirstTopMargin = static_cast<long>(aTopMarginEdit.GetFirst());
384 	aBottomMarginEdit.SetFirst( aBottomMarginEdit.Normalize(
385 		aPaperSize.Height() - aPrintSize.Height() - aPrintOffset.Y() + nOffset ), FUNIT_TWIP );
386 	nFirstBottomMargin = static_cast<long>(aBottomMarginEdit.GetFirst());
387 	aLeftMarginEdit.SetLast( aLeftMarginEdit.Normalize(
388 		aPrintOffset.X() + aPrintSize.Width() ), FUNIT_TWIP );
389 	nLastLeftMargin = static_cast<long>(aLeftMarginEdit.GetLast());
390 	aRightMarginEdit.SetLast( aRightMarginEdit.Normalize(
391 		aPrintOffset.X() + aPrintSize.Width() ), FUNIT_TWIP );
392 	nLastRightMargin = static_cast<long>(aRightMarginEdit.GetLast());
393 	aTopMarginEdit.SetLast( aTopMarginEdit.Normalize(
394 		aPrintOffset.Y() + aPrintSize.Height() ), FUNIT_TWIP );
395 	nLastTopMargin = static_cast<long>(aTopMarginEdit.GetLast());
396 	aBottomMarginEdit.SetLast( aBottomMarginEdit.Normalize(
397 		aPrintOffset.Y() + aPrintSize.Height() ), FUNIT_TWIP );
398 	nLastBottomMargin = static_cast<long>(aBottomMarginEdit.GetLast());
399 
400 	// #i4219# get DrawingLayer options
401     const SvtOptionsDrawinglayer aDrawinglayerOpt;
402 
403 	// #i4219# take Maximum now from configuration (1/100th cm)
404 	// was: 11900 -> 119 cm ;new value 3 meters -> 300 cm -> 30000
405 	aPaperWidthEdit.SetMax(aPaperWidthEdit.Normalize(aDrawinglayerOpt.GetMaximumPaperWidth()), FUNIT_CM);
406 	aPaperWidthEdit.SetLast(aPaperWidthEdit.Normalize(aDrawinglayerOpt.GetMaximumPaperWidth()), FUNIT_CM);
407 	aPaperHeightEdit.SetMax(aPaperHeightEdit.Normalize(aDrawinglayerOpt.GetMaximumPaperHeight()), FUNIT_CM);
408 	aPaperHeightEdit.SetLast(aPaperHeightEdit.Normalize(aDrawinglayerOpt.GetMaximumPaperHeight()), FUNIT_CM);
409 
410 	// #i4219# also for margins (1/100th cm). Was: 9999, keeping.
411 	aLeftMarginEdit.SetMax(aDrawinglayerOpt.GetMaximumPaperLeftMargin());
412 	aLeftMarginEdit.SetLast(aDrawinglayerOpt.GetMaximumPaperLeftMargin());
413 	aRightMarginEdit.SetMax(aDrawinglayerOpt.GetMaximumPaperRightMargin());
414 	aRightMarginEdit.SetLast(aDrawinglayerOpt.GetMaximumPaperRightMargin());
415 	aTopMarginEdit.SetMax(aDrawinglayerOpt.GetMaximumPaperTopMargin());
416 	aTopMarginEdit.SetLast(aDrawinglayerOpt.GetMaximumPaperTopMargin());
417 	aBottomMarginEdit.SetMax(aDrawinglayerOpt.GetMaximumPaperBottomMargin());
418 	aBottomMarginEdit.SetLast(aDrawinglayerOpt.GetMaximumPaperBottomMargin());
419 
420 	aPortraitBtn.SetAccessibleRelationMemberOf(&aOrientationFT);
421 	aLandscapeBtn.SetAccessibleRelationMemberOf(&aOrientationFT);
422 }
423 
424 // -----------------------------------------------------------------------
425 
426 SvxPageDescPage::~SvxPageDescPage()
427 {
428 	delete pImpl;
429 }
430 
431 // -----------------------------------------------------------------------
432 
433 void SvxPageDescPage::Init_Impl()
434 {
435 	aLeftText = aLeftMarginLbl.GetText();
436 	aRightText = aRightMarginLbl.GetText();
437 
438 		// Handler einstellen
439 	aLayoutBox.SetSelectHdl( LINK( this, SvxPageDescPage, LayoutHdl_Impl ) );
440     aPaperSizeBox.SetDropDownLineCount(10);
441 
442 	aPaperTrayBox.SetGetFocusHdl(
443 		LINK( this, SvxPageDescPage, PaperBinHdl_Impl ) );
444 	aPaperSizeBox.SetSelectHdl(
445 		LINK( this, SvxPageDescPage, PaperSizeSelect_Impl ) );
446 	aPaperWidthEdit.SetModifyHdl(
447 		LINK( this, SvxPageDescPage, PaperSizeModify_Impl ) );
448 	aPaperHeightEdit.SetModifyHdl(
449 		LINK( this, SvxPageDescPage, PaperSizeModify_Impl ) );
450 	aLandscapeBtn.SetClickHdl(
451 		LINK( this, SvxPageDescPage, SwapOrientation_Impl ) );
452 	aPortraitBtn.SetClickHdl(
453 		LINK( this, SvxPageDescPage, SwapOrientation_Impl ) );
454 
455 	Link aLink = LINK( this, SvxPageDescPage, BorderModify_Impl );
456 	aLeftMarginEdit.SetModifyHdl( aLink );
457 	aRightMarginEdit.SetModifyHdl( aLink );
458 	aTopMarginEdit.SetModifyHdl( aLink );
459 	aBottomMarginEdit.SetModifyHdl( aLink );
460 
461 	aLink = LINK( this, SvxPageDescPage, RangeHdl_Impl );
462 	aPaperWidthEdit.SetLoseFocusHdl( aLink );
463 	aPaperHeightEdit.SetLoseFocusHdl( aLink );
464 	aLeftMarginEdit.SetLoseFocusHdl( aLink );
465 	aRightMarginEdit.SetLoseFocusHdl( aLink );
466 	aTopMarginEdit.SetLoseFocusHdl( aLink );
467 	aBottomMarginEdit.SetLoseFocusHdl( aLink );
468 
469 	aHorzBox.SetClickHdl( LINK( this, SvxPageDescPage, CenterHdl_Impl ) );
470 	aVertBox.SetClickHdl( LINK( this, SvxPageDescPage, CenterHdl_Impl ) );
471 
472 }
473 
474 // -----------------------------------------------------------------------
475 
476 void SvxPageDescPage::Reset( const SfxItemSet& rSet )
477 {
478 	SfxItemPool* pPool = rSet.GetPool();
479 	DBG_ASSERT( pPool, "Wo ist der Pool" );
480 	SfxMapUnit eUnit = pPool->GetMetric( GetWhich( SID_ATTR_LRSPACE ) );
481 
482 	// R"ander (Links/Rechts) einstellen
483 	const SfxPoolItem* pItem = GetItem( rSet, SID_ATTR_LRSPACE );
484 
485 	if ( pItem )
486 	{
487 		const SvxLRSpaceItem& rLRSpace = (const SvxLRSpaceItem&)*pItem;
488 		SetMetricValue( aLeftMarginEdit, rLRSpace.GetLeft(), eUnit );
489 		aBspWin.SetLeft(
490 			(sal_uInt16)ConvertLong_Impl( (long)rLRSpace.GetLeft(), eUnit ) );
491 		SetMetricValue( aRightMarginEdit, rLRSpace.GetRight(), eUnit );
492 		aBspWin.SetRight(
493 			(sal_uInt16)ConvertLong_Impl( (long)rLRSpace.GetRight(), eUnit ) );
494 	}
495 
496 	// R"ander (Oben/Unten) einstellen
497 	pItem = GetItem( rSet, SID_ATTR_ULSPACE );
498 
499 	if ( pItem )
500 	{
501 		const SvxULSpaceItem& rULSpace = (const SvxULSpaceItem&)*pItem;
502 		SetMetricValue( aTopMarginEdit, rULSpace.GetUpper(), eUnit );
503 		aBspWin.SetTop(
504 			(sal_uInt16)ConvertLong_Impl( (long)rULSpace.GetUpper(), eUnit ) );
505 		SetMetricValue( aBottomMarginEdit, rULSpace.GetLower(), eUnit );
506 		aBspWin.SetBottom(
507 			(sal_uInt16)ConvertLong_Impl( (long)rULSpace.GetLower(), eUnit ) );
508 	}
509 
510     // allgemeine Seitendaten
511 	SvxNumType eNumType = SVX_ARABIC;
512     bLandscape = ( pImpl->mpDefPrinter->GetOrientation() == ORIENTATION_LANDSCAPE );
513 	sal_uInt16 nUse = (sal_uInt16)SVX_PAGE_ALL;
514 	pItem = GetItem( rSet, SID_ATTR_PAGE );
515 
516 	if ( pItem )
517 	{
518 		const SvxPageItem& rItem = (const SvxPageItem&)*pItem;
519 		eNumType = rItem.GetNumType();
520 		nUse = rItem.GetPageUsage();
521 		bLandscape = rItem.IsLandscape();
522 	}
523 
524 	// Ausrichtung
525 	aLayoutBox.SelectEntryPos( ::PageUsageToPos_Impl( nUse ) );
526 	aBspWin.SetUsage( nUse );
527 	LayoutHdl_Impl( 0 );
528 
529 	// Numerierungsart der Seitenvorlage einstellen
530 	aNumberFormatBox.SelectEntryPos( sal::static_int_cast< sal_uInt16 >(eNumType) );
531 
532 	// Aktueller Papierschacht
533 	aPaperTrayBox.Clear();
534 	sal_uInt8 nPaperBin = PAPERBIN_PRINTER_SETTINGS;
535 	pItem = GetItem( rSet, SID_ATTR_PAGE_PAPERBIN );
536 
537 	if ( pItem )
538 	{
539 		nPaperBin = ( (const SvxPaperBinItem*)pItem )->GetValue();
540 
541         if ( nPaperBin >= pImpl->mpDefPrinter->GetPaperBinCount() )
542 			nPaperBin = PAPERBIN_PRINTER_SETTINGS;
543 	}
544 
545 	String aBinName;
546 
547 	if ( PAPERBIN_PRINTER_SETTINGS	== nPaperBin )
548 		aBinName = EE_RESSTR( RID_SVXSTR_PAPERBIN_SETTINGS );
549 	else
550         aBinName = pImpl->mpDefPrinter->GetPaperBinName( (sal_uInt16)nPaperBin );
551 
552 	sal_uInt16 nEntryPos = aPaperTrayBox.InsertEntry( aBinName );
553 	aPaperTrayBox.SetEntryData( nEntryPos, (void*)(sal_uLong)nPaperBin );
554 	aPaperTrayBox.SelectEntry( aBinName );
555 
556 	// Size rausholen
557     Size aPaperSize = SvxPaperInfo::GetPaperSize( pImpl->mpDefPrinter );
558 	pItem = GetItem( rSet, SID_ATTR_PAGE_SIZE );
559 
560 	if ( pItem )
561 		aPaperSize = ( (const SvxSizeItem*)pItem )->GetSize();
562 
563 	FASTBOOL bOrientationSupport =
564         pImpl->mpDefPrinter->HasSupport( SUPPORT_SET_ORIENTATION );
565 #ifdef OS2
566 	// unter OS/2 wird bei HasSupport() immer sal_True returned
567 	// aber nur als Dummy, deshalb FALSE
568 	bOrientationSupport = sal_False;
569 #endif
570 
571 	if ( !bOrientationSupport &&
572 		 aPaperSize.Width() > aPaperSize.Height() )
573 		bLandscape = sal_True;
574 
575 	aLandscapeBtn.Check( bLandscape );
576 	aPortraitBtn.Check( !bLandscape );
577 
578 	aBspWin.SetSize( Size( ConvertLong_Impl( aPaperSize.Width(), eUnit ),
579 						   ConvertLong_Impl( aPaperSize.Height(), eUnit ) ) );
580 
581 	aPaperSize = OutputDevice::LogicToLogic(aPaperSize, (MapUnit)eUnit, MAP_100TH_MM);
582 	if ( bLandscape )
583 		Swap( aPaperSize );
584 
585 	// Actual Paper Format
586 	Paper ePaper = SvxPaperInfo::GetSvxPaper( aPaperSize, MAP_100TH_MM, sal_True );
587 
588 	if ( PAPER_USER != ePaper )
589 		aPaperSize = SvxPaperInfo::GetPaperSize( ePaper, MAP_100TH_MM );
590 
591 	if ( bLandscape )
592 		Swap( aPaperSize );
593 
594 	// Werte in die Edits eintragen
595 	SetMetricValue( aPaperHeightEdit, aPaperSize.Height(), SFX_MAPUNIT_100TH_MM );
596 	SetMetricValue( aPaperWidthEdit, aPaperSize.Width(), SFX_MAPUNIT_100TH_MM );
597 	aPaperSizeBox.Clear();
598 
599 	sal_uInt16 nActPos = LISTBOX_ENTRY_NOTFOUND;
600 	sal_uInt16 nAryId = RID_SVXSTRARY_PAPERSIZE_STD;
601 
602 	if ( ePaperStart != PAPER_A3 )
603 		nAryId = RID_SVXSTRARY_PAPERSIZE_DRAW;
604 	ResStringArray aPaperAry( CUI_RES( nAryId ) );
605 	sal_uInt32 nCnt = aPaperAry.Count();
606 
607     sal_uInt16 nUserPos = LISTBOX_ENTRY_NOTFOUND;
608 	for ( sal_uInt32 i = 0; i < nCnt; ++i )
609 	{
610 		String aStr = aPaperAry.GetString(i);
611 		Paper eSize = (Paper)aPaperAry.GetValue(i);
612 		sal_uInt16 nPos = aPaperSizeBox.InsertEntry( aStr );
613 		aPaperSizeBox.SetEntryData( nPos, (void*)(sal_uLong)eSize );
614 
615 		if ( eSize == ePaper )
616 			nActPos = nPos;
617         if( eSize == PAPER_USER )
618             nUserPos = nPos;
619 	}
620 	// preselect current paper format - #115915#: ePaper might not be in aPaperSizeBox so use PAPER_USER instead
621     aPaperSizeBox.SelectEntryPos( nActPos != LISTBOX_ENTRY_NOTFOUND ? nActPos : nUserPos );
622 
623     // Applikationsspezifisch
624 
625 	switch ( eMode )
626 	{
627 		case SVX_PAGE_MODE_CENTER:
628 		{
629             aTblAlignFT.Show();
630             aHorzBox.Show();
631 			aVertBox.Show();
632             DisableVerticalPageDir();
633 
634 			// Horizontale Ausrichtung
635 			pItem = GetItem( rSet, SID_ATTR_PAGE_EXT1 );
636 			aHorzBox.Check( pItem ? ( (const SfxBoolItem*)pItem )->GetValue()
637 								  : sal_False );
638 
639 			// Vertikale Ausrichtung
640 			pItem = GetItem( rSet, SID_ATTR_PAGE_EXT2 );
641 			aVertBox.Check( pItem ? ( (const SfxBoolItem*)pItem )->GetValue()
642 								  : sal_False );
643 
644 			// Beispiel-Fenster auf Tabelle setzen
645 			aBspWin.SetTable( sal_True );
646 			aBspWin.SetHorz( aHorzBox.IsChecked() );
647 			aBspWin.SetVert( aVertBox.IsChecked() );
648 
649 			break;
650 		}
651 
652 		case SVX_PAGE_MODE_PRESENTATION:
653 		{
654             DisableVerticalPageDir();
655 			aAdaptBox.Show();
656 			pItem = GetItem( rSet, SID_ATTR_PAGE_EXT1 );
657 			aAdaptBox.Check( pItem ?
658 				( (const SfxBoolItem*)pItem )->GetValue() : sal_False );
659 
660 			//!!! hidden, weil von StarDraw nicht implementiert
661 			aLayoutBox.Hide();
662 			aPageText.Hide();
663 
664 			break;
665 		}
666         default: ;//prevent warning
667 	}
668 
669 
670 	// im Beispiel Hintergrund und Umrandung anzeigen
671 	ResetBackground_Impl( rSet );
672 //!	UpdateExample_Impl();
673 	RangeHdl_Impl( 0 );
674 
675 	// Header Footer anzeigen
676 	InitHeadFoot_Impl( rSet );
677 
678 	// R"ander auf Hoch/Quer updaten, dann Beispiel updaten
679 	bBorderModified = sal_False;
680 	SwapFirstValues_Impl( sal_False );
681 	UpdateExample_Impl();
682 
683 	// Alte Werte sichern
684 	aLeftMarginEdit.SaveValue();
685 	aRightMarginEdit.SaveValue();
686 	aTopMarginEdit.SaveValue();
687 	aBottomMarginEdit.SaveValue();
688 	aLayoutBox.SaveValue();
689 	aNumberFormatBox.SaveValue();
690 	aPaperSizeBox.SaveValue();
691 	aPaperWidthEdit.SaveValue();
692 	aPaperHeightEdit.SaveValue();
693 	aPortraitBtn.SaveValue();
694 	aLandscapeBtn.SaveValue();
695 	aPaperTrayBox.SaveValue();
696 	aVertBox.SaveValue();
697 	aHorzBox.SaveValue();
698     aAdaptBox.SaveValue();
699 
700 	CheckMarginEdits( true );
701 
702 	// Registerhaltigkeit
703 	if(SFX_ITEM_SET == rSet.GetItemState(SID_SWREGISTER_MODE))
704 	{
705 		aRegisterCB.Check(((const SfxBoolItem&)rSet.Get(
706 								SID_SWREGISTER_MODE)).GetValue());
707 		aRegisterCB.SaveValue();
708 		RegisterModify(&aRegisterCB);
709 	}
710 	if(SFX_ITEM_SET == rSet.GetItemState(SID_SWREGISTER_COLLECTION))
711 	{
712 		aRegisterLB.SelectEntry(
713 				((const SfxStringItem&)rSet.Get(SID_SWREGISTER_COLLECTION)).GetValue());
714 		aRegisterLB.SaveValue();
715 	}
716 
717 	SfxItemState eState = rSet.GetItemState( GetWhich( SID_ATTR_FRAMEDIRECTION ),
718 												sal_True, &pItem );
719 	if( SFX_ITEM_UNKNOWN != eState )
720 	{
721         sal_uInt32 nVal  = SFX_ITEM_SET == eState
722 								? ((SvxFrameDirectionItem*)pItem)->GetValue()
723                                 : 0;
724         aTextFlowBox.SelectEntryValue( static_cast< SvxFrameDirection >( nVal ) );
725 		aTextFlowBox.SaveValue();
726         aBspWin.SetFrameDirection(nVal);
727 	}
728 }
729 
730 // -----------------------------------------------------------------------
731 
732 void SvxPageDescPage::FillUserData()
733 {
734 	if ( SVX_PAGE_MODE_PRESENTATION == eMode )
735 		SetUserData( UniString::CreateFromInt32( (sal_Int32)aAdaptBox.IsChecked() ) );
736 }
737 
738 // -----------------------------------------------------------------------
739 
740 sal_Bool SvxPageDescPage::FillItemSet( SfxItemSet& rSet )
741 {
742 	sal_Bool bModified = sal_False;
743 	const SfxItemSet& rOldSet = GetItemSet();
744 	SfxItemPool* pPool = rOldSet.GetPool();
745 	DBG_ASSERT( pPool, "Wo ist der Pool" );
746 	sal_uInt16 nWhich = GetWhich( SID_ATTR_LRSPACE );
747 	SfxMapUnit eUnit = pPool->GetMetric( nWhich );
748 	const SfxPoolItem* pOld = 0;
749 
750 	// alten linken und rechten Rand kopieren
751 	SvxLRSpaceItem aMargin( (const SvxLRSpaceItem&)rOldSet.Get( nWhich ) );
752 
753 	// alten  oberen und unteren Rand kopieren
754 	nWhich = GetWhich( SID_ATTR_ULSPACE );
755 	SvxULSpaceItem aTopMargin( (const SvxULSpaceItem&)rOldSet.Get( nWhich ) );
756 
757 	if ( aLeftMarginEdit.GetText() != aLeftMarginEdit.GetSavedValue() )
758 	{
759 		aMargin.SetLeft( (sal_uInt16)GetCoreValue( aLeftMarginEdit, eUnit ) );
760 		bModified |= sal_True;
761 	}
762 
763 	if ( aRightMarginEdit.GetText() != aRightMarginEdit.GetSavedValue() )
764 	{
765 		aMargin.SetRight( (sal_uInt16)GetCoreValue( aRightMarginEdit, eUnit ) );
766 		bModified |= sal_True;
767 	}
768 
769 	// Linken und rechten Rand setzen
770 	if ( bModified )
771 	{
772 		pOld = GetOldItem( rSet, SID_ATTR_LRSPACE );
773 
774 		if ( !pOld || !( *(const SvxLRSpaceItem*)pOld == aMargin ) )
775 			rSet.Put( aMargin );
776 		else
777 			bModified = sal_False;
778 	}
779 
780 	sal_Bool bMod = sal_False;
781 
782 	if ( aTopMarginEdit.GetText() != aTopMarginEdit.GetSavedValue() )
783 	{
784 		aTopMargin.SetUpper( (sal_uInt16)GetCoreValue( aTopMarginEdit, eUnit ) );
785 		bMod |= sal_True;
786 	}
787 
788 	if ( aBottomMarginEdit.GetText() != aBottomMarginEdit.GetSavedValue() )
789 	{
790 		aTopMargin.SetLower( (sal_uInt16)GetCoreValue( aBottomMarginEdit, eUnit ) );
791 		bMod |= sal_True;
792 	}
793 
794 	// unteren oberen Rand setzen
795 	//
796 	if ( bMod )
797 	{
798 		pOld = GetOldItem( rSet, SID_ATTR_ULSPACE );
799 
800 		if ( !pOld || !( *(const SvxULSpaceItem*)pOld == aTopMargin ) )
801 		{
802 			bModified |= sal_True;
803 			rSet.Put( aTopMargin );
804 		}
805 	}
806 
807 	// Druckerschacht
808 	nWhich = GetWhich( SID_ATTR_PAGE_PAPERBIN );
809 	sal_uInt16 nPos = aPaperTrayBox.GetSelectEntryPos();
810 	sal_uInt16 nBin = (sal_uInt16)(sal_uLong)aPaperTrayBox.GetEntryData( nPos );
811 	pOld = GetOldItem( rSet, SID_ATTR_PAGE_PAPERBIN );
812 
813 	if ( !pOld || ( (const SvxPaperBinItem*)pOld )->GetValue() != nBin )
814 	{
815 		rSet.Put( SvxPaperBinItem( nWhich, (sal_uInt8)nBin ) );
816 		bModified |= sal_True;
817 	}
818 
819 	nPos = aPaperSizeBox.GetSelectEntryPos();
820 	Paper ePaper = (Paper)(sal_uLong)aPaperSizeBox.GetEntryData( nPos );
821 	const sal_uInt16 nOld = aPaperSizeBox.GetSavedValue();
822 	sal_Bool bChecked = aLandscapeBtn.IsChecked();
823 
824 	if ( PAPER_USER == ePaper )
825 	{
826 		if ( nOld != nPos						||
827 			 aPaperWidthEdit.IsValueModified()  ||
828 			 aPaperHeightEdit.IsValueModified() ||
829 			 bChecked != aLandscapeBtn.GetSavedValue() )
830 		{
831 			Size aSize( GetCoreValue( aPaperWidthEdit, eUnit ),
832 						GetCoreValue( aPaperHeightEdit, eUnit ) );
833 			pOld = GetOldItem( rSet, SID_ATTR_PAGE_SIZE );
834 
835 			if ( !pOld || ( (const SvxSizeItem*)pOld )->GetSize() != aSize )
836 			{
837 				rSet.Put( SvxSizeItem( GetWhich(SID_ATTR_PAGE_SIZE), aSize ) );
838 				bModified |= sal_True;
839 			}
840 		}
841 	}
842 	else
843 	{
844 		if ( nOld != nPos || bChecked != aLandscapeBtn.GetSavedValue() )
845 		{
846 			Size aSize( SvxPaperInfo::GetPaperSize( ePaper, (MapUnit)eUnit ) );
847 
848 			if ( bChecked )
849 				Swap( aSize );
850 
851 			pOld = GetOldItem( rSet, SID_ATTR_PAGE_SIZE );
852 
853 			if ( !pOld || ( (const SvxSizeItem*)pOld )->GetSize() != aSize )
854 			{
855 				rSet.Put( SvxSizeItem( GetWhich(SID_ATTR_PAGE_SIZE), aSize ) );
856 				bModified |= sal_True;
857 			}
858 		}
859 	}
860 
861 	// sonstiges Zeug der Page
862 	nWhich = GetWhich( SID_ATTR_PAGE );
863 	SvxPageItem aPage( (const SvxPageItem&)rOldSet.Get( nWhich ) );
864 	bMod = 	aLayoutBox.GetSelectEntryPos()  != aLayoutBox.GetSavedValue();
865 
866 	if ( bMod )
867 		aPage.SetPageUsage(
868 			::PosToPageUsage_Impl( aLayoutBox.GetSelectEntryPos() ) );
869 
870 	if ( bChecked != aLandscapeBtn.GetSavedValue() )
871 	{
872 		aPage.SetLandscape(bChecked);
873 		bMod |= sal_True;
874 	}
875 
876 	// Einstellen der Numerierungsart der Seite
877 	nPos = aNumberFormatBox.GetSelectEntryPos();
878 
879 	if ( nPos != aNumberFormatBox.GetSavedValue() )
880 	{
881 		aPage.SetNumType( (SvxNumType)nPos );
882 		bMod |= sal_True;
883 	}
884 
885 	if ( bMod )
886 	{
887 		pOld = GetOldItem( rSet, SID_ATTR_PAGE );
888 
889 		if ( !pOld || !( *(const SvxPageItem*)pOld == aPage ) )
890 		{
891 			rSet.Put( aPage );
892 			bModified |= sal_True;
893 		}
894 	}
895 	else if ( SFX_ITEM_DEFAULT == rOldSet.GetItemState( nWhich ) )
896 		rSet.ClearItem( nWhich );
897 	else
898 		rSet.Put( rOldSet.Get( nWhich ) );
899 
900 	// Modispezifische Controls auswerten
901 
902 	switch ( eMode )
903 	{
904 		case SVX_PAGE_MODE_CENTER:
905 		{
906 			if ( aHorzBox.IsChecked() != aHorzBox.GetSavedValue() )
907 			{
908 				SfxBoolItem aHorz( GetWhich( SID_ATTR_PAGE_EXT1 ),
909 								   aHorzBox.IsChecked() );
910 				rSet.Put( aHorz );
911 				bModified |= sal_True;
912 			}
913 
914 			if ( aVertBox.IsChecked() != aVertBox.GetSavedValue() )
915 			{
916 				SfxBoolItem aVert( GetWhich( SID_ATTR_PAGE_EXT2 ),
917 								   aVertBox.IsChecked() );
918 				rSet.Put( aVert );
919 				bModified |= sal_True;
920 			}
921 			break;
922 		}
923 
924 		case SVX_PAGE_MODE_PRESENTATION:
925 		{
926 			// immer putten, damit Draw das auswerten kann
927 			rSet.Put( SfxBoolItem( GetWhich( SID_ATTR_PAGE_EXT1 ),
928 					  aAdaptBox.IsChecked() ) );
929 			bModified |= sal_True;
930 			break;
931 		}
932         default: ;//prevent warning
933 
934 	}
935 
936 	if(aRegisterCB.IsVisible() &&
937 		(aRegisterCB.IsChecked() || aRegisterCB.GetSavedValue() != aRegisterCB.IsChecked()))
938 	{
939 		const SfxBoolItem& rRegItem = (const SfxBoolItem&)rOldSet.Get(SID_SWREGISTER_MODE);
940 		SfxBoolItem* pRegItem = (SfxBoolItem*)rRegItem.Clone();
941 		sal_Bool bCheck = aRegisterCB.IsChecked();
942 		pRegItem->SetValue(bCheck);
943 		rSet.Put(*pRegItem);
944 		bModified |= sal_True;
945 		if(bCheck)
946 		{
947 			bModified |= sal_True;
948 			rSet.Put(SfxStringItem(SID_SWREGISTER_COLLECTION,
949 							aRegisterLB.GetSelectEntry()));
950 		}
951 		delete pRegItem;
952 	}
953 
954     SvxFrameDirection eDirection = aTextFlowBox.GetSelectEntryValue();
955     if( aTextFlowBox.IsVisible() && (eDirection != aTextFlowBox.GetSavedValue()) )
956 	{
957         rSet.Put( SvxFrameDirectionItem( eDirection, GetWhich( SID_ATTR_FRAMEDIRECTION ) ) );
958 		bModified = sal_True;
959 	}
960 
961 	return bModified;
962 }
963 
964 // -----------------------------------------------------------------------
965 
966 IMPL_LINK( SvxPageDescPage, LayoutHdl_Impl, ListBox *, EMPTYARG )
967 {
968 	// innen au\sen umschalten
969 	const sal_uInt16 nPos = PosToPageUsage_Impl( aLayoutBox.GetSelectEntryPos() );
970 
971 	if ( nPos == SVX_PAGE_MIRROR )
972 	{
973 		if ( aLeftMarginLbl.GetText() != aInsideText )
974 			aLeftMarginLbl.SetText( aInsideText );
975 
976 		if ( aRightMarginLbl.GetText() != aOutsideText )
977 			aRightMarginLbl.SetText( aOutsideText );
978 	}
979 	else
980 	{
981 		if ( aLeftMarginLbl.GetText() != aLeftText )
982 			aLeftMarginLbl.SetText( aLeftText );
983 
984 		if ( aRightMarginLbl.GetText() != aRightText )
985 			aRightMarginLbl.SetText( aRightText );
986 	}
987     UpdateExample_Impl( true );
988 	return 0;
989 }
990 
991 // -----------------------------------------------------------------------
992 
993 IMPL_LINK( SvxPageDescPage, PaperBinHdl_Impl, ListBox *, EMPTYARG )
994 {
995 	if ( aPaperTrayBox.GetEntryCount() > 1 )
996 		// schon gef"ullt
997 		return 0;
998 
999 	// Schacht-Box initialisieren
1000 	String aOldName = aPaperTrayBox.GetSelectEntry();
1001 	aPaperTrayBox.SetUpdateMode( sal_False );
1002 	aPaperTrayBox.Clear();
1003 	sal_uInt16 nEntryPos = aPaperTrayBox.InsertEntry(
1004 		EE_RESSTR( RID_SVXSTR_PAPERBIN_SETTINGS ) );
1005 	aPaperTrayBox.SetEntryData( nEntryPos,
1006 		(void*)(sal_uLong)PAPERBIN_PRINTER_SETTINGS );
1007 	String aPaperBin( EditResId( RID_SVXSTR_PAPERBIN ) );
1008     sal_uInt16 nBinCount = pImpl->mpDefPrinter->GetPaperBinCount();
1009 
1010 	for ( sal_uInt16 i = 0; i < nBinCount; ++i )
1011 	{
1012         String aName = pImpl->mpDefPrinter->GetPaperBinName(i);
1013 
1014 		if ( !aName.Len() )
1015 		{
1016 			aName = aPaperBin;
1017 			aName.Append( sal_Unicode(' ') );
1018 			aName.Append( UniString::CreateFromInt32( i+1 ) );
1019 		}
1020 		nEntryPos = aPaperTrayBox.InsertEntry( aName );
1021 		aPaperTrayBox.SetEntryData( nEntryPos, (void*)(sal_uLong)i );
1022 	}
1023 	aPaperTrayBox.SelectEntry( aOldName );
1024 	aPaperTrayBox.SetUpdateMode( sal_True );
1025 
1026     return 0;
1027 }
1028 
1029 // -----------------------------------------------------------------------
1030 
1031 IMPL_LINK( SvxPageDescPage, PaperSizeSelect_Impl, ListBox *, pBox )
1032 {
1033 	const sal_uInt16 nPos = pBox->GetSelectEntryPos();
1034 	Paper ePaper = (Paper)(sal_uLong)aPaperSizeBox.GetEntryData( nPos );
1035 
1036 	if ( ePaper != PAPER_USER )
1037 	{
1038 		Size aSize( SvxPaperInfo::GetPaperSize( ePaper, MAP_100TH_MM ) );
1039 
1040 		if ( aLandscapeBtn.IsChecked() )
1041 			Swap( aSize );
1042 
1043 		if ( aSize.Height() < aPaperHeightEdit.GetMin( FUNIT_100TH_MM ) )
1044 			aPaperHeightEdit.SetMin(
1045 				aPaperHeightEdit.Normalize( aSize.Height() ), FUNIT_100TH_MM );
1046 		if ( aSize.Width() < aPaperWidthEdit.GetMin( FUNIT_100TH_MM ) )
1047 			aPaperWidthEdit.SetMin(
1048 				aPaperWidthEdit.Normalize( aSize.Width() ), FUNIT_100TH_MM );
1049 		SetMetricValue( aPaperHeightEdit, aSize.Height(), SFX_MAPUNIT_100TH_MM );
1050 		SetMetricValue( aPaperWidthEdit, aSize.Width(), SFX_MAPUNIT_100TH_MM );
1051 
1052 		// R"ander ggf. neu berechnen
1053 		CalcMargin_Impl();
1054 
1055 		RangeHdl_Impl( 0 );
1056 		UpdateExample_Impl( true );
1057 
1058 		if ( eMode == SVX_PAGE_MODE_PRESENTATION )
1059 		{
1060 			// Draw: bei Papierformat soll der Rand 1cm betragen
1061 			long nTmp = 0;
1062 			sal_Bool bScreen = ( PAPER_SCREEN == ePaper );
1063 
1064 			if ( !bScreen )
1065 				// bei Bildschirm keinen Rand
1066 				nTmp = 1; // entspr. 1cm
1067 
1068 			// Abfragen, ob fuer Raender 0 gesetzt ist:
1069 			if ( bScreen || aRightMarginEdit.GetValue() == 0 )
1070 			{
1071 				SetMetricValue( aRightMarginEdit, nTmp, SFX_MAPUNIT_CM );
1072 				if ( !bScreen &&
1073 					 aRightMarginEdit.GetFirst() > aRightMarginEdit.GetValue() )
1074 					aRightMarginEdit.SetValue( aRightMarginEdit.GetFirst() );
1075 			}
1076 			if ( bScreen || aLeftMarginEdit.GetValue() == 0 )
1077 			{
1078 				SetMetricValue( aLeftMarginEdit, nTmp, SFX_MAPUNIT_CM );
1079 				if ( !bScreen &&
1080 					 aLeftMarginEdit.GetFirst() > aLeftMarginEdit.GetValue() )
1081 					aLeftMarginEdit.SetValue( aLeftMarginEdit.GetFirst() );
1082 			}
1083 			if ( bScreen || aBottomMarginEdit.GetValue() == 0 )
1084 			{
1085 				SetMetricValue( aBottomMarginEdit, nTmp, SFX_MAPUNIT_CM );
1086 				if ( !bScreen &&
1087 					 aBottomMarginEdit.GetFirst() > aBottomMarginEdit.GetValue() )
1088 					aBottomMarginEdit.SetValue( aBottomMarginEdit.GetFirst() );
1089 			}
1090 			if ( bScreen || aTopMarginEdit.GetValue() == 0 )
1091 			{
1092 				SetMetricValue( aTopMarginEdit, nTmp, SFX_MAPUNIT_CM );
1093 				if ( !bScreen &&
1094 					 aTopMarginEdit.GetFirst() > aTopMarginEdit.GetValue() )
1095 					aTopMarginEdit.SetValue( aTopMarginEdit.GetFirst() );
1096 			}
1097 			UpdateExample_Impl( true );
1098 		}
1099 	}
1100 	return 0;
1101 }
1102 
1103 // -----------------------------------------------------------------------
1104 
1105 IMPL_LINK( SvxPageDescPage, PaperSizeModify_Impl, Edit *, EMPTYARG )
1106 {
1107 	sal_uInt16 nWhich = GetWhich( SID_ATTR_LRSPACE );
1108 	SfxMapUnit eUnit = GetItemSet().GetPool()->GetMetric( nWhich );
1109 	Size aSize( GetCoreValue( aPaperWidthEdit, eUnit ),
1110 				GetCoreValue( aPaperHeightEdit, eUnit ) );
1111 	Paper ePaper = SvxPaperInfo::GetSvxPaper( aSize, (MapUnit)eUnit, sal_True );
1112 	sal_uInt16 nEntryCount = aPaperSizeBox.GetEntryCount();
1113 
1114 	for ( sal_uInt16 i = 0; i < nEntryCount; ++i )
1115 	{
1116 		Paper eTmp = (Paper)(sal_uLong)aPaperSizeBox.GetEntryData(i);
1117 
1118 		if ( eTmp == ePaper )
1119 		{
1120 			aPaperSizeBox.SelectEntryPos(i);
1121 			break;
1122 		}
1123 	}
1124 	UpdateExample_Impl( true );
1125 	return 0;
1126 }
1127 
1128 // -----------------------------------------------------------------------
1129 
1130 IMPL_LINK( SvxPageDescPage, SwapOrientation_Impl, RadioButton *, pBtn )
1131 {
1132 	if (
1133         (!bLandscape && pBtn == &aLandscapeBtn) ||
1134 		(bLandscape  && pBtn == &aPortraitBtn)
1135        )
1136 	{
1137 		bLandscape = aLandscapeBtn.IsChecked();
1138 
1139 		const long lWidth = GetCoreValue( aPaperWidthEdit, SFX_MAPUNIT_100TH_MM );
1140 		const long lHeight = GetCoreValue( aPaperHeightEdit, SFX_MAPUNIT_100TH_MM );
1141 
1142         // swap with and height
1143 		SetMetricValue( aPaperWidthEdit, lHeight, SFX_MAPUNIT_100TH_MM );
1144 		SetMetricValue( aPaperHeightEdit, lWidth, SFX_MAPUNIT_100TH_MM );
1145 
1146         // recalculate margins if necessary
1147 		CalcMargin_Impl();
1148 
1149 		PaperSizeSelect_Impl( &aPaperSizeBox );
1150 		RangeHdl_Impl( 0 );
1151 		SwapFirstValues_Impl( bBorderModified );
1152         UpdateExample_Impl( true );
1153 	}
1154 	return 0;
1155 }
1156 
1157 // -----------------------------------------------------------------------
1158 
1159 void SvxPageDescPage::SwapFirstValues_Impl( FASTBOOL bSet )
1160 {
1161     MapMode aOldMode = pImpl->mpDefPrinter->GetMapMode();
1162 	Orientation	eOri = ORIENTATION_PORTRAIT;
1163 
1164 	if ( bLandscape )
1165 		eOri = ORIENTATION_LANDSCAPE;
1166     Orientation eOldOri = pImpl->mpDefPrinter->GetOrientation();
1167     pImpl->mpDefPrinter->SetOrientation( eOri );
1168     pImpl->mpDefPrinter->SetMapMode( MAP_TWIP );
1169 
1170 	// First- und Last-Werte f"ur die R"ander setzen
1171     Size aPaperSize = pImpl->mpDefPrinter->GetPaperSize();
1172     Size aPrintSize = pImpl->mpDefPrinter->GetOutputSize();
1173 	/*
1174 	 * einen Punkt ( 0,0 ) in logische Koordinaten zu konvertieren,
1175 	 * sieht aus wie Unsinn; ist aber sinnvoll, wenn der Ursprung des
1176 	 * Koordinatensystems verschoben ist.
1177 	 */
1178     Point aPrintOffset = pImpl->mpDefPrinter->GetPageOffset() -
1179                          pImpl->mpDefPrinter->PixelToLogic( Point() );
1180     pImpl->mpDefPrinter->SetMapMode( aOldMode );
1181     pImpl->mpDefPrinter->SetOrientation( eOldOri );
1182 
1183     sal_Int64 nSetL = aLeftMarginEdit.Denormalize(
1184 					aLeftMarginEdit.GetValue( FUNIT_TWIP ) );
1185 	sal_Int64 nSetR = aRightMarginEdit.Denormalize(
1186 					aRightMarginEdit.GetValue( FUNIT_TWIP ) );
1187 	sal_Int64 nSetT = aTopMarginEdit.Denormalize(
1188 					aTopMarginEdit.GetValue( FUNIT_TWIP ) );
1189 	sal_Int64 nSetB = aBottomMarginEdit.Denormalize(
1190 					aBottomMarginEdit.GetValue( FUNIT_TWIP ) );
1191 
1192 	long nOffset = !aPrintOffset.X() && !aPrintOffset.Y() ? 0 : PRINT_OFFSET;
1193 	long nNewL = aPrintOffset.X();
1194 	long nNewR =
1195 		aPaperSize.Width() - aPrintSize.Width() - aPrintOffset.X() + nOffset;
1196 	long nNewT = aPrintOffset.Y();
1197 	long nNewB =
1198 		aPaperSize.Height() - aPrintSize.Height() - aPrintOffset.Y() + nOffset;
1199 
1200 	aLeftMarginEdit.SetFirst( aLeftMarginEdit.Normalize( nNewL ), FUNIT_TWIP );
1201 	nFirstLeftMargin = static_cast<long>(aLeftMarginEdit.GetFirst());
1202 	aRightMarginEdit.SetFirst( aRightMarginEdit.Normalize( nNewR ), FUNIT_TWIP );
1203 	nFirstRightMargin = static_cast<long>(aRightMarginEdit.GetFirst());
1204 	aTopMarginEdit.SetFirst( aTopMarginEdit.Normalize( nNewT ), FUNIT_TWIP );
1205 	nFirstTopMargin = static_cast<long>(aTopMarginEdit.GetFirst());
1206 	aBottomMarginEdit.SetFirst(	aBottomMarginEdit.Normalize( nNewB ), FUNIT_TWIP );
1207 	nFirstBottomMargin = static_cast<long>(aBottomMarginEdit.GetFirst());
1208 
1209 	if ( bSet )
1210 	{
1211 		// ggf. auch die Werte umsetzen,
1212 		if ( nSetL < nNewL )
1213 			aLeftMarginEdit.SetValue( aLeftMarginEdit.Normalize( nNewL ),
1214 									  FUNIT_TWIP );
1215 		if ( nSetR < nNewR )
1216 			aRightMarginEdit.SetValue( aRightMarginEdit.Normalize( nNewR ),
1217 									   FUNIT_TWIP );
1218 		if ( nSetT < nNewT )
1219 			aTopMarginEdit.SetValue( aTopMarginEdit.Normalize( nNewT ),
1220 									 FUNIT_TWIP );
1221 		if ( nSetB < nNewB )
1222 			aBottomMarginEdit.SetValue( aBottomMarginEdit.Normalize( nNewB ),
1223 										FUNIT_TWIP );
1224 	}
1225 }
1226 
1227 // -----------------------------------------------------------------------
1228 
1229 IMPL_LINK_INLINE_START( SvxPageDescPage, BorderModify_Impl, MetricField *, EMPTYARG )
1230 {
1231 	if ( !bBorderModified )
1232 		bBorderModified = sal_True;
1233 	UpdateExample_Impl();
1234 	return 0;
1235 }
1236 IMPL_LINK_INLINE_END( SvxPageDescPage, BorderModify_Impl, MetricField *, EMPTYARG )
1237 
1238 // -----------------------------------------------------------------------
1239 
1240 void SvxPageDescPage::UpdateExample_Impl( bool bResetbackground )
1241 {
1242 	// Size
1243 	Size aSize(	GetCoreValue( aPaperWidthEdit, SFX_MAPUNIT_TWIP ),
1244 				GetCoreValue( aPaperHeightEdit, SFX_MAPUNIT_TWIP ) );
1245 
1246 	aBspWin.SetSize( aSize );
1247 
1248 	// R"ander
1249 	aBspWin.SetTop( GetCoreValue( aTopMarginEdit, SFX_MAPUNIT_TWIP ) );
1250 	aBspWin.SetBottom( GetCoreValue( aBottomMarginEdit, SFX_MAPUNIT_TWIP ) );
1251 	aBspWin.SetLeft( GetCoreValue( aLeftMarginEdit, SFX_MAPUNIT_TWIP ) );
1252 	aBspWin.SetRight( GetCoreValue( aRightMarginEdit, SFX_MAPUNIT_TWIP ) );
1253 
1254 	// Layout
1255 	aBspWin.SetUsage( PosToPageUsage_Impl( aLayoutBox.GetSelectEntryPos() ) );
1256     if ( bResetbackground )
1257         aBspWin.ResetBackground();
1258 	aBspWin.Invalidate();
1259 }
1260 
1261 // -----------------------------------------------------------------------
1262 
1263 void SvxPageDescPage::ResetBackground_Impl( const SfxItemSet& rSet )
1264 {
1265 	sal_uInt16 nWhich = GetWhich( SID_ATTR_PAGE_HEADERSET );
1266 
1267 	if ( rSet.GetItemState( nWhich, sal_False ) == SFX_ITEM_SET )
1268 	{
1269 		const SvxSetItem& rSetItem =
1270 			(const SvxSetItem&)rSet.Get( nWhich, sal_False );
1271 		const SfxItemSet& rTmpSet = rSetItem.GetItemSet();
1272 		const SfxBoolItem& rOn =
1273 			(const SfxBoolItem&)rTmpSet.Get( GetWhich( SID_ATTR_PAGE_ON ) );
1274 
1275 		if ( rOn.GetValue() )
1276 		{
1277 			nWhich = GetWhich( SID_ATTR_BRUSH );
1278 
1279 			if ( rTmpSet.GetItemState( nWhich ) == SFX_ITEM_SET )
1280 			{
1281 				const SvxBrushItem& rItem =
1282 					(const SvxBrushItem&)rTmpSet.Get( nWhich );
1283 				aBspWin.SetHdColor( rItem.GetColor() );
1284 			}
1285 			nWhich = GetWhich( SID_ATTR_BORDER_OUTER );
1286 
1287 			if ( rTmpSet.GetItemState( nWhich ) == SFX_ITEM_SET )
1288 			{
1289 				const SvxBoxItem& rItem =
1290 					(const SvxBoxItem&)rTmpSet.Get( nWhich );
1291 				aBspWin.SetHdBorder( rItem );
1292 			}
1293 		}
1294 	}
1295 
1296 	nWhich = GetWhich( SID_ATTR_PAGE_FOOTERSET );
1297 
1298 	if ( rSet.GetItemState( nWhich, sal_False ) == SFX_ITEM_SET )
1299 	{
1300 		const SvxSetItem& rSetItem =
1301 			(const SvxSetItem&)rSet.Get( nWhich, sal_False );
1302 		const SfxItemSet& rTmpSet = rSetItem.GetItemSet();
1303 		const SfxBoolItem& rOn =
1304 			(const SfxBoolItem&)rTmpSet.Get( GetWhich( SID_ATTR_PAGE_ON ) );
1305 
1306 		if ( rOn.GetValue() )
1307 		{
1308 			nWhich = GetWhich( SID_ATTR_BRUSH );
1309 
1310 			if ( rTmpSet.GetItemState( nWhich ) == SFX_ITEM_SET )
1311 			{
1312 				const SvxBrushItem& rItem =
1313 					(const SvxBrushItem&)rTmpSet.Get( nWhich );
1314 				aBspWin.SetFtColor( rItem.GetColor() );
1315 			}
1316 			nWhich = GetWhich( SID_ATTR_BORDER_OUTER );
1317 
1318 			if ( rTmpSet.GetItemState( nWhich ) == SFX_ITEM_SET )
1319 			{
1320 				const SvxBoxItem& rItem =
1321 					(const SvxBoxItem&)rTmpSet.Get( nWhich );
1322 				aBspWin.SetFtBorder( rItem );
1323 			}
1324 		}
1325 	}
1326 
1327 	const SfxPoolItem* pItem = GetItem( rSet, SID_ATTR_BRUSH );
1328 
1329 	if ( pItem )
1330 	{
1331 		aBspWin.SetColor( ( (const SvxBrushItem*)pItem )->GetColor() );
1332 		const Graphic* pGrf = ( (const SvxBrushItem*)pItem )->GetGraphic();
1333 
1334 		if ( pGrf )
1335 		{
1336 			Bitmap aBitmap = pGrf->GetBitmap();
1337 			aBspWin.SetBitmap( &aBitmap );
1338 		}
1339 		else
1340 			aBspWin.SetBitmap( NULL );
1341 	}
1342 
1343 	pItem = GetItem( rSet, SID_ATTR_BORDER_OUTER );
1344 
1345 	if ( pItem )
1346 		aBspWin.SetBorder( (SvxBoxItem&)*pItem );
1347 }
1348 
1349 // -----------------------------------------------------------------------
1350 
1351 void SvxPageDescPage::InitHeadFoot_Impl( const SfxItemSet& rSet )
1352 {
1353 	bLandscape = aLandscapeBtn.IsChecked();
1354 	const SfxPoolItem* pItem = GetItem( rSet, SID_ATTR_PAGE_SIZE );
1355 
1356 	if ( pItem )
1357 		aBspWin.SetSize( ( (const SvxSizeItem*)pItem )->GetSize() );
1358 
1359 	const SvxSetItem* pSetItem = 0;
1360 
1361 	// Kopfzeilen-Attribute auswerten
1362 
1363 	if ( SFX_ITEM_SET ==
1364 		 rSet.GetItemState( GetWhich( SID_ATTR_PAGE_HEADERSET ),
1365 							sal_False, (const SfxPoolItem**)&pSetItem ) )
1366 	{
1367 		const SfxItemSet& rHeaderSet = pSetItem->GetItemSet();
1368 		const SfxBoolItem& rHeaderOn =
1369 			(const SfxBoolItem&)rHeaderSet.Get( GetWhich( SID_ATTR_PAGE_ON ) );
1370 
1371 		if ( rHeaderOn.GetValue() )
1372 		{
1373 			const SvxSizeItem& rSize = (const SvxSizeItem&)
1374 				rHeaderSet.Get( GetWhich( SID_ATTR_PAGE_SIZE ) );
1375 			const SvxULSpaceItem& rUL = (const SvxULSpaceItem&)
1376 				rHeaderSet.Get( GetWhich( SID_ATTR_ULSPACE ) );
1377 			long nDist = rUL.GetLower();
1378 			aBspWin.SetHdHeight( rSize.GetSize().Height() - nDist );
1379 			aBspWin.SetHdDist( nDist );
1380 			const SvxLRSpaceItem& rLR = (const SvxLRSpaceItem&)
1381 				rHeaderSet.Get( GetWhich( SID_ATTR_LRSPACE ) );
1382 			aBspWin.SetHdLeft( rLR.GetLeft() );
1383 			aBspWin.SetHdRight( rLR.GetRight() );
1384 			aBspWin.SetHeader( sal_True );
1385 		}
1386 		else
1387 			aBspWin.SetHeader( sal_False );
1388 
1389 		// im Beispiel Hintergrund und Umrandung anzeigen
1390 		sal_uInt16 nWhich = GetWhich( SID_ATTR_BRUSH );
1391 
1392 		if ( rHeaderSet.GetItemState( nWhich ) >= SFX_ITEM_AVAILABLE )
1393 		{
1394 			const SvxBrushItem& rItem =
1395 				(const SvxBrushItem&)rHeaderSet.Get( nWhich );
1396 			aBspWin.SetHdColor( rItem.GetColor() );
1397 		}
1398 		nWhich = GetWhich( SID_ATTR_BORDER_OUTER );
1399 
1400 		if ( rHeaderSet.GetItemState( nWhich ) >= SFX_ITEM_AVAILABLE )
1401 		{
1402 			const SvxBoxItem& rItem =
1403 				(const SvxBoxItem&)rHeaderSet.Get( nWhich );
1404 			aBspWin.SetHdBorder( rItem );
1405 		}
1406 	}
1407 
1408 	// Fusszeilen-Attribute auswerten
1409 
1410 	if ( SFX_ITEM_SET ==
1411 		 rSet.GetItemState( GetWhich( SID_ATTR_PAGE_FOOTERSET ),
1412 							sal_False, (const SfxPoolItem**)&pSetItem ) )
1413 	{
1414 		const SfxItemSet& rFooterSet = pSetItem->GetItemSet();
1415 		const SfxBoolItem& rFooterOn =
1416 			(const SfxBoolItem&)rFooterSet.Get( GetWhich( SID_ATTR_PAGE_ON ) );
1417 
1418 		if ( rFooterOn.GetValue() )
1419 		{
1420 			const SvxSizeItem& rSize = (const SvxSizeItem&)
1421 				rFooterSet.Get( GetWhich( SID_ATTR_PAGE_SIZE ) );
1422 			const SvxULSpaceItem& rUL = (const SvxULSpaceItem&)
1423 				rFooterSet.Get( GetWhich( SID_ATTR_ULSPACE ) );
1424 			long nDist = rUL.GetUpper();
1425 			aBspWin.SetFtHeight( rSize.GetSize().Height() - nDist );
1426 			aBspWin.SetFtDist( nDist );
1427 			const SvxLRSpaceItem& rLR = (const SvxLRSpaceItem&)
1428 				rFooterSet.Get( GetWhich( SID_ATTR_LRSPACE ) );
1429 			aBspWin.SetFtLeft( rLR.GetLeft() );
1430 			aBspWin.SetFtRight( rLR.GetRight() );
1431 			aBspWin.SetFooter( sal_True );
1432 		}
1433 		else
1434 			aBspWin.SetFooter( sal_False );
1435 
1436 		// im Beispiel Hintergrund und Umrandung anzeigen
1437 		sal_uInt16 nWhich = GetWhich( SID_ATTR_BRUSH );
1438 
1439 		if ( rFooterSet.GetItemState( nWhich ) >= SFX_ITEM_AVAILABLE )
1440 		{
1441 			const SvxBrushItem& rItem =
1442 				(const SvxBrushItem&)rFooterSet.Get( nWhich );
1443 			aBspWin.SetFtColor( rItem.GetColor() );
1444 		}
1445 		nWhich = GetWhich( SID_ATTR_BORDER_OUTER );
1446 
1447 		if ( rFooterSet.GetItemState( nWhich ) >= SFX_ITEM_AVAILABLE )
1448 		{
1449 			const SvxBoxItem& rItem =
1450 				(const SvxBoxItem&)rFooterSet.Get( nWhich );
1451 			aBspWin.SetFtBorder( rItem );
1452 		}
1453 	}
1454 }
1455 
1456 // -----------------------------------------------------------------------
1457 
1458 void SvxPageDescPage::ActivatePage( const SfxItemSet& rSet )
1459 {
1460 	InitHeadFoot_Impl( rSet );
1461 	ResetBackground_Impl( rSet );
1462 	RangeHdl_Impl( 0 );
1463 }
1464 
1465 // -----------------------------------------------------------------------
1466 
1467 int SvxPageDescPage::DeactivatePage( SfxItemSet* _pSet )
1468 {
1469 	// Abfrage, ob die Seitenr"ander ausserhalb des Druckbereichs liegen
1470 	// Wenn nicht, dann den Anwender fragen, ob sie "ubernommen werden sollen.
1471 	// Wenn nicht, dann auf der TabPage bleiben.
1472 	sal_uInt16 nPos = aPaperSizeBox.GetSelectEntryPos();
1473 	Paper ePaper = (Paper)(sal_uLong)aPaperSizeBox.GetEntryData( nPos );
1474 
1475 	if ( ePaper != PAPER_SCREEN && IsMarginOutOfRange() )
1476 	{
1477 		if ( QueryBox( this, WB_YES_NO | WB_DEF_NO, aPrintRangeQueryText ).Execute() == RET_NO )
1478 		{
1479 			MetricField* pField = NULL;
1480 			if ( IsPrinterRangeOverflow( aLeftMarginEdit, nFirstLeftMargin, nLastLeftMargin, MARGIN_LEFT ) )
1481 				pField = &aLeftMarginEdit;
1482 			if (	IsPrinterRangeOverflow( aRightMarginEdit, nFirstRightMargin, nLastRightMargin, MARGIN_RIGHT )
1483 				 && !pField )
1484 				pField = &aRightMarginEdit;
1485 			if (	IsPrinterRangeOverflow( aTopMarginEdit, nFirstTopMargin, nLastTopMargin, MARGIN_TOP )
1486 				 && !pField )
1487 				pField = &aTopMarginEdit;
1488 			if (	IsPrinterRangeOverflow( aBottomMarginEdit, nFirstBottomMargin, nLastBottomMargin, MARGIN_BOTTOM )
1489 				 && !pField )
1490 				pField = &aBottomMarginEdit;
1491 			if ( pField )
1492 				pField->GrabFocus();
1493 			UpdateExample_Impl();
1494 			return KEEP_PAGE;
1495 		}
1496 		else
1497 			CheckMarginEdits( false );
1498 	}
1499 
1500     if ( _pSet )
1501 	{
1502         FillItemSet( *_pSet );
1503 
1504 		// ggf. hoch/quer putten
1505 		sal_uInt16 nWh = GetWhich( SID_ATTR_PAGE_SIZE );
1506 		SfxMapUnit eUnit = GetItemSet().GetPool()->GetMetric( nWh );
1507 		Size aSize( GetCoreValue( aPaperWidthEdit, eUnit ),
1508 					GetCoreValue( aPaperHeightEdit, eUnit ) );
1509 
1510         // putten, wenn aktuelle Gr"o/se unterschiedlich zum Wert in _pSet
1511         const SvxSizeItem* pSize = (const SvxSizeItem*)GetItem( *_pSet, SID_ATTR_PAGE_SIZE );
1512 		if ( aSize.Width() && ( !pSize || !IsEqualSize_Impl( pSize, aSize ) ) )
1513             _pSet->Put( SvxSizeItem( nWh, aSize ) );
1514 	}
1515 
1516 	return LEAVE_PAGE;
1517 }
1518 
1519 // -----------------------------------------------------------------------
1520 
1521 IMPL_LINK( SvxPageDescPage, RangeHdl_Impl, Edit *, EMPTYARG )
1522 {
1523 	// Aktuelle Header-Breite/H"ohe aus dem Bsp
1524 	long nHHeight = aBspWin.GetHdHeight();
1525 	long nHDist = aBspWin.GetHdDist();
1526 
1527 	// Aktuelle Footer-Breite/H"ohe aus dem Bsp
1528 	long nFHeight = aBspWin.GetFtHeight();
1529 	long nFDist = aBspWin.GetFtDist();
1530 
1531 	// Aktuelle Header/Footer-R"ander aus dem Bsp
1532 	long nHFLeft = Max( aBspWin.GetHdLeft(), aBspWin.GetFtLeft() );
1533 	long nHFRight = Max( aBspWin.GetHdRight(), aBspWin.GetFtRight() );
1534 
1535 	// Aktuelle Werte der Seitenr"ander
1536 	long nBT = static_cast<long>(aTopMarginEdit.Denormalize(aTopMarginEdit.GetValue(FUNIT_TWIP)));
1537 	long nBB = static_cast<long>(aBottomMarginEdit.Denormalize(aBottomMarginEdit.GetValue(FUNIT_TWIP)));
1538 	long nBL = static_cast<long>(aLeftMarginEdit.Denormalize(aLeftMarginEdit.GetValue(FUNIT_TWIP)));
1539 	long nBR = static_cast<long>(aRightMarginEdit.Denormalize(aRightMarginEdit.GetValue(FUNIT_TWIP)));
1540 
1541 	// Breite Umrandung der Seite berechnen
1542     const SfxItemSet* _pSet = &GetItemSet();
1543 	Size aBorder;
1544 
1545     if ( _pSet->GetItemState( GetWhich(SID_ATTR_BORDER_SHADOW) ) >=
1546 			SFX_ITEM_AVAILABLE &&
1547          _pSet->GetItemState( GetWhich(SID_ATTR_BORDER_OUTER)  ) >=
1548 			SFX_ITEM_AVAILABLE )
1549 	{
1550 		aBorder = ( GetMinBorderSpace_Impl(
1551             (const SvxShadowItem&)_pSet->Get(GetWhich(SID_ATTR_BORDER_SHADOW)),
1552             (const SvxBoxItem&)_pSet->Get(GetWhich(SID_ATTR_BORDER_OUTER))));
1553 	}
1554 
1555 	long nH  = static_cast<long>(aPaperHeightEdit.Denormalize(aPaperHeightEdit.GetValue(FUNIT_TWIP)));
1556 	long nW  = static_cast<long>(aPaperWidthEdit.Denormalize(aPaperWidthEdit.GetValue(FUNIT_TWIP)));
1557 
1558 	// Grenzen Papier
1559 	// Maximum liegt bei 54cm
1560 	//
1561 	long nMin = nHHeight + nHDist + nFDist + nFHeight + nBT + nBB +
1562 				MINBODY + aBorder.Height();
1563 	aPaperHeightEdit.SetMin(aPaperHeightEdit.Normalize(nMin), FUNIT_TWIP);
1564 
1565 	nMin = MINBODY + nBL + nBR + aBorder.Width();
1566 	aPaperWidthEdit.SetMin(aPaperWidthEdit.Normalize(nMin), FUNIT_TWIP);
1567 
1568 	// Falls sich die Papiergr"o\se ge"adert hat
1569 	nH = static_cast<long>(aPaperHeightEdit.Denormalize(aPaperHeightEdit.GetValue(FUNIT_TWIP)));
1570 	nW = static_cast<long>(aPaperWidthEdit.Denormalize(aPaperWidthEdit.GetValue(FUNIT_TWIP)));
1571 
1572 	// Top
1573 	long nMax =	nH - nBB - aBorder.Height() - MINBODY -
1574 				nFDist - nFHeight -	nHDist - nHHeight;
1575 
1576 	aTopMarginEdit.SetMax(aTopMarginEdit.Normalize(nMax), FUNIT_TWIP);
1577 
1578 	// Bottom
1579 	nMax = nH - nBT - aBorder.Height() - MINBODY -
1580 		   nFDist - nFHeight - nHDist - nHHeight;
1581 
1582 	aBottomMarginEdit.SetMax(aTopMarginEdit.Normalize(nMax), FUNIT_TWIP);
1583 
1584 	// Left
1585 	nMax = nW - nBR - MINBODY - aBorder.Width() - nHFLeft - nHFRight;
1586 	aLeftMarginEdit.SetMax(aLeftMarginEdit.Normalize(nMax), FUNIT_TWIP);
1587 
1588 	// Right
1589 	nMax = nW - nBL - MINBODY - aBorder.Width() - nHFLeft - nHFRight;
1590 	aRightMarginEdit.SetMax(aRightMarginEdit.Normalize(nMax), FUNIT_TWIP);
1591 	return 0;
1592 }
1593 
1594 // -----------------------------------------------------------------------
1595 
1596 void SvxPageDescPage::CalcMargin_Impl()
1597 {
1598 	// Aktuelle Werte der Seitenr"ander
1599 	long nBT = GetCoreValue( aTopMarginEdit, SFX_MAPUNIT_TWIP );
1600 	long nBB = GetCoreValue( aBottomMarginEdit, SFX_MAPUNIT_TWIP );
1601 
1602 	long nBL = GetCoreValue( aLeftMarginEdit, SFX_MAPUNIT_TWIP );
1603 	long nBR = GetCoreValue( aRightMarginEdit, SFX_MAPUNIT_TWIP );
1604 
1605 	long nH  = GetCoreValue( aPaperHeightEdit, SFX_MAPUNIT_TWIP );
1606 	long nW  = GetCoreValue( aPaperWidthEdit, SFX_MAPUNIT_TWIP );
1607 
1608 	long nWidth = nBL + nBR + MINBODY;
1609 	long nHeight = nBT + nBB + MINBODY;
1610 
1611 	if ( nWidth > nW || nHeight > nH )
1612 	{
1613 		if ( nWidth > nW )
1614 		{
1615 			long nTmp = nBL <= nBR ? nBR : nBL;
1616 			nTmp -= nWidth - nW;
1617 
1618 			if ( nBL <= nBR )
1619 				SetMetricValue( aRightMarginEdit, nTmp, SFX_MAPUNIT_TWIP );
1620 			else
1621 				SetMetricValue( aLeftMarginEdit, nTmp, SFX_MAPUNIT_TWIP );
1622 		}
1623 
1624 		if ( nHeight > nH )
1625 		{
1626 			long nTmp = nBT <= nBB ? nBB : nBT;
1627 			nTmp -= nHeight - nH;
1628 
1629 			if ( nBT <= nBB )
1630 				SetMetricValue( aBottomMarginEdit, nTmp, SFX_MAPUNIT_TWIP );
1631 			else
1632 				SetMetricValue( aTopMarginEdit, nTmp, SFX_MAPUNIT_TWIP );
1633 		}
1634 	}
1635 }
1636 
1637 // -----------------------------------------------------------------------
1638 
1639 IMPL_LINK_INLINE_START( SvxPageDescPage, CenterHdl_Impl, CheckBox *, EMPTYARG )
1640 {
1641     aBspWin.SetHorz( aHorzBox.IsChecked() );
1642     aBspWin.SetVert( aVertBox.IsChecked() );
1643     UpdateExample_Impl();
1644 	return 0;
1645 }
1646 IMPL_LINK_INLINE_END( SvxPageDescPage, CenterHdl_Impl, CheckBox *, EMPTYARG )
1647 
1648 // -----------------------------------------------------------------------
1649 
1650 void SvxPageDescPage::SetCollectionList(const List* pList)
1651 {
1652 	sStandardRegister = *(String*)pList->GetObject(0);
1653 	for( sal_uInt16 i = 1; i < pList->Count(); i++   )
1654 	{
1655 		aRegisterLB.InsertEntry(*(String*)pList->GetObject(i));
1656 	}
1657 
1658 	aRegisterCB  .Show();
1659 	aRegisterFT  .Show();
1660 	aRegisterLB.Show();
1661 	aRegisterCB.SetClickHdl(LINK(this, SvxPageDescPage, RegisterModify));
1662 }
1663 
1664 // -----------------------------------------------------------------------
1665 
1666 IMPL_LINK( SvxPageDescPage, RegisterModify, CheckBox*, pBox )
1667 {
1668 	sal_Bool bEnable = sal_False;
1669 	if(pBox->IsChecked())
1670 	{
1671 		bEnable = sal_True;
1672 		if(USHRT_MAX == aRegisterLB.GetSelectEntryPos())
1673 			aRegisterLB.SelectEntry(sStandardRegister);
1674 	}
1675 	aRegisterFT.Enable( bEnable );
1676 	aRegisterLB.Enable( bEnable );
1677 	return 0;
1678 }
1679 
1680 // ----------------------------------------------------------------------------
1681 
1682 void SvxPageDescPage::DisableVerticalPageDir()
1683 {
1684     aTextFlowBox.RemoveEntryValue( FRMDIR_VERT_TOP_RIGHT );
1685     aTextFlowBox.RemoveEntryValue( FRMDIR_VERT_TOP_LEFT );
1686     if( aTextFlowBox.GetEntryCount() < 2 )
1687     {
1688         aTextFlowLbl.Hide();
1689         aTextFlowBox.Hide();
1690         aBspWin.EnableFrameDirection( sal_False );
1691     }
1692 }
1693 
1694 IMPL_LINK( SvxPageDescPage, FrameDirectionModify_Impl, ListBox*,  EMPTYARG)
1695 {
1696     aBspWin.SetFrameDirection( (sal_uInt32) aTextFlowBox.GetSelectEntryValue() );
1697     aBspWin.Invalidate();
1698     return 0;
1699 }
1700 
1701 bool SvxPageDescPage::IsPrinterRangeOverflow(
1702 	MetricField& rField, long nFirstMargin, long nLastMargin, MarginPosition nPos )
1703 {
1704 	bool bRet = false;
1705 	bool bCheck = ( ( pImpl->m_nPos & nPos ) == 0 );
1706 	long nValue = static_cast<long>(rField.GetValue());
1707 	if ( bCheck &&
1708 		 (  nValue < nFirstMargin || nValue > nLastMargin ) &&
1709 		 rField.GetText() != rField.GetSavedValue() )
1710 	{
1711 		rField.SetValue( nValue < nFirstMargin ? nFirstMargin : nLastMargin );
1712  		bRet = true;
1713 	}
1714 
1715 	return bRet;
1716 }
1717 
1718 /** Check if a value of a margin edit is outside the printer paper margins
1719 	and save this information.
1720 */
1721 void SvxPageDescPage::CheckMarginEdits( bool _bClear )
1722 {
1723 	if ( _bClear )
1724 		pImpl->m_nPos = 0;
1725 
1726 	sal_Int64 nValue = aLeftMarginEdit.GetValue();
1727 	if (  nValue < nFirstLeftMargin || nValue > nLastLeftMargin )
1728 		pImpl->m_nPos |= MARGIN_LEFT;
1729 	nValue = aRightMarginEdit.GetValue();
1730 	if (  nValue < nFirstRightMargin || nValue > nLastRightMargin )
1731 		pImpl->m_nPos |= MARGIN_RIGHT;
1732 	nValue = aTopMarginEdit.GetValue();
1733 	if (  nValue < nFirstTopMargin || nValue > nLastTopMargin )
1734 		pImpl->m_nPos |= MARGIN_TOP;
1735 	nValue = aBottomMarginEdit.GetValue();
1736 	if (  nValue < nFirstBottomMargin || nValue > nLastBottomMargin )
1737 		pImpl->m_nPos |= MARGIN_BOTTOM;
1738 }
1739 
1740 bool SvxPageDescPage::IsMarginOutOfRange()
1741 {
1742 	bool bRet = ( ( ( !( pImpl->m_nPos & MARGIN_LEFT ) &&
1743 					  ( aLeftMarginEdit.GetText() != aLeftMarginEdit.GetSavedValue() ) ) &&
1744 					( aLeftMarginEdit.GetValue() < nFirstLeftMargin ||
1745 					  aLeftMarginEdit.GetValue() > nLastLeftMargin ) ) ||
1746 				  ( ( !( pImpl->m_nPos & MARGIN_RIGHT ) &&
1747 					  ( aRightMarginEdit.GetText() != aRightMarginEdit.GetSavedValue() ) ) &&
1748 					( aRightMarginEdit.GetValue() < nFirstRightMargin ||
1749 					  aRightMarginEdit.GetValue() > nLastRightMargin ) ) ||
1750 				  ( ( !( pImpl->m_nPos & MARGIN_TOP ) &&
1751 					  ( aTopMarginEdit.GetText() != aTopMarginEdit.GetSavedValue() ) ) &&
1752 					( aTopMarginEdit.GetValue() < nFirstTopMargin ||
1753 					  aTopMarginEdit.GetValue() > nLastTopMargin ) ) ||
1754 				  ( ( !( pImpl->m_nPos & MARGIN_BOTTOM ) &&
1755 					  ( aBottomMarginEdit.GetText() != aBottomMarginEdit.GetSavedValue() ) ) &&
1756 					( aBottomMarginEdit.GetValue() < nFirstBottomMargin ||
1757 					  aBottomMarginEdit.GetValue() > nLastBottomMargin ) ) );
1758 	return bRet;
1759 }
1760 
1761 void SvxPageDescPage::PageCreated (SfxAllItemSet aSet) //add CHINA001
1762 {
1763 	SFX_ITEMSET_ARG (&aSet,pModeItem,SfxAllEnumItem,SID_ENUM_PAGE_MODE,sal_False);
1764 	SFX_ITEMSET_ARG (&aSet,pPaperStartItem,SfxAllEnumItem,SID_PAPER_START,sal_False);
1765 	SFX_ITEMSET_ARG (&aSet,pPaperEndItem,SfxAllEnumItem,SID_PAPER_END,sal_False);
1766 	SFX_ITEMSET_ARG (&aSet,pCollectListItem,SfxStringListItem,SID_COLLECT_LIST,sal_False);
1767 	if (pModeItem)
1768 		SetMode((SvxModeType)pModeItem->GetEnumValue());
1769 	if (pPaperStartItem && pPaperEndItem)
1770 		SetPaperFormatRanges( (Paper)pPaperStartItem->GetEnumValue(), (Paper)pPaperEndItem->GetEnumValue() );
1771 	if (pCollectListItem)
1772 		SetCollectionList(pCollectListItem->GetList());
1773 }
1774