update emoji autocorrect entries from po-files
[LibreOffice.git] / include / sfx2 / thumbnailview.hxx
blobbf0ea16e12f7534c3f1a9c61f8676032aa940062
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3 * This file is part of the LibreOffice project.
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 */
10 #ifndef INCLUDED_SFX2_THUMBNAILVIEW_HXX
11 #define INCLUDED_SFX2_THUMBNAILVIEW_HXX
13 #include <sfx2/dllapi.h>
15 #include <vector>
16 #include <boost/function.hpp>
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>
25 #include <com/sun/star/embed/ElementModes.hpp>
26 #include <com/sun/star/embed/XStorage.hpp>
27 #include <com/sun/star/embed/StorageFactory.hpp>
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;
38 struct ThumbnailItemAttributes;
39 class ThumbnailViewAcc;
40 class ThumbnailViewItemAcc;
42 namespace drawinglayer {
43 namespace processor2d {
44 class BaseProcessor2D;
48 /*************************************************************************
50 Description
51 ============
53 class ThumbnailView
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 overridden. The
63 description text could be specified afterwards in case of UserDraw
64 and any other items.
66 Cross references
68 class ListBox
70 --------------------------------------------------------------------------
72 WinBits
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 --------------------------------------------------------------------------
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.
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.
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.
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).
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.
119 --------------------------------------------------------------------------
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().
127 In case of a visible Control the creation of the new output area could be
128 activated before Paint by calling Format().
130 --------------------------------------------------------------------------
132 If Drag and Drop will be called from the ValueSet the Command-Handler has to
133 be overridden. 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.
139 For dropping QueryDrop() and Drop() need to be overridden 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.
149 --------------------------------------------------------------------------
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().
155 *************************************************************************/
157 /* ThumbnailView types */
159 #define THUMBNAILVIEW_APPEND ((sal_uInt16)-1)
160 #define THUMBNAILVIEW_ITEM_NOTFOUND ((sal_uInt16)-1)
162 // Display all the available items in the thumbnail.
163 class ViewFilterAll
165 public:
167 bool operator () (const ThumbnailViewItem*) const
169 return true;
175 * Class to display thumbnails with their names below their respective icons
179 class SFX2_DLLPUBLIC ThumbnailView : public Control
181 public:
183 ThumbnailView(vcl::Window* pParent, WinBits nWinStyle = WB_TABSTOP, bool bDisableTransientChildren = false);
185 virtual ~ThumbnailView();
186 virtual void dispose() SAL_OVERRIDE;
188 virtual void MouseMove(const MouseEvent& rMEvt) SAL_OVERRIDE;
190 void AppendItem(ThumbnailViewItem *pItem);
192 void RemoveItem(sal_uInt16 nItemId);
194 virtual void Clear();
196 /// Updates information in the view; used only in RecentDocsView ATM.
197 virtual void Reload() {}
199 // Change current thumbnail item list with new one (invalidates all pointers to a thumbnail item)
200 void updateItems(const std::vector<ThumbnailViewItem *> &items);
202 size_t GetItemPos( sal_uInt16 nItemId ) const;
204 sal_uInt16 GetItemId( size_t nPos ) const;
206 sal_uInt16 GetItemId( const Point& rPos ) const;
208 sal_uInt16 getNextItemId () const;
210 long GetItemWidth() const { return mnItemWidth; }
212 long GetItemHeight() const { return mnItemHeight; }
214 void setItemMaxTextLength (sal_uInt32 nLength);
216 void setItemDimensions (long ItemWidth, long ThumbnailHeight,
217 long DisplayHeight, int itemPadding);
219 sal_uInt16 GetFirstLine() const { return mnFirstLine; }
221 void SelectItem( sal_uInt16 nItemId );
223 bool IsItemSelected( sal_uInt16 nItemId ) const;
227 * @brief deselect all current selected items.
231 void deselectItems ();
233 void ShowTooltips( bool bShowTooltips );
235 void filterItems (const boost::function<bool (const ThumbnailViewItem*) > &func);
237 void sortItems (const boost::function<bool (const ThumbnailViewItem*,
238 const ThumbnailViewItem*) > &func);
240 void setItemStateHdl (const Link<> &aLink) { maItemStateHdl = aLink; }
242 virtual void Resize() SAL_OVERRIDE;
244 virtual bool renameItem(ThumbnailViewItem* pItem, const OUString& sNewTitle);
246 static BitmapEx readThumbnail(const OUString &msURL);
248 protected:
250 virtual void KeyInput( const KeyEvent& rKEvt ) SAL_OVERRIDE;
252 virtual void MouseButtonDown( const MouseEvent& rMEvt ) SAL_OVERRIDE;
254 virtual void MouseButtonUp( const MouseEvent& rMEvt ) SAL_OVERRIDE;
256 virtual void Command( const CommandEvent& rCEvt ) SAL_OVERRIDE;
258 virtual void Paint(vcl::RenderContext& rRenderContext, const Rectangle& rRect) SAL_OVERRIDE;
260 virtual void GetFocus() SAL_OVERRIDE;
262 virtual void LoseFocus() SAL_OVERRIDE;
264 virtual void StateChanged( StateChangedType nStateChange ) SAL_OVERRIDE;
266 virtual void DataChanged( const DataChangedEvent& rDCEvt ) SAL_OVERRIDE;
268 virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > CreateAccessible() SAL_OVERRIDE;
270 protected:
272 // Drawing item related functions, override them to make your own custom ones.
274 void DrawItem (ThumbnailViewItem *pItem);
276 virtual void OnItemDblClicked (ThumbnailViewItem *pItem);
278 protected:
280 friend class ThumbnailViewAcc;
281 friend class ThumbnailViewItemAcc;
282 using Window::ImplInit;
284 void CalculateItemPositions (bool bScrollBarUsed = false);
285 void MakeItemVisible( sal_uInt16 nId );
287 SFX2_DLLPRIVATE void ImplInit();
289 virtual void ApplySettings(vcl::RenderContext& rRenderContext) SAL_OVERRIDE;
291 SFX2_DLLPRIVATE void ImplInitScrollBar();
292 SFX2_DLLPRIVATE void ImplDeleteItems();
293 SFX2_DLLPRIVATE void ImplDraw();
294 SFX2_DLLPRIVATE size_t ImplGetItem( const Point& rPoint ) const;
295 SFX2_DLLPRIVATE ThumbnailViewItem* ImplGetItem( size_t nPos );
296 SFX2_DLLPRIVATE sal_uInt16 ImplGetVisibleItemCount() const;
297 SFX2_DLLPRIVATE ThumbnailViewItem* ImplGetVisibleItem( sal_uInt16 nVisiblePos );
298 SFX2_DLLPRIVATE void ImplFireAccessibleEvent( short nEventId, const ::com::sun::star::uno::Any& rOldValue, const ::com::sun::star::uno::Any& rNewValue );
299 SFX2_DLLPRIVATE bool ImplHasAccessibleListeners();
300 DECL_DLLPRIVATE_LINK( ImplScrollHdl, ScrollBar* );
302 DECL_LINK(OnItemSelected, ThumbnailViewItem*);
304 protected:
306 ThumbnailValueItemList mItemList;
307 ThumbnailValueItemList mFilteredItemList; ///< Cache to store the filtered items
308 ThumbnailValueItemList::iterator mpStartSelRange;
309 VclPtr<ScrollBar> mpScrBar;
310 long mnHeaderHeight;
311 long mnItemWidth;
312 long mnItemHeight;
313 long mnItemPadding;
314 long mnThumbnailHeight; // Maximum height of the thumbnail
315 long mnDisplayHeight; // Height of the data display box (name, etc)
316 long mnVisLines;
317 long mnLines;
319 int mnFineness;
321 sal_uInt16 mnCols;
322 sal_uInt16 mnFirstLine;
323 bool mbScroll : 1;
324 bool mbIsTransientChildrenDisabled : 1;
325 bool mbHasVisibleItems : 1;
326 bool mbShowTooltips : 1;
327 Color maFillColor; ///< Background color of the thumbnail view widget.
328 Color maTextColor; ///< Text color.
329 Color maHighlightColor; ///< Color of the highlight (background) of the hovered / selected item.
330 Color maHighlightTextColor; ///< Color of the text for the higlighted item.
331 double mfHighlightTransparence; ///< Transparence of the highlight.
333 Link<> maItemStateHdl;
334 ThumbnailItemAttributes* mpItemAttrs;
336 boost::function<bool (const ThumbnailViewItem*)> maFilterFunc;
339 #endif // INCLUDED_SFX2_THUMBNAILVIEW_HXX
341 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */