1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 * Copyright 2008 by Sun Microsystems, Inc.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * $RCSfile: sdwindow.cxx,v $
10 * $Revision: 1.38.8.1 $
12 * This file is part of OpenOffice.org.
14 * OpenOffice.org is free software: you can redistribute it and/or modify
15 * it under the terms of the GNU Lesser General Public License version 3
16 * only, as published by the Free Software Foundation.
18 * OpenOffice.org is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU Lesser General Public License version 3 for more details
22 * (a copy is included in the LICENSE file that accompanied this code).
24 * You should have received a copy of the GNU Lesser General Public License
25 * version 3 along with OpenOffice.org. If not, see
26 * <http://www.openoffice.org/license.html>
27 * for a copy of the LGPLv3 License.
29 ************************************************************************/
31 // MARKER(update_precomp.py): autogen include statement, do not remove
32 #include "precompiled_sd.hxx"
35 #include <sfx2/dispatch.hxx>
36 #include <sfx2/request.hxx>
38 #include <sfx2/viewfrm.hxx>
40 #include <svx/outliner.hxx>
42 #include <svx/editview.hxx>
46 #include "ViewShell.hxx"
47 #include "DrawViewShell.hxx"
49 #include "FrameView.hxx"
50 #include "OutlineViewShell.hxx"
51 #include "drawdoc.hxx"
52 #ifndef SD_ACCESSIBILITY_ACCESSIBLE_DRAW_DOCUMENT_VIEW_HXX
53 #include "AccessibleDrawDocumentView.hxx"
55 #ifndef SD_WINDOW_UPDATER_HXX
56 #include "WindowUpdater.hxx"
61 #define SCROLL_LINE_FACT 0.05 // Faktor fuer Zeilenscrolling
62 #define SCROLL_PAGE_FACT 0.5 // Faktor fuer Seitenscrolling
63 #define SCROLL_SENSITIVE 20 // Sensitiver Bereich (Pixel)
64 #define ZOOM_MULTIPLICATOR 10000 // Multiplikator um Rundungsfehler zu vermeiden
65 #define MIN_ZOOM 5 // Minimaler Zoomfaktor
66 #define MAX_ZOOM 3000 // Maximaler Zoomfaktor
69 /*************************************************************************
73 \************************************************************************/
75 Window::Window(::Window
* pParent
)
76 : ::Window(pParent
, WinBits(WB_CLIPCHILDREN
| WB_DIALOGCONTROL
)),
77 DropTargetHelper( this ),
79 maWinPos(0, 0), // vorsichtshalber; die Werte sollten aber
80 maViewOrigin(0, 0), // vom Besitzer des Fensters neu gesetzt
81 maViewSize(1000, 1000), // werden
85 mbMinZoomAutoCalc(false),
86 mbCalcMinZoomByMinSide(true),
87 mbCenterAllowed(true),
91 mbUseDropScroll (true)
93 SetDialogControlFlags( WINDOW_DLGCTRL_RETURN
| WINDOW_DLGCTRL_WANTFOCUS
);
95 MapMode
aMap(GetMapMode());
96 aMap
.SetMapUnit(MAP_100TH_MM
);
99 // Damit im Diamodus die ::WindowColor genommen wird
100 SetBackground( Wallpaper( GetSettings().GetStyleSettings().GetWindowColor() ) );
102 // adjust contrast mode initially
103 bool bUseContrast
= GetSettings().GetStyleSettings().GetHighContrastMode();
104 SetDrawMode( bUseContrast
105 ? ViewShell::OUTPUT_DRAWMODE_CONTRAST
106 : ViewShell::OUTPUT_DRAWMODE_COLOR
);
109 // SetHelpId(HID_SD_WIN_DOCUMENT);
110 SetUniqueId(HID_SD_WIN_DOCUMENT
);
112 // #i78183# Added after discussed with AF
116 /*************************************************************************
120 \************************************************************************/
122 Window::~Window (void)
124 if (mpViewShell
!= NULL
)
126 WindowUpdater
* pWindowUpdater
= mpViewShell
->GetWindowUpdater();
127 if (pWindowUpdater
!= NULL
)
128 pWindowUpdater
->UnregisterWindow (this);
135 void Window::SetViewShell (ViewShell
* pViewSh
)
137 WindowUpdater
* pWindowUpdater
= NULL
;
138 // Unregister at device updater of old view shell.
139 if (mpViewShell
!= NULL
)
141 pWindowUpdater
= mpViewShell
->GetWindowUpdater();
142 if (pWindowUpdater
!= NULL
)
143 pWindowUpdater
->UnregisterWindow (this);
146 mpViewShell
= pViewSh
;
148 // Register at device updater of new view shell
149 if (mpViewShell
!= NULL
)
151 pWindowUpdater
= mpViewShell
->GetWindowUpdater();
152 if (pWindowUpdater
!= NULL
)
153 pWindowUpdater
->RegisterWindow (this);
160 /*************************************************************************
162 |* Die Haelfte des Sichtbaren Bereich eines anderen Fensters darstellen
164 \************************************************************************/
166 void Window::ShareViewArea(Window
* pOtherWin
)
168 mpShareWin
= pOtherWin
;
169 maViewOrigin
= pOtherWin
->maViewOrigin
;
170 maViewSize
= pOtherWin
->maViewSize
;
171 mnMinZoom
= pOtherWin
->mnMinZoom
;
172 mnMaxZoom
= pOtherWin
->mnMaxZoom
;
173 mbCenterAllowed
= pOtherWin
->mbCenterAllowed
;
175 long nZoom
= pOtherWin
->GetZoom();
176 MapMode
aMap(GetMapMode());
177 aMap
.SetScaleX(Fraction(nZoom
, 100));
178 aMap
.SetScaleY(Fraction(nZoom
, 100));
179 aMap
.SetOrigin(pOtherWin
->GetMapMode().GetOrigin());
186 void Window::CalcMinZoom()
188 // Are we entitled to change the minimal zoom factor?
189 if ( mbMinZoomAutoCalc
)
191 // Get current zoom factor.
192 long nZoom
= GetZoom();
196 mpShareWin
->CalcMinZoom();
197 mnMinZoom
= mpShareWin
->mnMinZoom
;
201 // Get the rectangle of the output area in logical coordinates
202 // and calculate the scaling factors that would lead to the view
203 // area (also called application area) to completely fill the
205 Size aWinSize
= PixelToLogic(GetOutputSizePixel());
206 ULONG nX
= (ULONG
) ((double) aWinSize
.Width()
207 * (double) ZOOM_MULTIPLICATOR
/ (double) maViewSize
.Width());
208 ULONG nY
= (ULONG
) ((double) aWinSize
.Height()
209 * (double) ZOOM_MULTIPLICATOR
/ (double) maViewSize
.Height());
211 // Decide whether to take the larger or the smaller factor.
213 if (mbCalcMinZoomByMinSide
)
218 // The factor is tansfomed according to the current zoom factor.
219 nFact
= nFact
* nZoom
/ ZOOM_MULTIPLICATOR
;
220 mnMinZoom
= Max((USHORT
) MIN_ZOOM
, (USHORT
) nFact
);
222 // If the current zoom factor is smaller than the calculated minimal
223 // zoom factor then set the new minimal factor as the current zoom
225 if ( nZoom
< (long) mnMinZoom
)
226 SetZoomFactor(mnMinZoom
);
233 void Window::SetMinZoom (long int nMin
)
235 mnMinZoom
= (USHORT
) nMin
;
241 long Window::GetMinZoom (void) const
249 void Window::SetMaxZoom (long int nMax
)
251 mnMaxZoom
= (USHORT
) nMax
;
257 long Window::GetMaxZoom (void) const
265 long Window::GetZoom (void) const
267 if( GetMapMode().GetScaleX().GetDenominator() )
269 return GetMapMode().GetScaleX().GetNumerator() * 100L
270 / GetMapMode().GetScaleX().GetDenominator();
281 /*************************************************************************
285 \************************************************************************/
287 void Window::Resize()
292 if( mpViewShell
&& mpViewShell
->GetViewFrame() )
293 mpViewShell
->GetViewFrame()->GetBindings().Invalidate( SID_ATTR_ZOOMSLIDER
);
296 /*************************************************************************
300 \************************************************************************/
302 void Window::PrePaint()
305 mpViewShell
->PrePaint();
308 /*************************************************************************
312 \************************************************************************/
314 void Window::Paint(const Rectangle
& rRect
)
317 mpViewShell
->Paint(rRect
, this);
320 /*************************************************************************
324 \************************************************************************/
326 void Window::KeyInput(const KeyEvent
& rKEvt
)
328 if (!(mpViewShell
&& mpViewShell
->KeyInput(rKEvt
, this)))
330 if (mpViewShell
&& rKEvt
.GetKeyCode().GetCode() == KEY_ESCAPE
)
332 mpViewShell
->GetViewShell()->Escape();
336 ::Window::KeyInput(rKEvt
);
341 /*************************************************************************
343 |* MouseButtonDown event
345 \************************************************************************/
347 void Window::MouseButtonDown(const MouseEvent
& rMEvt
)
350 mpViewShell
->MouseButtonDown(rMEvt
, this);
353 /*************************************************************************
357 \************************************************************************/
359 void Window::MouseMove(const MouseEvent
& rMEvt
)
362 mpViewShell
->MouseMove(rMEvt
, this);
365 /*************************************************************************
367 |* MouseButtonUp event
369 \************************************************************************/
371 void Window::MouseButtonUp(const MouseEvent
& rMEvt
)
376 mpViewShell
->MouseButtonUp(rMEvt
, this);
379 /*************************************************************************
383 \************************************************************************/
385 void Window::Command(const CommandEvent
& rCEvt
)
388 mpViewShell
->Command(rCEvt
, this);
391 long Window::Notify( NotifyEvent
& rNEvt
)
393 long nResult
= FALSE
;
396 nResult
= mpViewShell
->Notify(rNEvt
, this);
399 ::Window::Notify( rNEvt
);
405 /*************************************************************************
409 \************************************************************************/
411 void Window::RequestHelp(const HelpEvent
& rEvt
)
415 if( !mpViewShell
->RequestHelp( rEvt
, this) )
416 ::Window::RequestHelp( rEvt
);
419 ::Window::RequestHelp( rEvt
);
425 Point
Window::GetWinViewPos (void) const
433 Point
Window::GetViewOrigin (void) const
441 Size
Window::GetViewSize (void) const
449 /*************************************************************************
451 |* Position der linken oberen Ecke des im Fenster sichtbaren Bereichs
454 \************************************************************************/
456 void Window::SetWinViewPos(const Point
& rPnt
)
461 /*************************************************************************
463 |* Ursprung der Darstellung in Bezug zur gesamten Arbeitsflaeche setzen
465 \************************************************************************/
467 void Window::SetViewOrigin(const Point
& rPnt
)
472 /*************************************************************************
474 |* Groesse der gesamten Arbeitsflaeche, die mit dem Fenster betrachtet
475 |* werden kann, setzen
477 \************************************************************************/
479 void Window::SetViewSize(const Size
& rSize
)
488 void Window::SetCenterAllowed (bool bIsAllowed
)
490 mbCenterAllowed
= bIsAllowed
;
496 long Window::SetZoomFactor(long nZoom
)
498 // Clip the zoom factor to the valid range marked by nMinZoom as
499 // calculated by CalcMinZoom() and the constant MAX_ZOOM.
500 if ( nZoom
> MAX_ZOOM
)
502 if ( nZoom
< (long) mnMinZoom
)
505 // Set the zoom factor at the window's map mode.
506 MapMode
aMap(GetMapMode());
507 aMap
.SetScaleX(Fraction(nZoom
, 100));
508 aMap
.SetScaleY(Fraction(nZoom
, 100));
511 // invalidate previous size - it was relative to the old scaling
512 maPrevSize
= Size(-1,-1);
514 // Update the map mode's origin (to what effect?).
517 // Update the view's snapping to the the new zoom factor.
518 if ( mpViewShell
&& mpViewShell
->ISA(DrawViewShell
) )
519 ((DrawViewShell
*) mpViewShell
)->GetView()->
520 RecalcLogicSnapMagnetic(*this);
522 // Return the zoom factor just in case it has been changed above to lie
523 // inside the valid range.
527 void Window::SetZoomIntegral(long nZoom
)
529 // Clip the zoom factor to the valid range marked by nMinZoom as
530 // previously calculated by <member>CalcMinZoom()</member> and the
531 // MAX_ZOOM constant.
532 if ( nZoom
> MAX_ZOOM
)
534 if ( nZoom
< (long) mnMinZoom
)
537 // Calculate the window's new origin.
538 Size aSize
= PixelToLogic(GetOutputSizePixel());
539 long nW
= aSize
.Width() * GetZoom() / nZoom
;
540 long nH
= aSize
.Height() * GetZoom() / nZoom
;
541 maWinPos
.X() += (aSize
.Width() - nW
) / 2;
542 maWinPos
.Y() += (aSize
.Height() - nH
) / 2;
543 if ( maWinPos
.X() < 0 ) maWinPos
.X() = 0;
544 if ( maWinPos
.Y() < 0 ) maWinPos
.Y() = 0;
546 // Finally update this window's map mode to the given zoom factor that
547 // has been clipped to the valid range.
548 SetZoomFactor(nZoom
);
551 long Window::GetZoomForRect( const Rectangle
& rZoomRect
)
555 if( (rZoomRect
.GetWidth() != 0) && (rZoomRect
.GetHeight() != 0))
557 // Calculate the scale factors which will lead to the given
558 // rectangle being fully visible (when translated accordingly) as
559 // large as possible in the output area independently in both
560 // coordinate directions .
564 const Size
aWinSize( PixelToLogic(GetOutputSizePixel()) );
565 if(rZoomRect
.GetHeight())
567 nX
= (ULONG
) ((double) aWinSize
.Height()
568 * (double) ZOOM_MULTIPLICATOR
/ (double) rZoomRect
.GetHeight());
571 if(rZoomRect
.GetWidth())
573 nY
= (ULONG
) ((double) aWinSize
.Width()
574 * (double) ZOOM_MULTIPLICATOR
/ (double) rZoomRect
.GetWidth());
577 // Use the smaller one of both so that the zoom rectangle will be
578 // fully visible with respect to both coordinate directions.
579 ULONG nFact
= Min(nX
, nY
);
581 // Transform the current zoom factor so that it leads to the desired
583 nRetZoom
= nFact
* GetZoom() / ZOOM_MULTIPLICATOR
;
585 // Calculate the new origin.
588 // Don't change anything if the scale factor is degenrate.
589 nRetZoom
= GetZoom();
593 // Clip the zoom factor to the valid range marked by nMinZoom as
594 // previously calculated by <member>CalcMinZoom()</member> and the
595 // MAX_ZOOM constant.
596 if ( nRetZoom
> MAX_ZOOM
)
598 if ( nRetZoom
< (long) mnMinZoom
)
599 nRetZoom
= mnMinZoom
;
606 /** Recalculate the zoom factor and translation so that the given rectangle
607 is displayed centered and as large as possible while still being fully
608 visible in the window.
610 long Window::SetZoomRect (const Rectangle
& rZoomRect
)
614 if (rZoomRect
.GetWidth() == 0 || rZoomRect
.GetHeight() == 0)
616 // The given rectangle is degenerate. Use the default zoom factor
618 SetZoomIntegral(nNewZoom
);
622 Point aPos
= rZoomRect
.TopLeft();
623 // Transform the output area from pixel coordinates into logical
625 Size aWinSize
= PixelToLogic(GetOutputSizePixel());
626 // Paranoia! The degenerate case of zero width or height has been
627 // taken care of above.
628 DBG_ASSERT(rZoomRect
.GetWidth(), "ZoomRect-Breite = 0!");
629 DBG_ASSERT(rZoomRect
.GetHeight(), "ZoomRect-Hoehe = 0!");
631 // Calculate the scale factors which will lead to the given
632 // rectangle being fully visible (when translated accordingly) as
633 // large as possible in the output area independently in both
634 // coordinate directions .
638 if(rZoomRect
.GetHeight())
640 nX
= (ULONG
) ((double) aWinSize
.Height()
641 * (double) ZOOM_MULTIPLICATOR
/ (double) rZoomRect
.GetHeight());
644 if(rZoomRect
.GetWidth())
646 nY
= (ULONG
) ((double) aWinSize
.Width()
647 * (double) ZOOM_MULTIPLICATOR
/ (double) rZoomRect
.GetWidth());
650 // Use the smaller one of both so that the zoom rectangle will be
651 // fully visible with respect to both coordinate directions.
652 ULONG nFact
= Min(nX
, nY
);
654 // Transform the current zoom factor so that it leads to the desired
656 long nZoom
= nFact
* GetZoom() / ZOOM_MULTIPLICATOR
;
658 // Calculate the new origin.
661 // Don't change anything if the scale factor is degenrate.
662 nNewZoom
= GetZoom();
666 // Calculate the new window position that centers the given
667 // rectangle on the screen.
668 if ( nZoom
> MAX_ZOOM
)
669 nFact
= nFact
* MAX_ZOOM
/ nZoom
;
671 maWinPos
= maViewOrigin
+ aPos
;
673 aWinSize
.Width() = (long) ((double) aWinSize
.Width() * (double) ZOOM_MULTIPLICATOR
/ (double) nFact
);
674 maWinPos
.X() += (rZoomRect
.GetWidth() - aWinSize
.Width()) / 2;
675 aWinSize
.Height() = (long) ((double) aWinSize
.Height() * (double) ZOOM_MULTIPLICATOR
/ (double) nFact
);
676 maWinPos
.Y() += (rZoomRect
.GetHeight() - aWinSize
.Height()) / 2;
678 if ( maWinPos
.X() < 0 ) maWinPos
.X() = 0;
679 if ( maWinPos
.Y() < 0 ) maWinPos
.Y() = 0;
681 // Adapt the window's map mode to the new zoom factor.
682 nNewZoom
= SetZoomFactor(nZoom
);
692 void Window::SetMinZoomAutoCalc (bool bAuto
)
694 mbMinZoomAutoCalc
= bAuto
;
700 /*************************************************************************
702 |* Neuen MapMode-Origin berechnen und setzen; wenn aWinPos.X()/Y()
703 |* gleich -1 ist, wird die entsprechende Position zentriert
704 |* (z.B. fuer Initialisierung)
706 \************************************************************************/
708 void Window::UpdateMapOrigin(BOOL bInvalidate
)
710 BOOL bChanged
= FALSE
;
711 const Size aWinSize
= PixelToLogic(GetOutputSizePixel());
713 if ( mbCenterAllowed
)
715 if( maPrevSize
!= Size(-1,-1) )
717 // keep view centered around current pos, when window
719 maWinPos
.X() -= (aWinSize
.Width() - maPrevSize
.Width()) / 2;
720 maWinPos
.Y() -= (aWinSize
.Height() - maPrevSize
.Height()) / 2;
724 if ( maWinPos
.X() > maViewSize
.Width() - aWinSize
.Width() )
726 maWinPos
.X() = maViewSize
.Width() - aWinSize
.Width();
729 if ( maWinPos
.Y() > maViewSize
.Height() - aWinSize
.Height() )
731 maWinPos
.Y() = maViewSize
.Height() - aWinSize
.Height();
734 if ( aWinSize
.Width() > maViewSize
.Width() || maWinPos
.X() < 0 )
736 maWinPos
.X() = maViewSize
.Width() / 2 - aWinSize
.Width() / 2;
739 if ( aWinSize
.Height() > maViewSize
.Height() || maWinPos
.Y() < 0 )
741 maWinPos
.Y() = maViewSize
.Height() / 2 - aWinSize
.Height() / 2;
748 maPrevSize
= aWinSize
;
750 if (bChanged
&& bInvalidate
)
757 void Window::UpdateMapMode (void)
759 Size aWinSize
= PixelToLogic(GetOutputSizePixel());
760 maWinPos
-= maViewOrigin
;
761 Size
aPix(maWinPos
.X(), maWinPos
.Y());
762 aPix
= LogicToPixel(aPix
);
763 // Groesse muss vielfaches von BRUSH_SIZE sein, damit Muster
764 // richtig dargestellt werden
766 // removed old stuff here which still forced zoom to be
767 // %BRUSH_SIZE which is outdated now
769 if (mpViewShell
&& mpViewShell
->ISA(DrawViewShell
))
771 Size aViewSizePixel
= LogicToPixel(maViewSize
);
772 Size aWinSizePixel
= LogicToPixel(aWinSize
);
774 // Seite soll nicht am Fensterrand "kleben"
775 if (aPix
.Width() == 0)
778 // Since BRUSH_SIZE alignment is outdated now, i use the
779 // former constant here directly
782 if (aPix
.Height() == 0)
785 // Since BRUSH_SIZE alignment is outdated now, i use the
786 // former constant here directly
791 aPix
= PixelToLogic(aPix
);
792 maWinPos
.X() = aPix
.Width();
793 maWinPos
.Y() = aPix
.Height();
794 Point
aNewOrigin (-maWinPos
.X(), -maWinPos
.Y());
795 maWinPos
+= maViewOrigin
;
797 MapMode
aMap(GetMapMode());
798 aMap
.SetOrigin(aNewOrigin
);
805 /*************************************************************************
807 |* X-Position des sichtbaren Bereichs als Bruchteil (< 1)
808 |* der gesamten Arbeitsbereichbreite zuruegeben
810 \************************************************************************/
812 double Window::GetVisibleX()
814 return ((double) maWinPos
.X() / maViewSize
.Width());
817 /*************************************************************************
819 |* Y-Position des sichtbaren Bereichs als Bruchteil (< 1)
820 |* der gesamten Arbeitsbereichhoehe zuruegeben
822 \************************************************************************/
824 double Window::GetVisibleY()
826 return ((double) maWinPos
.Y() / maViewSize
.Height());
829 /*************************************************************************
831 |* X- und Y-Position des sichtbaren Bereichs als Bruchteile (< 1)
832 |* der gesamten Arbeitsbereichgroesse setzen
833 |* negative Werte werden ignoriert
835 \************************************************************************/
837 void Window::SetVisibleXY(double fX
, double fY
)
839 long nOldX
= maWinPos
.X();
840 long nOldY
= maWinPos
.Y();
843 maWinPos
.X() = (long) (fX
* maViewSize
.Width());
845 maWinPos
.Y() = (long) (fY
* maViewSize
.Height());
846 UpdateMapOrigin(FALSE
);
847 // Size sz(nOldX - aWinPos.X(), nOldY - aWinPos.Y());
848 // sz = LogicToPixel(sz);
849 Scroll(nOldX
- maWinPos
.X(), nOldY
- maWinPos
.Y(), SCROLL_CHILDREN
);
853 /*************************************************************************
855 |* Breite des sichtbaren Bereichs im Verhaeltnis zur
856 |* gesamten Arbeitsbereichbreite zuruegeben
858 \************************************************************************/
860 double Window::GetVisibleWidth()
862 Size aWinSize
= PixelToLogic(GetOutputSizePixel());
863 if ( aWinSize
.Width() > maViewSize
.Width() )
864 aWinSize
.Width() = maViewSize
.Width();
865 return ((double) aWinSize
.Width() / maViewSize
.Width());
868 /*************************************************************************
870 |* Hoehe des sichtbaren Bereichs im Verhaeltnis zur
871 |* gesamten Arbeitsbereichhoehe zuruegeben
873 \************************************************************************/
875 double Window::GetVisibleHeight()
877 Size aWinSize
= PixelToLogic(GetOutputSizePixel());
878 if ( aWinSize
.Height() > maViewSize
.Height() )
879 aWinSize
.Height() = maViewSize
.Height();
880 return ((double) aWinSize
.Height() / maViewSize
.Height());
883 /*************************************************************************
885 |* Breite einer Scrollspalte im Verhaeltnis zur gesamten
886 |* Arbeitsbereichbreite zuruegeben
888 \************************************************************************/
890 double Window::GetScrlLineWidth()
892 return (GetVisibleWidth() * SCROLL_LINE_FACT
);
895 /*************************************************************************
897 |* Breite einer Scrollspalte im Verhaeltnis zur gesamten
898 |* Arbeitsbereichhoehe zuruegeben
900 \************************************************************************/
902 double Window::GetScrlLineHeight()
904 return (GetVisibleHeight() * SCROLL_LINE_FACT
);
907 /*************************************************************************
909 |* Breite einer Scrollpage im Verhaeltnis zur gesamten
910 |* Arbeitsbereichbreite zuruegeben
912 \************************************************************************/
914 double Window::GetScrlPageWidth()
916 return (GetVisibleWidth() * SCROLL_PAGE_FACT
);
919 /*************************************************************************
921 |* Breite einer Scrollpage im Verhaeltnis zur gesamten
922 |* Arbeitsbereichhoehe zuruegeben
924 \************************************************************************/
926 double Window::GetScrlPageHeight()
928 return (GetVisibleHeight() * SCROLL_PAGE_FACT
);
931 /*************************************************************************
933 |* Fenster deaktivieren
935 \************************************************************************/
937 void Window::LoseFocus()
940 ::Window::LoseFocus ();
943 /*************************************************************************
945 |* Fenster aktivieren
947 \************************************************************************/
949 void Window::GrabFocus()
952 ::Window::GrabFocus ();
956 /*************************************************************************
960 \************************************************************************/
962 void Window::DataChanged( const DataChangedEvent
& rDCEvt
)
964 ::Window::DataChanged( rDCEvt
);
966 // PRINTER bei allen Dokumenten weglassen, die keinen Printer benutzen.
967 // FONTS und FONTSUBSTITUTION weglassen, wenn keine Textausgaben
968 // vorhanden sind, bzw. wenn das Dokument keinen Text zulaesst.
970 if ( (rDCEvt
.GetType() == DATACHANGED_PRINTER
) ||
971 (rDCEvt
.GetType() == DATACHANGED_DISPLAY
) ||
972 (rDCEvt
.GetType() == DATACHANGED_FONTS
) ||
973 (rDCEvt
.GetType() == DATACHANGED_FONTSUBSTITUTION
) ||
974 ((rDCEvt
.GetType() == DATACHANGED_SETTINGS
) &&
975 (rDCEvt
.GetFlags() & SETTINGS_STYLE
)) )
977 if ( (rDCEvt
.GetType() == DATACHANGED_SETTINGS
) &&
978 (rDCEvt
.GetFlags() & SETTINGS_STYLE
) )
980 // When the screen zoom factor has changed then reset the zoom
981 // factor of the frame to allways display the whole page.
982 const AllSettings
* pOldSettings
= rDCEvt
.GetOldSettings ();
983 const AllSettings
& rNewSettings
= GetSettings ();
985 if (pOldSettings
->GetStyleSettings().GetScreenZoom()
986 != rNewSettings
.GetStyleSettings().GetScreenZoom())
987 mpViewShell
->GetViewFrame()->GetDispatcher()->
988 Execute(SID_SIZE_PAGE
, SFX_CALLMODE_ASYNCHRON
| SFX_CALLMODE_RECORD
);
990 // ScrollBars neu anordnen bzw. Resize ausloesen, da sich
991 // ScrollBar-Groesse geaendert haben kann. Dazu muss dann im
992 // Resize-Handler aber auch die Groesse der ScrollBars aus
993 // den Settings abgefragt werden.
996 // Daten neu Setzen, die aus den Systemeinstellungen bzw. aus
997 // den Settings uebernommen werden. Evtl. weitere Daten neu
998 // berechnen, da sich auch die Aufloesung hierdurch geaendert
1002 const StyleSettings
& rStyleSettings
= GetSettings().GetStyleSettings();
1003 SvtAccessibilityOptions aAccOptions
;
1005 USHORT nPreviewSlot
;
1007 if( rStyleSettings
.GetHighContrastMode() )
1008 nOutputMode
= ViewShell::OUTPUT_DRAWMODE_CONTRAST
;
1010 nOutputMode
= ViewShell::OUTPUT_DRAWMODE_COLOR
;
1012 if( rStyleSettings
.GetHighContrastMode() && aAccOptions
.GetIsForPagePreviews() )
1013 nPreviewSlot
= SID_PREVIEW_QUALITY_CONTRAST
;
1015 nPreviewSlot
= SID_PREVIEW_QUALITY_COLOR
;
1017 if( mpViewShell
->ISA( DrawViewShell
) )
1019 SetDrawMode( nOutputMode
);
1020 mpViewShell
->GetFrameView()->SetDrawMode( nOutputMode
);
1022 // mpViewShell->GetView()->ReleaseMasterPagePaintCache();
1026 // #103100# Overwrite window color for OutlineView
1027 if( mpViewShell
->ISA(OutlineViewShell
) )
1029 svtools::ColorConfig aColorConfig
;
1030 const Color
aDocColor( aColorConfig
.GetColorValue( svtools::DOCCOLOR
).nColor
);
1031 SetBackground( Wallpaper( aDocColor
) );
1034 SfxRequest
aReq( nPreviewSlot
, 0, mpViewShell
->GetDocSh()->GetDoc()->GetItemPool() );
1035 mpViewShell
->ExecReq( aReq
);
1036 mpViewShell
->Invalidate();
1037 mpViewShell
->ArrangeGUIElements();
1039 // #101928# re-create handles to show new outfit
1040 if(mpViewShell
->ISA(DrawViewShell
))
1042 mpViewShell
->GetView()->AdjustMarkHdl();
1047 if ( (rDCEvt
.GetType() == DATACHANGED_DISPLAY
) ||
1048 ((rDCEvt
.GetType() == DATACHANGED_SETTINGS
) &&
1049 (rDCEvt
.GetFlags() & SETTINGS_STYLE
)) )
1051 // Virtuelle Device die auch von der Aufloesung oder von
1052 // Systemeinstellungen abhaengen, sollten geupdatet werden.
1053 // Ansonsten sollte zumindest bei DATACHANGED_DISPLAY
1054 // die virtuellen Devices geupdatet werden, da es einige
1055 // Systeme erlauben die Aufloesung und Farbtiefe waehrend
1056 // der Laufzeit zu aendern oder eben bei Palettenaenderungen
1057 // die virtuellen Device geupdatet werden muessen, da bei
1058 // Ausgaben ein anderes Farbmatching stattfinden kann.
1061 if ( rDCEvt
.GetType() == DATACHANGED_FONTS
)
1063 // Wenn das Dokument Font-AuswahlBoxen anbietet, muessen
1064 // diese geupdatet werden. Wie dies genau aussehen muss,
1065 // weiss ich leider auch nicht. Aber evtl. kann man das
1066 // ja global handeln. Dies muessten wir evtl. mal
1067 // mit PB absprechen, aber der ist derzeit leider Krank.
1068 // Also bevor dies hier gehandelt wird, vorher mit
1069 // PB und mir absprechen.
1072 if ( (rDCEvt
.GetType() == DATACHANGED_FONTS
) ||
1073 (rDCEvt
.GetType() == DATACHANGED_FONTSUBSTITUTION
) )
1075 // Formatierung neu durchfuehren, da Fonts die im Dokument
1076 // vorkommen, nicht mehr vorhanden sein muessen oder
1077 // jetzt vorhanden sind oder durch andere ersetzt wurden
1081 DrawDocShell
* pDocSh
= mpViewShell
->GetDocSh();
1083 pDocSh
->SetPrinter( pDocSh
->GetPrinter( TRUE
) );
1087 if ( rDCEvt
.GetType() == DATACHANGED_PRINTER
)
1089 // Wie hier die Behandlung aussehen soll, weiss ich leider
1090 // selbst noch nicht. Evtl. mal einen Printer loeschen und
1091 // schauen was gemacht werden muss. Evtl. muesste ich in
1092 // VCL dafuer noch etwas einbauen, wenn der benutze Printer
1093 // geloescht wird. Ansonsten wuerde ich hier evtl. die
1094 // Formatierung neu berechnen, wenn der aktuelle Drucker
1098 DrawDocShell
* pDocSh
= mpViewShell
->GetDocSh();
1100 pDocSh
->SetPrinter( pDocSh
->GetPrinter( TRUE
) );
1104 // Alles neu ausgeben
1112 /*************************************************************************
1114 |* DropTargetHelper::AcceptDrop
1116 \************************************************************************/
1118 sal_Int8
Window::AcceptDrop( const AcceptDropEvent
& rEvt
)
1120 sal_Int8 nRet
= DND_ACTION_NONE
;
1122 if( mpViewShell
&& !mpViewShell
->GetDocSh()->IsReadOnly() )
1125 nRet
= mpViewShell
->AcceptDrop( rEvt
, *this, this, SDRPAGE_NOTFOUND
, SDRLAYER_NOTFOUND
);
1127 if (mbUseDropScroll
&& ! mpViewShell
->ISA(OutlineViewShell
))
1128 DropScroll( rEvt
.maPosPixel
);
1134 /*************************************************************************
1136 |* DropTargetHelper::ExecuteDrop
1138 \************************************************************************/
1140 sal_Int8
Window::ExecuteDrop( const ExecuteDropEvent
& rEvt
)
1142 sal_Int8 nRet
= DND_ACTION_NONE
;
1146 nRet
= mpViewShell
->ExecuteDrop( rEvt
, *this, this, SDRPAGE_NOTFOUND
, SDRLAYER_NOTFOUND
);
1155 void Window::SetUseDropScroll (bool bUseDropScroll
)
1157 mbUseDropScroll
= bUseDropScroll
;
1163 /*************************************************************************
1165 |* Scrolling bei AcceptDrop-Events
1167 \************************************************************************/
1169 void Window::DropScroll(const Point
& rMousePos
)
1174 Size aSize
= GetOutputSizePixel();
1176 if (aSize
.Width() > SCROLL_SENSITIVE
* 3)
1178 if ( rMousePos
.X() < SCROLL_SENSITIVE
)
1183 if ( rMousePos
.X() >= aSize
.Width() - SCROLL_SENSITIVE
)
1189 if (aSize
.Height() > SCROLL_SENSITIVE
* 3)
1191 if ( rMousePos
.Y() < SCROLL_SENSITIVE
)
1196 if ( rMousePos
.Y() >= aSize
.Height() - SCROLL_SENSITIVE
)
1202 if ( (nDx
|| nDy
) && (rMousePos
.X()!=0 || rMousePos
.Y()!=0 ) )
1205 mpViewShell
->ScrollLines(nDx
, nDy
);
1214 ::com::sun::star::uno::Reference
<
1215 ::com::sun::star::accessibility::XAccessible
>
1216 Window::CreateAccessible (void)
1218 if (mpViewShell
!= NULL
)
1219 return mpViewShell
->CreateAccessibleDocumentView (this);
1222 OSL_TRACE ("::sd::Window::CreateAccessible: no view shell");
1223 return ::Window::CreateAccessible ();
1227 XubString
Window::GetSurroundingText() const
1229 if ( mpViewShell
->GetShellType() == ViewShell::ST_OUTLINE
)
1233 else if ( mpViewShell
->GetView()->IsTextEdit() )
1235 OutlinerView
*pOLV
= mpViewShell
->GetView()->GetTextEditOutlinerView();
1236 return pOLV
->GetEditView().GetSurroundingText();
1244 Selection
Window::GetSurroundingTextSelection() const
1246 if ( mpViewShell
->GetShellType() == ViewShell::ST_OUTLINE
)
1248 return Selection( 0, 0 );
1250 else if ( mpViewShell
->GetView()->IsTextEdit() )
1252 OutlinerView
*pOLV
= mpViewShell
->GetView()->GetTextEditOutlinerView();
1253 return pOLV
->GetEditView().GetSurroundingTextSelection();
1257 return Selection( 0, 0 );
1261 } // end of namespace sd