xref: /AOO41X/main/vcl/inc/brdwin.hxx (revision ebfcd9af2ce496a86a62eef7379364d0a42a7f96)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 #ifndef _SV_BRDWIN_HXX
25 #define _SV_BRDWIN_HXX
26 
27 #include <vcl/sv.h>
28 #include <vcl/window.hxx>
29 
30 class ImplBorderWindowView;
31 
32 // --------------------------
33 // - ImplBorderWindow-Types -
34 // --------------------------
35 
36 #define BORDERWINDOW_STYLE_OVERLAP          ((sal_uInt16)0x0001)
37 #define BORDERWINDOW_STYLE_BORDER           ((sal_uInt16)0x0002)
38 #define BORDERWINDOW_STYLE_FLOAT            ((sal_uInt16)0x0004)
39 #define BORDERWINDOW_STYLE_FRAME            ((sal_uInt16)0x0008)
40 #define BORDERWINDOW_STYLE_APP              ((sal_uInt16)0x0010)
41 
42 #define BORDERWINDOW_HITTEST_TITLE          ((sal_uInt16)0x0001)
43 #define BORDERWINDOW_HITTEST_LEFT           ((sal_uInt16)0x0002)
44 #define BORDERWINDOW_HITTEST_MENU           ((sal_uInt16)0x0004)
45 #define BORDERWINDOW_HITTEST_TOP            ((sal_uInt16)0x0008)
46 #define BORDERWINDOW_HITTEST_RIGHT          ((sal_uInt16)0x0010)
47 #define BORDERWINDOW_HITTEST_BOTTOM         ((sal_uInt16)0x0020)
48 #define BORDERWINDOW_HITTEST_TOPLEFT        ((sal_uInt16)0x0040)
49 #define BORDERWINDOW_HITTEST_TOPRIGHT       ((sal_uInt16)0x0080)
50 #define BORDERWINDOW_HITTEST_BOTTOMLEFT     ((sal_uInt16)0x0100)
51 #define BORDERWINDOW_HITTEST_BOTTOMRIGHT    ((sal_uInt16)0x0200)
52 #define BORDERWINDOW_HITTEST_CLOSE          ((sal_uInt16)0x0400)
53 #define BORDERWINDOW_HITTEST_ROLL           ((sal_uInt16)0x0800)
54 #define BORDERWINDOW_HITTEST_DOCK           ((sal_uInt16)0x1000)
55 #define BORDERWINDOW_HITTEST_HIDE           ((sal_uInt16)0x2000)
56 #define BORDERWINDOW_HITTEST_HELP           ((sal_uInt16)0x4000)
57 #define BORDERWINDOW_HITTEST_PIN            ((sal_uInt16)0x8000)
58 
59 #define BORDERWINDOW_DRAW_TITLE             ((sal_uInt16)0x0001)
60 #define BORDERWINDOW_DRAW_BORDER            ((sal_uInt16)0x0002)
61 #define BORDERWINDOW_DRAW_FRAME             ((sal_uInt16)0x0004)
62 #define BORDERWINDOW_DRAW_CLOSE             ((sal_uInt16)0x0008)
63 #define BORDERWINDOW_DRAW_ROLL              ((sal_uInt16)0x0010)
64 #define BORDERWINDOW_DRAW_DOCK              ((sal_uInt16)0x0020)
65 #define BORDERWINDOW_DRAW_HIDE              ((sal_uInt16)0x0040)
66 #define BORDERWINDOW_DRAW_HELP              ((sal_uInt16)0x0080)
67 #define BORDERWINDOW_DRAW_PIN               ((sal_uInt16)0x0100)
68 #define BORDERWINDOW_DRAW_MENU              ((sal_uInt16)0x0200)
69 #define BORDERWINDOW_DRAW_ALL               (BORDERWINDOW_DRAW_TITLE |      \
70                                              BORDERWINDOW_DRAW_BORDER |     \
71                                              BORDERWINDOW_DRAW_FRAME |      \
72                                              BORDERWINDOW_DRAW_CLOSE |      \
73                                              BORDERWINDOW_DRAW_ROLL |       \
74                                              BORDERWINDOW_DRAW_DOCK |       \
75                                              BORDERWINDOW_DRAW_HIDE |       \
76                                              BORDERWINDOW_DRAW_HELP |       \
77                                              BORDERWINDOW_DRAW_PIN  |       \
78                                              BORDERWINDOW_DRAW_MENU)
79 
80 #define BORDERWINDOW_TITLE_NORMAL           ((sal_uInt16)0x0001)
81 #define BORDERWINDOW_TITLE_SMALL            ((sal_uInt16)0x0002)
82 #define BORDERWINDOW_TITLE_TEAROFF          ((sal_uInt16)0x0004)
83 #define BORDERWINDOW_TITLE_NONE             ((sal_uInt16)0x0008)
84 
85 // --------------------
86 // - ImplBorderWindow -
87 // --------------------
88 
89 class ImplBorderWindow : public Window
90 {
91     friend class Window;
92     friend class ImplBorderWindowView;
93     friend class ImplSmallBorderWindowView;
94     friend class ImplStdBorderWindowView;
95 
96 private:
97     ImplBorderWindowView*   mpBorderView;
98     Window*                 mpMenuBarWindow;
99     long                    mnMinWidth;
100     long                    mnMinHeight;
101     long                    mnMaxWidth;
102     long                    mnMaxHeight;
103     long                    mnRollHeight;
104     long                    mnOrgMenuHeight;
105     sal_uInt16                  mnTitleType;
106     sal_uInt16                  mnBorderStyle;
107     sal_Bool                    mbFloatWindow;
108     sal_Bool                    mbSmallOutBorder;
109     sal_Bool                    mbFrameBorder;
110     sal_Bool                    mbPined;
111     sal_Bool                    mbRollUp;
112     sal_Bool                    mbMenuHide;
113     sal_Bool                    mbDockBtn;
114     sal_Bool                    mbHideBtn;
115     sal_Bool                    mbHelpBtn;
116     sal_Bool                    mbMenuBtn;
117     sal_Bool                    mbDisplayActive;
118 
119     using Window::ImplInit;
120     void                    ImplInit( Window* pParent,
121                                       WinBits nStyle, sal_uInt16 nTypeStyle,
122                                       SystemParentData* pParentData );
123     void                    ImplInit( Window* pParent,
124                                       WinBits nStyle, sal_uInt16 nTypeStyle,
125                                       const ::com::sun::star::uno::Any& );
126 
127                             // Copy assignment is forbidden and not implemented.
128                             ImplBorderWindow (const ImplBorderWindow &);
129                             ImplBorderWindow& operator= (const ImplBorderWindow &);
130 
131 public:
132                             ImplBorderWindow( Window* pParent,
133                                               SystemParentData* pParentData,
134                                               WinBits nStyle = 0,
135                                               sal_uInt16 nTypeStyle = 0 );
136                             ImplBorderWindow( Window* pParent, WinBits nStyle = 0,
137                                               sal_uInt16 nTypeStyle = 0 );
138                             ImplBorderWindow( Window* pParent,
139                                               WinBits nStyle, sal_uInt16 nTypeStyle,
140                                               const ::com::sun::star::uno::Any& );
141                             ~ImplBorderWindow();
142 
143     virtual void            MouseMove( const MouseEvent& rMEvt );
144     virtual void            MouseButtonDown( const MouseEvent& rMEvt );
145     virtual void            Tracking( const TrackingEvent& rTEvt );
146     virtual void            Paint( const Rectangle& rRect );
147     virtual void            Activate();
148     virtual void            Deactivate();
149     virtual void            Resize();
150     virtual void            RequestHelp( const HelpEvent& rHEvt );
151     virtual void            StateChanged( StateChangedType nType );
152     virtual void            DataChanged( const DataChangedEvent& rDCEvt );
153 
154     void                    InitView();
155     void                    UpdateView( sal_Bool bNewView, const Size& rNewOutSize );
156     void                    InvalidateBorder();
157 
158     using Window::Draw;
159     void                    Draw( const Rectangle& rRect, OutputDevice* pDev, const Point& rPos );
160 
161     void                    SetDisplayActive( sal_Bool bActive );
IsDisplayActive() const162     sal_Bool                    IsDisplayActive() const { return mbDisplayActive; }
163     void                    SetTitleType( sal_uInt16 nTitleType, const Size& rSize );
164     void                    SetBorderStyle( sal_uInt16 nStyle );
GetBorderStyle() const165     sal_uInt16                  GetBorderStyle() const { return mnBorderStyle; }
166     void                    SetPin( sal_Bool bPin );
167     void                    SetRollUp( sal_Bool bRollUp, const Size& rSize );
168     void                    SetCloser();
169     void                    SetDockButton( sal_Bool bDockButton );
170     void                    SetHideButton( sal_Bool bHideButton );
171     void                    SetHelpButton( sal_Bool bHelpButton );
172     void                    SetMenuButton( sal_Bool bMenuButton );
173 
174     void                    UpdateMenuHeight();
175     void                    SetMenuBarWindow( Window* pWindow );
176     void                    SetMenuBarMode( sal_Bool bHide );
177 
SetMinOutputSize(long nWidth,long nHeight)178     void                    SetMinOutputSize( long nWidth, long nHeight )
179                                 { mnMinWidth = nWidth; mnMinHeight = nHeight; }
SetMaxOutputSize(long nWidth,long nHeight)180     void                    SetMaxOutputSize( long nWidth, long nHeight )
181                                 { mnMaxWidth = nWidth; mnMaxHeight = nHeight; }
182 
183     void                    GetBorder( sal_Int32& rLeftBorder, sal_Int32& rTopBorder,
184                                        sal_Int32& rRightBorder, sal_Int32& rBottomBorder ) const;
185     long                    CalcTitleWidth() const;
186 
187     Rectangle               GetMenuRect() const;
188 };
189 
190 // =======================================================================
191 
192 // -----------------------
193 // - ImplBorderFrameData -
194 // -----------------------
195 
196 struct ImplBorderFrameData
197 {
198     ImplBorderWindow*       mpBorderWindow;
199     OutputDevice*           mpOutDev;
200     Rectangle               maTitleRect;
201     Rectangle               maPinRect;
202     Rectangle               maCloseRect;
203     Rectangle               maRollRect;
204     Rectangle               maDockRect;
205     Rectangle               maMenuRect;
206     Rectangle               maHideRect;
207     Rectangle               maHelpRect;
208     Point                   maMouseOff;
209     long                    mnWidth;
210     long                    mnHeight;
211     long                    mnTrackX;
212     long                    mnTrackY;
213     long                    mnTrackWidth;
214     long                    mnTrackHeight;
215     sal_Int32               mnLeftBorder;
216     sal_Int32               mnTopBorder;
217     sal_Int32               mnRightBorder;
218     sal_Int32               mnBottomBorder;
219     long                    mnNoTitleTop;
220     long                    mnBorderSize;
221     long                    mnTitleHeight;
222     long                    mnTitleOff;
223     sal_uInt16                  mnHitTest;
224     sal_uInt16                  mnPinState;
225     sal_uInt16                  mnCloseState;
226     sal_uInt16                  mnRollState;
227     sal_uInt16                  mnDockState;
228     sal_uInt16                  mnMenuState;
229     sal_uInt16                  mnHideState;
230     sal_uInt16                  mnHelpState;
231     sal_uInt16                  mnTitleType;
232     sal_Bool                    mbFloatWindow;
233     sal_Bool                    mbDragFull;
234     sal_Bool                    mbTitleClipped;
235 };
236 
237 // =======================================================================
238 
239 // ------------------------
240 // - ImplBorderWindowView -
241 // ------------------------
242 
243 class ImplBorderWindowView
244 {
245 public:
246     virtual                 ~ImplBorderWindowView();
247 
248     virtual sal_Bool            MouseMove( const MouseEvent& rMEvt );
249     virtual sal_Bool            MouseButtonDown( const MouseEvent& rMEvt );
250     virtual sal_Bool            Tracking( const TrackingEvent& rTEvt );
251     virtual String          RequestHelp( const Point& rPos, Rectangle& rHelpRect );
252 
253     virtual void            Init( OutputDevice* pDev, long nWidth, long nHeight ) = 0;
254     virtual void            GetBorder( sal_Int32& rLeftBorder, sal_Int32& rTopBorder,
255                                        sal_Int32& rRightBorder, sal_Int32& rBottomBorder ) const = 0;
256     virtual long            CalcTitleWidth() const = 0;
257     virtual void            DrawWindow( sal_uInt16 nDrawFlags, OutputDevice* pOutDev = NULL, const Point* pOffset = NULL ) = 0;
258     virtual Rectangle       GetMenuRect() const;
259 
260     void                    ImplInitTitle( ImplBorderFrameData* pData );
261     sal_uInt16                  ImplHitTest( ImplBorderFrameData* pData, const Point& rPos );
262     sal_Bool                    ImplMouseMove( ImplBorderFrameData* pData, const MouseEvent& rMEvt );
263     sal_Bool                    ImplMouseButtonDown( ImplBorderFrameData* pData, const MouseEvent& rMEvt );
264     sal_Bool                    ImplTracking( ImplBorderFrameData* pData, const TrackingEvent& rTEvt );
265     String                  ImplRequestHelp( ImplBorderFrameData* pData, const Point& rPos, Rectangle& rHelpRect );
266     long                    ImplCalcTitleWidth( const ImplBorderFrameData* pData ) const;
267 };
268 
269 // =======================================================================
270 
271 // --------------------------
272 // - ImplNoBorderWindowView -
273 // --------------------------
274 
275 class ImplNoBorderWindowView : public ImplBorderWindowView
276 {
277 public:
278                             ImplNoBorderWindowView( ImplBorderWindow* pBorderWindow );
279 
280     virtual void            Init( OutputDevice* pDev, long nWidth, long nHeight );
281     virtual void            GetBorder( sal_Int32& rLeftBorder, sal_Int32& rTopBorder,
282                                        sal_Int32& rRightBorder, sal_Int32& rBottomBorder ) const;
283     virtual long            CalcTitleWidth() const;
284     virtual void            DrawWindow( sal_uInt16 nDrawFlags, OutputDevice* pOutDev, const Point* pOffset );
285 };
286 
287 
288 // =======================================================================
289 
290 // -----------------------------
291 // - ImplSmallBorderWindowView -
292 // -----------------------------
293 
294 class ImplSmallBorderWindowView : public ImplBorderWindowView
295 {
296     ImplBorderWindow*       mpBorderWindow;
297     OutputDevice*           mpOutDev;
298     long                    mnWidth;
299     long                    mnHeight;
300     sal_Int32               mnLeftBorder;
301     sal_Int32               mnTopBorder;
302     sal_Int32               mnRightBorder;
303     sal_Int32               mnBottomBorder;
304     bool                    mbNWFBorder;
305 
306 public:
307                             ImplSmallBorderWindowView( ImplBorderWindow* pBorderWindow );
308 
309     virtual void            Init( OutputDevice* pOutDev, long nWidth, long nHeight );
310     virtual void            GetBorder( sal_Int32& rLeftBorder, sal_Int32& rTopBorder,
311                                        sal_Int32& rRightBorder, sal_Int32& rBottomBorder ) const;
312     virtual long            CalcTitleWidth() const;
313     virtual void            DrawWindow( sal_uInt16 nDrawFlags, OutputDevice* pOutDev, const Point* pOffset );
314 };
315 
316 
317 // =======================================================================
318 
319 // ---------------------------
320 // - ImplStdBorderWindowView -
321 // ---------------------------
322 
323 
324 class ImplStdBorderWindowView : public ImplBorderWindowView
325 {
326     ImplBorderFrameData     maFrameData;
327     VirtualDevice*          mpATitleVirDev;
328     VirtualDevice*          mpDTitleVirDev;
329 
330 public:
331                             ImplStdBorderWindowView( ImplBorderWindow* pBorderWindow );
332                             ~ImplStdBorderWindowView();
333 
334     virtual sal_Bool            MouseMove( const MouseEvent& rMEvt );
335     virtual sal_Bool            MouseButtonDown( const MouseEvent& rMEvt );
336     virtual sal_Bool            Tracking( const TrackingEvent& rTEvt );
337     virtual String          RequestHelp( const Point& rPos, Rectangle& rHelpRect );
338     virtual Rectangle       GetMenuRect() const;
339 
340     virtual void            Init( OutputDevice* pDev, long nWidth, long nHeight );
341     virtual void            GetBorder( sal_Int32& rLeftBorder, sal_Int32& rTopBorder,
342                                        sal_Int32& rRightBorder, sal_Int32& rBottomBorder ) const;
343     virtual long            CalcTitleWidth() const;
344     virtual void            DrawWindow( sal_uInt16 nDrawFlags, OutputDevice* pOutDev, const Point* pOffset );
345 };
346 
347 
348 #endif  // _SV_BRDWIN_HXX
349