[Libreoffice-commits] core.git: include/sfx2 include/svx officecfg/registry sfx2/sdi svx/Library_svx.mk svx/source svx/util sw/AllLangResTarget_sw.mk sw/inc sw/Library_sw.mk sw/source

Maxim Monastirsky momonasmon at gmail.com
Thu Nov 26 00:19:57 PST 2015


 include/sfx2/sfxsids.hrc                                            |    1 
 include/svx/svxids.hrc                                              |    2 
 officecfg/registry/data/org/openoffice/Office/UI/Controller.xcu     |   11 
 officecfg/registry/data/org/openoffice/Office/UI/WriterCommands.xcu |    5 
 sfx2/sdi/sfx.sdi                                                    |    2 
 svx/Library_svx.mk                                                  |    1 
 svx/source/items/SmartTagItem.cxx                                   |   16 
 svx/source/mnuctrls/smarttagmenu.cxx                                |  246 ++++++++++
 svx/util/svx.component                                              |    4 
 sw/AllLangResTarget_sw.mk                                           |    1 
 sw/Library_sw.mk                                                    |    1 
 sw/inc/crsrsh.hxx                                                   |    8 
 sw/inc/rcid.hrc                                                     |    5 
 sw/inc/view.hxx                                                     |    2 
 sw/source/core/crsr/crsrsh.cxx                                      |   11 
 sw/source/uibase/inc/stmenu.hxx                                     |   72 --
 sw/source/uibase/smartmenu/stmenu.cxx                               |  167 ------
 sw/source/uibase/smartmenu/stmenu.hrc                               |   33 -
 sw/source/uibase/smartmenu/stmenu.src                               |   37 -
 sw/source/uibase/uiview/view.cxx                                    |    2 
 sw/source/uibase/uiview/viewling.cxx                                |   42 +
 21 files changed, 314 insertions(+), 355 deletions(-)

New commits:
commit ff35d252ff247c55c1004cce6676af8f881a2e68
Author: Maxim Monastirsky <momonasmon at gmail.com>
Date:   Wed Nov 25 17:33:45 2015 +0200

    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 at gmail.com>
    Tested-by: Maxim Monastirsky <momonasmon at gmail.com>

diff --git a/include/sfx2/sfxsids.hrc b/include/sfx2/sfxsids.hrc
index 4ba4679..081b69c 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 1ec7daa..8fe69e1 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 23b95fe..977d669 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 1ad103d..d68d4cc 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 f151bc7..92266bc 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 c30276e..90cfe49 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 565174e..cb9e351 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 0000000..16b0f02
--- /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 0cff72e..3f0e38e 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 c95c16a..ef8d7ea 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 b4af6e5..789a777 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 d53a610..13d8c0c 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 0af4762..f809588 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 a757d79..bfb7b3d 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 a3375be..22afa51 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 6c60738..0000000
--- 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 42751cf..0000000
--- 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 315fb35..0000000
--- 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 326c13b..0000000
--- 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 0cd0cc3..27d48f5 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 4b4c2a2..f72e370 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


More information about the Libreoffice-commits mailing list