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