sc/qa/uitest/calc_tests9/tdf80043.py |  243 +++++++++++++++++++++++++++++++++++
 sc/source/ui/view/cellsh.cxx         |    8 +
 sc/source/ui/view/tabvwshe.cxx       |   11 -
 3 files changed, 254 insertions(+), 8 deletions(-)

New commits:
commit 803c9a6f8d8681e1862e4132dbbc8cdb2f61b7b6
Author:     Andreas Heinisch <andreas.heini...@yahoo.de>
AuthorDate: Mon Mar 7 22:30:13 2022 +0100
Commit:     Andreas Heinisch <andreas.heini...@yahoo.de>
CommitDate: Thu Apr 7 11:31:28 2022 +0200

    tdf#80043 - Put selected text into hyperlink item
    
    If the user selects an entire cell by a single click, and inserts an URL
    via the hyperlink dialog, the entire content of the corresponding cell
    will be replaced instead of inserting a duplicate, or appending the URL.
    If the cell contains more than one URL or an URL including some
    additional text within the cell, the hyperlink dialog will only
    preselect the text field when opening. If this is not the case, it fill the 
URL field as well.
    
    Change-Id: I9a10c3f302a6cf91a4d9dfadfbe775075eb00fad
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/131156
    Tested-by: Jenkins
    Reviewed-by: Andreas Heinisch <andreas.heini...@yahoo.de>

diff --git a/sc/qa/uitest/calc_tests9/tdf80043.py 
b/sc/qa/uitest/calc_tests9/tdf80043.py
new file mode 100644
index 000000000000..eb99f0038871
--- /dev/null
+++ b/sc/qa/uitest/calc_tests9/tdf80043.py
@@ -0,0 +1,243 @@
+# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-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/.
+#
+
+from uitest.framework import UITestCase
+from libreoffice.uno.propertyvalue import mkPropertyValues
+from libreoffice.calc.document import get_cell_by_position
+from uitest.uihelper.calc import enter_text_to_cell
+from uitest.uihelper.common import get_state_as_dict, select_pos
+
+class tdf80043(UITestCase):
+    def test_tdf80043_empty_cell(self):
+        with self.ui_test.create_doc_in_start_center("calc") as document:
+            xCalcDoc = self.xUITest.getTopFocusWindow()
+            xGridWindow = xCalcDoc.getChild("grid_window")
+
+            # Select an empty cell and insert a hyperlink
+            xGridWindow.executeAction("SELECT", mkPropertyValues({"CELL": 
"A1"}))
+            with 
self.ui_test.execute_dialog_through_command(".uno:HyperlinkDialog") as xDialog:
+                xTab = xDialog.getChild("tabcontrol")
+                select_pos(xTab, "0")
+
+                # Both fields in the hyperlink dialog should be empty
+                xTarget = xDialog.getChild("target")
+                self.assertEqual(get_state_as_dict(xTarget)["Text"], "")
+                xIndication = xDialog.getChild("indication")
+                self.assertEqual(get_state_as_dict(xIndication)["Text"], "")
+
+                # Insert a sample hyperlink
+                xTarget.executeAction("TYPE", mkPropertyValues({"TEXT": 
"http://www.libreoffice.org/"}))
+                xIndication.executeAction("TYPE", mkPropertyValues({"TEXT": 
"LibreOffice"}))
+
+            # Move focus to ensure cell is not in edit mode
+            xGridWindow.executeAction("SELECT", mkPropertyValues({"CELL": 
"A2"}))
+            xGridWindow.executeAction("SELECT", mkPropertyValues({"CELL": 
"A1"}))
+
+            # Check contents of the cell
+            xCell = get_cell_by_position(document, 0, 0, 0)
+            self.assertEqual(xCell.getString(), "LibreOffice")
+            xTextFields = xCell.getTextFields()
+            self.assertEqual(xTextFields.getCount(), 1)
+            self.assertEqual(xTextFields.getByIndex(0).URL, 
"http://www.libreoffice.org/";)
+
+            # Reopen hyperlink dialog and check the target and the indication 
of the hyperlink
+            with 
self.ui_test.execute_dialog_through_command(".uno:HyperlinkDialog", 
close_button="cancel") as xDialog:
+                xTab = xDialog.getChild("tabcontrol")
+                select_pos(xTab, "0")
+
+                # Text should contain the text of the cell
+                xTarget = xDialog.getChild("target")
+                self.assertEqual(get_state_as_dict(xTarget)["Text"], 
"http://www.libreoffice.org/";)
+                xIndication = xDialog.getChild("indication")
+                self.assertEqual(get_state_as_dict(xIndication)["Text"], 
"LibreOffice")
+
+    def test_tdf80043_text_cell(self):
+        with self.ui_test.create_doc_in_start_center("calc") as document:
+            xCalcDoc = self.xUITest.getTopFocusWindow()
+            xGridWindow = xCalcDoc.getChild("grid_window")
+
+            # Select a cell including a text and insert a hyperlink
+            enter_text_to_cell(xGridWindow, "A1", "LibreOffice")
+            # Move focus to ensure cell is not in edit mode
+            xGridWindow.executeAction("SELECT", mkPropertyValues({"CELL": 
"A2"}))
+            xGridWindow.executeAction("SELECT", mkPropertyValues({"CELL": 
"A1"}))
+            with 
self.ui_test.execute_dialog_through_command(".uno:HyperlinkDialog") as xDialog:
+                xTab = xDialog.getChild("tabcontrol")
+                select_pos(xTab, "0")
+
+                # Text should contain the text of the cell
+                xTarget = xDialog.getChild("target")
+                self.assertEqual(get_state_as_dict(xTarget)["Text"], "")
+                xIndication = xDialog.getChild("indication")
+                self.assertEqual(get_state_as_dict(xIndication)["Text"], 
"LibreOffice")
+
+                # Insert a sample hyperlink
+                xTarget.executeAction("TYPE", mkPropertyValues({"TEXT": 
"http://www.libreoffice.org/"}))
+
+            # Move focus to ensure cell is not in edit mode
+            xGridWindow.executeAction("SELECT", mkPropertyValues({"CELL": 
"A2"}))
+            xGridWindow.executeAction("SELECT", mkPropertyValues({"CELL": 
"A1"}))
+
+            # Check contents of the cell
+            xCell = get_cell_by_position(document, 0, 0, 0)
+            self.assertEqual(xCell.getString(), "LibreOffice")
+            xTextFields = xCell.getTextFields()
+            self.assertEqual(xTextFields.getCount(), 1)
+            self.assertEqual(xTextFields.getByIndex(0).URL, 
"http://www.libreoffice.org/";)
+
+            # Reopen hyperlink dialog and check the target and the indication 
of the hyperlink
+            with 
self.ui_test.execute_dialog_through_command(".uno:HyperlinkDialog", 
close_button="cancel") as xDialog:
+                xTab = xDialog.getChild("tabcontrol")
+                select_pos(xTab, "0")
+
+                # Text should contain the text of the cell
+                xTarget = xDialog.getChild("target")
+                self.assertEqual(get_state_as_dict(xTarget)["Text"], 
"http://www.libreoffice.org/";)
+                xIndication = xDialog.getChild("indication")
+                self.assertEqual(get_state_as_dict(xIndication)["Text"], 
"LibreOffice")
+
+    def test_tdf80043_link_text_cell(self):
+        with self.ui_test.create_doc_in_start_center("calc") as document:
+            xCalcDoc = self.xUITest.getTopFocusWindow()
+            xGridWindow = xCalcDoc.getChild("grid_window")
+
+            # Select a cell including a text and insert a hyperlink
+            enter_text_to_cell(xGridWindow, "A1", "LibreOffice")
+            # Move focus to ensure cell is not in edit mode
+            xGridWindow.executeAction("SELECT", mkPropertyValues({"CELL": 
"A2"}))
+            xGridWindow.executeAction("SELECT", mkPropertyValues({"CELL": 
"A1"}))
+            with 
self.ui_test.execute_dialog_through_command(".uno:HyperlinkDialog") as xDialog:
+                xTab = xDialog.getChild("tabcontrol")
+                select_pos(xTab, "0")
+
+                # Text should contain the text of the cell
+                xTarget = xDialog.getChild("target")
+                self.assertEqual(get_state_as_dict(xTarget)["Text"], "")
+                xIndication = xDialog.getChild("indication")
+                self.assertEqual(get_state_as_dict(xIndication)["Text"], 
"LibreOffice")
+
+                # Insert a sample hyperlink
+                xTarget.executeAction("TYPE", mkPropertyValues({"TEXT": 
"http://www.libreoffice.org/"}))
+
+            # Move focus to ensure cell is not in edit mode
+            xGridWindow.executeAction("SELECT", mkPropertyValues({"CELL": 
"A2"}))
+            xGridWindow.executeAction("SELECT", mkPropertyValues({"CELL": 
"A1"}))
+
+            # Insert an additional text without a hyperlink in the cell 
including a hyperlink
+            self.xUITest.executeCommand(".uno:SetInputMode")
+            enter_text_to_cell(xGridWindow, "A1", " Document Foundation")
+
+            # Check contents of the cell
+            xCell = get_cell_by_position(document, 0, 0, 0)
+            self.assertEqual(xCell.getString(), "LibreOffice Document 
Foundation")
+            xTextFields = xCell.getTextFields()
+            self.assertEqual(xTextFields.getCount(), 1)
+            self.assertEqual(xTextFields.getByIndex(0).URL, 
"http://www.libreoffice.org/";)
+
+            # Move focus to ensure cell is not in edit mode
+            xGridWindow.executeAction("SELECT", mkPropertyValues({"CELL": 
"A2"}))
+            xGridWindow.executeAction("SELECT", mkPropertyValues({"CELL": 
"A1"}))
+
+            # Reopen hyperlink dialog and check the target and the indication 
of the hyperlink
+            with 
self.ui_test.execute_dialog_through_command(".uno:HyperlinkDialog") as xDialog:
+                xTab = xDialog.getChild("tabcontrol")
+                select_pos(xTab, "0")
+
+                # Text should contain the text of the cell
+                xTarget = xDialog.getChild("target")
+                self.assertEqual(get_state_as_dict(xTarget)["Text"], "")
+                xTarget.executeAction("TYPE", mkPropertyValues({"TEXT": 
"https://www.documentfoundation.org/"}))
+                xIndication = xDialog.getChild("indication")
+                self.assertEqual(get_state_as_dict(xIndication)["Text"], 
"LibreOffice Document Foundation")
+
+            # Check contents of the cell - move focus, otherwise text fields 
won't be updated
+            xGridWindow.executeAction("SELECT", mkPropertyValues({"CELL": 
"A2"}))
+            xCell = get_cell_by_position(document, 0, 0, 0)
+            self.assertEqual(xCell.getString(), "LibreOffice Document 
Foundation")
+            xTextFields = xCell.getTextFields()
+            self.assertEqual(xTextFields.getCount(), 1)
+            self.assertEqual(xTextFields.getByIndex(0).URL, 
"https://www.documentfoundation.org/";)
+
+    def test_tdf80043_link_link_cell(self):
+        with self.ui_test.create_doc_in_start_center("calc") as document:
+            xCalcDoc = self.xUITest.getTopFocusWindow()
+            xGridWindow = xCalcDoc.getChild("grid_window")
+
+            # Select a cell including a text and insert a hyperlink
+            enter_text_to_cell(xGridWindow, "A1", "Libre")
+            # Move focus to ensure cell is not in edit mode
+            xGridWindow.executeAction("SELECT", mkPropertyValues({"CELL": 
"A2"}))
+            xGridWindow.executeAction("SELECT", mkPropertyValues({"CELL": 
"A1"}))
+            with 
self.ui_test.execute_dialog_through_command(".uno:HyperlinkDialog") as xDialog:
+                xTab = xDialog.getChild("tabcontrol")
+                select_pos(xTab, "0")
+
+                # Text should contain the text of the cell
+                xTarget = xDialog.getChild("target")
+                self.assertEqual(get_state_as_dict(xTarget)["Text"], "")
+                xIndication = xDialog.getChild("indication")
+                self.assertEqual(get_state_as_dict(xIndication)["Text"], 
"Libre")
+
+                # Insert a sample hyperlink
+                xTarget.executeAction("TYPE", mkPropertyValues({"TEXT": 
"http://www.libreoffice.org/"}))
+
+            # Move focus to ensure cell is not in edit mode
+            xGridWindow.executeAction("SELECT", mkPropertyValues({"CELL": 
"A2"}))
+            xGridWindow.executeAction("SELECT", mkPropertyValues({"CELL": 
"A1"}))
+
+            # Insert an additional hyperlink in the cell
+            self.xUITest.executeCommand(".uno:SetInputMode")
+            xGridWindow.executeAction("TYPE", mkPropertyValues({"KEYCODE": 
"Office Document Foundation"}))
+            xGridWindow.executeAction("TYPE", mkPropertyValues({"KEYCODE": 
"SHIFT+CTRL+LEFT"}))
+            with 
self.ui_test.execute_dialog_through_command(".uno:HyperlinkDialog") as xDialog:
+                xTab = xDialog.getChild("tabcontrol")
+                select_pos(xTab, "0")
+
+                # Text should contain the text of the cell
+                xTarget = xDialog.getChild("target")
+                self.assertEqual(get_state_as_dict(xTarget)["Text"], "")
+                xIndication = xDialog.getChild("indication")
+                self.assertEqual(get_state_as_dict(xIndication)["Text"], 
"Foundation")
+
+                # Insert a sample hyperlink
+                xTarget.executeAction("TYPE", mkPropertyValues({"TEXT": 
"https://www.documentfoundation.org/"}))
+
+            # Check contents of the cell
+            xGridWindow.executeAction("SELECT", mkPropertyValues({"CELL": 
"A2"}))
+            xCell = get_cell_by_position(document, 0, 0, 0)
+            self.assertEqual(xCell.getString(), "LibreOffice Document 
Foundation")
+            xTextFields = xCell.getTextFields()
+            self.assertEqual(xTextFields.getCount(), 2)
+            self.assertEqual(xTextFields.getByIndex(0).URL, 
"http://www.libreoffice.org/";)
+            self.assertEqual(xTextFields.getByIndex(1).URL, 
"https://www.documentfoundation.org/";)
+
+            # Move focus to ensure cell is not in edit mode
+            xGridWindow.executeAction("SELECT", mkPropertyValues({"CELL": 
"A2"}))
+            xGridWindow.executeAction("SELECT", mkPropertyValues({"CELL": 
"A1"}))
+
+            # Reopen hyperlink dialog and check the target and the indication 
of the hyperlink
+            with 
self.ui_test.execute_dialog_through_command(".uno:HyperlinkDialog") as xDialog:
+                xTab = xDialog.getChild("tabcontrol")
+                select_pos(xTab, "0")
+
+                xTarget = xDialog.getChild("target")
+                self.assertEqual(get_state_as_dict(xTarget)["Text"], "")
+                xTarget.executeAction("TYPE", mkPropertyValues({"TEXT": 
"https://wiki.documentfoundation.org/Main_Page"}))
+                xIndication = xDialog.getChild("indication")
+                self.assertEqual(get_state_as_dict(xIndication)["Text"], 
"LibreOffice Document Foundation")
+
+            # Check contents of the cell - move focus, otherwise text fields 
won't be updated
+            xGridWindow.executeAction("SELECT", mkPropertyValues({"CELL": 
"A2"}))
+            xCell = get_cell_by_position(document, 0, 0, 0)
+            self.assertEqual(xCell.getString(), "LibreOffice Document 
Foundation")
+            xTextFields = xCell.getTextFields()
+            self.assertEqual(xTextFields.getCount(), 1)
+            self.assertEqual(xTextFields.getByIndex(0).URL, 
"https://wiki.documentfoundation.org/Main_Page";)
+
+# vim: set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/sc/source/ui/view/cellsh.cxx b/sc/source/ui/view/cellsh.cxx
index c3e7aab1d1dc..0824054c676b 100644
--- a/sc/source/ui/view/cellsh.cxx
+++ b/sc/source/ui/view/cellsh.cxx
@@ -667,7 +667,13 @@ void ScCellShell::GetHLinkState( SfxItemSet& rSet )
     SvxHyperlinkItem aHLinkItem;
     if ( !GetViewData().GetView()->HasBookmarkAtCursor( &aHLinkItem ) )
     {
-        //! put selected text into item?
+        // tdf#80043 - put selected text into item
+        ScViewData& rData       = GetViewData();
+        ScDocument& rDoc        = rData.GetDocument();
+        SCCOL       nPosX       = rData.GetCurX();
+        SCROW       nPosY       = rData.GetCurY();
+        SCTAB       nTab        = rData.GetTabNo();
+        aHLinkItem.SetName(rDoc.GetString(nPosX, nPosY, nTab));
     }
 
     rSet.Put(aHLinkItem);
diff --git a/sc/source/ui/view/tabvwshe.cxx b/sc/source/ui/view/tabvwshe.cxx
index da03923d46e2..fa3587dd70cc 100644
--- a/sc/source/ui/view/tabvwshe.cxx
+++ b/sc/source/ui/view/tabvwshe.cxx
@@ -212,13 +212,10 @@ void ScTabViewShell::InsertURLField( const OUString& 
rName, const OUString& rURL
     EditView*       pTableView  = pHdl->GetTableView();
     OSL_ENSURE( pTopView || pTableView, "No EditView" );
 
-    // Check if user selected a whole cell by single click,
-    // cell has content, and user didn't change the name/text
-    // of the link something different than the content via the hyperlink 
dialog.
-    // If true, assign the given hyperlink to the whole content
-    // instead of inserting a duplicate, or appending the url.
-    if (comphelper::LibreOfficeKit::isActive() && !bIsEditMode && !bSelectFirst
-            && pTableView && !sSeltext.isEmpty() && sSeltext == rName)
+    // Check if user selected a whole cell by single click, and cell has 
content.
+    // tdf#80043 - if true, replace the entire content of the selected cell 
instead of
+    // inserting a duplicate, or appending the url.
+    if (!bIsEditMode && !bSelectFirst && pTableView && !sSeltext.isEmpty())
     {
         nSelInd = sSeltext.getLength();
         bSelectFirst = true;

Reply via email to