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_svx.hxx" 26 #include <svl/itempool.hxx> 27 #include <vcl/dialog.hxx> 28 #include <vcl/wrkwin.hxx> 29 #include <unotools/syslocale.hxx> 30 #include <rtl/math.hxx> 31 #include <unotools/localedatawrapper.hxx> 32 #ifndef _UNOTOOLS_PROCESSFACTORY_HXX 33 #include <comphelper/processfactory.hxx> 34 #endif 35 #include <vcl/svapp.hxx> 36 #include <osl/mutex.hxx> 37 38 #include <svx/graphctl.hxx> 39 #include "GraphCtlAccessibleContext.hxx" 40 #include "svx/xoutbmp.hxx" 41 #include <svx/svxids.hrc> 42 #include <svx/svdpage.hxx> 43 44 // #i72889# 45 #include "svx/sdrpaintwindow.hxx" 46 47 /************************************************************************* 48 |* 49 |* 50 |* 51 \************************************************************************/ 52 53 void GraphCtrlUserCall::Changed( const SdrObject& rObj, SdrUserCallType eType, const Rectangle& /*rOldBoundRect*/ ) 54 { 55 switch( eType ) 56 { 57 case( SDRUSERCALL_MOVEONLY ): 58 case( SDRUSERCALL_RESIZE ): 59 rWin.SdrObjChanged( rObj ); 60 break; 61 62 case( SDRUSERCALL_INSERTED ): 63 rWin.SdrObjCreated( rObj ); 64 break; 65 66 default: 67 break; 68 } 69 } 70 71 72 /************************************************************************* 73 |* 74 |* 75 |* 76 \************************************************************************/ 77 78 GraphCtrl::GraphCtrl( Window* pParent, const WinBits nWinBits ) : 79 Control ( pParent, nWinBits ), 80 aMap100 ( MAP_100TH_MM ), 81 eObjKind ( OBJ_NONE ), 82 nPolyEdit ( 0 ), 83 bEditMode ( sal_False ), 84 bSdrMode ( sal_False ), 85 mpAccContext ( NULL ), 86 pModel ( NULL ), 87 pView ( NULL ) 88 { 89 pUserCall = new GraphCtrlUserCall( *this ); 90 aUpdateTimer.SetTimeout( 200 ); 91 aUpdateTimer.SetTimeoutHdl( LINK( this, GraphCtrl, UpdateHdl ) ); 92 aUpdateTimer.Start(); 93 94 SetWinStyle( nWinBits ); 95 96 EnableRTL( sal_False ); 97 } 98 99 100 /************************************************************************* 101 |* 102 |* 103 |* 104 \************************************************************************/ 105 106 GraphCtrl::GraphCtrl( Window* pParent, const ResId& rResId ) : 107 Control ( pParent, rResId ), 108 aMap100 ( MAP_100TH_MM ), 109 nWinStyle ( 0 ), 110 eObjKind ( OBJ_NONE ), 111 nPolyEdit ( 0 ), 112 bEditMode ( sal_False ), 113 bSdrMode ( sal_False ), 114 bAnim ( sal_False ), 115 mpAccContext ( NULL ), 116 pModel ( NULL ), 117 pView ( NULL ) 118 { 119 pUserCall = new GraphCtrlUserCall( *this ); 120 aUpdateTimer.SetTimeout( 500 ); 121 aUpdateTimer.SetTimeoutHdl( LINK( this, GraphCtrl, UpdateHdl ) ); 122 aUpdateTimer.Start(); 123 EnableRTL( sal_False ); 124 } 125 126 127 /************************************************************************* 128 |* 129 |* 130 |* 131 \************************************************************************/ 132 133 GraphCtrl::~GraphCtrl() 134 { 135 if( mpAccContext ) 136 { 137 mpAccContext->disposing(); 138 mpAccContext->release(); 139 } 140 delete pView; 141 delete pModel; 142 delete pUserCall; 143 } 144 145 146 /************************************************************************* 147 |* 148 |* 149 |* 150 \************************************************************************/ 151 152 void GraphCtrl::SetWinStyle( WinBits nWinBits ) 153 { 154 nWinStyle = nWinBits; 155 bAnim = ( nWinStyle & WB_ANIMATION ) == WB_ANIMATION; 156 bSdrMode = ( nWinStyle & WB_SDRMODE ) == WB_SDRMODE; 157 158 const StyleSettings& rStyleSettings = Application::GetSettings().GetStyleSettings(); 159 SetBackground( Wallpaper( rStyleSettings.GetWindowColor() ) ); 160 SetMapMode( aMap100 ); 161 162 delete pView; 163 pView = NULL; 164 165 delete pModel; 166 pModel = NULL; 167 168 if ( bSdrMode ) 169 InitSdrModel(); 170 } 171 172 173 /************************************************************************* 174 |* 175 |* 176 |* 177 \************************************************************************/ 178 179 void GraphCtrl::InitSdrModel() 180 { 181 ::vos::OGuard aGuard (Application::GetSolarMutex()); 182 183 SdrPage* pPage; 184 185 // alten Kram zerstoeren 186 delete pView; 187 delete pModel; 188 189 // Model anlegen 190 pModel = new SdrModel; 191 pModel->GetItemPool().FreezeIdRanges(); 192 pModel->SetScaleUnit( aMap100.GetMapUnit() ); 193 pModel->SetScaleFraction( Fraction( 1, 1 ) ); 194 pModel->SetDefaultFontHeight( 500 ); 195 196 pPage = new SdrPage( *pModel ); 197 198 pPage->SetSize( aGraphSize ); 199 pPage->SetBorder( 0, 0, 0, 0 ); 200 pModel->InsertPage( pPage ); 201 pModel->SetChanged( sal_False ); 202 203 // View anlegen 204 pView = new GraphCtrlView( pModel, this ); 205 pView->SetWorkArea( Rectangle( Point(), aGraphSize ) ); 206 pView->EnableExtendedMouseEventDispatcher( sal_True ); 207 pView->ShowSdrPage(pView->GetModel()->GetPage(0)); 208 // pView->ShowSdrPage(pView->GetModel()->GetPage(0)); 209 pView->SetFrameDragSingles( sal_True ); 210 pView->SetMarkedPointsSmooth( SDRPATHSMOOTH_SYMMETRIC ); 211 pView->SetEditMode( sal_True ); 212 213 // #i72889# set neeeded flags 214 pView->SetPagePaintingAllowed(false); 215 pView->SetBufferedOutputAllowed(true); 216 pView->SetBufferedOverlayAllowed(true); 217 218 // Tell the accessibility object about the changes. 219 if (mpAccContext != NULL) 220 mpAccContext->setModelAndView (pModel, pView); 221 } 222 223 224 /************************************************************************* 225 |* 226 |* 227 |* 228 \************************************************************************/ 229 230 void GraphCtrl::SetGraphic( const Graphic& rGraphic, sal_Bool bNewModel ) 231 { 232 // Bitmaps dithern wir ggf. fuer die Anzeige 233 if ( !bAnim && ( rGraphic.GetType() == GRAPHIC_BITMAP ) ) 234 { 235 if ( rGraphic.IsTransparent() ) 236 { 237 Bitmap aBmp( rGraphic.GetBitmap() ); 238 239 DitherBitmap( aBmp ); 240 aGraphic = Graphic( BitmapEx( aBmp, rGraphic.GetBitmapEx().GetMask() ) ); 241 } 242 else 243 { 244 Bitmap aBmp( rGraphic.GetBitmap() ); 245 DitherBitmap( aBmp ); 246 aGraphic = aBmp; 247 } 248 } 249 else 250 aGraphic = rGraphic; 251 252 if ( aGraphic.GetPrefMapMode().GetMapUnit() == MAP_PIXEL ) 253 aGraphSize = Application::GetDefaultDevice()->PixelToLogic( aGraphic.GetPrefSize(), aMap100 ); 254 else 255 aGraphSize = OutputDevice::LogicToLogic( aGraphic.GetPrefSize(), aGraphic.GetPrefMapMode(), aMap100 ); 256 257 if ( bSdrMode && bNewModel ) 258 InitSdrModel(); 259 260 if ( aGraphSizeLink.IsSet() ) 261 aGraphSizeLink.Call( this ); 262 263 Resize(); 264 Invalidate(); 265 } 266 267 268 /************************************************************************* 269 |* 270 |* 271 |* 272 \************************************************************************/ 273 274 void GraphCtrl::Resize() 275 { 276 Control::Resize(); 277 278 if ( aGraphSize.Width() && aGraphSize.Height() ) 279 { 280 MapMode aDisplayMap( aMap100 ); 281 Point aNewPos; 282 Size aNewSize; 283 const Size aWinSize = PixelToLogic( GetOutputSizePixel(), aDisplayMap ); 284 const long nWidth = aWinSize.Width(); 285 const long nHeight = aWinSize.Height(); 286 double fGrfWH = (double) aGraphSize.Width() / aGraphSize.Height(); 287 double fWinWH = (double) nWidth / nHeight; 288 289 // Bitmap an Thumbgroesse anpassen 290 if ( fGrfWH < fWinWH) 291 { 292 aNewSize.Width() = (long) ( (double) nHeight * fGrfWH ); 293 aNewSize.Height()= nHeight; 294 } 295 else 296 { 297 aNewSize.Width() = nWidth; 298 aNewSize.Height()= (long) ( (double) nWidth / fGrfWH ); 299 } 300 301 aNewPos.X() = ( nWidth - aNewSize.Width() ) >> 1; 302 aNewPos.Y() = ( nHeight - aNewSize.Height() ) >> 1; 303 304 // MapMode fuer Engine umsetzen 305 aDisplayMap.SetScaleX( Fraction( aNewSize.Width(), aGraphSize.Width() ) ); 306 aDisplayMap.SetScaleY( Fraction( aNewSize.Height(), aGraphSize.Height() ) ); 307 308 aDisplayMap.SetOrigin( LogicToLogic( aNewPos, aMap100, aDisplayMap ) ); 309 SetMapMode( aDisplayMap ); 310 } 311 312 Invalidate(); 313 } 314 315 316 /************************************************************************* 317 |* 318 |* 319 |* 320 \************************************************************************/ 321 322 void GraphCtrl::Paint( const Rectangle& rRect ) 323 { 324 // #i72889# used splitted repaint to be able to paint an own background 325 // even to the buffered view 326 const bool bGraphicValid(GRAPHIC_NONE != aGraphic.GetType()); 327 328 if(bSdrMode) 329 { 330 SdrPaintWindow* pPaintWindow = pView->BeginCompleteRedraw(this); 331 332 if(bGraphicValid) 333 { 334 OutputDevice& rTarget = pPaintWindow->GetTargetOutputDevice(); 335 336 rTarget.SetBackground(GetBackground()); 337 rTarget.Erase(); 338 339 aGraphic.Draw(&rTarget, Point(), aGraphSize); 340 } 341 342 const Region aRepaintRegion(rRect); 343 pView->DoCompleteRedraw(*pPaintWindow, aRepaintRegion); 344 pView->EndCompleteRedraw(*pPaintWindow, true); 345 } 346 else 347 { 348 // #i73381# in non-SdrMode, paint to local directly 349 if(bGraphicValid) 350 { 351 aGraphic.Draw(this, Point(), aGraphSize); 352 } 353 } 354 } 355 356 357 /************************************************************************* 358 |* 359 |* 360 |* 361 \************************************************************************/ 362 363 void GraphCtrl::SdrObjChanged( const SdrObject& ) 364 { 365 } 366 367 368 /************************************************************************* 369 |* 370 |* 371 |* 372 \************************************************************************/ 373 374 void GraphCtrl::SdrObjCreated( const SdrObject& ) 375 { 376 } 377 378 379 /************************************************************************* 380 |* 381 |* 382 |* 383 \************************************************************************/ 384 385 void GraphCtrl::MarkListHasChanged() 386 { 387 if ( aMarkObjLink.IsSet() ) 388 aMarkObjLink.Call( this ); 389 } 390 391 392 /************************************************************************* 393 |* 394 |* 395 |* 396 \************************************************************************/ 397 398 void GraphCtrl::KeyInput( const KeyEvent& rKEvt ) 399 { 400 KeyCode aCode( rKEvt.GetKeyCode() ); 401 sal_Bool bProc = sal_False; 402 403 switch ( aCode.GetCode() ) 404 { 405 case KEY_DELETE: 406 case KEY_BACKSPACE: 407 { 408 if ( bSdrMode ) 409 { 410 pView->DeleteMarked(); 411 bProc = sal_True; 412 if( !pView->AreObjectsMarked() ) 413 ((Dialog*)GetParent())->GrabFocusToFirstControl(); 414 } 415 } 416 break; 417 418 case KEY_ESCAPE: 419 { 420 if ( bSdrMode ) 421 { 422 if ( pView->IsAction() ) 423 { 424 pView->BrkAction(); 425 } 426 else if ( pView->AreObjectsMarked() ) 427 { 428 const SdrHdlList& rHdlList = pView->GetHdlList(); 429 SdrHdl* pHdl = rHdlList.GetFocusHdl(); 430 431 if(pHdl) 432 { 433 ((SdrHdlList&)rHdlList).ResetFocusHdl(); 434 } 435 else 436 { 437 ((Dialog*)GetParent())->GrabFocusToFirstControl(); 438 } 439 } 440 else 441 { 442 ((Dialog*)GetParent())->GrabFocusToFirstControl(); 443 } 444 bProc = sal_True; 445 } 446 } 447 break; 448 449 case KEY_F11: 450 case KEY_TAB: 451 { 452 if( bSdrMode ) 453 { 454 if( !aCode.IsMod1() && !aCode.IsMod2() ) 455 { 456 bool bForward = !aCode.IsShift(); 457 // select next object 458 if ( ! pView->MarkNextObj( bForward )) 459 { 460 // At first or last object. Cycle to the other end 461 // of the list. 462 pView->UnmarkAllObj(); 463 pView->MarkNextObj (bForward); 464 } 465 bProc = sal_True; 466 } 467 else if(aCode.IsMod1()) 468 { 469 // select next handle 470 const SdrHdlList& rHdlList = pView->GetHdlList(); 471 sal_Bool bForward(!aCode.IsShift()); 472 473 ((SdrHdlList&)rHdlList).TravelFocusHdl(bForward); 474 475 bProc = true; 476 } 477 } 478 } 479 break; 480 481 case KEY_END: 482 { 483 484 if ( aCode.IsMod1() ) 485 { 486 // #97016# mark last object 487 pView->UnmarkAllObj(); 488 pView->MarkNextObj(sal_False); 489 490 bProc = true; 491 } 492 } 493 break; 494 495 case KEY_HOME: 496 { 497 if ( aCode.IsMod1() ) 498 { 499 pView->UnmarkAllObj(); 500 pView->MarkNextObj(sal_True); 501 502 bProc = true; 503 } 504 } 505 break; 506 507 case KEY_UP: 508 case KEY_DOWN: 509 case KEY_LEFT: 510 case KEY_RIGHT: 511 { 512 long nX = 0; 513 long nY = 0; 514 515 if (aCode.GetCode() == KEY_UP) 516 { 517 // Scroll nach oben 518 nX = 0; 519 nY =-1; 520 } 521 else if (aCode.GetCode() == KEY_DOWN) 522 { 523 // Scroll nach unten 524 nX = 0; 525 nY = 1; 526 } 527 else if (aCode.GetCode() == KEY_LEFT) 528 { 529 // Scroll nach links 530 nX =-1; 531 nY = 0; 532 } 533 else if (aCode.GetCode() == KEY_RIGHT) 534 { 535 // Scroll nach rechts 536 nX = 1; 537 nY = 0; 538 } 539 540 if (pView->AreObjectsMarked() && !aCode.IsMod1() ) 541 { 542 if(aCode.IsMod2()) 543 { 544 // #97016# move in 1 pixel distance 545 Size aLogicSizeOnePixel = PixelToLogic(Size(1,1)); 546 nX *= aLogicSizeOnePixel.Width(); 547 nY *= aLogicSizeOnePixel.Height(); 548 } 549 else 550 { 551 // old, fixed move distance 552 nX *= 100; 553 nY *= 100; 554 } 555 556 // #97016# II 557 const SdrHdlList& rHdlList = pView->GetHdlList(); 558 SdrHdl* pHdl = rHdlList.GetFocusHdl(); 559 560 if(0L == pHdl) 561 { 562 // #90129# restrict movement to WorkArea 563 const Rectangle& rWorkArea = pView->GetWorkArea(); 564 565 if(!rWorkArea.IsEmpty()) 566 { 567 Rectangle aMarkRect(pView->GetMarkedObjRect()); 568 aMarkRect.Move(nX, nY); 569 570 if(!aMarkRect.IsInside(rWorkArea)) 571 { 572 if(aMarkRect.Left() < rWorkArea.Left()) 573 { 574 nX += rWorkArea.Left() - aMarkRect.Left(); 575 } 576 577 if(aMarkRect.Right() > rWorkArea.Right()) 578 { 579 nX -= aMarkRect.Right() - rWorkArea.Right(); 580 } 581 582 if(aMarkRect.Top() < rWorkArea.Top()) 583 { 584 nY += rWorkArea.Top() - aMarkRect.Top(); 585 } 586 587 if(aMarkRect.Bottom() > rWorkArea.Bottom()) 588 { 589 nY -= aMarkRect.Bottom() - rWorkArea.Bottom(); 590 } 591 } 592 } 593 594 // no handle selected 595 if(0 != nX || 0 != nY) 596 { 597 pView->MoveAllMarked(Size(nX, nY)); 598 } 599 } 600 else 601 { 602 // move handle with index nHandleIndex 603 if(pHdl && (nX || nY)) 604 { 605 // now move the Handle (nX, nY) 606 Point aStartPoint(pHdl->GetPos()); 607 Point aEndPoint(pHdl->GetPos() + Point(nX, nY)); 608 const SdrDragStat& rDragStat = pView->GetDragStat(); 609 610 // start dragging 611 pView->BegDragObj(aStartPoint, 0, pHdl, 0); 612 613 if(pView->IsDragObj()) 614 { 615 FASTBOOL bWasNoSnap = rDragStat.IsNoSnap(); 616 sal_Bool bWasSnapEnabled = pView->IsSnapEnabled(); 617 618 // switch snapping off 619 if(!bWasNoSnap) 620 ((SdrDragStat&)rDragStat).SetNoSnap(sal_True); 621 if(bWasSnapEnabled) 622 pView->SetSnapEnabled(sal_False); 623 624 pView->MovAction(aEndPoint); 625 pView->EndDragObj(); 626 627 // restore snap 628 if(!bWasNoSnap) 629 ((SdrDragStat&)rDragStat).SetNoSnap(bWasNoSnap); 630 if(bWasSnapEnabled) 631 pView->SetSnapEnabled(bWasSnapEnabled); 632 } 633 } 634 } 635 636 bProc = true; 637 } 638 } 639 break; 640 641 case KEY_SPACE: 642 { 643 const SdrHdlList& rHdlList = pView->GetHdlList(); 644 SdrHdl* pHdl = rHdlList.GetFocusHdl(); 645 646 if(pHdl) 647 { 648 if(pHdl->GetKind() == HDL_POLY) 649 { 650 // rescue ID of point with focus 651 sal_uInt32 nPol(pHdl->GetPolyNum()); 652 sal_uInt32 nPnt(pHdl->GetPointNum()); 653 654 if(pView->IsPointMarked(*pHdl)) 655 { 656 if(rKEvt.GetKeyCode().IsShift()) 657 { 658 pView->UnmarkPoint(*pHdl); 659 } 660 } 661 else 662 { 663 if(!rKEvt.GetKeyCode().IsShift()) 664 { 665 pView->UnmarkAllPoints(); 666 } 667 668 pView->MarkPoint(*pHdl); 669 } 670 671 if(0L == rHdlList.GetFocusHdl()) 672 { 673 // restore point with focus 674 SdrHdl* pNewOne = 0L; 675 676 for(sal_uInt32 a(0); !pNewOne && a < rHdlList.GetHdlCount(); a++) 677 { 678 SdrHdl* pAct = rHdlList.GetHdl(a); 679 680 if(pAct 681 && pAct->GetKind() == HDL_POLY 682 && pAct->GetPolyNum() == nPol 683 && pAct->GetPointNum() == nPnt) 684 { 685 pNewOne = pAct; 686 } 687 } 688 689 if(pNewOne) 690 { 691 ((SdrHdlList&)rHdlList).SetFocusHdl(pNewOne); 692 } 693 } 694 695 bProc = sal_True; 696 } 697 } 698 } 699 break; 700 701 default: 702 break; 703 } 704 705 if ( !bProc ) 706 Control::KeyInput( rKEvt ); 707 else 708 ReleaseMouse(); 709 } 710 711 712 /************************************************************************* 713 |* 714 |* 715 |* 716 \************************************************************************/ 717 718 void GraphCtrl::MouseButtonDown( const MouseEvent& rMEvt ) 719 { 720 if ( bSdrMode && ( rMEvt.GetClicks() < 2 ) ) 721 { 722 const Point aLogPt( PixelToLogic( rMEvt.GetPosPixel() ) ); 723 724 if ( !Rectangle( Point(), aGraphSize ).IsInside( aLogPt ) && !pView->IsEditMode() ) 725 Control::MouseButtonDown( rMEvt ); 726 else 727 { 728 // Focus anziehen fuer Key-Inputs 729 GrabFocus(); 730 731 if ( nPolyEdit ) 732 { 733 SdrViewEvent aVEvt; 734 SdrHitKind eHit = pView->PickAnything( rMEvt, SDRMOUSEBUTTONDOWN, aVEvt ); 735 736 if ( nPolyEdit == SID_BEZIER_INSERT && eHit == SDRHIT_MARKEDOBJECT ) 737 pView->BegInsObjPoint( aLogPt, rMEvt.IsMod1()); 738 else 739 pView->MouseButtonDown( rMEvt, this ); 740 } 741 else 742 pView->MouseButtonDown( rMEvt, this ); 743 } 744 745 SdrObject* pCreateObj = pView->GetCreateObj(); 746 747 // Wir wollen das Inserten mitbekommen 748 if ( pCreateObj && !pCreateObj->GetUserCall() ) 749 pCreateObj->SetUserCall( pUserCall ); 750 751 SetPointer( pView->GetPreferedPointer( aLogPt, this ) ); 752 } 753 else 754 Control::MouseButtonDown( rMEvt ); 755 } 756 757 758 /************************************************************************* 759 |* 760 |* 761 |* 762 \************************************************************************/ 763 764 void GraphCtrl::MouseMove(const MouseEvent& rMEvt) 765 { 766 const Point aLogPos( PixelToLogic( rMEvt.GetPosPixel() ) ); 767 768 if ( bSdrMode ) 769 { 770 pView->MouseMove( rMEvt, this ); 771 772 if( ( SID_BEZIER_INSERT == nPolyEdit ) && 773 !pView->PickHandle( aLogPos ) && 774 !pView->IsInsObjPoint() ) 775 { 776 SetPointer( POINTER_CROSS ); 777 } 778 else 779 SetPointer( pView->GetPreferedPointer( aLogPos, this ) ); 780 } 781 else 782 Control::MouseButtonUp( rMEvt ); 783 784 if ( aMousePosLink.IsSet() ) 785 { 786 if ( Rectangle( Point(), aGraphSize ).IsInside( aLogPos ) ) 787 aMousePos = aLogPos; 788 else 789 aMousePos = Point(); 790 791 aMousePosLink.Call( this ); 792 } 793 } 794 795 796 /************************************************************************* 797 |* 798 |* 799 |* 800 \************************************************************************/ 801 802 void GraphCtrl::MouseButtonUp(const MouseEvent& rMEvt) 803 { 804 if ( bSdrMode ) 805 { 806 if ( pView->IsInsObjPoint() ) 807 pView->EndInsObjPoint( SDRCREATE_FORCEEND ); 808 else 809 pView->MouseButtonUp( rMEvt, this ); 810 811 ReleaseMouse(); 812 SetPointer( pView->GetPreferedPointer( PixelToLogic( rMEvt.GetPosPixel() ), this ) ); 813 } 814 else 815 Control::MouseButtonUp( rMEvt ); 816 } 817 818 819 /************************************************************************* 820 |* 821 |* 822 |* 823 \************************************************************************/ 824 825 SdrObject* GraphCtrl::GetSelectedSdrObject() const 826 { 827 SdrObject* pSdrObj = NULL; 828 829 if ( bSdrMode ) 830 { 831 const SdrMarkList& rMarkList = pView->GetMarkedObjectList(); 832 833 if ( rMarkList.GetMarkCount() == 1 ) 834 pSdrObj = rMarkList.GetMark( 0 )->GetMarkedSdrObj(); 835 } 836 837 return pSdrObj; 838 } 839 840 841 /************************************************************************* 842 |* 843 |* 844 |* 845 \************************************************************************/ 846 847 void GraphCtrl::SetEditMode( const sal_Bool _bEditMode ) 848 { 849 if ( bSdrMode ) 850 { 851 bEditMode = _bEditMode; 852 pView->SetEditMode( bEditMode ); 853 eObjKind = OBJ_NONE; 854 pView->SetCurrentObj( sal::static_int_cast< sal_uInt16 >( eObjKind ) ); 855 } 856 else 857 bEditMode = sal_False; 858 } 859 860 861 /************************************************************************* 862 |* 863 |* 864 |* 865 \************************************************************************/ 866 867 void GraphCtrl::SetPolyEditMode( const sal_uInt16 _nPolyEdit ) 868 { 869 if ( bSdrMode && ( _nPolyEdit != nPolyEdit ) ) 870 { 871 nPolyEdit = _nPolyEdit; 872 pView->SetFrameDragSingles( nPolyEdit == 0 ); 873 } 874 else 875 nPolyEdit = 0; 876 } 877 878 879 /************************************************************************* 880 |* 881 |* 882 |* 883 \************************************************************************/ 884 885 void GraphCtrl::SetObjKind( const SdrObjKind _eObjKind ) 886 { 887 if ( bSdrMode ) 888 { 889 bEditMode = sal_False; 890 pView->SetEditMode( bEditMode ); 891 eObjKind = _eObjKind; 892 pView->SetCurrentObj( sal::static_int_cast< sal_uInt16 >( eObjKind ) ); 893 } 894 else 895 eObjKind = OBJ_NONE; 896 } 897 898 899 /************************************************************************* 900 |* 901 |* 902 |* 903 \************************************************************************/ 904 905 String GraphCtrl::GetStringFromDouble( const double& rDouble ) 906 { 907 sal_Unicode cSep = 908 SvtSysLocale().GetLocaleData().getNumDecimalSep().GetChar(0); 909 String aStr( ::rtl::math::doubleToUString( rDouble, 910 rtl_math_StringFormat_F, 2, cSep )); 911 return aStr; 912 } 913 914 915 /************************************************************************* 916 www|* 917 |* 918 |* 919 \************************************************************************/ 920 921 IMPL_LINK( GraphCtrl, UpdateHdl, Timer*, pTimer ) 922 { 923 if ( aUpdateLink.IsSet() ) 924 aUpdateLink.Call( this ); 925 926 pTimer->Start(); 927 928 return 0L; 929 } 930 931 932 ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > GraphCtrl::CreateAccessible() 933 { 934 if( mpAccContext == NULL ) 935 { 936 Window* pParent = GetParent(); 937 938 DBG_ASSERT( pParent, "-GraphCtrl::CreateAccessible(): No Parent!" ); 939 940 if( pParent ) 941 { 942 ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > xAccParent( pParent->GetAccessible() ); 943 944 // #103856# Disable accessibility if no model/view data available 945 if( pView && 946 pModel && 947 xAccParent.is() ) 948 { 949 mpAccContext = new SvxGraphCtrlAccessibleContext( xAccParent, *this ); 950 mpAccContext->acquire(); 951 } 952 } 953 } 954 955 return mpAccContext; 956 } 957