summaryrefslogtreecommitdiffstats
path: root/framework
diff options
context:
space:
mode:
authorAriel Constenla-Haile <arielch@apache.org>2013-05-25 22:11:08 +0000
committerCaolán McNamara <caolanm@redhat.com>2013-06-24 10:08:43 +0100
commita659ac906aa2d0dfd6d10e40d8a5a6d2d70cc8fc (patch)
tree1859492c7602948eca7eb474a64087aa6dec5a3c /framework
parentfix exception in DbGridColumn::impl_toggleScriptManager_nothrow (diff)
downloadcore-a659ac906aa2d0dfd6d10e40d8a5a6d2d70cc8fc.tar.gz
core-a659ac906aa2d0dfd6d10e40d8a5a6d2d70cc8fc.zip
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
Diffstat (limited to 'framework')
-rw-r--r--framework/Library_fwk.mk5
-rw-r--r--framework/Library_fwl.mk1
-rw-r--r--framework/inc/uielement/popupmenucontroller.hxx74
-rw-r--r--framework/inc/uielement/popuptoolbarcontroller.hxx96
-rw-r--r--framework/source/register/registerservices.cxx6
-rw-r--r--framework/source/register/registertemp.cxx4
-rw-r--r--framework/source/uielement/popupmenucontroller.cxx235
-rw-r--r--framework/source/uielement/popuptoolbarcontroller.cxx406
-rw-r--r--framework/util/fwk.component9
-rw-r--r--framework/util/fwl.component3
10 files changed, 520 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>