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 "Window.hxx" 32 #include <sfx2/dispatch.hxx> 33 #include <sfx2/request.hxx> 34 35 #include <sfx2/viewfrm.hxx> 36 #include <svx/svxids.hrc> 37 38 #include <editeng/outliner.hxx> 39 #include <editeng/editview.hxx> 40 41 #include "app.hrc" 42 #include "helpids.h" 43 #include "ViewShell.hxx" 44 #include "DrawViewShell.hxx" 45 #include "View.hxx" 46 #include "FrameView.hxx" 47 #include "OutlineViewShell.hxx" 48 #include "drawdoc.hxx" 49 #include "AccessibleDrawDocumentView.hxx" 50 #include "WindowUpdater.hxx" 51 52 namespace sd { 53 54 #define SCROLL_LINE_FACT 0.05 // Faktor fuer Zeilenscrolling 55 #define SCROLL_PAGE_FACT 0.5 // Faktor fuer Seitenscrolling 56 #define SCROLL_SENSITIVE 20 // Sensitiver Bereich (Pixel) 57 #define ZOOM_MULTIPLICATOR 10000 // Multiplikator um Rundungsfehler zu vermeiden 58 #define MIN_ZOOM 5 // Minimaler Zoomfaktor 59 #define MAX_ZOOM 3000 // Maximaler Zoomfaktor 60 61 62 /************************************************************************* 63 |* 64 |* Konstruktor 65 |* 66 \************************************************************************/ 67 68 Window::Window(::Window* pParent) 69 : ::Window(pParent, WinBits(WB_CLIPCHILDREN | WB_DIALOGCONTROL)), 70 DropTargetHelper( this ), 71 mpShareWin(NULL), 72 maWinPos(0, 0), // vorsichtshalber; die Werte sollten aber 73 maViewOrigin(0, 0), // vom Besitzer des Fensters neu gesetzt 74 maViewSize(1000, 1000), // werden 75 mnMinZoom(MIN_ZOOM), 76 mnMaxZoom(MAX_ZOOM), 77 mbMinZoomAutoCalc(false), 78 mbCalcMinZoomByMinSide(true), 79 mbCenterAllowed(true), 80 mnTicks (0), 81 mbDraggedFrom(false), 82 mpViewShell(NULL), 83 mbUseDropScroll (true) 84 { 85 SetDialogControlFlags( WINDOW_DLGCTRL_RETURN | WINDOW_DLGCTRL_WANTFOCUS ); 86 87 MapMode aMap(GetMapMode()); 88 aMap.SetMapUnit(MAP_100TH_MM); 89 SetMapMode(aMap); 90 91 // Damit im Diamodus die ::WindowColor genommen wird 92 SetBackground( Wallpaper( GetSettings().GetStyleSettings().GetWindowColor() ) ); 93 94 // adjust contrast mode initially 95 bool bUseContrast = GetSettings().GetStyleSettings().GetHighContrastMode(); 96 SetDrawMode( bUseContrast 97 ? ViewShell::OUTPUT_DRAWMODE_CONTRAST 98 : ViewShell::OUTPUT_DRAWMODE_COLOR ); 99 100 // Hilfe-ID setzen 101 // SetHelpId(HID_SD_WIN_DOCUMENT); 102 SetUniqueId(HID_SD_WIN_DOCUMENT); 103 104 // #i78183# Added after discussed with AF 105 EnableRTL(sal_False); 106 } 107 108 /************************************************************************* 109 |* 110 |* Destruktor 111 |* 112 \************************************************************************/ 113 114 Window::~Window (void) 115 { 116 if (mpViewShell != NULL) 117 { 118 WindowUpdater* pWindowUpdater = mpViewShell->GetWindowUpdater(); 119 if (pWindowUpdater != NULL) 120 pWindowUpdater->UnregisterWindow (this); 121 } 122 } 123 124 125 126 127 void Window::SetViewShell (ViewShell* pViewSh) 128 { 129 WindowUpdater* pWindowUpdater = NULL; 130 // Unregister at device updater of old view shell. 131 if (mpViewShell != NULL) 132 { 133 pWindowUpdater = mpViewShell->GetWindowUpdater(); 134 if (pWindowUpdater != NULL) 135 pWindowUpdater->UnregisterWindow (this); 136 } 137 138 mpViewShell = pViewSh; 139 140 // Register at device updater of new view shell 141 if (mpViewShell != NULL) 142 { 143 pWindowUpdater = mpViewShell->GetWindowUpdater(); 144 if (pWindowUpdater != NULL) 145 pWindowUpdater->RegisterWindow (this); 146 } 147 } 148 149 void Window::CalcMinZoom() 150 { 151 // Are we entitled to change the minimal zoom factor? 152 if ( mbMinZoomAutoCalc ) 153 { 154 // Get current zoom factor. 155 long nZoom = GetZoom(); 156 157 if ( mpShareWin ) 158 { 159 mpShareWin->CalcMinZoom(); 160 mnMinZoom = mpShareWin->mnMinZoom; 161 } 162 else 163 { 164 // Get the rectangle of the output area in logical coordinates 165 // and calculate the scaling factors that would lead to the view 166 // area (also called application area) to completely fill the 167 // window. 168 Size aWinSize = PixelToLogic(GetOutputSizePixel()); 169 sal_uLong nX = (sal_uLong) ((double) aWinSize.Width() 170 * (double) ZOOM_MULTIPLICATOR / (double) maViewSize.Width()); 171 sal_uLong nY = (sal_uLong) ((double) aWinSize.Height() 172 * (double) ZOOM_MULTIPLICATOR / (double) maViewSize.Height()); 173 174 // Decide whether to take the larger or the smaller factor. 175 sal_uLong nFact; 176 if (mbCalcMinZoomByMinSide) 177 nFact = Min(nX, nY); 178 else 179 nFact = Max(nX, nY); 180 181 // The factor is tansfomed according to the current zoom factor. 182 nFact = nFact * nZoom / ZOOM_MULTIPLICATOR; 183 mnMinZoom = Max((sal_uInt16) MIN_ZOOM, (sal_uInt16) nFact); 184 } 185 // If the current zoom factor is smaller than the calculated minimal 186 // zoom factor then set the new minimal factor as the current zoom 187 // factor. 188 if ( nZoom < (long) mnMinZoom ) 189 SetZoomFactor(mnMinZoom); 190 } 191 } 192 193 194 195 196 void Window::SetMinZoom (long int nMin) 197 { 198 mnMinZoom = (sal_uInt16) nMin; 199 } 200 201 202 203 204 long Window::GetMinZoom (void) const 205 { 206 return mnMinZoom; 207 } 208 209 210 211 212 void Window::SetMaxZoom (long int nMax) 213 { 214 mnMaxZoom = (sal_uInt16) nMax; 215 } 216 217 218 219 220 long Window::GetMaxZoom (void) const 221 { 222 return mnMaxZoom; 223 } 224 225 226 227 228 long Window::GetZoom (void) const 229 { 230 if( GetMapMode().GetScaleX().GetDenominator() ) 231 { 232 return GetMapMode().GetScaleX().GetNumerator() * 100L 233 / GetMapMode().GetScaleX().GetDenominator(); 234 } 235 else 236 { 237 return 0; 238 } 239 } 240 241 242 243 244 /************************************************************************* 245 |* 246 |* Resize event 247 |* 248 \************************************************************************/ 249 250 void Window::Resize() 251 { 252 ::Window::Resize(); 253 CalcMinZoom(); 254 255 if( mpViewShell && mpViewShell->GetViewFrame() ) 256 mpViewShell->GetViewFrame()->GetBindings().Invalidate( SID_ATTR_ZOOMSLIDER ); 257 } 258 259 /************************************************************************* 260 |* 261 |* PrePaint event 262 |* 263 \************************************************************************/ 264 265 void Window::PrePaint() 266 { 267 if ( mpViewShell ) 268 mpViewShell->PrePaint(); 269 } 270 271 /************************************************************************* 272 |* 273 |* Paint event 274 |* 275 \************************************************************************/ 276 277 void Window::Paint(const Rectangle& rRect) 278 { 279 if ( mpViewShell ) 280 mpViewShell->Paint(rRect, this); 281 } 282 283 /************************************************************************* 284 |* 285 |* Keyboard event 286 |* 287 \************************************************************************/ 288 289 void Window::KeyInput(const KeyEvent& rKEvt) 290 { 291 if (!(mpViewShell && mpViewShell->KeyInput(rKEvt, this))) 292 { 293 if (mpViewShell && rKEvt.GetKeyCode().GetCode() == KEY_ESCAPE) 294 { 295 mpViewShell->GetViewShell()->Escape(); 296 } 297 else 298 { 299 ::Window::KeyInput(rKEvt); 300 } 301 } 302 } 303 304 /************************************************************************* 305 |* 306 |* MouseButtonDown event 307 |* 308 \************************************************************************/ 309 310 void Window::MouseButtonDown(const MouseEvent& rMEvt) 311 { 312 if ( mpViewShell ) 313 mpViewShell->MouseButtonDown(rMEvt, this); 314 } 315 316 /************************************************************************* 317 |* 318 |* MouseMove event 319 |* 320 \************************************************************************/ 321 322 void Window::MouseMove(const MouseEvent& rMEvt) 323 { 324 if ( mpViewShell ) 325 mpViewShell->MouseMove(rMEvt, this); 326 } 327 328 /************************************************************************* 329 |* 330 |* MouseButtonUp event 331 |* 332 \************************************************************************/ 333 334 void Window::MouseButtonUp(const MouseEvent& rMEvt) 335 { 336 mnTicks = 0; 337 338 if ( mpViewShell ) 339 mpViewShell->MouseButtonUp(rMEvt, this); 340 } 341 342 /************************************************************************* 343 |* 344 |* Command event 345 |* 346 \************************************************************************/ 347 348 void Window::Command(const CommandEvent& rCEvt) 349 { 350 if ( mpViewShell ) 351 mpViewShell->Command(rCEvt, this); 352 } 353 354 long Window::Notify( NotifyEvent& rNEvt ) 355 { 356 long nResult = sal_False; 357 if ( mpViewShell ) 358 { 359 nResult = mpViewShell->Notify(rNEvt, this); 360 } 361 if( !nResult ) 362 nResult = ::Window::Notify( rNEvt ); 363 364 return nResult; 365 } 366 367 368 /************************************************************************* 369 |* 370 |* RequestHelp event 371 |* 372 \************************************************************************/ 373 374 void Window::RequestHelp(const HelpEvent& rEvt) 375 { 376 if ( mpViewShell ) 377 { 378 if( !mpViewShell->RequestHelp( rEvt, this) ) 379 ::Window::RequestHelp( rEvt ); 380 } 381 else 382 ::Window::RequestHelp( rEvt ); 383 } 384 385 386 387 388 Point Window::GetWinViewPos (void) const 389 { 390 return maWinPos; 391 } 392 393 394 395 396 Point Window::GetViewOrigin (void) const 397 { 398 return maViewOrigin; 399 } 400 401 402 403 404 Size Window::GetViewSize (void) const 405 { 406 return maViewSize; 407 } 408 409 410 411 412 /************************************************************************* 413 |* 414 |* Position der linken oberen Ecke des im Fenster sichtbaren Bereichs 415 |* setzen 416 |* 417 \************************************************************************/ 418 419 void Window::SetWinViewPos(const Point& rPnt) 420 { 421 maWinPos = rPnt; 422 } 423 424 /************************************************************************* 425 |* 426 |* Ursprung der Darstellung in Bezug zur gesamten Arbeitsflaeche setzen 427 |* 428 \************************************************************************/ 429 430 void Window::SetViewOrigin(const Point& rPnt) 431 { 432 maViewOrigin = rPnt; 433 } 434 435 /************************************************************************* 436 |* 437 |* Groesse der gesamten Arbeitsflaeche, die mit dem Fenster betrachtet 438 |* werden kann, setzen 439 |* 440 \************************************************************************/ 441 442 void Window::SetViewSize(const Size& rSize) 443 { 444 maViewSize = rSize; 445 CalcMinZoom(); 446 } 447 448 449 450 451 void Window::SetCenterAllowed (bool bIsAllowed) 452 { 453 mbCenterAllowed = bIsAllowed; 454 } 455 456 457 458 459 long Window::SetZoomFactor(long nZoom) 460 { 461 // Clip the zoom factor to the valid range marked by nMinZoom as 462 // calculated by CalcMinZoom() and the constant MAX_ZOOM. 463 if ( nZoom > MAX_ZOOM ) 464 nZoom = MAX_ZOOM; 465 if ( nZoom < (long) mnMinZoom ) 466 nZoom = mnMinZoom; 467 468 // Set the zoom factor at the window's map mode. 469 MapMode aMap(GetMapMode()); 470 aMap.SetScaleX(Fraction(nZoom, 100)); 471 aMap.SetScaleY(Fraction(nZoom, 100)); 472 SetMapMode(aMap); 473 474 // Update the map mode's origin (to what effect?). 475 UpdateMapOrigin(); 476 477 // Update the view's snapping to the the new zoom factor. 478 if ( mpViewShell && mpViewShell->ISA(DrawViewShell) ) 479 ((DrawViewShell*) mpViewShell)->GetView()-> 480 RecalcLogicSnapMagnetic(*this); 481 482 // Return the zoom factor just in case it has been changed above to lie 483 // inside the valid range. 484 return nZoom; 485 } 486 487 void Window::SetZoomIntegral(long nZoom) 488 { 489 // Clip the zoom factor to the valid range marked by nMinZoom as 490 // previously calculated by <member>CalcMinZoom()</member> and the 491 // MAX_ZOOM constant. 492 if ( nZoom > MAX_ZOOM ) 493 nZoom = MAX_ZOOM; 494 if ( nZoom < (long) mnMinZoom ) 495 nZoom = mnMinZoom; 496 497 // Calculate the window's new origin. 498 Size aSize = PixelToLogic(GetOutputSizePixel()); 499 long nW = aSize.Width() * GetZoom() / nZoom; 500 long nH = aSize.Height() * GetZoom() / nZoom; 501 maWinPos.X() += (aSize.Width() - nW) / 2; 502 maWinPos.Y() += (aSize.Height() - nH) / 2; 503 if ( maWinPos.X() < 0 ) maWinPos.X() = 0; 504 if ( maWinPos.Y() < 0 ) maWinPos.Y() = 0; 505 506 // Finally update this window's map mode to the given zoom factor that 507 // has been clipped to the valid range. 508 SetZoomFactor(nZoom); 509 } 510 511 long Window::GetZoomForRect( const Rectangle& rZoomRect ) 512 { 513 long nRetZoom = 100; 514 515 if( (rZoomRect.GetWidth() != 0) && (rZoomRect.GetHeight() != 0)) 516 { 517 // Calculate the scale factors which will lead to the given 518 // rectangle being fully visible (when translated accordingly) as 519 // large as possible in the output area independently in both 520 // coordinate directions . 521 sal_uLong nX(0L); 522 sal_uLong nY(0L); 523 524 const Size aWinSize( PixelToLogic(GetOutputSizePixel()) ); 525 if(rZoomRect.GetHeight()) 526 { 527 nX = (sal_uLong) ((double) aWinSize.Height() 528 * (double) ZOOM_MULTIPLICATOR / (double) rZoomRect.GetHeight()); 529 } 530 531 if(rZoomRect.GetWidth()) 532 { 533 nY = (sal_uLong) ((double) aWinSize.Width() 534 * (double) ZOOM_MULTIPLICATOR / (double) rZoomRect.GetWidth()); 535 } 536 537 // Use the smaller one of both so that the zoom rectangle will be 538 // fully visible with respect to both coordinate directions. 539 sal_uLong nFact = Min(nX, nY); 540 541 // Transform the current zoom factor so that it leads to the desired 542 // scaling. 543 nRetZoom = nFact * GetZoom() / ZOOM_MULTIPLICATOR; 544 545 // Calculate the new origin. 546 if ( nFact == 0 ) 547 { 548 // Don't change anything if the scale factor is degenrate. 549 nRetZoom = GetZoom(); 550 } 551 else 552 { 553 // Clip the zoom factor to the valid range marked by nMinZoom as 554 // previously calculated by <member>CalcMinZoom()</member> and the 555 // MAX_ZOOM constant. 556 if ( nRetZoom > MAX_ZOOM ) 557 nRetZoom = MAX_ZOOM; 558 if ( nRetZoom < (long) mnMinZoom ) 559 nRetZoom = mnMinZoom; 560 } 561 } 562 563 return nRetZoom; 564 } 565 566 /** Recalculate the zoom factor and translation so that the given rectangle 567 is displayed centered and as large as possible while still being fully 568 visible in the window. 569 */ 570 long Window::SetZoomRect (const Rectangle& rZoomRect) 571 { 572 long nNewZoom = 100; 573 574 if (rZoomRect.GetWidth() == 0 || rZoomRect.GetHeight() == 0) 575 { 576 // The given rectangle is degenerate. Use the default zoom factor 577 // (above) of 100%. 578 SetZoomIntegral(nNewZoom); 579 } 580 else 581 { 582 Point aPos = rZoomRect.TopLeft(); 583 // Transform the output area from pixel coordinates into logical 584 // coordinates. 585 Size aWinSize = PixelToLogic(GetOutputSizePixel()); 586 // Paranoia! The degenerate case of zero width or height has been 587 // taken care of above. 588 DBG_ASSERT(rZoomRect.GetWidth(), "ZoomRect-Breite = 0!"); 589 DBG_ASSERT(rZoomRect.GetHeight(), "ZoomRect-Hoehe = 0!"); 590 591 // Calculate the scale factors which will lead to the given 592 // rectangle being fully visible (when translated accordingly) as 593 // large as possible in the output area independently in both 594 // coordinate directions . 595 sal_uLong nX(0L); 596 sal_uLong nY(0L); 597 598 if(rZoomRect.GetHeight()) 599 { 600 nX = (sal_uLong) ((double) aWinSize.Height() 601 * (double) ZOOM_MULTIPLICATOR / (double) rZoomRect.GetHeight()); 602 } 603 604 if(rZoomRect.GetWidth()) 605 { 606 nY = (sal_uLong) ((double) aWinSize.Width() 607 * (double) ZOOM_MULTIPLICATOR / (double) rZoomRect.GetWidth()); 608 } 609 610 // Use the smaller one of both so that the zoom rectangle will be 611 // fully visible with respect to both coordinate directions. 612 sal_uLong nFact = Min(nX, nY); 613 614 // Transform the current zoom factor so that it leads to the desired 615 // scaling. 616 long nZoom = nFact * GetZoom() / ZOOM_MULTIPLICATOR; 617 618 // Calculate the new origin. 619 if ( nFact == 0 ) 620 { 621 // Don't change anything if the scale factor is degenrate. 622 nNewZoom = GetZoom(); 623 } 624 else 625 { 626 // Calculate the new window position that centers the given 627 // rectangle on the screen. 628 if ( nZoom > MAX_ZOOM ) 629 nFact = nFact * MAX_ZOOM / nZoom; 630 631 maWinPos = maViewOrigin + aPos; 632 633 aWinSize.Width() = (long) ((double) aWinSize.Width() * (double) ZOOM_MULTIPLICATOR / (double) nFact); 634 maWinPos.X() += (rZoomRect.GetWidth() - aWinSize.Width()) / 2; 635 aWinSize.Height() = (long) ((double) aWinSize.Height() * (double) ZOOM_MULTIPLICATOR / (double) nFact); 636 maWinPos.Y() += (rZoomRect.GetHeight() - aWinSize.Height()) / 2; 637 638 if ( maWinPos.X() < 0 ) maWinPos.X() = 0; 639 if ( maWinPos.Y() < 0 ) maWinPos.Y() = 0; 640 641 // Adapt the window's map mode to the new zoom factor. 642 nNewZoom = SetZoomFactor(nZoom); 643 } 644 } 645 646 return(nNewZoom); 647 } 648 649 650 651 652 void Window::SetMinZoomAutoCalc (bool bAuto) 653 { 654 mbMinZoomAutoCalc = bAuto; 655 } 656 657 658 659 660 /************************************************************************* 661 |* 662 |* Neuen MapMode-Origin berechnen und setzen; wenn aWinPos.X()/Y() 663 |* gleich -1 ist, wird die entsprechende Position zentriert 664 |* (z.B. fuer Initialisierung) 665 |* 666 \************************************************************************/ 667 668 void Window::UpdateMapOrigin(sal_Bool bInvalidate) 669 { 670 sal_Bool bChanged = sal_False; 671 Size aWinSize = PixelToLogic(GetOutputSizePixel()); 672 673 if ( mbCenterAllowed ) 674 { 675 if ( maWinPos.X() > maViewSize.Width() - aWinSize.Width() ) 676 { 677 maWinPos.X() = maViewSize.Width() - aWinSize.Width(); 678 bChanged = sal_True; 679 } 680 if ( maWinPos.Y() > maViewSize.Height() - aWinSize.Height() ) 681 { 682 maWinPos.Y() = maViewSize.Height() - aWinSize.Height(); 683 bChanged = sal_True; 684 } 685 if ( aWinSize.Width() > maViewSize.Width() || maWinPos.X() < 0 ) 686 { 687 maWinPos.X() = maViewSize.Width() / 2 - aWinSize.Width() / 2; 688 bChanged = sal_True; 689 } 690 if ( aWinSize.Height() > maViewSize.Height() || maWinPos.Y() < 0 ) 691 { 692 maWinPos.Y() = maViewSize.Height() / 2 - aWinSize.Height() / 2; 693 bChanged = sal_True; 694 } 695 } 696 697 UpdateMapMode (); 698 699 if (bChanged && bInvalidate) 700 Invalidate(); 701 } 702 703 704 705 706 void Window::UpdateMapMode (void) 707 { 708 Size aWinSize = PixelToLogic(GetOutputSizePixel()); 709 maWinPos -= maViewOrigin; 710 Size aPix(maWinPos.X(), maWinPos.Y()); 711 aPix = LogicToPixel(aPix); 712 // Groesse muss vielfaches von BRUSH_SIZE sein, damit Muster 713 // richtig dargestellt werden 714 // #i2237# 715 // removed old stuff here which still forced zoom to be 716 // %BRUSH_SIZE which is outdated now 717 718 if (mpViewShell && mpViewShell->ISA(DrawViewShell)) 719 { 720 Size aViewSizePixel = LogicToPixel(maViewSize); 721 Size aWinSizePixel = LogicToPixel(aWinSize); 722 723 // Seite soll nicht am Fensterrand "kleben" 724 if (aPix.Width() == 0) 725 { 726 // #i2237# 727 // Since BRUSH_SIZE alignment is outdated now, i use the 728 // former constant here directly 729 aPix.Width() -= 8; 730 } 731 if (aPix.Height() == 0) 732 { 733 // #i2237# 734 // Since BRUSH_SIZE alignment is outdated now, i use the 735 // former constant here directly 736 aPix.Height() -= 8; 737 } 738 } 739 740 aPix = PixelToLogic(aPix); 741 maWinPos.X() = aPix.Width(); 742 maWinPos.Y() = aPix.Height(); 743 Point aNewOrigin (-maWinPos.X(), -maWinPos.Y()); 744 maWinPos += maViewOrigin; 745 746 MapMode aMap(GetMapMode()); 747 aMap.SetOrigin(aNewOrigin); 748 SetMapMode(aMap); 749 } 750 751 752 753 754 /************************************************************************* 755 |* 756 |* X-Position des sichtbaren Bereichs als Bruchteil (< 1) 757 |* der gesamten Arbeitsbereichbreite zuruegeben 758 |* 759 \************************************************************************/ 760 761 double Window::GetVisibleX() 762 { 763 return ((double) maWinPos.X() / maViewSize.Width()); 764 } 765 766 /************************************************************************* 767 |* 768 |* Y-Position des sichtbaren Bereichs als Bruchteil (< 1) 769 |* der gesamten Arbeitsbereichhoehe zuruegeben 770 |* 771 \************************************************************************/ 772 773 double Window::GetVisibleY() 774 { 775 return ((double) maWinPos.Y() / maViewSize.Height()); 776 } 777 778 /************************************************************************* 779 |* 780 |* X- und Y-Position des sichtbaren Bereichs als Bruchteile (< 1) 781 |* der gesamten Arbeitsbereichgroesse setzen 782 |* negative Werte werden ignoriert 783 |* 784 \************************************************************************/ 785 786 void Window::SetVisibleXY(double fX, double fY) 787 { 788 long nOldX = maWinPos.X(); 789 long nOldY = maWinPos.Y(); 790 791 if ( fX >= 0 ) 792 maWinPos.X() = (long) (fX * maViewSize.Width()); 793 if ( fY >= 0 ) 794 maWinPos.Y() = (long) (fY * maViewSize.Height()); 795 UpdateMapOrigin(sal_False); 796 // Size sz(nOldX - aWinPos.X(), nOldY - aWinPos.Y()); 797 // sz = LogicToPixel(sz); 798 Scroll(nOldX - maWinPos.X(), nOldY - maWinPos.Y(), SCROLL_CHILDREN); 799 Update(); 800 } 801 802 /************************************************************************* 803 |* 804 |* Breite des sichtbaren Bereichs im Verhaeltnis zur 805 |* gesamten Arbeitsbereichbreite zuruegeben 806 |* 807 \************************************************************************/ 808 809 double Window::GetVisibleWidth() 810 { 811 Size aWinSize = PixelToLogic(GetOutputSizePixel()); 812 if ( aWinSize.Width() > maViewSize.Width() ) 813 aWinSize.Width() = maViewSize.Width(); 814 return ((double) aWinSize.Width() / maViewSize.Width()); 815 } 816 817 /************************************************************************* 818 |* 819 |* Hoehe des sichtbaren Bereichs im Verhaeltnis zur 820 |* gesamten Arbeitsbereichhoehe zuruegeben 821 |* 822 \************************************************************************/ 823 824 double Window::GetVisibleHeight() 825 { 826 Size aWinSize = PixelToLogic(GetOutputSizePixel()); 827 if ( aWinSize.Height() > maViewSize.Height() ) 828 aWinSize.Height() = maViewSize.Height(); 829 return ((double) aWinSize.Height() / maViewSize.Height()); 830 } 831 832 /************************************************************************* 833 |* 834 |* Breite einer Scrollspalte im Verhaeltnis zur gesamten 835 |* Arbeitsbereichbreite zuruegeben 836 |* 837 \************************************************************************/ 838 839 double Window::GetScrlLineWidth() 840 { 841 return (GetVisibleWidth() * SCROLL_LINE_FACT); 842 } 843 844 /************************************************************************* 845 |* 846 |* Breite einer Scrollspalte im Verhaeltnis zur gesamten 847 |* Arbeitsbereichhoehe zuruegeben 848 |* 849 \************************************************************************/ 850 851 double Window::GetScrlLineHeight() 852 { 853 return (GetVisibleHeight() * SCROLL_LINE_FACT); 854 } 855 856 /************************************************************************* 857 |* 858 |* Breite einer Scrollpage im Verhaeltnis zur gesamten 859 |* Arbeitsbereichbreite zuruegeben 860 |* 861 \************************************************************************/ 862 863 double Window::GetScrlPageWidth() 864 { 865 return (GetVisibleWidth() * SCROLL_PAGE_FACT); 866 } 867 868 /************************************************************************* 869 |* 870 |* Breite einer Scrollpage im Verhaeltnis zur gesamten 871 |* Arbeitsbereichhoehe zuruegeben 872 |* 873 \************************************************************************/ 874 875 double Window::GetScrlPageHeight() 876 { 877 return (GetVisibleHeight() * SCROLL_PAGE_FACT); 878 } 879 880 /************************************************************************* 881 |* 882 |* Fenster deaktivieren 883 |* 884 \************************************************************************/ 885 886 void Window::LoseFocus() 887 { 888 mnTicks = 0; 889 ::Window::LoseFocus (); 890 } 891 892 /************************************************************************* 893 |* 894 |* Fenster aktivieren 895 |* 896 \************************************************************************/ 897 898 void Window::GrabFocus() 899 { 900 mnTicks = 0; 901 ::Window::GrabFocus (); 902 } 903 904 905 /************************************************************************* 906 |* 907 |* DataChanged 908 |* 909 \************************************************************************/ 910 911 void Window::DataChanged( const DataChangedEvent& rDCEvt ) 912 { 913 ::Window::DataChanged( rDCEvt ); 914 915 // PRINTER bei allen Dokumenten weglassen, die keinen Printer benutzen. 916 // FONTS und FONTSUBSTITUTION weglassen, wenn keine Textausgaben 917 // vorhanden sind, bzw. wenn das Dokument keinen Text zulaesst. 918 919 if ( (rDCEvt.GetType() == DATACHANGED_PRINTER) || 920 (rDCEvt.GetType() == DATACHANGED_DISPLAY) || 921 (rDCEvt.GetType() == DATACHANGED_FONTS) || 922 (rDCEvt.GetType() == DATACHANGED_FONTSUBSTITUTION) || 923 ((rDCEvt.GetType() == DATACHANGED_SETTINGS) && 924 (rDCEvt.GetFlags() & SETTINGS_STYLE)) ) 925 { 926 if ( (rDCEvt.GetType() == DATACHANGED_SETTINGS) && 927 (rDCEvt.GetFlags() & SETTINGS_STYLE) ) 928 { 929 // When the screen zoom factor has changed then reset the zoom 930 // factor of the frame to allways display the whole page. 931 const AllSettings* pOldSettings = rDCEvt.GetOldSettings (); 932 const AllSettings& rNewSettings = GetSettings (); 933 if (pOldSettings) 934 if (pOldSettings->GetStyleSettings().GetScreenZoom() 935 != rNewSettings.GetStyleSettings().GetScreenZoom()) 936 mpViewShell->GetViewFrame()->GetDispatcher()-> 937 Execute(SID_SIZE_PAGE, SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD); 938 939 // ScrollBars neu anordnen bzw. Resize ausloesen, da sich 940 // ScrollBar-Groesse geaendert haben kann. Dazu muss dann im 941 // Resize-Handler aber auch die Groesse der ScrollBars aus 942 // den Settings abgefragt werden. 943 Resize(); 944 945 // Daten neu Setzen, die aus den Systemeinstellungen bzw. aus 946 // den Settings uebernommen werden. Evtl. weitere Daten neu 947 // berechnen, da sich auch die Aufloesung hierdurch geaendert 948 // haben kann. 949 if( mpViewShell ) 950 { 951 const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings(); 952 SvtAccessibilityOptions aAccOptions; 953 sal_uLong nOutputMode; 954 sal_uInt16 nPreviewSlot; 955 956 if( rStyleSettings.GetHighContrastMode() ) 957 nOutputMode = ViewShell::OUTPUT_DRAWMODE_CONTRAST; 958 else 959 nOutputMode = ViewShell::OUTPUT_DRAWMODE_COLOR; 960 961 if( rStyleSettings.GetHighContrastMode() && aAccOptions.GetIsForPagePreviews() ) 962 nPreviewSlot = SID_PREVIEW_QUALITY_CONTRAST; 963 else 964 nPreviewSlot = SID_PREVIEW_QUALITY_COLOR; 965 966 if( mpViewShell->ISA( DrawViewShell ) ) 967 { 968 SetDrawMode( nOutputMode ); 969 mpViewShell->GetFrameView()->SetDrawMode( nOutputMode ); 970 // #110094#-7 971 // mpViewShell->GetView()->ReleaseMasterPagePaintCache(); 972 Invalidate(); 973 } 974 975 // #103100# Overwrite window color for OutlineView 976 if( mpViewShell->ISA(OutlineViewShell ) ) 977 { 978 svtools::ColorConfig aColorConfig; 979 const Color aDocColor( aColorConfig.GetColorValue( svtools::DOCCOLOR ).nColor ); 980 SetBackground( Wallpaper( aDocColor ) ); 981 } 982 983 SfxRequest aReq( nPreviewSlot, 0, mpViewShell->GetDocSh()->GetDoc()->GetItemPool() ); 984 mpViewShell->ExecReq( aReq ); 985 mpViewShell->Invalidate(); 986 mpViewShell->ArrangeGUIElements(); 987 988 // #101928# re-create handles to show new outfit 989 if(mpViewShell->ISA(DrawViewShell)) 990 { 991 mpViewShell->GetView()->AdjustMarkHdl(); 992 } 993 } 994 } 995 996 if ( (rDCEvt.GetType() == DATACHANGED_DISPLAY) || 997 ((rDCEvt.GetType() == DATACHANGED_SETTINGS) && 998 (rDCEvt.GetFlags() & SETTINGS_STYLE)) ) 999 { 1000 // Virtuelle Device die auch von der Aufloesung oder von 1001 // Systemeinstellungen abhaengen, sollten geupdatet werden. 1002 // Ansonsten sollte zumindest bei DATACHANGED_DISPLAY 1003 // die virtuellen Devices geupdatet werden, da es einige 1004 // Systeme erlauben die Aufloesung und Farbtiefe waehrend 1005 // der Laufzeit zu aendern oder eben bei Palettenaenderungen 1006 // die virtuellen Device geupdatet werden muessen, da bei 1007 // Ausgaben ein anderes Farbmatching stattfinden kann. 1008 } 1009 1010 if ( rDCEvt.GetType() == DATACHANGED_FONTS ) 1011 { 1012 // Wenn das Dokument Font-AuswahlBoxen anbietet, muessen 1013 // diese geupdatet werden. Wie dies genau aussehen muss, 1014 // weiss ich leider auch nicht. Aber evtl. kann man das 1015 // ja global handeln. Dies muessten wir evtl. mal 1016 // mit PB absprechen, aber der ist derzeit leider Krank. 1017 // Also bevor dies hier gehandelt wird, vorher mit 1018 // PB und mir absprechen. 1019 } 1020 1021 if ( (rDCEvt.GetType() == DATACHANGED_FONTS) || 1022 (rDCEvt.GetType() == DATACHANGED_FONTSUBSTITUTION) ) 1023 { 1024 // Formatierung neu durchfuehren, da Fonts die im Dokument 1025 // vorkommen, nicht mehr vorhanden sein muessen oder 1026 // jetzt vorhanden sind oder durch andere ersetzt wurden 1027 // sind. 1028 if( mpViewShell ) 1029 { 1030 DrawDocShell* pDocSh = mpViewShell->GetDocSh(); 1031 if( pDocSh ) 1032 pDocSh->SetPrinter( pDocSh->GetPrinter( sal_True ) ); 1033 } 1034 } 1035 1036 if ( rDCEvt.GetType() == DATACHANGED_PRINTER ) 1037 { 1038 // Wie hier die Behandlung aussehen soll, weiss ich leider 1039 // selbst noch nicht. Evtl. mal einen Printer loeschen und 1040 // schauen was gemacht werden muss. Evtl. muesste ich in 1041 // VCL dafuer noch etwas einbauen, wenn der benutze Printer 1042 // geloescht wird. Ansonsten wuerde ich hier evtl. die 1043 // Formatierung neu berechnen, wenn der aktuelle Drucker 1044 // zerstoert wurde. 1045 if( mpViewShell ) 1046 { 1047 DrawDocShell* pDocSh = mpViewShell->GetDocSh(); 1048 if( pDocSh ) 1049 pDocSh->SetPrinter( pDocSh->GetPrinter( sal_True ) ); 1050 } 1051 } 1052 1053 // Alles neu ausgeben 1054 Invalidate(); 1055 } 1056 } 1057 1058 1059 1060 1061 /************************************************************************* 1062 |* 1063 |* DropTargetHelper::AcceptDrop 1064 |* 1065 \************************************************************************/ 1066 1067 sal_Int8 Window::AcceptDrop( const AcceptDropEvent& rEvt ) 1068 { 1069 sal_Int8 nRet = DND_ACTION_NONE; 1070 1071 if( mpViewShell && !mpViewShell->GetDocSh()->IsReadOnly() ) 1072 { 1073 if( mpViewShell ) 1074 nRet = mpViewShell->AcceptDrop( rEvt, *this, this, SDRPAGE_NOTFOUND, SDRLAYER_NOTFOUND ); 1075 1076 if (mbUseDropScroll && ! mpViewShell->ISA(OutlineViewShell)) 1077 DropScroll( rEvt.maPosPixel ); 1078 } 1079 1080 return nRet; 1081 } 1082 1083 /************************************************************************* 1084 |* 1085 |* DropTargetHelper::ExecuteDrop 1086 |* 1087 \************************************************************************/ 1088 1089 sal_Int8 Window::ExecuteDrop( const ExecuteDropEvent& rEvt ) 1090 { 1091 sal_Int8 nRet = DND_ACTION_NONE; 1092 1093 if( mpViewShell ) 1094 { 1095 nRet = mpViewShell->ExecuteDrop( rEvt, *this, this, SDRPAGE_NOTFOUND, SDRLAYER_NOTFOUND ); 1096 } 1097 1098 return nRet; 1099 } 1100 1101 1102 1103 1104 void Window::SetUseDropScroll (bool bUseDropScroll) 1105 { 1106 mbUseDropScroll = bUseDropScroll; 1107 } 1108 1109 1110 1111 1112 /************************************************************************* 1113 |* 1114 |* Scrolling bei AcceptDrop-Events 1115 |* 1116 \************************************************************************/ 1117 1118 void Window::DropScroll(const Point& rMousePos) 1119 { 1120 short nDx = 0; 1121 short nDy = 0; 1122 1123 Size aSize = GetOutputSizePixel(); 1124 1125 if (aSize.Width() > SCROLL_SENSITIVE * 3) 1126 { 1127 if ( rMousePos.X() < SCROLL_SENSITIVE ) 1128 { 1129 nDx = -1; 1130 } 1131 1132 if ( rMousePos.X() >= aSize.Width() - SCROLL_SENSITIVE ) 1133 { 1134 nDx = 1; 1135 } 1136 } 1137 1138 if (aSize.Height() > SCROLL_SENSITIVE * 3) 1139 { 1140 if ( rMousePos.Y() < SCROLL_SENSITIVE ) 1141 { 1142 nDy = -1; 1143 } 1144 1145 if ( rMousePos.Y() >= aSize.Height() - SCROLL_SENSITIVE ) 1146 { 1147 nDy = 1; 1148 } 1149 } 1150 1151 if ( (nDx || nDy) && (rMousePos.X()!=0 || rMousePos.Y()!=0 ) ) 1152 { 1153 if (mnTicks > 20) 1154 mpViewShell->ScrollLines(nDx, nDy); 1155 else 1156 mnTicks ++; 1157 } 1158 } 1159 1160 1161 1162 1163 ::com::sun::star::uno::Reference< 1164 ::com::sun::star::accessibility::XAccessible> 1165 Window::CreateAccessible (void) 1166 { 1167 if (mpViewShell != NULL) 1168 return mpViewShell->CreateAccessibleDocumentView (this); 1169 else 1170 { 1171 OSL_TRACE ("::sd::Window::CreateAccessible: no view shell"); 1172 return ::Window::CreateAccessible (); 1173 } 1174 } 1175 1176 XubString Window::GetSurroundingText() const 1177 { 1178 if ( mpViewShell->GetShellType() == ViewShell::ST_OUTLINE ) 1179 { 1180 return XubString(); 1181 } 1182 else if ( mpViewShell->GetView()->IsTextEdit() ) 1183 { 1184 OutlinerView *pOLV = mpViewShell->GetView()->GetTextEditOutlinerView(); 1185 return pOLV->GetEditView().GetSurroundingText(); 1186 } 1187 else 1188 { 1189 return XubString(); 1190 } 1191 } 1192 1193 Selection Window::GetSurroundingTextSelection() const 1194 { 1195 if ( mpViewShell->GetShellType() == ViewShell::ST_OUTLINE ) 1196 { 1197 return Selection( 0, 0 ); 1198 } 1199 else if ( mpViewShell->GetView()->IsTextEdit() ) 1200 { 1201 OutlinerView *pOLV = mpViewShell->GetView()->GetTextEditOutlinerView(); 1202 return pOLV->GetEditView().GetSurroundingTextSelection(); 1203 } 1204 else 1205 { 1206 return Selection( 0, 0 ); 1207 } 1208 } 1209 1210 } // end of namespace sd 1211