sc/source/ui/app/inputwin.cxx |    9 ++++++--
 vcl/jsdialog/executor.cxx     |   47 +++++++++++++++++++++++++++++++++++++++---
 2 files changed, 51 insertions(+), 5 deletions(-)

New commits:
commit 62e9828f97ac76fb6717fd50828d5da8375297b2
Author:     Szymon Kłos <szymon.k...@collabora.com>
AuthorDate: Wed Jun 15 10:02:59 2022 +0200
Commit:     Szymon Kłos <szymon.k...@collabora.com>
CommitDate: Mon Jun 20 18:11:20 2022 +0200

    jsdialog: formulabar: handle multiline selection
    
    it uses format: "start;end;startPara;endPara"
    
    Change-Id: If3d36550f5e4a35fc04c72114c7719119b10da61
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/135866
    Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com>
    Reviewed-by: Mert Tumer <mert.tu...@collabora.com>

diff --git a/sc/source/ui/app/inputwin.cxx b/sc/source/ui/app/inputwin.cxx
index 07344e1c0a19..531d5c5d9a17 100644
--- a/sc/source/ui/app/inputwin.cxx
+++ b/sc/source/ui/app/inputwin.cxx
@@ -1724,9 +1724,14 @@ bool ScTextWnd::Command( const CommandEvent& rCEvt )
         if (!m_xEditView)
             return true;
 
+        // information about paragraph is in additional data
+        // information about position in a paragraph in a Mouse Pos
+        // see vcl/jsdialog/executor.cxx "textselection" event
+        const Point* pParaPoint = static_cast<const 
Point*>(rCEvt.GetEventData());
         Point aSelectionStartEnd = rCEvt.GetMousePosPixel();
-        m_xEditView->SetSelection(ESelection(0, aSelectionStartEnd.X(),
-                                                0, aSelectionStartEnd.Y()));
+        m_xEditView->SetSelection(
+            ESelection((pParaPoint ? pParaPoint->X() : 0), 
aSelectionStartEnd.X(),
+                       (pParaPoint ? pParaPoint->Y() : 0), 
aSelectionStartEnd.Y()));
 
         SC_MOD()->InputSelection( m_xEditView.get() );
 
diff --git a/vcl/jsdialog/executor.cxx b/vcl/jsdialog/executor.cxx
index 4e8324eb9379..2da2ab5b9608 100644
--- a/vcl/jsdialog/executor.cxx
+++ b/vcl/jsdialog/executor.cxx
@@ -216,13 +216,30 @@ bool ExecuteAction(const std::string& nWindowId, const 
OString& rWidget, StringM
                 }
                 else if (sAction == "textselection")
                 {
-                    // start;end
                     int nSeparatorPos = rData["data"].indexOf(';');
                     if (nSeparatorPos <= 0)
                         return true;
 
+                    int nSeparator2Pos = rData["data"].indexOf(';', 
nSeparatorPos + 1);
+                    int nSeparator3Pos = 0;
+
+                    if (nSeparator2Pos > 0)
+                    {
+                        // start;end;startPara;endPara
+                        nSeparator3Pos = rData["data"].indexOf(';', 
nSeparator2Pos + 1);
+                        if (nSeparator3Pos <= 0)
+                            return true;
+                    }
+                    else
+                    {
+                        // start;end
+                        nSeparator2Pos = 0;
+                        nSeparator3Pos = 0;
+                    }
+
                     std::u16string_view aStartPos = rData["data"].subView(0, 
nSeparatorPos);
-                    std::u16string_view aEndPos = 
rData["data"].subView(nSeparatorPos + 1);
+                    std::u16string_view aEndPos = rData["data"].subView(
+                        nSeparatorPos + 1, nSeparator2Pos - nSeparatorPos + 1);
 
                     if (aStartPos.empty() || aEndPos.empty())
                         return true;
@@ -231,9 +248,33 @@ bool ExecuteAction(const std::string& nWindowId, const 
OString& rWidget, StringM
                         OUStringToOString(aStartPos.data(), 
RTL_TEXTENCODING_ASCII_US).getStr());
                     int nEnd = std::atoi(
                         OUStringToOString(aEndPos.data(), 
RTL_TEXTENCODING_ASCII_US).getStr());
+                    int nStartPara = 0;
+                    int nEndPara = 0;
+
+                    // multiline case
+                    if (nSeparator2Pos && nSeparator3Pos)
+                    {
+                        std::u16string_view aStartPara = rData["data"].subView(
+                            nSeparator2Pos + 1, nSeparator3Pos - 
nSeparator2Pos + 1);
+                        std::u16string_view aEndPara = 
rData["data"].subView(nSeparator3Pos + 1);
+
+                        if (aStartPara.empty() || aEndPara.empty())
+                            return true;
+
+                        nStartPara = std::atoi(
+                            OUStringToOString(aStartPara.data(), 
RTL_TEXTENCODING_ASCII_US)
+                                .getStr());
+                        nEndPara = std::atoi(
+                            OUStringToOString(aEndPara.data(), 
RTL_TEXTENCODING_ASCII_US).getStr());
+                    }
+
+                    // pass information about paragraph number in the 
additional data
+                    // handled in sc/source/ui/app/inputwin.cxx
+                    Point* pParaPoint = new Point(nStartPara, nEndPara);
+                    const void* pCmdData = pParaPoint;
 
                     Point aPos(nStart, nEnd);
-                    CommandEvent aCEvt(aPos, CommandEventId::CursorPos);
+                    CommandEvent aCEvt(aPos, CommandEventId::CursorPos, false, 
pCmdData);
                     LOKTrigger::command(*pArea, aCEvt);
 
                     return true;

Reply via email to