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 #include <svx/svdundo.hxx> 31 #include <sfx2/app.hxx> 32 #include <sfx2/request.hxx> 33 #include <sfx2/objface.hxx> 34 #include <sfx2/viewsh.hxx> 35 #include "svx/unoapi.hxx" 36 #include <com/sun/star/drawing/XShape.hpp> 37 #include <com/sun/star/drawing/XEnhancedCustomShapeDefaulter.hpp> 38 #include <svx/dialmgr.hxx> 39 #include <svx/svdoashp.hxx> 40 #ifndef _SVX_DIALOGS_HRC 41 #include <svx/dialogs.hrc> 42 #endif 43 #include <svx/svdview.hxx> 44 #include <svx/sdasitm.hxx> 45 #include <svx/svdoashp.hxx> 46 #include <com/sun/star/drawing/EnhancedCustomShapeAdjustmentValue.hpp> 47 #include <sfx2/bindings.hxx> 48 #include <editeng/eeitem.hxx> 49 #include <editeng/charscaleitem.hxx> 50 #include <editeng/kernitem.hxx> 51 #include <svx/sdrpaintwindow.hxx> 52 53 #include <svx/svxids.hrc> 54 #include <svx/fontworkbar.hxx> 55 #include "svx/fontworkgallery.hxx" 56 57 using ::rtl::OUString; 58 59 using namespace ::svx; 60 using namespace ::cppu; 61 using namespace ::com::sun::star; 62 using namespace ::com::sun::star::beans; 63 using namespace ::com::sun::star::uno; 64 65 void SetAlignmentState( SdrView* pSdrView, SfxItemSet& rSet ) 66 { 67 const SdrMarkList& rMarkList = pSdrView->GetMarkedObjectList(); 68 sal_uIntPtr nCount = rMarkList.GetMarkCount(), i; 69 70 sal_Int32 nAlignment = -1; 71 for( i = 0; i < nCount; i++ ) 72 { 73 SdrObject* pObj = rMarkList.GetMark( i )->GetMarkedSdrObj(); 74 if( pObj->ISA(SdrObjCustomShape) ) 75 { 76 sal_Int32 nOldAlignment = nAlignment; 77 SdrTextHorzAdjustItem& rTextHorzAdjustItem = (SdrTextHorzAdjustItem&)pObj->GetMergedItem( SDRATTR_TEXT_HORZADJUST ); 78 SdrTextFitToSizeTypeItem& rTextFitToSizeTypeItem = (SdrTextFitToSizeTypeItem&)pObj->GetMergedItem( SDRATTR_TEXT_FITTOSIZE ); 79 switch ( rTextHorzAdjustItem.GetValue() ) 80 { 81 case SDRTEXTHORZADJUST_LEFT : nAlignment = 0; break; 82 case SDRTEXTHORZADJUST_CENTER : nAlignment = 1; break; 83 case SDRTEXTHORZADJUST_RIGHT : nAlignment = 2; break; 84 case SDRTEXTHORZADJUST_BLOCK : 85 { 86 if ( rTextFitToSizeTypeItem.GetValue() == SDRTEXTFIT_NONE ) 87 nAlignment = 3; 88 else if ( rTextFitToSizeTypeItem.GetValue() == SDRTEXTFIT_ALLLINES ) 89 nAlignment = 4; 90 } 91 } 92 if ( ( nOldAlignment != -1 ) && ( nOldAlignment != nAlignment ) ) 93 { 94 nAlignment = -1; 95 break; 96 } 97 } 98 } 99 rSet.Put( SfxInt32Item( SID_FONTWORK_ALIGNMENT, nAlignment ) ); 100 } 101 102 void SetCharacterSpacingState( SdrView* pSdrView, SfxItemSet& rSet ) 103 { 104 const SdrMarkList& rMarkList = pSdrView->GetMarkedObjectList(); 105 sal_uIntPtr nCount = rMarkList.GetMarkCount(), i; 106 107 sal_Int32 nCharacterSpacing = -1; 108 for( i = 0; i < nCount; i++ ) 109 { 110 SdrObject* pObj = rMarkList.GetMark( i )->GetMarkedSdrObj(); 111 if( pObj->ISA(SdrObjCustomShape) ) 112 { 113 sal_Int32 nOldCharacterSpacing = nCharacterSpacing; 114 SvxCharScaleWidthItem& rCharScaleWidthItem = (SvxCharScaleWidthItem&)pObj->GetMergedItem( EE_CHAR_FONTWIDTH ); 115 nCharacterSpacing = rCharScaleWidthItem.GetValue(); 116 if ( ( nOldCharacterSpacing != -1 ) && ( nOldCharacterSpacing != nCharacterSpacing ) ) 117 { 118 nCharacterSpacing = -1; 119 break; 120 } 121 } 122 } 123 rSet.Put( SfxInt32Item( SID_FONTWORK_CHARACTER_SPACING, nCharacterSpacing ) ); 124 } 125 126 127 void SetKernCharacterPairsState( SdrView* pSdrView, SfxItemSet& rSet ) 128 { 129 const SdrMarkList& rMarkList = pSdrView->GetMarkedObjectList(); 130 sal_uIntPtr nCount = rMarkList.GetMarkCount(), i; 131 132 sal_Bool bChecked = sal_False; 133 for( i = 0; i < nCount; i++ ) 134 { 135 SdrObject* pObj = rMarkList.GetMark( i )->GetMarkedSdrObj(); 136 if( pObj->ISA(SdrObjCustomShape) ) 137 { 138 SvxKerningItem& rKerningItem = (SvxKerningItem&)pObj->GetMergedItem( EE_CHAR_KERNING ); 139 if ( rKerningItem.GetValue() ) 140 bChecked = sal_True; 141 } 142 } 143 rSet.Put( SfxBoolItem( SID_FONTWORK_KERN_CHARACTER_PAIRS, bChecked ) ); 144 } 145 146 void SetFontWorkShapeTypeState( SdrView* pSdrView, SfxItemSet& rSet ) 147 { 148 const SdrMarkList& rMarkList = pSdrView->GetMarkedObjectList(); 149 sal_uIntPtr nCount = rMarkList.GetMarkCount(), i; 150 151 rtl::OUString aFontWorkShapeType; 152 153 for( i = 0; i < nCount; i++ ) 154 { 155 SdrObject* pObj = rMarkList.GetMark( i )->GetMarkedSdrObj(); 156 if( pObj->ISA( SdrObjCustomShape ) ) 157 { 158 const rtl::OUString sType( RTL_CONSTASCII_USTRINGPARAM ( "Type" ) ); 159 SdrCustomShapeGeometryItem aGeometryItem( (SdrCustomShapeGeometryItem&)pObj->GetMergedItem( SDRATTR_CUSTOMSHAPE_GEOMETRY ) ); 160 Any* pAny = aGeometryItem.GetPropertyValueByName( sType ); 161 if( pAny ) 162 { 163 rtl::OUString aType; 164 if ( *pAny >>= aType ) 165 { 166 if ( aFontWorkShapeType.getLength() ) 167 { 168 if ( !aFontWorkShapeType.equals( aType ) ) // different FontWorkShapeTypes selected ? 169 { 170 aFontWorkShapeType = rtl::OUString(); 171 break; 172 } 173 } 174 aFontWorkShapeType = aType; 175 } 176 } 177 } 178 } 179 rSet.Put( SfxStringItem( SID_FONTWORK_SHAPE_TYPE, aFontWorkShapeType ) ); 180 } 181 182 /************************************************************************* 183 |* 184 |* Standardinterface deklarieren (Die Slotmap darf nicht leer sein, also 185 |* tragen wir etwas ein, was hier (hoffentlich) nie vorkommt). 186 |* 187 \************************************************************************/ 188 189 #define ShellClass FontworkBar 190 191 SFX_SLOTMAP(FontworkBar) 192 { 193 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } 194 }; 195 196 SFX_IMPL_INTERFACE(FontworkBar, SfxShell, SVX_RES(RID_SVX_FONTWORK_BAR)) 197 { 198 SFX_OBJECTBAR_REGISTRATION( SFX_OBJECTBAR_OBJECT, SVX_RES(RID_SVX_FONTWORK_BAR) ); 199 } 200 201 TYPEINIT1( FontworkBar, SfxShell ); 202 203 204 /************************************************************************* 205 |* 206 |* Standard-Konstruktor 207 |* 208 \************************************************************************/ 209 210 FontworkBar::FontworkBar(SfxViewShell* pViewShell ) 211 : SfxShell(pViewShell) 212 { 213 DBG_ASSERT( pViewShell, "svx::FontworkBar::FontworkBar(), I need a viewshell!" ); 214 if( pViewShell ) 215 SetPool(&pViewShell->GetPool()); 216 217 SetHelpId( SVX_INTERFACE_FONTWORK_BAR ); 218 SetName( String( SVX_RES( RID_SVX_FONTWORK_BAR) )); 219 } 220 221 222 /************************************************************************* 223 |* 224 |* Destruktor 225 |* 226 \************************************************************************/ 227 228 FontworkBar::~FontworkBar() 229 { 230 SetRepeatTarget(NULL); 231 } 232 233 static Window* ImpGetViewWin(SdrView* pView) 234 { 235 if( pView ) 236 { 237 const sal_uInt32 nAnz(pView->PaintWindowCount()); 238 for(sal_uInt32 nNum(0L); nNum < nAnz; nNum++) 239 { 240 OutputDevice* pOut = &(pView->GetPaintWindow(nNum)->GetOutputDevice()); 241 242 if(OUTDEV_WINDOW == pOut->GetOutDevType()) 243 { 244 return (Window*)pOut; 245 } 246 } 247 } 248 249 return 0L; 250 } 251 252 namespace svx { 253 bool checkForSelectedFontWork( SdrView* pSdrView, sal_uInt32& nCheckStatus ) 254 { 255 if ( nCheckStatus & 2 ) 256 return ( nCheckStatus & 1 ) != 0; 257 258 static const rtl::OUString sTextPath( RTL_CONSTASCII_USTRINGPARAM ( "TextPath" ) ); 259 260 const SdrMarkList& rMarkList = pSdrView->GetMarkedObjectList(); 261 sal_uIntPtr nCount = rMarkList.GetMarkCount(), i; 262 sal_Bool bFound = sal_False; 263 for(i=0;(i<nCount) && !bFound ; i++) 264 { 265 SdrObject* pObj = rMarkList.GetMark(i)->GetMarkedSdrObj(); 266 if( pObj->ISA(SdrObjCustomShape) ) 267 { 268 SdrCustomShapeGeometryItem aGeometryItem( (SdrCustomShapeGeometryItem&)pObj->GetMergedItem( SDRATTR_CUSTOMSHAPE_GEOMETRY ) ); 269 Any* pAny = aGeometryItem.GetPropertyValueByName( sTextPath, sTextPath ); 270 if( pAny ) 271 *pAny >>= bFound; 272 } 273 } 274 if ( bFound ) 275 nCheckStatus |= 1; 276 nCheckStatus |= 2; 277 return bFound; 278 } 279 } 280 281 static void impl_execute( SdrView*, SfxRequest& rReq, SdrCustomShapeGeometryItem& rGeometryItem, SdrObject* pObj ) 282 { 283 static const rtl::OUString sTextPath( RTL_CONSTASCII_USTRINGPARAM ( "TextPath" ) ); 284 static const rtl::OUString sSameLetterHeights( RTL_CONSTASCII_USTRINGPARAM ( "SameLetterHeights" ) ); 285 286 sal_uInt16 nSID = rReq.GetSlot(); 287 switch( nSID ) 288 { 289 case SID_FONTWORK_SAME_LETTER_HEIGHTS: 290 { 291 com::sun::star::uno::Any* pAny = rGeometryItem.GetPropertyValueByName( sTextPath, sSameLetterHeights ); 292 if( pAny ) 293 { 294 sal_Bool bOn; 295 (*pAny) >>= bOn; 296 bOn = !bOn; 297 (*pAny) <<= bOn; 298 } 299 } 300 break; 301 302 case SID_FONTWORK_ALIGNMENT: 303 { 304 if( rReq.GetArgs() && rReq.GetArgs()->GetItemState( SID_FONTWORK_ALIGNMENT ) == SFX_ITEM_SET ) 305 { 306 sal_Int32 nValue = ((const SfxInt32Item*)rReq.GetArgs()->GetItem(SID_FONTWORK_ALIGNMENT))->GetValue(); 307 if ( ( nValue >= 0 ) && ( nValue < 5 ) ) 308 { 309 SdrFitToSizeType eFTS = SDRTEXTFIT_NONE; 310 SdrTextHorzAdjust eHorzAdjust; 311 switch ( nValue ) 312 { 313 case 4 : eFTS = SDRTEXTFIT_ALLLINES; // passthrough 314 case 3 : eHorzAdjust = SDRTEXTHORZADJUST_BLOCK; break; 315 default: 316 case 0 : eHorzAdjust = SDRTEXTHORZADJUST_LEFT; break; 317 case 1 : eHorzAdjust = SDRTEXTHORZADJUST_CENTER; break; 318 case 2 : eHorzAdjust = SDRTEXTHORZADJUST_RIGHT; break; 319 } 320 pObj->SetMergedItem( SdrTextHorzAdjustItem( eHorzAdjust ) ); 321 pObj->SetMergedItem( SdrTextFitToSizeTypeItem( eFTS ) ); 322 pObj->BroadcastObjectChange(); 323 } 324 } 325 } 326 break; 327 328 case SID_FONTWORK_CHARACTER_SPACING: 329 { 330 if( rReq.GetArgs() && ( rReq.GetArgs()->GetItemState( SID_FONTWORK_CHARACTER_SPACING ) == SFX_ITEM_SET ) ) 331 { 332 sal_Int32 nCharSpacing = ((const SfxInt32Item*)rReq.GetArgs()->GetItem(SID_FONTWORK_CHARACTER_SPACING))->GetValue(); 333 pObj->SetMergedItem( SvxCharScaleWidthItem( (sal_uInt16)nCharSpacing, EE_CHAR_FONTWIDTH ) ); 334 pObj->BroadcastObjectChange(); 335 } 336 } 337 break; 338 339 case SID_FONTWORK_KERN_CHARACTER_PAIRS: 340 { 341 if( rReq.GetArgs() && ( rReq.GetArgs()->GetItemState( SID_FONTWORK_KERN_CHARACTER_PAIRS ) == SFX_ITEM_SET ) ) 342 { 343 // sal_Bool bKernCharacterPairs = ((const SfxBoolItem*)rReq.GetArgs()->GetItem(SID_FONTWORK_KERN_CHARACTER_PAIRS))->GetValue(); 344 //TODO: pObj->SetMergedItem( SvxCharScaleWidthItem( (sal_uInt16)nCharSpacing, EE_CHAR_FONTWIDTH ) ); 345 pObj->BroadcastObjectChange(); 346 } 347 } 348 break; 349 } 350 } 351 352 #include "svx/gallery.hxx" 353 #include <svx/fmmodel.hxx> 354 #include <svx/fmpage.hxx> 355 #include <svl/itempool.hxx> 356 357 void GetGeometryForCustomShape( SdrCustomShapeGeometryItem& rGeometryItem, const rtl::OUString rCustomShape ) 358 { 359 const rtl::OUString sType( RTL_CONSTASCII_USTRINGPARAM ( "Type" ) ); 360 361 com::sun::star::beans::PropertyValue aPropVal; 362 aPropVal.Name = sType; 363 aPropVal.Value <<= rCustomShape; 364 rGeometryItem.SetPropertyValue( aPropVal ); 365 366 const rtl::OUString sAdjustmentValues( RTL_CONSTASCII_USTRINGPARAM ( "AdjustmentValues" ) ); 367 const rtl::OUString sCoordinateOrigin( RTL_CONSTASCII_USTRINGPARAM ( "CoordinateOrigin" ) ); 368 const rtl::OUString sCoordinateSize( RTL_CONSTASCII_USTRINGPARAM ( "CoordinateSize" ) ); 369 const rtl::OUString sEquations( RTL_CONSTASCII_USTRINGPARAM ( "Equations" ) ); 370 const rtl::OUString sHandles( RTL_CONSTASCII_USTRINGPARAM ( "Handles" ) ); 371 const rtl::OUString sPath( RTL_CONSTASCII_USTRINGPARAM ( "Path" ) ); 372 rGeometryItem.ClearPropertyValue( sAdjustmentValues ); 373 rGeometryItem.ClearPropertyValue( sCoordinateOrigin ); 374 rGeometryItem.ClearPropertyValue( sCoordinateSize ); 375 rGeometryItem.ClearPropertyValue( sEquations ); 376 rGeometryItem.ClearPropertyValue( sHandles ); 377 rGeometryItem.ClearPropertyValue( sPath ); 378 379 /* SJ: CustomShapes that are available in the gallery are having the highest 380 priority, so we will take a look there before taking the internal default */ 381 382 if ( GalleryExplorer::GetSdrObjCount( GALLERY_THEME_POWERPOINT ) ) 383 { 384 std::vector< rtl::OUString > aObjList; 385 if ( GalleryExplorer::FillObjListTitle( GALLERY_THEME_POWERPOINT, aObjList ) ) 386 { 387 sal_uInt16 i; 388 for ( i = 0; i < aObjList.size(); i++ ) 389 { 390 if ( aObjList[ i ].equalsIgnoreAsciiCase( rCustomShape ) ) 391 { 392 FmFormModel aFormModel; 393 SfxItemPool& rPool = aFormModel.GetItemPool(); 394 rPool.FreezeIdRanges(); 395 if ( GalleryExplorer::GetSdrObj( GALLERY_THEME_POWERPOINT, i, &aFormModel ) ) 396 { 397 const SdrObject* pSourceObj = aFormModel.GetPage( 0 )->GetObj( 0 ); 398 if( pSourceObj ) 399 { 400 PropertyValue aPropVal_; 401 SdrCustomShapeGeometryItem& rSourceGeometry = (SdrCustomShapeGeometryItem&)pSourceObj->GetMergedItem( SDRATTR_CUSTOMSHAPE_GEOMETRY ); 402 com::sun::star::uno::Any* pAny = rSourceGeometry.GetPropertyValueByName( sType ); 403 if ( pAny ) 404 { 405 aPropVal_.Name = sType; 406 aPropVal_.Value = *pAny; 407 rGeometryItem.SetPropertyValue( aPropVal_ ); 408 } 409 pAny = rSourceGeometry.GetPropertyValueByName( sAdjustmentValues ); 410 if ( pAny ) 411 { 412 aPropVal_.Name = sAdjustmentValues; 413 aPropVal_.Value = *pAny; 414 rGeometryItem.SetPropertyValue( aPropVal_ ); 415 } 416 pAny = rSourceGeometry.GetPropertyValueByName( sCoordinateOrigin ); 417 if ( pAny ) 418 { 419 aPropVal_.Name = sCoordinateOrigin; 420 aPropVal_.Value = *pAny; 421 rGeometryItem.SetPropertyValue( aPropVal_ ); 422 } 423 pAny = rSourceGeometry.GetPropertyValueByName( sCoordinateSize ); 424 if ( pAny ) 425 { 426 aPropVal_.Name = sCoordinateSize; 427 aPropVal_.Value = *pAny; 428 rGeometryItem.SetPropertyValue( aPropVal_ ); 429 } 430 pAny = rSourceGeometry.GetPropertyValueByName( sEquations ); 431 if ( pAny ) 432 { 433 aPropVal_.Name = sEquations; 434 aPropVal_.Value = *pAny; 435 rGeometryItem.SetPropertyValue( aPropVal_ ); 436 } 437 pAny = rSourceGeometry.GetPropertyValueByName( sHandles ); 438 if ( pAny ) 439 { 440 aPropVal_.Name = sHandles; 441 aPropVal_.Value = *pAny; 442 rGeometryItem.SetPropertyValue( aPropVal_ ); 443 } 444 pAny = rSourceGeometry.GetPropertyValueByName( sPath ); 445 if ( pAny ) 446 { 447 aPropVal_.Name = sPath; 448 aPropVal_.Value = *pAny; 449 rGeometryItem.SetPropertyValue( aPropVal_ ); 450 } 451 } 452 } 453 } 454 } 455 } 456 } 457 } 458 459 460 void FontworkBar::execute( SdrView* pSdrView, SfxRequest& rReq, SfxBindings& rBindings ) 461 { 462 sal_uInt16 nStrResId = 0; 463 464 sal_uInt16 nSID = rReq.GetSlot(); 465 switch( nSID ) 466 { 467 case SID_FONTWORK_GALLERY_FLOATER: 468 { 469 FontWorkGalleryDialog aDlg( pSdrView, ImpGetViewWin(pSdrView), nSID ); 470 aDlg.Execute(); 471 } 472 break; 473 474 case SID_FONTWORK_SHAPE_TYPE: 475 { 476 rtl::OUString aCustomShape; 477 const SfxItemSet* pArgs = rReq.GetArgs(); 478 if ( pArgs ) 479 { 480 const SfxStringItem& rItm = (const SfxStringItem&)pArgs->Get( rReq.GetSlot() ); 481 aCustomShape = rItm.GetValue(); 482 } 483 if ( aCustomShape.getLength() ) 484 { 485 const SdrMarkList& rMarkList = pSdrView->GetMarkedObjectList(); 486 sal_uInt32 nCount = rMarkList.GetMarkCount(), i; 487 for( i = 0; i < nCount; i++ ) 488 { 489 SdrObject* pObj = rMarkList.GetMark( i )->GetMarkedSdrObj(); 490 if( pObj->ISA(SdrObjCustomShape) ) 491 { 492 const bool bUndo = pSdrView->IsUndoEnabled(); 493 494 if( bUndo ) 495 { 496 String aStr( SVX_RES( RID_SVXSTR_UNDO_APPLY_FONTWORK_SHAPE ) ); 497 pSdrView->BegUndo( aStr ); 498 pSdrView->AddUndo( pSdrView->GetModel()->GetSdrUndoFactory().CreateUndoAttrObject( *pObj ) ); 499 } 500 SdrCustomShapeGeometryItem aGeometryItem( (SdrCustomShapeGeometryItem&)pObj->GetMergedItem( SDRATTR_CUSTOMSHAPE_GEOMETRY ) ); 501 GetGeometryForCustomShape( aGeometryItem, aCustomShape ); 502 pObj->SetMergedItem( aGeometryItem ); 503 504 Reference< drawing::XShape > aXShape = GetXShapeForSdrObject( (SdrObjCustomShape*)pObj ); 505 if ( aXShape.is() ) 506 { 507 Reference< drawing::XEnhancedCustomShapeDefaulter > xDefaulter( aXShape, UNO_QUERY ); 508 if( xDefaulter.is() ) 509 xDefaulter->createCustomShapeDefaults( aCustomShape ); 510 } 511 512 pObj->BroadcastObjectChange(); 513 if( bUndo ) 514 pSdrView->EndUndo(); 515 pSdrView->AdjustMarkHdl(); //HMH sal_True ); 516 rBindings.Invalidate( SID_FONTWORK_SHAPE_TYPE ); 517 } 518 } 519 } 520 } 521 break; 522 523 case SID_FONTWORK_CHARACTER_SPACING_DIALOG : 524 { 525 if( rReq.GetArgs() && ( rReq.GetArgs()->GetItemState( SID_FONTWORK_CHARACTER_SPACING ) == SFX_ITEM_SET ) ) 526 { 527 sal_Int32 nCharSpacing = ((const SfxInt32Item*)rReq.GetArgs()->GetItem(SID_FONTWORK_CHARACTER_SPACING))->GetValue(); 528 FontworkCharacterSpacingDialog aDlg( 0L, nCharSpacing ); 529 sal_uInt16 nRet = aDlg.Execute(); 530 if( nRet != 0 ) 531 { 532 SfxInt32Item aItem( SID_FONTWORK_CHARACTER_SPACING, aDlg.getScale() ); 533 SfxPoolItem* aItems[] = { &aItem, 0 }; 534 rBindings.Execute( SID_FONTWORK_CHARACTER_SPACING, (const SfxPoolItem**)aItems ); 535 } 536 } 537 } 538 break; 539 540 case SID_FONTWORK_SHAPE: 541 case SID_FONTWORK_ALIGNMENT: 542 { 543 if ( !nStrResId ) 544 nStrResId = RID_SVXSTR_UNDO_APPLY_FONTWORK_ALIGNMENT; 545 } // PASSTROUGH 546 case SID_FONTWORK_CHARACTER_SPACING: 547 { 548 if ( !nStrResId ) 549 nStrResId = RID_SVXSTR_UNDO_APPLY_FONTWORK_CHARACTER_SPACING; 550 } // PASSTROUGH 551 case SID_FONTWORK_KERN_CHARACTER_PAIRS: 552 { 553 if ( !nStrResId ) 554 nStrResId = RID_SVXSTR_UNDO_APPLY_FONTWORK_CHARACTER_SPACING; 555 } // PASSTROUGH 556 case SID_FONTWORK_SAME_LETTER_HEIGHTS: 557 { 558 if ( !nStrResId ) 559 nStrResId = RID_SVXSTR_UNDO_APPLY_FONTWORK_SAME_LETTER_HEIGHT; 560 561 const SdrMarkList& rMarkList = pSdrView->GetMarkedObjectList(); 562 sal_uIntPtr nCount = rMarkList.GetMarkCount(), i; 563 for( i = 0; i < nCount; i++ ) 564 { 565 SdrObject* pObj = rMarkList.GetMark(i)->GetMarkedSdrObj(); 566 if( pObj->ISA(SdrObjCustomShape) ) 567 { 568 const bool bUndo = pSdrView->IsUndoEnabled(); 569 if( bUndo ) 570 { 571 String aStr( SVX_RES( nStrResId ) ); 572 pSdrView->BegUndo( aStr ); 573 pSdrView->AddUndo( pSdrView->GetModel()->GetSdrUndoFactory().CreateUndoAttrObject( *pObj ) ); 574 } 575 SdrCustomShapeGeometryItem aGeometryItem( (SdrCustomShapeGeometryItem&)pObj->GetMergedItem( SDRATTR_CUSTOMSHAPE_GEOMETRY ) ); 576 impl_execute( pSdrView, rReq, aGeometryItem, pObj ); 577 pObj->SetMergedItem( aGeometryItem ); 578 pObj->BroadcastObjectChange(); 579 if( bUndo ) 580 pSdrView->EndUndo(); 581 } 582 } 583 } 584 break; 585 }; 586 } 587 588 void FontworkBar::getState( SdrView* pSdrView, SfxItemSet& rSet ) 589 { 590 sal_uInt32 nCheckStatus = 0; 591 592 /* 593 if ( rSet.GetItemState( SID_FONTWORK_SHAPE ) != SFX_ITEM_UNKNOWN ) 594 { 595 sal_Bool bBreak = sal_True; 596 } 597 */ 598 if ( rSet.GetItemState( SID_FONTWORK_ALIGNMENT_FLOATER ) != SFX_ITEM_UNKNOWN ) 599 { 600 if ( !checkForSelectedFontWork( pSdrView, nCheckStatus ) ) 601 rSet.DisableItem( SID_FONTWORK_ALIGNMENT_FLOATER ); 602 } 603 if ( rSet.GetItemState( SID_FONTWORK_ALIGNMENT ) != SFX_ITEM_UNKNOWN ) 604 { 605 if ( !checkForSelectedFontWork( pSdrView, nCheckStatus ) ) 606 rSet.DisableItem( SID_FONTWORK_ALIGNMENT ); 607 else 608 SetAlignmentState( pSdrView, rSet ); 609 } 610 if ( rSet.GetItemState( SID_FONTWORK_CHARACTER_SPACING_FLOATER ) != SFX_ITEM_UNKNOWN ) 611 { 612 if ( !checkForSelectedFontWork( pSdrView, nCheckStatus ) ) 613 rSet.DisableItem( SID_FONTWORK_CHARACTER_SPACING_FLOATER ); 614 } 615 if ( rSet.GetItemState( SID_FONTWORK_CHARACTER_SPACING ) != SFX_ITEM_UNKNOWN ) 616 { 617 if ( !checkForSelectedFontWork( pSdrView, nCheckStatus ) ) 618 rSet.DisableItem( SID_FONTWORK_CHARACTER_SPACING ); 619 else 620 SetCharacterSpacingState( pSdrView, rSet ); 621 } 622 if ( rSet.GetItemState( SID_FONTWORK_KERN_CHARACTER_PAIRS ) != SFX_ITEM_UNKNOWN ) 623 { 624 if ( !checkForSelectedFontWork( pSdrView, nCheckStatus ) ) 625 rSet.DisableItem( SID_FONTWORK_KERN_CHARACTER_PAIRS ); 626 else 627 SetKernCharacterPairsState( pSdrView, rSet ); 628 } 629 if ( rSet.GetItemState( SID_FONTWORK_SAME_LETTER_HEIGHTS ) != SFX_ITEM_UNKNOWN ) 630 { 631 if ( !checkForSelectedFontWork( pSdrView, nCheckStatus ) ) 632 rSet.DisableItem( SID_FONTWORK_SAME_LETTER_HEIGHTS ); 633 } 634 if ( rSet.GetItemState( SID_FONTWORK_SHAPE_TYPE ) != SFX_ITEM_UNKNOWN ) 635 { 636 if ( !checkForSelectedFontWork( pSdrView, nCheckStatus ) ) 637 rSet.DisableItem( SID_FONTWORK_SHAPE_TYPE ); 638 else 639 SetFontWorkShapeTypeState( pSdrView, rSet ); 640 } 641 } 642