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_PAGE_CACHE_MANAGER_HXX
25 #define SD_PAGE_CACHE_MANAGER_HXX
26 
27 #include <sal/types.h>
28 #include <com/sun/star/uno/XInterface.hpp>
29 #include <boost/shared_ptr.hpp>
30 #include <memory>
31 #include <vector>
32 
33 class Size;
34 class SdDrawDocument;
35 class SdrPage;
36 
37 namespace sd { namespace slidesorter { namespace view {
38 class SlideSorterView;
39 class PageObjectViewObjectContact;
40 } } }
41 
42 namespace sd { namespace slidesorter { namespace model {
43 class SlideSorterModel;
44 } } }
45 
46 namespace sd { namespace slidesorter { namespace cache {
47 
48 namespace css = ::com::sun::star;
49 
50 class BitmapCache;
51 
52 
53 /** Provide and manage the preview bitmap caches for all slide sorter
54     instances.  There is one cache per active slide sorter plus a small
55     number of caches that are no longer in use.  The later are kept to speed
56     up the switching between views.
57 */
58 class PageCacheManager
59 {
60 public:
61     typedef BitmapCache Cache;
62     typedef ::std::vector< ::std::pair<Size, ::boost::shared_ptr<BitmapCache> > > BestFittingPageCaches;
63     typedef css::uno::Reference<css::uno::XInterface> DocumentKey;
64 
65     /** Return the one instance of the PageCacheManager class.
66     */
67     static ::boost::shared_ptr<PageCacheManager> Instance (void);
68 
69     /** Look up the cache for the given model in which the previews have the
70         specified size.  If no such cache exists, then one is created.  When
71         a new BitmapCache is created its Recycle() method is called with a
72         sorted list of existing caches from which the new one initialize its
73         previews.
74         @return
75             The returned cache lives as long as somebody keeps a shared
76             pointer and the ReleaseCache() method has not been called.
77     */
78     ::boost::shared_ptr<Cache> GetCache (
79         DocumentKey pDocument,
80         const Size& rPreviewSize);
81 
82     /** Tell the cache manager to release its own reference to the specified
83         cache.  After that the cache will live as long as the caller (and
84         maybe others) holds its reference.
85     */
86     void ReleaseCache (const ::boost::shared_ptr<Cache>& rpCache);
87 
88     /** This is an information to the cache manager that the size of preview
89         bitmaps in the specified cache has changed.
90 
91     */
92     ::boost::shared_ptr<Cache> ChangeSize (
93         const ::boost::shared_ptr<Cache>& rpCache,
94         const Size& rOldPreviewSize,
95         const Size& rNewPreviewSize);
96 
97     /** Invalidate the preview bitmap for one slide that belongs to the
98         specified document.  The bitmaps for this slide in all caches are
99         marked as out-of-date and will be re-created when they are requested
100         the next time.
101     */
102     bool InvalidatePreviewBitmap (
103         DocumentKey pDocument,
104         const SdrPage* pPage);
105 
106     /** Invalidate the preview bitmaps for all slides that belong to the
107         specified document.  This is necessary after model changes that
108         affect e.g. page number fields.
109     */
110     void InvalidateAllPreviewBitmaps (DocumentKey pDocument);
111 
112     /** Invalidate all the caches that are currently in use and destroy
113         those that are not.  This is used for example when the high contrast
114         mode is turned on or off.
115     */
116     void InvalidateAllCaches (void);
117 
118     /** Call this method when a page has been deleted and its preview
119         is not needed anymore.
120     */
121     void ReleasePreviewBitmap (const SdrPage* pPage);
122 
123 private:
124     /** Singleton instance of the cache manager.  Note that this is a weak
125         pointer.  The (implementation class of) ViewShellBase holds a
126         shared_ptr so that the cache manager has the same life time as the
127         ViewShellBase.
128     */
129     static ::boost::weak_ptr<PageCacheManager> mpInstance;
130 
131     /// List of active caches.
132     class PageCacheContainer;
133     ::std::auto_ptr<PageCacheContainer> mpPageCaches;
134 
135     /// List of inactive, recently used caches.
136     class RecentlyUsedPageCaches;
137     ::std::auto_ptr<RecentlyUsedPageCaches> mpRecentlyUsedPageCaches;
138 
139     /** The maximal number of recently used caches that are kept alive after
140         they have become inactive, i.e. after they are not used anymore by a
141         slide sorter.
142     */
143     const sal_uInt32 mnMaximalRecentlyCacheCount;
144 
145     PageCacheManager (void);
146     ~PageCacheManager (void);
147 
148 	class Deleter;
149 	friend class Deleter;
150 
151     ::boost::shared_ptr<Cache> GetRecentlyUsedCache(
152         DocumentKey pDocument,
153         const Size& rSize);
154 
155     /** Add the given cache to the list of recently used caches for the
156         document.  There is one such list per document.  Each least has at
157         most mnMaximalRecentlyCacheCount members.
158     */
159     void PutRecentlyUsedCache(
160         DocumentKey pDocument,
161         const Size& rPreviewSize,
162         const ::boost::shared_ptr<Cache>& rpCache);
163 
164     /** Return a sorted list of the available caches, both active caches and
165         those recently used, for the given document.  The sort order is so
166         that an exact match of the preview size is at the front.  Other
167         caches follow with the largest size first.
168     */
169     BestFittingPageCaches GetBestFittingCaches (
170         DocumentKey pDocument,
171         const Size& rPreviewSize);
172 
173     /** This method is used internally to initialize a newly created
174         BitmapCache with already existing previews.
175     */
176     void Recycle (
177         const ::boost::shared_ptr<Cache>& rpCache,
178         DocumentKey pDocument,
179         const Size& rPreviewSize);
180 };
181 
182 } } } // end of namespace ::sd::slidesorter::cache
183 
184 #endif
185