diff options
-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 |