1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski #ifndef SD_SIDEBAR_PANELS_MASTER_PAGES_SELECTOR_HXX
23*b1cdbd2cSJim Jagielski #define SD_SIDEBAR_PANELS_MASTER_PAGES_SELECTOR_HXX
24*b1cdbd2cSJim Jagielski 
25*b1cdbd2cSJim Jagielski #include "MasterPageContainer.hxx"
26*b1cdbd2cSJim Jagielski #include "SlideSorterViewShell.hxx"
27*b1cdbd2cSJim Jagielski #include "PreviewValueSet.hxx"
28*b1cdbd2cSJim Jagielski #include "ISidebarReceiver.hxx"
29*b1cdbd2cSJim Jagielski #include <sfx2/sidebar/ILayoutableWindow.hxx>
30*b1cdbd2cSJim Jagielski 
31*b1cdbd2cSJim Jagielski #include "pres.hxx"
32*b1cdbd2cSJim Jagielski #include <sfx2/shell.hxx>
33*b1cdbd2cSJim Jagielski #include <vcl/image.hxx>
34*b1cdbd2cSJim Jagielski #include "glob.hxx"
35*b1cdbd2cSJim Jagielski #include <osl/mutex.hxx>
36*b1cdbd2cSJim Jagielski #include <com/sun/star/ui/XSidebar.hpp>
37*b1cdbd2cSJim Jagielski 
38*b1cdbd2cSJim Jagielski #include <queue>
39*b1cdbd2cSJim Jagielski 
40*b1cdbd2cSJim Jagielski namespace css = ::com::sun::star;
41*b1cdbd2cSJim Jagielski namespace cssu = ::com::sun::star::uno;
42*b1cdbd2cSJim Jagielski 
43*b1cdbd2cSJim Jagielski class MouseEvent;
44*b1cdbd2cSJim Jagielski class SdDrawDocument;
45*b1cdbd2cSJim Jagielski class SdPage;
46*b1cdbd2cSJim Jagielski class SfxModule;
47*b1cdbd2cSJim Jagielski 
48*b1cdbd2cSJim Jagielski namespace sd {
49*b1cdbd2cSJim Jagielski class DrawViewShell;
50*b1cdbd2cSJim Jagielski class TemplateEntry;
51*b1cdbd2cSJim Jagielski class TemplateDir;
52*b1cdbd2cSJim Jagielski class ViewShellBase;
53*b1cdbd2cSJim Jagielski }
54*b1cdbd2cSJim Jagielski 
55*b1cdbd2cSJim Jagielski namespace sd { namespace sidebar {
56*b1cdbd2cSJim Jagielski 
57*b1cdbd2cSJim Jagielski class PreviewValueSet;
58*b1cdbd2cSJim Jagielski class SidebarShellManager;
59*b1cdbd2cSJim Jagielski 
60*b1cdbd2cSJim Jagielski 
61*b1cdbd2cSJim Jagielski /** Base class of a menu that lets the user select from a list of
62*b1cdbd2cSJim Jagielski     templates or designs that are loaded from files.
63*b1cdbd2cSJim Jagielski */
64*b1cdbd2cSJim Jagielski class MasterPagesSelector
65*b1cdbd2cSJim Jagielski     : public PreviewValueSet,
66*b1cdbd2cSJim Jagielski       public sfx2::sidebar::ILayoutableWindow
67*b1cdbd2cSJim Jagielski {
68*b1cdbd2cSJim Jagielski public:
69*b1cdbd2cSJim Jagielski     MasterPagesSelector (
70*b1cdbd2cSJim Jagielski         ::Window* pParent,
71*b1cdbd2cSJim Jagielski         SdDrawDocument& rDocument,
72*b1cdbd2cSJim Jagielski         ViewShellBase& rBase,
73*b1cdbd2cSJim Jagielski         const ::boost::shared_ptr<MasterPageContainer>& rpContainer,
74*b1cdbd2cSJim Jagielski         const cssu::Reference<css::ui::XSidebar>& rxSidebar);
75*b1cdbd2cSJim Jagielski     virtual ~MasterPagesSelector (void);
76*b1cdbd2cSJim Jagielski 
77*b1cdbd2cSJim Jagielski     virtual void LateInit (void);
78*b1cdbd2cSJim Jagielski 
79*b1cdbd2cSJim Jagielski     /** Return the height that this control needs to show all of its lines.
80*b1cdbd2cSJim Jagielski     */
81*b1cdbd2cSJim Jagielski     long GetRequiredHeight (int nWidth) const;
82*b1cdbd2cSJim Jagielski 
83*b1cdbd2cSJim Jagielski     /** The given master page, either the master page of a slide or a notes
84*b1cdbd2cSJim Jagielski         page, is cloned and inserted into mrDocument.  The necessary styles
85*b1cdbd2cSJim Jagielski         are copied as well.
86*b1cdbd2cSJim Jagielski     */
87*b1cdbd2cSJim Jagielski     static SdPage* AddMasterPage (
88*b1cdbd2cSJim Jagielski         SdDrawDocument* pTargetDocument,
89*b1cdbd2cSJim Jagielski         SdPage* pMasterPage,
90*b1cdbd2cSJim Jagielski         sal_uInt16 nInsertionIndex);
91*b1cdbd2cSJim Jagielski 
92*b1cdbd2cSJim Jagielski     virtual Size GetPreferredSize (void);
93*b1cdbd2cSJim Jagielski     virtual sal_Int32 GetPreferredWidth (sal_Int32 nHeight);
94*b1cdbd2cSJim Jagielski     virtual sal_Int32 GetPreferredHeight (sal_Int32 nWidth);
95*b1cdbd2cSJim Jagielski     virtual bool IsResizable (void);
96*b1cdbd2cSJim Jagielski     virtual ::Window* GetWindow (void);
97*b1cdbd2cSJim Jagielski     virtual sal_Int32 GetMinimumWidth (void);
98*b1cdbd2cSJim Jagielski 
99*b1cdbd2cSJim Jagielski     /** Update the selection of previews according to whatever
100*b1cdbd2cSJim Jagielski         influences them appart from mouse and keyboard.  If, for
101*b1cdbd2cSJim Jagielski         example, the current page of the main pane changes, then call
102*b1cdbd2cSJim Jagielski         this method at the CurrentMasterPagesSelector to select the
103*b1cdbd2cSJim Jagielski         previews of the master pages that are assigned to the new
104*b1cdbd2cSJim Jagielski         current page.
105*b1cdbd2cSJim Jagielski 
106*b1cdbd2cSJim Jagielski         The default implementation of this method ignores the call. This is
107*b1cdbd2cSJim Jagielski         used by e.g. the RecentMasterPagesSelector because it does not show
108*b1cdbd2cSJim Jagielski         the currently used master pages by default and thus is not
109*b1cdbd2cSJim Jagielski         influenced by its changes.
110*b1cdbd2cSJim Jagielski     */
111*b1cdbd2cSJim Jagielski     virtual void UpdateSelection (void);
112*b1cdbd2cSJim Jagielski 
113*b1cdbd2cSJim Jagielski     void FillPageSet (void);
114*b1cdbd2cSJim Jagielski 
115*b1cdbd2cSJim Jagielski     /** Make the selector empty.  This method clear the value set from any
116*b1cdbd2cSJim Jagielski         entries. Overload this method to add functionality, especially to
117*b1cdbd2cSJim Jagielski         destroy objects set as data items at the value set.
118*b1cdbd2cSJim Jagielski     */
119*b1cdbd2cSJim Jagielski     void ClearPageSet (void);
120*b1cdbd2cSJim Jagielski 
121*b1cdbd2cSJim Jagielski 	void SetHelpId( const rtl::OString& aId );
122*b1cdbd2cSJim Jagielski 
123*b1cdbd2cSJim Jagielski     /** Mark the preview that belongs to the given index as not up-to-date
124*b1cdbd2cSJim Jagielski         anymore with respect to page content or preview size.
125*b1cdbd2cSJim Jagielski         The implementation of this method will either sunchronously or
126*b1cdbd2cSJim Jagielski         asynchronously call UpdatePreview().
127*b1cdbd2cSJim Jagielski         @param nIndex
128*b1cdbd2cSJim Jagielski             Index into the value set control that is used for displaying the
129*b1cdbd2cSJim Jagielski             previews.
130*b1cdbd2cSJim Jagielski     */
131*b1cdbd2cSJim Jagielski     void InvalidatePreview (const SdPage* pPage);
132*b1cdbd2cSJim Jagielski 
133*b1cdbd2cSJim Jagielski     void UpdateAllPreviews (void);
134*b1cdbd2cSJim Jagielski 
135*b1cdbd2cSJim Jagielski     // ILayoutableWindow
136*b1cdbd2cSJim Jagielski     virtual css::ui::LayoutSize GetHeightForWidth (const sal_Int32 nWidth);
137*b1cdbd2cSJim Jagielski 
138*b1cdbd2cSJim Jagielski protected:
139*b1cdbd2cSJim Jagielski     mutable ::osl::Mutex maMutex;
140*b1cdbd2cSJim Jagielski     ::boost::shared_ptr<MasterPageContainer> mpContainer;
141*b1cdbd2cSJim Jagielski 
142*b1cdbd2cSJim Jagielski     SdDrawDocument& mrDocument;
143*b1cdbd2cSJim Jagielski     bool mbSmallPreviewSize;
144*b1cdbd2cSJim Jagielski     ViewShellBase& mrBase;
145*b1cdbd2cSJim Jagielski     /** Slot that is executed as default action when the left mouse button is
146*b1cdbd2cSJim Jagielski         clicked over a master page.
147*b1cdbd2cSJim Jagielski     */
148*b1cdbd2cSJim Jagielski 	sal_uInt16 mnDefaultClickAction;
149*b1cdbd2cSJim Jagielski     /** Pages with pointers in this queue have their previews updated
150*b1cdbd2cSJim Jagielski         eventually.  Filled by InvalidatePreview() and operated upon by
151*b1cdbd2cSJim Jagielski         UpdatePreviews().
152*b1cdbd2cSJim Jagielski     */
153*b1cdbd2cSJim Jagielski     ::std::queue<sal_uInt16> maPreviewUpdateQueue;
154*b1cdbd2cSJim Jagielski 
155*b1cdbd2cSJim Jagielski     virtual SdPage* GetSelectedMasterPage (void);
156*b1cdbd2cSJim Jagielski 
157*b1cdbd2cSJim Jagielski     /** Assign the given master page to all slides of the document.
158*b1cdbd2cSJim Jagielski         @param pMasterPage
159*b1cdbd2cSJim Jagielski             The master page to assign to all slides.
160*b1cdbd2cSJim Jagielski     */
161*b1cdbd2cSJim Jagielski     void AssignMasterPageToAllSlides (SdPage* pMasterPage);
162*b1cdbd2cSJim Jagielski 
163*b1cdbd2cSJim Jagielski     /** Assign the given master page to all slides that are selected in a
164*b1cdbd2cSJim Jagielski         slide sorter that is displayed in the lef or center pane.  When both
165*b1cdbd2cSJim Jagielski         panes display a slide sorter then the one in the center pane is
166*b1cdbd2cSJim Jagielski         used.
167*b1cdbd2cSJim Jagielski     */
168*b1cdbd2cSJim Jagielski     void AssignMasterPageToSelectedSlides (SdPage* pMasterPage);
169*b1cdbd2cSJim Jagielski 
170*b1cdbd2cSJim Jagielski     virtual void AssignMasterPageToPageList (
171*b1cdbd2cSJim Jagielski         SdPage* pMasterPage,
172*b1cdbd2cSJim Jagielski         const ::sd::slidesorter::SharedPageSelection& rPageList);
173*b1cdbd2cSJim Jagielski 
174*b1cdbd2cSJim Jagielski     virtual void NotifyContainerChangeEvent (const MasterPageContainerChangeEvent& rEvent);
175*b1cdbd2cSJim Jagielski 
176*b1cdbd2cSJim Jagielski     typedef ::std::pair<int, MasterPageContainer::Token> UserData;
177*b1cdbd2cSJim Jagielski     UserData* CreateUserData (int nIndex, MasterPageContainer::Token aToken) const;
178*b1cdbd2cSJim Jagielski     UserData* GetUserData (int nIndex) const;
179*b1cdbd2cSJim Jagielski     void SetUserData (int nIndex, UserData* pData);
180*b1cdbd2cSJim Jagielski 
181*b1cdbd2cSJim Jagielski     virtual sal_Int32 GetIndexForToken (MasterPageContainer::Token aToken) const;
182*b1cdbd2cSJim Jagielski     typedef ::std::vector<MasterPageContainer::Token> ItemList;
183*b1cdbd2cSJim Jagielski     void UpdateItemList (::std::auto_ptr<ItemList> pList);
184*b1cdbd2cSJim Jagielski     void Clear (void);
185*b1cdbd2cSJim Jagielski     /** Invalidate the specified item so that on the next Fill() this item
186*b1cdbd2cSJim Jagielski         is updated.
187*b1cdbd2cSJim Jagielski     */
188*b1cdbd2cSJim Jagielski     void InvalidateItem (MasterPageContainer::Token aToken);
189*b1cdbd2cSJim Jagielski 
190*b1cdbd2cSJim Jagielski     // For every item in the ValueSet we store its associated token.  This
191*b1cdbd2cSJim Jagielski     // allows a faster access and easier change tracking.
192*b1cdbd2cSJim Jagielski     ItemList maCurrentItemList;
193*b1cdbd2cSJim Jagielski     typedef ::std::map<MasterPageContainer::Token,sal_Int32> TokenToValueSetIndex;
194*b1cdbd2cSJim Jagielski     TokenToValueSetIndex maTokenToValueSetIndex;
195*b1cdbd2cSJim Jagielski 
196*b1cdbd2cSJim Jagielski     ItemList maLockedMasterPages;
197*b1cdbd2cSJim Jagielski     /** Lock master pages in the given list and release locks that where
198*b1cdbd2cSJim Jagielski         previously aquired.
199*b1cdbd2cSJim Jagielski     */
200*b1cdbd2cSJim Jagielski     void UpdateLocks (const ItemList& rItemList);
201*b1cdbd2cSJim Jagielski 
202*b1cdbd2cSJim Jagielski     void Fill (void);
203*b1cdbd2cSJim Jagielski     virtual void Fill (ItemList& rItemList) = 0;
204*b1cdbd2cSJim Jagielski 
205*b1cdbd2cSJim Jagielski     /** Give derived classes the oportunity to provide their own context
206*b1cdbd2cSJim Jagielski         menu.  If they do then they probably have to provide their own
207*b1cdbd2cSJim Jagielski         Execute() and GetState() methods as well.
208*b1cdbd2cSJim Jagielski     */
209*b1cdbd2cSJim Jagielski     virtual ResId GetContextMenuResId (void) const;
210*b1cdbd2cSJim Jagielski 
211*b1cdbd2cSJim Jagielski     virtual void Command (const CommandEvent& rEvent);
212*b1cdbd2cSJim Jagielski 
213*b1cdbd2cSJim Jagielski     virtual void ProcessPopupMenu (Menu& rMenu);
214*b1cdbd2cSJim Jagielski     virtual void ExecuteCommand (const sal_Int32 nCommandId);
215*b1cdbd2cSJim Jagielski 
216*b1cdbd2cSJim Jagielski private:
217*b1cdbd2cSJim Jagielski     cssu::Reference<css::ui::XSidebar> mxSidebar;
218*b1cdbd2cSJim Jagielski 
219*b1cdbd2cSJim Jagielski     /** The offset between ValueSet index and MasterPageContainer::Token
220*b1cdbd2cSJim Jagielski         last seen.  This value is used heuristically to speed up the lookup
221*b1cdbd2cSJim Jagielski         of an index for a token.
222*b1cdbd2cSJim Jagielski     */
223*b1cdbd2cSJim Jagielski     DECL_LINK(ClickHandler, PreviewValueSet*);
224*b1cdbd2cSJim Jagielski     DECL_LINK(RightClickHandler, MouseEvent*);
225*b1cdbd2cSJim Jagielski     DECL_LINK(ContextMenuCallback, CommandEvent*);
226*b1cdbd2cSJim Jagielski     DECL_LINK(ContainerChangeListener, MasterPageContainerChangeEvent*);
227*b1cdbd2cSJim Jagielski     DECL_LINK(OnMenuItemSelected, Menu*);
228*b1cdbd2cSJim Jagielski 
229*b1cdbd2cSJim Jagielski     void SetItem (
230*b1cdbd2cSJim Jagielski         sal_uInt16 nIndex,
231*b1cdbd2cSJim Jagielski         MasterPageContainer::Token aToken);
232*b1cdbd2cSJim Jagielski     void AddTokenToIndexEntry (
233*b1cdbd2cSJim Jagielski         sal_uInt16 nIndex,
234*b1cdbd2cSJim Jagielski         MasterPageContainer::Token aToken);
235*b1cdbd2cSJim Jagielski     void RemoveTokenToIndexEntry (
236*b1cdbd2cSJim Jagielski         sal_uInt16 nIndex,
237*b1cdbd2cSJim Jagielski         MasterPageContainer::Token aToken);
238*b1cdbd2cSJim Jagielski };
239*b1cdbd2cSJim Jagielski 
240*b1cdbd2cSJim Jagielski } } // end of namespace sd::sidebar
241*b1cdbd2cSJim Jagielski 
242*b1cdbd2cSJim Jagielski #endif
243