1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 #ifndef SD_TASKPANE_SLIDE_SORTER_CACHE_DISPLAY_HXX
25 #define SD_TASKPANE_SLIDE_SORTER_CACHE_DISPLAY_HXX
26 
27 // Uncomment the define below to activate the slide sorter cache display in
28 // the task pane. Visible slide previews are displayed as large rectangles,
29 // off-screen previews as smaller rectangles. The color shows the state:
30 // green for no action, different shades of yellow for a request being in
31 // the queue, pink for currently being rendered. A diagonal line indicates
32 // that the preview is not up-to-date.
33 #ifdef DEBUG
34 //#define USE_SLIDE_SORTER_CACHE_DISPLAY
35 #endif
36 
37 
38 #ifdef USE_SLIDE_SORTER_CACHE_DISPLAY
39 #include <taskpane/TaskPaneTreeNode.hxx>
40 
41 #include <map>
42 #include <vector>
43 #include <memory>
44 
45 class Window;
46 
47 #include "svx/svdpage.hxx"
48 #include "drawdoc.hxx"
49 
50 
51 namespace sd { namespace toolpanel {
52 
53 class TreeNode;
54 
55 /** This panel demonstrates how to create a panel for the task pane.
56 */
57 class SlideSorterCacheDisplay
58 	: public TreeNode
59 {
60 public:
61 	SlideSorterCacheDisplay (const SdDrawDocument* pDocument);
62 	virtual ~SlideSorterCacheDisplay (void);
63 
64 	void SetParentWindow (::Window* pParentWindow);
65 
66 	virtual void Paint (const Rectangle& rBoundingBox);
67 	virtual void Resize (void);
68 
69 	static SlideSorterCacheDisplay* Instance (const SdDrawDocument* pDocument);
70 
71 	void SetPageCount (sal_Int32 nPageCount);
72 	enum PageStatus {
73 		NONE,
74 		IN_QUEUE_PRIORITY_0,
75 		IN_QUEUE_PRIORITY_1,
76 		IN_QUEUE_PRIORITY_2,
77 		RENDERING
78 	};
79 	void SetPageStatus (sal_Int32 nPageIndex, PageStatus eStatus);
80 	void SetPageVisibility (sal_Int32 nPageIndex, bool bVisible);
81 	void SetUpToDate (sal_Int32 nPageIndex, bool bUpToDate);
82 
83 	virtual Size GetPreferredSize (void);
84 	virtual sal_Int32 GetPreferredWidth (sal_Int32 nHeigh);
85 	virtual sal_Int32 GetPreferredHeight (sal_Int32 nWidth);
86 	virtual ::Window* GetWindow (void);
87 	virtual bool IsResizable (void);
88 	virtual bool IsExpandable (void) const;
89 	virtual bool IsExpanded (void) const;
90 
91 private:
92 	static ::std::map<const SdDrawDocument*, SlideSorterCacheDisplay*> maDisplays;
93 	static void AddInstance (const SdDrawDocument* pDocument, SlideSorterCacheDisplay* pControl);
94 	static void RemoveInstance (SlideSorterCacheDisplay* pControl);
95 
96 	::Window* mpWindow;
97 	sal_Int32 mnPageCount;
98 	sal_Int32 mnColumnCount;
99 	sal_Int32 mnRowCount;
100 	Size maCellSize;
101 	sal_Int32 mnHorizontalBorder;
102 	sal_Int32 mnVerticalBorder;
103 	sal_Int32 mnHorizontalGap;
104 	sal_Int32 mnVerticalGap;
105 
106 	class PageDescriptor
107 	{
108 	public:
109 		PageStatus meStatus;
110 		bool mbVisible;
111 		bool mbUpToDate;
112 	};
113 	typedef ::std::vector<PageDescriptor> PageDescriptorList;
114 	PageDescriptorList maPageDescriptors;
115 
116 	Rectangle GetPageBox (sal_Int32 nPageIndex);
117 
118 	void ProvideSize (sal_Int32 nPageIndex);
119 
120 	void PaintPage (sal_Int32 nPageIndex);
121 };
122 
123 } } // end of namespace ::sd::toolpanel
124 
125 namespace {
126 
SscdSetStatus(const SdrPage * pPage,::sd::toolpanel::SlideSorterCacheDisplay::PageStatus eStatus)127 void SscdSetStatus (const SdrPage* pPage,
128 	::sd::toolpanel::SlideSorterCacheDisplay::PageStatus eStatus)
129 {
130 	::sd::toolpanel::SlideSorterCacheDisplay* pDisplay
131 		= ::sd::toolpanel::SlideSorterCacheDisplay::Instance(
132 		dynamic_cast<SdDrawDocument*>(pPage->GetModel()));
133 	if (pDisplay != NULL)
134 		pDisplay->SetPageStatus((pPage->GetPageNum()-1)/2, eStatus);
135 }
136 
SscdSetRequestClass(const SdrPage * pPage,sal_Int32 nClass)137 void SscdSetRequestClass (const SdrPage* pPage, sal_Int32 nClass)
138 {
139 	sd::toolpanel::SlideSorterCacheDisplay::PageStatus eStatus;
140 	switch (nClass)
141 	{
142 		case 0:
143 			eStatus = ::sd::toolpanel::SlideSorterCacheDisplay::IN_QUEUE_PRIORITY_0; break;
144 		case 1:
145 			eStatus = ::sd::toolpanel::SlideSorterCacheDisplay::IN_QUEUE_PRIORITY_1; break;
146 		case 2:
147 			eStatus = ::sd::toolpanel::SlideSorterCacheDisplay::IN_QUEUE_PRIORITY_2; break;
148 		default:
149 			eStatus = ::sd::toolpanel::SlideSorterCacheDisplay::NONE; break;
150 	}
151 	SscdSetStatus(pPage,eStatus);
152 }
153 
SscdSetVisibility(const SdrModel * pModel,sal_Int32 nIndex,bool bVisible)154 void SscdSetVisibility (const SdrModel* pModel, sal_Int32 nIndex, bool bVisible)
155 {
156 	::sd::toolpanel::SlideSorterCacheDisplay* pDisplay
157 		= ::sd::toolpanel::SlideSorterCacheDisplay::Instance(
158 		dynamic_cast<const SdDrawDocument*>(pModel));
159 	if (pDisplay != NULL)
160 		pDisplay->SetPageVisibility(nIndex, bVisible);
161 }
162 
163 
164 
SscdSetUpToDate(const SdrPage * pPage,bool bUpToDate)165 void SscdSetUpToDate (const SdrPage* pPage, bool bUpToDate)
166 {
167 	::sd::toolpanel::SlideSorterCacheDisplay* pDisplay
168 		= ::sd::toolpanel::SlideSorterCacheDisplay::Instance(
169 			dynamic_cast<const SdDrawDocument*>(pPage->GetModel()));
170 	if (pDisplay != NULL)
171 		pDisplay->SetUpToDate((pPage->GetPageNum()-1)/2, bUpToDate);
172 }
173 
174 
175 
176 #define SSCD_SET_REQUEST_CLASS(Page,RequestClass) \
177 	SscdSetRequestClass(Page,RequestClass)
178 #define SSCD_SET_STATUS(RequestData,Status) \
179 	SscdSetStatus(RequestData,::sd::toolpanel::SlideSorterCacheDisplay::Status)
180 #define SSCD_SET_VISIBILITY(Model,Index,Visible) \
181 	SscdSetVisibility(Model,Index,Visible)
182 #define SSCD_SET_UPTODATE(Page,UpToDate) \
183 	SscdSetUpToDate(Page,UpToDate)
184 
185 
186 }
187 
188 #else
189 
190 #define SSCD_SET_REQUEST_CLASS(Page,RequestClass)
191 #define SSCD_SET_STATUS(RequestData,Status)
192 #define SSCD_SET_VISIBILITY(Model,Index,Visible)
193 #define SSCD_SET_UPTODATE(Page,UpToDate)
194 
195 #endif
196 
197 #endif
198