framework/inc/services/layoutmanager.hxx | 2 framework/source/layoutmanager/layoutmanager.cxx | 169 +++++++--- officecfg/registry/data/org/openoffice/Office/UI/GenericCommands.xcu | 5 sw/UIConfig_swriter.mk | 1 sw/uiconfig/swriter/menubar/mscompatibleformsmenu.xml | 29 + 5 files changed, 158 insertions(+), 48 deletions(-)
New commits: commit dc3a2546bd0ad0afe20cba9940934405174fd593 Author: Tamás Zolnai <tamas.zol...@collabora.com> AuthorDate: Fri Feb 15 18:37:40 2019 +0100 Commit: Tamás Zolnai <tamas.zol...@collabora.com> CommitDate: Sat Feb 16 16:12:48 2019 +0100 MSForms: Introduce a new Forms menu which is compatible with MS Word * It's a Writer only menu by now * Displayed when the compatibility option is set * The menubar is changed during creation, so the option has an effect only after a restart. * MS compatible Forms menu contains only some ActiveX controls now Change-Id: I459f489c15ea7a25514f379b1800b926cc2087ce Reviewed-on: https://gerrit.libreoffice.org/67904 Tested-by: Jenkins Reviewed-by: Tamás Zolnai <tamas.zol...@collabora.com> diff --git a/framework/inc/services/layoutmanager.hxx b/framework/inc/services/layoutmanager.hxx index 1cd9f1d99ff7..6e15d58e2442 100644 --- a/framework/inc/services/layoutmanager.hxx +++ b/framework/inc/services/layoutmanager.hxx @@ -178,6 +178,7 @@ namespace framework void implts_reset( bool bAttach ); void implts_updateMenuBarClose(); bool implts_resetMenuBar(); + void implts_createMSCompatibleMenuBar(const OUString& rName); // locking diff --git a/framework/source/layoutmanager/layoutmanager.cxx b/framework/source/layoutmanager/layoutmanager.cxx index b48e69c3b9e6..5cb364df9285 100644 --- a/framework/source/layoutmanager/layoutmanager.cxx +++ b/framework/source/layoutmanager/layoutmanager.cxx @@ -74,6 +74,7 @@ #include <comphelper/uno3.hxx> #include <rtl/instance.hxx> #include <unotools/cmdoptions.hxx> +#include <unotools/compatibilityviewoptions.hxx> #include <rtl/ref.hxx> #include <rtl/strbuf.hxx> @@ -157,6 +158,14 @@ void LayoutManager::implts_createMenuBar(const OUString& rMenuBarName) { SolarMutexClearableGuard aWriteLock; + // Create a customized menu if compatibility mode is on + SvtCompatibilityViewOptions aCompOptions; + if( aCompOptions.HasMSOCompatibleFormsMenu() && m_aModuleIdentifier == "com.sun.star.text.TextDocument" ) + { + implts_createMSCompatibleMenuBar(rMenuBarName); + } + + // Create the default menubar otherwise if (!m_bInplaceMenuSet && !m_xMenuBar.is()) { m_xMenuBar = implts_createElement( rMenuBarName ); @@ -209,6 +218,8 @@ void LayoutManager::impl_clearUpMenuBar() { implts_lock(); + implts_resetInplaceMenuBar(); + // Clear up VCL menu bar to prepare shutdown if ( m_xContainerWindow.is() ) { @@ -2524,6 +2535,60 @@ bool LayoutManager::implts_resetMenuBar() return false; } +void LayoutManager::implts_createMSCompatibleMenuBar( const OUString& aName ) +{ + SolarMutexClearableGuard aWriteLock; + + // Find Forms menu in the original menubar + m_xMenuBar = implts_createElement( aName ); + uno::Reference< XUIElementSettings > xMenuBarSettings(m_xMenuBar, UNO_QUERY); + uno::Reference< container::XIndexReplace > xMenuIndex(xMenuBarSettings->getSettings(true), UNO_QUERY); + + sal_Int32 nFormsMenu = -1; + for (sal_Int32 nIndex = 0; nIndex < xMenuIndex->getCount(); ++nIndex) + { + uno::Sequence< beans::PropertyValue > aProps; + xMenuIndex->getByIndex( nIndex ) >>= aProps; + OUString aCommand; + for (sal_Int32 nSeqInd = 0; nSeqInd < aProps.getLength(); ++nSeqInd) + { + if (aProps[nSeqInd].Name == "CommandURL") + { + aProps[nSeqInd].Value >>= aCommand; + break; + } + } + + if (aCommand == ".uno:FormatFormMenu") + nFormsMenu = nIndex; + } + assert(nFormsMenu != -1); + + // Create the MS compatible Forms menu + css::uno::Reference< css::ui::XUIElement > xFormsMenu = implts_createElement( "private:resource/menubar/mscompatibleformsmenu" ); + if(!xFormsMenu.is()) + return; + + // Merge the MS compatible Forms menu into the menubar + uno::Reference< XUIElementSettings > xFormsMenuSettings(xFormsMenu, UNO_QUERY); + uno::Reference< container::XIndexAccess > xFormsMenuIndex(xFormsMenuSettings->getSettings(true)); + + assert(xFormsMenuIndex->getCount() >= 1); + uno::Sequence< beans::PropertyValue > aNewFormsMenu; + xFormsMenuIndex->getByIndex( 0 ) >>= aNewFormsMenu; + xMenuIndex->replaceByIndex(nFormsMenu, uno::makeAny(aNewFormsMenu)); + + setMergedMenuBar( xMenuIndex ); + + // Clear up the temporal forms menubar + Reference< XComponent > xFormsMenuComp( xFormsMenu, UNO_QUERY ); + if ( xFormsMenuComp.is() ) + xFormsMenuComp->dispose(); + xFormsMenu.clear(); + + aWriteLock.clear(); +} + IMPL_LINK_NOARG(LayoutManager, MenuBarClose, void*, void) { SolarMutexClearableGuard aReadLock; diff --git a/officecfg/registry/data/org/openoffice/Office/UI/GenericCommands.xcu b/officecfg/registry/data/org/openoffice/Office/UI/GenericCommands.xcu index 5e0316d6795e..200656e87d43 100644 --- a/officecfg/registry/data/org/openoffice/Office/UI/GenericCommands.xcu +++ b/officecfg/registry/data/org/openoffice/Office/UI/GenericCommands.xcu @@ -6809,6 +6809,11 @@ <value xml:lang="en-US">More Fields</value> </prop> </node> + <node oor:name=".uno:MSCompatActiveXControls" oor:op="replace"> + <prop oor:name="Label" oor:type="xs:string"> + <value xml:lang="en-US">ActiveX Controls</value> + </prop> + </node> </node> </node> </oor:component-data> diff --git a/sw/UIConfig_swriter.mk b/sw/UIConfig_swriter.mk index 4bb3adb83cee..5e03ab5d3d7f 100644 --- a/sw/UIConfig_swriter.mk +++ b/sw/UIConfig_swriter.mk @@ -11,6 +11,7 @@ $(eval $(call gb_UIConfig_UIConfig,modules/swriter)) $(eval $(call gb_UIConfig_add_menubarfiles,modules/swriter,\ sw/uiconfig/swriter/menubar/menubar \ + sw/uiconfig/swriter/menubar/mscompatibleformsmenu \ )) $(eval $(call gb_UIConfig_add_popupmenufiles,modules/swriter,\ diff --git a/sw/uiconfig/swriter/menubar/mscompatibleformsmenu.xml b/sw/uiconfig/swriter/menubar/mscompatibleformsmenu.xml new file mode 100644 index 000000000000..4b8f5ea0e714 --- /dev/null +++ b/sw/uiconfig/swriter/menubar/mscompatibleformsmenu.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * 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/. + * +--> +<menu:menubar xmlns:menu="http://openoffice.org/2001/menu"> + <menu:menu menu:id=".uno:FormatFormMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:SwitchControlDesignMode"/> + <menu:menuitem menu:id=".uno:ControlProperties"/> + <menu:menuseparator/> + <menu:menu menu:id=".uno:MSCompatActiveXControls"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:Label"/> + <menu:menuitem menu:id=".uno:Edit"/> + <menu:menuitem menu:id=".uno:CheckBox"/> + <menu:menuitem menu:id=".uno:RadioButton"/> + <menu:menuitem menu:id=".uno:ListBox"/> + <menu:menuitem menu:id=".uno:Pushbutton"/> + <menu:menuitem menu:id=".uno:DateField"/> + </menu:menupopup> + </menu:menu> + </menu:menupopup> + </menu:menu> +</menu:menubar> commit 5599dfc71b4bd0a2f9130cb51a0dc8fe7eaf9fdb Author: Tamás Zolnai <tamas.zol...@collabora.com> AuthorDate: Fri Feb 15 18:36:25 2019 +0100 Commit: Tamás Zolnai <tamas.zol...@collabora.com> CommitDate: Sat Feb 16 16:12:34 2019 +0100 MSForms: Extract menu creation to a separate method No functional change is intended. Change-Id: Ieb88e746b08c6a6daac14c08a206db73cbeef8a9 Reviewed-on: https://gerrit.libreoffice.org/67903 Tested-by: Jenkins Reviewed-by: Tamás Zolnai <tamas.zol...@collabora.com> diff --git a/framework/inc/services/layoutmanager.hxx b/framework/inc/services/layoutmanager.hxx index eaecc6fa8e87..1cd9f1d99ff7 100644 --- a/framework/inc/services/layoutmanager.hxx +++ b/framework/inc/services/layoutmanager.hxx @@ -173,6 +173,7 @@ namespace framework // menu bar + void implts_createMenuBar( const OUString& rMenuBarName ); void impl_clearUpMenuBar(); void implts_reset( bool bAttach ); void implts_updateMenuBarClose(); diff --git a/framework/source/layoutmanager/layoutmanager.cxx b/framework/source/layoutmanager/layoutmanager.cxx index ae58c71deb72..b48e69c3b9e6 100644 --- a/framework/source/layoutmanager/layoutmanager.cxx +++ b/framework/source/layoutmanager/layoutmanager.cxx @@ -153,6 +153,57 @@ LayoutManager::~LayoutManager() m_pGlobalSettings.reset(); } +void LayoutManager::implts_createMenuBar(const OUString& rMenuBarName) +{ + SolarMutexClearableGuard aWriteLock; + + if (!m_bInplaceMenuSet && !m_xMenuBar.is()) + { + m_xMenuBar = implts_createElement( rMenuBarName ); + if ( m_xMenuBar.is() ) + { + SolarMutexGuard aGuard; + + SystemWindow* pSysWindow = getTopSystemWindow( m_xContainerWindow ); + if ( pSysWindow ) + { + Reference< awt::XMenuBar > xMenuBar; + + Reference< XPropertySet > xPropSet( m_xMenuBar, UNO_QUERY ); + if ( xPropSet.is() ) + { + try + { + xPropSet->getPropertyValue("XMenuBar") >>= xMenuBar; + } + catch (const beans::UnknownPropertyException&) + { + } + catch (const lang::WrappedTargetException&) + { + } + } + + if ( xMenuBar.is() ) + { + VCLXMenu* pAwtMenuBar = VCLXMenu::GetImplementation( xMenuBar ); + if ( pAwtMenuBar ) + { + MenuBar* pMenuBar = static_cast<MenuBar*>(pAwtMenuBar->GetMenu()); + if ( pMenuBar ) + { + pSysWindow->SetMenuBar(pMenuBar); + pMenuBar->SetDisplayable( m_bMenuVisible ); + implts_updateMenuBarClose(); + } + } + } + } + } + } + aWriteLock.clear(); +} + // Internal helper function void LayoutManager::impl_clearUpMenuBar() { @@ -1379,7 +1430,6 @@ void SAL_CALL LayoutManager::createElement( const OUString& aName ) SolarMutexClearableGuard aReadLock; Reference< XFrame > xFrame = m_xFrame; - bool bInPlaceMenu = m_bInplaceMenuSet; aReadLock.clear(); if ( !xFrame.is() ) @@ -1415,55 +1465,13 @@ void SAL_CALL LayoutManager::createElement( const OUString& aName ) bMustBeLayouted = m_xToolbarManager->isLayoutDirty(); } else if ( aElementType.equalsIgnoreAsciiCase("menubar") && - aElementName.equalsIgnoreAsciiCase("menubar") ) + aElementName.equalsIgnoreAsciiCase("menubar") && + implts_isFrameOrWindowTop(xFrame) ) { - // #i38743# don't create a menubar if frame isn't top - if ( !bInPlaceMenu && !m_xMenuBar.is() && implts_isFrameOrWindowTop( xFrame )) - { - m_xMenuBar = implts_createElement( aName ); - if ( m_xMenuBar.is() ) - { - SolarMutexGuard aGuard; + implts_createMenuBar( aName ); + if (m_bMenuVisible) + bNotify = true; - SystemWindow* pSysWindow = getTopSystemWindow( m_xContainerWindow ); - if ( pSysWindow ) - { - Reference< awt::XMenuBar > xMenuBar; - - Reference< XPropertySet > xPropSet( m_xMenuBar, UNO_QUERY ); - if ( xPropSet.is() ) - { - try - { - xPropSet->getPropertyValue("XMenuBar") >>= xMenuBar; - } - catch (const beans::UnknownPropertyException&) - { - } - catch (const lang::WrappedTargetException&) - { - } - } - - if ( xMenuBar.is() ) - { - VCLXMenu* pAwtMenuBar = VCLXMenu::GetImplementation( xMenuBar ); - if ( pAwtMenuBar ) - { - MenuBar* pMenuBar = static_cast<MenuBar*>(pAwtMenuBar->GetMenu()); - if ( pMenuBar ) - { - pSysWindow->SetMenuBar(pMenuBar); - pMenuBar->SetDisplayable( m_bMenuVisible ); - if ( m_bMenuVisible ) - bNotify = true; - implts_updateMenuBarClose(); - } - } - } - } - } - } aWriteLock.clear(); } else if ( aElementType.equalsIgnoreAsciiCase("statusbar") && _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits