diff options
author | Ariel Constenla-Haile <arielch@apache.org> | 2013-05-25 22:11:08 +0000 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2013-06-24 10:08:43 +0100 |
commit | a659ac906aa2d0dfd6d10e40d8a5a6d2d70cc8fc (patch) | |
tree | 1859492c7602948eca7eb474a64087aa6dec5a3c | |
parent | 44b2fb6164aeffcc0c5bfbf53dac12f7b53fb0d4 (diff) |
framework::PopupMenuController clean-up
Changed the name, it is not a PopupMenuController, but a ToolbarController that
shows a PopupMenu filled at runtime by a PopupMenuController
Make it a base class for other ToolbarController components, there is no sense
to make it a component by itself
Use this base class for three new pure UNO ToolbarController's
(cherry picked from commit 9d1015051c92900def3d465d2eb8bf179f19a398)
Conflicts:
framework/Library_fwk.mk
framework/inc/uielement/popupmenucontroller.hxx
framework/source/uielement/popupmenucontroller.cxx
officecfg/registry/data/org/openoffice/Office/UI/Controller.xcu
Change-Id: I2f5ec06df098d65ffaa17a8f7f6f3ea8774b43c3
-rw-r--r-- | framework/Library_fwk.mk | 5 | ||||
-rw-r--r-- | framework/Library_fwl.mk | 1 | ||||
-rw-r--r-- | framework/inc/uielement/popupmenucontroller.hxx | 74 | ||||
-rw-r--r-- | framework/inc/uielement/popuptoolbarcontroller.hxx | 96 | ||||
-rw-r--r-- | framework/source/register/registerservices.cxx | 6 | ||||
-rw-r--r-- | framework/source/register/registertemp.cxx | 4 | ||||
-rw-r--r-- | framework/source/uielement/popupmenucontroller.cxx | 235 | ||||
-rw-r--r-- | framework/source/uielement/popuptoolbarcontroller.cxx | 406 | ||||
-rw-r--r-- | framework/util/fwk.component | 9 | ||||
-rw-r--r-- | framework/util/fwl.component | 3 | ||||
-rw-r--r-- | officecfg/registry/data/org/openoffice/Office/UI/Controller.xcu | 33 |
11 files changed, 553 insertions, 319 deletions
diff --git a/framework/Library_fwk.mk b/framework/Library_fwk.mk index bc9b711f2f4d..0e365051a498 100644 --- a/framework/Library_fwk.mk +++ b/framework/Library_fwk.mk @@ -104,11 +104,11 @@ $(eval $(call gb_Library_add_exception_objects,fwk,\ framework/source/loadenv/loadenv \ framework/source/loadenv/targethelper \ framework/source/register/registerservices \ + framework/source/services/ContextChangeEventMultiplexer \ framework/source/services/autorecovery \ framework/source/services/backingcomp \ framework/source/services/backingwindow \ framework/source/services/desktop \ - framework/source/services/ContextChangeEventMultiplexer \ framework/source/services/frame \ framework/source/services/modulemanager \ framework/source/services/pathsettings \ @@ -143,6 +143,7 @@ $(eval $(call gb_Library_add_exception_objects,fwk,\ framework/source/uielement/menubarmerger \ framework/source/uielement/menubarwrapper \ framework/source/uielement/objectmenucontroller \ + framework/source/uielement/popuptoolbarcontroller \ framework/source/uielement/progressbarwrapper \ framework/source/uielement/recentfilesmenucontroller \ framework/source/uielement/spinfieldtoolbarcontroller \ @@ -161,8 +162,8 @@ $(eval $(call gb_Library_add_exception_objects,fwk,\ framework/source/uifactory/factoryconfiguration \ framework/source/uifactory/menubarfactory \ framework/source/uifactory/statusbarfactory \ - framework/source/uifactory/uicontrollerfactory \ framework/source/uifactory/toolboxfactory \ + framework/source/uifactory/uicontrollerfactory \ framework/source/uifactory/uielementfactorymanager \ framework/source/uifactory/windowcontentfactorymanager \ framework/source/xml/acceleratorconfigurationreader \ diff --git a/framework/Library_fwl.mk b/framework/Library_fwl.mk index afcb77c04945..fe8744981c6a 100644 --- a/framework/Library_fwl.mk +++ b/framework/Library_fwl.mk @@ -68,7 +68,6 @@ $(eval $(call gb_Library_add_exception_objects,fwl,\ framework/source/uielement/langselectionmenucontroller \ framework/source/uielement/macrosmenucontroller \ framework/source/uielement/newmenucontroller \ - framework/source/uielement/popupmenucontroller \ framework/source/uielement/toolbarsmenucontroller \ )) diff --git a/framework/inc/uielement/popupmenucontroller.hxx b/framework/inc/uielement/popupmenucontroller.hxx deleted file mode 100644 index 7511af004611..000000000000 --- a/framework/inc/uielement/popupmenucontroller.hxx +++ /dev/null @@ -1,74 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/* - * This file is part of the LibreOffice project. - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - * - * This file incorporates work covered by the following license notice: - * - * 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 . - */ - -#ifndef __FRAMEWORK_POPUPMENUCONTROLLER_HXX_ -#define __FRAMEWORK_POPUPMENUCONTROLLER_HXX_ - -#include <com/sun/star/lang/XServiceInfo.hpp> -#include <com/sun/star/frame/XPopupMenuController.hpp> - -#include "svtools/toolboxcontroller.hxx" -#include "boost/scoped_ptr.hpp" - -#include <macros/xserviceinfo.hxx> - -class Window; - -namespace framework -{ -class PopupMenuControllerImpl; - -class PopupMenuController : public svt::ToolboxController, public ::com::sun::star::lang::XServiceInfo -{ -public: - PopupMenuController( const com::sun::star::uno::Reference< com::sun::star::uno::XComponentContext >& rxContext ); - ~PopupMenuController(); - - // XInterface - virtual ::com::sun::star::uno::Any SAL_CALL queryInterface( const ::com::sun::star::uno::Type& aType ) throw (::com::sun::star::uno::RuntimeException); - virtual void SAL_CALL acquire() throw (); - virtual void SAL_CALL release() throw (); - - // XServiceInfo - DECLARE_XSERVICEINFO - - // XComponent - virtual void SAL_CALL dispose() throw (::com::sun::star::uno::RuntimeException); - - // XStatusListener - virtual void SAL_CALL statusChanged( const ::com::sun::star::frame::FeatureStateEvent& Event ) throw ( ::com::sun::star::uno::RuntimeException ); - - // XToolbarController - virtual void SAL_CALL execute( sal_Int16 KeyModifier ) throw (::com::sun::star::uno::RuntimeException); - virtual void SAL_CALL click() throw (::com::sun::star::uno::RuntimeException); - virtual void SAL_CALL doubleClick() throw (::com::sun::star::uno::RuntimeException); - virtual ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindow > SAL_CALL createPopupWindow() throw (::com::sun::star::uno::RuntimeException); - virtual ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindow > SAL_CALL createItemWindow( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindow >& Parent ) throw (::com::sun::star::uno::RuntimeException); - - bool CreatePopupMenuController() throw (::com::sun::star::uno::Exception); - - ::com::sun::star::uno::Reference< ::com::sun::star::frame::XPopupMenuController > mxPopupMenuController; - ::com::sun::star::uno::Reference< com::sun::star::awt::XPopupMenu > mxPopupMenu; -}; - -} // namespace framework - -#endif // __FRAMEWORK_POPUPMENUCONTROLLER_HXX_ - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/framework/inc/uielement/popuptoolbarcontroller.hxx b/framework/inc/uielement/popuptoolbarcontroller.hxx new file mode 100644 index 000000000000..89acb766c0e1 --- /dev/null +++ b/framework/inc/uielement/popuptoolbarcontroller.hxx @@ -0,0 +1,96 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * 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 . + */ +#ifndef __FRAMEWORK_UIELEMENT_POPUPMENU_TOOLBARCONTROLLER_HXX__ +#define __FRAMEWORK_UIELEMENT_POPUPMENU_TOOLBARCONTROLLER_HXX__ + +#include <com/sun/star/awt/XPopupMenu.hpp> +#include <com/sun/star/frame/XPopupMenuController.hpp> +#include <com/sun/star/frame/XUIControllerFactory.hpp> +#include <com/sun/star/lang/XServiceInfo.hpp> +#include <cppuhelper/implbase1.hxx> +#include <macros/xserviceinfo.hxx> +#include <svtools/toolboxcontroller.hxx> + +namespace framework +{ + class PopupMenuToolbarController : public svt::ToolboxController + { + public: + virtual ~PopupMenuToolbarController(); + + // XComponent + virtual void SAL_CALL dispose() throw ( ::com::sun::star::uno::RuntimeException ); + // XInitialization + virtual void SAL_CALL initialize( const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >& aArguments ) throw (::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException); + // XToolbarController + virtual ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindow > SAL_CALL createPopupWindow() throw (::com::sun::star::uno::RuntimeException); + // XStatusListener + virtual void SAL_CALL statusChanged( const ::com::sun::star::frame::FeatureStateEvent& rEvent ) throw ( ::com::sun::star::uno::RuntimeException ); + + protected: + PopupMenuToolbarController( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext >& rxContext, + const OUString &rPopupCommand = OUString() ); + virtual void functionExecuted( const OUString &rCommand ); + virtual sal_uInt16 getDropDownStyle() const; + void createPopupMenuController(); + + com::sun::star::uno::Reference< com::sun::star::uno::XComponentContext > m_xContext; + sal_Bool m_bHasController; + com::sun::star::uno::Reference< com::sun::star::awt::XPopupMenu > m_xPopupMenu; + + private: + OUString m_aPopupCommand; + com::sun::star::uno::Reference< com::sun::star::frame::XUIControllerFactory > m_xPopupMenuFactory; + com::sun::star::uno::Reference< com::sun::star::frame::XPopupMenuController > m_xPopupMenuController; + }; + + class OpenToolbarController : public PopupMenuToolbarController + { + public: + OpenToolbarController( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext >& rxContext ); + + // XServiceInfo + DECLARE_XSERVICEINFO + }; + + class NewToolbarController : public PopupMenuToolbarController + { + public: + NewToolbarController( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext >& rxContext ); + + // XServiceInfo + DECLARE_XSERVICEINFO + private: + void functionExecuted( const OUString &rCommand ); + void SAL_CALL statusChanged( const ::com::sun::star::frame::FeatureStateEvent& rEvent ) throw ( ::com::sun::star::uno::RuntimeException ); + void setItemImage( const OUString &rCommand ); + }; + + class WizardsToolbarController : public PopupMenuToolbarController + { + public: + WizardsToolbarController( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext >& rxContext ); + + // XServiceInfo + DECLARE_XSERVICEINFO + private: + sal_uInt16 getDropDownStyle() const; + }; +} + +#endif diff --git a/framework/source/register/registerservices.cxx b/framework/source/register/registerservices.cxx index 984ad9d51d10..8ec134ccb726 100644 --- a/framework/source/register/registerservices.cxx +++ b/framework/source/register/registerservices.cxx @@ -71,6 +71,7 @@ #include <services/substitutepathvars.hxx> #include <services/pathsettings.hxx> #include <services/ContextChangeEventMultiplexer.hxx> +#include <uielement/popuptoolbarcontroller.hxx> COMPONENTGETFACTORY ( fwk, IFFACTORY( ::framework::URLTransformer ) else @@ -112,7 +113,10 @@ COMPONENTGETFACTORY ( fwk, IFFACTORY( ::framework::TabWindowService ) else IFFACTORY( ::framework::SubstitutePathVariables ) else IFFACTORY( ::framework::PathSettings ) else - IFFACTORY( ::framework::ContextChangeEventMultiplexer ) + IFFACTORY( ::framework::ContextChangeEventMultiplexer ) else + IFFACTORY( ::framework::OpenToolbarController ) else + IFFACTORY( ::framework::NewToolbarController ) else + IFFACTORY( ::framework::WizardsToolbarController ) ) /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/framework/source/register/registertemp.cxx b/framework/source/register/registertemp.cxx index 1f0967d3f0fe..703e79ef8f98 100644 --- a/framework/source/register/registertemp.cxx +++ b/framework/source/register/registertemp.cxx @@ -50,7 +50,6 @@ #include <uielement/macrosmenucontroller.hxx> #include <uielement/newmenucontroller.hxx> #include <uielement/toolbarsmenucontroller.hxx> -#include <uielement/popupmenucontroller.hxx> COMPONENTGETFACTORY ( fwl, IFFACTORY( ::framework::MediaTypeDetectionHelper ) @@ -70,8 +69,7 @@ COMPONENTGETFACTORY ( fwl, IFFACTORY( ::framework::FooterMenuController ) else IFFACTORY( ::framework::HeaderMenuController ) else IFFACTORY( ::framework::LanguageSelectionMenuController ) else - IFFACTORY( ::framework::Oxt_Handler ) else - IFFACTORY( ::framework::PopupMenuController ) + IFFACTORY( ::framework::Oxt_Handler ) ) /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/framework/source/uielement/popupmenucontroller.cxx b/framework/source/uielement/popupmenucontroller.cxx deleted file mode 100644 index 759bad1c63ee..000000000000 --- a/framework/source/uielement/popupmenucontroller.cxx +++ /dev/null @@ -1,235 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/* - * This file is part of the LibreOffice project. - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - * - * This file incorporates work covered by the following license notice: - * - * 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 . - */ - - -#include <com/sun/star/awt/PopupMenu.hpp> -#include <com/sun/star/frame/PopupMenuControllerFactory.hpp> -#include <com/sun/star/frame/XPopupMenuController.hpp> - -#include <toolkit/helper/vclunohelper.hxx> - -#include <rtl/ref.hxx> - -#include <vcl/toolbox.hxx> -#include <vcl/menu.hxx> -#include <vcl/svapp.hxx> -#include <osl/mutex.hxx> - -#include "uielement/popupmenucontroller.hxx" -#include "services.h" - -using namespace ::com::sun::star; -using namespace ::com::sun::star::uno; -using namespace ::com::sun::star::lang; -using namespace ::com::sun::star::frame; -using namespace ::com::sun::star::beans; - -// -------------------------------------------------------------------- - - -namespace framework -{ - -DEFINE_XSERVICEINFO_MULTISERVICE_2 ( PopupMenuController , - OWeakObject , - OUString( "com.sun.star.frame.ToolbarController" ) , - OUString( "com.sun.star.comp.framework.PopupMenuController" ) - ) - -DEFINE_INIT_SERVICE ( PopupMenuController, {} ) - -class PopupMenuControllerImpl -{ -}; - -//======================================================================== -// class PopupMenuController REMOVE REMOVE REMOVE -//======================================================================== - -PopupMenuController::PopupMenuController( const Reference< uno::XComponentContext >& rxContext ) -: svt::ToolboxController( rxContext, Reference< frame::XFrame >(), OUString() ) -{ -} - -// -------------------------------------------------------------------- - -PopupMenuController::~PopupMenuController() -{ -} - -// -------------------------------------------------------------------- -// XInterface -// -------------------------------------------------------------------- - -Any SAL_CALL PopupMenuController::queryInterface( const Type& aType ) throw (RuntimeException) -{ - Any a( ToolboxController::queryInterface( aType ) ); - if ( a.hasValue() ) - return a; - - return ::cppu::queryInterface( aType, static_cast< lang::XServiceInfo* >( this )); -} - -// -------------------------------------------------------------------- - -void SAL_CALL PopupMenuController::acquire() throw () -{ - ToolboxController::acquire(); -} - -// -------------------------------------------------------------------- - -void SAL_CALL PopupMenuController::release() throw () -{ - ToolboxController::release(); -} - -// -------------------------------------------------------------------- -// XComponent -// -------------------------------------------------------------------- - -void SAL_CALL PopupMenuController::dispose() throw (RuntimeException) -{ - if( mxPopupMenuController.is() ) - { - Reference< XComponent > xComponent( mxPopupMenuController, UNO_QUERY ); - if( xComponent.is() ) - xComponent->dispose(); - mxPopupMenuController.clear(); - } - - mxPopupMenu.clear(); - - svt::ToolboxController::dispose(); -} - -// -------------------------------------------------------------------- -// XStatusListener -// -------------------------------------------------------------------- - -void SAL_CALL PopupMenuController::statusChanged( const frame::FeatureStateEvent& rEvent ) throw ( RuntimeException ) -{ - svt::ToolboxController::statusChanged(rEvent); - enable( rEvent.IsEnabled ); -} - -// -------------------------------------------------------------------- -// XToolbarController -// -------------------------------------------------------------------- - -void SAL_CALL PopupMenuController::execute( sal_Int16 KeyModifier ) throw (RuntimeException) -{ - svt::ToolboxController::execute( KeyModifier ); -} - -// -------------------------------------------------------------------- - -void SAL_CALL PopupMenuController::click() throw (RuntimeException) -{ - svt::ToolboxController::click(); -} - -// -------------------------------------------------------------------- - -void SAL_CALL PopupMenuController::doubleClick() throw (RuntimeException) -{ - svt::ToolboxController::doubleClick(); -} - -// -------------------------------------------------------------------- - -bool PopupMenuController::CreatePopupMenuController() throw (Exception) -{ - Reference< XMultiComponentFactory > xPopupMenuControllerRegistration = PopupMenuControllerFactory::create( m_xContext ); - - Sequence< Any > aSeq( 2 ); - PropertyValue aPropValue; - - aPropValue.Name = OUString( "ModuleIdentifier" ); - aPropValue.Value <<= getModuleName(); - aSeq[0] <<= aPropValue; - aPropValue.Name = OUString( "Frame" ); - aPropValue.Value <<= m_xFrame; - aSeq[1] <<= aPropValue; - - Reference< XPopupMenuController > xPopupMenuController( xPopupMenuControllerRegistration->createInstanceWithArgumentsAndContext( getCommandURL(), aSeq, m_xContext ), UNO_QUERY ); - if ( xPopupMenuController.is() ) - { - mxPopupMenuController = xPopupMenuController; - return true; - } - return false; -} - -Reference< awt::XWindow > SAL_CALL PopupMenuController::createPopupWindow() throw (RuntimeException) -{ - SolarMutexGuard aSolarLock; - - Reference< awt::XWindow > xRet; - - try - { - ToolBox* pToolBox = dynamic_cast< ToolBox* >( VCLUnoHelper::GetWindow( getParent() ) ); - if( !pToolBox ) - return xRet; - - // get selected button - sal_uInt16 nItemId = pToolBox->GetDownItemId(); - if( !nItemId ) - return xRet; - - ::Rectangle aRect( pToolBox->GetItemRect( nItemId ) ); - - if( !mxPopupMenuController.is() && !CreatePopupMenuController() ) - return xRet; - - if( !mxPopupMenu.is() ) - { - mxPopupMenu = awt::PopupMenu::create(m_xContext); - mxPopupMenuController->setPopupMenu( mxPopupMenu ); - } - else - { - mxPopupMenuController->updatePopupMenu(); - - } - pToolBox->SetItemDown( nItemId, sal_True ); - Reference< awt::XWindowPeer > xPeer( getParent(), UNO_QUERY_THROW ); - mxPopupMenu->execute( xPeer, VCLUnoHelper::ConvertToAWTRect( aRect ), 0 ); - pToolBox->SetItemDown( nItemId, sal_False ); - } - catch( const Exception& ) - { - } - - return xRet; -} - -// -------------------------------------------------------------------- - -Reference< awt::XWindow > SAL_CALL PopupMenuController::createItemWindow( const Reference< awt::XWindow >& /*Parent*/ ) throw (RuntimeException) -{ - return Reference< awt::XWindow >(); -} - -// -------------------------------------------------------------------- - -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/framework/source/uielement/popuptoolbarcontroller.cxx b/framework/source/uielement/popuptoolbarcontroller.cxx new file mode 100644 index 000000000000..d9189a353b47 --- /dev/null +++ b/framework/source/uielement/popuptoolbarcontroller.cxx @@ -0,0 +1,406 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * 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 . + */ + +#include <uielement/popuptoolbarcontroller.hxx> +#include <comphelper/processfactory.hxx> +#include <svtools/imagemgr.hxx> +#include <svtools/miscopt.hxx> +#include <toolkit/helper/vclunohelper.hxx> +#include <tools/urlobj.hxx> +#include <unotools/moduleoptions.hxx> +#include <vcl/svapp.hxx> +#include <vcl/toolbox.hxx> + +#include <com/sun/star/awt/PopupMenuDirection.hpp> +#include <com/sun/star/frame/PopupMenuControllerFactory.hpp> + + +#define UNO_COMMAND_RECENT_FILE_LIST ".uno:RecentFileList" + +namespace css = ::com::sun::star; + +namespace framework +{ + +PopupMenuToolbarController::PopupMenuToolbarController( + const css::uno::Reference< css::uno::XComponentContext >& xContext, + const OUString &rPopupCommand ) + : svt::ToolboxController() + , m_xContext( xContext ) + , m_bHasController( sal_False ) + , m_aPopupCommand( rPopupCommand ) +{ +} + +PopupMenuToolbarController::~PopupMenuToolbarController() +{ +} + +void SAL_CALL PopupMenuToolbarController::dispose() +throw ( css::uno::RuntimeException ) +{ + svt::ToolboxController::dispose(); + + osl::MutexGuard aGuard( m_aMutex ); + if( m_xPopupMenuController.is() ) + { + css::uno::Reference< css::lang::XComponent > xComponent( + m_xPopupMenuController, css::uno::UNO_QUERY ); + if( xComponent.is() ) + { + try + { + xComponent->dispose(); + } + catch (...) + {} + } + m_xPopupMenuController.clear(); + } + + m_xContext.clear(); + m_xPopupMenuFactory.clear(); + m_xPopupMenu.clear(); +} + +void SAL_CALL PopupMenuToolbarController::initialize( + const css::uno::Sequence< css::uno::Any >& aArguments ) +throw ( css::uno::Exception, css::uno::RuntimeException ) +{ + ToolboxController::initialize( aArguments ); + + osl::MutexGuard aGuard( m_aMutex ); + if ( !m_aPopupCommand.getLength() ) + m_aPopupCommand = m_aCommandURL; + + try + { + m_xPopupMenuFactory.set( + css::frame::PopupMenuControllerFactory::create( m_xContext ) ); + m_bHasController = m_xPopupMenuFactory->hasController( + m_aPopupCommand, getModuleName() ); + } + catch (const css::uno::Exception& e) + { + OSL_TRACE( "PopupMenuToolbarController - caught an exception! %s", + rtl::OUStringToOString( e.Message, RTL_TEXTENCODING_UTF8 ).getStr() ); + (void) e; + } + + SolarMutexGuard aSolarLock; + ToolBox* pToolBox = static_cast< ToolBox* >( VCLUnoHelper::GetWindow( getParent() ) ); + if ( pToolBox ) + { + ToolBoxItemBits nCurStyle( pToolBox->GetItemBits( m_nToolBoxId ) ); + ToolBoxItemBits nSetStyle( getDropDownStyle() ); + pToolBox->SetItemBits( m_nToolBoxId, + m_bHasController ? + nCurStyle | nSetStyle : + nCurStyle & ~nSetStyle ); + } + +} + +void SAL_CALL +PopupMenuToolbarController::statusChanged( + const css::frame::FeatureStateEvent& rEvent ) + throw ( css::uno::RuntimeException ) +{ + // TODO move to base class + + svt::ToolboxController::statusChanged( rEvent ); + enable( rEvent.IsEnabled ); +} + +css::uno::Reference< css::awt::XWindow > SAL_CALL +PopupMenuToolbarController::createPopupWindow() + throw ( css::uno::RuntimeException ) +{ + css::uno::Reference< css::awt::XWindow > xRet; + + osl::MutexGuard aGuard( m_aMutex ); + if ( !m_bHasController ) + return xRet; + + createPopupMenuController(); + + SolarMutexGuard aSolarLock; + ToolBox* pToolBox = static_cast< ToolBox* >( VCLUnoHelper::GetWindow( getParent() ) ); + if ( !pToolBox ) + return xRet; + + pToolBox->SetItemDown( m_nToolBoxId, sal_True ); + sal_uInt16 nId = m_xPopupMenu->execute( + css::uno::Reference< css::awt::XWindowPeer >( getParent(), css::uno::UNO_QUERY ), + VCLUnoHelper::ConvertToAWTRect( pToolBox->GetItemRect( m_nToolBoxId ) ), + css::awt::PopupMenuDirection::EXECUTE_DEFAULT ); + pToolBox->SetItemDown( m_nToolBoxId, sal_False ); + + if ( nId ) + functionExecuted( m_xPopupMenu->getCommand( nId ) ); + + return xRet; +} + +void PopupMenuToolbarController::functionExecuted( const OUString &/*rCommand*/) +{ +} + +sal_uInt16 PopupMenuToolbarController::getDropDownStyle() const +{ + return TIB_DROPDOWN; +} + +void PopupMenuToolbarController::createPopupMenuController() +{ + if( !m_bHasController ) + return; + + if ( !m_xPopupMenuController.is() ) + { + css::uno::Sequence< css::uno::Any > aArgs( 2 ); + css::beans::PropertyValue aProp; + + aProp.Name = DECLARE_ASCII( "Frame" ); + aProp.Value <<= m_xFrame; + aArgs[0] <<= aProp; + + aProp.Name = DECLARE_ASCII( "ModuleIdentifier" ); + aProp.Value <<= getModuleName(); + aArgs[1] <<= aProp; + try + { + m_xPopupMenu.set( + m_xContext->getServiceManager()->createInstanceWithContext( + DECLARE_ASCII( "com.sun.star.awt.PopupMenu" ), m_xContext ), + css::uno::UNO_QUERY_THROW ); + m_xPopupMenuController.set( + m_xPopupMenuFactory->createInstanceWithArgumentsAndContext( + m_aPopupCommand, aArgs, m_xContext), css::uno::UNO_QUERY_THROW ); + + m_xPopupMenuController->setPopupMenu( m_xPopupMenu ); + } + catch ( const css::uno::Exception &e ) + { + m_xPopupMenu.clear(); + OSL_TRACE( "PopupMenuToolbarController - caught an exception! %s", + OUStringToOString( e.Message, RTL_TEXTENCODING_UTF8 ).getStr() ); + (void) e; + } + } +} + +DEFINE_XSERVICEINFO_MULTISERVICE_2( WizardsToolbarController, + ::cppu::OWeakObject, + DECLARE_ASCII("com.sun.star.frame.ToolbarController"), + DECLARE_ASCII("org.apache.openoffice.comp.framework.WizardsToolbarController") + ) + +DEFINE_INIT_SERVICE( WizardsToolbarController, {} ) + +WizardsToolbarController::WizardsToolbarController( + const css::uno::Reference< css::uno::XComponentContext >& xContext ) + : PopupMenuToolbarController( xContext ) +{ +} + +sal_uInt16 WizardsToolbarController::getDropDownStyle() const +{ + return TIB_DROPDOWNONLY; +} + +DEFINE_XSERVICEINFO_MULTISERVICE_2( OpenToolbarController, + ::cppu::OWeakObject, + DECLARE_ASCII("com.sun.star.frame.ToolbarController"), + DECLARE_ASCII("org.apache.openoffice.comp.framework.OpenToolbarController") + ) + +DEFINE_INIT_SERVICE( OpenToolbarController, {} ) + +OpenToolbarController::OpenToolbarController( + const css::uno::Reference< css::uno::XComponentContext >& xContext ) + : PopupMenuToolbarController( xContext, DECLARE_ASCII( UNO_COMMAND_RECENT_FILE_LIST ) ) +{ +} + + +DEFINE_XSERVICEINFO_MULTISERVICE_2( NewToolbarController, + ::cppu::OWeakObject, + DECLARE_ASCII("com.sun.star.frame.ToolbarController"), + DECLARE_ASCII("org.apache.openoffice.comp.framework.NewToolbarController") + ) + +DEFINE_INIT_SERVICE( NewToolbarController, {} ) + +NewToolbarController::NewToolbarController( + const css::uno::Reference< css::uno::XComponentContext >& xContext ) + : PopupMenuToolbarController( xContext ) +{ +} + +void SAL_CALL +NewToolbarController::statusChanged( + const css::frame::FeatureStateEvent& rEvent ) + throw ( css::uno::RuntimeException ) +{ + if ( rEvent.IsEnabled ) + { + OUString aState; + rEvent.State >>= aState; + // set the image even if the state is not a string + // this will set the image of the default module + setItemImage( aState ); + } + + enable( rEvent.IsEnabled ); +} + +void NewToolbarController::functionExecuted( const OUString &rCommand ) +{ + setItemImage( rCommand ); +} + +/** + it return the existing state of the given URL in the popupmenu of this toolbox control. + + If the given URL can be located as an action command of one menu item of the + popup menu of this control, we return sal_True. Otherwhise we return sal_False. + Further we return a fallback URL, in case we have to return sal_False. Because + the outside code must select a valid item of the popup menu everytime ... + and we define it here. By the way this m ethod was written to handle + error situations gracefully. E.g. it can be called during creation time + but then we have no valid menu. For this case we know another fallback URL. + Then we return the private:factory/ URL of the default factory. + + @param rPopupMenu + pounts to the popup menu, on which item we try to locate the given URL + Can be NULL! Search will be supressed then. + + @param sURL + the URL for searching + + @param sFallback + contains the fallback URL in case we return FALSE + Must point to valid memory! + + @param aImage + contains the image of the menu for the URL. + + @return sal_True - if URL could be located as an item of the popup menu. + sal_False - otherwhise. +*/ +static sal_Bool Impl_ExistURLInMenu( + const css::uno::Reference< css::awt::XPopupMenu > &rPopupMenu, + OUString &sURL, + OUString &sFallback, + Image &aImage ) +{ + sal_Bool bValidFallback( sal_False ); + sal_uInt16 nCount( 0 ); + if ( rPopupMenu.is() && ( nCount = rPopupMenu->getItemCount() ) && sURL.getLength() ) + { + for ( sal_uInt16 n = 0; n < nCount; ++n ) + { + sal_uInt16 nId = rPopupMenu->getItemId( n ); + OUString aCmd( rPopupMenu->getCommand( nId ) ); + + if ( !bValidFallback && aCmd.getLength() ) + { + sFallback = aCmd; + bValidFallback = sal_True; + } + + // match even if the menu command is more detailed + // (maybe an additional query) #i28667# + if ( aCmd.match( sURL ) ) + { + sURL = aCmd; + const css::uno::Reference< css::graphic::XGraphic > xGraphic( + rPopupMenu->getItemImage( nId ) ); + if ( xGraphic.is() ) + aImage = Image( xGraphic ); + return sal_True; + } + } + } + + if ( !bValidFallback ) + { + OUStringBuffer aBuffer; + aBuffer.appendAscii( RTL_CONSTASCII_STRINGPARAM( "private:factory/" ) ); + aBuffer.append( SvtModuleOptions().GetDefaultModuleName() ); + sFallback = aBuffer.makeStringAndClear(); + } + + return sal_False; +} + +/** We accept URL's here only, which exist as items of our internal popup menu. + All other ones will be ignored and a fallback is used. + */ +void NewToolbarController::setItemImage( const OUString &rCommand ) +{ + SolarMutexGuard aSolarLock; + ToolBox* pToolBox = static_cast< ToolBox* >( VCLUnoHelper::GetWindow( getParent() ) ); + if ( !pToolBox ) + return; + + OUString aURL = rCommand; + OUString sFallback; + Image aMenuImage; + + sal_Bool bValid( Impl_ExistURLInMenu( m_xPopupMenu, aURL, sFallback, aMenuImage ) ); + // do not change aURL if Impl_ExistURLInMenu returned sal_False + // this allows later initialization of the PopupMenuController on createPopupWindow() + // and works even if SvFileInformationManager does not know the module + if ( !aURL.getLength() ) + aURL = sFallback; + + sal_Bool bBig = SvtMiscOptions().AreCurrentSymbolsLarge(); + + INetURLObject aURLObj( aURL ); + Image aImage = SvFileInformationManager::GetImageNoDefault( aURLObj, bBig ); + if ( !aImage ) + { + if ( !!aMenuImage ) + aImage = aMenuImage; + else if ( !bValid ) + // If SvFileInformationManager didn't know the module, try with the default + aImage = SvFileInformationManager::GetImageNoDefault( INetURLObject( sFallback ), bBig ); + + if ( !aImage ) + aImage = SvFileInformationManager::GetImage( aURLObj, bBig ); + } + + // if everything failed, just use the image associated with the toolbar item command + if ( !aImage ) + return; + + Size aBigSize( pToolBox->GetDefaultImageSize() ); + if ( bBig && aImage.GetSizePixel() != aBigSize ) + { + BitmapEx aScaleBmpEx( aImage.GetBitmapEx() ); + aScaleBmpEx.Scale( aBigSize, BMP_SCALE_INTERPOLATE ); + pToolBox->SetItemImage( m_nToolBoxId, Image( aScaleBmpEx ) ); + } + else + pToolBox->SetItemImage( m_nToolBoxId, aImage ); +} + + +} diff --git a/framework/util/fwk.component b/framework/util/fwk.component index 2e0c265ba704..f46b712626a1 100644 --- a/framework/util/fwk.component +++ b/framework/util/fwk.component @@ -137,4 +137,13 @@ <implementation name="com.sun.star.comp.framework.TabWindowService"> <service name="com.sun.star.ui.dialogs.TabContainerWindow"/> </implementation> + <implementation name="org.apache.openoffice.comp.framework.OpenToolbarController"> + <service name="com.sun.star.frame.ToolbarController"/> + </implementation> + <implementation name="org.apache.openoffice.comp.framework.NewToolbarController"> + <service name="com.sun.star.frame.ToolbarController"/> + </implementation> + <implementation name="org.apache.openoffice.comp.framework.WizardsToolbarController"> + <service name="com.sun.star.frame.ToolbarController"/> + </implementation> </component> diff --git a/framework/util/fwl.component b/framework/util/fwl.component index 9aaef32a1fd3..c91114741a7b 100644 --- a/framework/util/fwl.component +++ b/framework/util/fwl.component @@ -58,9 +58,6 @@ <implementation name="com.sun.star.comp.framework.OXTFileHandler"> <service name="com.sun.star.frame.ContentHandler"/> </implementation> - <implementation name="com.sun.star.comp.framework.PopupMenuController"> - <service name="com.sun.star.frame.ToolbarController"/> - </implementation> <implementation name="com.sun.star.comp.framework.PopupMenuControllerDispatcher"> <service name="com.sun.star.frame.ProtocolHandler"/> </implementation> diff --git a/officecfg/registry/data/org/openoffice/Office/UI/Controller.xcu b/officecfg/registry/data/org/openoffice/Office/UI/Controller.xcu index c4961d8f56cd..840191e0da5b 100644 --- a/officecfg/registry/data/org/openoffice/Office/UI/Controller.xcu +++ b/officecfg/registry/data/org/openoffice/Office/UI/Controller.xcu @@ -561,6 +561,39 @@ <value>com.sun.star.report.ReportToolboxController</value> </prop> </node> + <node oor:name="org.apache.openoffice.comp.framework.OpenToolbarController" oor:op="replace"> + <prop oor:name="Command"> + <value>.uno:Open</value> + </prop> + <prop oor:name="Module"> + <value/> + </prop> + <prop oor:name="Controller"> + <value>org.apache.openoffice.comp.framework.OpenToolbarController</value> + </prop> + </node> + <node oor:name="org.apache.openoffice.comp.framework.NewToolbarController" oor:op="replace"> + <prop oor:name="Command"> + <value>.uno:AddDirect</value> + </prop> + <prop oor:name="Module"> + <value/> + </prop> + <prop oor:name="Controller"> + <value>org.apache.openoffice.comp.framework.NewToolbarController</value> + </prop> + </node> + <node oor:name="org.apache.openoffice.comp.framework.WizardsToolbarController" oor:op="replace"> + <prop oor:name="Command"> + <value>.uno:AutoPilotMenu</value> + </prop> + <prop oor:name="Module"> + <value/> + </prop> + <prop oor:name="Controller"> + <value>org.apache.openoffice.comp.framework.WizardsToolbarController</value> + </prop> + </node> </node> <node oor:name="StatusBar"> <node oor:name="c1" oor:op="replace"> |