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