diff options
author | Maxim Monastirsky <momonasmon@gmail.com> | 2015-11-25 17:33:45 +0200 |
---|---|---|
committer | Maxim Monastirsky <momonasmon@gmail.com> | 2015-11-26 08:19:23 +0000 |
commit | ff35d252ff247c55c1004cce6676af8f881a2e68 (patch) | |
tree | 70ba1c6055b0689132e230533236d9553baf4f64 | |
parent | 8d6136206f26dbee773ffaea18a0f37c17e55024 (diff) |
tdf#93837 Add UNO-based SmartTag menu controller
... and use it for the standalone context menu. The sfx2
controller (SvxSmartTagsControl) is still used for the
submenu variation, and is due to be removed after the new
context menu implementation is in place.
Change-Id: I2f889428eb777149f43d74cf3d081e19ab0ebb4a
Reviewed-on: https://gerrit.libreoffice.org/20169
Reviewed-by: Maxim Monastirsky <momonasmon@gmail.com>
Tested-by: Maxim Monastirsky <momonasmon@gmail.com>
-rw-r--r-- | include/sfx2/sfxsids.hrc | 1 | ||||
-rw-r--r-- | include/svx/svxids.hrc | 2 | ||||
-rw-r--r-- | officecfg/registry/data/org/openoffice/Office/UI/Controller.xcu | 11 | ||||
-rw-r--r-- | officecfg/registry/data/org/openoffice/Office/UI/WriterCommands.xcu | 5 | ||||
-rw-r--r-- | sfx2/sdi/sfx.sdi | 2 | ||||
-rw-r--r-- | svx/Library_svx.mk | 1 | ||||
-rw-r--r-- | svx/source/items/SmartTagItem.cxx | 16 | ||||
-rw-r--r-- | svx/source/mnuctrls/smarttagmenu.cxx | 246 | ||||
-rw-r--r-- | svx/util/svx.component | 4 | ||||
-rw-r--r-- | sw/AllLangResTarget_sw.mk | 1 | ||||
-rw-r--r-- | sw/Library_sw.mk | 1 | ||||
-rw-r--r-- | sw/inc/crsrsh.hxx | 8 | ||||
-rw-r--r-- | sw/inc/rcid.hrc | 5 | ||||
-rw-r--r-- | sw/inc/view.hxx | 2 | ||||
-rw-r--r-- | sw/source/core/crsr/crsrsh.cxx | 11 | ||||
-rw-r--r-- | sw/source/uibase/inc/stmenu.hxx | 72 | ||||
-rw-r--r-- | sw/source/uibase/smartmenu/stmenu.cxx | 167 | ||||
-rw-r--r-- | sw/source/uibase/smartmenu/stmenu.hrc | 33 | ||||
-rw-r--r-- | sw/source/uibase/smartmenu/stmenu.src | 37 | ||||
-rw-r--r-- | sw/source/uibase/uiview/view.cxx | 2 | ||||
-rw-r--r-- | sw/source/uibase/uiview/viewling.cxx | 42 |
21 files changed, 314 insertions, 355 deletions
diff --git a/include/sfx2/sfxsids.hrc b/include/sfx2/sfxsids.hrc index 4ba4679d28f8..081b69c423fc 100644 --- a/include/sfx2/sfxsids.hrc +++ b/include/sfx2/sfxsids.hrc @@ -586,6 +586,7 @@ #define SID_ATTR_CHAR_COLOR2 (SID_SVX_START + 537) #define SID_COMP_BIBLIOGRAPHY (SID_SVX_START + 880) #define SID_ADDRESS_DATA_SOURCE (SID_SVX_START + 934) +#define SID_OPEN_SMARTTAGOPTIONS (SID_SVX_START + 1062) #define FID_SVX_START (SID_LIB_START + 500) #define FID_SEARCH_NOW (FID_SVX_START + 2) diff --git a/include/svx/svxids.hrc b/include/svx/svxids.hrc index 1ec7daa1bda6..8fe69e1387bb 100644 --- a/include/svx/svxids.hrc +++ b/include/svx/svxids.hrc @@ -916,7 +916,7 @@ #define SID_INSERT_ZWNBSP ( SID_SVX_START + 1059 ) /* insert ZWNJ - invisible space, forces linebreak*/ #define SID_OPTIONS_DATABASES ( SID_SVX_START + 1060 ) #define SID_OPEN_SMARTTAGMENU ( SID_SVX_START + 1061 ) -#define SID_OPEN_SMARTTAGOPTIONS ( SID_SVX_START + 1062 ) +// (SID_SVX_START + 1062) is in include/sfx2/sfxsids.hrc #define SID_INSERT_TREECONTROL ( SID_SVX_START + 1063 ) #define SID_ATTR_VIEWLAYOUT ( SID_SVX_START + 1064 ) #define SID_ATTR_ZOOMSLIDER ( SID_SVX_START + 1065 ) diff --git a/officecfg/registry/data/org/openoffice/Office/UI/Controller.xcu b/officecfg/registry/data/org/openoffice/Office/UI/Controller.xcu index 23b95fef8d58..977d6696c33b 100644 --- a/officecfg/registry/data/org/openoffice/Office/UI/Controller.xcu +++ b/officecfg/registry/data/org/openoffice/Office/UI/Controller.xcu @@ -196,6 +196,17 @@ <value>com.sun.star.comp.framework.ThesaurusMenuController</value> </prop> </node> + <node oor:name="c18" oor:op="replace"> + <prop oor:name="Command"> + <value>.uno:OpenSmartTagMenuOnCursor</value> + </prop> + <prop oor:name="Module"> + <value/> + </prop> + <prop oor:name="Controller"> + <value>com.sun.star.comp.svx.SmartTagMenuController</value> + </prop> + </node> </node> <node oor:name="ToolBar"> <node oor:name="ZoomToolBox" oor:op="replace"> diff --git a/officecfg/registry/data/org/openoffice/Office/UI/WriterCommands.xcu b/officecfg/registry/data/org/openoffice/Office/UI/WriterCommands.xcu index 1ad103dac956..d68d4cc497f8 100644 --- a/officecfg/registry/data/org/openoffice/Office/UI/WriterCommands.xcu +++ b/officecfg/registry/data/org/openoffice/Office/UI/WriterCommands.xcu @@ -2359,6 +2359,11 @@ <value>1</value> </prop> </node> + <node oor:name=".uno:AutoCorrectDlg?OpenSmartTag:bool=true" oor:op="replace"> + <prop oor:name="Label" oor:type="xs:string"> + <value xml:lang="en-US">Smart ~Tag Options...</value> + </prop> + </node> </node> <node oor:name="Popups"> <node oor:name=".uno:TableMenu" oor:op="replace"> diff --git a/sfx2/sdi/sfx.sdi b/sfx2/sdi/sfx.sdi index f151bc78fd9c..92266bc143eb 100644 --- a/sfx2/sdi/sfx.sdi +++ b/sfx2/sdi/sfx.sdi @@ -7272,7 +7272,7 @@ SfxBoolItem CheckPLZ SID_OFFICE_CHECK_PLZ ] SfxVoidItem AutoCorrectDlg SID_AUTO_CORRECT_DLG -(SfxBoolItem ShowSwOptions SID_AUTO_CORRECT_DLG) +(SfxBoolItem ShowSwOptions SID_AUTO_CORRECT_DLG, SfxBoolItem OpenSmartTag SID_OPEN_SMARTTAGOPTIONS) [ /* flags: */ AutoUpdate = FALSE, diff --git a/svx/Library_svx.mk b/svx/Library_svx.mk index c30276e2b7ad..90cfe49ca532 100644 --- a/svx/Library_svx.mk +++ b/svx/Library_svx.mk @@ -167,6 +167,7 @@ $(eval $(call gb_Library_add_exception_objects,svx,\ svx/source/mnuctrls/fntctl \ svx/source/mnuctrls/fntszctl \ svx/source/mnuctrls/SmartTagCtl \ + svx/source/mnuctrls/smarttagmenu \ svx/source/sidebar/ContextChangeEventMultiplexer \ svx/source/sidebar/EmptyPanel \ svx/source/sidebar/nbdtmg \ diff --git a/svx/source/items/SmartTagItem.cxx b/svx/source/items/SmartTagItem.cxx index 565174ef6e1c..cb9e351755b4 100644 --- a/svx/source/items/SmartTagItem.cxx +++ b/svx/source/items/SmartTagItem.cxx @@ -17,7 +17,7 @@ * the License at http://www.apache.org/licenses/LICENSE-2.0 . */ - +#include <comphelper/propertysequence.hxx> #include <svx/SmartTagItem.hxx> #include <com/sun/star/container/XStringKeyMap.hpp> @@ -53,9 +53,19 @@ SvxSmartTagItem::SvxSmartTagItem( const sal_uInt16 nId, -bool SvxSmartTagItem::QueryValue( uno::Any& /* rVal */, sal_uInt8 /* nMemberId */ ) const +bool SvxSmartTagItem::QueryValue( uno::Any& rVal, sal_uInt8 /*nMemberId*/ ) const { - return false; + rVal <<= comphelper::InitPropertySequence( { + { "ActionComponents", css::uno::makeAny( maActionComponentsSequence ) }, + { "ActionIndices", css::uno::makeAny( maActionIndicesSequence ) }, + { "StringKeyMaps", css::uno::makeAny( maStringKeyMaps ) }, + { "TextRange", css::uno::makeAny( mxRange ) }, + { "Controller", css::uno::makeAny( mxController ) }, + { "Locale", css::uno::makeAny( maLocale ) }, + { "ApplicationName", css::uno::makeAny( maApplicationName ) }, + { "RangeText", css::uno::makeAny( maRangeText ) }, + } ); + return true; } bool SvxSmartTagItem::PutValue( const uno::Any& /*rVal*/, sal_uInt8 /* nMemberId */) diff --git a/svx/source/mnuctrls/smarttagmenu.cxx b/svx/source/mnuctrls/smarttagmenu.cxx new file mode 100644 index 000000000000..16b0f02756fb --- /dev/null +++ b/svx/source/mnuctrls/smarttagmenu.cxx @@ -0,0 +1,246 @@ +/* -*- 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 <svtools/popupmenucontrollerbase.hxx> +#include <svx/SmartTagItem.hxx> +#include <vcl/commandinfoprovider.hxx> +#include <vcl/menu.hxx> + +const sal_uInt16 MN_ST_INSERT_START = 500; + +class SmartTagMenuController : public svt::PopupMenuControllerBase +{ +public: + explicit SmartTagMenuController( const css::uno::Reference< css::uno::XComponentContext >& rxContext ); + virtual ~SmartTagMenuController(); + + // XStatusListener + virtual void SAL_CALL statusChanged( const css::frame::FeatureStateEvent& rEvent ) throw ( css::uno::RuntimeException, std::exception ) override; + + // XServiceInfo + virtual OUString SAL_CALL getImplementationName() throw ( css::uno::RuntimeException, std::exception ) override; + virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() throw ( css::uno::RuntimeException, std::exception ) override; + +private: + void FillMenu(); + DECL_LINK_TYPED( MenuSelect, Menu*, bool ); + struct InvokeAction + { + css::uno::Reference< css::smarttags::XSmartTagAction > m_xAction; + css::uno::Reference< css::container::XStringKeyMap > m_xSmartTagProperties; + sal_uInt32 m_nActionID; + InvokeAction( css::uno::Reference< css::smarttags::XSmartTagAction > xAction, + css::uno::Reference< css::container::XStringKeyMap > xSmartTagProperties, + sal_uInt32 nActionID ) : m_xAction( xAction ), m_xSmartTagProperties( xSmartTagProperties ), m_nActionID( nActionID ) {} + }; + std::vector< InvokeAction > m_aInvokeActions; + std::vector< std::unique_ptr< PopupMenu > > m_aSubMenus; + std::unique_ptr< const SvxSmartTagItem > m_pSmartTagItem; +}; + +SmartTagMenuController::SmartTagMenuController( const css::uno::Reference< css::uno::XComponentContext >& rxContext ) + : svt::PopupMenuControllerBase( rxContext ) +{ +} + +SmartTagMenuController::~SmartTagMenuController() +{ +} + +void SmartTagMenuController::statusChanged( const css::frame::FeatureStateEvent& rEvent ) + throw ( css::uno::RuntimeException, std::exception ) +{ + resetPopupMenu( m_xPopupMenu ); + m_aSubMenus.clear(); + + css::uno::Sequence< css::beans::PropertyValue > aProperties; + if ( rEvent.IsEnabled && ( rEvent.State >>= aProperties ) ) + { + css::uno::Sequence< css::uno::Sequence< css::uno::Reference< css::smarttags::XSmartTagAction > > > aActionComponents; + css::uno::Sequence< css::uno::Sequence< sal_Int32 > > aActionIndices; + css::uno::Sequence< css::uno::Reference< css::container::XStringKeyMap > > aStringKeyMaps; + css::uno::Reference< css::text::XTextRange > xTextRange; + css::uno::Reference< css::frame::XController > xController; + css::lang::Locale aLocale; + OUString aApplicationName; + OUString aRangeText; + + for ( const auto& aProperty : aProperties ) + { + if ( aProperty.Name == "ActionComponents" ) + aProperty.Value >>= aActionComponents; + else if ( aProperty.Name == "ActionIndices" ) + aProperty.Value >>= aActionIndices; + else if ( aProperty.Name == "StringKeyMaps" ) + aProperty.Value >>= aStringKeyMaps; + else if ( aProperty.Name == "TextRange" ) + aProperty.Value >>= xTextRange; + else if ( aProperty.Name == "Controller" ) + aProperty.Value >>= xController; + else if ( aProperty.Name == "Locale" ) + aProperty.Value >>= aLocale; + else if ( aProperty.Name == "ApplicationName" ) + aProperty.Value >>= aApplicationName; + else if ( aProperty.Name == "RangeText" ) + aProperty.Value >>= aRangeText; + } + m_pSmartTagItem.reset( new SvxSmartTagItem( 0, aActionComponents, aActionIndices, aStringKeyMaps, xTextRange, xController, aLocale, aApplicationName, aRangeText ) ); + FillMenu(); + } +} + +void SmartTagMenuController::FillMenu() +{ + if ( !m_pSmartTagItem ) + return; + + sal_uInt16 nMenuId = 1; + sal_uInt16 nSubMenuId = MN_ST_INSERT_START; + + VCLXMenu* pAwtMenu = VCLXMenu::GetImplementation( m_xPopupMenu ); + PopupMenu* pVCLMenu = static_cast< PopupMenu* >( pAwtMenu->GetMenu() ); + + const css::uno::Sequence< css::uno::Sequence< css::uno::Reference< css::smarttags::XSmartTagAction > > >& rActionComponentsSequence = m_pSmartTagItem->GetActionComponentsSequence(); + const css::uno::Sequence< css::uno::Sequence< sal_Int32 > >& rActionIndicesSequence = m_pSmartTagItem->GetActionIndicesSequence(); + const css::uno::Sequence< css::uno::Reference< css::container::XStringKeyMap > >& rStringKeyMaps = m_pSmartTagItem->GetStringKeyMaps(); + const css::lang::Locale& rLocale = m_pSmartTagItem->GetLocale(); + const OUString aApplicationName = m_pSmartTagItem->GetApplicationName(); + const OUString aRangeText = m_pSmartTagItem->GetRangeText(); + const css::uno::Reference< css::text::XTextRange >& xTextRange = m_pSmartTagItem->GetTextRange(); + const css::uno::Reference< css::frame::XController >& xController = m_pSmartTagItem->GetController(); + + for ( sal_Int32 i = 0; i < rActionComponentsSequence.getLength(); ++i ) + { + css::uno::Reference< css::container::XStringKeyMap > xSmartTagProperties = rStringKeyMaps[i]; + + // Get all actions references associated with the current smart tag type + const css::uno::Sequence< css::uno::Reference< css::smarttags::XSmartTagAction > >& rActionComponents = rActionComponentsSequence[i]; + const css::uno::Sequence< sal_Int32 >& rActionIndices = rActionIndicesSequence[i]; + + if ( 0 == rActionComponents.getLength() || 0 == rActionIndices.getLength() ) + continue; + + // Ask first entry for the smart tag type caption + css::uno::Reference< css::smarttags::XSmartTagAction > xFirstAction = rActionComponents[0]; + + if ( !xFirstAction.is() ) + continue; + + const sal_Int32 nSmartTagIndex = rActionIndices[0]; + const OUString aSmartTagType = xFirstAction->getSmartTagName( nSmartTagIndex ); + const OUString aSmartTagCaption = xFirstAction->getSmartTagCaption( nSmartTagIndex, rLocale ); + + // No sub-menus if there's only one smart tag type listed + PopupMenu* pSubMenu = pVCLMenu; + if ( 1 < rActionComponentsSequence.getLength() ) + { + pVCLMenu->InsertItem( nMenuId, aSmartTagCaption ); + pSubMenu = new PopupMenu; + m_aSubMenus.push_back( std::unique_ptr< PopupMenu >( pSubMenu ) ); + pVCLMenu->SetPopupMenu( nMenuId++, pSubMenu ); + } + pSubMenu->SetSelectHdl( LINK( this, SmartTagMenuController, MenuSelect ) ); + + // Sub-menu starts with smart tag caption and separator + const OUString aSmartTagCaption2 = aSmartTagCaption + ": " + aRangeText; + pSubMenu->InsertItem( nMenuId++, aSmartTagCaption2, MenuItemBits::NOSELECT ); + pSubMenu->InsertSeparator(); + + // Add subitem for every action reference for the current smart tag type + for ( const auto& xAction : rActionComponents ) + { + for ( sal_Int32 j = 0; j < xAction->getActionCount( aSmartTagType, xController, xSmartTagProperties ); ++j ) + { + const sal_uInt32 nActionID = xAction->getActionID( aSmartTagType, j, xController ); + OUString aActionCaption = xAction->getActionCaptionFromID( nActionID, + aApplicationName, + rLocale, + xSmartTagProperties, + aRangeText, + OUString(), + xController, + xTextRange ); + + pSubMenu->InsertItem( nSubMenuId++, aActionCaption ); + InvokeAction aEntry( xAction, xSmartTagProperties, nActionID ); + m_aInvokeActions.push_back( aEntry ); + } + } + } + + if ( 0 < pVCLMenu->GetItemCount() ) + { + const OUString aCommand = ".uno:AutoCorrectDlg?OpenSmartTag:bool=true"; + pVCLMenu->InsertSeparator(); + pVCLMenu->InsertItem( nMenuId, vcl::CommandInfoProvider::Instance().GetPopupLabelForCommand( aCommand, m_xFrame ) ); + pVCLMenu->SetItemCommand( nMenuId, aCommand ); + } +} + +IMPL_LINK_TYPED( SmartTagMenuController, MenuSelect, Menu*, pMenu, bool ) +{ + if ( !m_pSmartTagItem ) + return false; + + sal_uInt16 nMyId = pMenu->GetCurItemId(); + if ( nMyId < MN_ST_INSERT_START ) + return false; + + nMyId -= MN_ST_INSERT_START; + + // Compute SmartTag lib index and action index + css::uno::Reference< css::smarttags::XSmartTagAction > xSmartTagAction = m_aInvokeActions[nMyId].m_xAction; + + // Execute action + if ( xSmartTagAction.is() ) + { + xSmartTagAction->invokeAction( m_aInvokeActions[nMyId].m_nActionID, + m_pSmartTagItem->GetApplicationName(), + m_pSmartTagItem->GetController(), + m_pSmartTagItem->GetTextRange(), + m_aInvokeActions[nMyId].m_xSmartTagProperties, + m_pSmartTagItem->GetRangeText(), + OUString(), + m_pSmartTagItem->GetLocale() ); + } + return false; +} + +OUString SmartTagMenuController::getImplementationName() + throw ( css::uno::RuntimeException, std::exception ) +{ + return OUString( "com.sun.star.comp.svx.SmartTagMenuController" ); +} + +css::uno::Sequence< OUString > SmartTagMenuController::getSupportedServiceNames() + throw ( css::uno::RuntimeException, std::exception ) +{ + css::uno::Sequence< OUString > aRet { "com.sun.star.frame.PopupMenuController" }; + return aRet; +} + +extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface * SAL_CALL +com_sun_star_comp_svx_SmartTagMenuController_get_implementation( + css::uno::XComponentContext* xContext, + css::uno::Sequence< css::uno::Any > const & ) +{ + return cppu::acquire( new SmartTagMenuController( xContext ) ); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/svx/util/svx.component b/svx/util/svx.component index 0cff72e9b423..3f0e38e1eba3 100644 --- a/svx/util/svx.component +++ b/svx/util/svx.component @@ -88,4 +88,8 @@ constructor="com_sun_star_comp_svx_NumberingToolBoxControl_get_implementation"> <service name="com.sun.star.frame.ToolbarController"/> </implementation> + <implementation name="com.sun.star.comp.svx.SmartTagMenuController" + constructor="com_sun_star_comp_svx_SmartTagMenuController_get_implementation"> + <service name="com.sun.star.frame.PopupMenuController"/> + </implementation> </component> diff --git a/sw/AllLangResTarget_sw.mk b/sw/AllLangResTarget_sw.mk index c95c16a2241f..ef8d7ea14836 100644 --- a/sw/AllLangResTarget_sw.mk +++ b/sw/AllLangResTarget_sw.mk @@ -75,7 +75,6 @@ $(eval $(call gb_SrsTarget_add_files,sw/res,\ sw/source/uibase/misc/redlndlg.src \ sw/source/uibase/ribbar/inputwin.src \ sw/source/uibase/ribbar/workctrl.src \ - sw/source/uibase/smartmenu/stmenu.src \ sw/source/uibase/uiview/view.src \ sw/source/uibase/utlui/attrdesc.src \ sw/source/uibase/utlui/navipi.src \ diff --git a/sw/Library_sw.mk b/sw/Library_sw.mk index b4af6e57c547..789a777746c6 100644 --- a/sw/Library_sw.mk +++ b/sw/Library_sw.mk @@ -684,7 +684,6 @@ $(eval $(call gb_Library_add_exception_objects,sw,\ sw/source/uibase/sidebar/WrapPropertyPanel \ sw/source/uibase/sidebar/ThemePanel \ sw/source/uibase/sidebar/SwPanelFactory \ - sw/source/uibase/smartmenu/stmenu \ sw/source/uibase/table/chartins \ sw/source/uibase/table/swtablerep \ sw/source/uibase/table/tablemgr \ diff --git a/sw/inc/crsrsh.hxx b/sw/inc/crsrsh.hxx index d53a61064cc0..13d8c0c9b219 100644 --- a/sw/inc/crsrsh.hxx +++ b/sw/inc/crsrsh.hxx @@ -768,12 +768,8 @@ public: const SwPostItField* GetPostItFieldAtCursor() const; - // get smart tags at point position - void GetSmartTagTerm( const Point& rPt, - SwRect& rSelectRect, - css::uno::Sequence< OUString >& rSmartTagTypes, - css::uno::Sequence< css::uno::Reference< css::container::XStringKeyMap > >& rStringKeyMaps, - css::uno::Reference<css::text::XTextRange>& rRange ); + // get smart tags rectangle for the given point + void GetSmartTagRect( const Point& rPt, SwRect& rSelectRect ); // get smart tags at current cursor position void GetSmartTagTerm( css::uno::Sequence< OUString >& rSmartTagTypes, diff --git a/sw/inc/rcid.hrc b/sw/inc/rcid.hrc index 0af476262780..f80958807599 100644 --- a/sw/inc/rcid.hrc +++ b/sw/inc/rcid.hrc @@ -235,10 +235,7 @@ #define RC_ACCESS_END (RC_ACCESS + 99) // free: RC_UNDO to (RC_UNDO + 199) - -// Smarttags -#define RC_SMARTTAG_BEGIN RC_SMARTTAG -// RC_SMARTTAG_END (RC_SMARTTAG + 99) +// free: RC_SMARTTAG to (RC_SMARTTAG + 99) // unocore #define RC_UNOCORE_BEGIN RC_UNOCORE diff --git a/sw/inc/view.hxx b/sw/inc/view.hxx index a757d79a0234..bfb7b3d4bcd6 100644 --- a/sw/inc/view.hxx +++ b/sw/inc/view.hxx @@ -428,7 +428,7 @@ public: void SpellError(LanguageType eLang); bool ExecSpellPopup( const Point& rPt ); void ExecFieldPopup( const Point& rPt, sw::mark::IFieldmark *fieldBM ); - bool ExecSmartTagPopup( const Point& rPt ); + void ExecSmartTagPopup( const Point& rPt ); DECL_LINK_TYPED( OnlineSpellCallback, SpellCallbackInfo&, void ); bool ExecDrwTextSpellPopup(const Point& rPt); diff --git a/sw/source/core/crsr/crsrsh.cxx b/sw/source/core/crsr/crsrsh.cxx index a3375beceeb0..22afa5177178 100644 --- a/sw/source/core/crsr/crsrsh.cxx +++ b/sw/source/core/crsr/crsrsh.cxx @@ -3460,14 +3460,8 @@ void SwCursorShell::GetSmartTagTerm( uno::Sequence< OUString >& rSmartTagTypes, } // see also SwEditShell::GetCorrection( const Point* pPt, SwRect& rSelectRect ) -void SwCursorShell::GetSmartTagTerm( const Point& rPt, SwRect& rSelectRect, - uno::Sequence< OUString >& rSmartTagTypes, - uno::Sequence< uno::Reference< container::XStringKeyMap > >& rStringKeyMaps, - uno::Reference<text::XTextRange>& rRange ) +void SwCursorShell::GetSmartTagRect( const Point& rPt, SwRect& rSelectRect ) { - if ( !SwSmartTagMgr::Get().IsSmartTagsEnabled() ) - return; - SwPaM* pCursor = GetCursor(); SwPosition aPos( *pCursor->GetPoint() ); Point aPt( rPt ); @@ -3496,9 +3490,6 @@ void SwCursorShell::GetSmartTagTerm( const Point& rPt, SwRect& rSelectRect, nCurrent = eTmpState.m_pSpecialPos->nCharOfst; } - lcl_FillRecognizerData( rSmartTagTypes, rStringKeyMaps, *pSmartTagList, nCurrent ); - lcl_FillTextRange( rRange, *pNode, nBegin, nLen ); - // get smarttag word OUString aText( pNode->GetText().copy(nBegin, nLen) ); diff --git a/sw/source/uibase/inc/stmenu.hxx b/sw/source/uibase/inc/stmenu.hxx deleted file mode 100644 index 6c6073895ee0..000000000000 --- a/sw/source/uibase/inc/stmenu.hxx +++ /dev/null @@ -1,72 +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 INCLUDED_SW_SOURCE_UIBASE_INC_STMENU_HXX -#define INCLUDED_SW_SOURCE_UIBASE_INC_STMENU_HXX - -#include <vcl/menu.hxx> - -#include <vector> -#include <com/sun/star/smarttags/XSmartTagAction.hpp> - -#include <com/sun/star/container/XStringKeyMap.hpp> -#include <com/sun/star/text/XTextRange.hpp> - -class SwView; - -/** Class: SwSmartTagPopup - - This class contains the implementation of the smarttag popup - menu that is opened if a user clicks on an underlined word. - - The menu is built in the constructor and the actions for each - menu entry are invoked in the execute-method. -*/ - -class SwSmartTagPopup : public PopupMenu -{ - SwView* mpSwView; - css::uno::Reference< css::text::XTextRange > mxTextRange; - - struct InvokeAction - { - css::uno::Reference< css::smarttags::XSmartTagAction > mxAction; - css::uno::Reference< css::container::XStringKeyMap > mxSmartTagProperties; - sal_uInt32 mnActionID; - InvokeAction( css::uno::Reference< css::smarttags::XSmartTagAction > xAction, - css::uno::Reference< css::container::XStringKeyMap > xSmartTagProperties, - sal_uInt32 nActionID ) : mxAction( xAction ), mxSmartTagProperties( xSmartTagProperties ), mnActionID( nActionID ) {} - }; - - std::vector< InvokeAction > maInvokeActions; - - using PopupMenu::Execute; - -public: - SwSmartTagPopup( SwView* _pSwView, - css::uno::Sequence< OUString >& rSmartTagTypes, - css::uno::Sequence< css::uno::Reference< css::container::XStringKeyMap > >& rStringKeyMaps, - css::uno::Reference< css::text::XTextRange > xTextRange ); - - sal_uInt16 Execute( const Rectangle& rPopupPos, vcl::Window* pWin ); -}; - -#endif - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/source/uibase/smartmenu/stmenu.cxx b/sw/source/uibase/smartmenu/stmenu.cxx deleted file mode 100644 index 42751cfc507d..000000000000 --- a/sw/source/uibase/smartmenu/stmenu.cxx +++ /dev/null @@ -1,167 +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 <stmenu.hxx> -#include <com/sun/star/uno/Sequence.hxx> -#include <svl/eitem.hxx> -#include <sfx2/dispatch.hxx> - -#include <SwSmartTagMgr.hxx> - -#include <stmenu.hrc> -#include <view.hxx> -#include <breakit.hxx> - -using namespace ::com::sun::star; -using namespace ::com::sun::star::uno; - -SwSmartTagPopup::SwSmartTagPopup( SwView* pSwView, - Sequence< OUString >& rSmartTagTypes, - Sequence< Reference< container::XStringKeyMap > >& rStringKeyMaps, - Reference< text::XTextRange > xTextRange ) : - PopupMenu( SW_RES(MN_SMARTTAG_POPUP) ), - mpSwView ( pSwView ), - mxTextRange( xTextRange ) -{ - Reference <frame::XController> xController = mpSwView->GetController(); - const lang::Locale aLocale( SW_BREAKITER()->GetLocale( GetAppLanguageTag() ) ); - - sal_uInt16 nMenuPos = 0; - sal_uInt16 nMenuId = 1; - sal_uInt16 nSubMenuId = MN_ST_INSERT_START; - - const OUString aRangeText = mxTextRange->getString(); - - SmartTagMgr& rSmartTagMgr = SwSmartTagMgr::Get(); - const OUString aApplicationName( rSmartTagMgr.GetApplicationName() ); - - Sequence < Sequence< Reference< smarttags::XSmartTagAction > > > aActionComponentsSequence; - Sequence < Sequence< sal_Int32 > > aActionIndicesSequence; - - rSmartTagMgr.GetActionSequences( rSmartTagTypes, - aActionComponentsSequence, - aActionIndicesSequence ); - - InsertSeparator(OString(), 0); - - for ( sal_Int32 j = 0; j < aActionComponentsSequence.getLength(); ++j ) - { - Reference< container::XStringKeyMap > xSmartTagProperties = rStringKeyMaps[j]; - - // Get all actions references associated with the current smart tag type: - const Sequence< Reference< smarttags::XSmartTagAction > >& rActionComponents = aActionComponentsSequence[j]; - const Sequence< sal_Int32 >& rActionIndices = aActionIndicesSequence[j]; - - if ( 0 == rActionComponents.getLength() || 0 == rActionIndices.getLength() ) - continue; - - // Ask first entry for the smart tag type caption: - Reference< smarttags::XSmartTagAction > xAction = rActionComponents[0]; - - if ( !xAction.is() ) - continue; - - const sal_Int32 nSmartTagIndex = rActionIndices[0]; - const OUString aSmartTagType = xAction->getSmartTagName( nSmartTagIndex ); - const OUString aSmartTagCaption = xAction->getSmartTagCaption( nSmartTagIndex, aLocale ); - - // no sub-menus if there's only one smart tag type listed: - PopupMenu* pSbMenu = this; - if ( 1 < aActionComponentsSequence.getLength() ) - { - InsertItem(nMenuId, aSmartTagCaption, MenuItemBits::NONE, OString(), nMenuPos++); - pSbMenu = new PopupMenu; - SetPopupMenu( nMenuId++, pSbMenu ); - } - - // sub-menu starts with smart tag caption and separator - const OUString aSmartTagCaption2 = aSmartTagCaption + ": " + aRangeText; - sal_uInt16 nSubMenuPos = 0; - pSbMenu->InsertItem(nMenuId++, aSmartTagCaption2, MenuItemBits::NOSELECT, OString(), nSubMenuPos++); - pSbMenu->InsertSeparator(OString(), nSubMenuPos++); - - // Add subitem for every action reference for the current smart tag type: - for ( sal_Int32 i = 0; i < rActionComponents.getLength(); ++i ) - { - xAction = rActionComponents[i]; - - for ( sal_Int32 k = 0; k < xAction->getActionCount( aSmartTagType, xController, xSmartTagProperties ); ++k ) - { - const sal_uInt32 nActionID = xAction->getActionID( aSmartTagType, k, xController ); - OUString aActionCaption = xAction->getActionCaptionFromID( nActionID, - aApplicationName, - aLocale, - xSmartTagProperties, - aRangeText, - OUString(), - xController, - mxTextRange ); - - pSbMenu->InsertItem(nSubMenuId++, aActionCaption, MenuItemBits::NONE, OString(), nSubMenuPos++); - InvokeAction aEntry( xAction, xSmartTagProperties, nActionID ); - maInvokeActions.push_back( aEntry ); - } - } - } -} - -/** Function: Execute - - executes actions by calling the invoke function of the appropriate - smarttag library. - -*/ -sal_uInt16 SwSmartTagPopup::Execute( const Rectangle& rWordPos, vcl::Window* pWin ) -{ - sal_uInt16 nId = PopupMenu::Execute(pWin, pWin->LogicToPixel(rWordPos)); - - if ( nId == MN_SMARTTAG_OPTIONS ) - { - SfxBoolItem aBool(SID_OPEN_SMARTTAGOPTIONS, true); - mpSwView->GetViewFrame()->GetDispatcher()->Execute( SID_AUTO_CORRECT_DLG, SfxCallMode::ASYNCHRON, &aBool, 0L ); - } - - if ( nId < MN_ST_INSERT_START) return nId; - nId -= MN_ST_INSERT_START; - - // compute smarttag lib index and action index - if ( nId < maInvokeActions.size() ) - { - Reference< smarttags::XSmartTagAction > xSmartTagAction = maInvokeActions[ nId ].mxAction; - - // execute action - if ( xSmartTagAction.is() ) - { - SmartTagMgr& rSmartTagMgr = SwSmartTagMgr::Get(); - - xSmartTagAction->invokeAction( maInvokeActions[ nId ].mnActionID, - rSmartTagMgr.GetApplicationName(), - mpSwView->GetController(), - mxTextRange, - maInvokeActions[ nId ].mxSmartTagProperties, - mxTextRange->getString(), - OUString(), - SW_BREAKITER()->GetLocale( GetAppLanguageTag() ) ); - } - } - - return nId; -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/source/uibase/smartmenu/stmenu.hrc b/sw/source/uibase/smartmenu/stmenu.hrc deleted file mode 100644 index 315fb3535af5..000000000000 --- a/sw/source/uibase/smartmenu/stmenu.hrc +++ /dev/null @@ -1,33 +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 _STMENU_HRC -#define _STMENU_HRC - -#include "rcid.hrc" - -#define MN_SMARTTAG_POPUP (RC_SMARTTAG_BEGIN + 1) - -#define MN_SMARTTAG_OPTIONS 105 - -#define MN_ST_INSERT_START 500 - -#endif - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/source/uibase/smartmenu/stmenu.src b/sw/source/uibase/smartmenu/stmenu.src deleted file mode 100644 index 326c13b8841e..000000000000 --- a/sw/source/uibase/smartmenu/stmenu.src +++ /dev/null @@ -1,37 +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 . - */ -/* StarView resource file */ - -#include "stmenu.hrc" -#include "helpid.h" - -Menu MN_SMARTTAG_POPUP -{ - ItemList = - { - MenuItem - { - Identifier = MN_SMARTTAG_OPTIONS ; - HelpID = HID_SMARTTAG_MAIN ; - Text [ en-US ] = "Smart Tag Options..." ; - }; - }; -}; - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/source/uibase/uiview/view.cxx b/sw/source/uibase/uiview/view.cxx index 0cd0cc34ee14..27d48f5b7eb2 100644 --- a/sw/source/uibase/uiview/view.cxx +++ b/sw/source/uibase/uiview/view.cxx @@ -135,7 +135,7 @@ bool SwView::m_bJustOpened = false; SearchAttrItemList* SwView::m_pSrchList = nullptr; SearchAttrItemList* SwView::m_pReplList = nullptr; -inline SfxDispatcher &SwView::GetDispatcher() +SfxDispatcher &SwView::GetDispatcher() { return *GetViewFrame()->GetDispatcher(); } diff --git a/sw/source/uibase/uiview/viewling.cxx b/sw/source/uibase/uiview/viewling.cxx index 4b4c2a230a3d..f72e370256cc 100644 --- a/sw/source/uibase/uiview/viewling.cxx +++ b/sw/source/uibase/uiview/viewling.cxx @@ -25,10 +25,12 @@ #include <com/sun/star/i18n/TextConversionOption.hpp> #include <linguistic/lngprops.hxx> #include <comphelper/processfactory.hxx> +#include <comphelper/propertyvalue.hxx> #include <toolkit/helper/vclunohelper.hxx> #include <vcl/msgbox.hxx> #include <svtools/ehdl.hxx> #include <svl/stritem.hxx> +#include <sfx2/dispatch.hxx> #include <sfx2/viewfrm.hxx> #include <sfx2/request.hxx> #include <svx/dlgutil.hxx> @@ -68,6 +70,8 @@ #include <com/sun/star/frame/XDispatch.hpp> #include <com/sun/star/frame/XDispatchProvider.hpp> #include <com/sun/star/frame/XFrame.hpp> +#include <com/sun/star/frame/XPopupMenuController.hpp> +#include <com/sun/star/awt/PopupMenuDirection.hpp> #include <com/sun/star/util/URL.hpp> #include <com/sun/star/beans/PropertyValue.hpp> #include <com/sun/star/util/URLTransformer.hpp> @@ -77,7 +81,6 @@ #include <rtl/ustring.hxx> #include <cppuhelper/bootstrap.hxx> -#include "stmenu.hxx" #include <svx/dialogs.hrc> #include <svtools/langtab.hxx> #include <unomid.h> @@ -93,7 +96,6 @@ using namespace ::com::sun::star; using namespace ::com::sun::star::beans; using namespace ::com::sun::star::uno; using namespace ::com::sun::star::linguistic2; -using namespace ::com::sun::star::smarttags; // Lingu-Dispatcher @@ -788,33 +790,39 @@ bool SwView::ExecSpellPopup(const Point& rPt) This function shows the popup menu for smarttag actions. */ -bool SwView::ExecSmartTagPopup( const Point& rPt ) +void SwView::ExecSmartTagPopup( const Point& rPt ) { - bool bRet = false; const bool bOldViewLock = m_pWrtShell->IsViewLocked(); m_pWrtShell->LockView( true ); m_pWrtShell->Push(); - // get word that was clicked on - // This data structure maps a smart tag type string to the property bag - SwRect aToFill; - Sequence< OUString > aSmartTagTypes; - Sequence< Reference< container::XStringKeyMap > > aStringKeyMaps; - Reference<text::XTextRange> xRange; + css::uno::Sequence< css::uno::Any > aArgs( 2 ); + aArgs[0] <<= comphelper::makePropertyValue( "Frame", GetDispatcher().GetFrame()->GetFrame().GetFrameInterface() ); + aArgs[1] <<= comphelper::makePropertyValue( "CommandURL", OUString( ".uno:OpenSmartTagMenuOnCursor" ) ); + + css::uno::Reference< css::uno::XComponentContext > xContext = comphelper::getProcessComponentContext(); + css::uno::Reference< css::frame::XPopupMenuController > xPopupController( + xContext->getServiceManager()->createInstanceWithArgumentsAndContext( + "com.sun.star.comp.svx.SmartTagMenuController", aArgs, xContext ), css::uno::UNO_QUERY ); - m_pWrtShell->GetSmartTagTerm( rPt, aToFill, aSmartTagTypes, aStringKeyMaps, xRange); - if ( xRange.is() && aSmartTagTypes.getLength() ) + css::uno::Reference< css::awt::XPopupMenu > xPopupMenu( xContext->getServiceManager()->createInstanceWithContext( + "com.sun.star.awt.PopupMenu", xContext ), css::uno::UNO_QUERY ); + + if ( xPopupController.is() && xPopupMenu.is() ) { - bRet = true; + xPopupController->setPopupMenu( xPopupMenu ); + + SwRect aToFill; + m_pWrtShell->GetSmartTagRect( rPt, aToFill ); m_pWrtShell->SttSelect(); - SwSmartTagPopup aPopup( this, aSmartTagTypes, aStringKeyMaps, xRange ); - aPopup.Execute( aToFill.SVRect(), m_pEditWin ); + + if ( aToFill.HasArea() ) + xPopupMenu->execute( m_pEditWin->GetComponentInterface(), + VCLUnoHelper::ConvertToAWTRect( m_pEditWin->LogicToPixel( aToFill.SVRect() ) ), css::awt::PopupMenuDirection::EXECUTE_DOWN ); } m_pWrtShell->Pop( false ); m_pWrtShell->LockView( bOldViewLock ); - - return bRet; } class SwFieldDialog : public FloatingWindow |