diff options
author | Bjoern Michaelsen <bjoern.michaelsen@canonical.com> | 2013-04-18 18:26:28 +0200 |
---|---|---|
committer | Bjoern Michaelsen <bjoern.michaelsen@canonical.com> | 2013-04-23 22:20:31 +0200 |
commit | b9337e22ce1dbf2eba0e8c8db294ae99f4111f91 (patch) | |
tree | 53ee1bd3dfd213815a21579151983cb997922b05 /include/svtools/headbar.hxx | |
parent | f4e1642a1761d5eab6ccdd89928869c2b2f1528a (diff) |
execute move of global headers
see https://gerrit.libreoffice.org/#/c/3367/
and Change-Id: I00c96fa77d04b33a6f8c8cd3490dfcd9bdc9e84a for details
Change-Id: I199a75bc4042af20817265d5ef85b1134a96ff5a
Diffstat (limited to 'include/svtools/headbar.hxx')
-rw-r--r-- | include/svtools/headbar.hxx | 377 |
1 files changed, 377 insertions, 0 deletions
diff --git a/include/svtools/headbar.hxx b/include/svtools/headbar.hxx new file mode 100644 index 000000000000..9be63ce3229d --- /dev/null +++ b/include/svtools/headbar.hxx @@ -0,0 +1,377 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#ifndef _HEADBAR_HXX +#define _HEADBAR_HXX + +#include "svtools/svtdllapi.h" +#include <tools/link.hxx> +#include <vcl/window.hxx> + +/************************************************************************* + +Beschreibung +============ + +class HeaderBar + +Diese Klasse dient zur Anzeige einer Ueberschiftszeile. Diese kann Texte, +Images oder beides anzeigen. Man kann die Items in der Groesse aendern, +verschieben oder anklicken. In vielen Faellen macht es zum Beispiel Sinn, +dieses Control mit einer SvTabListBox zu verbinden. + +-------------------------------------------------------------------------- + +WinBits + +WB_BORDER Oben und unten wird ein Border gezeichnet +WB_BOTTOMBORDER Unten wird ein Border gezeichnet +WB_BUTTONSTYLE Die Items sehen aus wie Buttons, ansonsten sind sie flach +WB_3DLOOK 3D-Darstellung +WB_DRAG Items koennen verschoben werden +WB_STDHEADERBAR WB_BUTTONSTYLE | WB_BOTTOMBORDER + +-------------------------------------------------------------------------- + +ItemBits + +HIB_LEFT Inhalt wird im Item linksbuendig ausgegeben +HIB_CENTER Inhalt wird im Item zentriert ausgegeben +HIB_RIGHT Inhalt wird im Item rechtsbuendig ausgegeben +HIB_TOP Inhalt wird im Item an der oberen Kante ausgegeben +HIB_VCENTER Inhalt wird im Item vertikal zentiert ausgegeben +HIB_BOTTOM Inhalt wird im Item an der unteren Kante ausgegeben +HIB_LEFTIMAGE Bei Text und Image, wird Image links vom Text ausgegeben +HIB_RIGHTIMAGE Bei Text und Image, wird Image rechts vom Text ausgegeben +HIB_FIXED Item laesst sich nicht in der Groesse aendern +HIB_FIXEDPOS Item laesst sich nicht verschieben +HIB_CLICKABLE Item laesst sich anklicken + (Select-Handler wird erst bei MouseButtonUp gerufen) +HIB_FLAT Item wird flach dargestellt, auch wenn WB_BUTTONSTYLE gesetzt ist +HIB_DOWNARROW Es wird ein Pfeil nach unter hinter dem Text ausgegeben, + welcher zum Beispiel angezeigt werden sollte, wenn nach + diesem Item eine dazugehoerende Liste absteigend sortiert + ist. Der Status des Pfeils kann mit SetItemBits() + gesetzt/zurueckgesetzt werden. +HIB_UPARROW Es wird ein Pfeil nach oben hinter dem Text ausgegeben, + welcher zum Beispiel angezeigt werden sollte, wenn nach + diesem Item eine dazugehoerende Liste aufsteigend sortiert + ist.Der Status des Pfeils kann mit SetItemBits() + gesetzt/zurueckgesetzt werden. +HIB_USERDRAW Zu diesem Item wird auch der UserDraw-Handler gerufen. +HIB_STDSTYLE (HIB_LEFT | HIB_LEFTIMAGE | HIB_VCENTER | HIB_CLICKABLE) + +-------------------------------------------------------------------------- + +Handler + +Select() Wird gerufen, wenn Item angeklickt wird. Wenn + HIB_CLICKABLE beim Item gesetzt ist und nicht HIB_FLAT, + wird der Handler erst im MouseButtonUp-Handler gerufen, + wenn die Maus ueber dem Item losgelassen wurde. Dann + verhaellt sich der Select-Handler wie bei einem + ToolBox-Button. +DoubleClick() Dieser Handler wird gerufen, wenn ein Item + doppelt geklickt wird. Ob das Item oder der + Trenner angeklickt wurden, kann mit IsItemMode() + abgefragt werden. Wenn ein Trenner doppelt angeklickt + wird, sollte normalerweise die optimale Spaltenbreite + berechnet werden und diese gesetzt werden. +StartDrag() Dieser Handler wird gerufen, wenn Draggen gestartet + wird, bzw. wenn ein Item angeklickt wurde. + In diesem Handler sollte spaetestens mit SetDragSize() + die Groesse der Size-Linie gesetzt werden, wenn + IsItemMode() sal_False zurueckliefert. +Drag() Dieser Handler wird gerufen, wenn gedraggt wird. Wenn + mit SetDragSize() keine Groesse gesetzt wird, kann + dieser Handler dafuer benutzt werden, um die + Linie im angrenzenden Fenster selber zu zeichnen. Mit + GetDragPos() kann die aktuelle Drag-Position abgefragt + werden. Mit IsItemMode() sollte in diesem Fall + abgefragt werden, ob auch ein Trenner gedraggt wird. +EndDrag() Dieser Handler wird gerufen, wenn ein Drag-Vorgang + beendet wurde. Wenn im EndDrag-Handler GetCurItemId() + 0 zurueckliefert, wurde der Drag-Vorgang abgebrochen. + Wenn dies nicht der Fall ist und IsItemMode() sal_False + zurueckliefert, sollte von dem gedraggten Item + die neue Groesse mit GetItemSize() abgefragt werden + und entsprechend im dazugehoerigem Control uebernommen + werden. Wenn IsItemMode() sal_True, GetCurItemId() eine Id + und IsItemDrag() sal_True zurueckliefert, wurde dieses + Item verschoben. Es sollte dann mit GetItemPos() die + neue Position abgefragt werden und auch die Daten + im dazugehoerigem Control angepasst werden. Ansonsten + koennte auch mit GetItemDragPos() die Position abgefragt + werden, an welche Stelle das Item verschoben wurde. + + +Weitere Methoden, die fuer die Handler wichtig sind. + +GetCurItemId() Liefert die Id vom Item zurueck, fuer welches gerade + der Handler gerufen wurde. Liefert nur eine gueltige + Id in den Handlern Select(), DoubleClick(), StartDrag(), + Drag() und EndDrag(). Im EndDrag-Handler leifert + diese Methode die Id vom gedraggten Item zurueck oder + 0, wenn der Drag-Vorgang abgebrochen wurde. +GetItemDragPos() Liefert die Position zurueck, an der ein Item verschoben + wird bzw. wurde. HEADERBAR_ITEM_NOTFOUND wird + zurueckgeliefert, wenn der Vorgang abgebrochen wurde + oder wenn kein ItemDrag aktiv ist. +IsItemMode() Mit dieser Methode kann abgefragt werden, ob fuer ein + Item oder einen Trenner der Handler gerufen wurde. + sal_True - Handler wurde fuer das Item gerufen + sal_False - Handler wurde fuer den Trenner gerufen +IsItemDrag() Mit dieser Methode kann abgefragt werden, ob ein + Item gedragt oder selektiert wurde. + sal_True - Item wird verschoben + sal_False - Item wird selektiert +SetDragSize() Mit dieser Methode wird gesetzt, wir gross der + Trennstrich sein soll, der vom Control gemalt wird. + Dies sollte so gross sein, wie das angrenzende Fenster + hoch ist. Die Hoehe vom HeaderBar wird automatisch + dazugerechnet. + +-------------------------------------------------------------------------- + +Weitere Methoden + +SetOffset() Mit dieser Methode wird der Offset gesetzt, ab dem + die Items ausgegeben werden. Dies wird benoetigt, + wenn das dazugehoerige Fenster gescrollt wird. +CalcWindowSizePixel() Mit dieser Methode kann man die Hoehe des Fensters + berechnen, damit der Inhalt der Items ausgegeben + werden kann. + +-------------------------------------------------------------------------- + +Tips und Tricks: + +1) KontextMenu +Wenn ein kontextsensitives PopupMenu anzeigt werden soll, muss der +Command-Handler ueberlagert werden. Mit GetItemId() und bei +Uebergabe der Mausposition kann ermittelt werden, ob der Mausclick +ueber einem bzw. ueber welchem Item durchgefuehrt wurde. + +2) Letztes Item +Wenn man ButtonStyle gesetzt hat, sieht es besser aus, wenn man am +Ende noch ein leeres Item setzt, was den restlichen Platz einnimmt. +Dazu fuegt man ein Item mit einem leeren String ein und uebergibt als +Groesse HEADERBAR_FULLSIZE. Bei diesem Item sollte man dann auch +nicht HIB_CLICKABLE setzen und dafuer HIB_FIXEDPOS. + +*************************************************************************/ + +class Accelerator; +class ImplHeadItem; + +typedef ::std::vector< ImplHeadItem* > ImplHeadItemList; + +// ----------- +// - WinBits - +// ----------- + +#define WB_BOTTOMBORDER ((WinBits)0x0400) +#define WB_BUTTONSTYLE ((WinBits)0x0800) +#define WB_STDHEADERBAR (WB_BUTTONSTYLE | WB_BOTTOMBORDER) + +// --------------------- +// - HeaderBarItemBits - +// --------------------- + +typedef sal_uInt16 HeaderBarItemBits; + +// ---------------------------- +// - Bits fuer HeaderBarItems - +// ---------------------------- + +#define HIB_LEFT ((HeaderBarItemBits)0x0001) +#define HIB_CENTER ((HeaderBarItemBits)0x0002) +#define HIB_RIGHT ((HeaderBarItemBits)0x0004) +#define HIB_TOP ((HeaderBarItemBits)0x0008) +#define HIB_VCENTER ((HeaderBarItemBits)0x0010) +#define HIB_BOTTOM ((HeaderBarItemBits)0x0020) +#define HIB_LEFTIMAGE ((HeaderBarItemBits)0x0040) +#define HIB_RIGHTIMAGE ((HeaderBarItemBits)0x0080) +#define HIB_FIXED ((HeaderBarItemBits)0x0100) +#define HIB_FIXEDPOS ((HeaderBarItemBits)0x0200) +#define HIB_CLICKABLE ((HeaderBarItemBits)0x0400) +#define HIB_FLAT ((HeaderBarItemBits)0x0800) +#define HIB_DOWNARROW ((HeaderBarItemBits)0x1000) +#define HIB_UPARROW ((HeaderBarItemBits)0x2000) +#define HIB_USERDRAW ((HeaderBarItemBits)0x4000) +#define HIB_STDSTYLE (HIB_LEFT | HIB_LEFTIMAGE | HIB_VCENTER | HIB_CLICKABLE) + +// ------------------- +// - HeaderBar-Types - +// ------------------- + +#define HEADERBAR_APPEND ((sal_uInt16)0xFFFF) +#define HEADERBAR_ITEM_NOTFOUND ((sal_uInt16)0xFFFF) +#define HEADERBAR_FULLSIZE ((long)1000000000) + +#define HEADERBAR_TEXTOFF 2 + +// ------------- +// - HeaderBar - +// ------------- + +class SVT_DLLPUBLIC HeaderBar : public Window +{ +private: + ImplHeadItemList* mpItemList; + long mnBorderOff1; + long mnBorderOff2; + long mnOffset; + long mnDX; + long mnDY; + long mnDragSize; + long mnStartPos; + long mnDragPos; + long mnMouseOff; + sal_uInt16 mnCurItemId; + sal_uInt16 mnItemDragPos; + sal_Bool mbDragable; + sal_Bool mbDrag; + sal_Bool mbItemDrag; + sal_Bool mbOutDrag; + sal_Bool mbButtonStyle; + sal_Bool mbItemMode; + Link maStartDragHdl; + Link maDragHdl; + Link maEndDragHdl; + Link maSelectHdl; + Link maDoubleClickHdl; + Link maCreateAccessibleHdl; + + ::com::sun::star::uno::Reference< + ::com::sun::star::accessibility::XAccessible > + mxAccessible; + +#ifdef _SV_HEADBAR_CXX + using Window::ImplInit; + SVT_DLLPRIVATE void ImplInit( WinBits nWinStyle ); + SVT_DLLPRIVATE void ImplInitSettings( sal_Bool bFont, sal_Bool bForeground, sal_Bool bBackground ); + SVT_DLLPRIVATE long ImplGetItemPos( sal_uInt16 nPos ) const; + SVT_DLLPRIVATE Rectangle ImplGetItemRect( sal_uInt16 nPos ) const; + using Window::ImplHitTest; + SVT_DLLPRIVATE sal_uInt16 ImplHitTest( const Point& rPos, long& nMouseOff, sal_uInt16& nPos ) const; + SVT_DLLPRIVATE void ImplInvertDrag( sal_uInt16 nStartPos, sal_uInt16 nEndPos ); + SVT_DLLPRIVATE void ImplDrawItem( OutputDevice* pDev, + sal_uInt16 nPos, sal_Bool bHigh, sal_Bool bDrag, + const Rectangle& rItemRect, + const Rectangle* pRect, + sal_uLong nFlags ); + SVT_DLLPRIVATE void ImplDrawItem( sal_uInt16 nPos, sal_Bool bHigh = sal_False, + sal_Bool bDrag = sal_False, + const Rectangle* pRect = NULL ); + SVT_DLLPRIVATE void ImplUpdate( sal_uInt16 nPos, + sal_Bool bEnd = sal_False, sal_Bool bDirect = sal_False ); + SVT_DLLPRIVATE void ImplStartDrag( const Point& rPos, sal_Bool bCommand ); + SVT_DLLPRIVATE void ImplDrag( const Point& rPos ); + SVT_DLLPRIVATE void ImplEndDrag( sal_Bool bCancel ); +#endif + +public: + HeaderBar( Window* pParent, WinBits nWinBits = WB_STDHEADERBAR ); + HeaderBar( Window* pParent, const ResId& rResId ); + ~HeaderBar(); + + virtual void MouseButtonDown( const MouseEvent& rMEvt ); + virtual void MouseMove( const MouseEvent& rMEvt ); + virtual void Tracking( const TrackingEvent& rTEvt ); + virtual void Paint( const Rectangle& rRect ); + virtual void Draw( OutputDevice* pDev, const Point& rPos, const Size& rSize, sal_uLong nFlags ); + virtual void Resize(); + virtual void Command( const CommandEvent& rCEvt ); + virtual void RequestHelp( const HelpEvent& rHEvt ); + virtual void StateChanged( StateChangedType nStateChange ); + virtual void DataChanged( const DataChangedEvent& rDCEvt ); + + virtual void UserDraw( const UserDrawEvent& rUDEvt ); + virtual void StartDrag(); + virtual void Drag(); + virtual void EndDrag(); + virtual void Select(); + virtual void DoubleClick(); + + void InsertItem( sal_uInt16 nItemId, const XubString& rText, + long nSize, HeaderBarItemBits nBits = HIB_STDSTYLE, + sal_uInt16 nPos = HEADERBAR_APPEND ); + void RemoveItem( sal_uInt16 nItemId ); + void MoveItem( sal_uInt16 nItemId, sal_uInt16 nNewPos ); + void Clear(); + + void SetOffset( long nNewOffset = 0 ); + long GetOffset() const { return mnOffset; } + inline void SetDragSize( long nNewSize = 0 ) { mnDragSize = nNewSize; } + long GetDragSize() const { return mnDragSize; } + + sal_uInt16 GetItemCount() const; + sal_uInt16 GetItemPos( sal_uInt16 nItemId ) const; + sal_uInt16 GetItemId( sal_uInt16 nPos ) const; + sal_uInt16 GetItemId( const Point& rPos ) const; + Rectangle GetItemRect( sal_uInt16 nItemId ) const; + sal_uInt16 GetCurItemId() const { return mnCurItemId; } + long GetDragPos() const { return mnDragPos; } + sal_uInt16 GetItemDragPos() const { return mnItemDragPos; } + sal_Bool IsItemMode() const { return mbItemMode; } + sal_Bool IsItemDrag() const { return mbItemDrag; } + + void SetItemSize( sal_uInt16 nItemId, long nNewSize ); + long GetItemSize( sal_uInt16 nItemId ) const; + void SetItemBits( sal_uInt16 nItemId, HeaderBarItemBits nNewBits ); + HeaderBarItemBits GetItemBits( sal_uInt16 nItemId ) const; + + void SetItemText( sal_uInt16 nItemId, const XubString& rText ); + XubString GetItemText( sal_uInt16 nItemId ) const; + + XubString GetHelpText( sal_uInt16 nItemId ) const; + OString GetHelpId( sal_uInt16 nItemId ) const; + + Size CalcWindowSizePixel() const; + + inline void SetHelpText( const String& rText ) { Window::SetHelpText( rText ); } + inline const String& GetHelpText() const { return Window::GetHelpText(); } + inline void SetHelpId( const OString& rId ) { Window::SetHelpId( rId ); } + inline const OString& GetHelpId() const { return Window::GetHelpId(); } + + inline void SetStartDragHdl( const Link& rLink ) { maStartDragHdl = rLink; } + inline const Link& GetStartDragHdl() const { return maStartDragHdl; } + inline void SetDragHdl( const Link& rLink ) { maDragHdl = rLink; } + inline const Link& GetDragHdl() const { return maDragHdl; } + inline void SetEndDragHdl( const Link& rLink ) { maEndDragHdl = rLink; } + inline const Link& GetEndDragHdl() const { return maEndDragHdl; } + inline void SetSelectHdl( const Link& rLink ) { maSelectHdl = rLink; } + inline const Link& GetSelectHdl() const { return maSelectHdl; } + inline void SetDoubleClickHdl( const Link& rLink ) { maDoubleClickHdl = rLink; } + inline const Link& GetDoubleClickHdl() const { return maDoubleClickHdl; } + inline void SetCreateAccessibleHdl( const Link& rLink ) { maCreateAccessibleHdl = rLink; } + inline const Link& GetCreateAccessibleHdl() const { return maCreateAccessibleHdl; } + + inline sal_Bool IsDragable() const { return mbDragable; } + + /** Creates and returns the accessible object of the header bar. */ + virtual ::com::sun::star::uno::Reference< + ::com::sun::star::accessibility::XAccessible > CreateAccessible(); + void SetAccessible( ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > ); +}; + +#endif // _HEADBAR_HXX + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |