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_basctl.hxx" 26 #include <vcl/scrbar.hxx> 27 #include <svx/svdview.hxx> 28 #include "dlgedfunc.hxx" 29 #include "dlged.hxx" 30 #include "dlgedview.hxx" 31 #include <vcl/seleng.hxx> 32 33 34 //---------------------------------------------------------------------------- 35 36 IMPL_LINK_INLINE_START( DlgEdFunc, ScrollTimeout, Timer *, pTimer ) 37 { 38 (void)pTimer; 39 Window* pWindow = pParent->GetWindow(); 40 Point aPos = pWindow->ScreenToOutputPixel( pWindow->GetPointerPosPixel() ); 41 aPos = pWindow->PixelToLogic( aPos ); 42 ForceScroll( aPos ); 43 return 0; 44 } 45 IMPL_LINK_INLINE_END( DlgEdFunc, ScrollTimeout, Timer *, pTimer ) 46 47 //---------------------------------------------------------------------------- 48 49 void DlgEdFunc::ForceScroll( const Point& rPos ) 50 { 51 aScrollTimer.Stop(); 52 53 Window* pWindow = pParent->GetWindow(); 54 55 static Point aDefPoint; 56 Rectangle aOutRect( aDefPoint, pWindow->GetOutputSizePixel() ); 57 aOutRect = pWindow->PixelToLogic( aOutRect ); 58 59 ScrollBar* pHScroll = pParent->GetHScroll(); 60 ScrollBar* pVScroll = pParent->GetVScroll(); 61 long nDeltaX = pHScroll->GetLineSize(); 62 long nDeltaY = pVScroll->GetLineSize(); 63 64 if( !aOutRect.IsInside( rPos ) ) 65 { 66 if( rPos.X() < aOutRect.Left() ) 67 nDeltaX = -nDeltaX; 68 else 69 if( rPos.X() <= aOutRect.Right() ) 70 nDeltaX = 0; 71 72 if( rPos.Y() < aOutRect.Top() ) 73 nDeltaY = -nDeltaY; 74 else 75 if( rPos.Y() <= aOutRect.Bottom() ) 76 nDeltaY = 0; 77 78 if( nDeltaX ) 79 pHScroll->SetThumbPos( pHScroll->GetThumbPos() + nDeltaX ); 80 if( nDeltaY ) 81 pVScroll->SetThumbPos( pVScroll->GetThumbPos() + nDeltaY ); 82 83 if( nDeltaX ) 84 pParent->DoScroll( pHScroll ); 85 if( nDeltaY ) 86 pParent->DoScroll( pVScroll ); 87 } 88 89 aScrollTimer.Start(); 90 } 91 92 //---------------------------------------------------------------------------- 93 94 DlgEdFunc::DlgEdFunc( DlgEditor* pParent_ ) 95 { 96 DlgEdFunc::pParent = pParent_; 97 aScrollTimer.SetTimeoutHdl( LINK( this, DlgEdFunc, ScrollTimeout ) ); 98 aScrollTimer.SetTimeout( SELENG_AUTOREPEAT_INTERVAL ); 99 } 100 101 //---------------------------------------------------------------------------- 102 103 DlgEdFunc::~DlgEdFunc() 104 { 105 } 106 107 //---------------------------------------------------------------------------- 108 109 sal_Bool DlgEdFunc::MouseButtonDown( const MouseEvent& ) 110 { 111 return sal_True; 112 } 113 114 //---------------------------------------------------------------------------- 115 116 sal_Bool DlgEdFunc::MouseButtonUp( const MouseEvent& ) 117 { 118 aScrollTimer.Stop(); 119 return sal_True; 120 } 121 122 //---------------------------------------------------------------------------- 123 124 sal_Bool DlgEdFunc::MouseMove( const MouseEvent& ) 125 { 126 return sal_True; 127 } 128 129 //---------------------------------------------------------------------------- 130 131 sal_Bool DlgEdFunc::KeyInput( const KeyEvent& rKEvt ) 132 { 133 sal_Bool bReturn = sal_False; 134 135 SdrView* pView = pParent->GetView(); 136 Window* pWindow = pParent->GetWindow(); 137 138 KeyCode aCode = rKEvt.GetKeyCode(); 139 sal_uInt16 nCode = aCode.GetCode(); 140 141 switch ( nCode ) 142 { 143 case KEY_ESCAPE: 144 { 145 if ( pView->IsAction() ) 146 { 147 pView->BrkAction(); 148 bReturn = sal_True; 149 } 150 else if ( pView->AreObjectsMarked() ) 151 { 152 const SdrHdlList& rHdlList = pView->GetHdlList(); 153 SdrHdl* pHdl = rHdlList.GetFocusHdl(); 154 if ( pHdl ) 155 ((SdrHdlList&)rHdlList).ResetFocusHdl(); 156 else 157 pView->UnmarkAll(); 158 159 bReturn = sal_True; 160 } 161 } 162 break; 163 case KEY_TAB: 164 { 165 if ( !aCode.IsMod1() && !aCode.IsMod2() ) 166 { 167 // mark next object 168 if ( !pView->MarkNextObj( !aCode.IsShift() ) ) 169 { 170 // if no next object, mark first/last 171 pView->UnmarkAllObj(); 172 pView->MarkNextObj( !aCode.IsShift() ); 173 } 174 175 if ( pView->AreObjectsMarked() ) 176 pView->MakeVisible( pView->GetAllMarkedRect(), *pWindow ); 177 178 bReturn = sal_True; 179 } 180 else if ( aCode.IsMod1() ) 181 { 182 // selected handle 183 const SdrHdlList& rHdlList = pView->GetHdlList(); 184 ((SdrHdlList&)rHdlList).TravelFocusHdl( !aCode.IsShift() ); 185 186 // guarantee visibility of focused handle 187 SdrHdl* pHdl = rHdlList.GetFocusHdl(); 188 if ( pHdl ) 189 { 190 Point aHdlPosition( pHdl->GetPos() ); 191 Rectangle aVisRect( aHdlPosition - Point( 100, 100 ), Size( 200, 200 ) ); 192 pView->MakeVisible( aVisRect, *pWindow ); 193 } 194 195 bReturn = sal_True; 196 } 197 } 198 break; 199 case KEY_UP: 200 case KEY_DOWN: 201 case KEY_LEFT: 202 case KEY_RIGHT: 203 { 204 long nX = 0; 205 long nY = 0; 206 207 if ( nCode == KEY_UP ) 208 { 209 // scroll up 210 nX = 0; 211 nY = -1; 212 } 213 else if ( nCode == KEY_DOWN ) 214 { 215 // scroll down 216 nX = 0; 217 nY = 1; 218 } 219 else if ( nCode == KEY_LEFT ) 220 { 221 // scroll left 222 nX = -1; 223 nY = 0; 224 } 225 else if ( nCode == KEY_RIGHT ) 226 { 227 // scroll right 228 nX = 1; 229 nY = 0; 230 } 231 232 if ( pView->AreObjectsMarked() && !aCode.IsMod1() ) 233 { 234 if ( aCode.IsMod2() ) 235 { 236 // move in 1 pixel distance 237 Size aPixelSize = pWindow ? pWindow->PixelToLogic( Size( 1, 1 ) ) : Size( 100, 100 ); 238 nX *= aPixelSize.Width(); 239 nY *= aPixelSize.Height(); 240 } 241 else 242 { 243 // move in 1 mm distance 244 nX *= 100; 245 nY *= 100; 246 } 247 248 const SdrHdlList& rHdlList = pView->GetHdlList(); 249 SdrHdl* pHdl = rHdlList.GetFocusHdl(); 250 251 if ( pHdl == 0 ) 252 { 253 // no handle selected 254 if ( pView->IsMoveAllowed() ) 255 { 256 // restrict movement to work area 257 const Rectangle& rWorkArea = pView->GetWorkArea(); 258 259 if ( !rWorkArea.IsEmpty() ) 260 { 261 Rectangle aMarkRect( pView->GetMarkedObjRect() ); 262 aMarkRect.Move( nX, nY ); 263 264 if ( !rWorkArea.IsInside( aMarkRect ) ) 265 { 266 if ( aMarkRect.Left() < rWorkArea.Left() ) 267 nX += rWorkArea.Left() - aMarkRect.Left(); 268 269 if ( aMarkRect.Right() > rWorkArea.Right() ) 270 nX -= aMarkRect.Right() - rWorkArea.Right(); 271 272 if ( aMarkRect.Top() < rWorkArea.Top() ) 273 nY += rWorkArea.Top() - aMarkRect.Top(); 274 275 if ( aMarkRect.Bottom() > rWorkArea.Bottom() ) 276 nY -= aMarkRect.Bottom() - rWorkArea.Bottom(); 277 } 278 } 279 280 if ( nX != 0 || nY != 0 ) 281 { 282 pView->MoveAllMarked( Size( nX, nY ) ); 283 pView->MakeVisible( pView->GetAllMarkedRect(), *pWindow ); 284 } 285 } 286 } 287 else 288 { 289 // move the handle 290 if ( pHdl && ( nX || nY ) ) 291 { 292 Point aStartPoint( pHdl->GetPos() ); 293 Point aEndPoint( pHdl->GetPos() + Point( nX, nY ) ); 294 const SdrDragStat& rDragStat = pView->GetDragStat(); 295 296 // start dragging 297 pView->BegDragObj( aStartPoint, 0, pHdl, 0 ); 298 299 if ( pView->IsDragObj() ) 300 { 301 FASTBOOL bWasNoSnap = rDragStat.IsNoSnap(); 302 sal_Bool bWasSnapEnabled = pView->IsSnapEnabled(); 303 304 // switch snapping off 305 if ( !bWasNoSnap ) 306 ((SdrDragStat&)rDragStat).SetNoSnap( sal_True ); 307 if ( bWasSnapEnabled ) 308 pView->SetSnapEnabled( sal_False ); 309 310 pView->MovAction( aEndPoint ); 311 pView->EndDragObj(); 312 313 // restore snap 314 if ( !bWasNoSnap ) 315 ((SdrDragStat&)rDragStat).SetNoSnap( bWasNoSnap ); 316 if ( bWasSnapEnabled ) 317 pView->SetSnapEnabled( bWasSnapEnabled ); 318 } 319 320 // make moved handle visible 321 Rectangle aVisRect( aEndPoint - Point( 100, 100 ), Size( 200, 200 ) ); 322 pView->MakeVisible( aVisRect, *pWindow ); 323 } 324 } 325 } 326 else 327 { 328 // scroll page 329 ScrollBar* pScrollBar = ( nX != 0 ) ? pParent->GetHScroll() : pParent->GetVScroll(); 330 if ( pScrollBar ) 331 { 332 long nRangeMin = pScrollBar->GetRangeMin(); 333 long nRangeMax = pScrollBar->GetRangeMax(); 334 long nThumbPos = pScrollBar->GetThumbPos() + ( ( nX != 0 ) ? nX : nY ) * pScrollBar->GetLineSize(); 335 if ( nThumbPos < nRangeMin ) 336 nThumbPos = nRangeMin; 337 if ( nThumbPos > nRangeMax ) 338 nThumbPos = nRangeMax; 339 pScrollBar->SetThumbPos( nThumbPos ); 340 pParent->DoScroll( pScrollBar ); 341 } 342 } 343 344 bReturn = sal_True; 345 } 346 break; 347 default: 348 { 349 } 350 break; 351 } 352 353 if ( bReturn ) 354 pWindow->ReleaseMouse(); 355 356 return bReturn; 357 } 358 359 //---------------------------------------------------------------------------- 360 361 DlgEdFuncInsert::DlgEdFuncInsert( DlgEditor* pParent_ ) : 362 DlgEdFunc( pParent_ ) 363 { 364 pParent_->GetView()->SetCreateMode( sal_True ); 365 } 366 367 //---------------------------------------------------------------------------- 368 369 DlgEdFuncInsert::~DlgEdFuncInsert() 370 { 371 pParent->GetView()->SetEditMode( sal_True ); 372 } 373 374 //---------------------------------------------------------------------------- 375 376 sal_Bool DlgEdFuncInsert::MouseButtonDown( const MouseEvent& rMEvt ) 377 { 378 if( !rMEvt.IsLeft() ) 379 return sal_True; 380 381 SdrView* pView = pParent->GetView(); 382 Window* pWindow= pParent->GetWindow(); 383 pView->SetActualWin( pWindow ); 384 385 Point aPos = pWindow->PixelToLogic( rMEvt.GetPosPixel() ); 386 sal_uInt16 nHitLog = sal_uInt16 ( pWindow->PixelToLogic(Size(3,0)).Width() ); 387 sal_uInt16 nDrgLog = sal_uInt16 ( pWindow->PixelToLogic(Size(3,0)).Width() ); 388 389 pWindow->CaptureMouse(); 390 391 if ( rMEvt.IsLeft() && rMEvt.GetClicks() == 1 ) 392 { 393 SdrHdl* pHdl = pView->PickHandle(aPos); 394 395 // if selected object was hit, drag object 396 if ( pHdl!=NULL || pView->IsMarkedHit(aPos, nHitLog) ) 397 pView->BegDragObj(aPos, (OutputDevice*) NULL, pHdl, nDrgLog); 398 else if ( pView->AreObjectsMarked() ) 399 pView->UnmarkAll(); 400 401 // if no action, create object 402 if ( !pView->IsAction() ) 403 pView->BegCreateObj(aPos); 404 } 405 else if ( rMEvt.IsLeft() && rMEvt.GetClicks() == 2 ) 406 { 407 // if object was hit, show property browser 408 if ( pView->IsMarkedHit(aPos, nHitLog) && pParent->GetMode() != DLGED_READONLY ) 409 pParent->ShowProperties(); 410 } 411 412 return sal_True; 413 } 414 415 //---------------------------------------------------------------------------- 416 417 sal_Bool DlgEdFuncInsert::MouseButtonUp( const MouseEvent& rMEvt ) 418 { 419 DlgEdFunc::MouseButtonUp( rMEvt ); 420 421 SdrView* pView = pParent->GetView(); 422 Window* pWindow= pParent->GetWindow(); 423 pView->SetActualWin( pWindow ); 424 425 pWindow->ReleaseMouse(); 426 427 // object creation active? 428 if ( pView->IsCreateObj() ) 429 { 430 pView->EndCreateObj(SDRCREATE_FORCEEND); 431 432 if ( !pView->AreObjectsMarked() ) 433 { 434 sal_uInt16 nHitLog = sal_uInt16 ( pWindow->PixelToLogic(Size(3,0)).Width() ); 435 Point aPos( pWindow->PixelToLogic( rMEvt.GetPosPixel() ) ); 436 pView->MarkObj(aPos, nHitLog); 437 } 438 439 if( pView->AreObjectsMarked() ) 440 return sal_True; 441 else 442 return sal_False; 443 } 444 else 445 { 446 if ( pView->IsDragObj() ) 447 pView->EndDragObj( rMEvt.IsMod1() ); 448 return sal_True; 449 } 450 } 451 452 //---------------------------------------------------------------------------- 453 454 sal_Bool DlgEdFuncInsert::MouseMove( const MouseEvent& rMEvt ) 455 { 456 SdrView* pView = pParent->GetView(); 457 Window* pWindow= pParent->GetWindow(); 458 pView->SetActualWin( pWindow ); 459 460 Point aPos( pWindow->PixelToLogic( rMEvt.GetPosPixel() ) ); 461 sal_uInt16 nHitLog = sal_uInt16 ( pWindow->PixelToLogic(Size(3,0)).Width() ); 462 463 if ( pView->IsAction() ) 464 { 465 ForceScroll(aPos); 466 pView->MovAction(aPos); 467 } 468 469 pWindow->SetPointer( pView->GetPreferedPointer( aPos, pWindow, nHitLog ) ); 470 471 return sal_True; 472 } 473 474 //---------------------------------------------------------------------------- 475 476 DlgEdFuncSelect::DlgEdFuncSelect( DlgEditor* pParent_ ) : 477 DlgEdFunc( pParent_ ), 478 bMarkAction(sal_False) 479 { 480 } 481 482 //---------------------------------------------------------------------------- 483 484 DlgEdFuncSelect::~DlgEdFuncSelect() 485 { 486 } 487 488 //---------------------------------------------------------------------------- 489 490 sal_Bool DlgEdFuncSelect::MouseButtonDown( const MouseEvent& rMEvt ) 491 { 492 // get view from parent 493 SdrView* pView = pParent->GetView(); 494 Window* pWindow = pParent->GetWindow(); 495 pView->SetActualWin( pWindow ); 496 497 sal_uInt16 nDrgLog = sal_uInt16 ( pWindow->PixelToLogic(Size(3,0)).Width() ); 498 sal_uInt16 nHitLog = sal_uInt16 ( pWindow->PixelToLogic(Size(3,0)).Width() ); 499 Point aMDPos = pWindow->PixelToLogic( rMEvt.GetPosPixel() ); 500 501 if ( rMEvt.IsLeft() && rMEvt.GetClicks() == 1 ) 502 { 503 SdrHdl* pHdl = pView->PickHandle(aMDPos); 504 SdrObject* pObj; 505 SdrPageView* pPV; 506 507 // hit selected object? 508 if ( pHdl!=NULL || pView->IsMarkedHit(aMDPos, nHitLog) ) 509 { 510 pView->BegDragObj(aMDPos, (OutputDevice*) NULL, pHdl, nDrgLog); 511 } 512 else 513 { 514 // if not multi selection, unmark all 515 if ( !rMEvt.IsShift() ) 516 pView->UnmarkAll(); 517 else 518 { 519 if( pView->PickObj( aMDPos, nHitLog, pObj, pPV ) ) 520 { 521 //if( pObj->ISA( DlgEdForm ) ) 522 // pView->UnmarkAll(); 523 //else 524 // pParent->UnmarkDialog(); 525 } 526 } 527 528 if ( pView->MarkObj(aMDPos, nHitLog) ) 529 { 530 // drag object 531 pHdl=pView->PickHandle(aMDPos); 532 pView->BegDragObj(aMDPos, (OutputDevice*) NULL, pHdl, nDrgLog); 533 } 534 else 535 { 536 // select object 537 pView->BegMarkObj(aMDPos); 538 bMarkAction = sal_True; 539 } 540 } 541 } 542 else if ( rMEvt.IsLeft() && rMEvt.GetClicks() == 2 ) 543 { 544 // if object was hit, show property browser 545 if ( pView->IsMarkedHit(aMDPos, nHitLog) && pParent->GetMode() != DLGED_READONLY ) 546 pParent->ShowProperties(); 547 } 548 549 return sal_True; 550 } 551 552 //---------------------------------------------------------------------------- 553 554 sal_Bool DlgEdFuncSelect::MouseButtonUp( const MouseEvent& rMEvt ) 555 { 556 DlgEdFunc::MouseButtonUp( rMEvt ); 557 558 // get view from parent 559 SdrView* pView = pParent->GetView(); 560 Window* pWindow= pParent->GetWindow(); 561 pView->SetActualWin( pWindow ); 562 563 Point aPnt( pWindow->PixelToLogic( rMEvt.GetPosPixel() ) ); 564 sal_uInt16 nHitLog = sal_uInt16 ( pWindow->PixelToLogic(Size(3,0)).Width() ); 565 566 if ( rMEvt.IsLeft() ) 567 { 568 if ( pView->IsDragObj() ) 569 { 570 // object was dragged 571 pView->EndDragObj( rMEvt.IsMod1() ); 572 pView->ForceMarkedToAnotherPage(); 573 } 574 else 575 if (pView->IsAction() ) 576 { 577 pView->EndAction(); 578 //if( bMarkAction ) 579 //pParent->UnmarkDialog(); 580 } 581 } 582 583 // sal_uInt16 nClicks = rMEvt.GetClicks(); 584 // if (nClicks == 2) 585 // { 586 // if ( pView->AreObjectsMarked() ) 587 // { 588 // const SdrMarkList& rMarkList = pView->GetMarkedObjectList(); 589 // 590 // if (rMarkList.GetMarkCount() == 1) 591 // { 592 // SdrMark* pMark = rMarkList.GetMark(0); 593 // SdrObject* pObj = pMark->GetMarkedSdrObj(); 594 // 595 // // edit objects here 596 // } 597 // } 598 // } 599 600 bMarkAction = sal_False; 601 602 pWindow->SetPointer( pView->GetPreferedPointer( aPnt, pWindow, nHitLog ) ); 603 pWindow->ReleaseMouse(); 604 605 return sal_True; 606 } 607 608 //---------------------------------------------------------------------------- 609 610 sal_Bool DlgEdFuncSelect::MouseMove( const MouseEvent& rMEvt ) 611 { 612 SdrView* pView = pParent->GetView(); 613 Window* pWindow= pParent->GetWindow(); 614 pView->SetActualWin( pWindow ); 615 616 Point aPnt( pWindow->PixelToLogic( rMEvt.GetPosPixel() ) ); 617 sal_uInt16 nHitLog = sal_uInt16 ( pWindow->PixelToLogic(Size(3,0)).Width() ); 618 619 if ( pView->IsAction() ) 620 { 621 Point aPix(rMEvt.GetPosPixel()); 622 Point aPnt_(pWindow->PixelToLogic(aPix)); 623 624 ForceScroll(aPnt_); 625 pView->MovAction(aPnt_); 626 } 627 628 pWindow->SetPointer( pView->GetPreferedPointer( aPnt, pWindow, nHitLog ) ); 629 630 return sal_True; 631 } 632 633 //---------------------------------------------------------------------------- 634