summaryrefslogtreecommitdiff
path: root/sw/source/uibase
diff options
context:
space:
mode:
authorMaxim Monastirsky <momonasmon@gmail.com>2015-11-25 17:33:45 +0200
committerMaxim Monastirsky <momonasmon@gmail.com>2015-11-26 08:19:23 +0000
commitff35d252ff247c55c1004cce6676af8f881a2e68 (patch)
tree70ba1c6055b0689132e230533236d9553baf4f64 /sw/source/uibase
parent8d6136206f26dbee773ffaea18a0f37c17e55024 (diff)
tdf#93837 Add UNO-based SmartTag menu controller
... and use it for the standalone context menu. The sfx2 controller (SvxSmartTagsControl) is still used for the submenu variation, and is due to be removed after the new context menu implementation is in place. Change-Id: I2f889428eb777149f43d74cf3d081e19ab0ebb4a Reviewed-on: https://gerrit.libreoffice.org/20169 Reviewed-by: Maxim Monastirsky <momonasmon@gmail.com> Tested-by: Maxim Monastirsky <momonasmon@gmail.com>
Diffstat (limited to 'sw/source/uibase')
-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
6 files changed, 26 insertions, 327 deletions
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