/************************************************************** * * 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 "SidebarFactory.hxx" #include "framework/Pane.hxx" #include "ViewShellBase.hxx" #include "DrawController.hxx" #include "LayoutMenu.hxx" #include "CurrentMasterPagesSelector.hxx" #include "RecentMasterPagesSelector.hxx" #include "AllMasterPagesSelector.hxx" #include "CustomAnimationPanel.hxx" #include "TableDesignPanel.hxx" #include "SlideTransitionPanel.hxx" #include #include #include #include #include using namespace css; using namespace cssu; using namespace ::sd::framework; using ::rtl::OUString; #define A2S(pString) (::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(pString))) namespace sd { namespace sidebar { namespace { /** Note that these names have to be identical to (the tail of) the entries in officecfg/registry/data/org/openoffice/Office/Impress.xcu for the TaskPanelFactory. */ const static char* gsResourceNameCustomAnimations = "/CustomAnimations"; const static char* gsResourceNameLayouts = "/Layouts"; const static char* gsResourceNameAllMasterPages = "/AllMasterPages"; const static char* gsResourceNameRecentMasterPages = "/RecentMasterPages"; const static char* gsResourceNameUsedMasterPages = "/UsedMasterPages"; const static char* gsResourceNameSlideTransitions = "/SlideTransitions"; const static char* gsResourceNameTableDesign = "/TableDesign"; } Reference mxControllerDisposeListener; // ----- Service functions ---------------------------------------------------- Reference SAL_CALL SidebarFactory_createInstance ( const Reference& rxContext) { return Reference(static_cast(new SidebarFactory(rxContext))); } ::rtl::OUString SidebarFactory_getImplementationName (void) throw(RuntimeException) { return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("org.openoffice.comp.Draw.framework.SidebarFactory")); } Sequence SAL_CALL SidebarFactory_getSupportedServiceNames (void) throw (RuntimeException) { static const ::rtl::OUString sServiceName( ::rtl::OUString::createFromAscii("com.sun.star.drawing.framework.SidebarFactory")); return Sequence(&sServiceName, 1); } //----- SidebarFactory -------------------------------------------------------- SidebarFactory::SidebarFactory( const css::uno::Reference& rxContext) : SidebarFactoryInterfaceBase(m_aMutex) { } SidebarFactory::~SidebarFactory (void) { } void SAL_CALL SidebarFactory::disposing (void) { } // XInitialization void SAL_CALL SidebarFactory::initialize (const Sequence& aArguments) throw (Exception, RuntimeException) { } // XUIElementFactory Reference SAL_CALL SidebarFactory::createUIElement ( const ::rtl::OUString& rsUIElementResourceURL, const ::cssu::Sequence& rArguments) throw( css::container::NoSuchElementException, css::lang::IllegalArgumentException, cssu::RuntimeException) { // Process arguments. const ::comphelper::NamedValueCollection aArguments (rArguments); Reference xFrame (aArguments.getOrDefault("Frame", Reference())); Reference xParentWindow (aArguments.getOrDefault("ParentWindow", Reference())); Reference xSidebar (aArguments.getOrDefault("Sidebar", Reference())); // Throw exceptions when the arguments are not as expected. ::Window* pParentWindow = VCLUnoHelper::GetWindow(xParentWindow); if ( ! xParentWindow.is() || pParentWindow==NULL) throw RuntimeException( A2S("SidebarFactory::createUIElement called without ParentWindow"), NULL); if ( ! xFrame.is()) throw RuntimeException( A2S("SidebarFactory::createUIElement called without XFrame"), NULL); // Tunnel through the controller to obtain a ViewShellBase. ViewShellBase* pBase = NULL; Reference xTunnel (xFrame->getController(), UNO_QUERY); if (xTunnel.is()) { ::sd::DrawController* pController = reinterpret_cast( xTunnel->getSomething(sd::DrawController::getUnoTunnelId())); if (pController != NULL) pBase = pController->GetViewShellBase(); } if (pBase == NULL) throw RuntimeException(A2S("can not get ViewShellBase for frame"), NULL); // Create a framework view. ::Window* pControl = NULL; #define EndsWith(s,t) s.endsWithAsciiL(t,strlen(t)) if (EndsWith(rsUIElementResourceURL, gsResourceNameCustomAnimations)) pControl = new CustomAnimationPanel(pParentWindow, *pBase); else if (EndsWith(rsUIElementResourceURL, gsResourceNameLayouts)) pControl = new LayoutMenu(pParentWindow, *pBase, xSidebar); else if (EndsWith(rsUIElementResourceURL, gsResourceNameAllMasterPages)) pControl = AllMasterPagesSelector::Create(pParentWindow, *pBase, xSidebar); else if (EndsWith(rsUIElementResourceURL, gsResourceNameRecentMasterPages)) pControl = RecentMasterPagesSelector::Create(pParentWindow, *pBase, xSidebar); else if (EndsWith(rsUIElementResourceURL, gsResourceNameUsedMasterPages)) pControl = CurrentMasterPagesSelector::Create(pParentWindow, *pBase, xSidebar); else if (EndsWith(rsUIElementResourceURL, gsResourceNameSlideTransitions)) pControl = new SlideTransitionPanel(pParentWindow, *pBase); else if (EndsWith(rsUIElementResourceURL, gsResourceNameTableDesign)) pControl = new TableDesignPanel(pParentWindow, *pBase); #undef EndsWith if (pControl == NULL) throw lang::IllegalArgumentException(); // Create a wrapper around pane and view and return it as // XUIElement. Reference xUIElement; try { xUIElement.set( sfx2::sidebar::SidebarPanelBase::Create( rsUIElementResourceURL, xFrame, pControl, ::boost::function(), ui::LayoutSize(-1,-1,-1))); } catch(Exception& rException) { // Creation of XUIElement failed. mxUIElement remains empty. } Reference xComponent (xUIElement, UNO_QUERY); if (xComponent.is()) xComponent->addEventListener(this); return xUIElement; } void SAL_CALL SidebarFactory::disposing (const ::css::lang::EventObject& rEvent) throw(cssu::RuntimeException) { /* if (mpImplementation && rEvent.Source == mpImplementation->mxUIElement) { mpImplementation->mxUIElement.clear(); } */ } } } // end of namespace sd::sidebar