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