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