LCOV - code coverage report
Current view: top level - include/sfx2 - thumbnailview.hxx (source / functions) Hit Total Coverage
Test: commit 10e77ab3ff6f4314137acd6e2702a6e5c1ce1fae Lines: 2 4 50.0 %
Date: 2014-11-03 Functions: 1 3 33.3 %
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             : 
      10             : #ifndef INCLUDED_SFX2_THUMBNAILVIEW_HXX
      11             : #define INCLUDED_SFX2_THUMBNAILVIEW_HXX
      12             : 
      13             : #include <sfx2/dllapi.h>
      14             : 
      15             : #include <vector>
      16             : #include <boost/function.hpp>
      17             : 
      18             : #include <comphelper/processfactory.hxx>
      19             : #include <unotools/ucbstreamhelper.hxx>
      20             : #include <sfx2/thumbnailviewitem.hxx>
      21             : #include <vcl/ctrl.hxx>
      22             : #include <vcl/timer.hxx>
      23             : #include <vcl/pngread.hxx>
      24             : 
      25             : #include <com/sun/star/embed/ElementModes.hpp>
      26             : #include <com/sun/star/embed/XStorage.hpp>
      27             : #include <com/sun/star/embed/StorageFactory.hpp>
      28             : 
      29             : class BitmapEx;
      30             : class MouseEvent;
      31             : class TrackingEvent;
      32             : class HelpEvent;
      33             : class KeyEvent;
      34             : class DataChangedEvent;
      35             : class ScrollBar;
      36             : typedef ::std::vector< ThumbnailViewItem* > ThumbnailValueItemList;
      37             : 
      38             : struct ThumbnailItemAttributes;
      39             : class ThumbnailViewAcc;
      40             : class ThumbnailViewItemAcc;
      41             : 
      42             : namespace drawinglayer {
      43             :     namespace processor2d {
      44             :         class BaseProcessor2D;
      45             :     }
      46             : }
      47             : 
      48             : /*************************************************************************
      49             : 
      50             :     Description
      51             :     ============
      52             : 
      53             :     class ThumbnailView
      54             : 
      55             :     This class allows the selection of an item. In the process items are
      56             :     drawn side by side. The selection of items can be more clear than in a
      57             :     ListBox shape for example in case of colors or samples.
      58             :     The amount of columns drawn by the control and whether the items
      59             :     should be encircled can be specified. Optional a NoSelection or name
      60             :     field could be shown. By default image and color items are supported.
      61             :     Items could be drawn by oneself if InsertItem() is only called with
      62             :     an ID. To achieve this the UserDraw handler needs to be overloaded. The
      63             :     description text could be specified afterwards in case of UserDraw
      64             :     and any other items.
      65             : 
      66             :     Cross references
      67             : 
      68             :     class ListBox
      69             : 
      70             :     --------------------------------------------------------------------------
      71             : 
      72             :     WinBits
      73             : 
      74             :     WB_VSCROLL          A scroolbar will be always shown. The visible number of
      75             :                         lines have to be specified with SetLineCount() if this
      76             :                         flag is set.
      77             :     WB_TABSTOP          It is possible to jump into the ValueSet with the tab key.
      78             :     WB_NOTABSTOP        It is not possible to jump into the ValueSet with the
      79             :                         tab key.
      80             :     --------------------------------------------------------------------------
      81             : 
      82             :     The number of columns must be either set with SetColCount() or
      83             :     SetItemWidth(). If the number of columns is specified by SetColCount()
      84             :     the width of the items will be calculated by the visible range.
      85             :     If the items should have a static width, it has to be specified
      86             :     with SetItemWidth(). In this case the number of columns will be calculated
      87             :     by the visible range.
      88             : 
      89             :     The number of rows is given by the number of items / number of columns. The
      90             :     number of visible rows must either specified by SetLineCount() or
      91             :     SetItemWidth(). If the number of visible rows is specified by SetLineCount(),
      92             :     the height of the items will be calculated from the visible height. If the
      93             :     items should have a fixed height it has to be specified with SetItemHeight().
      94             :     In this case the number of visible rows is then calculated from the visible
      95             :     height. If the number of visible rows is neither specified by SetLineCount()
      96             :     nor by SetItemHeight() all rows will be shown. The height of the items will
      97             :     be calculated by the visible height. If the number of visible rows is
      98             :     specified by SetLineCount() or SetItemHeight() ValueSet does scroll
      99             :     automatically when more lines are available, as are visible. If scrolling
     100             :     should be also possible with a ScrollBar  WB_VSCROLL needs to be set.
     101             : 
     102             :     The distance between the items can be increased by SetExtraSpacing(). The
     103             :     distance, which will be shown between two items (both in x and in y), is
     104             :     measured in pixels.
     105             : 
     106             :     The exact window size for a specific item size can be calculated by
     107             :     CalcWindowSizePixel(). To do this all relevant data (number of columns/...)
     108             :     have to be specified and if no number of rows was set, all items need to
     109             :     be inserted. If the window was created with WB_BORDER/Border=sal_True the
     110             :     size has to be specified with SetOutputSizePixel(). In other cases different
     111             :     size-methods can be used. With CalcItemSize() the inner and outer size of
     112             :     an item could be calculated (for this the free space defined by
     113             :     SetExtraSpacing() will not be included).
     114             : 
     115             :     The background color could be specified by SetColor(), with which the image
     116             :     or UserDraw items will be underlayed. If no color is specified the color
     117             :     of other windows (WindowColor) will be used for the background.
     118             : 
     119             :     --------------------------------------------------------------------------
     120             : 
     121             :     At first all items should be inserted and only then Show() should be called
     122             :     since the output area will be precomputed. If this is not done the first
     123             :     Paint will appear a little bit slower. Therefore the Control, if it is loaded
     124             :     from the resource and only supplied with items during runtime, should be
     125             :     loaded with Hide = sal_True and then displayed with Show().
     126             : 
     127             :     In case of a visible Control the creation of the new output area could be
     128             :     activated before Paint by calling Format().
     129             : 
     130             :     --------------------------------------------------------------------------
     131             : 
     132             :     If Drag and Drop will be called from the ValueSet the Command-Handler has to
     133             :     be overloaded. From this StartDrag needs to be called. If this method returns
     134             :     sal_True the drag-process could be initiated by  ExecuteDrag(), otherwise no
     135             :     processing will take place. This method makes sure that ValueSet stops its
     136             :     processing and as appropriate selects the entry. Therefore the calling of
     137             :     Select-Handler within this function must be expected.
     138             : 
     139             :     For dropping QueryDrop() and Drop() need to be overloaded and ShowDropPos()
     140             :     and HideDropPos() should be called within these methods.
     141             :     To show the insertion point ShowDropPos() has to be called within the
     142             :     QueryDrop-Handler. ShowDropPos() also scrolls the ValueSet if the passed
     143             :     position is located at the window border. Furthermore ShowDropPos() returns
     144             :     the position, at which the item should be inserted respectively which
     145             :     insertion point was shown. If no insertion point was determined
     146             :     VALUESET_ITEM_NOTFOUND will be returned. If the window was left during dragging
     147             :     or the drag process is terminated HideDropPos() should be called in any case.
     148             : 
     149             :     --------------------------------------------------------------------------
     150             : 
     151             :     This class is currently still in the SV-Tools. That's why the ValueSet needs
     152             :     to be loaded as a Control out of the resource and the desired WinBits have
     153             :     to be set (before Show) with SetStyle().
     154             : 
     155             : *************************************************************************/
     156             : 
     157             : /* ThumbnailView types */
     158             : 
     159             : #define THUMBNAILVIEW_APPEND         ((sal_uInt16)-1)
     160             : #define THUMBNAILVIEW_ITEM_NOTFOUND  ((sal_uInt16)-1)
     161             : 
     162             : // Display all the available items in the thumbnail.
     163             : class ViewFilterAll
     164             : {
     165             : public:
     166             : 
     167           4 :     bool operator () (const ThumbnailViewItem*) const
     168             :     {
     169           4 :         return true;
     170             :     }
     171             : };
     172             : 
     173             : /**
     174             :  *
     175             :  *  Class to display thumbnails with their names below their respective icons
     176             :  *
     177             :  **/
     178             : 
     179             : class SFX2_DLLPUBLIC ThumbnailView : public Control
     180             : {
     181             : public:
     182             : 
     183             :     ThumbnailView(vcl::Window* pParent, WinBits nWinStyle = WB_TABSTOP, bool bDisableTransientChildren = false);
     184             : 
     185             :     virtual ~ThumbnailView();
     186             : 
     187             :     virtual void MouseMove(const MouseEvent& rMEvt) SAL_OVERRIDE;
     188             : 
     189             :     void AppendItem(ThumbnailViewItem *pItem);
     190             : 
     191             :     void RemoveItem(sal_uInt16 nItemId);
     192             : 
     193             :     virtual void Clear();
     194             : 
     195             :     /// Updates information in the view; used only in RecentDocsView ATM.
     196           0 :     virtual void Reload() {}
     197             : 
     198             :     // Change current thumbnail item list with new one (invalidates all pointers to a thumbnail item)
     199             :     void updateItems(const std::vector<ThumbnailViewItem *> &items);
     200             : 
     201             :     size_t GetItemPos( sal_uInt16 nItemId ) const;
     202             : 
     203             :     sal_uInt16 GetItemId( size_t nPos ) const;
     204             : 
     205             :     sal_uInt16 GetItemId( const Point& rPos ) const;
     206             : 
     207             :     sal_uInt16 getNextItemId () const;
     208             : 
     209             :     long GetItemWidth() const { return mnItemWidth; }
     210             : 
     211             :     long GetItemHeight() const { return mnItemHeight; }
     212             : 
     213             :     void setItemMaxTextLength (sal_uInt32 nLength);
     214             : 
     215             :     void setItemDimensions (long ItemWidth, long ThumbnailHeight,
     216             :                             long DisplayHeight, int itemPadding);
     217             : 
     218             :     sal_uInt16 GetFirstLine() const { return mnFirstLine; }
     219             : 
     220             :     void SelectItem( sal_uInt16 nItemId );
     221             : 
     222             :     bool IsItemSelected( sal_uInt16 nItemId ) const;
     223             : 
     224             :     /**
     225             :      *
     226             :      * @brief deselect all current selected items.
     227             :      *
     228             :      **/
     229             : 
     230             :     void deselectItems ();
     231             : 
     232             :     void ShowTooltips( bool bShowTooltips );
     233             : 
     234             :     Color GetColor() const { return maColor; }
     235             : 
     236             :     bool IsColor() const { return maColor.GetTransparency() == 0; }
     237             : 
     238             :     void filterItems (const boost::function<bool (const ThumbnailViewItem*) > &func);
     239             : 
     240             :     void sortItems (const boost::function<bool (const ThumbnailViewItem*,
     241             :                                                 const ThumbnailViewItem*) > &func);
     242             : 
     243           0 :     void setItemStateHdl (const Link &aLink) { maItemStateHdl = aLink; }
     244             : 
     245             :     virtual void Resize() SAL_OVERRIDE;
     246             : 
     247             :     virtual bool renameItem(ThumbnailViewItem* pItem, const OUString& sNewTitle);
     248             : 
     249             :     static BitmapEx readThumbnail(const OUString &msURL);
     250             : 
     251             : protected:
     252             : 
     253             :     virtual void KeyInput( const KeyEvent& rKEvt ) SAL_OVERRIDE;
     254             : 
     255             :     virtual void MouseButtonDown( const MouseEvent& rMEvt ) SAL_OVERRIDE;
     256             : 
     257             :     virtual void MouseButtonUp( const MouseEvent& rMEvt ) SAL_OVERRIDE;
     258             : 
     259             :     virtual void Command( const CommandEvent& rCEvt ) SAL_OVERRIDE;
     260             : 
     261             :     virtual void Paint( const Rectangle& rRect ) SAL_OVERRIDE;
     262             : 
     263             :     virtual void GetFocus() SAL_OVERRIDE;
     264             : 
     265             :     virtual void LoseFocus() SAL_OVERRIDE;
     266             : 
     267             :     virtual void StateChanged( StateChangedType nStateChange ) SAL_OVERRIDE;
     268             : 
     269             :     virtual void DataChanged( const DataChangedEvent& rDCEvt ) SAL_OVERRIDE;
     270             : 
     271             :     virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > CreateAccessible() SAL_OVERRIDE;
     272             : 
     273             : protected:
     274             : 
     275             :     // Drawing item related functions, override them to make your own custom ones.
     276             : 
     277             :     virtual void DrawItem (ThumbnailViewItem *pItem);
     278             : 
     279             :     virtual void OnItemDblClicked (ThumbnailViewItem *pItem);
     280             : 
     281             : protected:
     282             : 
     283             :     friend class ThumbnailViewAcc;
     284             :     friend class ThumbnailViewItemAcc;
     285             :     using Control::ImplInitSettings;
     286             :     using Window::ImplInit;
     287             : 
     288             :     void CalculateItemPositions (bool bScrollBarUsed = false);
     289             :     void MakeItemVisible( sal_uInt16 nId );
     290             : 
     291             :     SFX2_DLLPRIVATE void         ImplInit();
     292             :     SFX2_DLLPRIVATE void         ImplInitSettings( bool bFont, bool bForeground, bool bBackground );
     293             :     SFX2_DLLPRIVATE void         ImplInitScrollBar();
     294             :     SFX2_DLLPRIVATE void         ImplDeleteItems();
     295             :     SFX2_DLLPRIVATE void         ImplDraw();
     296             :     SFX2_DLLPRIVATE size_t       ImplGetItem( const Point& rPoint ) const;
     297             :     SFX2_DLLPRIVATE ThumbnailViewItem*    ImplGetItem( size_t nPos );
     298             :     SFX2_DLLPRIVATE sal_uInt16          ImplGetVisibleItemCount() const;
     299             :     SFX2_DLLPRIVATE ThumbnailViewItem*    ImplGetVisibleItem( sal_uInt16 nVisiblePos );
     300             :     SFX2_DLLPRIVATE void            ImplFireAccessibleEvent( short nEventId, const ::com::sun::star::uno::Any& rOldValue, const ::com::sun::star::uno::Any& rNewValue );
     301             :     SFX2_DLLPRIVATE bool         ImplHasAccessibleListeners();
     302             :     DECL_DLLPRIVATE_LINK( ImplScrollHdl, ScrollBar* );
     303             : 
     304             :     DECL_LINK(OnItemSelected, ThumbnailViewItem*);
     305             : 
     306             : protected:
     307             : 
     308             :     ThumbnailValueItemList mItemList;
     309             :     ThumbnailValueItemList mFilteredItemList; ///< Cache to store the filtered items
     310             :     ThumbnailValueItemList::iterator mpStartSelRange;
     311             :     ScrollBar* mpScrBar;
     312             :     long mnHeaderHeight;
     313             :     long mnItemWidth;
     314             :     long mnItemHeight;
     315             :     long mnItemPadding;
     316             :     long mnThumbnailHeight;     // Maximum height of the thumbnail
     317             :     long mnDisplayHeight;       // Height of the data display box (name, etc)
     318             :     long mnVisLines;
     319             :     long mnLines;
     320             : 
     321             :     int mnFineness;
     322             : 
     323             :     sal_uInt16 mnCols;
     324             :     sal_uInt16 mnFirstLine;
     325             :     bool mbScroll : 1;
     326             :     bool mbIsTransientChildrenDisabled : 1;
     327             :     bool mbHasVisibleItems : 1;
     328             :     bool mbShowTooltips : 1;
     329             :     Color maColor;
     330             : 
     331             :     Link maItemStateHdl;
     332             :     ThumbnailItemAttributes *mpItemAttrs;
     333             :     drawinglayer::processor2d::BaseProcessor2D *mpProcessor;
     334             :     boost::function<bool (const ThumbnailViewItem*) > maFilterFunc;
     335             : };
     336             : 
     337             : #endif // INCLUDED_SFX2_THUMBNAILVIEW_HXX
     338             : 
     339             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10