diff options
author | Szymon Kłos <eszkadev@gmail.com> | 2015-07-07 16:44:59 +0200 |
---|---|---|
committer | Szymon Kłos <eszkadev@gmail.com> | 2015-07-16 09:53:32 +0200 |
commit | ce722af0cce170a2aac3a5e01cd66e6c24fba63c (patch) | |
tree | 4915fbc22ac6ddfd09c2858c3d8653a72f0e6bae | |
parent | 1ceb7bc53b347deb93e7cca415b90e71057cfac5 (diff) |
'Save As' popup menu in the Writer's toolbar
Change-Id: I1b1cb7fcd2ae0e0f50e4d8e3900bc416435e60bf
-rw-r--r-- | framework/Library_fwk.mk | 1 | ||||
-rw-r--r-- | framework/inc/classes/resource.hrc | 1 | ||||
-rw-r--r-- | framework/source/classes/resource.src | 5 | ||||
-rw-r--r-- | framework/source/uielement/saveasmenucontroller.cxx | 191 | ||||
-rw-r--r-- | framework/util/fwk.component | 4 | ||||
-rw-r--r-- | include/sfx2/tbxctrl.hxx | 15 | ||||
-rw-r--r-- | officecfg/registry/data/org/openoffice/Office/UI/Controller.xcu | 11 | ||||
-rw-r--r-- | sfx2/source/toolbox/tbxitem.cxx | 50 | ||||
-rw-r--r-- | sw/inc/cmdid.h | 1 | ||||
-rw-r--r-- | sw/sdi/docsh.sdi | 5 | ||||
-rw-r--r-- | sw/sdi/swriter.sdi | 27 | ||||
-rw-r--r-- | sw/source/uibase/app/swmodule.cxx | 1 | ||||
-rw-r--r-- | sw/uiconfig/swriter/toolbar/standardbar.xml | 2 |
13 files changed, 313 insertions, 1 deletions
diff --git a/framework/Library_fwk.mk b/framework/Library_fwk.mk index 197910160c33..d07f8b97e37f 100644 --- a/framework/Library_fwk.mk +++ b/framework/Library_fwk.mk @@ -144,6 +144,7 @@ $(eval $(call gb_Library_add_exception_objects,fwk,\ framework/source/uielement/popuptoolbarcontroller \ framework/source/uielement/progressbarwrapper \ framework/source/uielement/recentfilesmenucontroller \ + framework/source/uielement/saveasmenucontroller \ framework/source/uielement/spinfieldtoolbarcontroller \ framework/source/uielement/statusbar \ framework/source/uielement/statusbaritem \ diff --git a/framework/inc/classes/resource.hrc b/framework/inc/classes/resource.hrc index 6620c99ca509..2b1ea1c56f31 100644 --- a/framework/inc/classes/resource.hrc +++ b/framework/inc/classes/resource.hrc @@ -51,6 +51,7 @@ #define STR_CLEAR_RECENT_FILES_HELP (RID_STR_START+24) #define STR_LANGSTATUS_HINT (RID_STR_START+25) #define STR_OPEN_REMOTE (RID_STR_START+26) +#define STR_REMOTE_FILE (RID_STR_START+27) #define POPUPMENU_TOOLBAR_QUICKCUSTOMIZATION (RID_MENU_START+0) diff --git a/framework/source/classes/resource.src b/framework/source/classes/resource.src index 0ef53ae2fed5..4f8ce0e7e5a3 100644 --- a/framework/source/classes/resource.src +++ b/framework/source/classes/resource.src @@ -119,6 +119,11 @@ String STR_OPEN_REMOTE Text [ en-US ] = "Open remote file"; }; +String STR_REMOTE_FILE +{ + Text [ en-US ] = "Remote file"; +}; + String STR_TOOLBAR_TITLE_ADDON { Text [ en-US ] = "Add-On %num%"; diff --git a/framework/source/uielement/saveasmenucontroller.cxx b/framework/source/uielement/saveasmenucontroller.cxx new file mode 100644 index 000000000000..7e4fd92db865 --- /dev/null +++ b/framework/source/uielement/saveasmenucontroller.cxx @@ -0,0 +1,191 @@ +/* -*- 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 <classes/resource.hrc> +#include <classes/fwkresid.hxx> + +#include <cppuhelper/implbase1.hxx> +#include <cppuhelper/supportsservice.hxx> +#include <osl/file.hxx> +#include <osl/mutex.hxx> +#include <rtl/ref.hxx> +#include <svtools/popupmenucontrollerbase.hxx> +#include <tools/urlobj.hxx> +#include <unotools/historyoptions.hxx> +#include <vcl/menu.hxx> +#include <vcl/svapp.hxx> + +using namespace css; +using namespace com::sun::star::uno; +using namespace com::sun::star::lang; +using namespace com::sun::star::frame; +using namespace com::sun::star::beans; +using namespace com::sun::star::util; +using namespace framework; + +namespace { + +static const char CMD_SAVE_REMOTE[] = ".uno:OpenRemote"; // TODO + +class SaveAsMenuController : public svt::PopupMenuControllerBase +{ + using svt::PopupMenuControllerBase::disposing; + +public: + SaveAsMenuController( const uno::Reference< uno::XComponentContext >& xContext ); + virtual ~SaveAsMenuController(); + + // XServiceInfo + virtual OUString SAL_CALL getImplementationName() + throw (css::uno::RuntimeException, std::exception) SAL_OVERRIDE + { + return OUString("com.sun.star.comp.framework.SaveAsMenuController"); + } + + virtual sal_Bool SAL_CALL supportsService(OUString const & ServiceName) + throw (css::uno::RuntimeException, std::exception) SAL_OVERRIDE + { + return cppu::supportsService(this, ServiceName); + } + + virtual css::uno::Sequence<OUString> SAL_CALL getSupportedServiceNames() + throw (css::uno::RuntimeException, std::exception) SAL_OVERRIDE + { + css::uno::Sequence< OUString > aSeq(1); + aSeq[0] = "com.sun.star.frame.PopupMenuController"; + return aSeq; + } + + // XStatusListener + virtual void SAL_CALL statusChanged( const frame::FeatureStateEvent& Event ) throw ( uno::RuntimeException, std::exception ) SAL_OVERRIDE; + + // XMenuListener + virtual void SAL_CALL itemSelected( const awt::MenuEvent& rEvent ) throw (uno::RuntimeException, std::exception) SAL_OVERRIDE; + virtual void SAL_CALL itemActivated( const awt::MenuEvent& rEvent ) throw (uno::RuntimeException, std::exception) SAL_OVERRIDE; + + // XEventListener + virtual void SAL_CALL disposing( const com::sun::star::lang::EventObject& Source ) throw ( uno::RuntimeException, std::exception ) SAL_OVERRIDE; + +private: + virtual void impl_setPopupMenu() SAL_OVERRIDE; + + void fillPopupMenu( com::sun::star::uno::Reference< com::sun::star::awt::XPopupMenu >& rPopupMenu ); + + bool m_bDisabled : 1; +}; + +SaveAsMenuController::SaveAsMenuController( const uno::Reference< uno::XComponentContext >& xContext ) : + svt::PopupMenuControllerBase( xContext ), + m_bDisabled( false ) +{ +} + +SaveAsMenuController::~SaveAsMenuController() +{ +} + +// private function +void SaveAsMenuController::fillPopupMenu( Reference< css::awt::XPopupMenu >& rPopupMenu ) +{ + VCLXPopupMenu* pPopupMenu = static_cast<VCLXPopupMenu *>(VCLXMenu::GetImplementation( rPopupMenu )); + PopupMenu* pVCLPopupMenu = 0; + + SolarMutexGuard aSolarMutexGuard; + + resetPopupMenu( rPopupMenu ); + if ( pPopupMenu ) + pVCLPopupMenu = static_cast<PopupMenu *>(pPopupMenu->GetMenu()); + + if ( pVCLPopupMenu ) + { + // Open remote menu entry + pVCLPopupMenu->InsertItem( sal_uInt16( 0 ), + FWK_RESSTR( STR_REMOTE_FILE ) ); + pVCLPopupMenu->SetItemCommand( sal_uInt16( 0 ), + OUString( CMD_SAVE_REMOTE ) ); + } +} + +// XEventListener +void SAL_CALL SaveAsMenuController::disposing( const EventObject& ) throw ( RuntimeException, std::exception ) +{ + Reference< css::awt::XMenuListener > xHolder(( OWeakObject *)this, UNO_QUERY ); + + osl::MutexGuard aLock( m_aMutex ); + m_xFrame.clear(); + m_xDispatch.clear(); + + if ( m_xPopupMenu.is() ) + m_xPopupMenu->removeMenuListener( Reference< css::awt::XMenuListener >(( OWeakObject *)this, UNO_QUERY )); + m_xPopupMenu.clear(); +} + +// XStatusListener +void SAL_CALL SaveAsMenuController::statusChanged( const FeatureStateEvent& Event ) throw ( RuntimeException, std::exception ) +{ + osl::MutexGuard aLock( m_aMutex ); + m_bDisabled = !Event.IsEnabled; +} + +void SAL_CALL SaveAsMenuController::itemSelected( const css::awt::MenuEvent& rEvent ) throw (RuntimeException, std::exception) +{ + Reference< css::awt::XPopupMenu > xPopupMenu; + + osl::ClearableMutexGuard aLock( m_aMutex ); + xPopupMenu = m_xPopupMenu; + aLock.clear(); + + if ( xPopupMenu.is() ) + { + const OUString aCommand( xPopupMenu->getCommand( rEvent.MenuId ) ); + OSL_TRACE( "SaveAsMenuController::itemSelected() - Command : %s", + OUStringToOString( aCommand, RTL_TEXTENCODING_UTF8 ).getStr() ); + + if ( aCommand == CMD_SAVE_REMOTE ) + { + Sequence< PropertyValue > aArgsList( 0 ); + dispatchCommand( CMD_SAVE_REMOTE, aArgsList ); + } + } +} + +void SAL_CALL SaveAsMenuController::itemActivated( const css::awt::MenuEvent& ) throw (RuntimeException, std::exception) +{ + osl::MutexGuard aLock( m_aMutex ); + impl_setPopupMenu(); +} + +// XPopupMenuController +void SaveAsMenuController::impl_setPopupMenu() +{ + if ( m_xPopupMenu.is() ) + fillPopupMenu( m_xPopupMenu ); +} + +} + +extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface * SAL_CALL +com_sun_star_comp_framework_SaveAsMenuController_get_implementation( + css::uno::XComponentContext *context, + css::uno::Sequence<css::uno::Any> const &) +{ + return cppu::acquire(new SaveAsMenuController(context)); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/framework/util/fwk.component b/framework/util/fwk.component index 477d524cac34..ad1678222417 100644 --- a/framework/util/fwk.component +++ b/framework/util/fwk.component @@ -117,6 +117,10 @@ constructor="com_sun_star_comp_framework_RecentFilesMenuController_get_implementation"> <service name="com.sun.star.frame.PopupMenuController"/> </implementation> + <implementation name="com.sun.star.comp.framework.SaveAsMenuController" + constructor="com_sun_star_comp_framework_SaveAsMenuController_get_implementation"> + <service name="com.sun.star.frame.PopupMenuController"/> + </implementation> <implementation name="com.sun.star.comp.framework.StatusBarControllerFactory" constructor="com_sun_star_comp_framework_StatusBarControllerFactory_get_implementation"> <service name="com.sun.star.frame.StatusbarControllerFactory"/> diff --git a/include/sfx2/tbxctrl.hxx b/include/sfx2/tbxctrl.hxx index 49b69bbcfcb5..fe1453a0a28c 100644 --- a/include/sfx2/tbxctrl.hxx +++ b/include/sfx2/tbxctrl.hxx @@ -315,6 +315,21 @@ protected: virtual VclPtr<SfxPopupWindow> CreatePopupWindow() SAL_OVERRIDE; }; +class SfxSaveAsToolBoxControl : public SfxToolBoxControl +{ +public: + // We don't use SFX_DECL_TOOLBOX_CONTROL() here as we need to have this + // RegisterControl() marked as SFX2_DLLPUBLIC + static SfxToolBoxControl* CreateImpl( sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox &rTbx ); + static void SFX2_DLLPUBLIC RegisterControl(sal_uInt16 nSlotId = 0, SfxModule *pMod=NULL); + + SfxSaveAsToolBoxControl( sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox& rBox ); + virtual ~SfxSaveAsToolBoxControl(); + +protected: + virtual VclPtr<SfxPopupWindow> CreatePopupWindow() SAL_OVERRIDE; +}; + class SfxReloadToolBoxControl_Impl : public SfxToolBoxControl { protected: diff --git a/officecfg/registry/data/org/openoffice/Office/UI/Controller.xcu b/officecfg/registry/data/org/openoffice/Office/UI/Controller.xcu index 20fc41ea6c92..46f5d96e3e2f 100644 --- a/officecfg/registry/data/org/openoffice/Office/UI/Controller.xcu +++ b/officecfg/registry/data/org/openoffice/Office/UI/Controller.xcu @@ -174,6 +174,17 @@ <value>com.sun.star.comp.framework.LanguageSelectionMenuController</value> </prop> </node> + <node oor:name="c16" oor:op="replace"> + <prop oor:name="Command"> + <value>.uno:SaveAsMenu</value> + </prop> + <prop oor:name="Module"> + <value/> + </prop> + <prop oor:name="Controller"> + <value>com.sun.star.comp.framework.SaveAsMenuController</value> + </prop> + </node> </node> <node oor:name="ToolBar"> <node oor:name="GraphicFilterControl" oor:op="replace"> diff --git a/sfx2/source/toolbox/tbxitem.cxx b/sfx2/source/toolbox/tbxitem.cxx index 99c466c35a1b..aae7ef38422a 100644 --- a/sfx2/source/toolbox/tbxitem.cxx +++ b/sfx2/source/toolbox/tbxitem.cxx @@ -106,6 +106,7 @@ using namespace ::com::sun::star::ui; SFX_IMPL_TOOLBOX_CONTROL_ARG(SfxToolBoxControl, SfxStringItem, true); SFX_IMPL_TOOLBOX_CONTROL(SfxRecentFilesToolBoxControl, SfxStringItem); +SFX_IMPL_TOOLBOX_CONTROL(SfxSaveAsToolBoxControl, SfxStringItem); static vcl::Window* GetTopMostParentSystemWindow( vcl::Window* pWindow ) { @@ -1403,4 +1404,53 @@ VclPtr<SfxPopupWindow> SfxRecentFilesToolBoxControl::CreatePopupWindow() return 0; } +SfxSaveAsToolBoxControl::SfxSaveAsToolBoxControl( sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox& rBox ) + : SfxToolBoxControl( nSlotId, nId, rBox ) +{ + rBox.SetItemBits( nId, rBox.GetItemBits( nId ) | ToolBoxItemBits::DROPDOWN); +} + +SfxSaveAsToolBoxControl::~SfxSaveAsToolBoxControl() +{ +} + +VclPtr<SfxPopupWindow> SfxSaveAsToolBoxControl::CreatePopupWindow() +{ + ToolBox& rBox = GetToolBox(); + sal_uInt16 nItemId = GetId(); + ::Rectangle aRect( rBox.GetItemRect( nItemId ) ); + + Sequence< Any > aArgs( 2 ); + PropertyValue aPropValue; + + aPropValue.Name = "CommandURL"; + aPropValue.Value <<= OUString( ".uno:SaveAsMenu" ); + aArgs[0] <<= aPropValue; + + aPropValue.Name = "Frame"; + aPropValue.Value <<= m_xFrame; + aArgs[1] <<= aPropValue; + + uno::Reference< frame::XPopupMenuController > xPopupController( m_xContext->getServiceManager()->createInstanceWithArgumentsAndContext( + "com.sun.star.comp.framework.SaveAsMenuController", aArgs, m_xContext ), UNO_QUERY ); + + uno::Reference< awt::XPopupMenu > xPopupMenu( m_xContext->getServiceManager()->createInstanceWithContext( + "com.sun.star.awt.PopupMenu", m_xContext ), uno::UNO_QUERY ); + + if ( xPopupController.is() && xPopupMenu.is() ) + { + xPopupController->setPopupMenu( xPopupMenu ); + + rBox.SetItemDown( nItemId, true ); + Reference< awt::XWindowPeer > xPeer( getParent(), uno::UNO_QUERY ); + + if ( xPeer.is() ) + xPopupMenu->execute( xPeer, VCLUnoHelper::ConvertToAWTRect( aRect ), 0 ); + + rBox.SetItemDown( nItemId, false ); + } + + return 0; +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/inc/cmdid.h b/sw/inc/cmdid.h index 4f7792319d8a..7e5bcecfde01 100644 --- a/sw/inc/cmdid.h +++ b/sw/inc/cmdid.h @@ -62,6 +62,7 @@ // Region: File #define FN_NEW_GLOBAL_DOC (FN_FILE + 4 ) /* Create Global Document */ +#define FN_SAVE_FILE_AS (FN_FILE + 5 ) /* Save As */ #define FN_OPEN_FILE (FN_FILE + 7 ) /* Open */ #define FN_OUTLINE_TO_IMPRESS (FN_FILE + 36) /* Send outline to impress */ diff --git a/sw/sdi/docsh.sdi b/sw/sdi/docsh.sdi index 9085bdf43128..5e9fe78bca2c 100644 --- a/sw/sdi/docsh.sdi +++ b/sw/sdi/docsh.sdi @@ -59,6 +59,11 @@ interface TextDocument : BaseTextDocument ExecMethod = Execute; StateMethod = GetState; ] + FN_SAVE_FILE_AS + [ + ExecMethod = Execute; + StateMethod = GetState; + ] } shell SwDocShell diff --git a/sw/sdi/swriter.sdi b/sw/sdi/swriter.sdi index 6ecfbb873736..40591989b529 100644 --- a/sw/sdi/swriter.sdi +++ b/sw/sdi/swriter.sdi @@ -10124,6 +10124,33 @@ SfxVoidItem OpenFromWriter FN_OPEN_FILE GroupId = GID_APPLICATION; ] +SfxVoidItem SaveAs FN_SAVE_FILE_AS +() +[ + /* flags: */ + AutoUpdate = FALSE, + Cachable = Cachable, + FastCall = FALSE, + HasCoreId = FALSE, + HasDialog = FALSE, + ReadOnlyDoc = TRUE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + Synchron; + + /* status: */ + SlotType = SfxStringItem + + /* config: */ + AccelConfig = TRUE, + MenuConfig = TRUE, + StatusBarConfig = FALSE, + ToolBoxConfig = TRUE, + GroupId = GID_APPLICATION; +] + SfxInt16Item PageColumnType SID_ATTR_PAGE_COLUMN [ diff --git a/sw/source/uibase/app/swmodule.cxx b/sw/source/uibase/app/swmodule.cxx index 779732b959fe..8095e43766e1 100644 --- a/sw/source/uibase/app/swmodule.cxx +++ b/sw/source/uibase/app/swmodule.cxx @@ -296,6 +296,7 @@ void SwDLL::RegisterControls() SvxColorToolBoxControl::RegisterControl( SID_EXTRUSION_3D_COLOR, pMod ); svx::FontWorkShapeTypeControl::RegisterControl( SID_FONTWORK_SHAPE_TYPE, pMod ); + SfxSaveAsToolBoxControl::RegisterControl(FN_SAVE_FILE_AS, pMod ); SvxClipBoardControl::RegisterControl(SID_PASTE, pMod ); SvxUndoRedoControl::RegisterControl(SID_UNDO, pMod ); SvxUndoRedoControl::RegisterControl(SID_REDO, pMod ); diff --git a/sw/uiconfig/swriter/toolbar/standardbar.xml b/sw/uiconfig/swriter/toolbar/standardbar.xml index 7912789985d0..39dd89079d2f 100644 --- a/sw/uiconfig/swriter/toolbar/standardbar.xml +++ b/sw/uiconfig/swriter/toolbar/standardbar.xml @@ -24,7 +24,7 @@ <toolbar:toolbaritem xlink:href=".uno:OpenFromWriter" toolbar:style="dropdown"/> <toolbar:toolbaritem xlink:href=".uno:OpenRemote"/> <toolbar:toolbaritem xlink:href=".uno:Save" toolbar:helpid="5505"/> - <toolbar:toolbaritem xlink:href=".uno:SaveAs" toolbar:helpid="5502"/> + <toolbar:toolbaritem xlink:href=".uno:SaveAs" toolbar:style="dropdown" toolbar:helpid="5502"/> <toolbar:toolbaritem xlink:href=".uno:SendMail" toolbar:visible="false" toolbar:helpid="5331"/> <toolbar:toolbarseparator/> <toolbar:toolbaritem xlink:href=".uno:EditDoc" toolbar:helpid="6312" toolbar:visible="false"/> |