summaryrefslogtreecommitdiff
path: root/sd/source/ui/framework/factories/BasicPaneFactory.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sd/source/ui/framework/factories/BasicPaneFactory.cxx')
-rw-r--r--sd/source/ui/framework/factories/BasicPaneFactory.cxx564
1 files changed, 0 insertions, 564 deletions
diff --git a/sd/source/ui/framework/factories/BasicPaneFactory.cxx b/sd/source/ui/framework/factories/BasicPaneFactory.cxx
deleted file mode 100644
index 5d757115b..000000000
--- a/sd/source/ui/framework/factories/BasicPaneFactory.cxx
+++ /dev/null
@@ -1,564 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org 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 version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-#include "precompiled_sd.hxx"
-
-#include "BasicPaneFactory.hxx"
-
-#include "ChildWindowPane.hxx"
-#include "FrameWindowPane.hxx"
-#include "FullScreenPane.hxx"
-
-#include "framework/FrameworkHelper.hxx"
-#include "ViewShellBase.hxx"
-#include "PaneChildWindows.hxx"
-#include "DrawController.hxx"
-#include "DrawDocShell.hxx"
-#include <com/sun/star/drawing/framework/XControllerManager.hpp>
-#include <boost/bind.hpp>
-
-
-using namespace ::com::sun::star;
-using namespace ::com::sun::star::uno;
-using namespace ::com::sun::star::lang;
-using namespace ::com::sun::star::drawing::framework;
-
-using ::rtl::OUString;
-using ::sd::framework::FrameworkHelper;
-
-namespace {
- enum PaneId {
- CenterPaneId,
- FullScreenPaneId,
- LeftImpressPaneId,
- LeftDrawPaneId,
- RightPaneId
- };
-
- static const sal_Int32 gnConfigurationUpdateStartEvent(0);
- static const sal_Int32 gnConfigurationUpdateEndEvent(1);
-}
-
-namespace sd { namespace framework {
-
-
-/** Store URL, XPane reference and (local) PaneId for every pane factory
- that is registered at the PaneController.
-*/
-class BasicPaneFactory::PaneDescriptor
-{
-public:
- OUString msPaneURL;
- Reference<XResource> mxPane;
- PaneId mePaneId;
- /** The mbReleased flag is set when the pane has been released. Some
- panes are just hidden and destroyed. When the pane is reused this
- flag is reset.
- */
- bool mbIsReleased;
- bool mbIsChildWindow;
-
- bool CompareURL (const OUString& rsPaneURL) { return msPaneURL.equals(rsPaneURL); }
- bool ComparePane (const Reference<XResource>& rxPane) { return mxPane==rxPane; }
-};
-
-
-class BasicPaneFactory::PaneContainer
- : public ::std::vector<PaneDescriptor>
-{
-public:
- PaneContainer (void) {}
-};
-
-
-
-Reference<XInterface> SAL_CALL BasicPaneFactory_createInstance (
- const Reference<XComponentContext>& rxContext)
-{
- return Reference<XInterface>(static_cast<XWeak*>(new BasicPaneFactory(rxContext)));
-}
-
-
-
-
-::rtl::OUString BasicPaneFactory_getImplementationName (void) throw(RuntimeException)
-{
- return ::rtl::OUString(
- RTL_CONSTASCII_USTRINGPARAM("com.sun.star.comp.Draw.framework.BasicPaneFactory"));
-}
-
-
-
-
-Sequence<rtl::OUString> SAL_CALL BasicPaneFactory_getSupportedServiceNames (void)
- throw (RuntimeException)
-{
- static const ::rtl::OUString sServiceName(
- ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.drawing.framework.BasicPaneFactory")));
- return Sequence<rtl::OUString>(&sServiceName, 1);
-}
-
-
-
-
-//===== PaneFactory ===========================================================
-
-BasicPaneFactory::BasicPaneFactory (
- const Reference<XComponentContext>& rxContext)
- : BasicPaneFactoryInterfaceBase(m_aMutex),
- mxComponentContext(rxContext),
- mxConfigurationControllerWeak(),
- mpViewShellBase(NULL),
- mpPaneContainer(new PaneContainer),
- mbFirstUpdateSeen(false),
- mpUpdateLockManager()
-{
-}
-
-
-
-
-
-BasicPaneFactory::~BasicPaneFactory (void)
-{
-}
-
-
-
-
-void SAL_CALL BasicPaneFactory::disposing (void)
-{
- Reference<XConfigurationController> xCC (mxConfigurationControllerWeak);
- if (xCC.is())
- {
- xCC->removeResourceFactoryForReference(this);
- xCC->removeConfigurationChangeListener(this);
- mxConfigurationControllerWeak = Reference<XConfigurationController>();
- }
-
- for (PaneContainer::const_iterator iDescriptor = mpPaneContainer->begin();
- iDescriptor != mpPaneContainer->end();
- ++iDescriptor)
- {
- if (iDescriptor->mbIsReleased)
- {
- Reference<XComponent> xComponent (iDescriptor->mxPane, UNO_QUERY);
- if (xComponent.is())
- {
- xComponent->removeEventListener(this);
- xComponent->dispose();
- }
- }
- }
-}
-
-
-
-
-void SAL_CALL BasicPaneFactory::initialize (const Sequence<Any>& aArguments)
- throw (Exception, RuntimeException)
-{
- if (aArguments.getLength() > 0)
- {
- try
- {
- // Get the XController from the first argument.
- Reference<frame::XController> xController (aArguments[0], UNO_QUERY_THROW);
- mxControllerWeak = xController;
-
- // Tunnel through the controller to obtain access to the ViewShellBase.
- try
- {
- Reference<lang::XUnoTunnel> xTunnel (xController, UNO_QUERY_THROW);
- DrawController* pController
- = reinterpret_cast<DrawController*>(
- (sal::static_int_cast<sal_uIntPtr>(
- xTunnel->getSomething(DrawController::getUnoTunnelId()))));
- mpViewShellBase = pController->GetViewShellBase();
- mpUpdateLockManager = mpViewShellBase->GetUpdateLockManager();
- }
- catch(RuntimeException&)
- {}
-
- Reference<XControllerManager> xCM (xController, UNO_QUERY_THROW);
- Reference<XConfigurationController> xCC (xCM->getConfigurationController());
- mxConfigurationControllerWeak = xCC;
-
- // Add pane factories for the two left panes (one for Impress and one for
- // Draw), the center pane, and the right pane.
- if (xController.is() && xCC.is())
- {
- PaneDescriptor aDescriptor;
- aDescriptor.msPaneURL = FrameworkHelper::msCenterPaneURL;
- aDescriptor.mePaneId = CenterPaneId;
- aDescriptor.mbIsReleased = false;
- aDescriptor.mbIsChildWindow = false;
- mpPaneContainer->push_back(aDescriptor);
- xCC->addResourceFactory(aDescriptor.msPaneURL, this);
-
- aDescriptor.msPaneURL = FrameworkHelper::msFullScreenPaneURL;
- aDescriptor.mePaneId = FullScreenPaneId;
- mpPaneContainer->push_back(aDescriptor);
- xCC->addResourceFactory(aDescriptor.msPaneURL, this);
-
- aDescriptor.msPaneURL = FrameworkHelper::msLeftImpressPaneURL;
- aDescriptor.mePaneId = LeftImpressPaneId;
- aDescriptor.mbIsChildWindow = true;
- mpPaneContainer->push_back(aDescriptor);
- xCC->addResourceFactory(aDescriptor.msPaneURL, this);
-
- aDescriptor.msPaneURL = FrameworkHelper::msLeftDrawPaneURL;
- aDescriptor.mePaneId = LeftDrawPaneId;
- mpPaneContainer->push_back(aDescriptor);
- xCC->addResourceFactory(aDescriptor.msPaneURL, this);
-
- aDescriptor.msPaneURL = FrameworkHelper::msRightPaneURL;
- aDescriptor.mePaneId = RightPaneId;
- mpPaneContainer->push_back(aDescriptor);
- xCC->addResourceFactory(aDescriptor.msPaneURL, this);
- }
-
- // Register as configuration change listener.
- if (xCC.is())
- {
- xCC->addConfigurationChangeListener(
- this,
- FrameworkHelper::msConfigurationUpdateStartEvent,
- makeAny(gnConfigurationUpdateStartEvent));
- xCC->addConfigurationChangeListener(
- this,
- FrameworkHelper::msConfigurationUpdateEndEvent,
- makeAny(gnConfigurationUpdateEndEvent));
- }
- }
- catch (RuntimeException&)
- {
- Reference<XConfigurationController> xCC (mxConfigurationControllerWeak);
- if (xCC.is())
- xCC->removeResourceFactoryForReference(this);
- }
- }
-}
-
-
-
-
-//===== XPaneFactory ==========================================================
-
-Reference<XResource> SAL_CALL BasicPaneFactory::createResource (
- const Reference<XResourceId>& rxPaneId)
- throw (RuntimeException, IllegalArgumentException, WrappedTargetException)
-{
- ThrowIfDisposed();
-
- Reference<XResource> xPane;
-
- // Based on the ResourceURL of the given ResourceId look up the
- // corresponding factory descriptor.
- PaneContainer::iterator iDescriptor (
- ::std::find_if (
- mpPaneContainer->begin(),
- mpPaneContainer->end(),
- ::boost::bind(&PaneDescriptor::CompareURL, _1, rxPaneId->getResourceURL())));
-
- if (iDescriptor != mpPaneContainer->end())
- {
- if (iDescriptor->mxPane.is())
- {
- // The pane has already been created and is still active (has
- // not yet been released). This should not happen.
- xPane = iDescriptor->mxPane;
- }
- else
- {
- // Create a new pane.
- switch (iDescriptor->mePaneId)
- {
- case CenterPaneId:
- xPane = CreateFrameWindowPane(rxPaneId);
- break;
-
- case FullScreenPaneId:
- xPane = CreateFullScreenPane(mxComponentContext, rxPaneId);
- break;
-
- case LeftImpressPaneId:
- case LeftDrawPaneId:
- case RightPaneId:
- xPane = CreateChildWindowPane(
- rxPaneId,
- *iDescriptor);
- break;
- }
- iDescriptor->mxPane = xPane;
-
- // Listen for the pane being disposed.
- Reference<lang::XComponent> xComponent (xPane, UNO_QUERY);
- if (xComponent.is())
- xComponent->addEventListener(this);
- }
- iDescriptor->mbIsReleased = false;
- }
- else
- {
- // The requested pane can not be created by any of the factories
- // managed by the called BasicPaneFactory object.
- throw lang::IllegalArgumentException(
- ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(
- "BasicPaneFactory::createPane() called for unknown resource id")),
- NULL,
- 0);
- }
-
- return xPane;
-}
-
-
-
-
-
-void SAL_CALL BasicPaneFactory::releaseResource (
- const Reference<XResource>& rxPane)
- throw (RuntimeException)
-{
- ThrowIfDisposed();
-
- // Based on the given XPane reference look up the corresponding factory
- // descriptor.
- PaneContainer::iterator iDescriptor (
- ::std::find_if(
- mpPaneContainer->begin(),
- mpPaneContainer->end(),
- ::boost::bind(&PaneDescriptor::ComparePane, _1, rxPane)));
-
- if (iDescriptor != mpPaneContainer->end())
- {
- // The given pane was created by one of the factories. Child
- // windows are just hidden and will be reused when requested later.
- // Other windows are disposed and their reference is reset so that
- // on the next createPane() call for the same pane type the pane is
- // created anew.
- ChildWindowPane* pChildWindowPane = dynamic_cast<ChildWindowPane*>(rxPane.get());
- if (pChildWindowPane != NULL)
- {
- iDescriptor->mbIsReleased = true;
- pChildWindowPane->Hide();
- }
- else
- {
- iDescriptor->mxPane = NULL;
- Reference<XComponent> xComponent (rxPane, UNO_QUERY);
- if (xComponent.is())
- {
- // We are disposing the pane and do not have to be informed of
- // that.
- xComponent->removeEventListener(this);
- xComponent->dispose();
- }
- }
- }
- else
- {
- // The given XPane reference is either empty or the pane was not
- // created by any of the factories managed by the called
- // BasicPaneFactory object.
- throw lang::IllegalArgumentException(
- ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(
- "BasicPaneFactory::releasePane() called for pane that that was not created by same factory.")),
- NULL,
- 0);
- }
-}
-
-
-
-
-//===== XConfigurationChangeListener ==========================================
-
-void SAL_CALL BasicPaneFactory::notifyConfigurationChange (
- const ConfigurationChangeEvent& rEvent)
- throw (RuntimeException)
-{
- sal_Int32 nEventType = 0;
- rEvent.UserData >>= nEventType;
- switch (nEventType)
- {
- case gnConfigurationUpdateStartEvent:
- // Lock UI updates while we are switching the views except for
- // the first time after creation. Outherwise this leads to
- // problems after reload (missing resizes for the side panes).
- if (mbFirstUpdateSeen)
- {
- }
- else
- mbFirstUpdateSeen = true;
- break;
-
- case gnConfigurationUpdateEndEvent:
- // Unlock the update lock here when only the visibility of
- // windows but not the view shells displayed in them have
- // changed. Otherwise the UpdateLockManager takes care of
- // unlocking at the right time.
- if (mpUpdateLockManager.get() != NULL)
- {
- ::osl::Guard< ::osl::Mutex > aGuard (::osl::Mutex::getGlobalMutex());
- }
- break;
- }
-}
-
-
-
-
-//===== lang::XEventListener ==================================================
-
-void SAL_CALL BasicPaneFactory::disposing (
- const lang::EventObject& rEventObject)
- throw (RuntimeException)
-{
- if (mxConfigurationControllerWeak == rEventObject.Source)
- {
- mxConfigurationControllerWeak = Reference<XConfigurationController>();
- }
- else
- {
- // Has one of the panes been disposed? If so, then release the
- // reference to that pane, but not the pane descriptor.
- Reference<XResource> xPane (rEventObject.Source, UNO_QUERY);
- PaneContainer::iterator iDescriptor (
- ::std::find_if (
- mpPaneContainer->begin(),
- mpPaneContainer->end(),
- ::boost::bind(&PaneDescriptor::ComparePane, _1, xPane)));
- if (iDescriptor != mpPaneContainer->end())
- {
- iDescriptor->mxPane = NULL;
- }
- }
-}
-
-
-
-
-//-----------------------------------------------------------------------------
-
-Reference<XResource> BasicPaneFactory::CreateFrameWindowPane (
- const Reference<XResourceId>& rxPaneId)
-{
- Reference<XResource> xPane;
-
- if (mpViewShellBase != NULL)
- {
- xPane = new FrameWindowPane(rxPaneId, mpViewShellBase->GetViewWindow());
- }
-
- return xPane;
-}
-
-
-
-
-Reference<XResource> BasicPaneFactory::CreateFullScreenPane (
- const Reference<XComponentContext>& rxComponentContext,
- const Reference<XResourceId>& rxPaneId)
-{
- Reference<XResource> xPane (
- new FullScreenPane(
- rxComponentContext,
- rxPaneId,
- mpViewShellBase->GetViewWindow()));
-
- return xPane;
-}
-
-
-
-
-Reference<XResource> BasicPaneFactory::CreateChildWindowPane (
- const Reference<XResourceId>& rxPaneId,
- const PaneDescriptor& rDescriptor)
-{
- Reference<XResource> xPane;
-
- if (mpViewShellBase != NULL)
- {
- // Create the corresponding shell and determine the id of the child window.
- sal_uInt16 nChildWindowId = 0;
- ::std::auto_ptr<SfxShell> pShell;
- switch (rDescriptor.mePaneId)
- {
- case LeftImpressPaneId:
- pShell.reset(new LeftImpressPaneShell());
- nChildWindowId = ::sd::LeftPaneImpressChildWindow::GetChildWindowId();
- break;
-
- case LeftDrawPaneId:
- pShell.reset(new LeftDrawPaneShell());
- nChildWindowId = ::sd::LeftPaneDrawChildWindow::GetChildWindowId();
- break;
-
- case RightPaneId:
- pShell.reset(new ToolPanelPaneShell());
- nChildWindowId = ::sd::ToolPanelChildWindow::GetChildWindowId();
- break;
-
- default:
- break;
- }
-
- // With shell and child window id create the ChildWindowPane
- // wrapper.
- if (pShell.get() != NULL)
- {
- xPane = new ChildWindowPane(
- rxPaneId,
- nChildWindowId,
- *mpViewShellBase,
- pShell);
- }
- }
-
- return xPane;
-}
-
-void BasicPaneFactory::ThrowIfDisposed (void) const
- throw (lang::DisposedException)
-{
- if (rBHelper.bDisposed || rBHelper.bInDispose)
- {
- throw lang::DisposedException (
- ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(
- "BasicPaneFactory object has already been disposed")),
- const_cast<uno::XWeak*>(static_cast<const uno::XWeak*>(this)));
- }
-}
-
-
-} } // end of namespace sd::framework
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */