xref: /trunk/main/sd/source/ui/view/ToolBarManager.cxx (revision c809b0d3)
15b190011SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
35b190011SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
45b190011SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
55b190011SAndrew Rist  * distributed with this work for additional information
65b190011SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
75b190011SAndrew Rist  * to you under the Apache License, Version 2.0 (the
85b190011SAndrew Rist  * "License"); you may not use this file except in compliance
95b190011SAndrew Rist  * with the License.  You may obtain a copy of the License at
105b190011SAndrew Rist  *
115b190011SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
125b190011SAndrew Rist  *
135b190011SAndrew Rist  * Unless required by applicable law or agreed to in writing,
145b190011SAndrew Rist  * software distributed under the License is distributed on an
155b190011SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
165b190011SAndrew Rist  * KIND, either express or implied.  See the License for the
175b190011SAndrew Rist  * specific language governing permissions and limitations
185b190011SAndrew Rist  * under the License.
195b190011SAndrew Rist  *
205b190011SAndrew Rist  *************************************************************/
215b190011SAndrew Rist 
225b190011SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_sd.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir #include "ToolBarManager.hxx"
28cdf0e10cSrcweir 
29cdf0e10cSrcweir #include "DrawViewShell.hxx"
30cdf0e10cSrcweir #include "EventMultiplexer.hxx"
31cdf0e10cSrcweir #include "ViewShellBase.hxx"
32cdf0e10cSrcweir #include "ViewShellManager.hxx"
33cdf0e10cSrcweir #include <com/sun/star/beans/XPropertySet.hpp>
34cdf0e10cSrcweir #include <com/sun/star/frame/XLayoutManager.hpp>
35cdf0e10cSrcweir #include <com/sun/star/ui/UIElementType.hpp>
36cdf0e10cSrcweir 
37cdf0e10cSrcweir #include <cppuhelper/implbase1.hxx>
38cdf0e10cSrcweir #include <osl/mutex.hxx>
39cdf0e10cSrcweir #include <rtl/ref.hxx>
40cdf0e10cSrcweir #include <sfx2/app.hxx>
41cdf0e10cSrcweir #include <sfx2/docfile.hxx>
42cdf0e10cSrcweir #include <sfx2/objsh.hxx>
43cdf0e10cSrcweir #include <sfx2/request.hxx>
44cdf0e10cSrcweir #include <sfx2/viewfrm.hxx>
45cdf0e10cSrcweir #include <svl/eitem.hxx>
46cdf0e10cSrcweir #include <svx/dialogs.hrc>
47cdf0e10cSrcweir #include <svx/extrusionbar.hxx>
48cdf0e10cSrcweir #include <svx/fontworkbar.hxx>
49cdf0e10cSrcweir #ifndef _TOOLKIT_HELPER_VCLUNOHELPER_HXX_
50b63233d8Sdamjan #include <toolkit/helper/vclunohelper.hxx>
51cdf0e10cSrcweir #endif
52cdf0e10cSrcweir #include <tools/link.hxx>
53cdf0e10cSrcweir 
54cdf0e10cSrcweir #include <map>
55cdf0e10cSrcweir #include <vector>
56cdf0e10cSrcweir 
57cdf0e10cSrcweir using namespace ::com::sun::star;
58cdf0e10cSrcweir using namespace ::com::sun::star::uno;
59cdf0e10cSrcweir 
60cdf0e10cSrcweir #undef VERBOSE
61cdf0e10cSrcweir 
62cdf0e10cSrcweir #undef OUSTRING // Remove definition made in the SFX
63cdf0e10cSrcweir #define OUSTRING(s) (::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(s)))
64cdf0e10cSrcweir 
65cdf0e10cSrcweir namespace {
66cdf0e10cSrcweir 
67cdf0e10cSrcweir using namespace sd;
68cdf0e10cSrcweir 
69cdf0e10cSrcweir class ToolBarRules;
70cdf0e10cSrcweir 
71cdf0e10cSrcweir /** Lock of the frame::XLayoutManager.
72cdf0e10cSrcweir */
73cdf0e10cSrcweir class LayouterLock
74cdf0e10cSrcweir {
75cdf0e10cSrcweir public:
76cdf0e10cSrcweir     LayouterLock (const Reference<frame::XLayoutManager>& rxLayouter);
77cdf0e10cSrcweir     ~LayouterLock (void);
78cdf0e10cSrcweir private:
79cdf0e10cSrcweir     Reference<frame::XLayoutManager> mxLayouter;
80cdf0e10cSrcweir };
81cdf0e10cSrcweir 
82cdf0e10cSrcweir 
83cdf0e10cSrcweir typedef ::std::vector<rtl::OUString> NameList;
84cdf0e10cSrcweir 
85cdf0e10cSrcweir /** Store a list of tool bars for each of the tool bar groups.  From
86cdf0e10cSrcweir     this the list of requested tool bars is built.
87cdf0e10cSrcweir */
88cdf0e10cSrcweir class ToolBarList
89cdf0e10cSrcweir {
90cdf0e10cSrcweir public:
91cdf0e10cSrcweir     ToolBarList (void);
92cdf0e10cSrcweir 
93cdf0e10cSrcweir     void ClearGroup (sd::ToolBarManager::ToolBarGroup eGroup);
94cdf0e10cSrcweir     void AddToolBar (sd::ToolBarManager::ToolBarGroup eGroup, const ::rtl::OUString& rsName);
95cdf0e10cSrcweir     bool RemoveToolBar (sd::ToolBarManager::ToolBarGroup eGroup, const ::rtl::OUString& rsName);
96cdf0e10cSrcweir 
97cdf0e10cSrcweir     void GetToolBarsToActivate (NameList& rToolBars) const;
98cdf0e10cSrcweir     void GetToolBarsToDeactivate (NameList& rToolBars) const;
99cdf0e10cSrcweir 
100cdf0e10cSrcweir     void MarkToolBarAsActive (const ::rtl::OUString& rsName);
101cdf0e10cSrcweir     void MarkToolBarAsNotActive (const ::rtl::OUString& rsName);
102cdf0e10cSrcweir     void MarkAllToolBarsAsNotActive (void);
103cdf0e10cSrcweir 
104cdf0e10cSrcweir private:
105cdf0e10cSrcweir     typedef ::std::map<sd::ToolBarManager::ToolBarGroup,NameList> Groups;
106cdf0e10cSrcweir     Groups maGroups;
107cdf0e10cSrcweir     NameList maActiveToolBars;
108cdf0e10cSrcweir 
109cdf0e10cSrcweir     void MakeRequestedToolBarList (NameList& rToolBars) const;
110cdf0e10cSrcweir };
111cdf0e10cSrcweir 
112cdf0e10cSrcweir 
113cdf0e10cSrcweir 
114cdf0e10cSrcweir 
115cdf0e10cSrcweir /** Manage tool bars that are implemented as sub shells of a view shell.
116cdf0e10cSrcweir     The typical procedure of updating the sub shells of a view shell is to
117cdf0e10cSrcweir     rebuild a list of sub shells that the caller would like to have active.
118cdf0e10cSrcweir     The methods ClearGroup() and AddShellId() allow the caller to do that.  A
119cdf0e10cSrcweir     final call to UpdateShells() activates the requested shells that are not
120cdf0e10cSrcweir     active and deactivates the active shells that are not requested .
121cdf0e10cSrcweir 
122cdf0e10cSrcweir     This is done by maintaining two lists.  One (the current list)
123cdf0e10cSrcweir     reflects the current state.  The other (the requested list) contains the
124cdf0e10cSrcweir     currently requested shells.  UpdateShells() makes the requested
125cdf0e10cSrcweir     list the current list and clears the current list.
126cdf0e10cSrcweir 
127cdf0e10cSrcweir     Each shell belongs to one group.  Different groups can be modified
12886e1cf34SPedro Giffuni     separately.
129cdf0e10cSrcweir */
130cdf0e10cSrcweir class ToolBarShellList
131cdf0e10cSrcweir {
132cdf0e10cSrcweir public:
133cdf0e10cSrcweir     /** Create a new object with an empty current list and an empty
134cdf0e10cSrcweir         requested list.
135cdf0e10cSrcweir     */
136cdf0e10cSrcweir     ToolBarShellList (void);
137cdf0e10cSrcweir 
138cdf0e10cSrcweir     /** Remove all shells from a group.  Calling this method should normally
139cdf0e10cSrcweir         not be necessary because after the construction or after a call to
140cdf0e10cSrcweir         UpdateShells() the requested list is empty.
141cdf0e10cSrcweir         @param eGroup
142cdf0e10cSrcweir             The group to clear. Shells in other groups are not modified.
143cdf0e10cSrcweir     */
144cdf0e10cSrcweir     void ClearGroup (sd::ToolBarManager::ToolBarGroup eGroup);
145cdf0e10cSrcweir 
146cdf0e10cSrcweir     /** Add a shell.  When the specified shell has alreadt been requested
147cdf0e10cSrcweir         for another group then it is moved to this group.
148cdf0e10cSrcweir         @param eGroup
149cdf0e10cSrcweir             The group to which to add the shell.
150cdf0e10cSrcweir         @param nId
151cdf0e10cSrcweir             The id of the shell to add.
152cdf0e10cSrcweir     */
153cdf0e10cSrcweir     void AddShellId (sd::ToolBarManager::ToolBarGroup eGroup, sd::ShellId nId);
154cdf0e10cSrcweir 
155cdf0e10cSrcweir     /** Releasing all shells means that the given ToolBarRules object is
156cdf0e10cSrcweir         informed that every shell mananged by the called ToolBarShellList is
157cdf0e10cSrcweir         about to be removed and that the associated framework tool bars can
158cdf0e10cSrcweir         be removed as well.  The caller still has to call UpdateShells().
159cdf0e10cSrcweir     */
160cdf0e10cSrcweir     void ReleaseAllShells (ToolBarRules& rRules);
161cdf0e10cSrcweir 
162cdf0e10cSrcweir     /** The requested list is made the current list by activating  all
163cdf0e10cSrcweir         shells in the requested list and by deactivating the shells in the
164cdf0e10cSrcweir         current list that are not in the requested list.
165cdf0e10cSrcweir         @param pMainViewShell
166cdf0e10cSrcweir             The shells that are activated or deactivated are sub shells of
167cdf0e10cSrcweir             this view shell.
168cdf0e10cSrcweir         @param rManager
169cdf0e10cSrcweir             This ViewShellManager is used to activate or deactivate shells.
170cdf0e10cSrcweir     */
171cdf0e10cSrcweir     void UpdateShells (
172cdf0e10cSrcweir         const ::boost::shared_ptr<ViewShell>& rpMainViewShell,
173cdf0e10cSrcweir         const ::boost::shared_ptr<ViewShellManager>& rpManager);
174cdf0e10cSrcweir 
175cdf0e10cSrcweir private:
176cdf0e10cSrcweir     class ShellDescriptor
177cdf0e10cSrcweir     {public:
178cdf0e10cSrcweir         ShellDescriptor (ShellId nId,sd::ToolBarManager::ToolBarGroup eGroup);
179cdf0e10cSrcweir         ShellId mnId;
180cdf0e10cSrcweir         sd::ToolBarManager::ToolBarGroup meGroup;
operator <(const ShellDescriptor & r1,const ShellDescriptor & r2)181cdf0e10cSrcweir         friend bool operator<(const ShellDescriptor& r1, const ShellDescriptor& r2)
182cdf0e10cSrcweir         { return r1.mnId < r2.mnId; }
183cdf0e10cSrcweir     };
184cdf0e10cSrcweir 
185cdf0e10cSrcweir     /** The requested list of tool bar shells that will be active after the
186cdf0e10cSrcweir         next call to UpdateShells().
187cdf0e10cSrcweir     */
188cdf0e10cSrcweir     typedef ::std::set<ShellDescriptor> GroupedShellList;
189cdf0e10cSrcweir     GroupedShellList maNewList;
190cdf0e10cSrcweir 
191cdf0e10cSrcweir     /** The list of tool bar shells that are currently on the shell stack.
192cdf0e10cSrcweir         Using a GroupedShellList is not strictly necessary but it makes
193cdf0e10cSrcweir         things easier and does not waste too much memory.
194cdf0e10cSrcweir     */
195cdf0e10cSrcweir     GroupedShellList maCurrentList;
196cdf0e10cSrcweir };
197cdf0e10cSrcweir 
198cdf0e10cSrcweir 
199cdf0e10cSrcweir 
200cdf0e10cSrcweir 
201cdf0e10cSrcweir /** This class concentrates the knowledge about when to show what tool bars
202cdf0e10cSrcweir     in one place.
203cdf0e10cSrcweir */
204cdf0e10cSrcweir class ToolBarRules
205cdf0e10cSrcweir {
206cdf0e10cSrcweir public:
207cdf0e10cSrcweir     ToolBarRules (
208cdf0e10cSrcweir         const ::boost::shared_ptr<ToolBarManager>& rpToolBarManager,
209cdf0e10cSrcweir         const ::boost::shared_ptr<ViewShellManager>& rpViewShellManager);
210cdf0e10cSrcweir 
211cdf0e10cSrcweir     /** This method calls MainViewShellChanged() and SelectionHasChanged()
212cdf0e10cSrcweir         for the current main view shell and its view.
213cdf0e10cSrcweir     */
214cdf0e10cSrcweir     void Update (ViewShellBase& rBase);
215cdf0e10cSrcweir 
216cdf0e10cSrcweir     /** Reset all tool bars in all groups and add tool bars and tool bar
217cdf0e10cSrcweir         shells to the TBG_PERMANENT group for the specified ViewShell type.
218cdf0e10cSrcweir     */
219cdf0e10cSrcweir     void MainViewShellChanged (ViewShell::ShellType nShellType);
220cdf0e10cSrcweir 
221cdf0e10cSrcweir     /** Reset all tool bars in all groups and add tool bars and tool bar
222cdf0e10cSrcweir         shells to the TBG_PERMANENT group for the specified ViewShell.
223cdf0e10cSrcweir     */
224cdf0e10cSrcweir     void MainViewShellChanged (const ViewShell& rMainViewShell);
225cdf0e10cSrcweir 
226cdf0e10cSrcweir     /** Reset all tool bars in the TBG_FUNCTION group and add tool bars and tool bar
227cdf0e10cSrcweir         shells to this group for the current selection.
228cdf0e10cSrcweir     */
229cdf0e10cSrcweir     void SelectionHasChanged (
230cdf0e10cSrcweir         const ::sd::ViewShell& rViewShell,
231cdf0e10cSrcweir         const SdrView& rView);
232cdf0e10cSrcweir 
233cdf0e10cSrcweir     /** Add a tool bar for the specified tool bar shell.
234cdf0e10cSrcweir     */
235cdf0e10cSrcweir     void SubShellAdded (
236cdf0e10cSrcweir         ::sd::ToolBarManager::ToolBarGroup eGroup,
237cdf0e10cSrcweir         sd::ShellId nShellId);
238cdf0e10cSrcweir 
239cdf0e10cSrcweir     /** Remove a tool bar for the specified tool bar shell.
240cdf0e10cSrcweir     */
241cdf0e10cSrcweir     void SubShellRemoved (
242cdf0e10cSrcweir         ::sd::ToolBarManager::ToolBarGroup eGroup,
243cdf0e10cSrcweir         sd::ShellId nShellId);
244cdf0e10cSrcweir 
245cdf0e10cSrcweir private:
246cdf0e10cSrcweir     ::boost::shared_ptr<ToolBarManager> mpToolBarManager;
247cdf0e10cSrcweir     ::boost::shared_ptr<ViewShellManager> mpViewShellManager;
248cdf0e10cSrcweir };
249cdf0e10cSrcweir 
250cdf0e10cSrcweir } // end of anonymous namespace
251cdf0e10cSrcweir 
252cdf0e10cSrcweir 
253cdf0e10cSrcweir 
254cdf0e10cSrcweir 
255cdf0e10cSrcweir namespace sd {
256cdf0e10cSrcweir 
257cdf0e10cSrcweir //===== ToolBarManager::Implementation ========================================
258cdf0e10cSrcweir 
259cdf0e10cSrcweir class ToolBarManager::Implementation
260cdf0e10cSrcweir {
261cdf0e10cSrcweir public:
262cdf0e10cSrcweir     /** This constructor takes three arguments even though the
263cdf0e10cSrcweir         ToolBarManager could be taken from the ViewShellBase.  This is so to
264cdf0e10cSrcweir         state explicitly which information has to be present when this
265cdf0e10cSrcweir         constructor is called.  The ViewShellBase may not have been fully
266cdf0e10cSrcweir         initialized at this point and must not be asked for this values.
267cdf0e10cSrcweir     */
268cdf0e10cSrcweir     Implementation (
269cdf0e10cSrcweir         ViewShellBase& rBase,
270cdf0e10cSrcweir         const ::boost::shared_ptr<sd::tools::EventMultiplexer>& rpMultiplexer,
271cdf0e10cSrcweir         const ::boost::shared_ptr<ViewShellManager>& rpViewShellManager,
272cdf0e10cSrcweir         const ::boost::shared_ptr<ToolBarManager>& rpToolBarManager);
273cdf0e10cSrcweir     ~Implementation (void);
274cdf0e10cSrcweir 
275cdf0e10cSrcweir     void SetValid (bool bValid);
276cdf0e10cSrcweir 
277cdf0e10cSrcweir     void ResetToolBars (ToolBarGroup eGroup);
278cdf0e10cSrcweir     void ResetAllToolBars (void);
279cdf0e10cSrcweir     void AddToolBar (ToolBarGroup eGroup, const ::rtl::OUString& rsToolBarName);
280cdf0e10cSrcweir     void AddToolBarShell (ToolBarGroup eGroup, ShellId nToolBarId);
281cdf0e10cSrcweir     void RemoveToolBar (ToolBarGroup eGroup, const ::rtl::OUString& rsToolBarName);
282cdf0e10cSrcweir 
283cdf0e10cSrcweir     /** Release all tool bar shells and the associated framework tool bars.
284cdf0e10cSrcweir         Typically called when the main view shell is being replaced by
285cdf0e10cSrcweir         another, all tool bar shells are released.  In that process the
286*c809b0d3SJohn Bampton         shells are destroyed anyway and without calling this method they
287cdf0e10cSrcweir         would still be referenced.
288cdf0e10cSrcweir     */
289cdf0e10cSrcweir     void ReleaseAllToolBarShells (void);
290cdf0e10cSrcweir 
291cdf0e10cSrcweir     void ToolBarsDestroyed(void);
292cdf0e10cSrcweir 
293cdf0e10cSrcweir     void RequestUpdate (void);
294cdf0e10cSrcweir 
295cdf0e10cSrcweir     void PreUpdate (void);
296cdf0e10cSrcweir     void PostUpdate (void);
297cdf0e10cSrcweir     /** Tell the XLayoutManager about the tool bars that we would like to be
298cdf0e10cSrcweir         shown.
299cdf0e10cSrcweir         @param rpLayouterLock
300cdf0e10cSrcweir             This typically is the mpSynchronousLayouterLock that is used in
301cdf0e10cSrcweir             this method and that is either released at its end or assigned
302cdf0e10cSrcweir             to mpAsynchronousLock in order to be unlocked later.
303cdf0e10cSrcweir     */
304cdf0e10cSrcweir     void Update (::std::auto_ptr<LayouterLock> pLayouterLock);
305cdf0e10cSrcweir 
306cdf0e10cSrcweir     class UpdateLockImplementation
307cdf0e10cSrcweir     {
308cdf0e10cSrcweir     public:
UpdateLockImplementation(Implementation & rImplementation)309cdf0e10cSrcweir         UpdateLockImplementation (Implementation& rImplementation)
310cdf0e10cSrcweir             : mrImplementation(rImplementation) { mrImplementation.LockUpdate();  }
~UpdateLockImplementation(void)311cdf0e10cSrcweir         ~UpdateLockImplementation (void) { mrImplementation.UnlockUpdate(); }
312cdf0e10cSrcweir     private:
313cdf0e10cSrcweir         Implementation& mrImplementation;
314cdf0e10cSrcweir     };
315cdf0e10cSrcweir 
316cdf0e10cSrcweir     void LockViewShellManager (void);
317cdf0e10cSrcweir     void LockUpdate (void);
318cdf0e10cSrcweir     void UnlockUpdate (void);
319cdf0e10cSrcweir 
320cdf0e10cSrcweir     ToolBarRules& GetToolBarRules (void);
321cdf0e10cSrcweir 
322cdf0e10cSrcweir private:
323cdf0e10cSrcweir     const static ::rtl::OUString msToolBarResourcePrefix;
324cdf0e10cSrcweir 
325cdf0e10cSrcweir     mutable ::osl::Mutex maMutex;
326cdf0e10cSrcweir     ViewShellBase& mrBase;
327cdf0e10cSrcweir     ::boost::shared_ptr<sd::tools::EventMultiplexer> mpEventMultiplexer;
328cdf0e10cSrcweir     bool mbIsValid;
329cdf0e10cSrcweir     ToolBarList maToolBarList;
330cdf0e10cSrcweir     ToolBarShellList maToolBarShellList;
331cdf0e10cSrcweir     Reference<frame::XLayoutManager> mxLayouter;
332cdf0e10cSrcweir     sal_Int32 mnLockCount;
333cdf0e10cSrcweir     bool mbPreUpdatePending;
334cdf0e10cSrcweir     bool mbPostUpdatePending;
335cdf0e10cSrcweir     /** The layouter locks manage the locking of the XLayoutManager.  The
336cdf0e10cSrcweir         lock() and unlock() functions are not called directly because the
337cdf0e10cSrcweir         (final) unlocking  is usually done asynchronously *after* the
338cdf0e10cSrcweir         list of requested toolbars is updated.
339cdf0e10cSrcweir     */
340cdf0e10cSrcweir     ::std::auto_ptr<LayouterLock> mpSynchronousLayouterLock;
341cdf0e10cSrcweir     ::std::auto_ptr<LayouterLock> mpAsynchronousLayouterLock;
342cdf0e10cSrcweir     ::std::auto_ptr<ViewShellManager::UpdateLock> mpViewShellManagerLock;
343cdf0e10cSrcweir     sal_uLong mnPendingUpdateCall;
344cdf0e10cSrcweir     sal_uLong mnPendingSetValidCall;
345cdf0e10cSrcweir     ToolBarRules maToolBarRules;
346cdf0e10cSrcweir 
347cdf0e10cSrcweir     ::rtl::OUString GetToolBarResourceName (const ::rtl::OUString& rsBaseName) const;
348cdf0e10cSrcweir     bool CheckPlugInMode (const ::rtl::OUString& rsName) const;
349cdf0e10cSrcweir 
350cdf0e10cSrcweir     DECL_LINK(UpdateCallback,bool*);
351cdf0e10cSrcweir     DECL_LINK(EventMultiplexerCallback, sd::tools::EventMultiplexerEvent*);
352cdf0e10cSrcweir     DECL_LINK(SetValidCallback,void*);
353cdf0e10cSrcweir };
354cdf0e10cSrcweir 
355cdf0e10cSrcweir 
356cdf0e10cSrcweir 
357cdf0e10cSrcweir //===== ToolBarManager ========================================================
358cdf0e10cSrcweir 
359cdf0e10cSrcweir const ::rtl::OUString ToolBarManager::msToolBar(OUSTRING("toolbar"));
360cdf0e10cSrcweir const ::rtl::OUString ToolBarManager::msOptionsToolBar(OUSTRING("optionsbar"));
361cdf0e10cSrcweir const ::rtl::OUString ToolBarManager::msCommonTaskToolBar(OUSTRING("commontaskbar"));
362cdf0e10cSrcweir const ::rtl::OUString ToolBarManager::msViewerToolBar(OUSTRING("viewerbar"));
363cdf0e10cSrcweir const ::rtl::OUString ToolBarManager::msSlideSorterToolBar(OUSTRING("slideviewtoolbar"));
364cdf0e10cSrcweir const ::rtl::OUString ToolBarManager::msSlideSorterObjectBar(OUSTRING("slideviewobjectbar"));
365cdf0e10cSrcweir const ::rtl::OUString ToolBarManager::msOutlineToolBar(OUSTRING("outlinetoolbar"));
366cdf0e10cSrcweir const ::rtl::OUString ToolBarManager::msMasterViewToolBar(OUSTRING("masterviewtoolbar"));
367cdf0e10cSrcweir const ::rtl::OUString ToolBarManager::msDrawingObjectToolBar(OUSTRING("drawingobjectbar"));
368cdf0e10cSrcweir const ::rtl::OUString ToolBarManager::msGluePointsToolBar(OUSTRING("gluepointsobjectbar"));
369cdf0e10cSrcweir const ::rtl::OUString ToolBarManager::msTextObjectBar(OUSTRING("textobjectbar"));
370cdf0e10cSrcweir const ::rtl::OUString ToolBarManager::msBezierObjectBar(OUSTRING("bezierobjectbar"));
371cdf0e10cSrcweir const ::rtl::OUString ToolBarManager::msGraphicObjectBar(OUSTRING("graphicobjectbar"));
372cdf0e10cSrcweir const ::rtl::OUString ToolBarManager::msMediaObjectBar(OUSTRING("mediaobjectbar"));
373cdf0e10cSrcweir const ::rtl::OUString ToolBarManager::msTableObjectBar(OUSTRING("tableobjectbar"));
374cdf0e10cSrcweir 
375cdf0e10cSrcweir 
Create(ViewShellBase & rBase,const::boost::shared_ptr<sd::tools::EventMultiplexer> & rpMultiplexer,const::boost::shared_ptr<ViewShellManager> & rpViewShellManager)376cdf0e10cSrcweir ::boost::shared_ptr<ToolBarManager> ToolBarManager::Create (
377cdf0e10cSrcweir     ViewShellBase& rBase,
378cdf0e10cSrcweir     const ::boost::shared_ptr<sd::tools::EventMultiplexer>& rpMultiplexer,
379cdf0e10cSrcweir     const ::boost::shared_ptr<ViewShellManager>& rpViewShellManager)
380cdf0e10cSrcweir {
381cdf0e10cSrcweir     ::boost::shared_ptr<ToolBarManager> pManager (new ToolBarManager());
382cdf0e10cSrcweir     pManager->mpImpl.reset(
383cdf0e10cSrcweir         new Implementation(rBase,rpMultiplexer,rpViewShellManager,pManager));
384cdf0e10cSrcweir     return pManager;
385cdf0e10cSrcweir }
386cdf0e10cSrcweir 
387cdf0e10cSrcweir 
388cdf0e10cSrcweir 
389cdf0e10cSrcweir 
ToolBarManager(void)390cdf0e10cSrcweir ToolBarManager::ToolBarManager (void)
391cdf0e10cSrcweir         : mpImpl()
392cdf0e10cSrcweir {
393cdf0e10cSrcweir }
394cdf0e10cSrcweir 
395cdf0e10cSrcweir 
396cdf0e10cSrcweir 
397cdf0e10cSrcweir 
~ToolBarManager(void)398cdf0e10cSrcweir ToolBarManager::~ToolBarManager (void)
399cdf0e10cSrcweir {
400cdf0e10cSrcweir }
401cdf0e10cSrcweir 
402cdf0e10cSrcweir 
403cdf0e10cSrcweir 
404cdf0e10cSrcweir 
Shutdown(void)405cdf0e10cSrcweir void ToolBarManager::Shutdown (void)
406cdf0e10cSrcweir {
407cdf0e10cSrcweir     if (mpImpl.get() != NULL)
408cdf0e10cSrcweir         mpImpl.reset();
409cdf0e10cSrcweir }
410cdf0e10cSrcweir 
411cdf0e10cSrcweir 
412cdf0e10cSrcweir 
413cdf0e10cSrcweir 
ResetToolBars(ToolBarGroup eGroup)414cdf0e10cSrcweir void ToolBarManager::ResetToolBars (ToolBarGroup eGroup)
415cdf0e10cSrcweir {
416cdf0e10cSrcweir     if (mpImpl.get() != NULL)
417cdf0e10cSrcweir     {
418cdf0e10cSrcweir         UpdateLock aLock (shared_from_this());
419cdf0e10cSrcweir         mpImpl->ResetToolBars(eGroup);
420cdf0e10cSrcweir     }
421cdf0e10cSrcweir }
422cdf0e10cSrcweir 
423cdf0e10cSrcweir 
424cdf0e10cSrcweir 
425cdf0e10cSrcweir 
ResetAllToolBars(void)426cdf0e10cSrcweir void ToolBarManager::ResetAllToolBars (void)
427cdf0e10cSrcweir {
428cdf0e10cSrcweir     if (mpImpl.get() != NULL)
429cdf0e10cSrcweir     {
430cdf0e10cSrcweir         UpdateLock aLock (shared_from_this());
431cdf0e10cSrcweir         mpImpl->ResetAllToolBars();
432cdf0e10cSrcweir     }
433cdf0e10cSrcweir }
434cdf0e10cSrcweir 
435cdf0e10cSrcweir 
436cdf0e10cSrcweir 
437cdf0e10cSrcweir 
AddToolBar(ToolBarGroup eGroup,const::rtl::OUString & rsToolBarName)438cdf0e10cSrcweir void ToolBarManager::AddToolBar (
439cdf0e10cSrcweir     ToolBarGroup eGroup,
440cdf0e10cSrcweir     const ::rtl::OUString& rsToolBarName)
441cdf0e10cSrcweir {
442cdf0e10cSrcweir     if (mpImpl.get() != NULL)
443cdf0e10cSrcweir     {
444cdf0e10cSrcweir         UpdateLock aLock (shared_from_this());
445cdf0e10cSrcweir         mpImpl->AddToolBar(eGroup,rsToolBarName);
446cdf0e10cSrcweir     }
447cdf0e10cSrcweir }
448cdf0e10cSrcweir 
449cdf0e10cSrcweir 
450cdf0e10cSrcweir 
451cdf0e10cSrcweir 
AddToolBarShell(ToolBarGroup eGroup,ShellId nToolBarId)452cdf0e10cSrcweir void ToolBarManager::AddToolBarShell (
453cdf0e10cSrcweir     ToolBarGroup eGroup,
454cdf0e10cSrcweir     ShellId nToolBarId)
455cdf0e10cSrcweir {
456cdf0e10cSrcweir     if (mpImpl.get() != NULL)
457cdf0e10cSrcweir     {
458cdf0e10cSrcweir         UpdateLock aLock (shared_from_this());
459cdf0e10cSrcweir         mpImpl->AddToolBarShell(eGroup,nToolBarId);
460cdf0e10cSrcweir     }
461cdf0e10cSrcweir }
462cdf0e10cSrcweir 
463cdf0e10cSrcweir 
464cdf0e10cSrcweir 
465cdf0e10cSrcweir 
RemoveToolBar(ToolBarGroup eGroup,const::rtl::OUString & rsToolBarName)466cdf0e10cSrcweir void ToolBarManager::RemoveToolBar (
467cdf0e10cSrcweir     ToolBarGroup eGroup,
468cdf0e10cSrcweir     const ::rtl::OUString& rsToolBarName)
469cdf0e10cSrcweir {
470cdf0e10cSrcweir     if (mpImpl.get() != NULL)
471cdf0e10cSrcweir     {
472cdf0e10cSrcweir         UpdateLock aLock (shared_from_this());
473cdf0e10cSrcweir         mpImpl->RemoveToolBar(eGroup,rsToolBarName);
474cdf0e10cSrcweir     }
475cdf0e10cSrcweir }
476cdf0e10cSrcweir 
477cdf0e10cSrcweir 
478cdf0e10cSrcweir 
479cdf0e10cSrcweir 
SetToolBar(ToolBarGroup eGroup,const::rtl::OUString & rsToolBarName)480cdf0e10cSrcweir void ToolBarManager::SetToolBar (
481cdf0e10cSrcweir     ToolBarGroup eGroup,
482cdf0e10cSrcweir     const ::rtl::OUString& rsToolBarName)
483cdf0e10cSrcweir {
484cdf0e10cSrcweir     if (mpImpl.get() != NULL)
485cdf0e10cSrcweir     {
486cdf0e10cSrcweir         UpdateLock aLock (shared_from_this());
487cdf0e10cSrcweir         mpImpl->ResetToolBars(eGroup);
488cdf0e10cSrcweir         mpImpl->AddToolBar(eGroup,rsToolBarName);
489cdf0e10cSrcweir     }
490cdf0e10cSrcweir }
491cdf0e10cSrcweir 
492cdf0e10cSrcweir 
493cdf0e10cSrcweir 
494cdf0e10cSrcweir 
SetToolBarShell(ToolBarGroup eGroup,ShellId nToolBarId)495cdf0e10cSrcweir void ToolBarManager::SetToolBarShell (
496cdf0e10cSrcweir     ToolBarGroup eGroup,
497cdf0e10cSrcweir     ShellId nToolBarId)
498cdf0e10cSrcweir {
499cdf0e10cSrcweir     if (mpImpl.get() != NULL)
500cdf0e10cSrcweir     {
501cdf0e10cSrcweir         UpdateLock aLock (shared_from_this());
502cdf0e10cSrcweir         mpImpl->ResetToolBars(eGroup);
503cdf0e10cSrcweir         mpImpl->AddToolBarShell(eGroup,nToolBarId);
504cdf0e10cSrcweir     }
505cdf0e10cSrcweir }
506cdf0e10cSrcweir 
507cdf0e10cSrcweir 
508cdf0e10cSrcweir 
509cdf0e10cSrcweir 
PreUpdate(void)510cdf0e10cSrcweir void ToolBarManager::PreUpdate (void)
511cdf0e10cSrcweir {
512cdf0e10cSrcweir     if (mpImpl.get()!=NULL)
513cdf0e10cSrcweir         mpImpl->PreUpdate();
514cdf0e10cSrcweir }
515cdf0e10cSrcweir 
516cdf0e10cSrcweir 
517cdf0e10cSrcweir 
518cdf0e10cSrcweir 
RequestUpdate(void)519cdf0e10cSrcweir void ToolBarManager::RequestUpdate (void)
520cdf0e10cSrcweir {
521cdf0e10cSrcweir     if (mpImpl.get()!=NULL)
522cdf0e10cSrcweir         mpImpl->RequestUpdate();
523cdf0e10cSrcweir }
524cdf0e10cSrcweir 
525cdf0e10cSrcweir 
526cdf0e10cSrcweir 
527cdf0e10cSrcweir 
LockViewShellManager(void)528cdf0e10cSrcweir void ToolBarManager::LockViewShellManager (void)
529cdf0e10cSrcweir {
530cdf0e10cSrcweir     if (mpImpl.get() != NULL)
531cdf0e10cSrcweir         mpImpl->LockViewShellManager();
532cdf0e10cSrcweir }
533cdf0e10cSrcweir 
534cdf0e10cSrcweir 
535cdf0e10cSrcweir 
536cdf0e10cSrcweir 
LockUpdate(void)537cdf0e10cSrcweir void ToolBarManager::LockUpdate (void)
538cdf0e10cSrcweir {
539cdf0e10cSrcweir     if (mpImpl.get()!=NULL)
540cdf0e10cSrcweir         mpImpl->LockUpdate();
541cdf0e10cSrcweir }
542cdf0e10cSrcweir 
543cdf0e10cSrcweir 
544cdf0e10cSrcweir 
545cdf0e10cSrcweir 
UnlockUpdate(void)546cdf0e10cSrcweir void ToolBarManager::UnlockUpdate (void)
547cdf0e10cSrcweir {
548cdf0e10cSrcweir     if (mpImpl.get()!=NULL)
549cdf0e10cSrcweir         mpImpl->UnlockUpdate();
550cdf0e10cSrcweir }
551cdf0e10cSrcweir 
552cdf0e10cSrcweir 
553cdf0e10cSrcweir 
554cdf0e10cSrcweir 
MainViewShellChanged(ViewShell::ShellType nShellType)555cdf0e10cSrcweir void ToolBarManager::MainViewShellChanged (ViewShell::ShellType nShellType)
556cdf0e10cSrcweir {
557cdf0e10cSrcweir     if (mpImpl.get() != NULL)
558cdf0e10cSrcweir     {
559cdf0e10cSrcweir         mpImpl->ReleaseAllToolBarShells();
560cdf0e10cSrcweir         mpImpl->GetToolBarRules().MainViewShellChanged(nShellType);
561cdf0e10cSrcweir     }
562cdf0e10cSrcweir }
563cdf0e10cSrcweir 
564cdf0e10cSrcweir 
565cdf0e10cSrcweir 
566cdf0e10cSrcweir 
MainViewShellChanged(const ViewShell & rMainViewShell)567cdf0e10cSrcweir void ToolBarManager::MainViewShellChanged (const ViewShell& rMainViewShell)
568cdf0e10cSrcweir {
569cdf0e10cSrcweir     if (mpImpl.get() != NULL)
570cdf0e10cSrcweir     {
571cdf0e10cSrcweir         mpImpl->ReleaseAllToolBarShells();
572cdf0e10cSrcweir         mpImpl->GetToolBarRules().MainViewShellChanged(rMainViewShell);
573cdf0e10cSrcweir     }
574cdf0e10cSrcweir }
575cdf0e10cSrcweir 
576cdf0e10cSrcweir 
577cdf0e10cSrcweir 
578cdf0e10cSrcweir 
SelectionHasChanged(const ViewShell & rViewShell,const SdrView & rView)579cdf0e10cSrcweir void ToolBarManager::SelectionHasChanged (
580cdf0e10cSrcweir     const ViewShell& rViewShell,
581cdf0e10cSrcweir     const SdrView& rView)
582cdf0e10cSrcweir {
583cdf0e10cSrcweir     if (mpImpl.get() != NULL)
584cdf0e10cSrcweir         mpImpl->GetToolBarRules().SelectionHasChanged(rViewShell,rView);
585cdf0e10cSrcweir }
586cdf0e10cSrcweir 
587cdf0e10cSrcweir 
ToolBarsDestroyed(void)588cdf0e10cSrcweir void ToolBarManager::ToolBarsDestroyed(void)
589cdf0e10cSrcweir {
590cdf0e10cSrcweir     if (mpImpl.get() != NULL)
591cdf0e10cSrcweir         mpImpl->ToolBarsDestroyed();
592cdf0e10cSrcweir }
593cdf0e10cSrcweir 
594cdf0e10cSrcweir 
595cdf0e10cSrcweir //===== ToolBarManager::Implementation =======================================
596cdf0e10cSrcweir 
597cdf0e10cSrcweir const ::rtl::OUString ToolBarManager::Implementation::msToolBarResourcePrefix(
598cdf0e10cSrcweir     OUSTRING("private:resource/toolbar/"));
599cdf0e10cSrcweir 
Implementation(ViewShellBase & rBase,const::boost::shared_ptr<sd::tools::EventMultiplexer> & rpMultiplexer,const::boost::shared_ptr<ViewShellManager> & rpViewShellManager,const::boost::shared_ptr<ToolBarManager> & rpToolBarManager)600cdf0e10cSrcweir ToolBarManager::Implementation::Implementation (
601cdf0e10cSrcweir     ViewShellBase& rBase,
602cdf0e10cSrcweir     const ::boost::shared_ptr<sd::tools::EventMultiplexer>& rpMultiplexer,
603cdf0e10cSrcweir     const ::boost::shared_ptr<ViewShellManager>& rpViewShellManager,
604cdf0e10cSrcweir     const ::boost::shared_ptr<ToolBarManager>& rpToolBarManager)
605cdf0e10cSrcweir     : maMutex(),
606cdf0e10cSrcweir       mrBase(rBase),
607cdf0e10cSrcweir       mpEventMultiplexer(rpMultiplexer),
608cdf0e10cSrcweir       mbIsValid(false),
609cdf0e10cSrcweir       maToolBarList(),
610cdf0e10cSrcweir       maToolBarShellList(),
611cdf0e10cSrcweir       mxLayouter(NULL),
612cdf0e10cSrcweir       mnLockCount(0),
613cdf0e10cSrcweir       mbPreUpdatePending(false),
614cdf0e10cSrcweir       mbPostUpdatePending(false),
615cdf0e10cSrcweir       mpSynchronousLayouterLock(),
616cdf0e10cSrcweir       mpAsynchronousLayouterLock(),
617cdf0e10cSrcweir       mpViewShellManagerLock(),
618cdf0e10cSrcweir       mnPendingUpdateCall(0),
619cdf0e10cSrcweir       mnPendingSetValidCall(0),
620cdf0e10cSrcweir       maToolBarRules(rpToolBarManager,rpViewShellManager)
621cdf0e10cSrcweir {
622cdf0e10cSrcweir     Link aLink (LINK(this,ToolBarManager::Implementation,EventMultiplexerCallback));
623cdf0e10cSrcweir     mpEventMultiplexer->AddEventListener(
624cdf0e10cSrcweir         aLink,
625cdf0e10cSrcweir         tools::EventMultiplexerEvent::EID_CONTROLLER_ATTACHED
626cdf0e10cSrcweir         | tools::EventMultiplexerEvent::EID_CONTROLLER_DETACHED
627cdf0e10cSrcweir         | tools::EventMultiplexerEvent::EID_PANE_MANAGER_DYING);
628cdf0e10cSrcweir }
629cdf0e10cSrcweir 
630cdf0e10cSrcweir 
631cdf0e10cSrcweir 
632cdf0e10cSrcweir /** The order of statements is important.
633cdf0e10cSrcweir     First unregister listeners, which may post user events.
634cdf0e10cSrcweir     Then remove pending user events.
635cdf0e10cSrcweir */
~Implementation(void)636cdf0e10cSrcweir ToolBarManager::Implementation::~Implementation (void)
637cdf0e10cSrcweir {
638cdf0e10cSrcweir     // Unregister at broadcasters.
639cdf0e10cSrcweir     Link aLink (LINK(this,ToolBarManager::Implementation,EventMultiplexerCallback));
640cdf0e10cSrcweir     mpEventMultiplexer->RemoveEventListener(aLink);
641cdf0e10cSrcweir 
642cdf0e10cSrcweir     // Abort pending user calls.
643cdf0e10cSrcweir     if (mnPendingUpdateCall != 0)
644cdf0e10cSrcweir         Application::RemoveUserEvent(mnPendingUpdateCall);
645cdf0e10cSrcweir     if (mnPendingSetValidCall != 0)
646cdf0e10cSrcweir         Application::RemoveUserEvent(mnPendingSetValidCall);
647cdf0e10cSrcweir }
648cdf0e10cSrcweir 
649cdf0e10cSrcweir 
ToolBarsDestroyed(void)650cdf0e10cSrcweir void ToolBarManager::Implementation::ToolBarsDestroyed(void)
651cdf0e10cSrcweir {
652cdf0e10cSrcweir     maToolBarList.MarkAllToolBarsAsNotActive();
653cdf0e10cSrcweir }
654cdf0e10cSrcweir 
655cdf0e10cSrcweir 
SetValid(bool bValid)656cdf0e10cSrcweir void ToolBarManager::Implementation::SetValid (bool bValid)
657cdf0e10cSrcweir {
658cdf0e10cSrcweir     ::osl::MutexGuard aGuard(maMutex);
659cdf0e10cSrcweir 
660cdf0e10cSrcweir     if (mbIsValid != bValid)
661cdf0e10cSrcweir     {
662cdf0e10cSrcweir         UpdateLockImplementation aUpdateLock (*this);
663cdf0e10cSrcweir 
664cdf0e10cSrcweir         mbIsValid = bValid;
665cdf0e10cSrcweir         if (mbIsValid)
666cdf0e10cSrcweir         {
667cdf0e10cSrcweir             Reference<frame::XFrame> xFrame;
668cdf0e10cSrcweir             if (mrBase.GetViewFrame() != NULL)
669cdf0e10cSrcweir                 xFrame = mrBase.GetViewFrame()->GetFrame().GetFrameInterface();
670cdf0e10cSrcweir             try
671cdf0e10cSrcweir             {
672cdf0e10cSrcweir                 Reference<beans::XPropertySet> xFrameProperties (xFrame, UNO_QUERY_THROW);
673cdf0e10cSrcweir                 Any aValue (xFrameProperties->getPropertyValue(OUSTRING("LayoutManager")));
674cdf0e10cSrcweir                 aValue >>= mxLayouter;
675cdf0e10cSrcweir             }
676cdf0e10cSrcweir             catch (RuntimeException aException)
677cdf0e10cSrcweir             {
678cdf0e10cSrcweir             }
679cdf0e10cSrcweir 
680cdf0e10cSrcweir             GetToolBarRules().Update(mrBase);
681cdf0e10cSrcweir         }
682cdf0e10cSrcweir         else
683cdf0e10cSrcweir         {
684cdf0e10cSrcweir             ResetAllToolBars();
685cdf0e10cSrcweir             mxLayouter = NULL;
686cdf0e10cSrcweir         }
687cdf0e10cSrcweir     }
688cdf0e10cSrcweir }
689cdf0e10cSrcweir 
690cdf0e10cSrcweir 
691cdf0e10cSrcweir 
692cdf0e10cSrcweir 
ResetToolBars(ToolBarGroup eGroup)693cdf0e10cSrcweir void ToolBarManager::Implementation::ResetToolBars (ToolBarGroup eGroup)
694cdf0e10cSrcweir {
695cdf0e10cSrcweir     ::osl::MutexGuard aGuard(maMutex);
696cdf0e10cSrcweir 
697cdf0e10cSrcweir     maToolBarList.ClearGroup(eGroup);
698cdf0e10cSrcweir     maToolBarShellList.ClearGroup(eGroup);
699cdf0e10cSrcweir 
700cdf0e10cSrcweir     mbPreUpdatePending = true;
701cdf0e10cSrcweir }
702cdf0e10cSrcweir 
703cdf0e10cSrcweir 
704cdf0e10cSrcweir 
705cdf0e10cSrcweir 
ResetAllToolBars(void)706cdf0e10cSrcweir void ToolBarManager::Implementation::ResetAllToolBars (void)
707cdf0e10cSrcweir {
708cdf0e10cSrcweir #ifdef VERBOSE
709cdf0e10cSrcweir     OSL_TRACE("resetting all tool bars\n");
710cdf0e10cSrcweir #endif
711cdf0e10cSrcweir     for (int i=TBG__FIRST; i<=TBG__LAST; ++i)
712cdf0e10cSrcweir         ResetToolBars((ToolBarGroup)i);
713cdf0e10cSrcweir }
714cdf0e10cSrcweir 
715cdf0e10cSrcweir 
716cdf0e10cSrcweir 
717cdf0e10cSrcweir 
AddToolBar(ToolBarGroup eGroup,const::rtl::OUString & rsToolBarName)718cdf0e10cSrcweir void ToolBarManager::Implementation::AddToolBar (
719cdf0e10cSrcweir     ToolBarGroup eGroup,
720cdf0e10cSrcweir     const ::rtl::OUString& rsToolBarName)
721cdf0e10cSrcweir {
722cdf0e10cSrcweir     ::osl::MutexGuard aGuard(maMutex);
723cdf0e10cSrcweir 
724cdf0e10cSrcweir     if (CheckPlugInMode(rsToolBarName))
725cdf0e10cSrcweir     {
726cdf0e10cSrcweir         maToolBarList.AddToolBar(eGroup,rsToolBarName);
727cdf0e10cSrcweir 
728cdf0e10cSrcweir         mbPostUpdatePending = true;
729cdf0e10cSrcweir         if (mnLockCount == 0)
730cdf0e10cSrcweir             PostUpdate();
731cdf0e10cSrcweir     }
732cdf0e10cSrcweir }
733cdf0e10cSrcweir 
734cdf0e10cSrcweir 
735cdf0e10cSrcweir 
736cdf0e10cSrcweir 
RemoveToolBar(ToolBarGroup eGroup,const::rtl::OUString & rsToolBarName)737cdf0e10cSrcweir void ToolBarManager::Implementation::RemoveToolBar (
738cdf0e10cSrcweir     ToolBarGroup eGroup,
739cdf0e10cSrcweir     const ::rtl::OUString& rsToolBarName)
740cdf0e10cSrcweir {
741cdf0e10cSrcweir     ::osl::MutexGuard aGuard(maMutex);
742cdf0e10cSrcweir 
743cdf0e10cSrcweir     if (maToolBarList.RemoveToolBar(eGroup,rsToolBarName))
744cdf0e10cSrcweir     {
745cdf0e10cSrcweir         mbPreUpdatePending = true;
746cdf0e10cSrcweir         if (mnLockCount == 0)
747cdf0e10cSrcweir             PreUpdate();
748cdf0e10cSrcweir     }
749cdf0e10cSrcweir }
750cdf0e10cSrcweir 
751cdf0e10cSrcweir 
752cdf0e10cSrcweir 
753cdf0e10cSrcweir 
AddToolBarShell(ToolBarGroup eGroup,ShellId nToolBarId)754cdf0e10cSrcweir void ToolBarManager::Implementation::AddToolBarShell (
755cdf0e10cSrcweir     ToolBarGroup eGroup,
756cdf0e10cSrcweir     ShellId nToolBarId)
757cdf0e10cSrcweir {
758cdf0e10cSrcweir     ViewShell* pMainViewShell = mrBase.GetMainViewShell().get();
759cdf0e10cSrcweir     if (pMainViewShell != NULL)
760cdf0e10cSrcweir     {
761cdf0e10cSrcweir         maToolBarShellList.AddShellId(eGroup,nToolBarId);
762cdf0e10cSrcweir         GetToolBarRules().SubShellAdded(eGroup, nToolBarId);
763cdf0e10cSrcweir     }
764cdf0e10cSrcweir }
765cdf0e10cSrcweir 
766cdf0e10cSrcweir 
767cdf0e10cSrcweir 
768cdf0e10cSrcweir 
ReleaseAllToolBarShells(void)769cdf0e10cSrcweir void ToolBarManager::Implementation::ReleaseAllToolBarShells (void)
770cdf0e10cSrcweir {
771cdf0e10cSrcweir     maToolBarShellList.ReleaseAllShells(GetToolBarRules());
772cdf0e10cSrcweir     maToolBarShellList.UpdateShells(mrBase.GetMainViewShell(), mrBase.GetViewShellManager());
773cdf0e10cSrcweir }
774cdf0e10cSrcweir 
775cdf0e10cSrcweir 
776cdf0e10cSrcweir 
777cdf0e10cSrcweir 
RequestUpdate(void)778cdf0e10cSrcweir void ToolBarManager::Implementation::RequestUpdate (void)
779cdf0e10cSrcweir {
780cdf0e10cSrcweir     if (mnPendingUpdateCall == 0)
781cdf0e10cSrcweir     {
782cdf0e10cSrcweir         mnPendingUpdateCall = Application::PostUserEvent(
783cdf0e10cSrcweir             LINK(this,ToolBarManager::Implementation,UpdateCallback));
784cdf0e10cSrcweir     }
785cdf0e10cSrcweir }
786cdf0e10cSrcweir 
787cdf0e10cSrcweir 
788cdf0e10cSrcweir 
789cdf0e10cSrcweir 
PreUpdate(void)790cdf0e10cSrcweir void ToolBarManager::Implementation::PreUpdate (void)
791cdf0e10cSrcweir {
792cdf0e10cSrcweir     ::osl::MutexGuard aGuard(maMutex);
793cdf0e10cSrcweir 
794cdf0e10cSrcweir     if (mbIsValid
795cdf0e10cSrcweir         && mbPreUpdatePending
796cdf0e10cSrcweir         && mxLayouter.is())
797cdf0e10cSrcweir     {
798cdf0e10cSrcweir         mbPreUpdatePending = false;
799cdf0e10cSrcweir 
800cdf0e10cSrcweir #ifdef VERBOSE
801cdf0e10cSrcweir         OSL_TRACE("ToolBarManager::PreUpdate [");
802cdf0e10cSrcweir #endif
803cdf0e10cSrcweir 
804cdf0e10cSrcweir         // Get the list of tool bars that are not used anymore and are to be
805cdf0e10cSrcweir         // deactivated.
806cdf0e10cSrcweir         NameList aToolBars;
807cdf0e10cSrcweir         maToolBarList.GetToolBarsToDeactivate(aToolBars);
808cdf0e10cSrcweir 
809cdf0e10cSrcweir         // Turn off the tool bars.
810cdf0e10cSrcweir         NameList::const_iterator iToolBar;
811cdf0e10cSrcweir         for (iToolBar=aToolBars.begin(); iToolBar!=aToolBars.end(); ++iToolBar)
812cdf0e10cSrcweir         {
813cdf0e10cSrcweir             ::rtl::OUString sFullName (GetToolBarResourceName(*iToolBar));
814cdf0e10cSrcweir #ifdef VERBOSE
815cdf0e10cSrcweir             OSL_TRACE("    turning off tool bar %s",
816cdf0e10cSrcweir                 ::rtl::OUStringToOString(sFullName, RTL_TEXTENCODING_UTF8).getStr());
817cdf0e10cSrcweir #endif
818cdf0e10cSrcweir             mxLayouter->destroyElement(sFullName);
819cdf0e10cSrcweir             maToolBarList.MarkToolBarAsNotActive(*iToolBar);
820cdf0e10cSrcweir         }
821cdf0e10cSrcweir 
822cdf0e10cSrcweir #ifdef VERBOSE
823cdf0e10cSrcweir         OSL_TRACE("ToolBarManager::PreUpdate ]\n");
824cdf0e10cSrcweir #endif
825cdf0e10cSrcweir     }
826cdf0e10cSrcweir }
827cdf0e10cSrcweir 
828cdf0e10cSrcweir 
829cdf0e10cSrcweir 
830cdf0e10cSrcweir 
PostUpdate(void)831cdf0e10cSrcweir void ToolBarManager::Implementation::PostUpdate (void)
832cdf0e10cSrcweir {
833cdf0e10cSrcweir     ::osl::MutexGuard aGuard(maMutex);
834cdf0e10cSrcweir 
835cdf0e10cSrcweir     if (mbIsValid
836cdf0e10cSrcweir         && mbPostUpdatePending
837cdf0e10cSrcweir         && mxLayouter.is())
838cdf0e10cSrcweir     {
839cdf0e10cSrcweir         mbPostUpdatePending = false;
840cdf0e10cSrcweir 
841cdf0e10cSrcweir         // Create the list of requested tool bars.
842cdf0e10cSrcweir         NameList aToolBars;
843cdf0e10cSrcweir         maToolBarList.GetToolBarsToActivate(aToolBars);
844cdf0e10cSrcweir 
845cdf0e10cSrcweir #ifdef VERBOSE
846cdf0e10cSrcweir         OSL_TRACE("ToolBarManager::PostUpdate [");
847cdf0e10cSrcweir #endif
848cdf0e10cSrcweir 
849cdf0e10cSrcweir         // Turn on the tool bars that are visible in the new context.
850cdf0e10cSrcweir         NameList::const_iterator iToolBar;
851cdf0e10cSrcweir         for (iToolBar=aToolBars.begin(); iToolBar!=aToolBars.end(); ++iToolBar)
852cdf0e10cSrcweir         {
853cdf0e10cSrcweir             ::rtl::OUString sFullName (GetToolBarResourceName(*iToolBar));
854cdf0e10cSrcweir #ifdef VERBOSE
855cdf0e10cSrcweir             OSL_TRACE("    turning on tool bar %s",
856cdf0e10cSrcweir                 ::rtl::OUStringToOString(sFullName, RTL_TEXTENCODING_UTF8).getStr());
857cdf0e10cSrcweir #endif
858cdf0e10cSrcweir             mxLayouter->requestElement(sFullName);
859cdf0e10cSrcweir             maToolBarList.MarkToolBarAsActive(*iToolBar);
860cdf0e10cSrcweir         }
861cdf0e10cSrcweir 
862cdf0e10cSrcweir #ifdef VERBOSE
863cdf0e10cSrcweir         OSL_TRACE("ToolBarManager::PostUpdate ]\n");
864cdf0e10cSrcweir #endif
865cdf0e10cSrcweir     }
866cdf0e10cSrcweir }
867cdf0e10cSrcweir 
868cdf0e10cSrcweir 
869cdf0e10cSrcweir 
870cdf0e10cSrcweir 
LockViewShellManager(void)871cdf0e10cSrcweir void ToolBarManager::Implementation::LockViewShellManager (void)
872cdf0e10cSrcweir {
873cdf0e10cSrcweir     if (mpViewShellManagerLock.get() == NULL)
874cdf0e10cSrcweir         mpViewShellManagerLock.reset(
875cdf0e10cSrcweir             new ViewShellManager::UpdateLock(mrBase.GetViewShellManager()));
876cdf0e10cSrcweir }
877cdf0e10cSrcweir 
878cdf0e10cSrcweir 
879cdf0e10cSrcweir 
880cdf0e10cSrcweir 
LockUpdate(void)881cdf0e10cSrcweir void ToolBarManager::Implementation::LockUpdate (void)
882cdf0e10cSrcweir {
883cdf0e10cSrcweir #ifdef VERBOSE
884cdf0e10cSrcweir     OSL_TRACE("LockUpdate %d\n", mnLockCount);
885cdf0e10cSrcweir #endif
886cdf0e10cSrcweir     ::osl::MutexGuard aGuard(maMutex);
887cdf0e10cSrcweir 
888cdf0e10cSrcweir     DBG_ASSERT(mnLockCount<100, "ToolBarManager lock count unusually high");
889cdf0e10cSrcweir     if (mnLockCount == 0)
890cdf0e10cSrcweir     {
891cdf0e10cSrcweir         OSL_ASSERT(mpSynchronousLayouterLock.get()==NULL);
892cdf0e10cSrcweir 
893cdf0e10cSrcweir         mpSynchronousLayouterLock.reset(new LayouterLock(mxLayouter));
894cdf0e10cSrcweir     }
895cdf0e10cSrcweir     ++mnLockCount;
896cdf0e10cSrcweir }
897cdf0e10cSrcweir 
898cdf0e10cSrcweir 
899cdf0e10cSrcweir 
900cdf0e10cSrcweir 
UnlockUpdate(void)901cdf0e10cSrcweir void ToolBarManager::Implementation::UnlockUpdate (void)
902cdf0e10cSrcweir {
903cdf0e10cSrcweir #ifdef VERBOSE
904cdf0e10cSrcweir     OSL_TRACE("UnlockUpdate %d\n", mnLockCount);
905cdf0e10cSrcweir #endif
906cdf0e10cSrcweir     ::osl::MutexGuard aGuard(maMutex);
907cdf0e10cSrcweir 
908cdf0e10cSrcweir     OSL_ASSERT(mnLockCount>0);
909cdf0e10cSrcweir     --mnLockCount;
910cdf0e10cSrcweir     if (mnLockCount == 0)
911cdf0e10cSrcweir     {
912cdf0e10cSrcweir         Update(mpSynchronousLayouterLock);
913cdf0e10cSrcweir     }
914cdf0e10cSrcweir }
915cdf0e10cSrcweir 
916cdf0e10cSrcweir 
917cdf0e10cSrcweir 
918cdf0e10cSrcweir 
Update(::std::auto_ptr<LayouterLock> pLocalLayouterLock)919cdf0e10cSrcweir void ToolBarManager::Implementation::Update (
920cdf0e10cSrcweir     ::std::auto_ptr<LayouterLock> pLocalLayouterLock)
921cdf0e10cSrcweir {
922cdf0e10cSrcweir     // When the lock is released and there are pending changes to the set of
923cdf0e10cSrcweir     // tool bars then update this set now.
924cdf0e10cSrcweir     if (mnLockCount == 0)
925cdf0e10cSrcweir     {
926cdf0e10cSrcweir         // During ceation of ViewShellBase we may have the situation that
927cdf0e10cSrcweir         // the controller has already been created and attached to the frame
928cdf0e10cSrcweir         // but that the ToolBarManager has not yet completed its
929cdf0e10cSrcweir         // initialization (by initializing the mxLayouter member.)  We do
930cdf0e10cSrcweir         // this here so that we do not have to wait for the next Update()
931cdf0e10cSrcweir         // call to show the tool bars.
932cdf0e10cSrcweir         if (mnPendingSetValidCall != 0)
933cdf0e10cSrcweir         {
934cdf0e10cSrcweir             Application::RemoveUserEvent(mnPendingSetValidCall);
935cdf0e10cSrcweir             mnPendingSetValidCall = 0;
936cdf0e10cSrcweir             SetValid(true);
937cdf0e10cSrcweir         }
938cdf0e10cSrcweir 
939cdf0e10cSrcweir         if (mbIsValid && mxLayouter.is() && (mbPreUpdatePending || mbPostUpdatePending))
940cdf0e10cSrcweir         {
941cdf0e10cSrcweir             // 1) Release UNO tool bars that are not longer used.  Do this
942cdf0e10cSrcweir             // now so that they are not updated when the SFX shell stack is
943cdf0e10cSrcweir             // modified.
944cdf0e10cSrcweir             if (mbPreUpdatePending)
945cdf0e10cSrcweir                 PreUpdate();
946cdf0e10cSrcweir 
947cdf0e10cSrcweir             // 2) Update the requested shells that represent tool bar
948cdf0e10cSrcweir             // functionality. Those that are not used anymore are
949cdf0e10cSrcweir             // deactivated now.  Those that are missing are activated in the
950cdf0e10cSrcweir             // next step together with the view shells.
951cdf0e10cSrcweir             if (mpViewShellManagerLock.get() == NULL)
952cdf0e10cSrcweir                 mpViewShellManagerLock.reset(
953cdf0e10cSrcweir                     new ViewShellManager::UpdateLock(mrBase.GetViewShellManager()));
954cdf0e10cSrcweir             maToolBarShellList.UpdateShells(
955cdf0e10cSrcweir                 mrBase.GetMainViewShell(),
956cdf0e10cSrcweir                 mrBase.GetViewShellManager());
957cdf0e10cSrcweir 
958cdf0e10cSrcweir             // 3) Unlock the ViewShellManager::UpdateLock.  This updates the
959cdf0e10cSrcweir             // shell stack.  We have to be carfull here.  The deletion of
960cdf0e10cSrcweir             // the lock may end in a synchronous call to LockUpdate(). When
961cdf0e10cSrcweir             // at this time the lock has been deleted but the auto_ptr has
962cdf0e10cSrcweir             // not yet been reset then the lock is deleted a second time.
963cdf0e10cSrcweir             ViewShellManager::UpdateLock* pLock = mpViewShellManagerLock.release();
964cdf0e10cSrcweir             delete pLock;
965cdf0e10cSrcweir 
966cdf0e10cSrcweir             // 4) Make the UNO tool bars visible.  The outstanding call to
967cdf0e10cSrcweir             // PostUpdate() is done via PostUserEvent() so that it is
968cdf0e10cSrcweir             // guaranteed to be executed when the SFX shell stack has been
969cdf0e10cSrcweir             // updated (under the assumption that our lock to the
970cdf0e10cSrcweir             // ViewShellManager was the only one open.  If that is not the
971cdf0e10cSrcweir             // case then all should still be well but not as fast.)
972cdf0e10cSrcweir             //
973cdf0e10cSrcweir             // Note that the lock count may have been increased since
974cdf0e10cSrcweir             // entering this method.  In that case one of the next
975cdf0e10cSrcweir             // UnlockUpdate() calls will post the UpdateCallback.
976cdf0e10cSrcweir             if (mnPendingUpdateCall==0 && mnLockCount==0)
977cdf0e10cSrcweir             {
978cdf0e10cSrcweir                 mpAsynchronousLayouterLock = pLocalLayouterLock;
979cdf0e10cSrcweir                 mnPendingUpdateCall = Application::PostUserEvent(
980cdf0e10cSrcweir                     LINK(this,ToolBarManager::Implementation,UpdateCallback));
981cdf0e10cSrcweir             }
982cdf0e10cSrcweir         }
983cdf0e10cSrcweir         else
984cdf0e10cSrcweir         {
985cdf0e10cSrcweir             mpViewShellManagerLock.reset();
986cdf0e10cSrcweir             pLocalLayouterLock.reset();
987cdf0e10cSrcweir         }
988cdf0e10cSrcweir     }
989cdf0e10cSrcweir }
990cdf0e10cSrcweir 
991cdf0e10cSrcweir 
992cdf0e10cSrcweir 
993cdf0e10cSrcweir 
GetToolBarRules(void)994cdf0e10cSrcweir ToolBarRules& ToolBarManager::Implementation::GetToolBarRules (void)
995cdf0e10cSrcweir {
996cdf0e10cSrcweir     return maToolBarRules;
997cdf0e10cSrcweir }
998cdf0e10cSrcweir 
999cdf0e10cSrcweir 
1000cdf0e10cSrcweir 
1001cdf0e10cSrcweir 
IMPL_LINK(ToolBarManager::Implementation,UpdateCallback,bool *,EMPTYARG)1002cdf0e10cSrcweir IMPL_LINK(ToolBarManager::Implementation,UpdateCallback,bool*,EMPTYARG)
1003cdf0e10cSrcweir {
1004cdf0e10cSrcweir     mnPendingUpdateCall = 0;
1005cdf0e10cSrcweir     if (mnLockCount == 0)
1006cdf0e10cSrcweir     {
1007cdf0e10cSrcweir         if (mbPreUpdatePending)
1008cdf0e10cSrcweir             PreUpdate();
1009cdf0e10cSrcweir         if (mbPostUpdatePending)
1010cdf0e10cSrcweir             PostUpdate();
1011cdf0e10cSrcweir         if (mbIsValid && mxLayouter.is())
1012cdf0e10cSrcweir             mpAsynchronousLayouterLock.reset();
1013cdf0e10cSrcweir     }
1014cdf0e10cSrcweir     return 0;
1015cdf0e10cSrcweir }
1016cdf0e10cSrcweir 
1017cdf0e10cSrcweir 
1018cdf0e10cSrcweir 
1019cdf0e10cSrcweir 
IMPL_LINK(ToolBarManager::Implementation,EventMultiplexerCallback,sd::tools::EventMultiplexerEvent *,pEvent)1020cdf0e10cSrcweir IMPL_LINK(ToolBarManager::Implementation,EventMultiplexerCallback,
1021cdf0e10cSrcweir     sd::tools::EventMultiplexerEvent*,pEvent)
1022cdf0e10cSrcweir {
1023cdf0e10cSrcweir     if (pEvent != NULL)
1024cdf0e10cSrcweir     {
1025cdf0e10cSrcweir         switch (pEvent->meEventId)
1026cdf0e10cSrcweir         {
1027cdf0e10cSrcweir             case tools::EventMultiplexerEvent::EID_CONTROLLER_ATTACHED:
1028cdf0e10cSrcweir                 if (mnPendingSetValidCall == 0)
1029cdf0e10cSrcweir                     mnPendingSetValidCall
1030cdf0e10cSrcweir                         = Application::PostUserEvent(LINK(this,Implementation,SetValidCallback));
1031cdf0e10cSrcweir                 break;
1032cdf0e10cSrcweir 
1033cdf0e10cSrcweir             case tools::EventMultiplexerEvent::EID_CONTROLLER_DETACHED:
1034cdf0e10cSrcweir                 SetValid(false);
1035cdf0e10cSrcweir                 break;
1036cdf0e10cSrcweir 
1037cdf0e10cSrcweir             case tools::EventMultiplexerEvent::EID_PANE_MANAGER_DYING:
1038cdf0e10cSrcweir                 SetValid(false);
1039cdf0e10cSrcweir                 break;
1040cdf0e10cSrcweir         }
1041cdf0e10cSrcweir     }
1042cdf0e10cSrcweir     return 0;
1043cdf0e10cSrcweir }
1044cdf0e10cSrcweir 
1045cdf0e10cSrcweir 
1046cdf0e10cSrcweir 
1047cdf0e10cSrcweir 
IMPL_LINK(ToolBarManager::Implementation,SetValidCallback,void *,EMPTYARG)1048cdf0e10cSrcweir IMPL_LINK(ToolBarManager::Implementation, SetValidCallback,void*,EMPTYARG)
1049cdf0e10cSrcweir {
1050cdf0e10cSrcweir     mnPendingSetValidCall = 0;
1051cdf0e10cSrcweir     SetValid(true);
1052cdf0e10cSrcweir     return 0;
1053cdf0e10cSrcweir }
1054cdf0e10cSrcweir 
1055cdf0e10cSrcweir 
1056cdf0e10cSrcweir 
1057cdf0e10cSrcweir 
1058cdf0e10cSrcweir 
GetToolBarResourceName(const::rtl::OUString & rsBaseName) const1059cdf0e10cSrcweir ::rtl::OUString ToolBarManager::Implementation::GetToolBarResourceName (
1060cdf0e10cSrcweir     const ::rtl::OUString& rsBaseName) const
1061cdf0e10cSrcweir {
1062cdf0e10cSrcweir     ::rtl::OUString sToolBarName (msToolBarResourcePrefix);
1063cdf0e10cSrcweir     sToolBarName += rsBaseName;
1064cdf0e10cSrcweir     return sToolBarName;
1065cdf0e10cSrcweir }
1066cdf0e10cSrcweir 
1067cdf0e10cSrcweir 
1068cdf0e10cSrcweir 
1069cdf0e10cSrcweir 
CheckPlugInMode(const::rtl::OUString & rsName) const1070cdf0e10cSrcweir bool ToolBarManager::Implementation::CheckPlugInMode (const ::rtl::OUString& rsName) const
1071cdf0e10cSrcweir {
1072cdf0e10cSrcweir     bool bValid (false);
1073cdf0e10cSrcweir 
1074cdf0e10cSrcweir     // Determine the plug in mode.
1075cdf0e10cSrcweir     bool bIsPlugInMode (false);
1076cdf0e10cSrcweir     do
1077cdf0e10cSrcweir     {
1078cdf0e10cSrcweir         SfxObjectShell* pObjectShell = mrBase.GetObjectShell();
1079cdf0e10cSrcweir         if (pObjectShell == NULL)
1080cdf0e10cSrcweir             break;
1081cdf0e10cSrcweir 
1082cdf0e10cSrcweir         SfxMedium* pMedium = pObjectShell->GetMedium();
1083cdf0e10cSrcweir         if (pMedium == NULL)
1084cdf0e10cSrcweir             break;
1085cdf0e10cSrcweir 
1086cdf0e10cSrcweir         SFX_ITEMSET_ARG(pMedium->GetItemSet(),pViewOnlyItem,SfxBoolItem,SID_VIEWONLY,sal_False);
1087cdf0e10cSrcweir         if (pViewOnlyItem == NULL)
1088cdf0e10cSrcweir             break;
1089cdf0e10cSrcweir 
1090cdf0e10cSrcweir         bIsPlugInMode = pViewOnlyItem->GetValue();
1091cdf0e10cSrcweir     }
1092cdf0e10cSrcweir     while (false);
1093cdf0e10cSrcweir 
1094cdf0e10cSrcweir     if (rsName.equals(msViewerToolBar))
1095cdf0e10cSrcweir         bValid = bIsPlugInMode;
1096cdf0e10cSrcweir     else
1097cdf0e10cSrcweir         bValid = ! bIsPlugInMode;
1098cdf0e10cSrcweir 
1099cdf0e10cSrcweir     return bValid;
1100cdf0e10cSrcweir }
1101cdf0e10cSrcweir 
1102cdf0e10cSrcweir 
1103cdf0e10cSrcweir 
1104cdf0e10cSrcweir 
1105cdf0e10cSrcweir } // end of namespace sd
1106cdf0e10cSrcweir 
1107cdf0e10cSrcweir 
1108cdf0e10cSrcweir 
1109cdf0e10cSrcweir 
1110cdf0e10cSrcweir namespace {
1111cdf0e10cSrcweir 
1112cdf0e10cSrcweir using namespace ::sd;
1113cdf0e10cSrcweir 
1114cdf0e10cSrcweir //===== LayouterLock ==========================================================
1115cdf0e10cSrcweir 
LayouterLock(const Reference<frame::XLayoutManager> & rxLayouter)1116cdf0e10cSrcweir LayouterLock::LayouterLock (const Reference<frame::XLayoutManager>& rxLayouter)
1117cdf0e10cSrcweir     : mxLayouter(rxLayouter)
1118cdf0e10cSrcweir {
1119cdf0e10cSrcweir #ifdef VERBOSE
1120cdf0e10cSrcweir     OSL_TRACE("LayouterLock %d", mxLayouter.is() ? 1 :0);
1121cdf0e10cSrcweir #endif
1122cdf0e10cSrcweir     if (mxLayouter.is())
1123cdf0e10cSrcweir         mxLayouter->lock();
1124cdf0e10cSrcweir }
1125cdf0e10cSrcweir 
1126cdf0e10cSrcweir 
1127cdf0e10cSrcweir 
1128cdf0e10cSrcweir 
~LayouterLock(void)1129cdf0e10cSrcweir LayouterLock::~LayouterLock (void)
1130cdf0e10cSrcweir {
1131cdf0e10cSrcweir #ifdef VERBOSE
1132cdf0e10cSrcweir     OSL_TRACE("~LayouterLock %d", mxLayouter.is() ? 1 :0);
1133cdf0e10cSrcweir #endif
1134cdf0e10cSrcweir     if (mxLayouter.is())
1135cdf0e10cSrcweir         mxLayouter->unlock();
1136cdf0e10cSrcweir }
1137cdf0e10cSrcweir 
1138cdf0e10cSrcweir 
1139cdf0e10cSrcweir 
1140cdf0e10cSrcweir 
1141cdf0e10cSrcweir //===== ToolBarRules ==========================================================
1142cdf0e10cSrcweir 
ToolBarRules(const::boost::shared_ptr<sd::ToolBarManager> & rpToolBarManager,const::boost::shared_ptr<sd::ViewShellManager> & rpViewShellManager)1143cdf0e10cSrcweir ToolBarRules::ToolBarRules (
1144cdf0e10cSrcweir     const ::boost::shared_ptr<sd::ToolBarManager>& rpToolBarManager,
1145cdf0e10cSrcweir     const ::boost::shared_ptr<sd::ViewShellManager>& rpViewShellManager)
1146cdf0e10cSrcweir     : mpToolBarManager(rpToolBarManager),
1147cdf0e10cSrcweir       mpViewShellManager(rpViewShellManager)
1148cdf0e10cSrcweir {
1149cdf0e10cSrcweir }
1150cdf0e10cSrcweir 
1151cdf0e10cSrcweir 
1152cdf0e10cSrcweir 
1153cdf0e10cSrcweir 
Update(ViewShellBase & rBase)1154cdf0e10cSrcweir void ToolBarRules::Update (ViewShellBase& rBase)
1155cdf0e10cSrcweir {
1156cdf0e10cSrcweir     ViewShell* pMainViewShell = rBase.GetMainViewShell().get();
1157cdf0e10cSrcweir     if (pMainViewShell != NULL)
1158cdf0e10cSrcweir     {
1159cdf0e10cSrcweir         MainViewShellChanged(pMainViewShell->GetShellType());
1160cdf0e10cSrcweir         if (pMainViewShell->GetView())
1161cdf0e10cSrcweir             SelectionHasChanged (*pMainViewShell, *pMainViewShell->GetView());
1162cdf0e10cSrcweir     }
1163cdf0e10cSrcweir     else
1164cdf0e10cSrcweir         MainViewShellChanged(ViewShell::ST_NONE);
1165cdf0e10cSrcweir }
1166cdf0e10cSrcweir 
1167cdf0e10cSrcweir 
1168cdf0e10cSrcweir 
1169cdf0e10cSrcweir 
MainViewShellChanged(ViewShell::ShellType nShellType)1170cdf0e10cSrcweir void ToolBarRules::MainViewShellChanged (ViewShell::ShellType nShellType)
1171cdf0e10cSrcweir {
1172cdf0e10cSrcweir     ::sd::ToolBarManager::UpdateLock aToolBarManagerLock (mpToolBarManager);
1173cdf0e10cSrcweir     ::sd::ViewShellManager::UpdateLock aViewShellManagerLock (mpViewShellManager);
1174cdf0e10cSrcweir 
1175cdf0e10cSrcweir     mpToolBarManager->ResetAllToolBars();
1176cdf0e10cSrcweir 
1177cdf0e10cSrcweir     switch(nShellType)
1178cdf0e10cSrcweir     {
1179cdf0e10cSrcweir         case ::sd::ViewShell::ST_IMPRESS:
1180cdf0e10cSrcweir         case ::sd::ViewShell::ST_NOTES:
1181cdf0e10cSrcweir         case ::sd::ViewShell::ST_HANDOUT:
1182cdf0e10cSrcweir             mpToolBarManager->AddToolBar(
1183cdf0e10cSrcweir                 ToolBarManager::TBG_PERMANENT,
1184cdf0e10cSrcweir                 ToolBarManager::msToolBar);
1185cdf0e10cSrcweir             mpToolBarManager->AddToolBar(
1186cdf0e10cSrcweir                 ToolBarManager::TBG_PERMANENT,
1187cdf0e10cSrcweir                 ToolBarManager::msOptionsToolBar);
1188cdf0e10cSrcweir             mpToolBarManager->AddToolBar(
1189cdf0e10cSrcweir                 ToolBarManager::TBG_PERMANENT,
1190cdf0e10cSrcweir                 ToolBarManager::msCommonTaskToolBar);
1191cdf0e10cSrcweir             mpToolBarManager->AddToolBar(
1192cdf0e10cSrcweir                 ToolBarManager::TBG_PERMANENT,
1193cdf0e10cSrcweir                 ToolBarManager::msViewerToolBar);
1194cdf0e10cSrcweir             break;
1195cdf0e10cSrcweir 
1196cdf0e10cSrcweir         case ::sd::ViewShell::ST_DRAW:
1197cdf0e10cSrcweir             mpToolBarManager->AddToolBar(
1198cdf0e10cSrcweir                 ToolBarManager::TBG_PERMANENT,
1199cdf0e10cSrcweir                 ToolBarManager::msToolBar);
1200cdf0e10cSrcweir             mpToolBarManager->AddToolBar(
1201cdf0e10cSrcweir                 ToolBarManager::TBG_PERMANENT,
1202cdf0e10cSrcweir                 ToolBarManager::msOptionsToolBar);
1203cdf0e10cSrcweir             mpToolBarManager->AddToolBar(
1204cdf0e10cSrcweir                 ToolBarManager::TBG_PERMANENT,
1205cdf0e10cSrcweir                 ToolBarManager::msViewerToolBar);
1206cdf0e10cSrcweir             break;
1207cdf0e10cSrcweir 
1208cdf0e10cSrcweir         case ViewShell::ST_OUTLINE:
1209cdf0e10cSrcweir             mpToolBarManager->AddToolBar(
1210cdf0e10cSrcweir                 ToolBarManager::TBG_PERMANENT,
1211cdf0e10cSrcweir                 ToolBarManager::msOutlineToolBar);
1212cdf0e10cSrcweir             mpToolBarManager->AddToolBar(
1213cdf0e10cSrcweir                 ToolBarManager::TBG_PERMANENT,
1214cdf0e10cSrcweir                 ToolBarManager::msViewerToolBar);
1215cdf0e10cSrcweir             mpToolBarManager->AddToolBarShell(
1216cdf0e10cSrcweir                 ToolBarManager::TBG_PERMANENT, RID_DRAW_TEXT_TOOLBOX);
1217cdf0e10cSrcweir             break;
1218cdf0e10cSrcweir 
1219cdf0e10cSrcweir         case ViewShell::ST_SLIDE_SORTER:
1220cdf0e10cSrcweir             mpToolBarManager->AddToolBar(
1221cdf0e10cSrcweir                 ToolBarManager::TBG_PERMANENT,
1222cdf0e10cSrcweir                 ToolBarManager::msViewerToolBar);
1223cdf0e10cSrcweir             mpToolBarManager->AddToolBar(
1224cdf0e10cSrcweir                 ToolBarManager::TBG_PERMANENT,
1225cdf0e10cSrcweir                 ToolBarManager::msSlideSorterToolBar);
1226cdf0e10cSrcweir             mpToolBarManager->AddToolBar(
1227cdf0e10cSrcweir                 ToolBarManager::TBG_PERMANENT,
1228cdf0e10cSrcweir                 ToolBarManager::msSlideSorterObjectBar);
1229cdf0e10cSrcweir             break;
1230cdf0e10cSrcweir 
1231cdf0e10cSrcweir         case ViewShell::ST_NONE:
1232cdf0e10cSrcweir         case ViewShell::ST_PRESENTATION:
12337a32b0c8SAndre Fischer         case ViewShell::ST_SIDEBAR:
1234cdf0e10cSrcweir         default:
1235cdf0e10cSrcweir             break;
1236cdf0e10cSrcweir     }
1237cdf0e10cSrcweir }
1238cdf0e10cSrcweir 
1239cdf0e10cSrcweir 
1240cdf0e10cSrcweir 
1241cdf0e10cSrcweir 
MainViewShellChanged(const ViewShell & rMainViewShell)1242cdf0e10cSrcweir void ToolBarRules::MainViewShellChanged (const ViewShell& rMainViewShell)
1243cdf0e10cSrcweir {
1244cdf0e10cSrcweir     ::sd::ToolBarManager::UpdateLock aToolBarManagerLock (mpToolBarManager);
1245cdf0e10cSrcweir     ::sd::ViewShellManager::UpdateLock aViewShellManagerLock (mpViewShellManager);
1246cdf0e10cSrcweir 
1247cdf0e10cSrcweir     MainViewShellChanged(rMainViewShell.GetShellType());
1248cdf0e10cSrcweir     switch(rMainViewShell.GetShellType())
1249cdf0e10cSrcweir     {
1250cdf0e10cSrcweir         case ::sd::ViewShell::ST_IMPRESS:
1251cdf0e10cSrcweir         case ::sd::ViewShell::ST_DRAW:
1252cdf0e10cSrcweir         case ::sd::ViewShell::ST_NOTES:
1253cdf0e10cSrcweir         {
1254cdf0e10cSrcweir             const DrawViewShell* pDrawViewShell
1255cdf0e10cSrcweir                 = dynamic_cast<const DrawViewShell*>(&rMainViewShell);
1256cdf0e10cSrcweir             if (pDrawViewShell != NULL)
1257cdf0e10cSrcweir                 if (pDrawViewShell->GetEditMode() == EM_MASTERPAGE)
1258cdf0e10cSrcweir                     mpToolBarManager->AddToolBar(
1259cdf0e10cSrcweir                         ToolBarManager::TBG_MASTER_MODE,
1260cdf0e10cSrcweir                         ToolBarManager::msMasterViewToolBar);
1261cdf0e10cSrcweir             break;
1262cdf0e10cSrcweir         }
1263cdf0e10cSrcweir 
1264cdf0e10cSrcweir         default:
1265cdf0e10cSrcweir             break;
1266cdf0e10cSrcweir     }
1267cdf0e10cSrcweir }
1268cdf0e10cSrcweir 
1269cdf0e10cSrcweir 
1270cdf0e10cSrcweir 
1271cdf0e10cSrcweir 
SelectionHasChanged(const::sd::ViewShell & rViewShell,const SdrView & rView)1272cdf0e10cSrcweir void ToolBarRules::SelectionHasChanged (
1273cdf0e10cSrcweir     const ::sd::ViewShell& rViewShell,
1274cdf0e10cSrcweir     const SdrView& rView)
1275cdf0e10cSrcweir {
1276cdf0e10cSrcweir     ::sd::ToolBarManager::UpdateLock aLock (mpToolBarManager);
1277cdf0e10cSrcweir     mpToolBarManager->LockViewShellManager();
1278cdf0e10cSrcweir 	bool bTextEdit = rView.IsTextEdit();
1279cdf0e10cSrcweir 
1280cdf0e10cSrcweir 	mpToolBarManager->ResetToolBars(ToolBarManager::TBG_FUNCTION);
1281cdf0e10cSrcweir 
1282cdf0e10cSrcweir     switch (rView.GetContext())
1283cdf0e10cSrcweir     {
1284cdf0e10cSrcweir         case SDRCONTEXT_GRAPHIC:
1285cdf0e10cSrcweir 			if( !bTextEdit )
1286cdf0e10cSrcweir 				mpToolBarManager->SetToolBarShell(ToolBarManager::TBG_FUNCTION, RID_DRAW_GRAF_TOOLBOX);
1287cdf0e10cSrcweir             break;
1288cdf0e10cSrcweir 
1289cdf0e10cSrcweir         case SDRCONTEXT_MEDIA:
1290cdf0e10cSrcweir 			if( !bTextEdit )
1291cdf0e10cSrcweir 	            mpToolBarManager->SetToolBarShell(ToolBarManager::TBG_FUNCTION, RID_DRAW_MEDIA_TOOLBOX);
1292cdf0e10cSrcweir             break;
1293cdf0e10cSrcweir 
1294cdf0e10cSrcweir 		case SDRCONTEXT_TABLE:
1295cdf0e10cSrcweir 			mpToolBarManager->SetToolBarShell(ToolBarManager::TBG_FUNCTION, RID_DRAW_TABLE_TOOLBOX);
1296cdf0e10cSrcweir 			bTextEdit = true;
1297cdf0e10cSrcweir             break;
1298cdf0e10cSrcweir 
1299cdf0e10cSrcweir         case SDRCONTEXT_STANDARD:
1300cdf0e10cSrcweir         default:
1301cdf0e10cSrcweir 			if( !bTextEdit )
1302cdf0e10cSrcweir 			{
1303cdf0e10cSrcweir 				switch(rViewShell.GetShellType())
1304cdf0e10cSrcweir 				{
1305cdf0e10cSrcweir 					case ::sd::ViewShell::ST_IMPRESS:
1306cdf0e10cSrcweir 					case ::sd::ViewShell::ST_DRAW:
1307cdf0e10cSrcweir 					case ::sd::ViewShell::ST_NOTES:
1308cdf0e10cSrcweir 					case ::sd::ViewShell::ST_HANDOUT:
1309cdf0e10cSrcweir 						mpToolBarManager->SetToolBar(
1310cdf0e10cSrcweir 							ToolBarManager::TBG_FUNCTION,
1311cdf0e10cSrcweir 							ToolBarManager::msDrawingObjectToolBar);
1312cdf0e10cSrcweir 						break;
1313cdf0e10cSrcweir 					default:
1314cdf0e10cSrcweir 						break;
1315cdf0e10cSrcweir 				}
1316cdf0e10cSrcweir 				break;
1317cdf0e10cSrcweir 			}
1318cdf0e10cSrcweir     }
1319cdf0e10cSrcweir 
1320cdf0e10cSrcweir 	if( bTextEdit )
1321cdf0e10cSrcweir 		mpToolBarManager->AddToolBarShell(ToolBarManager::TBG_FUNCTION, RID_DRAW_TEXT_TOOLBOX);
1322cdf0e10cSrcweir 
1323cdf0e10cSrcweir     SdrView* pView = &const_cast<SdrView&>(rView);
1324cdf0e10cSrcweir     // Check if the extrusion tool bar and the fontwork tool bar have to
1325cdf0e10cSrcweir     // be activated.
1326cdf0e10cSrcweir     if (svx::checkForSelectedCustomShapes(pView, true /* bOnlyExtruded */ ))
1327cdf0e10cSrcweir         mpToolBarManager->AddToolBarShell(ToolBarManager::TBG_FUNCTION, RID_SVX_EXTRUSION_BAR);
1328cdf0e10cSrcweir     sal_uInt32 nCheckStatus = 0;
1329cdf0e10cSrcweir     if (svx::checkForSelectedFontWork(pView, nCheckStatus))
1330cdf0e10cSrcweir         mpToolBarManager->AddToolBarShell(ToolBarManager::TBG_FUNCTION, RID_SVX_FONTWORK_BAR);
1331cdf0e10cSrcweir 
1332cdf0e10cSrcweir     // Switch on additional context-sensitive tool bars.
1333cdf0e10cSrcweir     if (rView.GetContext() == SDRCONTEXT_POINTEDIT)
1334cdf0e10cSrcweir         mpToolBarManager->AddToolBarShell(ToolBarManager::TBG_FUNCTION, RID_BEZIER_TOOLBOX);
1335cdf0e10cSrcweir }
1336cdf0e10cSrcweir 
1337cdf0e10cSrcweir 
1338cdf0e10cSrcweir 
1339cdf0e10cSrcweir 
SubShellAdded(::sd::ToolBarManager::ToolBarGroup eGroup,sd::ShellId nShellId)1340cdf0e10cSrcweir void ToolBarRules::SubShellAdded (
1341cdf0e10cSrcweir     ::sd::ToolBarManager::ToolBarGroup eGroup,
1342cdf0e10cSrcweir     sd::ShellId nShellId)
1343cdf0e10cSrcweir {
1344cdf0e10cSrcweir     // For some tool bar shells (those defined in sd) we have to add the
1345cdf0e10cSrcweir     // actual tool bar here.
1346cdf0e10cSrcweir     switch (nShellId)
1347cdf0e10cSrcweir     {
1348cdf0e10cSrcweir         case RID_DRAW_GRAF_TOOLBOX:
1349cdf0e10cSrcweir             mpToolBarManager->AddToolBar(eGroup, ToolBarManager::msGraphicObjectBar);
1350cdf0e10cSrcweir             break;
1351cdf0e10cSrcweir 
1352cdf0e10cSrcweir         case RID_DRAW_MEDIA_TOOLBOX:
1353cdf0e10cSrcweir             mpToolBarManager->AddToolBar(eGroup, ToolBarManager::msMediaObjectBar);
1354cdf0e10cSrcweir             break;
1355cdf0e10cSrcweir 
1356cdf0e10cSrcweir         case RID_DRAW_TEXT_TOOLBOX:
1357cdf0e10cSrcweir             mpToolBarManager->AddToolBar(eGroup, ToolBarManager::msTextObjectBar);
1358cdf0e10cSrcweir             break;
1359cdf0e10cSrcweir 
1360cdf0e10cSrcweir         case RID_BEZIER_TOOLBOX:
1361cdf0e10cSrcweir             mpToolBarManager->AddToolBar(eGroup, ToolBarManager::msBezierObjectBar);
1362cdf0e10cSrcweir             break;
1363cdf0e10cSrcweir 
1364cdf0e10cSrcweir 		case RID_DRAW_TABLE_TOOLBOX:
1365cdf0e10cSrcweir 			mpToolBarManager->AddToolBar(eGroup, ToolBarManager::msTableObjectBar);
1366cdf0e10cSrcweir 			break;
1367cdf0e10cSrcweir     }
1368cdf0e10cSrcweir }
1369cdf0e10cSrcweir 
1370cdf0e10cSrcweir 
1371cdf0e10cSrcweir 
1372cdf0e10cSrcweir 
SubShellRemoved(::sd::ToolBarManager::ToolBarGroup eGroup,sd::ShellId nShellId)1373cdf0e10cSrcweir void ToolBarRules::SubShellRemoved (
1374cdf0e10cSrcweir     ::sd::ToolBarManager::ToolBarGroup eGroup,
1375cdf0e10cSrcweir     sd::ShellId nShellId)
1376cdf0e10cSrcweir {
1377cdf0e10cSrcweir     // For some tool bar shells (those defined in sd) we have to add the
1378cdf0e10cSrcweir     // actual tool bar here.
1379cdf0e10cSrcweir     switch (nShellId)
1380cdf0e10cSrcweir     {
1381cdf0e10cSrcweir         case RID_DRAW_GRAF_TOOLBOX:
1382cdf0e10cSrcweir             mpToolBarManager->RemoveToolBar(eGroup, ToolBarManager::msGraphicObjectBar);
1383cdf0e10cSrcweir             break;
1384cdf0e10cSrcweir 
1385cdf0e10cSrcweir         case RID_DRAW_MEDIA_TOOLBOX:
1386cdf0e10cSrcweir             mpToolBarManager->RemoveToolBar(eGroup, ToolBarManager::msMediaObjectBar);
1387cdf0e10cSrcweir             break;
1388cdf0e10cSrcweir 
1389cdf0e10cSrcweir         case RID_DRAW_TEXT_TOOLBOX:
1390cdf0e10cSrcweir             mpToolBarManager->RemoveToolBar(eGroup, ToolBarManager::msTextObjectBar);
1391cdf0e10cSrcweir             break;
1392cdf0e10cSrcweir 
1393cdf0e10cSrcweir         case RID_BEZIER_TOOLBOX:
1394cdf0e10cSrcweir             mpToolBarManager->RemoveToolBar(eGroup, ToolBarManager::msBezierObjectBar);
1395cdf0e10cSrcweir             break;
1396cdf0e10cSrcweir 
1397cdf0e10cSrcweir 		case RID_DRAW_TABLE_TOOLBOX:
1398cdf0e10cSrcweir 			mpToolBarManager->RemoveToolBar(eGroup, ToolBarManager::msTableObjectBar);
1399cdf0e10cSrcweir 			break;
1400cdf0e10cSrcweir     }
1401cdf0e10cSrcweir }
1402cdf0e10cSrcweir 
1403cdf0e10cSrcweir 
1404cdf0e10cSrcweir 
1405cdf0e10cSrcweir 
1406cdf0e10cSrcweir //===== ToolBarList ===========================================================
1407cdf0e10cSrcweir 
ToolBarList(void)1408cdf0e10cSrcweir ToolBarList::ToolBarList (void)
1409cdf0e10cSrcweir     : maGroups(),
1410cdf0e10cSrcweir       maActiveToolBars()
1411cdf0e10cSrcweir {
1412cdf0e10cSrcweir }
1413cdf0e10cSrcweir 
1414cdf0e10cSrcweir 
1415cdf0e10cSrcweir 
1416cdf0e10cSrcweir 
ClearGroup(sd::ToolBarManager::ToolBarGroup eGroup)1417cdf0e10cSrcweir void ToolBarList::ClearGroup (sd::ToolBarManager::ToolBarGroup eGroup)
1418cdf0e10cSrcweir {
1419cdf0e10cSrcweir     Groups::iterator iGroup (maGroups.find(eGroup));
1420cdf0e10cSrcweir     if (iGroup != maGroups.end())
1421cdf0e10cSrcweir     {
1422cdf0e10cSrcweir         if ( ! iGroup->second.empty())
1423cdf0e10cSrcweir         {
1424cdf0e10cSrcweir             iGroup->second.clear();
1425cdf0e10cSrcweir         }
1426cdf0e10cSrcweir     }
1427cdf0e10cSrcweir }
1428cdf0e10cSrcweir 
1429cdf0e10cSrcweir 
1430cdf0e10cSrcweir 
1431cdf0e10cSrcweir 
AddToolBar(sd::ToolBarManager::ToolBarGroup eGroup,const::rtl::OUString & rsName)1432cdf0e10cSrcweir void ToolBarList::AddToolBar (
1433cdf0e10cSrcweir     sd::ToolBarManager::ToolBarGroup eGroup,
1434cdf0e10cSrcweir     const ::rtl::OUString& rsName)
1435cdf0e10cSrcweir {
1436cdf0e10cSrcweir     Groups::iterator iGroup (maGroups.find(eGroup));
1437cdf0e10cSrcweir     if (iGroup == maGroups.end())
1438cdf0e10cSrcweir         iGroup = maGroups.insert(Groups::value_type(eGroup,NameList())).first;
1439cdf0e10cSrcweir 
1440cdf0e10cSrcweir     if (iGroup != maGroups.end())
1441cdf0e10cSrcweir     {
1442cdf0e10cSrcweir         NameList::const_iterator iBar (
1443cdf0e10cSrcweir             ::std::find(iGroup->second.begin(),iGroup->second.end(),rsName));
1444cdf0e10cSrcweir         if (iBar == iGroup->second.end())
1445cdf0e10cSrcweir         {
1446cdf0e10cSrcweir             iGroup->second.push_back(rsName);
1447cdf0e10cSrcweir         }
1448cdf0e10cSrcweir     }
1449cdf0e10cSrcweir }
1450cdf0e10cSrcweir 
1451cdf0e10cSrcweir 
1452cdf0e10cSrcweir 
1453cdf0e10cSrcweir 
RemoveToolBar(sd::ToolBarManager::ToolBarGroup eGroup,const::rtl::OUString & rsName)1454cdf0e10cSrcweir bool ToolBarList::RemoveToolBar (
1455cdf0e10cSrcweir     sd::ToolBarManager::ToolBarGroup eGroup,
1456cdf0e10cSrcweir     const ::rtl::OUString& rsName)
1457cdf0e10cSrcweir {
1458cdf0e10cSrcweir     Groups::iterator iGroup (maGroups.find(eGroup));
1459cdf0e10cSrcweir     if (iGroup != maGroups.end())
1460cdf0e10cSrcweir     {
1461cdf0e10cSrcweir         NameList::iterator iBar (
1462cdf0e10cSrcweir             ::std::find(iGroup->second.begin(),iGroup->second.end(),rsName));
1463cdf0e10cSrcweir         if (iBar != iGroup->second.end())
1464cdf0e10cSrcweir         {
1465cdf0e10cSrcweir             iGroup->second.erase(iBar);
1466cdf0e10cSrcweir             return true;
1467cdf0e10cSrcweir         }
1468cdf0e10cSrcweir     }
1469cdf0e10cSrcweir     return false;
1470cdf0e10cSrcweir }
1471cdf0e10cSrcweir 
1472cdf0e10cSrcweir 
1473cdf0e10cSrcweir 
1474cdf0e10cSrcweir 
MakeRequestedToolBarList(NameList & rRequestedToolBars) const1475cdf0e10cSrcweir void ToolBarList::MakeRequestedToolBarList (NameList& rRequestedToolBars) const
1476cdf0e10cSrcweir {
1477cdf0e10cSrcweir     for (int i=sd::ToolBarManager::TBG__FIRST; i<=sd::ToolBarManager::TBG__LAST; ++i)
1478cdf0e10cSrcweir     {
1479cdf0e10cSrcweir         ::sd::ToolBarManager::ToolBarGroup eGroup = (::sd::ToolBarManager::ToolBarGroup)i;
1480cdf0e10cSrcweir         Groups::const_iterator iGroup (maGroups.find(eGroup));
1481cdf0e10cSrcweir         if (iGroup != maGroups.end())
1482cdf0e10cSrcweir             ::std::copy(
1483cdf0e10cSrcweir                 iGroup->second.begin(),
1484cdf0e10cSrcweir                 iGroup->second.end(),
1485cdf0e10cSrcweir                 ::std::inserter(rRequestedToolBars,rRequestedToolBars.end()));
1486cdf0e10cSrcweir     }
1487cdf0e10cSrcweir }
1488cdf0e10cSrcweir 
1489cdf0e10cSrcweir 
1490cdf0e10cSrcweir 
1491cdf0e10cSrcweir 
GetToolBarsToActivate(NameList & rToolBars) const1492cdf0e10cSrcweir void ToolBarList::GetToolBarsToActivate (NameList& rToolBars) const
1493cdf0e10cSrcweir {
1494cdf0e10cSrcweir     NameList aRequestedToolBars;
1495cdf0e10cSrcweir     MakeRequestedToolBarList(aRequestedToolBars);
1496cdf0e10cSrcweir 
1497cdf0e10cSrcweir     NameList::const_iterator iToolBar;
1498cdf0e10cSrcweir     for (iToolBar=aRequestedToolBars.begin(); iToolBar!=aRequestedToolBars.end(); ++iToolBar)
1499cdf0e10cSrcweir     {
1500cdf0e10cSrcweir         if (::std::find(maActiveToolBars.begin(),maActiveToolBars.end(),*iToolBar)
1501cdf0e10cSrcweir             == maActiveToolBars.end())
1502cdf0e10cSrcweir         {
1503cdf0e10cSrcweir             rToolBars.push_back(*iToolBar);
1504cdf0e10cSrcweir         }
1505cdf0e10cSrcweir     }
1506cdf0e10cSrcweir }
1507cdf0e10cSrcweir 
1508cdf0e10cSrcweir 
1509cdf0e10cSrcweir 
1510cdf0e10cSrcweir 
GetToolBarsToDeactivate(NameList & rToolBars) const1511cdf0e10cSrcweir void ToolBarList::GetToolBarsToDeactivate (NameList& rToolBars) const
1512cdf0e10cSrcweir {
1513cdf0e10cSrcweir     NameList aRequestedToolBars;
1514cdf0e10cSrcweir     MakeRequestedToolBarList(aRequestedToolBars);
1515cdf0e10cSrcweir 
1516cdf0e10cSrcweir     NameList::const_iterator iToolBar;
1517cdf0e10cSrcweir     for (iToolBar=maActiveToolBars.begin(); iToolBar!=maActiveToolBars.end(); ++iToolBar)
1518cdf0e10cSrcweir     {
1519cdf0e10cSrcweir         if (::std::find(aRequestedToolBars.begin(),aRequestedToolBars.end(),*iToolBar)
1520cdf0e10cSrcweir             == aRequestedToolBars.end())
1521cdf0e10cSrcweir         {
1522cdf0e10cSrcweir             rToolBars.push_back(*iToolBar);
1523cdf0e10cSrcweir         }
1524cdf0e10cSrcweir     }
1525cdf0e10cSrcweir }
1526cdf0e10cSrcweir 
1527cdf0e10cSrcweir 
1528cdf0e10cSrcweir 
1529cdf0e10cSrcweir 
MarkToolBarAsActive(const::rtl::OUString & rsName)1530cdf0e10cSrcweir void ToolBarList::MarkToolBarAsActive (const ::rtl::OUString& rsName)
1531cdf0e10cSrcweir {
1532cdf0e10cSrcweir     maActiveToolBars.push_back(rsName);
1533cdf0e10cSrcweir }
1534cdf0e10cSrcweir 
1535cdf0e10cSrcweir 
1536cdf0e10cSrcweir 
1537cdf0e10cSrcweir 
MarkToolBarAsNotActive(const::rtl::OUString & rsName)1538cdf0e10cSrcweir void ToolBarList::MarkToolBarAsNotActive (const ::rtl::OUString& rsName)
1539cdf0e10cSrcweir {
1540cdf0e10cSrcweir     maActiveToolBars.erase(
1541cdf0e10cSrcweir         ::std::find(maActiveToolBars.begin(),maActiveToolBars.end(), rsName));
1542cdf0e10cSrcweir }
1543cdf0e10cSrcweir 
1544cdf0e10cSrcweir 
1545cdf0e10cSrcweir 
1546cdf0e10cSrcweir 
MarkAllToolBarsAsNotActive(void)1547cdf0e10cSrcweir void ToolBarList::MarkAllToolBarsAsNotActive (void)
1548cdf0e10cSrcweir {
1549cdf0e10cSrcweir     maActiveToolBars.clear();
1550cdf0e10cSrcweir }
1551cdf0e10cSrcweir 
1552cdf0e10cSrcweir 
1553cdf0e10cSrcweir 
1554cdf0e10cSrcweir 
1555cdf0e10cSrcweir //===== ToolBarShellList ======================================================
1556cdf0e10cSrcweir 
ShellDescriptor(ShellId nId,sd::ToolBarManager::ToolBarGroup eGroup)1557cdf0e10cSrcweir ToolBarShellList::ShellDescriptor::ShellDescriptor (
1558cdf0e10cSrcweir     ShellId nId,
1559cdf0e10cSrcweir     sd::ToolBarManager::ToolBarGroup eGroup)
1560cdf0e10cSrcweir     : mnId(nId),
1561cdf0e10cSrcweir       meGroup(eGroup)
1562cdf0e10cSrcweir {
1563cdf0e10cSrcweir }
1564cdf0e10cSrcweir 
1565cdf0e10cSrcweir 
1566cdf0e10cSrcweir 
1567cdf0e10cSrcweir 
ToolBarShellList(void)1568cdf0e10cSrcweir ToolBarShellList::ToolBarShellList (void)
1569cdf0e10cSrcweir : maNewList()
1570cdf0e10cSrcweir , maCurrentList()
1571cdf0e10cSrcweir {
1572cdf0e10cSrcweir }
1573cdf0e10cSrcweir 
1574cdf0e10cSrcweir 
1575cdf0e10cSrcweir 
1576cdf0e10cSrcweir 
ClearGroup(sd::ToolBarManager::ToolBarGroup eGroup)1577cdf0e10cSrcweir void ToolBarShellList::ClearGroup (sd::ToolBarManager::ToolBarGroup eGroup)
1578cdf0e10cSrcweir {
1579cdf0e10cSrcweir     // In every loop we erase the first member of the specified group.
1580cdf0e10cSrcweir     // Because that invalidates the iterator another loop is started after
1581cdf0e10cSrcweir     // that.  The loop is left only when no member of the group is found and
1582cdf0e10cSrcweir     // no element is erased
1583cdf0e10cSrcweir     bool bLoop;
1584cdf0e10cSrcweir     do
1585cdf0e10cSrcweir     {
1586cdf0e10cSrcweir         bLoop = false;
1587cdf0e10cSrcweir 
1588cdf0e10cSrcweir         GroupedShellList::iterator iDescriptor;
1589cdf0e10cSrcweir         for (iDescriptor=maNewList.begin(); iDescriptor!=maNewList.end(); ++iDescriptor)
1590cdf0e10cSrcweir             if (iDescriptor->meGroup == eGroup)
1591cdf0e10cSrcweir             {
1592cdf0e10cSrcweir                 maNewList.erase(iDescriptor);
1593cdf0e10cSrcweir                 // Erasing the descriptor invalidated the iterator so we
1594cdf0e10cSrcweir                 // have to exit the for loop and start anew to search for
1595cdf0e10cSrcweir                 // further elements of the group.
1596cdf0e10cSrcweir                 bLoop = true;
1597cdf0e10cSrcweir                 break;
1598cdf0e10cSrcweir             }
1599cdf0e10cSrcweir     }
1600cdf0e10cSrcweir     while (bLoop);
1601cdf0e10cSrcweir }
1602cdf0e10cSrcweir 
1603cdf0e10cSrcweir 
1604cdf0e10cSrcweir 
1605cdf0e10cSrcweir 
AddShellId(sd::ToolBarManager::ToolBarGroup eGroup,sd::ShellId nId)1606cdf0e10cSrcweir void ToolBarShellList::AddShellId (sd::ToolBarManager::ToolBarGroup eGroup, sd::ShellId nId)
1607cdf0e10cSrcweir {
1608cdf0e10cSrcweir     // Make sure that the shell is not added twice (and possibly in
1609cdf0e10cSrcweir     // different groups.)
1610cdf0e10cSrcweir     ShellDescriptor aDescriptor (nId,eGroup);
1611cdf0e10cSrcweir     GroupedShellList::iterator iDescriptor (maNewList.find(aDescriptor));
1612cdf0e10cSrcweir     if (iDescriptor != maNewList.end())
1613cdf0e10cSrcweir     {
1614cdf0e10cSrcweir         // The shell is already requested.
1615cdf0e10cSrcweir         if (iDescriptor->meGroup != eGroup)
1616cdf0e10cSrcweir         {
1617cdf0e10cSrcweir             // It is now being requested for another group.
1618cdf0e10cSrcweir             // (Is this an error?)
1619cdf0e10cSrcweir             // Move it to that group.
1620cdf0e10cSrcweir             maNewList.erase(iDescriptor);
1621cdf0e10cSrcweir             maNewList.insert(aDescriptor);
1622cdf0e10cSrcweir         }
1623cdf0e10cSrcweir         // else nothing to do.
1624cdf0e10cSrcweir     }
1625cdf0e10cSrcweir     else
1626cdf0e10cSrcweir         maNewList.insert(aDescriptor);
1627cdf0e10cSrcweir }
1628cdf0e10cSrcweir 
1629cdf0e10cSrcweir 
1630cdf0e10cSrcweir 
1631cdf0e10cSrcweir 
ReleaseAllShells(ToolBarRules & rRules)1632cdf0e10cSrcweir void ToolBarShellList::ReleaseAllShells (ToolBarRules& rRules)
1633cdf0e10cSrcweir {
1634cdf0e10cSrcweir     // Release the currently active tool bars.
1635cdf0e10cSrcweir     GroupedShellList aList (maCurrentList);
1636cdf0e10cSrcweir     GroupedShellList::iterator iDescriptor;
1637cdf0e10cSrcweir     for (iDescriptor=aList.begin(); iDescriptor!=aList.end(); ++iDescriptor)
1638cdf0e10cSrcweir     {
1639cdf0e10cSrcweir         rRules.SubShellRemoved(iDescriptor->meGroup, iDescriptor->mnId);
1640cdf0e10cSrcweir     }
1641cdf0e10cSrcweir 
1642cdf0e10cSrcweir     // Clear the list of requested tool bars.
1643cdf0e10cSrcweir     maNewList.clear();
1644cdf0e10cSrcweir }
1645cdf0e10cSrcweir 
1646cdf0e10cSrcweir 
1647cdf0e10cSrcweir 
1648cdf0e10cSrcweir 
UpdateShells(const::boost::shared_ptr<ViewShell> & rpMainViewShell,const::boost::shared_ptr<ViewShellManager> & rpManager)1649cdf0e10cSrcweir void ToolBarShellList::UpdateShells (
1650cdf0e10cSrcweir     const ::boost::shared_ptr<ViewShell>& rpMainViewShell,
1651cdf0e10cSrcweir     const ::boost::shared_ptr<ViewShellManager>& rpManager)
1652cdf0e10cSrcweir {
1653cdf0e10cSrcweir     if (rpMainViewShell.get() != NULL)
1654cdf0e10cSrcweir     {
1655cdf0e10cSrcweir         GroupedShellList aList;
1656cdf0e10cSrcweir 
1657cdf0e10cSrcweir         // Deactivate shells that are in maCurrentList, but not in
1658cdf0e10cSrcweir         // maNewList.
1659cdf0e10cSrcweir         ::std::set_difference(maCurrentList.begin(), maCurrentList.end(),
1660cdf0e10cSrcweir             maNewList.begin(), maNewList.end(),
1661cdf0e10cSrcweir             std::insert_iterator<GroupedShellList>(aList,aList.begin()));
1662cdf0e10cSrcweir         for (GroupedShellList::iterator iShell=aList.begin(); iShell!=aList.end(); ++iShell)
1663cdf0e10cSrcweir         {
1664cdf0e10cSrcweir #ifdef VERBOSE
1665cdf0e10cSrcweir             OSL_TRACE("deactivating tool bar shell %d\n", iShell->mnId);
1666cdf0e10cSrcweir #endif
1667cdf0e10cSrcweir             rpManager->DeactivateSubShell(*rpMainViewShell, iShell->mnId);
1668cdf0e10cSrcweir         }
1669cdf0e10cSrcweir 
1670cdf0e10cSrcweir         // Activate shells that are in maNewList, but not in
1671cdf0e10cSrcweir         // maCurrentList.
1672cdf0e10cSrcweir         aList.clear();
1673cdf0e10cSrcweir         ::std::set_difference(maNewList.begin(), maNewList.end(),
1674cdf0e10cSrcweir             maCurrentList.begin(), maCurrentList.end(),
1675cdf0e10cSrcweir             std::insert_iterator<GroupedShellList>(aList,aList.begin()));
1676cdf0e10cSrcweir         for (GroupedShellList::iterator iShell=aList.begin(); iShell!=aList.end(); ++iShell)
1677cdf0e10cSrcweir         {
1678cdf0e10cSrcweir #ifdef VERBOSE
1679cdf0e10cSrcweir             OSL_TRACE("activating tool bar shell %d\n", iShell->mnId);
1680cdf0e10cSrcweir #endif
1681cdf0e10cSrcweir             rpManager->ActivateSubShell(*rpMainViewShell, iShell->mnId);
1682cdf0e10cSrcweir         }
1683cdf0e10cSrcweir 
1684cdf0e10cSrcweir         // The maNewList now refelects the current state and thus is made
1685cdf0e10cSrcweir         // maCurrentList.
1686cdf0e10cSrcweir         maCurrentList = maNewList;
1687cdf0e10cSrcweir     }
1688cdf0e10cSrcweir }
1689cdf0e10cSrcweir 
1690cdf0e10cSrcweir 
1691cdf0e10cSrcweir 
1692cdf0e10cSrcweir 
1693cdf0e10cSrcweir } // end of anonymous namespace
1694