xref: /AOO41X/main/cui/source/tabpages/page.cxx (revision 79aad27f7f29270c03e208e3d687e8e3850af11d)
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. */
GetExportMode() const88     inline sal_Int32            GetExportMode() const { return mnExpMode; }
89 
90     /** Returns true, if the current HTML export mode is set to HTML 3.2. */
IsExportModeHTML32() const91     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 
SvxHtmlExportModeConfigItem_Impl()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 
Commit()114 void SvxHtmlExportModeConfigItem_Impl::Commit()
115 {
116 }
117 
Notify(const com::sun::star::uno::Sequence<rtl::OUString> &)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 
PageUsageToPos_Impl(sal_uInt16 nUsage)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 
PosToPageUsage_Impl(sal_uInt16 nPos)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 
GetMinBorderSpace_Impl(const SvxShadowItem & rShadow,const SvxBoxItem & rBox)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 
ConvertLong_Impl(const long nIn,SfxMapUnit eUnit)186 long ConvertLong_Impl( const long nIn, SfxMapUnit eUnit )
187 {
188     return OutputDevice::LogicToLogic( nIn, (MapUnit)eUnit, MAP_TWIP );
189 }
190 
IsEqualSize_Impl(const SvxSizeItem * pSize,const Size & rSize)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 
SvxPage_ImplSvxPage_Impl217     SvxPage_Impl() :
218         m_nPos( 0 ),
219         mpDefPrinter( 0 ),
220         mbDelPrinter( false ) {}
221 
~SvxPage_ImplSvxPage_Impl222     ~SvxPage_Impl() { if ( mbDelPrinter ) delete mpDefPrinter; }
223 };
224 
225 // class SvxPageDescPage --------------------------------------------------
226 
227 // gibt den Bereich der Which-Werte zur"uck
228 
GetRanges()229 sal_uInt16* SvxPageDescPage::GetRanges()
230 {
231     return pRanges;
232 }
233 
234 // -----------------------------------------------------------------------
235 
Create(Window * pParent,const SfxItemSet & rSet)236 SfxTabPage* SvxPageDescPage::Create( Window* pParent, const SfxItemSet& rSet )
237 {
238     return new SvxPageDescPage( pParent, rSet );
239 }
240 
241 // -----------------------------------------------------------------------
242 
SvxPageDescPage(Window * pParent,const SfxItemSet & rAttr)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 
~SvxPageDescPage()426 SvxPageDescPage::~SvxPageDescPage()
427 {
428     delete pImpl;
429 }
430 
431 // -----------------------------------------------------------------------
432 
Init_Impl()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 
Reset(const SfxItemSet & rSet)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 
FillUserData()732 void SvxPageDescPage::FillUserData()
733 {
734     if ( SVX_PAGE_MODE_PRESENTATION == eMode )
735         SetUserData( UniString::CreateFromInt32( (sal_Int32)aAdaptBox.IsChecked() ) );
736 }
737 
738 // -----------------------------------------------------------------------
739 
FillItemSet(SfxItemSet & rSet)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 
IMPL_LINK(SvxPageDescPage,LayoutHdl_Impl,ListBox *,EMPTYARG)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 
IMPL_LINK(SvxPageDescPage,PaperBinHdl_Impl,ListBox *,EMPTYARG)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 
IMPL_LINK(SvxPageDescPage,PaperSizeSelect_Impl,ListBox *,pBox)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 
IMPL_LINK(SvxPageDescPage,PaperSizeModify_Impl,Edit *,EMPTYARG)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 
IMPL_LINK(SvxPageDescPage,SwapOrientation_Impl,RadioButton *,pBtn)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 
SwapFirstValues_Impl(FASTBOOL bSet)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 
IMPL_LINK_INLINE_START(SvxPageDescPage,BorderModify_Impl,MetricField *,EMPTYARG)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 }
IMPL_LINK_INLINE_END(SvxPageDescPage,BorderModify_Impl,MetricField *,EMPTYARG)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 
ResetBackground_Impl(const SfxItemSet & rSet)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 
InitHeadFoot_Impl(const SfxItemSet & rSet)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 
ActivatePage(const SfxItemSet & rSet)1458 void SvxPageDescPage::ActivatePage( const SfxItemSet& rSet )
1459 {
1460     InitHeadFoot_Impl( rSet );
1461     ResetBackground_Impl( rSet );
1462     RangeHdl_Impl( 0 );
1463 }
1464 
1465 // -----------------------------------------------------------------------
1466 
DeactivatePage(SfxItemSet * _pSet)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 
IMPL_LINK(SvxPageDescPage,RangeHdl_Impl,Edit *,EMPTYARG)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 
CalcMargin_Impl()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 
IMPL_LINK_INLINE_START(SvxPageDescPage,CenterHdl_Impl,CheckBox *,EMPTYARG)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 }
IMPL_LINK_INLINE_END(SvxPageDescPage,CenterHdl_Impl,CheckBox *,EMPTYARG)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 
IMPL_LINK(SvxPageDescPage,RegisterModify,CheckBox *,pBox)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 
DisableVerticalPageDir()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 
IMPL_LINK(SvxPageDescPage,FrameDirectionModify_Impl,ListBox *,EMPTYARG)1694 IMPL_LINK( SvxPageDescPage, FrameDirectionModify_Impl, ListBox*,  EMPTYARG)
1695 {
1696     aBspWin.SetFrameDirection( (sal_uInt32) aTextFlowBox.GetSelectEntryValue() );
1697     aBspWin.Invalidate();
1698     return 0;
1699 }
1700 
IsPrinterRangeOverflow(MetricField & rField,long nFirstMargin,long nLastMargin,MarginPosition nPos)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 */
CheckMarginEdits(bool _bClear)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 
IsMarginOutOfRange()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 
PageCreated(SfxAllItemSet aSet)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