summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/sfx2/sfxsids.hrc1
-rw-r--r--include/svx/svxids.hrc2
-rw-r--r--officecfg/registry/data/org/openoffice/Office/UI/Controller.xcu11
-rw-r--r--officecfg/registry/data/org/openoffice/Office/UI/WriterCommands.xcu5
-rw-r--r--sfx2/sdi/sfx.sdi2
-rw-r--r--svx/Library_svx.mk1
-rw-r--r--svx/source/items/SmartTagItem.cxx16
-rw-r--r--svx/source/mnuctrls/smarttagmenu.cxx246
-rw-r--r--svx/util/svx.component4
-rw-r--r--sw/AllLangResTarget_sw.mk1
-rw-r--r--sw/Library_sw.mk1
-rw-r--r--sw/inc/crsrsh.hxx8
-rw-r--r--sw/inc/rcid.hrc5
-rw-r--r--sw/inc/view.hxx2
-rw-r--r--sw/source/core/crsr/crsrsh.cxx11
-rw-r--r--sw/source/uibase/inc/stmenu.hxx72
-rw-r--r--sw/source/uibase/smartmenu/stmenu.cxx167
-rw-r--r--sw/source/uibase/smartmenu/stmenu.hrc33
-rw-r--r--sw/source/uibase/smartmenu/stmenu.src37
-rw-r--r--sw/source/uibase/uiview/view.cxx2
-rw-r--r--sw/source/uibase/uiview/viewling.cxx42
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