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;