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_svx.hxx" 30 31 // include --------------------------------------------------------------- 32 #include <tools/shl.hxx> 33 #include <sfx2/app.hxx> 34 #include <sfx2/module.hxx> 35 #include <svl/intitem.hxx> 36 37 #define _SVX_OPTGRID_CXX 38 39 #include <svx/svxids.hrc> 40 #include <svx/dialmgr.hxx> 41 #include "svx/optgrid.hxx" 42 #include <svx/dialogs.hrc> 43 #include "optgrid.hrc" 44 #include "svx/dlgutil.hxx" 45 46 /* -----------------18.08.98 17:41------------------- 47 * local functions 48 * --------------------------------------------------*/ 49 void lcl_GetMinMax(MetricField& rField, long& nFirst, long& nLast, long& nMin, long& nMax) 50 { 51 nFirst = static_cast<long>(rField.Denormalize( rField.GetFirst( FUNIT_TWIP ) )); 52 nLast = static_cast<long>(rField.Denormalize( rField.GetLast( FUNIT_TWIP ) )); 53 nMin = static_cast<long>(rField.Denormalize( rField.GetMin( FUNIT_TWIP ) )); 54 nMax = static_cast<long>(rField.Denormalize( rField.GetMax( FUNIT_TWIP ) )); 55 } 56 57 void lcl_SetMinMax(MetricField& rField, long nFirst, long nLast, long nMin, long nMax) 58 { 59 rField.SetFirst( rField.Normalize( nFirst ), FUNIT_TWIP ); 60 rField.SetLast( rField.Normalize( nLast ), FUNIT_TWIP ); 61 rField.SetMin( rField.Normalize( nMin ), FUNIT_TWIP ); 62 rField.SetMax( rField.Normalize( nMax ), FUNIT_TWIP ); 63 } 64 65 /*-------------------------------------------------------------------- 66 Beschreibung: Rastereinstellungen Ctor 67 --------------------------------------------------------------------*/ 68 69 SvxOptionsGrid::SvxOptionsGrid() : 70 nFldDrawX ( 100 ), 71 nFldDivisionX ( 0 ), 72 nFldDrawY ( 100 ), 73 nFldDivisionY ( 0 ), 74 nFldSnapX ( 100 ), 75 nFldSnapY ( 100 ), 76 bUseGridsnap ( 0 ), 77 bSynchronize ( 1 ), 78 bGridVisible ( 0 ), 79 bEqualGrid ( 1 ) 80 { 81 } 82 83 /*-------------------------------------------------------------------- 84 Beschreibung: Rastereinstellungen Dtor 85 --------------------------------------------------------------------*/ 86 87 SvxOptionsGrid::~SvxOptionsGrid() 88 { 89 } 90 91 /*-------------------------------------------------------------------- 92 Beschreibung: Item fuer Rastereinstellungen 93 --------------------------------------------------------------------*/ 94 95 SvxGridItem::SvxGridItem( const SvxGridItem& rItem ) 96 : SvxOptionsGrid() 97 , SfxPoolItem(rItem) 98 { 99 bUseGridsnap = rItem.bUseGridsnap ; 100 bSynchronize = rItem.bSynchronize ; 101 bGridVisible = rItem.bGridVisible ; 102 bEqualGrid = rItem.bEqualGrid ; 103 nFldDrawX = rItem.nFldDrawX ; 104 nFldDivisionX= rItem.nFldDivisionX; 105 nFldDrawY = rItem.nFldDrawY ; 106 nFldDivisionY= rItem.nFldDivisionY; 107 nFldSnapX = rItem.nFldSnapX ; 108 nFldSnapY = rItem.nFldSnapY ; 109 110 }; 111 112 /*-------------------------------------------------------------------- 113 Beschreibung: 114 --------------------------------------------------------------------*/ 115 116 SfxPoolItem* SvxGridItem::Clone( SfxItemPool* ) const 117 { 118 return new SvxGridItem( *this ); 119 } 120 121 /*-------------------------------------------------------------------- 122 Beschreibung: 123 --------------------------------------------------------------------*/ 124 125 int SvxGridItem::operator==( const SfxPoolItem& rAttr ) const 126 { 127 DBG_ASSERT( SfxPoolItem::operator==(rAttr), "unterschiedliche Typen" ); 128 129 const SvxGridItem& rItem = (const SvxGridItem&) rAttr; 130 131 return ( bUseGridsnap == rItem.bUseGridsnap && 132 bSynchronize == rItem.bSynchronize && 133 bGridVisible == rItem.bGridVisible && 134 bEqualGrid == rItem.bEqualGrid && 135 nFldDrawX == rItem.nFldDrawX && 136 nFldDivisionX== rItem.nFldDivisionX&& 137 nFldDrawY == rItem.nFldDrawY && 138 nFldDivisionY== rItem.nFldDivisionY&& 139 nFldSnapX == rItem.nFldSnapX && 140 nFldSnapY == rItem.nFldSnapY ); 141 } 142 143 /*-------------------------------------------------------------------- 144 Beschreibung: 145 --------------------------------------------------------------------*/ 146 147 SfxItemPresentation SvxGridItem::GetPresentation 148 ( 149 SfxItemPresentation ePres, 150 SfxMapUnit /*eCoreUnit*/, 151 SfxMapUnit /*ePresUnit*/, 152 String& rText, const IntlWrapper * 153 ) const 154 { 155 switch ( ePres ) 156 { 157 case SFX_ITEM_PRESENTATION_NONE: 158 rText.Erase(); 159 return SFX_ITEM_PRESENTATION_NONE; 160 case SFX_ITEM_PRESENTATION_NAMELESS: 161 case SFX_ITEM_PRESENTATION_COMPLETE: 162 rText = String::CreateFromAscii("SvxGridItem"); 163 return ePres; 164 default: 165 return SFX_ITEM_PRESENTATION_NONE; 166 } 167 } 168 169 170 /*----------------- OS 23.02.95 ----------------------- 171 TabPage Rastereinstellungen 172 -------------------------------------------------------*/ 173 174 SvxGridTabPage::SvxGridTabPage( Window* pParent, const SfxItemSet& rCoreSet) : 175 176 SfxTabPage( pParent, SVX_RES( RID_SVXPAGE_GRID ), rCoreSet ), 177 178 aCbxUseGridsnap ( this, SVX_RES( CBX_USE_GRIDSNAP ) ), 179 aCbxGridVisible ( this, SVX_RES( CBX_GRID_VISIBLE ) ), 180 181 aFlResolution ( this, SVX_RES( FL_RESOLUTION ) ), 182 aFtDrawX ( this, SVX_RES( FT_DRAW_X ) ), 183 aMtrFldDrawX ( this, SVX_RES( MTR_FLD_DRAW_X ) ), 184 aFtDrawY ( this, SVX_RES( FT_DRAW_Y ) ), 185 aMtrFldDrawY ( this, SVX_RES( MTR_FLD_DRAW_Y ) ), 186 187 aFlDivision ( this, SVX_RES( FL_DIVISION ) ), 188 aFtDivisionX( this, SVX_RES( FT_DIVISION_X) ), 189 aNumFldDivisionX( this, SVX_RES( NUM_FLD_DIVISION_X ) ), 190 aDivisionPointX( this, SVX_RES( FT_HORZ_POINTS) ), 191 192 aFtDivisionY( this, SVX_RES( FT_DIVISION_Y) ), 193 aNumFldDivisionY( this, SVX_RES( NUM_FLD_DIVISION_Y ) ), 194 aDivisionPointY( this, SVX_RES( FT_VERT_POINTS) ), 195 196 aCbxSynchronize ( this, SVX_RES( CBX_SYNCHRONIZE ) ), 197 aGrpDrawGrid ( this, SVX_RES( GRP_DRAWGRID ) ), 198 199 aGrpSnap ( this, SVX_RES( GRP_SNAP ) ), 200 aCbxSnapHelplines ( this, SVX_RES( CBX_SNAP_HELPLINES ) ), 201 aCbxSnapBorder ( this, SVX_RES( CBX_SNAP_BORDER ) ), 202 aCbxSnapFrame ( this, SVX_RES( CBX_SNAP_FRAME ) ), 203 aCbxSnapPoints ( this, SVX_RES( CBX_SNAP_POINTS ) ), 204 aFtSnapArea ( this, SVX_RES( FT_SNAP_AREA ) ), 205 aMtrFldSnapArea ( this, SVX_RES( MTR_FLD_SNAP_AREA ) ), 206 207 aSeparatorFL ( this, SVX_RES( FL_SEPARATOR ) ), 208 209 aGrpOrtho ( this, SVX_RES( GRP_ORTHO ) ), 210 aCbxOrtho ( this, SVX_RES( CBX_ORTHO ) ), 211 aCbxBigOrtho ( this, SVX_RES( CBX_BIGORTHO ) ), 212 aCbxRotate ( this, SVX_RES( CBX_ROTATE ) ), 213 aMtrFldAngle ( this, SVX_RES( MTR_FLD_ANGLE ) ), 214 aFtBezAngle ( this, SVX_RES( FT_BEZ_ANGLE ) ), 215 aMtrFldBezAngle ( this, SVX_RES( MTR_FLD_BEZ_ANGLE ) ), 216 217 bAttrModified( sal_False ) 218 { 219 // diese Page braucht ExchangeSupport 220 SetExchangeSupport(); 221 222 FreeResource(); 223 224 aDivisionPointY.SetText(aDivisionPointX.GetText()); 225 // Metrik einstellen 226 FieldUnit eFUnit = GetModuleFieldUnit( rCoreSet ); 227 long nFirst, nLast, nMin, nMax; 228 229 lcl_GetMinMax(aMtrFldDrawX, nFirst, nLast, nMin, nMax); 230 SetFieldUnit( aMtrFldDrawX, eFUnit, sal_True ); 231 lcl_SetMinMax(aMtrFldDrawX, nFirst, nLast, nMin, nMax); 232 233 lcl_GetMinMax(aMtrFldDrawY, nFirst, nLast, nMin, nMax); 234 SetFieldUnit( aMtrFldDrawY, eFUnit, sal_True ); 235 lcl_SetMinMax(aMtrFldDrawY, nFirst, nLast, nMin, nMax); 236 237 238 aCbxRotate.SetClickHdl( LINK( this, SvxGridTabPage, ClickRotateHdl_Impl ) ); 239 Link aLink = LINK( this, SvxGridTabPage, ChangeGridsnapHdl_Impl ); 240 aCbxUseGridsnap.SetClickHdl( aLink ); 241 aCbxSynchronize.SetClickHdl( aLink ); 242 aCbxGridVisible.SetClickHdl( aLink ); 243 aMtrFldDrawX.SetModifyHdl( 244 LINK( this, SvxGridTabPage, ChangeDrawHdl_Impl ) ); 245 aMtrFldDrawY.SetModifyHdl( 246 LINK( this, SvxGridTabPage, ChangeDrawHdl_Impl ) ); 247 aNumFldDivisionX.SetModifyHdl( 248 LINK( this, SvxGridTabPage, ChangeDivisionHdl_Impl ) ); 249 aNumFldDivisionY.SetModifyHdl( 250 LINK( this, SvxGridTabPage, ChangeDivisionHdl_Impl ) ); 251 252 ::rtl::OUString sFlResolution( aFlResolution.GetDisplayText() ); 253 ::rtl::OUString sFtDrawX(aFtDrawX.GetDisplayText()); 254 ::rtl::OUString sFtDrawY(aFtDrawY.GetDisplayText()); 255 aMtrFldDrawX.SetAccessibleName( sFtDrawX + sFlResolution ); 256 aMtrFldDrawY.SetAccessibleName( sFtDrawY + sFlResolution ); 257 ::rtl::OUString sFlDivision( aFlDivision.GetDisplayText() ); 258 ::rtl::OUString sFtDivisionX(aFtDivisionX.GetDisplayText()); 259 ::rtl::OUString sFtDivisionY(aFtDivisionY.GetDisplayText()); 260 aNumFldDivisionX.SetAccessibleName( sFtDivisionX + sFlDivision ); 261 aNumFldDivisionY.SetAccessibleName( sFtDivisionY + sFlDivision ); 262 } 263 264 //------------------------------------------------------------------------ 265 266 SfxTabPage* SvxGridTabPage::Create( Window* pParent, const SfxItemSet& rAttrSet ) 267 { 268 return ( new SvxGridTabPage( pParent, rAttrSet ) ); 269 } 270 271 //------------------------------------------------------------------------ 272 273 sal_Bool SvxGridTabPage::FillItemSet( SfxItemSet& rCoreSet ) 274 { 275 if ( bAttrModified ) 276 { 277 SvxGridItem aGridItem( SID_ATTR_GRID_OPTIONS ); 278 279 aGridItem.bUseGridsnap = aCbxUseGridsnap.IsChecked(); 280 aGridItem.bSynchronize = aCbxSynchronize.IsChecked(); 281 aGridItem.bGridVisible = aCbxGridVisible.IsChecked(); 282 283 SfxMapUnit eUnit = 284 rCoreSet.GetPool()->GetMetric( GetWhich( SID_ATTR_GRID_OPTIONS ) ); 285 long nX =GetCoreValue( aMtrFldDrawX, eUnit ); 286 long nY = GetCoreValue( aMtrFldDrawY, eUnit ); 287 288 aGridItem.nFldDrawX = (sal_uInt32) nX; 289 aGridItem.nFldDrawY = (sal_uInt32) nY; 290 aGridItem.nFldDivisionX = static_cast<long>(aNumFldDivisionX.GetValue()-1); 291 aGridItem.nFldDivisionY = static_cast<long>(aNumFldDivisionY.GetValue()-1); 292 293 rCoreSet.Put( aGridItem ); 294 } 295 return bAttrModified; 296 } 297 298 //------------------------------------------------------------------------ 299 300 void SvxGridTabPage::Reset( const SfxItemSet& rSet ) 301 { 302 const SfxPoolItem* pAttr = 0; 303 304 if( SFX_ITEM_SET == rSet.GetItemState( SID_ATTR_GRID_OPTIONS , sal_False, 305 (const SfxPoolItem**)&pAttr )) 306 { 307 const SvxGridItem* pGridAttr = (SvxGridItem*)pAttr; 308 aCbxUseGridsnap.Check( pGridAttr->bUseGridsnap == 1 ); 309 aCbxSynchronize.Check( pGridAttr->bSynchronize == 1 ); 310 aCbxGridVisible.Check( pGridAttr->bGridVisible == 1 ); 311 312 SfxMapUnit eUnit = 313 rSet.GetPool()->GetMetric( GetWhich( SID_ATTR_GRID_OPTIONS ) ); 314 SetMetricValue( aMtrFldDrawX , pGridAttr->nFldDrawX, eUnit ); 315 SetMetricValue( aMtrFldDrawY , pGridAttr->nFldDrawY, eUnit ); 316 317 aNumFldDivisionX.SetValue( pGridAttr->nFldDivisionX+1 ); 318 aNumFldDivisionY.SetValue( pGridAttr->nFldDivisionY+1 ); 319 } 320 321 ChangeGridsnapHdl_Impl( &aCbxUseGridsnap ); 322 bAttrModified = sal_False; 323 } 324 325 // ----------------------------------------------------------------------- 326 327 void SvxGridTabPage::ActivatePage( const SfxItemSet& rSet ) 328 { 329 const SfxPoolItem* pAttr = NULL; 330 if( SFX_ITEM_SET == rSet.GetItemState( SID_ATTR_GRID_OPTIONS , sal_False, 331 (const SfxPoolItem**)&pAttr )) 332 { 333 const SvxGridItem* pGridAttr = (SvxGridItem*) pAttr; 334 aCbxUseGridsnap.Check( pGridAttr->bUseGridsnap == 1 ); 335 336 ChangeGridsnapHdl_Impl( &aCbxUseGridsnap ); 337 } 338 339 // Metrik ggfs. aendern (da TabPage im Dialog liegt, 340 // wo die Metrik eingestellt werden kann 341 //sal_uInt16 nWhich = GetWhich( SID_ATTR_METRIC ); 342 //if( rSet.GetItemState( GetWhich( SID_ATTR_METRIC ) ) >= SFX_ITEM_AVAILABLE ) 343 if( SFX_ITEM_SET == rSet.GetItemState( SID_ATTR_METRIC , sal_False, 344 (const SfxPoolItem**)&pAttr )) 345 { 346 const SfxUInt16Item* pItem = (SfxUInt16Item*) pAttr; 347 348 FieldUnit eFUnit = (FieldUnit)(long)pItem->GetValue(); 349 350 if( eFUnit != aMtrFldDrawX.GetUnit() ) 351 { 352 // Metriken einstellen 353 long nFirst, nLast, nMin, nMax; 354 long nVal = static_cast<long>(aMtrFldDrawX.Denormalize( aMtrFldDrawX.GetValue( FUNIT_TWIP ) )); 355 356 lcl_GetMinMax(aMtrFldDrawX, nFirst, nLast, nMin, nMax); 357 SetFieldUnit( aMtrFldDrawX, eFUnit, sal_True ); 358 lcl_SetMinMax(aMtrFldDrawX, nFirst, nLast, nMin, nMax); 359 360 aMtrFldDrawX.SetValue( aMtrFldDrawX.Normalize( nVal ), FUNIT_TWIP ); 361 362 nVal = static_cast<long>(aMtrFldDrawY.Denormalize( aMtrFldDrawY.GetValue( FUNIT_TWIP ) )); 363 lcl_GetMinMax(aMtrFldDrawY, nFirst, nLast, nMin, nMax); 364 SetFieldUnit( aMtrFldDrawY, eFUnit, sal_True ); 365 lcl_SetMinMax(aMtrFldDrawY, nFirst, nLast, nMin, nMax); 366 aMtrFldDrawY.SetValue( aMtrFldDrawY.Normalize( nVal ), FUNIT_TWIP ); 367 368 } 369 } 370 } 371 372 // ----------------------------------------------------------------------- 373 int SvxGridTabPage::DeactivatePage( SfxItemSet* _pSet ) 374 { 375 if ( _pSet ) 376 FillItemSet( *_pSet ); 377 return( LEAVE_PAGE ); 378 } 379 //------------------------------------------------------------------------ 380 IMPL_LINK( SvxGridTabPage, ChangeDrawHdl_Impl, MetricField *, pField ) 381 { 382 bAttrModified = sal_True; 383 if( aCbxSynchronize.IsChecked() ) 384 { 385 if(pField == &aMtrFldDrawX) 386 aMtrFldDrawY.SetValue( aMtrFldDrawX.GetValue() ); 387 else 388 aMtrFldDrawX.SetValue( aMtrFldDrawY.GetValue() ); 389 } 390 return 0; 391 } 392 //------------------------------------------------------------------------ 393 394 IMPL_LINK( SvxGridTabPage, ClickRotateHdl_Impl, void *, EMPTYARG ) 395 { 396 if( aCbxRotate.IsChecked() ) 397 aMtrFldAngle.Enable(); 398 else 399 aMtrFldAngle.Disable(); 400 401 return( 0L ); 402 } 403 404 //------------------------------------------------------------------------ 405 406 IMPL_LINK( SvxGridTabPage, ChangeDivisionHdl_Impl, NumericField *, pField ) 407 { 408 bAttrModified = sal_True; 409 if( aCbxSynchronize.IsChecked() ) 410 { 411 if(&aNumFldDivisionX == pField) 412 aNumFldDivisionY.SetValue( aNumFldDivisionX.GetValue() ); 413 else 414 aNumFldDivisionX.SetValue( aNumFldDivisionY.GetValue() ); 415 } 416 return 0; 417 } 418 //------------------------------------------------------------------------ 419 420 IMPL_LINK( SvxGridTabPage, ChangeGridsnapHdl_Impl, void *, EMPTYARG ) 421 { 422 bAttrModified = sal_True; 423 return 0; 424 } 425 426 427