xref: /trunk/main/vcl/inc/vcl/splitwin.hxx (revision 0d63794c)
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_SPLITWIN_HXX
25 #define _SV_SPLITWIN_HXX
26 
27 #include <vcl/sv.h>
28 #include <vcl/dllapi.h>
29 #include <vcl/dockwin.hxx>
30 
31 class Wallpaper;
32 struct ImplSplitSet;
33 
34 // -----------------------
35 // - SplitWindowItemBits -
36 // -----------------------
37 
38 typedef sal_uInt16 SplitWindowItemBits;
39 
40 // -------------------------------
41 // - Bits fuer SplitWindow-Items -
42 // -------------------------------
43 
44 #define SWIB_FIXED					((SplitWindowItemBits)0x0001)
45 #define SWIB_RELATIVESIZE			((SplitWindowItemBits)0x0002)
46 #define SWIB_PERCENTSIZE			((SplitWindowItemBits)0x0004)
47 #define SWIB_COLSET 				((SplitWindowItemBits)0x0008)
48 #define SWIB_INVISIBLE				((SplitWindowItemBits)0x0010)
49 
50 // ---------------------
51 // - SplitWindow-Types -
52 // ---------------------
53 
54 #define SPLITWINDOW_APPEND			((sal_uInt16)0xFFFF)
55 #define SPLITWINDOW_ITEM_NOTFOUND	((sal_uInt16)0xFFFF)
56 
57 // ---------------
58 // - SplitWindow -
59 // ---------------
60 
61 class VCL_DLLPUBLIC SplitWindow : public DockingWindow
62 {
63 private:
64 	ImplSplitSet*		mpMainSet;
65 	ImplSplitSet*		mpBaseSet;
66 	ImplSplitSet*		mpSplitSet;
67 	long*				mpLastSizes;
68 	Rectangle			maDragRect;
69 	long				mnDX;
70 	long				mnDY;
71 	long				mnLeftBorder;
72 	long				mnTopBorder;
73 	long				mnRightBorder;
74 	long				mnBottomBorder;
75 	long				mnMaxSize;
76 	long				mnMouseOff;
77 	long				mnMStartPos;
78 	long				mnMSplitPos;
79 	WinBits 			mnWinStyle;
80 	WindowAlign 		meAlign;
81 	sal_uInt16				mnSplitTest;
82 	sal_uInt16				mnSplitPos;
83 	sal_uInt16				mnMouseModifier;
84 	sal_Bool				mbDragFull:1,
85 						mbHorz:1,
86 						mbBottomRight:1,
87 						mbCalc:1,
88 						mbRecalc:1,
89 						mbInvalidate:1,
90 						mbSizeable:1,
91 						mbBorder:1,
92 						mbAutoHide:1,
93 						mbFadeIn:1,
94 						mbFadeOut:1,
95 						mbAutoHideIn:1,
96 						mbAutoHideDown:1,
97 						mbFadeInDown:1,
98 						mbFadeOutDown:1,
99 						mbAutoHidePressed:1,
100 						mbFadeInPressed:1,
101 						mbFadeOutPressed:1,
102 						mbFadeNoButtonMode:1,
103 						mbNoAlign:1;
104 	Link				maStartSplitHdl;
105 	Link				maSplitHdl;
106 	Link				maSplitResizeHdl;
107 	Link				maAutoHideHdl;
108 	Link				maFadeInHdl;
109 	Link				maFadeOutHdl;
110 
111     using Window::ImplInit;
112 	SAL_DLLPRIVATE void	ImplInit( Window* pParent, WinBits nStyle );
113 	SAL_DLLPRIVATE void	ImplInitSettings();
114 	SAL_DLLPRIVATE void	ImplCalcLayout();
115 	SAL_DLLPRIVATE void	ImplUpdate();
116 	SAL_DLLPRIVATE void	ImplUpdateSet( ImplSplitSet* pSet );
117 	SAL_DLLPRIVATE void	ImplSetWindowSize( long nDelta );
118 	SAL_DLLPRIVATE void	ImplSplitMousePos( Point& rMousePos );
119 	SAL_DLLPRIVATE void	ImplGetButtonRect( Rectangle& rRect, long nEx, sal_Bool bTest ) const;
120 	SAL_DLLPRIVATE void	ImplGetAutoHideRect( Rectangle& rRect, sal_Bool bTest = sal_False ) const;
121 	SAL_DLLPRIVATE void	ImplGetFadeInRect( Rectangle& rRect, sal_Bool bTest = sal_False ) const;
122 	SAL_DLLPRIVATE void	ImplGetFadeOutRect( Rectangle& rRect, sal_Bool bTest = sal_False ) const;
123 	SAL_DLLPRIVATE void	ImplDrawButtonRect( const Rectangle& rRect, long nSize );
124 	SAL_DLLPRIVATE void	ImplDrawAutoHide( sal_Bool bInPaint );
125 	SAL_DLLPRIVATE void	ImplDrawFadeIn( sal_Bool bInPaint );
126 	SAL_DLLPRIVATE void	ImplDrawFadeOut( sal_Bool bInPaint );
127 	SAL_DLLPRIVATE void	ImplNewAlign();
128     SAL_DLLPRIVATE void ImplDrawGrip( const Rectangle& rRect, sal_Bool bHorz, sal_Bool bLeft );
129     SAL_DLLPRIVATE void ImplDrawFadeArrow( const Point& rPt, sal_Bool bHorz, sal_Bool bLeft );
130     SAL_DLLPRIVATE void ImplStartSplit( const MouseEvent& rMEvt );
131 
132     static SAL_DLLPRIVATE void ImplDrawBorder( SplitWindow* pWin );
133     static SAL_DLLPRIVATE void ImplDrawBorderLine( SplitWindow* pWin );
134     static SAL_DLLPRIVATE void ImplCalcSet2( SplitWindow* pWindow, ImplSplitSet* pSet, sal_Bool bHide,
135 						                     sal_Bool bRows, sal_Bool bDown = sal_True );
136     static SAL_DLLPRIVATE void ImplDrawBack( SplitWindow* pWindow, ImplSplitSet* pSet );
137     static SAL_DLLPRIVATE void ImplDrawBack( SplitWindow* pWindow, const Rectangle& rRect,
138                                              const Wallpaper* pWall, const Bitmap* pBitmap );
139     static SAL_DLLPRIVATE sal_uInt16 ImplTestSplit( ImplSplitSet* pSet, const Point& rPos,
140                                                 long& rMouseOff, ImplSplitSet** ppFoundSet, sal_uInt16& rFoundPos,
141                                                 sal_Bool bRows, sal_Bool bDown = sal_True );
142     static SAL_DLLPRIVATE sal_uInt16 ImplTestSplit( SplitWindow* pWindow, const Point& rPos,
143                                                 long& rMouseOff, ImplSplitSet** ppFoundSet, sal_uInt16& rFoundPos );
144     static SAL_DLLPRIVATE void ImplDrawSplitTracking( SplitWindow* pThis, const Point& rPos );
145 
146     // Copy assignment is forbidden and not implemented.
147 	SAL_DLLPRIVATE      SplitWindow (const SplitWindow &);
148 	SAL_DLLPRIVATE      SplitWindow & operator= (const SplitWindow &);
149 public:
150 						SplitWindow( Window* pParent, WinBits nStyle = 0 );
151 						SplitWindow( Window* pParent, const ResId& rResId );
152 						~SplitWindow();
153 
154 	virtual void		StartSplit();
155 	virtual void		Split();
156 	virtual void		SplitResize();
157 	virtual void		AutoHide();
158 	virtual void		FadeIn();
159 	virtual void		FadeOut();
160 
161 	virtual void		MouseButtonDown( const MouseEvent& rMEvt );
162 	virtual void		MouseMove( const MouseEvent& rMEvt );
163 	virtual void		Tracking( const TrackingEvent& rTEvt );
164 	virtual void		Paint( const Rectangle& rRect );
165 	virtual void		Move();
166 	virtual void		Resize();
167 	virtual void		RequestHelp( const HelpEvent& rHEvt );
168 	virtual void		StateChanged( StateChangedType nType );
169 	virtual void		DataChanged( const DataChangedEvent& rDCEvt );
170     virtual long        PreNotify( NotifyEvent& rNEvt );
171 
172 	void				InsertItem( sal_uInt16 nId, Window* pWindow, long nSize,
173 									sal_uInt16 nPos = SPLITWINDOW_APPEND, sal_uInt16 nSetId = 0,
174 									SplitWindowItemBits nBits = 0 );
175 	void				InsertItem( sal_uInt16 nId, long nSize,
176 									sal_uInt16 nPos = SPLITWINDOW_APPEND, sal_uInt16 nSetId = 0,
177 									SplitWindowItemBits nBits = 0 );
178 	void				MoveItem( sal_uInt16 nId, sal_uInt16 nNewPos, sal_uInt16 nNewSetId = 0 );
179 	void				RemoveItem( sal_uInt16 nId, sal_Bool bHide = sal_True );
180 	void				Clear();
181 
182 	void				SetBaseSet( sal_uInt16 nSetId = 0 );
183 	sal_uInt16				GetBaseSet() const;
184 
185 	void				SetSplitSize( sal_uInt16 nSetId, long nSplitSize,
186 									  sal_Bool bWithChilds = sal_False );
187 	long				GetSplitSize( sal_uInt16 nSetId ) const;
188 	void				SetItemBackground( sal_uInt16 nSetId );
189 	void				SetItemBackground( sal_uInt16 nSetId, const Wallpaper& rWallpaper );
190 	Wallpaper			GetItemBackground( sal_uInt16 nSetId ) const;
191 	sal_Bool				IsItemBackground( sal_uInt16 nSetId ) const;
192 	void				SetItemBitmap( sal_uInt16 nSetId, const Bitmap& rBitmap );
193 	Bitmap				GetItemBitmap( sal_uInt16 nSetId ) const;
194 
195 	void				SplitItem( sal_uInt16 nId, long nNewSize,
196 								   sal_Bool bPropSmall = sal_False,
197 								   sal_Bool bPropGreat = sal_False );
198 	void				SetItemSize( sal_uInt16 nId, long nNewSize );
199 	long				GetItemSize( sal_uInt16 nId ) const;
200     /** Set a range that limits the (variable part of the) size with an
201         upper and a lower bound (both are valid values themselves.)
202         @param nId
203             Id of the item for which the size limits are set.
204         @param aRange
205             Values of -1 define missing bounds, thus setting a range (-1,-1)
206             (the default) removes the size limitiation.
207     */
208     void                SetItemSizeRange (sal_uInt16 nId, const Range aRange);
209     /** Return the current size limits for the specified item.
210     */
211     Range               GetItemSizeRange (sal_uInt16 nId) const;
212 	long				GetItemSize( sal_uInt16 nId, SplitWindowItemBits nBits ) const;
213 	void				SetItemBits( sal_uInt16 nId, SplitWindowItemBits nNewBits );
214 	SplitWindowItemBits GetItemBits( sal_uInt16 nId ) const;
215 	Window* 			GetItemWindow( sal_uInt16 nId ) const;
216 	sal_uInt16				GetSet( sal_uInt16 nId ) const;
217 	sal_Bool				GetSet( sal_uInt16 nId, sal_uInt16& rSetId, sal_uInt16& rPos ) const;
218 	sal_uInt16				GetItemId( Window* pWindow ) const;
219 	sal_uInt16				GetItemId( const Point& rPos ) const;
220 	sal_uInt16				GetItemPos( sal_uInt16 nId, sal_uInt16 nSetId = 0 ) const;
221 	sal_uInt16				GetItemId( sal_uInt16 nPos, sal_uInt16 nSetId = 0 ) const;
222 	sal_uInt16				GetItemCount( sal_uInt16 nSetId = 0 ) const;
223 	sal_Bool				IsItemValid( sal_uInt16 nId ) const;
224 
225 	void				SetNoAlign( sal_Bool bNoAlign );
IsNoAlign() const226 	sal_Bool				IsNoAlign() const { return mbNoAlign; }
227 	void				SetAlign( WindowAlign eNewAlign = WINDOWALIGN_TOP );
GetAlign() const228 	WindowAlign 		GetAlign() const { return meAlign; }
IsHorizontal() const229 	sal_Bool				IsHorizontal() const { return mbHorz; }
230 
IsSplitting() const231 	sal_Bool				IsSplitting() const { return IsTracking(); }
232 
SetMaxSizePixel(long nNewMaxSize)233 	void				SetMaxSizePixel( long nNewMaxSize ) { mnMaxSize = nNewMaxSize; }
GetMaxSizePixel() const234 	long				GetMaxSizePixel() const { return mnMaxSize; }
235 
236 	static Size 		CalcWindowSizePixel( const Size& rSize,
237 											 WindowAlign eAlign,
238 											 WinBits nWinStyle,
239 											 sal_Bool bExtra = sal_False );
CalcWindowSizePixel(const Size & rSize)240 	Size				CalcWindowSizePixel( const Size& rSize )
241 							{ return CalcWindowSizePixel( rSize, meAlign, mnWinStyle, (mbAutoHide || mbFadeOut) ); }
242 
243 	Size				CalcLayoutSizePixel( const Size& aNewSize );
244 
245 	void				ShowAutoHideButton( sal_Bool bShow = sal_True );
IsAutoHideButtonVisible() const246 	sal_Bool				IsAutoHideButtonVisible() const { return mbAutoHide; }
247 	void				ShowFadeInHideButton( sal_Bool bShow = sal_True );
ShowFadeInButton(sal_Bool bShow=sal_True)248 	void				ShowFadeInButton( sal_Bool bShow = sal_True ) { ShowFadeInHideButton( bShow ); }
IsFadeInButtonVisible() const249 	sal_Bool				IsFadeInButtonVisible() const { return mbFadeIn; }
250 	void				ShowFadeOutButton( sal_Bool bShow = sal_True );
IsFadeOutButtonVisible() const251 	sal_Bool				IsFadeOutButtonVisible() const { return mbFadeOut; }
252 	long				GetFadeInSize() const;
IsFadeNoButtonMode() const253 	sal_Bool				IsFadeNoButtonMode() const { return mbFadeNoButtonMode; }
254 
255 	void				SetAutoHideState( sal_Bool bAutoHide );
GetAutoHideState() const256 	sal_Bool				GetAutoHideState() const { return mbAutoHideIn; }
257 
258 	Rectangle			GetAutoHideRect() const;
259 	Rectangle			GetFadeInRect() const;
260 	Rectangle			GetFadeOutRect() const;
261 
SetStartSplitHdl(const Link & rLink)262 	void				SetStartSplitHdl( const Link& rLink ) { maStartSplitHdl = rLink; }
GetStartSplitHdl() const263 	const Link& 		GetStartSplitHdl() const { return maStartSplitHdl; }
SetSplitHdl(const Link & rLink)264 	void				SetSplitHdl( const Link& rLink ) { maSplitHdl = rLink; }
GetSplitHdl() const265 	const Link& 		GetSplitHdl() const { return maSplitHdl; }
SetSplitResizeHdl(const Link & rLink)266 	void				SetSplitResizeHdl( const Link& rLink ) { maSplitResizeHdl = rLink; }
GetSplitResizeHdl() const267 	const Link& 		GetSplitResizeHdl() const { return maSplitResizeHdl; }
SetAutoHideHdl(const Link & rLink)268 	void				SetAutoHideHdl( const Link& rLink ) { maAutoHideHdl = rLink; }
GetAutoHideHdl() const269 	const Link& 		GetAutoHideHdl() const { return maAutoHideHdl; }
SetFadeInHdl(const Link & rLink)270 	void				SetFadeInHdl( const Link& rLink ) { maFadeInHdl = rLink; }
GetFadeInHdl() const271 	const Link& 		GetFadeInHdl() const { return maFadeInHdl; }
SetFadeOutHdl(const Link & rLink)272 	void				SetFadeOutHdl( const Link& rLink ) { maFadeOutHdl = rLink; }
GetFadeOutHdl() const273 	const Link& 		GetFadeOutHdl() const { return maFadeOutHdl; }
274 };
275 
276 #endif	// _SV_SPLITWIN_HXX
277