fdo#74697 Add Bluez 5 support for impress remote.
[LibreOffice.git] / include / svtools / headbar.hxx
blob29bd35fe2804166eeeafa24cd546c9a0aaa840b5
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3 * This file is part of the LibreOffice project.
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/.
9 * This file incorporates work covered by the following license notice:
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 .
20 #ifndef _HEADBAR_HXX
21 #define _HEADBAR_HXX
23 #include "svtools/svtdllapi.h"
24 #include <tools/link.hxx>
25 #include <vcl/window.hxx>
27 /*************************************************************************
29 Beschreibung
30 ============
32 class HeaderBar
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.
39 --------------------------------------------------------------------------
41 WinBits
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
50 --------------------------------------------------------------------------
52 ItemBits
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)
80 --------------------------------------------------------------------------
82 Handler
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.
124 Weitere Methoden, die fuer die Handler wichtig sind.
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.
150 --------------------------------------------------------------------------
152 Weitere Methoden
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.
161 --------------------------------------------------------------------------
163 Tips und Tricks:
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.
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.
178 *************************************************************************/
180 class Accelerator;
181 class ImplHeadItem;
183 typedef ::std::vector< ImplHeadItem* > ImplHeadItemList;
185 // -----------
186 // - WinBits -
187 // -----------
189 #define WB_BOTTOMBORDER ((WinBits)0x0400)
190 #define WB_BUTTONSTYLE ((WinBits)0x0800)
191 #define WB_STDHEADERBAR (WB_BUTTONSTYLE | WB_BOTTOMBORDER)
193 // ---------------------
194 // - HeaderBarItemBits -
195 // ---------------------
197 typedef sal_uInt16 HeaderBarItemBits;
199 // ----------------------------
200 // - Bits fuer HeaderBarItems -
201 // ----------------------------
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)
220 // -------------------
221 // - HeaderBar-Types -
222 // -------------------
224 #define HEADERBAR_APPEND ((sal_uInt16)0xFFFF)
225 #define HEADERBAR_ITEM_NOTFOUND ((sal_uInt16)0xFFFF)
226 #define HEADERBAR_FULLSIZE ((long)1000000000)
228 #define HEADERBAR_TEXTOFF 2
230 // -------------
231 // - HeaderBar -
232 // -------------
234 class SVT_DLLPUBLIC HeaderBar : public Window
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;
262 ::com::sun::star::uno::Reference<
263 ::com::sun::star::accessibility::XAccessible >
264 mxAccessible;
266 using Window::ImplInit;
267 SVT_DLLPRIVATE void ImplInit( WinBits nWinStyle );
268 SVT_DLLPRIVATE void ImplInitSettings( sal_Bool bFont, sal_Bool bForeground, sal_Bool bBackground );
269 SVT_DLLPRIVATE long ImplGetItemPos( sal_uInt16 nPos ) const;
270 SVT_DLLPRIVATE Rectangle ImplGetItemRect( sal_uInt16 nPos ) const;
271 using Window::ImplHitTest;
272 SVT_DLLPRIVATE sal_uInt16 ImplHitTest( const Point& rPos, long& nMouseOff, sal_uInt16& nPos ) const;
273 SVT_DLLPRIVATE void ImplInvertDrag( sal_uInt16 nStartPos, sal_uInt16 nEndPos );
274 SVT_DLLPRIVATE void ImplDrawItem( OutputDevice* pDev,
275 sal_uInt16 nPos, sal_Bool bHigh, sal_Bool bDrag,
276 const Rectangle& rItemRect,
277 const Rectangle* pRect,
278 sal_uLong nFlags );
279 SVT_DLLPRIVATE void ImplDrawItem( sal_uInt16 nPos, sal_Bool bHigh = sal_False,
280 sal_Bool bDrag = sal_False,
281 const Rectangle* pRect = NULL );
282 SVT_DLLPRIVATE void ImplUpdate( sal_uInt16 nPos,
283 sal_Bool bEnd = sal_False, sal_Bool bDirect = sal_False );
284 SVT_DLLPRIVATE void ImplStartDrag( const Point& rPos, sal_Bool bCommand );
285 SVT_DLLPRIVATE void ImplDrag( const Point& rPos );
286 SVT_DLLPRIVATE void ImplEndDrag( sal_Bool bCancel );
288 public:
289 HeaderBar( Window* pParent, WinBits nWinBits = WB_STDHEADERBAR );
290 HeaderBar( Window* pParent, const ResId& rResId );
291 ~HeaderBar();
293 virtual void MouseButtonDown( const MouseEvent& rMEvt );
294 virtual void MouseMove( const MouseEvent& rMEvt );
295 virtual void Tracking( const TrackingEvent& rTEvt );
296 virtual void Paint( const Rectangle& rRect );
297 virtual void Draw( OutputDevice* pDev, const Point& rPos, const Size& rSize, sal_uLong nFlags );
298 virtual void Resize();
299 virtual void Command( const CommandEvent& rCEvt );
300 virtual void RequestHelp( const HelpEvent& rHEvt );
301 virtual void StateChanged( StateChangedType nStateChange );
302 virtual void DataChanged( const DataChangedEvent& rDCEvt );
304 virtual void UserDraw( const UserDrawEvent& rUDEvt );
305 virtual void StartDrag();
306 virtual void Drag();
307 virtual void EndDrag();
308 virtual void Select();
309 virtual void DoubleClick();
311 void InsertItem( sal_uInt16 nItemId, const XubString& rText,
312 long nSize, HeaderBarItemBits nBits = HIB_STDSTYLE,
313 sal_uInt16 nPos = HEADERBAR_APPEND );
314 void RemoveItem( sal_uInt16 nItemId );
315 void MoveItem( sal_uInt16 nItemId, sal_uInt16 nNewPos );
316 void Clear();
318 void SetOffset( long nNewOffset = 0 );
319 long GetOffset() const { return mnOffset; }
320 inline void SetDragSize( long nNewSize = 0 ) { mnDragSize = nNewSize; }
321 long GetDragSize() const { return mnDragSize; }
323 sal_uInt16 GetItemCount() const;
324 sal_uInt16 GetItemPos( sal_uInt16 nItemId ) const;
325 sal_uInt16 GetItemId( sal_uInt16 nPos ) const;
326 sal_uInt16 GetItemId( const Point& rPos ) const;
327 Rectangle GetItemRect( sal_uInt16 nItemId ) const;
328 sal_uInt16 GetCurItemId() const { return mnCurItemId; }
329 long GetDragPos() const { return mnDragPos; }
330 sal_uInt16 GetItemDragPos() const { return mnItemDragPos; }
331 sal_Bool IsItemMode() const { return mbItemMode; }
332 sal_Bool IsItemDrag() const { return mbItemDrag; }
334 void SetItemSize( sal_uInt16 nItemId, long nNewSize );
335 long GetItemSize( sal_uInt16 nItemId ) const;
336 void SetItemBits( sal_uInt16 nItemId, HeaderBarItemBits nNewBits );
337 HeaderBarItemBits GetItemBits( sal_uInt16 nItemId ) const;
339 void SetItemText( sal_uInt16 nItemId, const XubString& rText );
340 XubString GetItemText( sal_uInt16 nItemId ) const;
342 XubString GetHelpText( sal_uInt16 nItemId ) const;
343 OString GetHelpId( sal_uInt16 nItemId ) const;
345 Size CalcWindowSizePixel() const;
347 inline void SetHelpText( const String& rText ) { Window::SetHelpText( rText ); }
348 inline const String& GetHelpText() const { return Window::GetHelpText(); }
349 inline void SetHelpId( const OString& rId ) { Window::SetHelpId( rId ); }
350 inline const OString& GetHelpId() const { return Window::GetHelpId(); }
352 inline void SetStartDragHdl( const Link& rLink ) { maStartDragHdl = rLink; }
353 inline const Link& GetStartDragHdl() const { return maStartDragHdl; }
354 inline void SetDragHdl( const Link& rLink ) { maDragHdl = rLink; }
355 inline const Link& GetDragHdl() const { return maDragHdl; }
356 inline void SetEndDragHdl( const Link& rLink ) { maEndDragHdl = rLink; }
357 inline const Link& GetEndDragHdl() const { return maEndDragHdl; }
358 inline void SetSelectHdl( const Link& rLink ) { maSelectHdl = rLink; }
359 inline const Link& GetSelectHdl() const { return maSelectHdl; }
360 inline void SetDoubleClickHdl( const Link& rLink ) { maDoubleClickHdl = rLink; }
361 inline const Link& GetDoubleClickHdl() const { return maDoubleClickHdl; }
362 inline void SetCreateAccessibleHdl( const Link& rLink ) { maCreateAccessibleHdl = rLink; }
363 inline const Link& GetCreateAccessibleHdl() const { return maCreateAccessibleHdl; }
365 inline sal_Bool IsDragable() const { return mbDragable; }
367 /** Creates and returns the accessible object of the header bar. */
368 virtual ::com::sun::star::uno::Reference<
369 ::com::sun::star::accessibility::XAccessible > CreateAccessible();
370 void SetAccessible( ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > );
373 #endif // _HEADBAR_HXX
375 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */