summaryrefslogtreecommitdiff
path: root/sd/source/ui/view/sdwindow.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sd/source/ui/view/sdwindow.cxx')
-rw-r--r--sd/source/ui/view/sdwindow.cxx858
1 files changed, 858 insertions, 0 deletions
diff --git a/sd/source/ui/view/sdwindow.cxx b/sd/source/ui/view/sdwindow.cxx
new file mode 100644
index 000000000000..763ffbb32bbd
--- /dev/null
+++ b/sd/source/ui/view/sdwindow.cxx
@@ -0,0 +1,858 @@
+/*************************************************************************
+ *
+ * $RCSfile: sdwindow.cxx,v $
+ *
+ * $Revision: 1.1.1.1 $
+ *
+ * last change: $Author: hr $ $Date: 2000-09-18 16:48:44 $
+ *
+ * The Contents of this file are made available subject to the terms of
+ * either of the following licenses
+ *
+ * - GNU Lesser General Public License Version 2.1
+ * - Sun Industry Standards Source License Version 1.1
+ *
+ * Sun Microsystems Inc., October, 2000
+ *
+ * GNU Lesser General Public License Version 2.1
+ * =============================================
+ * Copyright 2000 by Sun Microsystems, Inc.
+ * 901 San Antonio Road, Palo Alto, CA 94303, USA
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software Foundation.
+ *
+ * This library 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 for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ *
+ *
+ * Sun Industry Standards Source License Version 1.1
+ * =================================================
+ * The contents of this file are subject to the Sun Industry Standards
+ * Source License Version 1.1 (the "License"); You may not use this file
+ * except in compliance with the License. You may obtain a copy of the
+ * License at http://www.openoffice.org/license.html.
+ *
+ * Software provided under this License is provided on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
+ * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
+ * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
+ * See the License for the specific provisions governing your rights and
+ * obligations concerning the Software.
+ *
+ * The Initial Developer of the Original Code is: Sun Microsystems, Inc.
+ *
+ * Copyright: 2000 by Sun Microsystems, Inc.
+ *
+ * All Rights Reserved.
+ *
+ * Contributor(s): _______________________________________
+ *
+ *
+ ************************************************************************/
+
+#ifndef _B3D_BASE3D_HXX
+#include "goodies/base3d.hxx"
+#endif
+
+#pragma hdrstop
+
+#include "helpids.h"
+#include "sdwindow.hxx"
+#include "viewshel.hxx"
+#include "drviewsh.hxx"
+#include "dragserv.hxx"
+#include "sdview.hxx"
+#include "outlnvsh.hxx"
+
+
+#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
+|*
+\************************************************************************/
+
+SdWindow::SdWindow(Window* pParent) :
+ Window(pParent, WinBits(WB_CLIPCHILDREN | WB_DIALOGCONTROL)),
+ pShareWin(NULL),
+ pViewShell(NULL),
+ aWinPos(0, 0), // vorsichtshalber; die Werte sollten aber
+ aViewOrigin(0, 0), // vom Besitzer des Fensters neu gesetzt
+ aViewSize(1000, 1000), // werden
+ nMinZoom(MIN_ZOOM),
+ nMaxZoom(MAX_ZOOM),
+ bMinZoomAutoCalc(TRUE),
+ bCalcMinZoomByMinSide(TRUE),
+ bCenterAllowed(TRUE),
+ nTicks (0)
+{
+ SetDialogControlFlags( WINDOW_DLGCTRL_RETURN | WINDOW_DLGCTRL_WANTFOCUS );
+
+ MapMode aMap(GetMapMode());
+ aMap.SetMapUnit(MAP_100TH_MM);
+ SetMapMode(aMap);
+
+ // Damit im Diamodus die Wiese weiss ist
+ SetBackground(Wallpaper(GetSettings().GetStyleSettings().GetWindowColor()));
+
+ // Hilfe-ID setzen
+ // SetHelpId(HID_SD_WIN_DOCUMENT);
+ SetUniqueId(HID_SD_WIN_DOCUMENT);
+
+ EnableDrop();
+}
+
+/*************************************************************************
+|*
+|* Destruktor
+|*
+\************************************************************************/
+
+SdWindow::~SdWindow()
+{
+}
+
+/*************************************************************************
+|*
+|* Die Haelfte des Sichtbaren Bereich eines anderen Fensters darstellen
+|*
+\************************************************************************/
+
+void SdWindow::ShareViewArea(SdWindow* pOtherWin)
+{
+ pShareWin = pOtherWin;
+ aViewOrigin = pOtherWin->aViewOrigin;
+ aViewSize = pOtherWin->aViewSize;
+ nMinZoom = pOtherWin->nMinZoom;
+ nMaxZoom = pOtherWin->nMaxZoom;
+ bCenterAllowed = pOtherWin->bCenterAllowed;
+
+ long nZoom = pOtherWin->GetZoom();
+ MapMode aMap(GetMapMode());
+ aMap.SetScaleX(Fraction(nZoom, 100));
+ aMap.SetScaleY(Fraction(nZoom, 100));
+ aMap.SetOrigin(pOtherWin->GetMapMode().GetOrigin());
+ SetMapMode(aMap);
+}
+
+/*************************************************************************
+|*
+|* Resize event
+|*
+\************************************************************************/
+
+void SdWindow::CalcMinZoom()
+{
+ if ( bMinZoomAutoCalc )
+ {
+ long nZoom = GetZoom();
+
+ if ( pShareWin )
+ {
+ pShareWin->CalcMinZoom();
+ nMinZoom = pShareWin->nMinZoom;
+ }
+ else
+ {
+ Size aWinSize = PixelToLogic(GetOutputSizePixel());
+ ULONG nX = (ULONG) ((double) aWinSize.Width() * (double) ZOOM_MULTIPLICATOR / (double) aViewSize.Width());
+ ULONG nY = (ULONG) ((double) aWinSize.Height() * (double) ZOOM_MULTIPLICATOR / (double) aViewSize.Height());
+ ULONG nFact;
+
+ if ( bCalcMinZoomByMinSide ) nFact = Min(nX, nY);
+ else nFact = Max(nX, nY);
+ nFact = nFact * nZoom / ZOOM_MULTIPLICATOR;
+ nMinZoom = Max((USHORT) MIN_ZOOM, (USHORT) nFact);
+ }
+ if ( nZoom < (long) nMinZoom )
+ SetZoomFactor(nMinZoom);
+ }
+}
+
+/*************************************************************************
+|*
+|* Resize event
+|*
+\************************************************************************/
+
+void SdWindow::Resize()
+{
+ Window::Resize();
+ CalcMinZoom();
+}
+
+/*************************************************************************
+|*
+|* Paint event
+|*
+\************************************************************************/
+
+void SdWindow::Paint(const Rectangle& rRect)
+{
+ if ( pViewShell )
+ pViewShell->Paint(rRect, this);
+}
+
+/*************************************************************************
+|*
+|* Keyboard event
+|*
+\************************************************************************/
+
+void SdWindow::KeyInput(const KeyEvent& rKEvt)
+{
+ BOOL aReturn = FALSE;
+
+ if (!(pViewShell && pViewShell->KeyInput(rKEvt, this)))
+ {
+ if (pViewShell && rKEvt.GetKeyCode().GetCode() == KEY_ESCAPE)
+ {
+ // Wenn IP aktiv, wird der IP-Modus abgebrochen
+ pViewShell->GetDocSh()->DoInPlaceActivate(FALSE);
+ }
+ else
+ {
+ Window::KeyInput(rKEvt);
+ }
+ }
+}
+
+/*************************************************************************
+|*
+|* MouseButtonDown event
+|*
+\************************************************************************/
+
+void SdWindow::MouseButtonDown(const MouseEvent& rMEvt)
+{
+ if ( pViewShell )
+ pViewShell->MouseButtonDown(rMEvt, this);
+}
+
+/*************************************************************************
+|*
+|* MouseMove event
+|*
+\************************************************************************/
+
+void SdWindow::MouseMove(const MouseEvent& rMEvt)
+{
+ if ( pViewShell )
+ pViewShell->MouseMove(rMEvt, this);
+}
+
+/*************************************************************************
+|*
+|* MouseButtonUp event
+|*
+\************************************************************************/
+
+void SdWindow::MouseButtonUp(const MouseEvent& rMEvt)
+{
+ nTicks = 0;
+
+ if ( pViewShell )
+ pViewShell->MouseButtonUp(rMEvt, this);
+}
+
+/*************************************************************************
+|*
+|* Command event
+|*
+\************************************************************************/
+
+void SdWindow::Command(const CommandEvent& rCEvt)
+{
+ if ( pViewShell )
+ pViewShell->Command(rCEvt, this);
+}
+
+/*************************************************************************
+|*
+|* RequestHelp event
+|*
+\************************************************************************/
+
+void SdWindow::RequestHelp(const HelpEvent& rEvt)
+{
+ if ( pViewShell )
+ {
+ if( !pViewShell->RequestHelp( rEvt, this) )
+ Window::RequestHelp( rEvt );
+ }
+ else
+ Window::RequestHelp( rEvt );
+}
+
+/*************************************************************************
+|*
+|* Position der linken oberen Ecke des im Fenster sichtbaren Bereichs
+|* setzen
+|*
+\************************************************************************/
+
+void SdWindow::SetWinViewPos(const Point& rPnt)
+{
+ aWinPos = rPnt;
+}
+
+/*************************************************************************
+|*
+|* Ursprung der Darstellung in Bezug zur gesamten Arbeitsflaeche setzen
+|*
+\************************************************************************/
+
+void SdWindow::SetViewOrigin(const Point& rPnt)
+{
+ aViewOrigin = rPnt;
+}
+
+/*************************************************************************
+|*
+|* Groesse der gesamten Arbeitsflaeche, die mit dem Fenster betrachtet
+|* werden kann, setzen
+|*
+\************************************************************************/
+
+void SdWindow::SetViewSize(const Size& rSize)
+{
+ aViewSize = rSize;
+ CalcMinZoom();
+}
+
+/*************************************************************************
+|*
+|* den eigentlichen Zoomfaktor in Prozent setzen; protected, wird
+|* nur intern benutzt
+|*
+\************************************************************************/
+
+long SdWindow::SetZoomFactor(long nZoom)
+{
+ if ( nZoom > MAX_ZOOM ) nZoom = MAX_ZOOM;
+ if ( nZoom < (long) nMinZoom ) nZoom = nMinZoom;
+
+ MapMode aMap(GetMapMode());
+ aMap.SetScaleX(Fraction(nZoom, 100));
+ aMap.SetScaleY(Fraction(nZoom, 100));
+ SetMapMode(aMap);
+ UpdateMapOrigin();
+ if ( pViewShell && pViewShell->ISA(SdDrawViewShell) )
+ ((SdDrawViewShell*) pViewShell)->GetView()->
+ RecalcLogicSnapMagnetic(*this);
+ return nZoom;
+}
+
+/*************************************************************************
+|*
+|* Zoomfaktor in Prozent setzen und Darstellungsbereich um den
+|* Zoom-Mittelpunkt zentrieren
+|*
+\************************************************************************/
+
+void SdWindow::SetZoom(long nZoom)
+{
+ if ( nZoom > MAX_ZOOM ) nZoom = MAX_ZOOM;
+ if ( nZoom < (long) nMinZoom ) nZoom = nMinZoom;
+
+ Size aSize = PixelToLogic(GetOutputSizePixel());
+ long nW = aSize.Width() * GetZoom() / nZoom;
+ long nH = aSize.Height() * GetZoom() / nZoom;
+ aWinPos.X() += (aSize.Width() - nW) / 2;
+ aWinPos.Y() += (aSize.Height() - nH) / 2;
+ if ( aWinPos.X() < 0 ) aWinPos.X() = 0;
+ if ( aWinPos.Y() < 0 ) aWinPos.Y() = 0;
+ SetZoomFactor(nZoom);
+}
+
+/*************************************************************************
+|*
+|* Fensterposition und Zoomfaktor nach uebergebenem Rechteck setzen
+|* obere linke Ecke des Rechtecks muss relativ zur linken oberen
+|* Ecke des Fensters angegeben werden; gibt den berechneten Zoom-
+|* faktor zurueck
+|*
+\************************************************************************/
+
+long SdWindow::SetZoomRect(const Rectangle& rZoomRect)
+{
+ long nNewZoom = 100;
+
+ if (rZoomRect.GetWidth() == 0 || rZoomRect.GetHeight() == 0)
+ {
+ SetZoom(nNewZoom);
+ }
+ else
+ {
+ Point aPos = rZoomRect.TopLeft();
+ Size aWinSize = PixelToLogic(GetOutputSizePixel());
+ DBG_ASSERT(rZoomRect.GetWidth(), "ZoomRect-Breite = 0!");
+ DBG_ASSERT(rZoomRect.GetHeight(), "ZoomRect-Hoehe = 0!");
+ ULONG nX = (ULONG) ((double) aWinSize.Width() * (double) ZOOM_MULTIPLICATOR / (double) rZoomRect.GetWidth());
+ ULONG nY = (ULONG) ((double) aWinSize.Height() * (double) ZOOM_MULTIPLICATOR / (double) rZoomRect.GetHeight());
+ ULONG nFact = Min(nX, nY);
+ long nZoom = nFact * GetZoom() / ZOOM_MULTIPLICATOR;
+
+ if ( nFact == 0 )
+ {
+ nNewZoom = GetZoom();
+ }
+ else
+ {
+ if ( nZoom > MAX_ZOOM )
+ nFact = nFact * MAX_ZOOM / nZoom;
+
+ aWinPos = aViewOrigin + aPos;
+
+ aWinSize.Width() = (long) ((double) aWinSize.Width() * (double) ZOOM_MULTIPLICATOR / (double) nFact);
+ aWinPos.X() += (rZoomRect.GetWidth() - aWinSize.Width()) / 2;
+ aWinSize.Height() = (long) ((double) aWinSize.Height() * (double) ZOOM_MULTIPLICATOR / (double) nFact);
+ aWinPos.Y() += (rZoomRect.GetHeight() - aWinSize.Height()) / 2;
+
+ if ( aWinPos.X() < 0 ) aWinPos.X() = 0;
+ if ( aWinPos.Y() < 0 ) aWinPos.Y() = 0;
+ nNewZoom = SetZoomFactor(nZoom);
+ }
+ }
+
+ return(nNewZoom);
+}
+
+/*************************************************************************
+|*
+|* Neuen MapMode-Origin berechnen und setzen; wenn aWinPos.X()/Y()
+|* gleich -1 ist, wird die entsprechende Position zentriert
+|* (z.B. fuer Initialisierung)
+|*
+\************************************************************************/
+
+void SdWindow::UpdateMapOrigin(BOOL bInvalidate)
+{
+ MapMode aMap(GetMapMode());
+ Point aNewOrigin;
+ BOOL bChanged = FALSE;
+ Size aWinSize = PixelToLogic(GetOutputSizePixel());
+
+ if ( bCenterAllowed )
+ {
+ if ( aWinPos.X() > aViewSize.Width() - aWinSize.Width() )
+ {
+ aWinPos.X() = aViewSize.Width() - aWinSize.Width();
+ bChanged = TRUE;
+ }
+ if ( aWinPos.Y() > aViewSize.Height() - aWinSize.Height() )
+ {
+ aWinPos.Y() = aViewSize.Height() - aWinSize.Height();
+ bChanged = TRUE;
+ }
+ if ( aWinSize.Width() > aViewSize.Width() || aWinPos.X() < 0 )
+ {
+ aWinPos.X() = aViewSize.Width() / 2 - aWinSize.Width() / 2;
+ bChanged = TRUE;
+ }
+ if ( aWinSize.Height() > aViewSize.Height() || aWinPos.Y() < 0 )
+ {
+ aWinPos.Y() = aViewSize.Height() / 2 - aWinSize.Height() / 2;
+ bChanged = TRUE;
+ }
+ aWinPos -= aViewOrigin;
+ Size aPix(aWinPos.X(), aWinPos.Y());
+ aPix = LogicToPixel(aPix);
+ // Groesse muss vielfaches von BRUSH_SIZE sein, damit Muster
+ // richtig dargestellt werden
+ aPix.Width() -= aPix.Width() % BRUSH_SIZE;
+ aPix.Height() -= aPix.Height() % BRUSH_SIZE;
+
+ if (pViewShell && pViewShell->ISA(SdDrawViewShell))
+ {
+ Size aViewSizePixel = LogicToPixel(aViewSize);
+ Size aWinSizePixel = LogicToPixel(aWinSize);
+
+ // Seite soll nicht am Fensterrand "kleben"
+ if (aPix.Width() == 0)
+ {
+ aPix.Width() -= BRUSH_SIZE;
+ }
+ if (aPix.Height() == 0)
+ {
+ aPix.Height() -= BRUSH_SIZE;
+ }
+ }
+
+ aPix = PixelToLogic(aPix);
+ aWinPos.X() = aPix.Width();
+ aWinPos.Y() = aPix.Height();
+ aNewOrigin.X() = - aWinPos.X();
+ aNewOrigin.Y() = - aWinPos.Y();
+ aWinPos += aViewOrigin;
+
+ aMap.SetOrigin(aNewOrigin);
+ SetMapMode(aMap);
+
+ if ( bChanged && bInvalidate )
+ Invalidate();
+ }
+}
+
+/*************************************************************************
+|*
+|* X-Position des sichtbaren Bereichs als Bruchteil (< 1)
+|* der gesamten Arbeitsbereichbreite zuruegeben
+|*
+\************************************************************************/
+
+double SdWindow::GetVisibleX()
+{
+ return ((double) aWinPos.X() / aViewSize.Width());
+}
+
+/*************************************************************************
+|*
+|* Y-Position des sichtbaren Bereichs als Bruchteil (< 1)
+|* der gesamten Arbeitsbereichhoehe zuruegeben
+|*
+\************************************************************************/
+
+double SdWindow::GetVisibleY()
+{
+ return ((double) aWinPos.Y() / aViewSize.Height());
+}
+
+/*************************************************************************
+|*
+|* X- und Y-Position des sichtbaren Bereichs als Bruchteile (< 1)
+|* der gesamten Arbeitsbereichgroesse setzen
+|* negative Werte werden ignoriert
+|*
+\************************************************************************/
+
+void SdWindow::SetVisibleXY(double fX, double fY)
+{
+ long nOldX = aWinPos.X();
+ long nOldY = aWinPos.Y();
+
+ if ( fX >= 0 )
+ aWinPos.X() = (long) (fX * aViewSize.Width());
+ if ( fY >= 0 )
+ aWinPos.Y() = (long) (fY * aViewSize.Height());
+ UpdateMapOrigin(FALSE);
+ Size sz(nOldX - aWinPos.X(), nOldY - aWinPos.Y());
+ sz = LogicToPixel(sz);
+ Scroll(nOldX - aWinPos.X(), nOldY - aWinPos.Y(), SCROLL_CHILDREN);
+ Update();
+}
+
+/*************************************************************************
+|*
+|* Breite des sichtbaren Bereichs im Verhaeltnis zur
+|* gesamten Arbeitsbereichbreite zuruegeben
+|*
+\************************************************************************/
+
+double SdWindow::GetVisibleWidth()
+{
+ Size aWinSize = PixelToLogic(GetOutputSizePixel());
+ if ( aWinSize.Width() > aViewSize.Width() )
+ aWinSize.Width() = aViewSize.Width();
+ return ((double) aWinSize.Width() / aViewSize.Width());
+}
+
+/*************************************************************************
+|*
+|* Hoehe des sichtbaren Bereichs im Verhaeltnis zur
+|* gesamten Arbeitsbereichhoehe zuruegeben
+|*
+\************************************************************************/
+
+double SdWindow::GetVisibleHeight()
+{
+ Size aWinSize = PixelToLogic(GetOutputSizePixel());
+ if ( aWinSize.Height() > aViewSize.Height() )
+ aWinSize.Height() = aViewSize.Height();
+ return ((double) aWinSize.Height() / aViewSize.Height());
+}
+
+/*************************************************************************
+|*
+|* Breite einer Scrollspalte im Verhaeltnis zur gesamten
+|* Arbeitsbereichbreite zuruegeben
+|*
+\************************************************************************/
+
+double SdWindow::GetScrlLineWidth()
+{
+ return (GetVisibleWidth() * SCROLL_LINE_FACT);
+}
+
+/*************************************************************************
+|*
+|* Breite einer Scrollspalte im Verhaeltnis zur gesamten
+|* Arbeitsbereichhoehe zuruegeben
+|*
+\************************************************************************/
+
+double SdWindow::GetScrlLineHeight()
+{
+ return (GetVisibleHeight() * SCROLL_LINE_FACT);
+}
+
+/*************************************************************************
+|*
+|* Breite einer Scrollpage im Verhaeltnis zur gesamten
+|* Arbeitsbereichbreite zuruegeben
+|*
+\************************************************************************/
+
+double SdWindow::GetScrlPageWidth()
+{
+ return (GetVisibleWidth() * SCROLL_PAGE_FACT);
+}
+
+/*************************************************************************
+|*
+|* Breite einer Scrollpage im Verhaeltnis zur gesamten
+|* Arbeitsbereichhoehe zuruegeben
+|*
+\************************************************************************/
+
+double SdWindow::GetScrlPageHeight()
+{
+ return (GetVisibleHeight() * SCROLL_PAGE_FACT);
+}
+
+
+/*************************************************************************
+|*
+|* QueryDrop-Event
+|*
+\************************************************************************/
+
+BOOL SdWindow::QueryDrop(DropEvent& rEvt)
+{
+ BOOL bReturn = FALSE;
+
+ if (pViewShell && !pViewShell->GetDocSh()->IsReadOnly())
+ {
+ if (pViewShell)
+ {
+ bReturn = pViewShell->QueryDrop(rEvt, this, SDRPAGE_NOTFOUND, SDRLAYER_NOTFOUND);
+ }
+
+ // der Outliner scrollt selbst, darum im Gliederungsmodus kein DropScroll!!
+ if (!pViewShell->ISA(SdOutlineViewShell))
+ {
+ DropScroll( rEvt.GetPosPixel() );
+ }
+ }
+
+ return (bReturn);
+}
+
+/*************************************************************************
+|*
+|* Drop-Event
+|*
+\************************************************************************/
+
+BOOL SdWindow::Drop(const DropEvent& rEvt)
+{
+ BOOL bReturn = FALSE;
+
+ if (pViewShell)
+ {
+ bReturn = pViewShell->Drop(rEvt, this, SDRPAGE_NOTFOUND, SDRLAYER_NOTFOUND);
+ }
+
+ return (bReturn);
+}
+
+
+/*************************************************************************
+|*
+|* Scrolling bei QueryDrop-Events
+|*
+\************************************************************************/
+
+void SdWindow::DropScroll(const Point& rMousePos)
+{
+ BOOL bReturn = FALSE;
+
+ 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 (nTicks > 20) pViewShell->ScrollLines(nDx, nDy);
+ else nTicks ++;
+ }
+}
+
+/*************************************************************************
+|*
+|* Fenster deaktivieren
+|*
+\************************************************************************/
+
+void SdWindow::LoseFocus()
+{
+ nTicks = 0;
+ Window::LoseFocus ();
+}
+
+/*************************************************************************
+|*
+|* Fenster aktivieren
+|*
+\************************************************************************/
+
+void SdWindow::GrabFocus()
+{
+ nTicks = 0;
+ Window::GrabFocus ();
+}
+
+
+/*************************************************************************
+|*
+|* DataChanged
+|*
+\************************************************************************/
+
+void SdWindow::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) )
+ {
+ // 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 ( (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( pViewShell )
+ {
+ SdDrawDocShell* pDocSh = pViewShell->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( pViewShell )
+ {
+ SdDrawDocShell* pDocSh = pViewShell->GetDocSh();
+ if( pDocSh )
+ pDocSh->SetPrinter( pDocSh->GetPrinter( TRUE ) );
+ }
+ }
+
+ // Alles neu ausgeben
+ Invalidate();
+ }
+}
+
+
+