xref: /trunk/main/svtools/inc/svtools/headbar.hxx (revision 4d7c9de0)
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 _HEADBAR_HXX
25 #define _HEADBAR_HXX
26 
27 #include "svtools/svtdllapi.h"
28 #include <tools/link.hxx>
29 #include <vcl/window.hxx>
30 
31 /*************************************************************************
32 
33 Beschreibung
34 ============
35 
36 class HeaderBar
37 
38 Diese Klasse dient zur Anzeige einer Ueberschiftszeile. Diese kann Texte,
39 Images oder beides anzeigen. Man kann die Items in der Groesse aendern,
40 verschieben oder anklicken. In vielen Faellen macht es zum Beispiel Sinn,
41 dieses Control mit einer SvTabListBox zu verbinden.
42 
43 --------------------------------------------------------------------------
44 
45 WinBits
46 
47 WB_BORDER			Oben und unten wird ein Border gezeichnet
48 WB_BOTTOMBORDER 	Unten wird ein Border gezeichnet
49 WB_BUTTONSTYLE		Die Items sehen aus wie Buttons, ansonsten sind sie flach
50 WB_3DLOOK			3D-Darstellung
51 WB_DRAG 			Items koennen verschoben werden
52 WB_STDHEADERBAR 	WB_BUTTONSTYLE | WB_BOTTOMBORDER
53 
54 --------------------------------------------------------------------------
55 
56 ItemBits
57 
58 HIB_LEFT			Inhalt wird im Item linksbuendig ausgegeben
59 HIB_CENTER			Inhalt wird im Item zentriert ausgegeben
60 HIB_RIGHT			Inhalt wird im Item rechtsbuendig ausgegeben
61 HIB_TOP 			Inhalt wird im Item an der oberen Kante ausgegeben
62 HIB_VCENTER 		Inhalt wird im Item vertikal zentiert ausgegeben
63 HIB_BOTTOM			Inhalt wird im Item an der unteren Kante ausgegeben
64 HIB_LEFTIMAGE		Bei Text und Image, wird Image links vom Text ausgegeben
65 HIB_RIGHTIMAGE		Bei Text und Image, wird Image rechts vom Text ausgegeben
66 HIB_FIXED			Item laesst sich nicht in der Groesse aendern
67 HIB_FIXEDPOS		Item laesst sich nicht verschieben
68 HIB_CLICKABLE		Item laesst sich anklicken
69 					(Select-Handler wird erst bei MouseButtonUp gerufen)
70 HIB_FLAT			Item wird flach dargestellt, auch wenn WB_BUTTONSTYLE gesetzt ist
71 HIB_DOWNARROW		Es wird ein Pfeil nach unter hinter dem Text ausgegeben,
72 					welcher zum Beispiel angezeigt werden sollte, wenn nach
73 					diesem Item eine dazugehoerende Liste absteigend sortiert
74 					ist. Der Status des Pfeils kann mit SetItemBits()
75 					gesetzt/zurueckgesetzt werden.
76 HIB_UPARROW 		Es wird ein Pfeil nach oben hinter dem Text ausgegeben,
77 					welcher zum Beispiel angezeigt werden sollte, wenn nach
78 					diesem Item eine dazugehoerende Liste aufsteigend sortiert
79 					ist.Der Status des Pfeils kann mit SetItemBits()
80 					gesetzt/zurueckgesetzt werden.
81 HIB_USERDRAW		Zu diesem Item wird auch der UserDraw-Handler gerufen.
82 HIB_STDSTYLE		(HIB_LEFT | HIB_LEFTIMAGE | HIB_VCENTER | HIB_CLICKABLE)
83 
84 --------------------------------------------------------------------------
85 
86 Handler
87 
88 Select()			Wird gerufen, wenn Item angeklickt wird. Wenn
89 					HIB_CLICKABLE beim Item gesetzt ist und nicht HIB_FLAT,
90 					wird der Handler erst im MouseButtonUp-Handler gerufen,
91 					wenn die Maus ueber dem Item losgelassen wurde. Dann
92 					verhaellt sich der Select-Handler wie bei einem
93 					ToolBox-Button.
94 DoubleClick()		Dieser Handler wird gerufen, wenn ein Item
95 					doppelt geklickt wird. Ob das Item oder der
96 					Trenner angeklickt wurden, kann mit IsItemMode()
97 					abgefragt werden. Wenn ein Trenner doppelt angeklickt
98 					wird, sollte normalerweise die optimale Spaltenbreite
99 					berechnet werden und diese gesetzt werden.
100 StartDrag() 		Dieser Handler wird gerufen, wenn Draggen gestartet
101 					wird, bzw. wenn ein Item angeklickt wurde.
102 					In diesem Handler sollte spaetestens mit SetDragSize()
103 					die Groesse der Size-Linie gesetzt werden, wenn
104 					IsItemMode() sal_False zurueckliefert.
105 Drag()				Dieser Handler wird gerufen, wenn gedraggt wird. Wenn
106 					mit SetDragSize() keine Groesse gesetzt wird, kann
107 					dieser Handler dafuer benutzt werden, um die
108 					Linie im angrenzenden Fenster selber zu zeichnen. Mit
109 					GetDragPos() kann die aktuelle Drag-Position abgefragt
110 					werden. Mit IsItemMode() sollte in diesem Fall
111 					abgefragt werden, ob auch ein Trenner gedraggt wird.
112 EndDrag()			Dieser Handler wird gerufen, wenn ein Drag-Vorgang
113 					beendet wurde. Wenn im EndDrag-Handler GetCurItemId()
114 					0 zurueckliefert, wurde der Drag-Vorgang abgebrochen.
115 					Wenn dies nicht der Fall ist und IsItemMode() sal_False
116 					zurueckliefert, sollte von dem gedraggten Item
117 					die neue Groesse mit GetItemSize() abgefragt werden
118 					und entsprechend im dazugehoerigem Control uebernommen
119 					werden. Wenn IsItemMode() sal_True, GetCurItemId() eine Id
120 					und IsItemDrag() sal_True zurueckliefert, wurde dieses
121 					Item verschoben. Es sollte dann mit GetItemPos() die
122 					neue Position abgefragt werden und auch die Daten
123 					im dazugehoerigem Control angepasst werden. Ansonsten
124 					koennte auch mit GetItemDragPos() die Position abgefragt
125 					werden, an welche Stelle das Item verschoben wurde.
126 
127 
128 Weitere Methoden, die fuer die Handler wichtig sind.
129 
130 GetCurItemId()		Liefert die Id vom Item zurueck, fuer welches gerade
131 					der Handler gerufen wurde. Liefert nur eine gueltige
132 					Id in den Handlern Select(), DoubleClick(), StartDrag(),
133 					Drag() und EndDrag(). Im EndDrag-Handler leifert
134 					diese Methode die Id vom gedraggten Item zurueck oder
135 					0, wenn der Drag-Vorgang abgebrochen wurde.
136 GetItemDragPos()	Liefert die Position zurueck, an der ein Item verschoben
137 					wird bzw. wurde. HEADERBAR_ITEM_NOTFOUND wird
138 					zurueckgeliefert, wenn der Vorgang abgebrochen wurde
139 					oder wenn kein ItemDrag aktiv ist.
140 IsItemMode()		Mit dieser Methode kann abgefragt werden, ob fuer ein
141 					Item oder einen Trenner der Handler gerufen wurde.
142 					sal_True	- Handler wurde fuer das Item gerufen
143 					sal_False	- Handler wurde fuer den Trenner gerufen
144 IsItemDrag()		Mit dieser Methode kann abgefragt werden, ob ein
145 					Item gedragt oder selektiert wurde.
146 					sal_True	- Item wird verschoben
147 					sal_False	- Item wird selektiert
148 SetDragSize()		Mit dieser Methode wird gesetzt, wir gross der
149 					Trennstrich sein soll, der vom Control gemalt wird.
150 					Dies sollte so gross sein, wie das angrenzende Fenster
151 					hoch ist. Die Hoehe vom HeaderBar wird automatisch
152 					dazugerechnet.
153 
154 --------------------------------------------------------------------------
155 
156 Weitere Methoden
157 
158 SetOffset() 			Mit dieser Methode wird der Offset gesetzt, ab dem
159 						die Items ausgegeben werden. Dies wird benoetigt,
160 						wenn das dazugehoerige Fenster gescrollt wird.
161 CalcWindowSizePixel()	Mit dieser Methode kann man die Hoehe des Fensters
162 						berechnen, damit der Inhalt der Items ausgegeben
163 						werden kann.
164 
165 --------------------------------------------------------------------------
166 
167 Tips und Tricks:
168 
169 1) KontextMenu
170 Wenn ein kontextsensitives PopupMenu anzeigt werden soll, muss der
171 Command-Handler ueberlagert werden. Mit GetItemId() und bei
172 Uebergabe der Mausposition kann ermittelt werden, ob der Mausclick
173 ueber einem bzw. ueber welchem Item durchgefuehrt wurde.
174 
175 2) Letztes Item
176 Wenn man ButtonStyle gesetzt hat, sieht es besser aus, wenn man am
177 Ende noch ein leeres Item setzt, was den restlichen Platz einnimmt.
178 Dazu fuegt man ein Item mit einem leeren String ein und uebergibt als
179 Groesse HEADERBAR_FULLSIZE. Bei diesem Item sollte man dann auch
180 nicht HIB_CLICKABLE setzen und dafuer HIB_FIXEDPOS.
181 
182 *************************************************************************/
183 
184 class Accelerator;
185 class ImplHeadItemList;
186 
187 // -----------
188 // - WinBits -
189 // -----------
190 
191 #define WB_BOTTOMBORDER 		((WinBits)0x0400)
192 #define WB_BUTTONSTYLE			((WinBits)0x0800)
193 #define WB_STDHEADERBAR 		(WB_BUTTONSTYLE | WB_BOTTOMBORDER)
194 
195 // ---------------------
196 // - HeaderBarItemBits -
197 // ---------------------
198 
199 typedef sal_uInt16 HeaderBarItemBits;
200 
201 // ----------------------------
202 // - Bits fuer HeaderBarItems -
203 // ----------------------------
204 
205 #define HIB_LEFT				((HeaderBarItemBits)0x0001)
206 #define HIB_CENTER				((HeaderBarItemBits)0x0002)
207 #define HIB_RIGHT				((HeaderBarItemBits)0x0004)
208 #define HIB_TOP 				((HeaderBarItemBits)0x0008)
209 #define HIB_VCENTER 			((HeaderBarItemBits)0x0010)
210 #define HIB_BOTTOM				((HeaderBarItemBits)0x0020)
211 #define HIB_LEFTIMAGE			((HeaderBarItemBits)0x0040)
212 #define HIB_RIGHTIMAGE			((HeaderBarItemBits)0x0080)
213 #define HIB_FIXED				((HeaderBarItemBits)0x0100)
214 #define HIB_FIXEDPOS			((HeaderBarItemBits)0x0200)
215 #define HIB_CLICKABLE			((HeaderBarItemBits)0x0400)
216 #define HIB_FLAT				((HeaderBarItemBits)0x0800)
217 #define HIB_DOWNARROW			((HeaderBarItemBits)0x1000)
218 #define HIB_UPARROW 			((HeaderBarItemBits)0x2000)
219 #define HIB_USERDRAW			((HeaderBarItemBits)0x4000)
220 #define HIB_STDSTYLE			(HIB_LEFT | HIB_LEFTIMAGE | HIB_VCENTER | HIB_CLICKABLE)
221 
222 // -------------------
223 // - HeaderBar-Types -
224 // -------------------
225 
226 #define HEADERBAR_APPEND			((sal_uInt16)0xFFFF)
227 #define HEADERBAR_ITEM_NOTFOUND 	((sal_uInt16)0xFFFF)
228 #define HEADERBAR_FULLSIZE			((long)1000000000)
229 
230 #define HEADERBAR_TEXTOFF			2
231 
232 // -------------
233 // - HeaderBar -
234 // -------------
235 
236 class VCLXHeaderBar;
237 class SVT_DLLPUBLIC HeaderBar : public Window
238 {
239 private:
240 	ImplHeadItemList*	mpItemList;
241 	long				mnBorderOff1;
242 	long				mnBorderOff2;
243 	long				mnOffset;
244 	long				mnDX;
245 	long				mnDY;
246 	long				mnDragSize;
247 	long				mnStartPos;
248 	long				mnDragPos;
249 	long				mnMouseOff;
250 	sal_uInt16				mnCurItemId;
251 	sal_uInt16				mnItemDragPos;
252 	sal_Bool				mbDragable;
253 	sal_Bool				mbDrag;
254 	sal_Bool				mbItemDrag;
255 	sal_Bool				mbOutDrag;
256 	sal_Bool				mbButtonStyle;
257 	sal_Bool				mbItemMode;
258 	Link				maStartDragHdl;
259 	Link				maDragHdl;
260 	Link				maEndDragHdl;
261 	Link				maSelectHdl;
262 	Link				maDoubleClickHdl;
263 	Link				maCreateAccessibleHdl;
264 
265 	VCLXHeaderBar*		m_pVCLXHeaderBar;
266 
267 	::com::sun::star::uno::Reference<
268 		::com::sun::star::accessibility::XAccessible >
269 						mxAccessible;
270 
271 #ifdef _SV_HEADBAR_CXX
272     using Window::ImplInit;
273 	SVT_DLLPRIVATE void				ImplInit( WinBits nWinStyle );
274 	SVT_DLLPRIVATE void				ImplInitSettings( sal_Bool bFont, sal_Bool bForeground, sal_Bool bBackground );
275 	SVT_DLLPRIVATE long				ImplGetItemPos( sal_uInt16 nPos ) const;
276 	SVT_DLLPRIVATE Rectangle			ImplGetItemRect( sal_uInt16 nPos ) const;
277     using Window::ImplHitTest;
278 	SVT_DLLPRIVATE sal_uInt16				ImplHitTest( const Point& rPos, long& nMouseOff, sal_uInt16& nPos ) const;
279 	SVT_DLLPRIVATE void				ImplInvertDrag( sal_uInt16 nStartPos, sal_uInt16 nEndPos );
280 	SVT_DLLPRIVATE void				ImplDrawItem( OutputDevice* pDev,
281 									  sal_uInt16 nPos, sal_Bool bHigh, sal_Bool bDrag,
282 									  const Rectangle& rItemRect,
283 									  const Rectangle* pRect,
284 									  sal_uLong nFlags );
285 	SVT_DLLPRIVATE void				ImplDrawItem( sal_uInt16 nPos, sal_Bool bHigh = sal_False,
286 									  sal_Bool bDrag = sal_False,
287 									  const Rectangle* pRect = NULL );
288 	SVT_DLLPRIVATE void				ImplUpdate( sal_uInt16 nPos,
289 									sal_Bool bEnd = sal_False, sal_Bool bDirect = sal_False );
290 	SVT_DLLPRIVATE void				ImplStartDrag( const Point& rPos, sal_Bool bCommand );
291 	SVT_DLLPRIVATE void				ImplDrag( const Point& rPos );
292 	SVT_DLLPRIVATE void				ImplEndDrag( sal_Bool bCancel );
293 #endif
294 
295 public:
296 						HeaderBar( Window* pParent, WinBits nWinBits = WB_STDHEADERBAR );
297 						HeaderBar( Window* pParent, const ResId& rResId );
298 						~HeaderBar();
299 
300 	virtual void		MouseButtonDown( const MouseEvent& rMEvt );
301 	virtual void		MouseMove( const MouseEvent& rMEvt );
302 	virtual void		Tracking( const TrackingEvent& rTEvt );
303 	virtual void		Paint( const Rectangle& rRect );
304 	virtual void		Draw( OutputDevice* pDev, const Point& rPos, const Size& rSize, sal_uLong nFlags );
305 	virtual void		Resize();
306 	virtual void		Command( const CommandEvent& rCEvt );
307 	virtual void		RequestHelp( const HelpEvent& rHEvt );
308 	virtual void		StateChanged( StateChangedType nStateChange );
309 	virtual void		DataChanged( const DataChangedEvent& rDCEvt );
310 
311 	virtual void		UserDraw( const UserDrawEvent& rUDEvt );
312 	virtual void		StartDrag();
313 	virtual void		Drag();
314 	virtual void		EndDrag();
315 	virtual void		Select();
316 	virtual void		DoubleClick();
317 
318 	void				InsertItem( sal_uInt16 nItemId, const Image& rImage,
319 									long nSize, HeaderBarItemBits nBits = HIB_STDSTYLE,
320 									sal_uInt16 nPos = HEADERBAR_APPEND );
321 	void				InsertItem( sal_uInt16 nItemId, const XubString& rText,
322 									long nSize, HeaderBarItemBits nBits = HIB_STDSTYLE,
323 									sal_uInt16 nPos = HEADERBAR_APPEND );
324 	void				InsertItem( sal_uInt16 nItemId,
325 									const Image& rImage, const XubString& rText,
326 									long nSize, HeaderBarItemBits nBits = HIB_STDSTYLE,
327 									sal_uInt16 nPos = HEADERBAR_APPEND );
328 	void				RemoveItem( sal_uInt16 nItemId );
329 	void				MoveItem( sal_uInt16 nItemId, sal_uInt16 nNewPos );
330 	void				Clear();
331 
332 	void				SetOffset( long nNewOffset = 0 );
GetOffset() const333 	long				GetOffset() const { return mnOffset; }
SetDragSize(long nNewSize=0)334 	inline void			SetDragSize( long nNewSize = 0 ) { mnDragSize = nNewSize; }
GetDragSize() const335 	long				GetDragSize() const { return mnDragSize; }
336 
337 	sal_uInt16				GetItemCount() const;
338 	sal_uInt16				GetItemPos( sal_uInt16 nItemId ) const;
339 	sal_uInt16				GetItemId( sal_uInt16 nPos ) const;
340 	sal_uInt16				GetItemId( const Point& rPos ) const;
341 	Rectangle			GetItemRect( sal_uInt16 nItemId ) const;
GetCurItemId() const342 	sal_uInt16				GetCurItemId() const { return mnCurItemId; }
GetDragPos() const343 	long				GetDragPos() const { return mnDragPos; }
GetItemDragPos() const344 	sal_uInt16				GetItemDragPos() const { return mnItemDragPos; }
IsItemMode() const345 	sal_Bool				IsItemMode() const { return mbItemMode; }
IsItemDrag() const346 	sal_Bool				IsItemDrag() const { return mbItemDrag; }
347 
348 	void				SetItemSize( sal_uInt16 nItemId, long nNewSize );
349 	long				GetItemSize( sal_uInt16 nItemId ) const;
350 	void				SetItemBits( sal_uInt16 nItemId, HeaderBarItemBits nNewBits );
351 	HeaderBarItemBits	GetItemBits( sal_uInt16 nItemId ) const;
352 	void				SetItemData( sal_uInt16 nItemId, void* pNewData );
353 	void*				GetItemData( sal_uInt16 nItemId ) const;
354 
355 	void				SetItemImage( sal_uInt16 nItemId, const Image& rImage );
356 	Image				GetItemImage( sal_uInt16 nItemId ) const;
357 	void				SetItemText( sal_uInt16 nItemId, const XubString& rText );
358 	XubString			GetItemText( sal_uInt16 nItemId ) const;
359 
360 	void				SetHelpText( sal_uInt16 nItemId, const XubString& rText );
361 	XubString			GetHelpText( sal_uInt16 nItemId ) const;
362 	void				SetHelpId( sal_uInt16 nItemId, const rtl::OString& nHelpId );
363 	rtl::OString        GetHelpId( sal_uInt16 nItemId ) const;
364 
365 	Size				CalcWindowSizePixel() const;
366 
SetHelpText(const String & rText)367 	inline void				SetHelpText( const String& rText )		{ Window::SetHelpText( rText ); }
GetHelpText() const368 	inline const String&	GetHelpText() const						{ return Window::GetHelpText(); }
SetHelpId(const rtl::OString & rId)369 	inline void				SetHelpId( const rtl::OString& rId )	{ Window::SetHelpId( rId ); }
GetHelpId() const370 	inline const rtl::OString& GetHelpId() const 					{ return Window::GetHelpId(); }
371 
SetStartDragHdl(const Link & rLink)372 	inline void		  	SetStartDragHdl( const Link& rLink )		{ maStartDragHdl = rLink; }
GetStartDragHdl() const373 	inline const Link&	GetStartDragHdl() const						{ return maStartDragHdl; }
SetDragHdl(const Link & rLink)374 	inline void		  	SetDragHdl( const Link& rLink )				{ maDragHdl = rLink; }
GetDragHdl() const375 	inline const Link&	GetDragHdl() const							{ return maDragHdl; }
SetEndDragHdl(const Link & rLink)376 	inline void		  	SetEndDragHdl( const Link& rLink )			{ maEndDragHdl = rLink; }
GetEndDragHdl() const377 	inline const Link&	GetEndDragHdl() const						{ return maEndDragHdl; }
SetSelectHdl(const Link & rLink)378 	inline void		  	SetSelectHdl( const Link& rLink )			{ maSelectHdl = rLink; }
GetSelectHdl() const379 	inline const Link&	GetSelectHdl() const						{ return maSelectHdl; }
SetDoubleClickHdl(const Link & rLink)380 	inline void		  	SetDoubleClickHdl( const Link& rLink )		{ maDoubleClickHdl = rLink; }
GetDoubleClickHdl() const381 	inline const Link&	GetDoubleClickHdl() const					{ return maDoubleClickHdl; }
SetCreateAccessibleHdl(const Link & rLink)382 	inline void		  	SetCreateAccessibleHdl( const Link& rLink )	{ maCreateAccessibleHdl = rLink; }
GetCreateAccessibleHdl() const383 	inline const Link&	GetCreateAccessibleHdl() const				{ return maCreateAccessibleHdl; }
384 
IsDragable() const385 	inline sal_Bool			IsDragable() const							{ return mbDragable; }
386 
387 	/** Creates and returns the accessible object of the header bar. */
388     virtual ::com::sun::star::uno::Reference<
389 		::com::sun::star::accessibility::XAccessible >	CreateAccessible();
390 	void SetAccessible( ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > );
391 	virtual ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindowPeer > GetComponentInterface( sal_Bool bCreate );
392 
393 };
394 
395 #endif	// _HEADBAR_HXX
396 
397