1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3  * This file is part of the LibreOffice project.
4  *
5  * This Source Code Form is subject to the terms of the Mozilla Public
6  * License, v. 2.0. If a copy of the MPL was not distributed with this
7  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8  *
9  * This file incorporates work covered by the following license notice:
10  *
11  *   Licensed to the Apache Software Foundation (ASF) under one or more
12  *   contributor license agreements. See the NOTICE file distributed
13  *   with this work for additional information regarding copyright
14  *   ownership. The ASF licenses this file to you under the Apache
15  *   License, Version 2.0 (the "License"); you may not use this file
16  *   except in compliance with the License. You may obtain a copy of
17  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
18  */
19 
20 #pragma once
21 
22 #include <tools/gen.hxx>
23 #include <tools/long.hxx>
24 #include <vcl/window.hxx>
25 #include <vcl/transfer.hxx>
26 
27 class OutlinerView;
28 
29 namespace sd
30 {
31 class ViewShell;
32 
33 /** An SdWindow contains the actual working area of ViewShell.
34 
35     <p>The zoom factor used by this class controls how much the page and the
36     shapes on it are scaled down (<100%) or up (>100%) when displayed on the
37     output device represented by the <type>OutputDevice</type>base class.  A
38     zoom factor of 100% would result (with a correctly set DPI value for an
39     output device) in a one to one mapping of the internal coordinates that
40     are stored in 100th of mm.  The zoom factor is stored in the map mode
41     member of the <type>OutputDevice</type> base class.  It is calculated to
42     be an integer percent value.
43 */
44 class Window : public vcl::Window, public ::DropTargetHelper
45 {
46 public:
47     Window(vcl::Window* pParent);
48     virtual ~Window() override;
49     virtual void dispose() override;
50 
51     void SetViewShell(ViewShell* pViewSh);
52     ViewShell* GetViewShell();
53 
54     /** Set the zoom factor to the specified value and center the display
55         area around the zoom center.
56         @param nZoom
57             The zoom factor is given as integral percent value.
58     */
59     void SetZoomIntegral(::tools::Long nZoom);
60 
61     /** This internally used method performs the actual adaptation of the
62         window's map mode to the specified zoom factor.
63         @param nZoom
64             The zoom factor is given as integral percent value.
65         @return
66             When the given zoom factor lies outside the valid range enclosed
67             by the minimal zoom factor previously calculated by
68             <member>CalcMinZoom</member> and a constant upper value it is
69             forced into that interval.  Therefore the returned value is a
70             valid zoom factor.
71     */
72     ::tools::Long SetZoomFactor(::tools::Long nZoom);
73 
74     /** This method is called when the whole page shall be displayed in the
75         window.  Position and zoom factor are set so that the given
76         rectangle is displayed as large as possible in the window while at
77         the same time maintaining the rectangle's aspect ratio and adding a
78         small space at all its four sides (about 3% of width and height).
79         The map mode is adapted accordingly.
80         @param rZoomRect
81             The rectangle is expected to be given relative to the upper left
82             corner of the window in logical coordinates (100th of mm).
83         @return
84             The new zoom factor is returned as integral percent value.
85     */
86     ::tools::Long SetZoomRect(const ::tools::Rectangle& rZoomRect);
87 
88     ::tools::Long GetZoomForRect(const ::tools::Rectangle& rZoomRect);
89 
90     void SetMinZoomAutoCalc(bool bAuto);
91 
92     /** Calculate the minimal zoom factor as the value at which the
93         application area would completely fill the window.  All values set
94         manually or programmatically are set to this value if they are
95         smaller.  If the currently used zoom factor is smaller than the minimal zoom
96         factor than set the minimal zoom factor as the new current zoom
97         factor.
98 
99         <p>This calculation is performed only when the
100         <member>bMinZoomAutoCalc</member> is set (to <TRUE/>).</p>
101     */
102     void CalcMinZoom();
103     void SetMinZoom(::tools::Long nMin);
GetMinZoom() const104     ::tools::Long GetMinZoom() const { return mnMinZoom; }
105     void SetMaxZoom(::tools::Long nMax);
GetMaxZoom() const106     ::tools::Long GetMaxZoom() const { return mnMaxZoom; }
107 
108     ::tools::Long GetZoom() const;
109 
GetWinViewPos() const110     const Point& GetWinViewPos() const { return maWinPos; }
GetViewOrigin() const111     const Point& GetViewOrigin() const { return maViewOrigin; }
GetViewSize() const112     const Size& GetViewSize() const { return maViewSize; }
113     void SetWinViewPos(const Point& rPnt);
114     void SetViewOrigin(const Point& rPnt);
115     void SetViewSize(const Size& rSize);
116     void SetCenterAllowed(bool bIsAllowed);
117 
118     /** Calculate origin of the map mode according to the size of the view
119         and window (its size in model coordinates; that takes the zoom
120         factor into account), and the bCenterAllowed flag.  When it is not
121         set then nothing is changed.  When in any direction the window is
122         larger than the view or the value of aWinPos in this direction is -1
123         then the window is centered in this direction.
124         */
125     void UpdateMapOrigin(bool bInvalidate = true);
126 
127     void UpdateMapMode();
128 
129     double GetVisibleX() const; // interface for ScrollBars
130     double GetVisibleY() const;
131     void SetVisibleXY(double fX, double fY);
132     double GetVisibleWidth() const;
133     double GetVisibleHeight() const;
134     Point GetVisibleCenter();
135     double GetScrlLineWidth() const;
136     double GetScrlLineHeight() const;
137     double GetScrlPageWidth() const;
138     double GetScrlPageHeight() const;
139     void GrabFocus();
140     virtual void DataChanged(const DataChangedEvent& rDCEvt) override;
141 
142     // DropTargetHelper
143     virtual sal_Int8 AcceptDrop(const AcceptDropEvent& rEvt) override;
144     virtual sal_Int8 ExecuteDrop(const ExecuteDropEvent& rEvt) override;
145 
146     /** The DropScroll() method is used by AcceptDrop() to scroll the
147         content of the window while dragging and dropping.  With this method
148         you can control whether DropScroll() shall be used.
149     */
150     void SetUseDropScroll(bool bUseDropScroll);
151     void DropScroll(const Point& rMousePos);
152     virtual void KeyInput(const KeyEvent& rKEvt) override;
153 
154 private:
155     OutlinerView* GetOutlinerView() const;
156 
157 protected:
158     Point maWinPos;
159     Point maViewOrigin;
160     Size maViewSize;
161     Size maPrevSize; // contains previous window size in logical coords
162     sal_uInt16 mnMinZoom;
163     sal_uInt16 mnMaxZoom;
164 
165     /** This flag tells whether to re-calculate the minimal zoom factor
166         depending on the current zoom factor.  Its default value is now false.
167     */
168     bool mbMinZoomAutoCalc;
169     bool mbCenterAllowed;
170     ::tools::Long mnTicks;
171 
172     ViewShell* mpViewShell;
173     bool mbUseDropScroll;
174 
175     virtual void Resize() override;
176     virtual void PrePaint(vcl::RenderContext& rRenderContext) override;
177     virtual void Paint(vcl::RenderContext& rRenderContext,
178                        const ::tools::Rectangle& rRect) override;
179     virtual void MouseMove(const MouseEvent& rMEvt) override;
180     virtual void MouseButtonUp(const MouseEvent& rMEvt) override;
181     virtual void MouseButtonDown(const MouseEvent& rMEvt) override;
182     virtual void Command(const CommandEvent& rCEvt) override;
183     virtual void RequestHelp(const HelpEvent& rEvt) override;
184     virtual void LoseFocus() override;
185     virtual bool EventNotify(NotifyEvent& rNEvt) override;
186 
187     /** Create an accessibility object that makes this window accessible.
188 
189         @return
190             The returned reference is empty if an accessible object could
191             not be created.
192     */
193     virtual css::uno::Reference<css::accessibility::XAccessible> CreateAccessible() override;
194 
195     OUString GetSurroundingText() const override;
196     Selection GetSurroundingTextSelection() const override;
197     bool DeleteSurroundingText(const Selection& rSelection) override;
198 
199     /// @see Window::LogicInvalidate().
200     void LogicInvalidate(const ::tools::Rectangle* pRectangle) override;
201     /// Same as MouseButtonDown(), but coordinates are in logic unit.
202     virtual void LogicMouseButtonDown(const MouseEvent& rMouseEvent) override;
203     /// Same as MouseButtonUp(), but coordinates are in logic unit.
204     virtual void LogicMouseButtonUp(const MouseEvent& rMouseEvent) override;
205     /// Same as MouseMove(), but coordinates are in logic unit.
206     virtual void LogicMouseMove(const MouseEvent& rMouseEvent) override;
207 
208     FactoryFunction GetUITestFactory() const override;
209 };
210 
211 } // end of namespace sd
212 
213 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
214