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