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_sd.hxx" 26 27 #include "fuediglu.hxx" 28 #include <svl/eitem.hxx> 29 #include <svx/dialogs.hrc> 30 #include <svx/svdglue.hxx> 31 #include <sfx2/request.hxx> 32 33 34 #include "app.hrc" 35 #include "strings.hrc" 36 #include "res_bmp.hrc" 37 #ifndef SD_WINDOW_SHELL_HXX 38 #include "Window.hxx" 39 #endif 40 #include "drawdoc.hxx" 41 #ifndef SD_FRAMW_VIEW_HXX 42 #include "FrameView.hxx" 43 #endif 44 #include "View.hxx" 45 #include "ViewShell.hxx" 46 #include "ViewShellBase.hxx" 47 #include "ToolBarManager.hxx" 48 49 namespace sd { 50 51 TYPEINIT1( FuEditGluePoints, FuDraw ); 52 53 /************************************************************************* 54 |* 55 |* Konstruktor 56 |* 57 \************************************************************************/ 58 59 FuEditGluePoints::FuEditGluePoints ( 60 ViewShell* pViewSh, 61 ::sd::Window* pWin, 62 ::sd::View* pView, 63 SdDrawDocument* pDoc, 64 SfxRequest& rReq) 65 : FuDraw(pViewSh, pWin, pView, pDoc, rReq) 66 //Solution: Add Shift+UP/DOWN/LEFT/RIGHT key to move the position of insert point, 67 //and SHIFT+ENTER key to decide the postion and draw the new insert point 68 ,bBeginInsertPoint(sal_False), 69 oldPoint(0,0) 70 { 71 } 72 73 FunctionReference FuEditGluePoints::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq, bool bPermanent ) 74 { 75 FuEditGluePoints* pFunc; 76 FunctionReference xFunc( pFunc = new FuEditGluePoints( pViewSh, pWin, pView, pDoc, rReq ) ); 77 xFunc->DoExecute(rReq); 78 pFunc->SetPermanent( bPermanent ); 79 return xFunc; 80 } 81 82 void FuEditGluePoints::DoExecute( SfxRequest& rReq ) 83 { 84 FuDraw::DoExecute( rReq ); 85 mpView->SetInsGluePointMode(sal_False); 86 mpViewShell->GetViewShellBase().GetToolBarManager()->AddToolBar( 87 ToolBarManager::TBG_FUNCTION, 88 ToolBarManager::msGluePointsToolBar); 89 } 90 91 /************************************************************************* 92 |* 93 |* Destruktor 94 |* 95 \************************************************************************/ 96 97 FuEditGluePoints::~FuEditGluePoints() 98 { 99 mpView->BrkAction(); 100 mpView->UnmarkAllGluePoints(); 101 mpView->SetInsGluePointMode(sal_False); 102 } 103 104 /************************************************************************* 105 |* 106 |* MouseButtonDown-event 107 |* 108 \************************************************************************/ 109 110 sal_Bool FuEditGluePoints::MouseButtonDown(const MouseEvent& rMEvt) 111 { 112 mpView->SetActualWin( mpWindow ); 113 114 sal_Bool bReturn = FuDraw::MouseButtonDown(rMEvt); 115 116 if (mpView->IsAction()) 117 { 118 if (rMEvt.IsRight()) 119 mpView->BckAction(); 120 121 return sal_True; 122 } 123 124 if (rMEvt.IsLeft()) 125 { 126 bReturn = sal_True; 127 sal_uInt16 nHitLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(HITPIX,0)).Width() ); 128 sal_uInt16 nDrgLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(DRGPIX,0)).Width() ); 129 mpWindow->CaptureMouse(); 130 131 SdrViewEvent aVEvt; 132 SdrHitKind eHit = mpView->PickAnything(rMEvt, SDRMOUSEBUTTONDOWN, aVEvt); 133 134 if (eHit == SDRHIT_HANDLE) 135 { 136 /****************************************************************** 137 * Handle draggen 138 ******************************************************************/ 139 SdrHdl* pHdl = aVEvt.pHdl; 140 141 if (mpView->IsGluePointMarked(aVEvt.pObj, aVEvt.nGlueId) && rMEvt.IsShift()) 142 { 143 mpView->UnmarkGluePoint(aVEvt.pObj, aVEvt.nGlueId, aVEvt.pPV); 144 pHdl = NULL; 145 } 146 147 if (pHdl) 148 { 149 // Handle draggen 150 mpView->BegDragObj(aMDPos, (OutputDevice*) NULL, aVEvt.pHdl, nDrgLog); 151 } 152 } 153 else if (eHit == SDRHIT_MARKEDOBJECT && mpView->IsInsGluePointMode()) 154 { 155 /****************************************************************** 156 * Klebepunkt einfuegen 157 ******************************************************************/ 158 mpView->BegInsGluePoint(aMDPos); 159 } 160 else if (eHit == SDRHIT_MARKEDOBJECT && rMEvt.IsMod1()) 161 { 162 /****************************************************************** 163 * Klebepunkt selektieren 164 ******************************************************************/ 165 if (!rMEvt.IsShift()) 166 mpView->UnmarkAllGluePoints(); 167 168 mpView->BegMarkGluePoints(aMDPos); 169 } 170 else if (eHit == SDRHIT_MARKEDOBJECT && !rMEvt.IsShift() && !rMEvt.IsMod2()) 171 { 172 /****************************************************************** 173 * Objekt verschieben 174 ******************************************************************/ 175 mpView->BegDragObj(aMDPos, (OutputDevice*) NULL, NULL, nDrgLog); 176 } 177 else if (eHit == SDRHIT_GLUEPOINT) 178 { 179 /****************************************************************** 180 * Klebepunkt selektieren 181 ******************************************************************/ 182 if (!rMEvt.IsShift()) 183 mpView->UnmarkAllGluePoints(); 184 185 mpView->MarkGluePoint(aVEvt.pObj, aVEvt.nGlueId, aVEvt.pPV); 186 SdrHdl* pHdl = mpView->GetGluePointHdl(aVEvt.pObj, aVEvt.nGlueId); 187 188 if (pHdl) 189 { 190 mpView->BegDragObj(aMDPos, (OutputDevice*) NULL, pHdl, nDrgLog); 191 } 192 } 193 else 194 { 195 /****************************************************************** 196 * Objekt selektieren oder draggen 197 ******************************************************************/ 198 if (!rMEvt.IsShift() && !rMEvt.IsMod2() && eHit == SDRHIT_UNMARKEDOBJECT) 199 { 200 mpView->UnmarkAllObj(); 201 } 202 203 sal_Bool bMarked = sal_False; 204 205 if (!rMEvt.IsMod1()) 206 { 207 if (rMEvt.IsMod2()) 208 { 209 bMarked = mpView->MarkNextObj(aMDPos, nHitLog, rMEvt.IsShift()); 210 } 211 else 212 { 213 bMarked = mpView->MarkObj(aMDPos, nHitLog, rMEvt.IsShift()); 214 } 215 } 216 217 if (bMarked && 218 (!rMEvt.IsShift() || eHit == SDRHIT_MARKEDOBJECT)) 219 { 220 // Objekt verschieben 221 mpView->BegDragObj(aMDPos, (OutputDevice*) NULL, aVEvt.pHdl, nDrgLog); 222 } 223 else if (mpView->AreObjectsMarked()) 224 { 225 /************************************************************** 226 * Klebepunkt selektieren 227 **************************************************************/ 228 if (!rMEvt.IsShift()) 229 mpView->UnmarkAllGluePoints(); 230 231 mpView->BegMarkGluePoints(aMDPos); 232 } 233 else 234 { 235 /************************************************************** 236 * Objekt selektieren 237 **************************************************************/ 238 mpView->BegMarkObj(aMDPos); 239 } 240 } 241 242 ForcePointer(&rMEvt); 243 } 244 245 return bReturn; 246 } 247 248 /************************************************************************* 249 |* 250 |* MouseMove-event 251 |* 252 \************************************************************************/ 253 254 sal_Bool FuEditGluePoints::MouseMove(const MouseEvent& rMEvt) 255 { 256 mpView->SetActualWin( mpWindow ); 257 258 FuDraw::MouseMove(rMEvt); 259 260 if (mpView->IsAction()) 261 { 262 Point aPix(rMEvt.GetPosPixel()); 263 Point aPnt( mpWindow->PixelToLogic(aPix) ); 264 ForceScroll(aPix); 265 mpView->MovAction(aPnt); 266 } 267 268 ForcePointer(&rMEvt); 269 270 return sal_True; 271 } 272 273 /************************************************************************* 274 |* 275 |* MouseButtonUp-event 276 |* 277 \************************************************************************/ 278 279 sal_Bool FuEditGluePoints::MouseButtonUp(const MouseEvent& rMEvt) 280 { 281 mpView->SetActualWin( mpWindow ); 282 283 sal_Bool bReturn = sal_False; 284 285 if (mpView->IsAction()) 286 { 287 bReturn = sal_True; 288 mpView->EndAction(); 289 } 290 291 FuDraw::MouseButtonUp(rMEvt); 292 293 sal_uInt16 nDrgLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(DRGPIX,0)).Width() ); 294 Point aPos = mpWindow->PixelToLogic( rMEvt.GetPosPixel() ); 295 296 if (Abs(aMDPos.X() - aPos.X()) < nDrgLog && 297 Abs(aMDPos.Y() - aPos.Y()) < nDrgLog && 298 !rMEvt.IsShift() && !rMEvt.IsMod2()) 299 { 300 SdrViewEvent aVEvt; 301 SdrHitKind eHit = mpView->PickAnything(rMEvt, SDRMOUSEBUTTONDOWN, aVEvt); 302 303 if (eHit == SDRHIT_NONE) 304 { 305 // Klick auf der Stelle: deselektieren 306 mpView->UnmarkAllObj(); 307 } 308 } 309 310 mpWindow->ReleaseMouse(); 311 312 return bReturn; 313 } 314 315 /************************************************************************* 316 |* 317 |* Tastaturereignisse bearbeiten 318 |* 319 |* Wird ein KeyEvent bearbeitet, so ist der Return-Wert sal_True, andernfalls 320 |* sal_False. 321 |* 322 \************************************************************************/ 323 324 sal_Bool FuEditGluePoints::KeyInput(const KeyEvent& rKEvt) 325 { 326 mpView->SetActualWin( mpWindow ); 327 328 //Solution: Add Shift+UP/DOWN/LEFT/RIGHT key to move the position of insert point, 329 //and SHIFT+ENTER key to decide the postion and draw the new insert point 330 331 sal_Bool bReturn = sal_False; 332 333 switch (rKEvt.GetKeyCode().GetCode()) 334 { 335 case KEY_UP: 336 case KEY_DOWN: 337 case KEY_LEFT: 338 case KEY_RIGHT: 339 { 340 if(rKEvt.GetKeyCode().IsShift()&& mpView->IsInsGluePointMode() ){ 341 long nX = 0; 342 long nY = 0; 343 sal_uInt16 nCode = rKEvt.GetKeyCode().GetCode(); 344 if (nCode == KEY_UP) 345 { 346 // Scroll nach oben 347 nX = 0; 348 nY =-1; 349 } 350 else if (nCode == KEY_DOWN) 351 { 352 // Scroll nach unten 353 nX = 0; 354 nY = 1; 355 } 356 else if (nCode == KEY_LEFT) 357 { 358 // Scroll nach links 359 nX =-1; 360 nY = 0; 361 } 362 else if (nCode == KEY_RIGHT) 363 { 364 // Scroll nach rechts 365 nX = 1; 366 nY = 0; 367 } 368 Point centerPoint; 369 Rectangle rect = mpView->GetMarkedObjRect(); 370 centerPoint = mpWindow->LogicToPixel(rect.Center()); 371 Point aPoint = bBeginInsertPoint? oldPoint:centerPoint; 372 Point ePoint = aPoint + Point(nX,nY); 373 mpWindow->SetPointerPosPixel(ePoint); 374 //simulate mouse move action 375 MouseEvent eMevt(ePoint,1,2,MOUSE_LEFT, 0); 376 MouseMove(eMevt); 377 Point aPix(eMevt.GetPosPixel()); 378 oldPoint = ePoint; 379 bBeginInsertPoint = sal_True; 380 bReturn = sal_True; 381 } 382 } 383 break; 384 case KEY_RETURN: 385 if(rKEvt.GetKeyCode().IsShift() && mpView->IsInsGluePointMode() ) 386 { 387 if(bBeginInsertPoint) 388 { 389 mpWindow->SetPointerPosPixel(oldPoint); 390 //simulate mouse button down action 391 MouseEvent aMevt(oldPoint,1,3,MOUSE_LEFT,KEY_SHIFT); 392 // MT IA2: Not used? 393 // sal_uInt16 ubuttons = aMevt.GetButtons(); 394 // sal_uInt16 uMod = aMevt.GetModifier(); 395 MouseButtonDown(aMevt); 396 mpWindow->CaptureMouse(); 397 //simulate mouse button up action 398 MouseEvent rMEvt(oldPoint+Point(0,0),1,17, MOUSE_LEFT, KEY_SHIFT); 399 MouseButtonUp(rMEvt); 400 bReturn= sal_True; 401 } 402 } 403 break; 404 } 405 if(!bReturn) 406 bReturn = FuDraw::KeyInput(rKEvt); 407 return bReturn; 408 } 409 410 //Solution: Add Shift+UP/DOWN/LEFT/RIGHT key to move the position of insert point, 411 //and SHIFT+ENTER key to decide the postion and draw the new insert point 412 void FuEditGluePoints::ForcePointer(const MouseEvent* pMEvt) 413 { 414 if(bBeginInsertPoint && pMEvt) 415 { 416 MouseEvent aMEvt(pMEvt->GetPosPixel(), pMEvt->GetClicks(), 417 pMEvt->GetMode(), pMEvt->GetButtons(), pMEvt->GetModifier() & ~KEY_SHIFT); 418 FuDraw::ForcePointer(&aMEvt); 419 } 420 else 421 { 422 FuDraw::ForcePointer(pMEvt); 423 } 424 } 425 /************************************************************************* 426 |* 427 |* Command-event 428 |* 429 \************************************************************************/ 430 431 sal_Bool FuEditGluePoints::Command(const CommandEvent& rCEvt) 432 { 433 mpView->SetActualWin( mpWindow ); 434 return FuPoor::Command( rCEvt ); 435 } 436 437 /************************************************************************* 438 |* 439 |* Funktion aktivieren 440 |* 441 \************************************************************************/ 442 443 void FuEditGluePoints::Activate() 444 { 445 mpView->SetGluePointEditMode(); 446 FuDraw::Activate(); 447 } 448 449 /************************************************************************* 450 |* 451 |* Funktion deaktivieren 452 |* 453 \************************************************************************/ 454 455 void FuEditGluePoints::Deactivate() 456 { 457 mpView->SetGluePointEditMode( sal_False ); 458 FuDraw::Deactivate(); 459 } 460 461 /************************************************************************* 462 |* 463 |* Request verarbeiten 464 |* 465 \************************************************************************/ 466 467 void FuEditGluePoints::ReceiveRequest(SfxRequest& rReq) 468 { 469 switch (rReq.GetSlot()) 470 { 471 case SID_GLUE_INSERT_POINT: 472 { 473 mpView->SetInsGluePointMode(!mpView->IsInsGluePointMode()); 474 } 475 break; 476 477 case SID_GLUE_ESCDIR_LEFT: 478 { 479 mpView->SetMarkedGluePointsEscDir( SDRESC_LEFT, 480 !mpView->IsMarkedGluePointsEscDir( SDRESC_LEFT ) ); 481 } 482 break; 483 484 case SID_GLUE_ESCDIR_RIGHT: 485 { 486 mpView->SetMarkedGluePointsEscDir( SDRESC_RIGHT, 487 !mpView->IsMarkedGluePointsEscDir( SDRESC_RIGHT ) ); 488 } 489 break; 490 491 case SID_GLUE_ESCDIR_TOP: 492 { 493 mpView->SetMarkedGluePointsEscDir( SDRESC_TOP, 494 !mpView->IsMarkedGluePointsEscDir( SDRESC_TOP ) ); 495 } 496 break; 497 498 case SID_GLUE_ESCDIR_BOTTOM: 499 { 500 mpView->SetMarkedGluePointsEscDir( SDRESC_BOTTOM, 501 !mpView->IsMarkedGluePointsEscDir( SDRESC_BOTTOM ) ); 502 } 503 break; 504 505 case SID_GLUE_PERCENT: 506 { 507 const SfxItemSet* pSet = rReq.GetArgs(); 508 const SfxPoolItem& rItem = pSet->Get(SID_GLUE_PERCENT); 509 sal_Bool bPercent = ((const SfxBoolItem&) rItem).GetValue(); 510 mpView->SetMarkedGluePointsPercent(bPercent); 511 } 512 break; 513 514 case SID_GLUE_HORZALIGN_CENTER: 515 { 516 mpView->SetMarkedGluePointsAlign(sal_False, SDRHORZALIGN_CENTER); 517 } 518 break; 519 520 case SID_GLUE_HORZALIGN_LEFT: 521 { 522 mpView->SetMarkedGluePointsAlign(sal_False, SDRHORZALIGN_LEFT); 523 } 524 break; 525 526 case SID_GLUE_HORZALIGN_RIGHT: 527 { 528 mpView->SetMarkedGluePointsAlign(sal_False, SDRHORZALIGN_RIGHT); 529 } 530 break; 531 532 case SID_GLUE_VERTALIGN_CENTER: 533 { 534 mpView->SetMarkedGluePointsAlign(sal_True, SDRVERTALIGN_CENTER); 535 } 536 break; 537 538 case SID_GLUE_VERTALIGN_TOP: 539 { 540 mpView->SetMarkedGluePointsAlign(sal_True, SDRVERTALIGN_TOP); 541 } 542 break; 543 544 case SID_GLUE_VERTALIGN_BOTTOM: 545 { 546 mpView->SetMarkedGluePointsAlign(sal_True, SDRVERTALIGN_BOTTOM); 547 } 548 break; 549 } 550 551 // Zum Schluss Basisklasse rufen 552 FuPoor::ReceiveRequest(rReq); 553 } 554 555 556 } // end of namespace sd 557