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 INCLUDED_SVTOOLS_HEADBAR_HXX
21 : #define INCLUDED_SVTOOLS_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 VCLXHeaderBar;
235 :
236 : class SVT_DLLPUBLIC HeaderBar : public vcl::Window
237 : {
238 : private:
239 : ImplHeadItemList* mpItemList;
240 : long mnBorderOff1;
241 : long mnBorderOff2;
242 : long mnOffset;
243 : long mnDX;
244 : long mnDY;
245 : long mnDragSize;
246 : long mnStartPos;
247 : long mnDragPos;
248 : long mnMouseOff;
249 : sal_uInt16 mnCurItemId;
250 : sal_uInt16 mnItemDragPos;
251 : bool mbDragable;
252 : bool mbDrag;
253 : bool mbItemDrag;
254 : bool mbOutDrag;
255 : bool mbButtonStyle;
256 : bool mbItemMode;
257 : Link maStartDragHdl;
258 : Link maDragHdl;
259 : Link maEndDragHdl;
260 : Link maSelectHdl;
261 : Link maDoubleClickHdl;
262 : Link maCreateAccessibleHdl;
263 :
264 : VCLXHeaderBar* m_pVCLXHeaderBar;
265 :
266 :
267 : ::com::sun::star::uno::Reference<
268 : ::com::sun::star::accessibility::XAccessible >
269 : mxAccessible;
270 :
271 : using Window::ImplInit;
272 : SVT_DLLPRIVATE void ImplInit( WinBits nWinStyle );
273 : SVT_DLLPRIVATE void ImplInitSettings( bool bFont, bool bForeground, bool bBackground );
274 : SVT_DLLPRIVATE long ImplGetItemPos( sal_uInt16 nPos ) const;
275 : SVT_DLLPRIVATE Rectangle ImplGetItemRect( sal_uInt16 nPos ) const;
276 : using Window::ImplHitTest;
277 : SVT_DLLPRIVATE sal_uInt16 ImplHitTest( const Point& rPos, long& nMouseOff, sal_uInt16& nPos ) const;
278 : SVT_DLLPRIVATE void ImplInvertDrag( sal_uInt16 nStartPos, sal_uInt16 nEndPos );
279 : SVT_DLLPRIVATE void ImplDrawItem( OutputDevice* pDev,
280 : sal_uInt16 nPos, bool bHigh, bool bDrag,
281 : const Rectangle& rItemRect,
282 : const Rectangle* pRect,
283 : sal_uLong nFlags );
284 : SVT_DLLPRIVATE void ImplDrawItem( sal_uInt16 nPos, bool bHigh = false,
285 : bool bDrag = false,
286 : const Rectangle* pRect = NULL );
287 : SVT_DLLPRIVATE void ImplUpdate( sal_uInt16 nPos,
288 : bool bEnd = false, bool bDirect = false );
289 : SVT_DLLPRIVATE void ImplStartDrag( const Point& rPos, bool bCommand );
290 : SVT_DLLPRIVATE void ImplDrag( const Point& rPos );
291 : SVT_DLLPRIVATE void ImplEndDrag( bool bCancel );
292 :
293 : public:
294 : HeaderBar( vcl::Window* pParent, WinBits nWinBits = WB_STDHEADERBAR );
295 : virtual ~HeaderBar();
296 :
297 : virtual void MouseButtonDown( const MouseEvent& rMEvt ) SAL_OVERRIDE;
298 : virtual void MouseMove( const MouseEvent& rMEvt ) SAL_OVERRIDE;
299 : virtual void Tracking( const TrackingEvent& rTEvt ) SAL_OVERRIDE;
300 : virtual void Paint( const Rectangle& rRect ) SAL_OVERRIDE;
301 : virtual void Draw( OutputDevice* pDev, const Point& rPos, const Size& rSize, sal_uLong nFlags ) SAL_OVERRIDE;
302 : virtual void Resize() SAL_OVERRIDE;
303 : virtual void Command( const CommandEvent& rCEvt ) SAL_OVERRIDE;
304 : virtual void RequestHelp( const HelpEvent& rHEvt ) SAL_OVERRIDE;
305 : virtual void StateChanged( StateChangedType nStateChange ) SAL_OVERRIDE;
306 : virtual void DataChanged( const DataChangedEvent& rDCEvt ) SAL_OVERRIDE;
307 :
308 : virtual void UserDraw( const UserDrawEvent& rUDEvt );
309 : virtual void StartDrag();
310 : virtual void Drag();
311 : virtual void EndDrag();
312 : virtual void Select();
313 : virtual void DoubleClick();
314 :
315 : void InsertItem( sal_uInt16 nItemId, const OUString& rText,
316 : long nSize, HeaderBarItemBits nBits = HIB_STDSTYLE,
317 : sal_uInt16 nPos = HEADERBAR_APPEND );
318 : void RemoveItem( sal_uInt16 nItemId );
319 : void MoveItem( sal_uInt16 nItemId, sal_uInt16 nNewPos );
320 : void Clear();
321 :
322 : void SetOffset( long nNewOffset = 0 );
323 : long GetOffset() const { return mnOffset; }
324 0 : inline void SetDragSize( long nNewSize = 0 ) { mnDragSize = nNewSize; }
325 : long GetDragSize() const { return mnDragSize; }
326 :
327 : sal_uInt16 GetItemCount() const;
328 : sal_uInt16 GetItemPos( sal_uInt16 nItemId ) const;
329 : sal_uInt16 GetItemId( sal_uInt16 nPos ) const;
330 : sal_uInt16 GetItemId( const Point& rPos ) const;
331 : Rectangle GetItemRect( sal_uInt16 nItemId ) const;
332 0 : sal_uInt16 GetCurItemId() const { return mnCurItemId; }
333 0 : long GetDragPos() const { return mnDragPos; }
334 : sal_uInt16 GetItemDragPos() const { return mnItemDragPos; }
335 0 : bool IsItemMode() const { return mbItemMode; }
336 : bool IsItemDrag() const { return mbItemDrag; }
337 :
338 : void SetItemSize( sal_uInt16 nItemId, long nNewSize );
339 : long GetItemSize( sal_uInt16 nItemId ) const;
340 : void SetItemBits( sal_uInt16 nItemId, HeaderBarItemBits nNewBits );
341 : HeaderBarItemBits GetItemBits( sal_uInt16 nItemId ) const;
342 :
343 : void SetItemText( sal_uInt16 nItemId, const OUString& rText );
344 : OUString GetItemText( sal_uInt16 nItemId ) const;
345 :
346 : OUString GetHelpText( sal_uInt16 nItemId ) const;
347 : OString GetHelpId( sal_uInt16 nItemId ) const;
348 :
349 : Size CalcWindowSizePixel() const;
350 :
351 : inline void SetHelpText( const OUString& rText ) { Window::SetHelpText( rText ); }
352 : inline const OUString& GetHelpText() const { return Window::GetHelpText(); }
353 2 : inline void SetHelpId( const OString& rId ) { Window::SetHelpId( rId ); }
354 : inline const OString& GetHelpId() const { return Window::GetHelpId(); }
355 :
356 82 : inline void SetStartDragHdl( const Link& rLink ) { maStartDragHdl = rLink; }
357 : inline const Link& GetStartDragHdl() const { return maStartDragHdl; }
358 0 : inline void SetDragHdl( const Link& rLink ) { maDragHdl = rLink; }
359 : inline const Link& GetDragHdl() const { return maDragHdl; }
360 0 : inline void SetEndDragHdl( const Link& rLink ) { maEndDragHdl = rLink; }
361 : inline const Link& GetEndDragHdl() const { return maEndDragHdl; }
362 0 : inline void SetSelectHdl( const Link& rLink ) { maSelectHdl = rLink; }
363 : inline const Link& GetSelectHdl() const { return maSelectHdl; }
364 0 : inline void SetDoubleClickHdl( const Link& rLink ) { maDoubleClickHdl = rLink; }
365 : inline const Link& GetDoubleClickHdl() const { return maDoubleClickHdl; }
366 0 : inline void SetCreateAccessibleHdl( const Link& rLink ) { maCreateAccessibleHdl = rLink; }
367 : inline const Link& GetCreateAccessibleHdl() const { return maCreateAccessibleHdl; }
368 :
369 0 : inline bool IsDragable() const { return mbDragable; }
370 :
371 : /** Creates and returns the accessible object of the header bar. */
372 : virtual ::com::sun::star::uno::Reference<
373 : ::com::sun::star::accessibility::XAccessible > CreateAccessible() SAL_OVERRIDE;
374 : void SetAccessible( ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > );
375 : virtual ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindowPeer > GetComponentInterface( bool bCreate ) SAL_OVERRIDE;
376 :
377 : };
378 :
379 : #endif // INCLUDED_SVTOOLS_HEADBAR_HXX
380 :
381 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|