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 23*b1cdbd2cSJim Jagielski 24*b1cdbd2cSJim Jagielski #ifndef SD_TOOL_BAR_MANAGER_HXX 25*b1cdbd2cSJim Jagielski #define SD_TOOL_BAR_MANAGER_HXX 26*b1cdbd2cSJim Jagielski 27*b1cdbd2cSJim Jagielski #include "ViewShell.hxx" 28*b1cdbd2cSJim Jagielski #include "ShellFactory.hxx" 29*b1cdbd2cSJim Jagielski #include <rtl/ustring.hxx> 30*b1cdbd2cSJim Jagielski #include <com/sun/star/frame/XFrame.hpp> 31*b1cdbd2cSJim Jagielski 32*b1cdbd2cSJim Jagielski #include <sal/types.h> 33*b1cdbd2cSJim Jagielski #include <boost/scoped_ptr.hpp> 34*b1cdbd2cSJim Jagielski #include <boost/shared_ptr.hpp> 35*b1cdbd2cSJim Jagielski #include <boost/enable_shared_from_this.hpp> 36*b1cdbd2cSJim Jagielski 37*b1cdbd2cSJim Jagielski class SdrView; 38*b1cdbd2cSJim Jagielski 39*b1cdbd2cSJim Jagielski namespace sd { namespace tools { 40*b1cdbd2cSJim Jagielski class EventMultiplexer; 41*b1cdbd2cSJim Jagielski } } 42*b1cdbd2cSJim Jagielski 43*b1cdbd2cSJim Jagielski 44*b1cdbd2cSJim Jagielski namespace sd { 45*b1cdbd2cSJim Jagielski 46*b1cdbd2cSJim Jagielski class ViewShellBase; 47*b1cdbd2cSJim Jagielski class ViewShellManager; 48*b1cdbd2cSJim Jagielski 49*b1cdbd2cSJim Jagielski /** Manage the set of visible tool bars (and object bars). Usually they 50*b1cdbd2cSJim Jagielski belong to the current view in the center pane. 51*b1cdbd2cSJim Jagielski 52*b1cdbd2cSJim Jagielski Tool bars are managed in groups. Each group can be set, reset, or 53*b1cdbd2cSJim Jagielski modified independently of the others. This allows for instance to 54*b1cdbd2cSJim Jagielski replace the toolbars associated with the current function independently 55*b1cdbd2cSJim Jagielski from those assoicated with the main view. 56*b1cdbd2cSJim Jagielski 57*b1cdbd2cSJim Jagielski The ToolBarManager has two high level methods which contain the 58*b1cdbd2cSJim Jagielski knowledge about which tool bars to show in a specific context. 59*b1cdbd2cSJim Jagielski When the view in the center pane changes then MainViewShellChanged() 60*b1cdbd2cSJim Jagielski sets up the tool bars for the new view. On changes of the selection the 61*b1cdbd2cSJim Jagielski SelectionHasChanged() method shows the tool bars for the new context. 62*b1cdbd2cSJim Jagielski 63*b1cdbd2cSJim Jagielski The update of the actually visible tool bars to the set currently 64*b1cdbd2cSJim Jagielski required by the main view shell and its functions is divided into two 65*b1cdbd2cSJim Jagielski parts, PreUpdate() and PostUpdate(). This are to be called before 66*b1cdbd2cSJim Jagielski respectively after the update of the view shell stack. The reason for 67*b1cdbd2cSJim Jagielski this is to save time by not updating tool bars that will not be visible 68*b1cdbd2cSJim Jagielski in a short time on a view shell switch. 69*b1cdbd2cSJim Jagielski */ 70*b1cdbd2cSJim Jagielski class ToolBarManager 71*b1cdbd2cSJim Jagielski : public ::boost::enable_shared_from_this<ToolBarManager> 72*b1cdbd2cSJim Jagielski { 73*b1cdbd2cSJim Jagielski public: 74*b1cdbd2cSJim Jagielski /** Use this method instead of the constructor to create new objects of 75*b1cdbd2cSJim Jagielski this class. 76*b1cdbd2cSJim Jagielski */ 77*b1cdbd2cSJim Jagielski static ::boost::shared_ptr<ToolBarManager> Create ( 78*b1cdbd2cSJim Jagielski ViewShellBase& rBase, 79*b1cdbd2cSJim Jagielski const ::boost::shared_ptr<tools::EventMultiplexer>& rpMultiplexer, 80*b1cdbd2cSJim Jagielski const ::boost::shared_ptr<ViewShellManager>& rpViewShellManager); 81*b1cdbd2cSJim Jagielski 82*b1cdbd2cSJim Jagielski ~ToolBarManager (void); 83*b1cdbd2cSJim Jagielski 84*b1cdbd2cSJim Jagielski /** Call this method prior to the destructor to prevent the 85*b1cdbd2cSJim Jagielski ToolBarManager from accessing the ViewShellManager or the 86*b1cdbd2cSJim Jagielski XLayoutManager when those are possibly not well and alive anymore 87*b1cdbd2cSJim Jagielski (like during the destruction of the ViewShellBase.) 88*b1cdbd2cSJim Jagielski */ 89*b1cdbd2cSJim Jagielski void Shutdown (void); 90*b1cdbd2cSJim Jagielski 91*b1cdbd2cSJim Jagielski /** When the view in the center pane changes then this method sets up 92*b1cdbd2cSJim Jagielski the initial set of tool bars for the new view. 93*b1cdbd2cSJim Jagielski The ToolBarManager listenes for view switching itself and then calls 94*b1cdbd2cSJim Jagielski MainViewShellChanged(). Calling this method from the outside should 95*b1cdbd2cSJim Jagielski not be necessary. 96*b1cdbd2cSJim Jagielski @param nShellType 97*b1cdbd2cSJim Jagielski The type of the new main view shell. 98*b1cdbd2cSJim Jagielski */ 99*b1cdbd2cSJim Jagielski void MainViewShellChanged (ViewShell::ShellType nShellType); 100*b1cdbd2cSJim Jagielski void MainViewShellChanged (const ViewShell& rMainViewShell); 101*b1cdbd2cSJim Jagielski 102*b1cdbd2cSJim Jagielski /** Call this method when the selection has changed to update the more 103*b1cdbd2cSJim Jagielski temporary tool bars (those in the TBG_FUNCTION group.) 104*b1cdbd2cSJim Jagielski */ 105*b1cdbd2cSJim Jagielski void SelectionHasChanged ( 106*b1cdbd2cSJim Jagielski const ViewShell& rViewShell, 107*b1cdbd2cSJim Jagielski const SdrView& rView); 108*b1cdbd2cSJim Jagielski 109*b1cdbd2cSJim Jagielski /** The set of tool bars that are handled by this manager class. 110*b1cdbd2cSJim Jagielski */ 111*b1cdbd2cSJim Jagielski const static ::rtl::OUString msToolBar; // RID_DRAW_TOOLBOX, 23011 112*b1cdbd2cSJim Jagielski // RID_GRAPHIC_TOOLBOX, 23025 113*b1cdbd2cSJim Jagielski const static ::rtl::OUString msOptionsToolBar; // RID_DRAW_OPTIONS_TOOLBOX, 23020 114*b1cdbd2cSJim Jagielski // RID_GRAPHIC_OPTIONS_TOOLBOX, 23026 115*b1cdbd2cSJim Jagielski const static ::rtl::OUString msCommonTaskToolBar; // RID_DRAW_COMMONTASK_TOOLBOX, 23021 116*b1cdbd2cSJim Jagielski const static ::rtl::OUString msViewerToolBar; // RID_DRAW_VIEWER_TOOLBOX, 23023 117*b1cdbd2cSJim Jagielski // RID_GRAPHIC_VIEWER_TOOLBOX, 23024 118*b1cdbd2cSJim Jagielski const static ::rtl::OUString msSlideSorterToolBar; // RID_SLIDE_TOOLBOX, 23012 119*b1cdbd2cSJim Jagielski const static ::rtl::OUString msSlideSorterObjectBar; // RID_SLIDE_OBJ_TOOLBOX, 23014 120*b1cdbd2cSJim Jagielski const static ::rtl::OUString msOutlineToolBar; // RID_OUTLINE_TOOLBOX, 23017 121*b1cdbd2cSJim Jagielski const static ::rtl::OUString msMasterViewToolBar; // SID_MASTERPAGE, 27053 122*b1cdbd2cSJim Jagielski const static ::rtl::OUString msDrawingObjectToolBar; // RID_DRAW_OBJ_TOOLBOX, 23013 123*b1cdbd2cSJim Jagielski const static ::rtl::OUString msGluePointsToolBar; // RID_GLUEPOINTS_TOOLBOX, 23019 124*b1cdbd2cSJim Jagielski const static ::rtl::OUString msTextObjectBar; // RID_DRAW_TEXT_TOOLBOX, 23016 125*b1cdbd2cSJim Jagielski // RID_GRAPHIC_TEXT_TOOLBOX, 23028 126*b1cdbd2cSJim Jagielski const static ::rtl::OUString msBezierObjectBar; // RID_BEZIER_TOOLBOX, 23015 127*b1cdbd2cSJim Jagielski const static ::rtl::OUString msGraphicObjectBar; // RID_DRAW_GRAF_TOOLBOX, 23030 128*b1cdbd2cSJim Jagielski const static ::rtl::OUString msMediaObjectBar; // RID_DRAW_MEDIA_TOOLBOX, 23031 129*b1cdbd2cSJim Jagielski const static ::rtl::OUString msTableObjectBar; // RID_DRAW_TABLE_TOOLBOX 130*b1cdbd2cSJim Jagielski 131*b1cdbd2cSJim Jagielski /** The set of tool bar groups. 132*b1cdbd2cSJim Jagielski */ 133*b1cdbd2cSJim Jagielski enum ToolBarGroup { 134*b1cdbd2cSJim Jagielski TBG__FIRST, 135*b1cdbd2cSJim Jagielski 136*b1cdbd2cSJim Jagielski TBG_PERMANENT = TBG__FIRST, 137*b1cdbd2cSJim Jagielski TBG_FUNCTION, 138*b1cdbd2cSJim Jagielski TBG_MASTER_MODE, 139*b1cdbd2cSJim Jagielski 140*b1cdbd2cSJim Jagielski TBG__LAST = TBG_MASTER_MODE 141*b1cdbd2cSJim Jagielski }; 142*b1cdbd2cSJim Jagielski 143*b1cdbd2cSJim Jagielski /** Reset the set of visible object bars in the specified group. Tool 144*b1cdbd2cSJim Jagielski bars in other groups are not affected. 145*b1cdbd2cSJim Jagielski @param rParentShell 146*b1cdbd2cSJim Jagielski When this shell is not the main view then the method returns 147*b1cdbd2cSJim Jagielski immediately. 148*b1cdbd2cSJim Jagielski @param eGroup 149*b1cdbd2cSJim Jagielski Only the tool bars in this group are rest. 150*b1cdbd2cSJim Jagielski */ 151*b1cdbd2cSJim Jagielski void ResetToolBars (ToolBarGroup eGroup); 152*b1cdbd2cSJim Jagielski 153*b1cdbd2cSJim Jagielski /** Reset all tool bars, regardless of the group they belong to. 154*b1cdbd2cSJim Jagielski @param rParentShell 155*b1cdbd2cSJim Jagielski When this shell is not the main view then the method returns 156*b1cdbd2cSJim Jagielski immediately. 157*b1cdbd2cSJim Jagielski */ 158*b1cdbd2cSJim Jagielski void ResetAllToolBars (void); 159*b1cdbd2cSJim Jagielski 160*b1cdbd2cSJim Jagielski /** Add the tool bar with the given name to the specified group of tool 161*b1cdbd2cSJim Jagielski bars. 162*b1cdbd2cSJim Jagielski @param rParentShell 163*b1cdbd2cSJim Jagielski When this shell is not the main view then the method returns 164*b1cdbd2cSJim Jagielski immediately. 165*b1cdbd2cSJim Jagielski @param eGroup 166*b1cdbd2cSJim Jagielski The new tool bar is added to this group. 167*b1cdbd2cSJim Jagielski @param rsToolBarName 168*b1cdbd2cSJim Jagielski The base name of the tool bar. A proper prefix (like 169*b1cdbd2cSJim Jagielski private:resource/toolbar/) is added. The name may be one of the 170*b1cdbd2cSJim Jagielski ones defined above. Other names are allowed as well. 171*b1cdbd2cSJim Jagielski */ 172*b1cdbd2cSJim Jagielski void AddToolBar ( 173*b1cdbd2cSJim Jagielski ToolBarGroup eGroup, 174*b1cdbd2cSJim Jagielski const ::rtl::OUString& rsToolBarName); 175*b1cdbd2cSJim Jagielski 176*b1cdbd2cSJim Jagielski /** Add the tool bar shell to the shell stack. This method basically 177*b1cdbd2cSJim Jagielski forwards the call to the ViewShellManager. 178*b1cdbd2cSJim Jagielski For some tool bar shells additional tool bars are made visible. 179*b1cdbd2cSJim Jagielski @param rParentShell 180*b1cdbd2cSJim Jagielski When this shell is not the main view then the method returns 181*b1cdbd2cSJim Jagielski immediately. 182*b1cdbd2cSJim Jagielski @param eGroup 183*b1cdbd2cSJim Jagielski The group is used for the actual tool bars. 184*b1cdbd2cSJim Jagielski @param nToolBarId 185*b1cdbd2cSJim Jagielski Id of the tool bar shell. 186*b1cdbd2cSJim Jagielski */ 187*b1cdbd2cSJim Jagielski void AddToolBarShell ( 188*b1cdbd2cSJim Jagielski ToolBarGroup eGroup, 189*b1cdbd2cSJim Jagielski ShellId nToolBarId); 190*b1cdbd2cSJim Jagielski 191*b1cdbd2cSJim Jagielski /** Remove the tool bar with the given name from the specified group. 192*b1cdbd2cSJim Jagielski If the tool bar is not visible then nothing happens. 193*b1cdbd2cSJim Jagielski If the tool bar is a member of another group then nothing happens 194*b1cdbd2cSJim Jagielski either. 195*b1cdbd2cSJim Jagielski */ 196*b1cdbd2cSJim Jagielski void RemoveToolBar ( 197*b1cdbd2cSJim Jagielski ToolBarGroup eGroup, 198*b1cdbd2cSJim Jagielski const ::rtl::OUString& rsToolBarName); 199*b1cdbd2cSJim Jagielski 200*b1cdbd2cSJim Jagielski /** This is basically a shortcut for ResetToolBars(),AddToolBar(). The 201*b1cdbd2cSJim Jagielski main difference is, that all sub shells of the specified parent 202*b1cdbd2cSJim Jagielski shell are deactivated as well. 203*b1cdbd2cSJim Jagielski @param rParentShell 204*b1cdbd2cSJim Jagielski When this shell is not the main view then the method returns 205*b1cdbd2cSJim Jagielski immediately. 206*b1cdbd2cSJim Jagielski @param eGroup 207*b1cdbd2cSJim Jagielski The new tool bar is added to this group. 208*b1cdbd2cSJim Jagielski @param rsToolBarName 209*b1cdbd2cSJim Jagielski The base name of the tool bar. A proper prefix (like 210*b1cdbd2cSJim Jagielski private:resource/toolbar/) is added. The name may be one of the 211*b1cdbd2cSJim Jagielski ones defined above. Other names are allowed as well. 212*b1cdbd2cSJim Jagielski */ 213*b1cdbd2cSJim Jagielski void SetToolBar ( 214*b1cdbd2cSJim Jagielski ToolBarGroup eGroup, 215*b1cdbd2cSJim Jagielski const ::rtl::OUString& rsToolBarName); 216*b1cdbd2cSJim Jagielski 217*b1cdbd2cSJim Jagielski /** This is basically a shortcut for ResetToolBars(),AddToolBar(). The 218*b1cdbd2cSJim Jagielski main difference is, that all sub shells of the specified parent 219*b1cdbd2cSJim Jagielski shell are deactivated as well. 220*b1cdbd2cSJim Jagielski @param rParentShell 221*b1cdbd2cSJim Jagielski When this shell is not the main view then the method returns 222*b1cdbd2cSJim Jagielski immediately. 223*b1cdbd2cSJim Jagielski @param rParentShell 224*b1cdbd2cSJim Jagielski When this shell is not the main view then the method returns 225*b1cdbd2cSJim Jagielski immediately. 226*b1cdbd2cSJim Jagielski @param eGroup 227*b1cdbd2cSJim Jagielski The group is currently not used. 228*b1cdbd2cSJim Jagielski @param nToolBarId 229*b1cdbd2cSJim Jagielski Id of the tool bar shell. 230*b1cdbd2cSJim Jagielski */ 231*b1cdbd2cSJim Jagielski void SetToolBarShell ( 232*b1cdbd2cSJim Jagielski ToolBarGroup eGroup, 233*b1cdbd2cSJim Jagielski ShellId nToolBarId); 234*b1cdbd2cSJim Jagielski 235*b1cdbd2cSJim Jagielski void PreUpdate (void); 236*b1cdbd2cSJim Jagielski 237*b1cdbd2cSJim Jagielski /** Request an update of the active tool bars. The update is made 238*b1cdbd2cSJim Jagielski asynchronously. 239*b1cdbd2cSJim Jagielski */ 240*b1cdbd2cSJim Jagielski void RequestUpdate (void); 241*b1cdbd2cSJim Jagielski 242*b1cdbd2cSJim Jagielski /** This is a hint for the ToolBarManager to improve the performance 243*b1cdbd2cSJim Jagielski when it updates its tool bars when its own lock is released. Taking 244*b1cdbd2cSJim Jagielski control of the release of the update lock of the ViewShellManager 245*b1cdbd2cSJim Jagielski avoids some shell stack modifications and tool bar updates. 246*b1cdbd2cSJim Jagielski */ 247*b1cdbd2cSJim Jagielski void LockViewShellManager (void); 248*b1cdbd2cSJim Jagielski 249*b1cdbd2cSJim Jagielski /** Use this class to prevent the visible tool bars from being updated 250*b1cdbd2cSJim Jagielski (and thus causing repaints and GUI rearrangements) when several tool 251*b1cdbd2cSJim Jagielski bar operations are made in a row. 252*b1cdbd2cSJim Jagielski */ 253*b1cdbd2cSJim Jagielski class UpdateLock { public: UpdateLock(const::boost::shared_ptr<ToolBarManager> & rpManager)254*b1cdbd2cSJim Jagielski UpdateLock(const ::boost::shared_ptr<ToolBarManager>& rpManager) 255*b1cdbd2cSJim Jagielski : mpManager(rpManager) { mpManager->LockUpdate(); } ~UpdateLock(void)256*b1cdbd2cSJim Jagielski ~UpdateLock(void) { mpManager->UnlockUpdate(); } 257*b1cdbd2cSJim Jagielski private: 258*b1cdbd2cSJim Jagielski ::boost::shared_ptr<ToolBarManager> mpManager; 259*b1cdbd2cSJim Jagielski }; 260*b1cdbd2cSJim Jagielski friend class UpdateLock; 261*b1cdbd2cSJim Jagielski 262*b1cdbd2cSJim Jagielski void ToolBarsDestroyed(void); 263*b1cdbd2cSJim Jagielski 264*b1cdbd2cSJim Jagielski private: 265*b1cdbd2cSJim Jagielski class Implementation; 266*b1cdbd2cSJim Jagielski ::boost::scoped_ptr<Implementation> mpImpl; 267*b1cdbd2cSJim Jagielski 268*b1cdbd2cSJim Jagielski /** The ViewShellBase is used to get the XLayoutManager and to determine 269*b1cdbd2cSJim Jagielski the plug in mode. 270*b1cdbd2cSJim Jagielski */ 271*b1cdbd2cSJim Jagielski ToolBarManager (void); 272*b1cdbd2cSJim Jagielski 273*b1cdbd2cSJim Jagielski void LockUpdate (void); 274*b1cdbd2cSJim Jagielski void UnlockUpdate (void); 275*b1cdbd2cSJim Jagielski }; 276*b1cdbd2cSJim Jagielski 277*b1cdbd2cSJim Jagielski } // end of namespace sd 278*b1cdbd2cSJim Jagielski 279*b1cdbd2cSJim Jagielski #endif 280