LCOV - code coverage report
Current view: top level - libreoffice/sd/source/ui/view - ToolBarManager.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 17 531 3.2 %
Date: 2012-12-27 Functions: 2 79 2.5 %
Legend: Lines: hit not hit

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

Generated by: LCOV version 1.10