blob: 401ce181939909ac9755203b251ed39104888748 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
#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