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