office-gobmx/sd/source/ui/framework/module/ToolBarModule.cxx
Kurt Zenker 3fd17a6d7f INTEGRATION: CWS presenterview (1.1.2); FILE ADDED
2007/07/10 14:48:52 af 1.1.2.2: #i18486# Converted several members of ViewShellBase to shared_ptrs.
2007/06/18 15:15:52 af 1.1.2.1: #i18486# Initial revision.
2008-04-03 12:41:04 +00:00

242 lines
7.9 KiB
C++

/*************************************************************************
*
* OpenOffice.org - a multi-platform office productivity suite
*
* $RCSfile: ToolBarModule.cxx,v $
*
* $Revision: 1.2 $
*
* last change: $Author: kz $ $Date: 2008-04-03 13:41:04 $
*
* The Contents of this file are made available subject to
* the terms of GNU Lesser General Public License Version 2.1.
*
*
* GNU Lesser General Public License Version 2.1
* =============================================
* Copyright 2005 by Sun Microsystems, Inc.
* 901 San Antonio Road, Palo Alto, CA 94303, USA
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License version 2.1, as published by the Free Software Foundation.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*
************************************************************************/
#include "precompiled_sd.hxx"
#include "ToolBarModule.hxx"
#include "ViewShellBase.hxx"
#include "DrawController.hxx"
#include "framework/FrameworkHelper.hxx"
#include "framework/ConfigurationController.hxx"
using namespace ::com::sun::star;
using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::drawing::framework;
using ::rtl::OUString;
using ::sd::framework::FrameworkHelper;
namespace {
static const sal_Int32 gnConfigurationUpdateStartEvent(0);
static const sal_Int32 gnConfigurationUpdateEndEvent(1);
static const sal_Int32 gnResourceActivationRequestEvent(2);
static const sal_Int32 gnResourceDeactivationRequestEvent(3);
}
namespace sd { namespace framework {
//===== ToolBarModule =========================================================
ToolBarModule::ToolBarModule (
const Reference<frame::XController>& rxController)
: ToolBarModuleInterfaceBase(m_aMutex),
mxConfigurationController(),
mpBase(NULL),
mpToolBarManagerLock(),
mbMainViewSwitchUpdatePending(false)
{
// Tunnel through the controller to obtain a ViewShellBase.
Reference<lang::XUnoTunnel> xTunnel (rxController, UNO_QUERY);
if (xTunnel.is())
{
::sd::DrawController* pController = reinterpret_cast<sd::DrawController*>(
xTunnel->getSomething(sd::DrawController::getUnoTunnelId()));
if (pController != NULL)
mpBase = pController->GetViewShellBase();
}
Reference<XControllerManager> xControllerManager (rxController, UNO_QUERY);
if (xControllerManager.is())
{
mxConfigurationController = xControllerManager->getConfigurationController();
if (mxConfigurationController.is())
{
mxConfigurationController->addConfigurationChangeListener(
this,
FrameworkHelper::msConfigurationUpdateStartEvent,
makeAny(gnConfigurationUpdateStartEvent));
mxConfigurationController->addConfigurationChangeListener(
this,
FrameworkHelper::msConfigurationUpdateEndEvent,
makeAny(gnConfigurationUpdateEndEvent));
mxConfigurationController->addConfigurationChangeListener(
this,
FrameworkHelper::msResourceActivationRequestEvent,
makeAny(gnResourceActivationRequestEvent));
mxConfigurationController->addConfigurationChangeListener(
this,
FrameworkHelper::msResourceDeactivationRequestEvent,
makeAny(gnResourceDeactivationRequestEvent));
}
}
}
ToolBarModule::~ToolBarModule (void)
{
}
void SAL_CALL ToolBarModule::disposing (void)
{
if (mxConfigurationController.is())
mxConfigurationController->removeConfigurationChangeListener(this);
mxConfigurationController = NULL;
}
void SAL_CALL ToolBarModule::notifyConfigurationChange (
const ConfigurationChangeEvent& rEvent)
throw (RuntimeException)
{
if (mxConfigurationController.is())
{
sal_Int32 nEventType = 0;
rEvent.UserData >>= nEventType;
switch (nEventType)
{
case gnConfigurationUpdateStartEvent:
HandleUpdateStart();
break;
case gnConfigurationUpdateEndEvent:
HandleUpdateEnd();
break;
case gnResourceActivationRequestEvent:
case gnResourceDeactivationRequestEvent:
// Remember the request for the activation or deactivation
// of the center pane view. When that happens then on end
// of the next configuration update the set of visible tool
// bars will be updated.
if ( ! mbMainViewSwitchUpdatePending)
if (rEvent.ResourceId->getResourceURL().match(
FrameworkHelper::msViewURLPrefix)
&& rEvent.ResourceId->isBoundToURL(
FrameworkHelper::msCenterPaneURL, AnchorBindingMode_DIRECT))
{
mbMainViewSwitchUpdatePending = true;
}
break;
}
}
}
//-----------------------------------------------------------------------------
void ToolBarModule::HandleUpdateStart (void)
{
// Lock the ToolBarManager and tell it to lock the ViewShellManager as
// well. This way the ToolBarManager can optimize the releasing of
// locks and arranging of updates of both tool bars and the view shell
// stack.
if (mpBase != NULL)
{
::boost::shared_ptr<ToolBarManager> pToolBarManager (mpBase->GetToolBarManager());
mpToolBarManagerLock.reset(new ToolBarManager::UpdateLock(pToolBarManager));
pToolBarManager->LockViewShellManager();
}
}
void ToolBarModule::HandleUpdateEnd (void)
{
if (mbMainViewSwitchUpdatePending)
{
mbMainViewSwitchUpdatePending = false;
// Update the set of visible tool bars and deactivate those that are
// no longer visible. This is done before the old view shell is
// destroyed in order to avoid unnecessary updates of those tool
// bars.
::boost::shared_ptr<ToolBarManager> pToolBarManager (mpBase->GetToolBarManager());
::boost::shared_ptr<FrameworkHelper> pFrameworkHelper (
FrameworkHelper::Instance(*mpBase));
ViewShell* pViewShell
= pFrameworkHelper->GetViewShell(FrameworkHelper::msCenterPaneURL).get();
if (pViewShell != NULL)
{
pToolBarManager->MainViewShellChanged(*pViewShell);
pToolBarManager->SelectionHasChanged(
*pViewShell,
*pViewShell->GetView());
pToolBarManager->PreUpdate();
}
else
{
pToolBarManager->MainViewShellChanged(ViewShell::ST_NONE);
pToolBarManager->PreUpdate();
}
}
// Releasing the update lock of the ToolBarManager will let the
// ToolBarManager with the help of the ViewShellManager take care of
// updating tool bars and view shell with the minimal amount of
// shell stack modifications and tool bar updates.
mpToolBarManagerLock.reset();
}
void SAL_CALL ToolBarModule::disposing (const lang::EventObject& rEvent)
throw (RuntimeException)
{
if (mxConfigurationController.is()
&& rEvent.Source == mxConfigurationController)
{
// Without the configuration controller this class can do nothing.
mxConfigurationController = NULL;
dispose();
}
}
} } // end of namespace sd::framework