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 overridden. 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 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.
138 :
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.
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 0 : bool operator () (const ThumbnailViewItem*) const
168 : {
169 0 : 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 : virtual void dispose() SAL_OVERRIDE;
187 :
188 : virtual void MouseMove(const MouseEvent& rMEvt) SAL_OVERRIDE;
189 :
190 : void AppendItem(ThumbnailViewItem *pItem);
191 :
192 : void RemoveItem(sal_uInt16 nItemId);
193 :
194 : virtual void Clear();
195 :
196 : /// Updates information in the view; used only in RecentDocsView ATM.
197 0 : virtual void Reload() {}
198 :
199 : // Change current thumbnail item list with new one (invalidates all pointers to a thumbnail item)
200 : void updateItems(const std::vector<ThumbnailViewItem *> &items);
201 :
202 : size_t GetItemPos( sal_uInt16 nItemId ) const;
203 :
204 : sal_uInt16 GetItemId( size_t nPos ) const;
205 :
206 : sal_uInt16 GetItemId( const Point& rPos ) const;
207 :
208 : sal_uInt16 getNextItemId () const;
209 :
210 : long GetItemWidth() const { return mnItemWidth; }
211 :
212 : long GetItemHeight() const { return mnItemHeight; }
213 :
214 : void setItemMaxTextLength (sal_uInt32 nLength);
215 :
216 : void setItemDimensions (long ItemWidth, long ThumbnailHeight,
217 : long DisplayHeight, int itemPadding);
218 :
219 : sal_uInt16 GetFirstLine() const { return mnFirstLine; }
220 :
221 : void SelectItem( sal_uInt16 nItemId );
222 :
223 : bool IsItemSelected( sal_uInt16 nItemId ) const;
224 :
225 : /**
226 : *
227 : * @brief deselect all current selected items.
228 : *
229 : **/
230 :
231 : void deselectItems ();
232 :
233 : void ShowTooltips( bool bShowTooltips );
234 :
235 : Color GetColor() const { return maColor; }
236 :
237 : bool IsColor() const { return maColor.GetTransparency() == 0; }
238 :
239 : void filterItems (const boost::function<bool (const ThumbnailViewItem*) > &func);
240 :
241 : void sortItems (const boost::function<bool (const ThumbnailViewItem*,
242 : const ThumbnailViewItem*) > &func);
243 :
244 0 : void setItemStateHdl (const Link<> &aLink) { maItemStateHdl = aLink; }
245 :
246 : virtual void Resize() SAL_OVERRIDE;
247 :
248 : virtual bool renameItem(ThumbnailViewItem* pItem, const OUString& sNewTitle);
249 :
250 : static BitmapEx readThumbnail(const OUString &msURL);
251 :
252 : protected:
253 :
254 : virtual void KeyInput( const KeyEvent& rKEvt ) SAL_OVERRIDE;
255 :
256 : virtual void MouseButtonDown( const MouseEvent& rMEvt ) SAL_OVERRIDE;
257 :
258 : virtual void MouseButtonUp( const MouseEvent& rMEvt ) SAL_OVERRIDE;
259 :
260 : virtual void Command( const CommandEvent& rCEvt ) SAL_OVERRIDE;
261 :
262 : virtual void Paint(vcl::RenderContext& rRenderContext, const Rectangle& rRect) SAL_OVERRIDE;
263 :
264 : virtual void PrePaint(vcl::RenderContext& rRenderContext) SAL_OVERRIDE;
265 :
266 : virtual void PostPaint(vcl::RenderContext& rRenderContext) SAL_OVERRIDE;
267 :
268 : virtual void GetFocus() SAL_OVERRIDE;
269 :
270 : virtual void LoseFocus() SAL_OVERRIDE;
271 :
272 : virtual void StateChanged( StateChangedType nStateChange ) SAL_OVERRIDE;
273 :
274 : virtual void DataChanged( const DataChangedEvent& rDCEvt ) SAL_OVERRIDE;
275 :
276 : virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > CreateAccessible() SAL_OVERRIDE;
277 :
278 : protected:
279 :
280 : // Drawing item related functions, override them to make your own custom ones.
281 :
282 : void DrawItem (ThumbnailViewItem *pItem);
283 :
284 : virtual void OnItemDblClicked (ThumbnailViewItem *pItem);
285 :
286 : protected:
287 :
288 : friend class ThumbnailViewAcc;
289 : friend class ThumbnailViewItemAcc;
290 : using Control::ImplInitSettings;
291 : using Window::ImplInit;
292 :
293 : void CalculateItemPositions (bool bScrollBarUsed = false);
294 : void MakeItemVisible( sal_uInt16 nId );
295 :
296 : SFX2_DLLPRIVATE void ImplInit();
297 : SFX2_DLLPRIVATE void ImplInitSettings( bool bFont, bool bForeground, bool bBackground );
298 :
299 : virtual void ApplySettings(vcl::RenderContext& rRenderContext) SAL_OVERRIDE;
300 :
301 : SFX2_DLLPRIVATE void ImplInitScrollBar();
302 : SFX2_DLLPRIVATE void ImplDeleteItems();
303 : SFX2_DLLPRIVATE void ImplDraw();
304 : SFX2_DLLPRIVATE size_t ImplGetItem( const Point& rPoint ) const;
305 : SFX2_DLLPRIVATE ThumbnailViewItem* ImplGetItem( size_t nPos );
306 : SFX2_DLLPRIVATE sal_uInt16 ImplGetVisibleItemCount() const;
307 : SFX2_DLLPRIVATE ThumbnailViewItem* ImplGetVisibleItem( sal_uInt16 nVisiblePos );
308 : SFX2_DLLPRIVATE void ImplFireAccessibleEvent( short nEventId, const ::com::sun::star::uno::Any& rOldValue, const ::com::sun::star::uno::Any& rNewValue );
309 : SFX2_DLLPRIVATE bool ImplHasAccessibleListeners();
310 : DECL_DLLPRIVATE_LINK( ImplScrollHdl, ScrollBar* );
311 :
312 : DECL_LINK(OnItemSelected, ThumbnailViewItem*);
313 :
314 : protected:
315 :
316 : ThumbnailValueItemList mItemList;
317 : ThumbnailValueItemList mFilteredItemList; ///< Cache to store the filtered items
318 : ThumbnailValueItemList::iterator mpStartSelRange;
319 : VclPtr<ScrollBar> mpScrBar;
320 : long mnHeaderHeight;
321 : long mnItemWidth;
322 : long mnItemHeight;
323 : long mnItemPadding;
324 : long mnThumbnailHeight; // Maximum height of the thumbnail
325 : long mnDisplayHeight; // Height of the data display box (name, etc)
326 : long mnVisLines;
327 : long mnLines;
328 :
329 : int mnFineness;
330 :
331 : sal_uInt16 mnCols;
332 : sal_uInt16 mnFirstLine;
333 : bool mbScroll : 1;
334 : bool mbIsTransientChildrenDisabled : 1;
335 : bool mbHasVisibleItems : 1;
336 : bool mbShowTooltips : 1;
337 : Color maColor;
338 :
339 : Link<> maItemStateHdl;
340 : ThumbnailItemAttributes* mpItemAttrs;
341 :
342 : std::unique_ptr<drawinglayer::processor2d::BaseProcessor2D> mpProcessor;
343 :
344 : boost::function<bool (const ThumbnailViewItem*)> maFilterFunc;
345 : };
346 :
347 : #endif // INCLUDED_SFX2_THUMBNAILVIEW_HXX
348 :
349 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|