[Libreoffice-commits] core.git: framework/inc framework/Library_fwk.mk framework/Library_fwl.mk framework/source framework/util officecfg/registry

Ariel Constenla-Haile arielch at apache.org
Mon Jun 24 02:09:04 PDT 2013


 framework/Library_fwk.mk                                        |    5 
 framework/Library_fwl.mk                                        |    1 
 framework/inc/uielement/popupmenucontroller.hxx                 |   74 -
 framework/inc/uielement/popuptoolbarcontroller.hxx              |   96 ++
 framework/source/register/registerservices.cxx                  |    6 
 framework/source/register/registertemp.cxx                      |    4 
 framework/source/uielement/popupmenucontroller.cxx              |  235 -----
 framework/source/uielement/popuptoolbarcontroller.cxx           |  406 ++++++++++
 framework/util/fwk.component                                    |    9 
 framework/util/fwl.component                                    |    3 
 officecfg/registry/data/org/openoffice/Office/UI/Controller.xcu |   33 
 11 files changed, 553 insertions(+), 319 deletions(-)

New commits:
commit a659ac906aa2d0dfd6d10e40d8a5a6d2d70cc8fc
Author: Ariel Constenla-Haile <arielch at apache.org>
Date:   Sat May 25 22:11:08 2013 +0000

    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

diff --git a/framework/Library_fwk.mk b/framework/Library_fwk.mk
index bc9b711..0e36505 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 afcb77c..fe87449 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 7511af00..0000000
--- 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 0000000..89acb76
--- /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 984ad9d..8ec134c 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 1f0967d..703e79e 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 759bad1..0000000
--- 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 0000000..d9189a3
--- /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 2e0c265..f46b712 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 9aaef32..c911147 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 c4961d8..840191e 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">


More information about the Libreoffice-commits mailing list