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_sd.hxx" 30 31 #include "fuconstr.hxx" 32 33 #include <svx/svxids.hrc> 34 #include <svl/aeitem.hxx> 35 #include <svx/svdpagv.hxx> 36 #include <svx/xdef.hxx> 37 #include <svx/xfillit0.hxx> 38 #include <sfx2/dispatch.hxx> 39 #include <sfx2/viewfrm.hxx> 40 41 #include "app.hrc" 42 #include "glob.hrc" 43 #include "fudraw.hxx" 44 #include "View.hxx" 45 #include "Window.hxx" 46 #include "ViewShell.hxx" 47 #include "drawdoc.hxx" 48 #include "FrameView.hxx" 49 #include "sdpage.hxx" 50 #include "sdresid.hxx" 51 #include "stlpool.hxx" 52 #include <svx/globl3d.hxx> 53 54 namespace sd { 55 56 TYPEINIT1( FuConstruct, FuDraw ); 57 58 /************************************************************************* 59 |* 60 |* Konstruktor 61 |* 62 \************************************************************************/ 63 64 FuConstruct::FuConstruct ( 65 ViewShell* pViewSh, 66 ::sd::Window* pWin, 67 ::sd::View* pView, 68 SdDrawDocument* pDoc, 69 SfxRequest& rReq) 70 : FuDraw(pViewSh, pWin, pView, pDoc, rReq), 71 bSelectionChanged(sal_False) 72 { 73 } 74 75 void FuConstruct::DoExecute( SfxRequest& rReq ) 76 { 77 FuDraw::DoExecute( rReq ); 78 } 79 80 /************************************************************************* 81 |* 82 |* MouseButtonDown-event 83 |* 84 \************************************************************************/ 85 86 sal_Bool FuConstruct::MouseButtonDown(const MouseEvent& rMEvt) 87 { 88 sal_Bool bReturn = FuDraw::MouseButtonDown(rMEvt); 89 90 bMBDown = sal_True; 91 bSelectionChanged = sal_False; 92 93 if ( mpView->IsAction() ) 94 { 95 // #90235# this extra triggering is an error and leads to 96 // erasing the last two points when creating a polygon. 97 // if ( rMEvt.IsRight() ) 98 // mpView->BckAction(); 99 return sal_True; 100 } 101 102 bFirstMouseMove = sal_True; 103 aDragTimer.Start(); 104 105 aMDPos = mpWindow->PixelToLogic( rMEvt.GetPosPixel() ); 106 sal_uInt16 nHitLog = sal_uInt16 (mpWindow->PixelToLogic(Size(HITPIX,0)).Width()); 107 108 if (rMEvt.IsLeft() && mpView->IsExtendedMouseEventDispatcherEnabled()) 109 { 110 mpWindow->CaptureMouse(); 111 112 SdrHdl* pHdl = mpView->PickHandle(aMDPos); 113 114 if ( pHdl != NULL || mpView->IsMarkedHit(aMDPos, nHitLog) ) 115 { 116 sal_uInt16 nDrgLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(DRGPIX,0)).Width() ); 117 mpView->BegDragObj(aMDPos, (OutputDevice*) NULL, pHdl, nDrgLog); 118 bReturn = sal_True; 119 } 120 else if ( mpView->AreObjectsMarked() ) 121 { 122 mpView->UnmarkAll(); 123 bReturn = sal_True; 124 } 125 } 126 127 return bReturn; 128 } 129 130 /************************************************************************* 131 |* 132 |* MouseMove-event 133 |* 134 \************************************************************************/ 135 136 sal_Bool FuConstruct::MouseMove(const MouseEvent& rMEvt) 137 { 138 FuDraw::MouseMove(rMEvt); 139 140 if (aDragTimer.IsActive() ) 141 { 142 if( bFirstMouseMove ) 143 bFirstMouseMove = sal_False; 144 else 145 aDragTimer.Stop(); 146 } 147 148 Point aPix(rMEvt.GetPosPixel()); 149 Point aPnt( mpWindow->PixelToLogic(aPix) ); 150 151 if ( mpView->IsAction() ) 152 { 153 ForceScroll(aPix); 154 mpView->MovAction(aPnt); 155 } 156 157 return sal_True; 158 } 159 160 /************************************************************************* 161 |* 162 |* MouseButtonUp-event 163 |* 164 \************************************************************************/ 165 166 sal_Bool FuConstruct::MouseButtonUp(const MouseEvent& rMEvt) 167 { 168 sal_Bool bReturn = sal_True; 169 170 if (aDragTimer.IsActive() ) 171 { 172 aDragTimer.Stop(); 173 bIsInDragMode = sal_False; 174 } 175 176 FuDraw::MouseButtonUp(rMEvt); 177 178 Point aPnt( mpWindow->PixelToLogic( rMEvt.GetPosPixel() ) ); 179 180 if ( mpView && mpView->IsDragObj() ) 181 { 182 FrameView* pFrameView = mpViewShell->GetFrameView(); 183 sal_Bool bDragWithCopy = (rMEvt.IsMod1() && pFrameView->IsDragWithCopy()); 184 185 if (bDragWithCopy) 186 { 187 bDragWithCopy = !mpView->IsPresObjSelected(sal_False, sal_True); 188 } 189 190 mpView->SetDragWithCopy(bDragWithCopy); 191 mpView->EndDragObj( mpView->IsDragWithCopy() ); 192 } 193 else if ( mpView && mpView->IsMarkObj() ) 194 { 195 mpView->EndMarkObj(); 196 } 197 else 198 { 199 bReturn = sal_False; 200 } 201 202 if ( mpView && !mpView->IsAction() ) 203 { 204 mpWindow->ReleaseMouse(); 205 sal_uInt16 nDrgLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(DRGPIX,0)).Width() ); 206 207 if ( !mpView->AreObjectsMarked() ) 208 { 209 SdrObject* pObj; 210 SdrPageView* pPV; 211 sal_uInt16 nHitLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(HITPIX,0)).Width() ); 212 213 if (!mpView->PickObj(aPnt, mpView->getHitTolLog(), pObj, pPV)) 214 { 215 mpView->MarkObj(aPnt, nHitLog); 216 } 217 218 mpViewShell->GetViewFrame()->GetDispatcher()->Execute(SID_OBJECT_SELECT, SFX_CALLMODE_ASYNCHRON); 219 } 220 else if (rMEvt.IsLeft() && !rMEvt.IsShift() && !rMEvt.IsMod1() && !rMEvt.IsMod2() && 221 !bSelectionChanged && 222 Abs(aPnt.X() - aMDPos.X()) < nDrgLog && 223 Abs(aPnt.Y() - aMDPos.Y()) < nDrgLog) 224 { 225 /************************************************************** 226 * Toggle zw. Selektion und Rotation 227 **************************************************************/ 228 SdrObject* pSingleObj = NULL; 229 sal_uLong nMarkCount = mpView->GetMarkedObjectList().GetMarkCount(); 230 231 if (nMarkCount==1) 232 { 233 pSingleObj = mpView->GetMarkedObjectList().GetMark(0)->GetMarkedSdrObj(); 234 } 235 236 if (mpView->GetDragMode() == SDRDRAG_MOVE && mpView->IsRotateAllowed() && 237 (mpViewShell->GetFrameView()->IsClickChangeRotation() || 238 (pSingleObj && pSingleObj->GetObjInventor()==E3dInventor))) 239 { 240 mpView->SetDragMode(SDRDRAG_ROTATE); 241 } 242 else 243 { 244 mpView->SetDragMode(SDRDRAG_MOVE); 245 } 246 } 247 } 248 249 sal_uInt16 nClicks = rMEvt.GetClicks(); 250 251 if (nClicks == 2 && rMEvt.IsLeft() && bMBDown && 252 !rMEvt.IsMod1() && !rMEvt.IsMod2() && !rMEvt.IsShift() ) 253 { 254 DoubleClick(rMEvt); 255 } 256 bMBDown = sal_False; 257 258 return bReturn; 259 } 260 261 /************************************************************************* 262 |* 263 |* Tastaturereignisse bearbeiten 264 |* 265 |* Wird ein KeyEvent bearbeitet, so ist der Return-Wert sal_True, andernfalls 266 |* sal_False. 267 |* 268 \************************************************************************/ 269 270 sal_Bool FuConstruct::KeyInput(const KeyEvent& rKEvt) 271 { 272 sal_Bool bReturn = sal_False; 273 274 if ( !bReturn ) 275 bReturn = FuDraw::KeyInput(rKEvt); 276 277 return(bReturn); 278 } 279 280 /************************************************************************* 281 |* 282 |* Function aktivieren 283 |* 284 \************************************************************************/ 285 286 void FuConstruct::Activate() 287 { 288 mpView->SetEditMode(SDREDITMODE_CREATE); 289 FuDraw::Activate(); 290 } 291 292 /************************************************************************* 293 |* 294 |* Function deaktivieren 295 |* 296 \************************************************************************/ 297 298 void FuConstruct::Deactivate() 299 { 300 FuDraw::Deactivate(); 301 mpView->SetEditMode(SDREDITMODE_EDIT); 302 } 303 304 /************************************************************************* 305 |* 306 |* StyleSheet fuer das zu erzeugende Objekt setzen 307 |* 308 \************************************************************************/ 309 310 void FuConstruct::SetStyleSheet(SfxItemSet& rAttr, SdrObject* pObj) 311 { 312 sal_Bool bUseFillStyle, bUseNoFillStyle; 313 bUseFillStyle = bUseNoFillStyle = sal_False; 314 315 switch( nSlotId ) 316 { 317 case SID_DRAW_RECT: 318 case SID_DRAW_RECT_ROUND: 319 case SID_DRAW_SQUARE: 320 case SID_DRAW_SQUARE_ROUND: 321 case SID_DRAW_ELLIPSE: 322 case SID_DRAW_PIE: 323 case SID_DRAW_ELLIPSECUT: 324 case SID_DRAW_CIRCLE: 325 case SID_DRAW_CIRCLEPIE: 326 case SID_DRAW_CIRCLECUT: 327 case SID_DRAW_POLYGON: 328 case SID_DRAW_XPOLYGON: 329 case SID_DRAW_FREELINE: 330 case SID_DRAW_BEZIER_FILL: 331 { 332 bUseFillStyle = sal_True; 333 break; 334 } 335 case SID_DRAW_RECT_NOFILL: 336 case SID_DRAW_RECT_ROUND_NOFILL: 337 case SID_DRAW_SQUARE_NOFILL: 338 case SID_DRAW_SQUARE_ROUND_NOFILL: 339 case SID_DRAW_ELLIPSE_NOFILL: 340 case SID_DRAW_PIE_NOFILL: 341 case SID_DRAW_ELLIPSECUT_NOFILL: 342 case SID_DRAW_CIRCLE_NOFILL: 343 case SID_DRAW_CIRCLEPIE_NOFILL: 344 case SID_DRAW_CIRCLECUT_NOFILL: 345 case SID_DRAW_POLYGON_NOFILL: 346 case SID_DRAW_XPOLYGON_NOFILL: 347 case SID_DRAW_FREELINE_NOFILL: 348 case SID_DRAW_LINE: 349 case SID_DRAW_XLINE: 350 case SID_CONNECTOR_ARROW_START: 351 case SID_CONNECTOR_ARROW_END: 352 case SID_CONNECTOR_ARROWS: 353 case SID_CONNECTOR_CIRCLE_START: 354 case SID_CONNECTOR_CIRCLE_END: 355 case SID_CONNECTOR_CIRCLES: 356 case SID_CONNECTOR_LINE: 357 case SID_CONNECTOR_LINE_ARROW_START: 358 case SID_CONNECTOR_LINE_ARROW_END: 359 case SID_CONNECTOR_LINE_ARROWS: 360 case SID_CONNECTOR_LINE_CIRCLE_START: 361 case SID_CONNECTOR_LINE_CIRCLE_END: 362 case SID_CONNECTOR_LINE_CIRCLES: 363 case SID_CONNECTOR_CURVE: 364 case SID_CONNECTOR_CURVE_ARROW_START: 365 case SID_CONNECTOR_CURVE_ARROW_END: 366 case SID_CONNECTOR_CURVE_ARROWS: 367 case SID_CONNECTOR_CURVE_CIRCLE_START: 368 case SID_CONNECTOR_CURVE_CIRCLE_END: 369 case SID_CONNECTOR_CURVE_CIRCLES: 370 case SID_CONNECTOR_LINES: 371 case SID_CONNECTOR_LINES_ARROW_START: 372 case SID_CONNECTOR_LINES_ARROW_END: 373 case SID_CONNECTOR_LINES_ARROWS: 374 case SID_CONNECTOR_LINES_CIRCLE_START: 375 case SID_CONNECTOR_LINES_CIRCLE_END: 376 case SID_CONNECTOR_LINES_CIRCLES: 377 case SID_DRAW_BEZIER_NOFILL: 378 case SID_LINE_ARROW_END: 379 { 380 bUseNoFillStyle = sal_True; 381 break; 382 } 383 } 384 SetStyleSheet( rAttr, pObj, bUseFillStyle, bUseNoFillStyle ); 385 } 386 387 void FuConstruct::SetStyleSheet( SfxItemSet& rAttr, SdrObject* pObj, 388 const sal_Bool bForceFillStyle, const sal_Bool bForceNoFillStyle ) 389 { 390 SdPage* pPage = (SdPage*)mpView->GetSdrPageView()->GetPage(); 391 if ( pPage->IsMasterPage() && pPage->GetPageKind() == PK_STANDARD && 392 mpDoc->GetDocumentType() == DOCUMENT_TYPE_IMPRESS ) 393 { 394 /********************************************** 395 * Objects was created on the slide master page 396 ***********************************************/ 397 String aName( pPage->GetLayoutName() ); 398 String aSep = UniString::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( SD_LT_SEPARATOR ) ); 399 sal_uInt16 n = aName.Search(aSep); 400 n = n + aSep.Len(); 401 aName.Erase(n); 402 aName.Append( String ( SdResId( STR_LAYOUT_BACKGROUNDOBJECTS ) ) ); 403 SfxStyleSheet* pSheet = (SfxStyleSheet*)pPage->GetModel()-> 404 GetStyleSheetPool()-> 405 Find(aName, SD_STYLE_FAMILY_MASTERPAGE); 406 DBG_ASSERT(pSheet, "Objektvorlage nicht gefunden"); 407 if (pSheet) 408 { 409 // applying style sheet for background objects 410 pObj->SetStyleSheet(pSheet, sal_False); 411 SfxItemSet& rSet = pSheet->GetItemSet(); 412 const XFillStyleItem& rFillStyle = (const XFillStyleItem&)rSet.Get(XATTR_FILLSTYLE); 413 if ( bForceFillStyle ) 414 { 415 if (rFillStyle.GetValue() == XFILL_NONE) 416 rAttr.Put(XFillStyleItem(XFILL_SOLID)); 417 } 418 else if ( bForceNoFillStyle ) 419 { 420 if (rFillStyle.GetValue() != XFILL_NONE) 421 rAttr.Put(XFillStyleItem(XFILL_NONE)); 422 } 423 } 424 } 425 else 426 { 427 /*********************************** 428 * object was created on normal page 429 ************************************/ 430 if ( bForceNoFillStyle ) 431 { 432 String aName(SdResId(STR_POOLSHEET_OBJWITHOUTFILL)); 433 SfxStyleSheet* pSheet = (SfxStyleSheet*)pPage->GetModel()-> 434 GetStyleSheetPool()-> 435 Find(aName, SD_STYLE_FAMILY_GRAPHICS); 436 DBG_ASSERT(pSheet, "Objektvorlage nicht gefunden"); 437 if (pSheet) 438 { 439 pObj->SetStyleSheet(pSheet, sal_False); 440 SfxItemSet aAttr(*mpView->GetDefaultAttr().Clone()); 441 aAttr.Put(pSheet->GetItemSet().Get(XATTR_FILLSTYLE)); 442 pObj->SetMergedItemSet(aAttr); 443 } 444 else 445 { 446 SfxItemSet aAttr(*mpView->GetDefaultAttr().Clone()); 447 rAttr.Put(XFillStyleItem(XFILL_NONE)); 448 pObj->SetMergedItemSet(aAttr); 449 } 450 } 451 } 452 } 453 454 } // end of namespace sd 455