LCOV - code coverage report
Current view: top level - include/svtools - headbar.hxx (source / functions) Hit Total Coverage
Test: commit 10e77ab3ff6f4314137acd6e2702a6e5c1ce1fae Lines: 2 12 16.7 %
Date: 2014-11-03 Functions: 2 12 16.7 %
Legend: Lines: hit not hit

          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: */

Generated by: LCOV version 1.10