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_sc.hxx" 26 27 #include "fuconcustomshape.hxx" 28 #include <editeng/svxenum.hxx> 29 #include <svx/gallery.hxx> 30 #include <sfx2/request.hxx> 31 #include <svx/fmmodel.hxx> 32 #include <svl/itempool.hxx> 33 #include <svx/svdpage.hxx> 34 #include <svx/svdoashp.hxx> 35 #include <editeng/eeitem.hxx> 36 #include <svx/sdtagitm.hxx> 37 #include "fuconuno.hxx" 38 #include "tabvwsh.hxx" 39 #include "sc.hrc" 40 #include "drawview.hxx" 41 #include <editeng/adjitem.hxx> 42 43 #include <math.h> 44 45 //------------------------------------------------------------------------ 46 47 FuConstCustomShape::FuConstCustomShape( ScTabViewShell* pViewSh, Window* pWin, ScDrawView* pViewP, SdrModel* pDoc, SfxRequest& rReq ) 48 : FuConstruct( pViewSh, pWin, pViewP, pDoc, rReq ) 49 { 50 const SfxItemSet* pArgs = rReq.GetArgs(); 51 if ( pArgs ) 52 { 53 const SfxStringItem& rItm = (const SfxStringItem&)pArgs->Get( rReq.GetSlot() ); 54 aCustomShape = rItm.GetValue(); 55 } 56 } 57 58 /************************************************************************* 59 |* 60 |* Destruktor 61 |* 62 \************************************************************************/ 63 64 FuConstCustomShape::~FuConstCustomShape() 65 { 66 } 67 68 /************************************************************************* 69 |* 70 |* MouseButtonDown-event 71 |* 72 \************************************************************************/ 73 74 sal_Bool __EXPORT FuConstCustomShape::MouseButtonDown(const MouseEvent& rMEvt) 75 { 76 // #95491# remember button state for creation of own MouseEvents 77 SetMouseButtonCode(rMEvt.GetButtons()); 78 79 sal_Bool bReturn = FuConstruct::MouseButtonDown(rMEvt); 80 if ( rMEvt.IsLeft() && !pView->IsAction() ) 81 { 82 Point aPnt( pWindow->PixelToLogic( rMEvt.GetPosPixel() ) ); 83 pWindow->CaptureMouse(); 84 pView->BegCreateObj(aPnt); 85 86 SdrObject* pObj = pView->GetCreateObj(); 87 if ( pObj ) 88 { 89 SetAttributes( pObj ); 90 sal_Bool bForceFillStyle = sal_True; 91 sal_Bool bForceNoFillStyle = sal_False; 92 if ( ((SdrObjCustomShape*)pObj)->UseNoFillStyle() ) 93 { 94 bForceFillStyle = sal_False; 95 bForceNoFillStyle = sal_True; 96 } 97 if ( bForceNoFillStyle ) 98 pObj->SetMergedItem( XFillStyleItem( XFILL_NONE ) ); 99 } 100 101 bReturn = sal_True; 102 } 103 return bReturn; 104 } 105 106 /************************************************************************* 107 |* 108 |* MouseMove-event 109 |* 110 \************************************************************************/ 111 112 sal_Bool __EXPORT FuConstCustomShape::MouseMove(const MouseEvent& rMEvt) 113 { 114 return FuConstruct::MouseMove(rMEvt); 115 } 116 117 /************************************************************************* 118 |* 119 |* MouseButtonUp-event 120 |* 121 \************************************************************************/ 122 123 sal_Bool __EXPORT FuConstCustomShape::MouseButtonUp(const MouseEvent& rMEvt) 124 { 125 // #95491# remember button state for creation of own MouseEvents 126 SetMouseButtonCode(rMEvt.GetButtons()); 127 128 sal_Bool bReturn = sal_False; 129 130 if ( pView->IsCreateObj() && rMEvt.IsLeft() ) 131 { 132 Point aPnt( pWindow->PixelToLogic( rMEvt.GetPosPixel() ) ); 133 pView->EndCreateObj(SDRCREATE_FORCEEND); 134 bReturn = sal_True; 135 } 136 return (FuConstruct::MouseButtonUp(rMEvt) || bReturn); 137 } 138 139 /************************************************************************* 140 |* 141 |* Tastaturereignisse bearbeiten 142 |* 143 |* Wird ein KeyEvent bearbeitet, so ist der Return-Wert sal_True, andernfalls 144 |* FALSE. 145 |* 146 \************************************************************************/ 147 148 sal_Bool __EXPORT FuConstCustomShape::KeyInput(const KeyEvent& rKEvt) 149 { 150 sal_Bool bReturn = FuConstruct::KeyInput(rKEvt); 151 return(bReturn); 152 } 153 154 /************************************************************************* 155 |* 156 |* Function aktivieren 157 |* 158 \************************************************************************/ 159 160 void FuConstCustomShape::Activate() 161 { 162 pView->SetCurrentObj( OBJ_CUSTOMSHAPE, SdrInventor ); 163 164 aNewPointer = Pointer( POINTER_DRAW_RECT ); 165 aOldPointer = pWindow->GetPointer(); 166 pViewShell->SetActivePointer( aNewPointer ); 167 168 SdrLayer* pLayer = pView->GetModel()->GetLayerAdmin().GetLayerPerID(SC_LAYER_CONTROLS); 169 if (pLayer) 170 pView->SetActiveLayer( pLayer->GetName() ); 171 172 FuConstruct::Activate(); 173 } 174 175 /************************************************************************* 176 |* 177 |* Function deaktivieren 178 |* 179 \************************************************************************/ 180 181 void FuConstCustomShape::Deactivate() 182 { 183 FuConstruct::Deactivate(); 184 185 SdrLayer* pLayer = pView->GetModel()->GetLayerAdmin().GetLayerPerID(SC_LAYER_FRONT); 186 if (pLayer) 187 pView->SetActiveLayer( pLayer->GetName() ); 188 189 pViewShell->SetActivePointer( aOldPointer ); 190 } 191 192 // #98185# Create default drawing objects via keyboard 193 SdrObject* FuConstCustomShape::CreateDefaultObject(const sal_uInt16 /* nID */, const Rectangle& rRectangle) 194 { 195 SdrObject* pObj = SdrObjFactory::MakeNewObject( 196 pView->GetCurrentObjInventor(), pView->GetCurrentObjIdentifier(), 197 0L, pDrDoc); 198 if( pObj ) 199 { 200 Rectangle aRectangle( rRectangle ); 201 SetAttributes( pObj ); 202 if ( SdrObjCustomShape::doConstructOrthogonal( aCustomShape ) ) 203 ImpForceQuadratic( aRectangle ); 204 pObj->SetLogicRect( aRectangle ); 205 } 206 return pObj; 207 } 208 209 /************************************************************************* 210 |* 211 |* applying attributes 212 |* 213 \************************************************************************/ 214 215 void FuConstCustomShape::SetAttributes( SdrObject* pObj ) 216 { 217 sal_Bool bAttributesAppliedFromGallery = sal_False; 218 219 if ( GalleryExplorer::GetSdrObjCount( GALLERY_THEME_POWERPOINT ) ) 220 { 221 std::vector< rtl::OUString > aObjList; 222 if ( GalleryExplorer::FillObjListTitle( GALLERY_THEME_POWERPOINT, aObjList ) ) 223 { 224 sal_uInt16 i; 225 for ( i = 0; i < aObjList.size(); i++ ) 226 { 227 if ( aObjList[ i ].equalsIgnoreAsciiCase( aCustomShape ) ) 228 { 229 FmFormModel aFormModel; 230 SfxItemPool& rPool = aFormModel.GetItemPool(); 231 rPool.FreezeIdRanges(); 232 if ( GalleryExplorer::GetSdrObj( GALLERY_THEME_POWERPOINT, i, &aFormModel ) ) 233 { 234 const SdrObject* pSourceObj = aFormModel.GetPage( 0 )->GetObj( 0 ); 235 if( pSourceObj ) 236 { 237 const SfxItemSet& rSource = pSourceObj->GetMergedItemSet(); 238 SfxItemSet aDest( pObj->GetModel()->GetItemPool(), // ranges from SdrAttrObj 239 SDRATTR_START, SDRATTR_SHADOW_LAST, 240 SDRATTR_MISC_FIRST, SDRATTR_MISC_LAST, 241 SDRATTR_TEXTDIRECTION, SDRATTR_TEXTDIRECTION, 242 // Graphic Attributes 243 SDRATTR_GRAF_FIRST, SDRATTR_GRAF_LAST, 244 // 3d Properties 245 SDRATTR_3D_FIRST, SDRATTR_3D_LAST, 246 // CustomShape properties 247 SDRATTR_CUSTOMSHAPE_FIRST, SDRATTR_CUSTOMSHAPE_LAST, 248 // range from SdrTextObj 249 EE_ITEMS_START, EE_ITEMS_END, 250 // end 251 0, 0); 252 aDest.Set( rSource ); 253 pObj->SetMergedItemSet( aDest ); 254 sal_Int32 nAngle = pSourceObj->GetRotateAngle(); 255 if ( nAngle ) 256 { 257 double a = nAngle * F_PI18000; 258 pObj->NbcRotate( pObj->GetSnapRect().Center(), nAngle, sin( a ), cos( a ) ); 259 } 260 bAttributesAppliedFromGallery = sal_True; 261 } 262 } 263 break; 264 } 265 } 266 } 267 } 268 if ( !bAttributesAppliedFromGallery ) 269 { 270 pObj->SetMergedItem( SvxAdjustItem( SVX_ADJUST_CENTER, 0 ) ); 271 pObj->SetMergedItem( SdrTextVertAdjustItem( SDRTEXTVERTADJUST_CENTER ) ); 272 pObj->SetMergedItem( SdrTextHorzAdjustItem( SDRTEXTHORZADJUST_BLOCK ) ); 273 pObj->SetMergedItem( SdrTextAutoGrowHeightItem( sal_False ) ); 274 ((SdrObjCustomShape*)pObj)->MergeDefaultAttributes( &aCustomShape ); 275 } 276 } 277 278 // #i33136# 279 bool FuConstCustomShape::doConstructOrthogonal() const 280 { 281 return SdrObjCustomShape::doConstructOrthogonal(aCustomShape); 282 } 283 284 // eof 285