xref: /AOO41X/main/svtools/inc/svtools/headbar.hxx (revision 4d7c9de063a797b8b4f3d45e3561e82ad1f8ef1f)
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