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