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