summaryrefslogtreecommitdiff
path: root/sd/source/ui/view/sdwindow.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sd/source/ui/view/sdwindow.cxx')
-rwxr-xr-xsd/source/ui/view/sdwindow.cxx1210
1 files changed, 1210 insertions, 0 deletions
diff --git a/sd/source/ui/view/sdwindow.cxx b/sd/source/ui/view/sdwindow.cxx
new file mode 100755
index 000000000000..ed5dda39037c
--- /dev/null
+++ b/sd/source/ui/view/sdwindow.cxx
@@ -0,0 +1,1210 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sd.hxx"
+
+#include "Window.hxx"
+#include <sfx2/dispatch.hxx>
+#include <sfx2/request.hxx>
+
+#include <sfx2/viewfrm.hxx>
+#include <svx/svxids.hrc>
+
+#include <editeng/outliner.hxx>
+#include <editeng/editview.hxx>
+
+#include "app.hrc"
+#include "helpids.h"
+#include "ViewShell.hxx"
+#include "DrawViewShell.hxx"
+#include "View.hxx"
+#include "FrameView.hxx"
+#include "OutlineViewShell.hxx"
+#include "drawdoc.hxx"
+#include "AccessibleDrawDocumentView.hxx"
+#include "WindowUpdater.hxx"
+
+namespace sd {
+
+#define SCROLL_LINE_FACT 0.05 // Faktor fuer Zeilenscrolling
+#define SCROLL_PAGE_FACT 0.5 // Faktor fuer Seitenscrolling
+#define SCROLL_SENSITIVE 20 // Sensitiver Bereich (Pixel)
+#define ZOOM_MULTIPLICATOR 10000 // Multiplikator um Rundungsfehler zu vermeiden
+#define MIN_ZOOM 5 // Minimaler Zoomfaktor
+#define MAX_ZOOM 3000 // Maximaler Zoomfaktor
+
+
+/*************************************************************************
+|*
+|* Konstruktor
+|*
+\************************************************************************/
+
+Window::Window(::Window* pParent)
+ : ::Window(pParent, WinBits(WB_CLIPCHILDREN | WB_DIALOGCONTROL)),
+ DropTargetHelper( this ),
+ mpShareWin(NULL),
+ maWinPos(0, 0), // vorsichtshalber; die Werte sollten aber
+ maViewOrigin(0, 0), // vom Besitzer des Fensters neu gesetzt
+ maViewSize(1000, 1000), // werden
+ mnMinZoom(MIN_ZOOM),
+ mnMaxZoom(MAX_ZOOM),
+ mbMinZoomAutoCalc(false),
+ mbCalcMinZoomByMinSide(true),
+ mbCenterAllowed(true),
+ mnTicks (0),
+ mbDraggedFrom(false),
+ mpViewShell(NULL),
+ mbUseDropScroll (true)
+{
+ SetDialogControlFlags( WINDOW_DLGCTRL_RETURN | WINDOW_DLGCTRL_WANTFOCUS );
+
+ MapMode aMap(GetMapMode());
+ aMap.SetMapUnit(MAP_100TH_MM);
+ SetMapMode(aMap);
+
+ // Damit im Diamodus die ::WindowColor genommen wird
+ SetBackground( Wallpaper( GetSettings().GetStyleSettings().GetWindowColor() ) );
+
+ // adjust contrast mode initially
+ bool bUseContrast = GetSettings().GetStyleSettings().GetHighContrastMode();
+ SetDrawMode( bUseContrast
+ ? ViewShell::OUTPUT_DRAWMODE_CONTRAST
+ : ViewShell::OUTPUT_DRAWMODE_COLOR );
+
+ // Hilfe-ID setzen
+ // SetHelpId(HID_SD_WIN_DOCUMENT);
+ SetUniqueId(HID_SD_WIN_DOCUMENT);
+
+ // #i78183# Added after discussed with AF
+ EnableRTL(FALSE);
+}
+
+/*************************************************************************
+|*
+|* Destruktor
+|*
+\************************************************************************/
+
+Window::~Window (void)
+{
+ if (mpViewShell != NULL)
+ {
+ WindowUpdater* pWindowUpdater = mpViewShell->GetWindowUpdater();
+ if (pWindowUpdater != NULL)
+ pWindowUpdater->UnregisterWindow (this);
+ }
+}
+
+
+
+
+void Window::SetViewShell (ViewShell* pViewSh)
+{
+ WindowUpdater* pWindowUpdater = NULL;
+ // Unregister at device updater of old view shell.
+ if (mpViewShell != NULL)
+ {
+ pWindowUpdater = mpViewShell->GetWindowUpdater();
+ if (pWindowUpdater != NULL)
+ pWindowUpdater->UnregisterWindow (this);
+ }
+
+ mpViewShell = pViewSh;
+
+ // Register at device updater of new view shell
+ if (mpViewShell != NULL)
+ {
+ pWindowUpdater = mpViewShell->GetWindowUpdater();
+ if (pWindowUpdater != NULL)
+ pWindowUpdater->RegisterWindow (this);
+ }
+}
+
+void Window::CalcMinZoom()
+{
+ // Are we entitled to change the minimal zoom factor?
+ if ( mbMinZoomAutoCalc )
+ {
+ // Get current zoom factor.
+ long nZoom = GetZoom();
+
+ if ( mpShareWin )
+ {
+ mpShareWin->CalcMinZoom();
+ mnMinZoom = mpShareWin->mnMinZoom;
+ }
+ else
+ {
+ // Get the rectangle of the output area in logical coordinates
+ // and calculate the scaling factors that would lead to the view
+ // area (also called application area) to completely fill the
+ // window.
+ Size aWinSize = PixelToLogic(GetOutputSizePixel());
+ ULONG nX = (ULONG) ((double) aWinSize.Width()
+ * (double) ZOOM_MULTIPLICATOR / (double) maViewSize.Width());
+ ULONG nY = (ULONG) ((double) aWinSize.Height()
+ * (double) ZOOM_MULTIPLICATOR / (double) maViewSize.Height());
+
+ // Decide whether to take the larger or the smaller factor.
+ ULONG nFact;
+ if (mbCalcMinZoomByMinSide)
+ nFact = Min(nX, nY);
+ else
+ nFact = Max(nX, nY);
+
+ // The factor is tansfomed according to the current zoom factor.
+ nFact = nFact * nZoom / ZOOM_MULTIPLICATOR;
+ mnMinZoom = Max((USHORT) MIN_ZOOM, (USHORT) nFact);
+ }
+ // If the current zoom factor is smaller than the calculated minimal
+ // zoom factor then set the new minimal factor as the current zoom
+ // factor.
+ if ( nZoom < (long) mnMinZoom )
+ SetZoomFactor(mnMinZoom);
+ }
+}
+
+
+
+
+void Window::SetMinZoom (long int nMin)
+{
+ mnMinZoom = (USHORT) nMin;
+}
+
+
+
+
+long Window::GetMinZoom (void) const
+{
+ return mnMinZoom;
+}
+
+
+
+
+void Window::SetMaxZoom (long int nMax)
+{
+ mnMaxZoom = (USHORT) nMax;
+}
+
+
+
+
+long Window::GetMaxZoom (void) const
+{
+ return mnMaxZoom;
+}
+
+
+
+
+long Window::GetZoom (void) const
+{
+ if( GetMapMode().GetScaleX().GetDenominator() )
+ {
+ return GetMapMode().GetScaleX().GetNumerator() * 100L
+ / GetMapMode().GetScaleX().GetDenominator();
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+
+
+
+/*************************************************************************
+|*
+|* Resize event
+|*
+\************************************************************************/
+
+void Window::Resize()
+{
+ ::Window::Resize();
+ CalcMinZoom();
+
+ if( mpViewShell && mpViewShell->GetViewFrame() )
+ mpViewShell->GetViewFrame()->GetBindings().Invalidate( SID_ATTR_ZOOMSLIDER );
+}
+
+/*************************************************************************
+|*
+|* PrePaint event
+|*
+\************************************************************************/
+
+void Window::PrePaint()
+{
+ if ( mpViewShell )
+ mpViewShell->PrePaint();
+}
+
+/*************************************************************************
+|*
+|* Paint event
+|*
+\************************************************************************/
+
+void Window::Paint(const Rectangle& rRect)
+{
+ if ( mpViewShell )
+ mpViewShell->Paint(rRect, this);
+}
+
+/*************************************************************************
+|*
+|* Keyboard event
+|*
+\************************************************************************/
+
+void Window::KeyInput(const KeyEvent& rKEvt)
+{
+ if (!(mpViewShell && mpViewShell->KeyInput(rKEvt, this)))
+ {
+ if (mpViewShell && rKEvt.GetKeyCode().GetCode() == KEY_ESCAPE)
+ {
+ mpViewShell->GetViewShell()->Escape();
+ }
+ else
+ {
+ ::Window::KeyInput(rKEvt);
+ }
+ }
+}
+
+/*************************************************************************
+|*
+|* MouseButtonDown event
+|*
+\************************************************************************/
+
+void Window::MouseButtonDown(const MouseEvent& rMEvt)
+{
+ if ( mpViewShell )
+ mpViewShell->MouseButtonDown(rMEvt, this);
+}
+
+/*************************************************************************
+|*
+|* MouseMove event
+|*
+\************************************************************************/
+
+void Window::MouseMove(const MouseEvent& rMEvt)
+{
+ if ( mpViewShell )
+ mpViewShell->MouseMove(rMEvt, this);
+}
+
+/*************************************************************************
+|*
+|* MouseButtonUp event
+|*
+\************************************************************************/
+
+void Window::MouseButtonUp(const MouseEvent& rMEvt)
+{
+ mnTicks = 0;
+
+ if ( mpViewShell )
+ mpViewShell->MouseButtonUp(rMEvt, this);
+}
+
+/*************************************************************************
+|*
+|* Command event
+|*
+\************************************************************************/
+
+void Window::Command(const CommandEvent& rCEvt)
+{
+ if ( mpViewShell )
+ mpViewShell->Command(rCEvt, this);
+}
+
+long Window::Notify( NotifyEvent& rNEvt )
+{
+ long nResult = FALSE;
+ if ( mpViewShell )
+ {
+ nResult = mpViewShell->Notify(rNEvt, this);
+ }
+ if( !nResult )
+ ::Window::Notify( rNEvt );
+
+ return nResult;
+}
+
+
+/*************************************************************************
+|*
+|* RequestHelp event
+|*
+\************************************************************************/
+
+void Window::RequestHelp(const HelpEvent& rEvt)
+{
+ if ( mpViewShell )
+ {
+ if( !mpViewShell->RequestHelp( rEvt, this) )
+ ::Window::RequestHelp( rEvt );
+ }
+ else
+ ::Window::RequestHelp( rEvt );
+}
+
+
+
+
+Point Window::GetWinViewPos (void) const
+{
+ return maWinPos;
+}
+
+
+
+
+Point Window::GetViewOrigin (void) const
+{
+ return maViewOrigin;
+}
+
+
+
+
+Size Window::GetViewSize (void) const
+{
+ return maViewSize;
+}
+
+
+
+
+/*************************************************************************
+|*
+|* Position der linken oberen Ecke des im Fenster sichtbaren Bereichs
+|* setzen
+|*
+\************************************************************************/
+
+void Window::SetWinViewPos(const Point& rPnt)
+{
+ maWinPos = rPnt;
+}
+
+/*************************************************************************
+|*
+|* Ursprung der Darstellung in Bezug zur gesamten Arbeitsflaeche setzen
+|*
+\************************************************************************/
+
+void Window::SetViewOrigin(const Point& rPnt)
+{
+ maViewOrigin = rPnt;
+}
+
+/*************************************************************************
+|*
+|* Groesse der gesamten Arbeitsflaeche, die mit dem Fenster betrachtet
+|* werden kann, setzen
+|*
+\************************************************************************/
+
+void Window::SetViewSize(const Size& rSize)
+{
+ maViewSize = rSize;
+ CalcMinZoom();
+}
+
+
+
+
+void Window::SetCenterAllowed (bool bIsAllowed)
+{
+ mbCenterAllowed = bIsAllowed;
+}
+
+
+
+
+long Window::SetZoomFactor(long nZoom)
+{
+ // Clip the zoom factor to the valid range marked by nMinZoom as
+ // calculated by CalcMinZoom() and the constant MAX_ZOOM.
+ if ( nZoom > MAX_ZOOM )
+ nZoom = MAX_ZOOM;
+ if ( nZoom < (long) mnMinZoom )
+ nZoom = mnMinZoom;
+
+ // Set the zoom factor at the window's map mode.
+ MapMode aMap(GetMapMode());
+ aMap.SetScaleX(Fraction(nZoom, 100));
+ aMap.SetScaleY(Fraction(nZoom, 100));
+ SetMapMode(aMap);
+
+ // Update the map mode's origin (to what effect?).
+ UpdateMapOrigin();
+
+ // Update the view's snapping to the the new zoom factor.
+ if ( mpViewShell && mpViewShell->ISA(DrawViewShell) )
+ ((DrawViewShell*) mpViewShell)->GetView()->
+ RecalcLogicSnapMagnetic(*this);
+
+ // Return the zoom factor just in case it has been changed above to lie
+ // inside the valid range.
+ return nZoom;
+}
+
+void Window::SetZoomIntegral(long nZoom)
+{
+ // Clip the zoom factor to the valid range marked by nMinZoom as
+ // previously calculated by <member>CalcMinZoom()</member> and the
+ // MAX_ZOOM constant.
+ if ( nZoom > MAX_ZOOM )
+ nZoom = MAX_ZOOM;
+ if ( nZoom < (long) mnMinZoom )
+ nZoom = mnMinZoom;
+
+ // Calculate the window's new origin.
+ Size aSize = PixelToLogic(GetOutputSizePixel());
+ long nW = aSize.Width() * GetZoom() / nZoom;
+ long nH = aSize.Height() * GetZoom() / nZoom;
+ maWinPos.X() += (aSize.Width() - nW) / 2;
+ maWinPos.Y() += (aSize.Height() - nH) / 2;
+ if ( maWinPos.X() < 0 ) maWinPos.X() = 0;
+ if ( maWinPos.Y() < 0 ) maWinPos.Y() = 0;
+
+ // Finally update this window's map mode to the given zoom factor that
+ // has been clipped to the valid range.
+ SetZoomFactor(nZoom);
+}
+
+long Window::GetZoomForRect( const Rectangle& rZoomRect )
+{
+ long nRetZoom = 100;
+
+ if( (rZoomRect.GetWidth() != 0) && (rZoomRect.GetHeight() != 0))
+ {
+ // Calculate the scale factors which will lead to the given
+ // rectangle being fully visible (when translated accordingly) as
+ // large as possible in the output area independently in both
+ // coordinate directions .
+ ULONG nX(0L);
+ ULONG nY(0L);
+
+ const Size aWinSize( PixelToLogic(GetOutputSizePixel()) );
+ if(rZoomRect.GetHeight())
+ {
+ nX = (ULONG) ((double) aWinSize.Height()
+ * (double) ZOOM_MULTIPLICATOR / (double) rZoomRect.GetHeight());
+ }
+
+ if(rZoomRect.GetWidth())
+ {
+ nY = (ULONG) ((double) aWinSize.Width()
+ * (double) ZOOM_MULTIPLICATOR / (double) rZoomRect.GetWidth());
+ }
+
+ // Use the smaller one of both so that the zoom rectangle will be
+ // fully visible with respect to both coordinate directions.
+ ULONG nFact = Min(nX, nY);
+
+ // Transform the current zoom factor so that it leads to the desired
+ // scaling.
+ nRetZoom = nFact * GetZoom() / ZOOM_MULTIPLICATOR;
+
+ // Calculate the new origin.
+ if ( nFact == 0 )
+ {
+ // Don't change anything if the scale factor is degenrate.
+ nRetZoom = GetZoom();
+ }
+ else
+ {
+ // Clip the zoom factor to the valid range marked by nMinZoom as
+ // previously calculated by <member>CalcMinZoom()</member> and the
+ // MAX_ZOOM constant.
+ if ( nRetZoom > MAX_ZOOM )
+ nRetZoom = MAX_ZOOM;
+ if ( nRetZoom < (long) mnMinZoom )
+ nRetZoom = mnMinZoom;
+ }
+ }
+
+ return nRetZoom;
+}
+
+/** Recalculate the zoom factor and translation so that the given rectangle
+ is displayed centered and as large as possible while still being fully
+ visible in the window.
+*/
+long Window::SetZoomRect (const Rectangle& rZoomRect)
+{
+ long nNewZoom = 100;
+
+ if (rZoomRect.GetWidth() == 0 || rZoomRect.GetHeight() == 0)
+ {
+ // The given rectangle is degenerate. Use the default zoom factor
+ // (above) of 100%.
+ SetZoomIntegral(nNewZoom);
+ }
+ else
+ {
+ Point aPos = rZoomRect.TopLeft();
+ // Transform the output area from pixel coordinates into logical
+ // coordinates.
+ Size aWinSize = PixelToLogic(GetOutputSizePixel());
+ // Paranoia! The degenerate case of zero width or height has been
+ // taken care of above.
+ DBG_ASSERT(rZoomRect.GetWidth(), "ZoomRect-Breite = 0!");
+ DBG_ASSERT(rZoomRect.GetHeight(), "ZoomRect-Hoehe = 0!");
+
+ // Calculate the scale factors which will lead to the given
+ // rectangle being fully visible (when translated accordingly) as
+ // large as possible in the output area independently in both
+ // coordinate directions .
+ ULONG nX(0L);
+ ULONG nY(0L);
+
+ if(rZoomRect.GetHeight())
+ {
+ nX = (ULONG) ((double) aWinSize.Height()
+ * (double) ZOOM_MULTIPLICATOR / (double) rZoomRect.GetHeight());
+ }
+
+ if(rZoomRect.GetWidth())
+ {
+ nY = (ULONG) ((double) aWinSize.Width()
+ * (double) ZOOM_MULTIPLICATOR / (double) rZoomRect.GetWidth());
+ }
+
+ // Use the smaller one of both so that the zoom rectangle will be
+ // fully visible with respect to both coordinate directions.
+ ULONG nFact = Min(nX, nY);
+
+ // Transform the current zoom factor so that it leads to the desired
+ // scaling.
+ long nZoom = nFact * GetZoom() / ZOOM_MULTIPLICATOR;
+
+ // Calculate the new origin.
+ if ( nFact == 0 )
+ {
+ // Don't change anything if the scale factor is degenrate.
+ nNewZoom = GetZoom();
+ }
+ else
+ {
+ // Calculate the new window position that centers the given
+ // rectangle on the screen.
+ if ( nZoom > MAX_ZOOM )
+ nFact = nFact * MAX_ZOOM / nZoom;
+
+ maWinPos = maViewOrigin + aPos;
+
+ aWinSize.Width() = (long) ((double) aWinSize.Width() * (double) ZOOM_MULTIPLICATOR / (double) nFact);
+ maWinPos.X() += (rZoomRect.GetWidth() - aWinSize.Width()) / 2;
+ aWinSize.Height() = (long) ((double) aWinSize.Height() * (double) ZOOM_MULTIPLICATOR / (double) nFact);
+ maWinPos.Y() += (rZoomRect.GetHeight() - aWinSize.Height()) / 2;
+
+ if ( maWinPos.X() < 0 ) maWinPos.X() = 0;
+ if ( maWinPos.Y() < 0 ) maWinPos.Y() = 0;
+
+ // Adapt the window's map mode to the new zoom factor.
+ nNewZoom = SetZoomFactor(nZoom);
+ }
+ }
+
+ return(nNewZoom);
+}
+
+
+
+
+void Window::SetMinZoomAutoCalc (bool bAuto)
+{
+ mbMinZoomAutoCalc = bAuto;
+}
+
+
+
+
+/*************************************************************************
+|*
+|* Neuen MapMode-Origin berechnen und setzen; wenn aWinPos.X()/Y()
+|* gleich -1 ist, wird die entsprechende Position zentriert
+|* (z.B. fuer Initialisierung)
+|*
+\************************************************************************/
+
+void Window::UpdateMapOrigin(BOOL bInvalidate)
+{
+ BOOL bChanged = FALSE;
+ Size aWinSize = PixelToLogic(GetOutputSizePixel());
+
+ if ( mbCenterAllowed )
+ {
+ if ( maWinPos.X() > maViewSize.Width() - aWinSize.Width() )
+ {
+ maWinPos.X() = maViewSize.Width() - aWinSize.Width();
+ bChanged = TRUE;
+ }
+ if ( maWinPos.Y() > maViewSize.Height() - aWinSize.Height() )
+ {
+ maWinPos.Y() = maViewSize.Height() - aWinSize.Height();
+ bChanged = TRUE;
+ }
+ if ( aWinSize.Width() > maViewSize.Width() || maWinPos.X() < 0 )
+ {
+ maWinPos.X() = maViewSize.Width() / 2 - aWinSize.Width() / 2;
+ bChanged = TRUE;
+ }
+ if ( aWinSize.Height() > maViewSize.Height() || maWinPos.Y() < 0 )
+ {
+ maWinPos.Y() = maViewSize.Height() / 2 - aWinSize.Height() / 2;
+ bChanged = TRUE;
+ }
+ }
+
+ UpdateMapMode ();
+
+ if (bChanged && bInvalidate)
+ Invalidate();
+}
+
+
+
+
+void Window::UpdateMapMode (void)
+{
+ Size aWinSize = PixelToLogic(GetOutputSizePixel());
+ maWinPos -= maViewOrigin;
+ Size aPix(maWinPos.X(), maWinPos.Y());
+ aPix = LogicToPixel(aPix);
+ // Groesse muss vielfaches von BRUSH_SIZE sein, damit Muster
+ // richtig dargestellt werden
+ // #i2237#
+ // removed old stuff here which still forced zoom to be
+ // %BRUSH_SIZE which is outdated now
+
+ if (mpViewShell && mpViewShell->ISA(DrawViewShell))
+ {
+ Size aViewSizePixel = LogicToPixel(maViewSize);
+ Size aWinSizePixel = LogicToPixel(aWinSize);
+
+ // Seite soll nicht am Fensterrand "kleben"
+ if (aPix.Width() == 0)
+ {
+ // #i2237#
+ // Since BRUSH_SIZE alignment is outdated now, i use the
+ // former constant here directly
+ aPix.Width() -= 8;
+ }
+ if (aPix.Height() == 0)
+ {
+ // #i2237#
+ // Since BRUSH_SIZE alignment is outdated now, i use the
+ // former constant here directly
+ aPix.Height() -= 8;
+ }
+ }
+
+ aPix = PixelToLogic(aPix);
+ maWinPos.X() = aPix.Width();
+ maWinPos.Y() = aPix.Height();
+ Point aNewOrigin (-maWinPos.X(), -maWinPos.Y());
+ maWinPos += maViewOrigin;
+
+ MapMode aMap(GetMapMode());
+ aMap.SetOrigin(aNewOrigin);
+ SetMapMode(aMap);
+}
+
+
+
+
+/*************************************************************************
+|*
+|* X-Position des sichtbaren Bereichs als Bruchteil (< 1)
+|* der gesamten Arbeitsbereichbreite zuruegeben
+|*
+\************************************************************************/
+
+double Window::GetVisibleX()
+{
+ return ((double) maWinPos.X() / maViewSize.Width());
+}
+
+/*************************************************************************
+|*
+|* Y-Position des sichtbaren Bereichs als Bruchteil (< 1)
+|* der gesamten Arbeitsbereichhoehe zuruegeben
+|*
+\************************************************************************/
+
+double Window::GetVisibleY()
+{
+ return ((double) maWinPos.Y() / maViewSize.Height());
+}
+
+/*************************************************************************
+|*
+|* X- und Y-Position des sichtbaren Bereichs als Bruchteile (< 1)
+|* der gesamten Arbeitsbereichgroesse setzen
+|* negative Werte werden ignoriert
+|*
+\************************************************************************/
+
+void Window::SetVisibleXY(double fX, double fY)
+{
+ long nOldX = maWinPos.X();
+ long nOldY = maWinPos.Y();
+
+ if ( fX >= 0 )
+ maWinPos.X() = (long) (fX * maViewSize.Width());
+ if ( fY >= 0 )
+ maWinPos.Y() = (long) (fY * maViewSize.Height());
+ UpdateMapOrigin(FALSE);
+ // Size sz(nOldX - aWinPos.X(), nOldY - aWinPos.Y());
+ // sz = LogicToPixel(sz);
+ Scroll(nOldX - maWinPos.X(), nOldY - maWinPos.Y(), SCROLL_CHILDREN);
+ Update();
+}
+
+/*************************************************************************
+|*
+|* Breite des sichtbaren Bereichs im Verhaeltnis zur
+|* gesamten Arbeitsbereichbreite zuruegeben
+|*
+\************************************************************************/
+
+double Window::GetVisibleWidth()
+{
+ Size aWinSize = PixelToLogic(GetOutputSizePixel());
+ if ( aWinSize.Width() > maViewSize.Width() )
+ aWinSize.Width() = maViewSize.Width();
+ return ((double) aWinSize.Width() / maViewSize.Width());
+}
+
+/*************************************************************************
+|*
+|* Hoehe des sichtbaren Bereichs im Verhaeltnis zur
+|* gesamten Arbeitsbereichhoehe zuruegeben
+|*
+\************************************************************************/
+
+double Window::GetVisibleHeight()
+{
+ Size aWinSize = PixelToLogic(GetOutputSizePixel());
+ if ( aWinSize.Height() > maViewSize.Height() )
+ aWinSize.Height() = maViewSize.Height();
+ return ((double) aWinSize.Height() / maViewSize.Height());
+}
+
+/*************************************************************************
+|*
+|* Breite einer Scrollspalte im Verhaeltnis zur gesamten
+|* Arbeitsbereichbreite zuruegeben
+|*
+\************************************************************************/
+
+double Window::GetScrlLineWidth()
+{
+ return (GetVisibleWidth() * SCROLL_LINE_FACT);
+}
+
+/*************************************************************************
+|*
+|* Breite einer Scrollspalte im Verhaeltnis zur gesamten
+|* Arbeitsbereichhoehe zuruegeben
+|*
+\************************************************************************/
+
+double Window::GetScrlLineHeight()
+{
+ return (GetVisibleHeight() * SCROLL_LINE_FACT);
+}
+
+/*************************************************************************
+|*
+|* Breite einer Scrollpage im Verhaeltnis zur gesamten
+|* Arbeitsbereichbreite zuruegeben
+|*
+\************************************************************************/
+
+double Window::GetScrlPageWidth()
+{
+ return (GetVisibleWidth() * SCROLL_PAGE_FACT);
+}
+
+/*************************************************************************
+|*
+|* Breite einer Scrollpage im Verhaeltnis zur gesamten
+|* Arbeitsbereichhoehe zuruegeben
+|*
+\************************************************************************/
+
+double Window::GetScrlPageHeight()
+{
+ return (GetVisibleHeight() * SCROLL_PAGE_FACT);
+}
+
+/*************************************************************************
+|*
+|* Fenster deaktivieren
+|*
+\************************************************************************/
+
+void Window::LoseFocus()
+{
+ mnTicks = 0;
+ ::Window::LoseFocus ();
+}
+
+/*************************************************************************
+|*
+|* Fenster aktivieren
+|*
+\************************************************************************/
+
+void Window::GrabFocus()
+{
+ mnTicks = 0;
+ ::Window::GrabFocus ();
+}
+
+
+/*************************************************************************
+|*
+|* DataChanged
+|*
+\************************************************************************/
+
+void Window::DataChanged( const DataChangedEvent& rDCEvt )
+{
+ ::Window::DataChanged( rDCEvt );
+
+ // PRINTER bei allen Dokumenten weglassen, die keinen Printer benutzen.
+ // FONTS und FONTSUBSTITUTION weglassen, wenn keine Textausgaben
+ // vorhanden sind, bzw. wenn das Dokument keinen Text zulaesst.
+
+ if ( (rDCEvt.GetType() == DATACHANGED_PRINTER) ||
+ (rDCEvt.GetType() == DATACHANGED_DISPLAY) ||
+ (rDCEvt.GetType() == DATACHANGED_FONTS) ||
+ (rDCEvt.GetType() == DATACHANGED_FONTSUBSTITUTION) ||
+ ((rDCEvt.GetType() == DATACHANGED_SETTINGS) &&
+ (rDCEvt.GetFlags() & SETTINGS_STYLE)) )
+ {
+ if ( (rDCEvt.GetType() == DATACHANGED_SETTINGS) &&
+ (rDCEvt.GetFlags() & SETTINGS_STYLE) )
+ {
+ // When the screen zoom factor has changed then reset the zoom
+ // factor of the frame to allways display the whole page.
+ const AllSettings* pOldSettings = rDCEvt.GetOldSettings ();
+ const AllSettings& rNewSettings = GetSettings ();
+ if (pOldSettings)
+ if (pOldSettings->GetStyleSettings().GetScreenZoom()
+ != rNewSettings.GetStyleSettings().GetScreenZoom())
+ mpViewShell->GetViewFrame()->GetDispatcher()->
+ Execute(SID_SIZE_PAGE, SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD);
+
+ // ScrollBars neu anordnen bzw. Resize ausloesen, da sich
+ // ScrollBar-Groesse geaendert haben kann. Dazu muss dann im
+ // Resize-Handler aber auch die Groesse der ScrollBars aus
+ // den Settings abgefragt werden.
+ Resize();
+
+ // Daten neu Setzen, die aus den Systemeinstellungen bzw. aus
+ // den Settings uebernommen werden. Evtl. weitere Daten neu
+ // berechnen, da sich auch die Aufloesung hierdurch geaendert
+ // haben kann.
+ if( mpViewShell )
+ {
+ const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
+ SvtAccessibilityOptions aAccOptions;
+ ULONG nOutputMode;
+ USHORT nPreviewSlot;
+
+ if( rStyleSettings.GetHighContrastMode() )
+ nOutputMode = ViewShell::OUTPUT_DRAWMODE_CONTRAST;
+ else
+ nOutputMode = ViewShell::OUTPUT_DRAWMODE_COLOR;
+
+ if( rStyleSettings.GetHighContrastMode() && aAccOptions.GetIsForPagePreviews() )
+ nPreviewSlot = SID_PREVIEW_QUALITY_CONTRAST;
+ else
+ nPreviewSlot = SID_PREVIEW_QUALITY_COLOR;
+
+ if( mpViewShell->ISA( DrawViewShell ) )
+ {
+ SetDrawMode( nOutputMode );
+ mpViewShell->GetFrameView()->SetDrawMode( nOutputMode );
+// #110094#-7
+// mpViewShell->GetView()->ReleaseMasterPagePaintCache();
+ Invalidate();
+ }
+
+ // #103100# Overwrite window color for OutlineView
+ if( mpViewShell->ISA(OutlineViewShell ) )
+ {
+ svtools::ColorConfig aColorConfig;
+ const Color aDocColor( aColorConfig.GetColorValue( svtools::DOCCOLOR ).nColor );
+ SetBackground( Wallpaper( aDocColor ) );
+ }
+
+ SfxRequest aReq( nPreviewSlot, 0, mpViewShell->GetDocSh()->GetDoc()->GetItemPool() );
+ mpViewShell->ExecReq( aReq );
+ mpViewShell->Invalidate();
+ mpViewShell->ArrangeGUIElements();
+
+ // #101928# re-create handles to show new outfit
+ if(mpViewShell->ISA(DrawViewShell))
+ {
+ mpViewShell->GetView()->AdjustMarkHdl();
+ }
+ }
+ }
+
+ if ( (rDCEvt.GetType() == DATACHANGED_DISPLAY) ||
+ ((rDCEvt.GetType() == DATACHANGED_SETTINGS) &&
+ (rDCEvt.GetFlags() & SETTINGS_STYLE)) )
+ {
+ // Virtuelle Device die auch von der Aufloesung oder von
+ // Systemeinstellungen abhaengen, sollten geupdatet werden.
+ // Ansonsten sollte zumindest bei DATACHANGED_DISPLAY
+ // die virtuellen Devices geupdatet werden, da es einige
+ // Systeme erlauben die Aufloesung und Farbtiefe waehrend
+ // der Laufzeit zu aendern oder eben bei Palettenaenderungen
+ // die virtuellen Device geupdatet werden muessen, da bei
+ // Ausgaben ein anderes Farbmatching stattfinden kann.
+ }
+
+ if ( rDCEvt.GetType() == DATACHANGED_FONTS )
+ {
+ // Wenn das Dokument Font-AuswahlBoxen anbietet, muessen
+ // diese geupdatet werden. Wie dies genau aussehen muss,
+ // weiss ich leider auch nicht. Aber evtl. kann man das
+ // ja global handeln. Dies muessten wir evtl. mal
+ // mit PB absprechen, aber der ist derzeit leider Krank.
+ // Also bevor dies hier gehandelt wird, vorher mit
+ // PB und mir absprechen.
+ }
+
+ if ( (rDCEvt.GetType() == DATACHANGED_FONTS) ||
+ (rDCEvt.GetType() == DATACHANGED_FONTSUBSTITUTION) )
+ {
+ // Formatierung neu durchfuehren, da Fonts die im Dokument
+ // vorkommen, nicht mehr vorhanden sein muessen oder
+ // jetzt vorhanden sind oder durch andere ersetzt wurden
+ // sind.
+ if( mpViewShell )
+ {
+ DrawDocShell* pDocSh = mpViewShell->GetDocSh();
+ if( pDocSh )
+ pDocSh->SetPrinter( pDocSh->GetPrinter( TRUE ) );
+ }
+ }
+
+ if ( rDCEvt.GetType() == DATACHANGED_PRINTER )
+ {
+ // Wie hier die Behandlung aussehen soll, weiss ich leider
+ // selbst noch nicht. Evtl. mal einen Printer loeschen und
+ // schauen was gemacht werden muss. Evtl. muesste ich in
+ // VCL dafuer noch etwas einbauen, wenn der benutze Printer
+ // geloescht wird. Ansonsten wuerde ich hier evtl. die
+ // Formatierung neu berechnen, wenn der aktuelle Drucker
+ // zerstoert wurde.
+ if( mpViewShell )
+ {
+ DrawDocShell* pDocSh = mpViewShell->GetDocSh();
+ if( pDocSh )
+ pDocSh->SetPrinter( pDocSh->GetPrinter( TRUE ) );
+ }
+ }
+
+ // Alles neu ausgeben
+ Invalidate();
+ }
+}
+
+
+
+
+/*************************************************************************
+|*
+|* DropTargetHelper::AcceptDrop
+|*
+\************************************************************************/
+
+sal_Int8 Window::AcceptDrop( const AcceptDropEvent& rEvt )
+{
+ sal_Int8 nRet = DND_ACTION_NONE;
+
+ if( mpViewShell && !mpViewShell->GetDocSh()->IsReadOnly() )
+ {
+ if( mpViewShell )
+ nRet = mpViewShell->AcceptDrop( rEvt, *this, this, SDRPAGE_NOTFOUND, SDRLAYER_NOTFOUND );
+
+ if (mbUseDropScroll && ! mpViewShell->ISA(OutlineViewShell))
+ DropScroll( rEvt.maPosPixel );
+ }
+
+ return nRet;
+}
+
+/*************************************************************************
+|*
+|* DropTargetHelper::ExecuteDrop
+|*
+\************************************************************************/
+
+sal_Int8 Window::ExecuteDrop( const ExecuteDropEvent& rEvt )
+{
+ sal_Int8 nRet = DND_ACTION_NONE;
+
+ if( mpViewShell )
+ {
+ nRet = mpViewShell->ExecuteDrop( rEvt, *this, this, SDRPAGE_NOTFOUND, SDRLAYER_NOTFOUND );
+ }
+
+ return nRet;
+}
+
+
+
+
+void Window::SetUseDropScroll (bool bUseDropScroll)
+{
+ mbUseDropScroll = bUseDropScroll;
+}
+
+
+
+
+/*************************************************************************
+|*
+|* Scrolling bei AcceptDrop-Events
+|*
+\************************************************************************/
+
+void Window::DropScroll(const Point& rMousePos)
+{
+ short nDx = 0;
+ short nDy = 0;
+
+ Size aSize = GetOutputSizePixel();
+
+ if (aSize.Width() > SCROLL_SENSITIVE * 3)
+ {
+ if ( rMousePos.X() < SCROLL_SENSITIVE )
+ {
+ nDx = -1;
+ }
+
+ if ( rMousePos.X() >= aSize.Width() - SCROLL_SENSITIVE )
+ {
+ nDx = 1;
+ }
+ }
+
+ if (aSize.Height() > SCROLL_SENSITIVE * 3)
+ {
+ if ( rMousePos.Y() < SCROLL_SENSITIVE )
+ {
+ nDy = -1;
+ }
+
+ if ( rMousePos.Y() >= aSize.Height() - SCROLL_SENSITIVE )
+ {
+ nDy = 1;
+ }
+ }
+
+ if ( (nDx || nDy) && (rMousePos.X()!=0 || rMousePos.Y()!=0 ) )
+ {
+ if (mnTicks > 20)
+ mpViewShell->ScrollLines(nDx, nDy);
+ else
+ mnTicks ++;
+ }
+}
+
+
+
+
+::com::sun::star::uno::Reference<
+ ::com::sun::star::accessibility::XAccessible>
+ Window::CreateAccessible (void)
+{
+ if (mpViewShell != NULL)
+ return mpViewShell->CreateAccessibleDocumentView (this);
+ else
+ {
+ OSL_TRACE ("::sd::Window::CreateAccessible: no view shell");
+ return ::Window::CreateAccessible ();
+ }
+}
+
+XubString Window::GetSurroundingText() const
+{
+ if ( mpViewShell->GetShellType() == ViewShell::ST_OUTLINE )
+ {
+ return XubString();
+ }
+ else if ( mpViewShell->GetView()->IsTextEdit() )
+ {
+ OutlinerView *pOLV = mpViewShell->GetView()->GetTextEditOutlinerView();
+ return pOLV->GetEditView().GetSurroundingText();
+ }
+ else
+ {
+ return XubString();
+ }
+}
+
+Selection Window::GetSurroundingTextSelection() const
+{
+ if ( mpViewShell->GetShellType() == ViewShell::ST_OUTLINE )
+ {
+ return Selection( 0, 0 );
+ }
+ else if ( mpViewShell->GetView()->IsTextEdit() )
+ {
+ OutlinerView *pOLV = mpViewShell->GetView()->GetTextEditOutlinerView();
+ return pOLV->GetEditView().GetSurroundingTextSelection();
+ }
+ else
+ {
+ return Selection( 0, 0 );
+ }
+}
+
+} // end of namespace sd