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