diff options
author | Szymon Kłos <szymon.klos@collabora.com> | 2022-04-14 12:09:38 +0200 |
---|---|---|
committer | Szymon Kłos <szymon.klos@collabora.com> | 2022-05-01 20:18:52 +0200 |
commit | 7df8334b0078b4e8f8fbf5c55d9fdc54398b57b7 (patch) | |
tree | b481558d291aec0ccb67eec7e991b5116e4e1f77 /vcl | |
parent | 3dd8b19b814e959d00235df8bc08f9892f45dd87 (diff) |
jsdialog: handle formulabar as textinput
mostly boilerplate code
jsdialog changes:
- added force parameter to sendAction
- added support for key press/release and command events
- moved ActionDataMap to jsdialog namespace for sharing
formulabar changes:
- added calls to send jsdialog messages with formula
- added cursor moving support - on command event
Change-Id: I714715133901941ba0758655e2d5907a3bae79f2
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/133010
Reviewed-by: Mert Tumer <mert.tumer@collabora.com>
Tested-by: Szymon Kłos <szymon.klos@collabora.com>
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/133652
Tested-by: Jenkins
Reviewed-by: Szymon Kłos <szymon.klos@collabora.com>
Diffstat (limited to 'vcl')
-rw-r--r-- | vcl/inc/jsdialog/jsdialogbuilder.hxx | 30 | ||||
-rw-r--r-- | vcl/jsdialog/executor.cxx | 42 | ||||
-rw-r--r-- | vcl/jsdialog/jsdialogbuilder.cxx | 19 |
3 files changed, 71 insertions, 20 deletions
diff --git a/vcl/inc/jsdialog/jsdialogbuilder.hxx b/vcl/inc/jsdialog/jsdialogbuilder.hxx index 08b16124a7e2..0b0289240bf6 100644 --- a/vcl/inc/jsdialog/jsdialogbuilder.hxx +++ b/vcl/inc/jsdialog/jsdialogbuilder.hxx @@ -28,7 +28,6 @@ #include <deque> #include <list> #include <mutex> -#include <unordered_map> #define ACTION_TYPE "action_type" #define PARENT_ID "parent_id" @@ -42,7 +41,6 @@ class SvTabListBox; class IconView; typedef std::map<OString, weld::Widget*> WidgetMap; -typedef std::unordered_map<std::string, OUString> ActionDataMap; namespace jsdialog { @@ -63,7 +61,7 @@ class JSDialogMessageInfo public: jsdialog::MessageType m_eType; VclPtr<vcl::Window> m_pWindow; - std::unique_ptr<ActionDataMap> m_pData; + std::unique_ptr<jsdialog::ActionDataMap> m_pData; private: void copy(const JSDialogMessageInfo& rInfo) @@ -72,14 +70,15 @@ private: this->m_pWindow = rInfo.m_pWindow; if (rInfo.m_pData) { - std::unique_ptr<ActionDataMap> pData(new ActionDataMap(*rInfo.m_pData)); + std::unique_ptr<jsdialog::ActionDataMap> pData( + new jsdialog::ActionDataMap(*rInfo.m_pData)); this->m_pData = std::move(pData); } } public: JSDialogMessageInfo(jsdialog::MessageType eType, VclPtr<vcl::Window> pWindow, - std::unique_ptr<ActionDataMap> pData) + std::unique_ptr<jsdialog::ActionDataMap> pData) : m_eType(eType) , m_pWindow(pWindow) , m_pData(std::move(pData)) @@ -120,7 +119,7 @@ public: void clearQueue(); void forceUpdate(); void sendMessage(jsdialog::MessageType eType, VclPtr<vcl::Window> pWindow, - std::unique_ptr<ActionDataMap> pData = nullptr); + std::unique_ptr<jsdialog::ActionDataMap> pData = nullptr); private: void send(tools::JsonWriter& aJsonWriter); @@ -128,7 +127,8 @@ private: std::unique_ptr<tools::JsonWriter> generateWidgetUpdate(VclPtr<vcl::Window> pWindow) const; std::unique_ptr<tools::JsonWriter> generateCloseMessage() const; std::unique_ptr<tools::JsonWriter> - generateActionMessage(VclPtr<vcl::Window> pWindow, std::unique_ptr<ActionDataMap> pData) const; + generateActionMessage(VclPtr<vcl::Window> pWindow, + std::unique_ptr<jsdialog::ActionDataMap> pData) const; std::unique_ptr<tools::JsonWriter> generatePopupMessage(VclPtr<vcl::Window> pWindow, OUString sParentId, OUString sCloseId) const; std::unique_ptr<tools::JsonWriter> generateClosePopupMessage(OUString sWindowId) const; @@ -158,7 +158,8 @@ public: virtual void sendFullUpdate(bool bForce = false); void sendClose(); void sendUpdate(VclPtr<vcl::Window> pWindow, bool bForce = false); - virtual void sendAction(VclPtr<vcl::Window> pWindow, std::unique_ptr<ActionDataMap> pData); + virtual void sendAction(VclPtr<vcl::Window> pWindow, + std::unique_ptr<jsdialog::ActionDataMap> pData); virtual void sendPopup(VclPtr<vcl::Window> pWindow, OUString sParentId, OUString sCloseId); virtual void sendClosePopup(vcl::LOKWindowId nWindowId); void flush() { mpIdleNotify->Invoke(); } @@ -221,6 +222,9 @@ class JSInstanceBuilder final : public SalInstanceBuilder, public JSDialogSender const OString& rWidget, StringMap& rData); friend VCL_DLLPUBLIC void jsdialog::SendFullUpdate(const std::string& nWindowId, const OString& rWidget); + friend VCL_DLLPUBLIC void jsdialog::SendAction(const std::string& nWindowId, + const OString& rWidget, + std::unique_ptr<jsdialog::ActionDataMap> pData); static std::map<std::string, WidgetMap>& GetLOKWeldWidgetsMap(); static void InsertWindowToMap(const std::string& nWindowId); @@ -317,7 +321,7 @@ public: virtual void sendFullUpdate(bool bForce = false) = 0; - virtual void sendAction(std::unique_ptr<ActionDataMap> pData) = 0; + virtual void sendAction(std::unique_ptr<jsdialog::ActionDataMap> pData) = 0; virtual void sendPopup(vcl::Window* pPopup, OUString sParentId, OUString sCloseId) = 0; @@ -358,7 +362,8 @@ public: BaseInstanceClass::show(); if (!bWasVisible) { - std::unique_ptr<ActionDataMap> pMap = std::make_unique<ActionDataMap>(); + std::unique_ptr<jsdialog::ActionDataMap> pMap + = std::make_unique<jsdialog::ActionDataMap>(); (*pMap)[ACTION_TYPE] = "show"; sendAction(std::move(pMap)); } @@ -370,7 +375,8 @@ public: BaseInstanceClass::hide(); if (bWasVisible) { - std::unique_ptr<ActionDataMap> pMap = std::make_unique<ActionDataMap>(); + std::unique_ptr<jsdialog::ActionDataMap> pMap + = std::make_unique<jsdialog::ActionDataMap>(); (*pMap)[ACTION_TYPE] = "hide"; sendAction(std::move(pMap)); } @@ -424,7 +430,7 @@ public: m_pSender->sendFullUpdate(bForce); } - virtual void sendAction(std::unique_ptr<ActionDataMap> pData) override + virtual void sendAction(std::unique_ptr<jsdialog::ActionDataMap> pData) override { if (!m_bIsFreezed && m_pSender && pData) m_pSender->sendAction(BaseInstanceClass::m_xWidget, std::move(pData)); diff --git a/vcl/jsdialog/executor.cxx b/vcl/jsdialog/executor.cxx index 409c58ff2d49..4a75f2a99f71 100644 --- a/vcl/jsdialog/executor.cxx +++ b/vcl/jsdialog/executor.cxx @@ -41,6 +41,14 @@ void SendFullUpdate(const std::string& nWindowId, const OString& rWidget) pJSWidget->sendFullUpdate(); } +void SendAction(const std::string& nWindowId, const OString& rWidget, + std::unique_ptr<ActionDataMap> pData) +{ + weld::Widget* pWidget = JSInstanceBuilder::FindWeldWidgetsMap(nWindowId, rWidget); + if (auto pJSWidget = dynamic_cast<BaseJSWidget*>(pWidget)) + pJSWidget->sendAction(std::move(pData)); +} + bool ExecuteAction(const std::string& nWindowId, const OString& rWidget, StringMap& rData) { weld::Widget* pWidget = JSInstanceBuilder::FindWeldWidgetsMap(nWindowId, rWidget); @@ -192,6 +200,40 @@ bool ExecuteAction(const std::string& nWindowId, const OString& rWidget, StringM LOKTrigger::trigger_click(*pArea, Point(10, 10)); return true; } + else if (sAction == "keypress") + { + LOKTrigger::trigger_key_press( + *pArea, + KeyEvent(rData["data"].toUInt32(), vcl::KeyCode(rData["data"].toUInt32()))); + LOKTrigger::trigger_key_release( + *pArea, + KeyEvent(rData["data"].toUInt32(), vcl::KeyCode(rData["data"].toUInt32()))); + return true; + } + else if (sAction == "textselection") + { + // start;end + int nSeparatorPos = rData["data"].indexOf(';'); + if (nSeparatorPos <= 0) + return true; + + std::u16string_view aStartPos = rData["data"].subView(0, nSeparatorPos); + std::u16string_view aEndPos = rData["data"].subView(nSeparatorPos + 1); + + if (aStartPos.empty() || aEndPos.empty()) + return true; + + int nStart = std::atoi( + OUStringToOString(aStartPos.data(), RTL_TEXTENCODING_ASCII_US).getStr()); + int nEnd = std::atoi( + OUStringToOString(aEndPos.data(), RTL_TEXTENCODING_ASCII_US).getStr()); + + Point aPos(nStart, nEnd); + CommandEvent aCEvt(aPos, CommandEventId::CursorPos); + LOKTrigger::command(*pArea, aCEvt); + + return true; + } } } else if (sControlType == "spinfield") diff --git a/vcl/jsdialog/jsdialogbuilder.cxx b/vcl/jsdialog/jsdialogbuilder.cxx index f89d0ca0fc13..b1ca111a07f7 100644 --- a/vcl/jsdialog/jsdialogbuilder.cxx +++ b/vcl/jsdialog/jsdialogbuilder.cxx @@ -88,7 +88,7 @@ void JSDialogNotifyIdle::send(tools::JsonWriter& aJsonWriter) namespace { -OUString extractActionType(const ActionDataMap& rData) +OUString extractActionType(const jsdialog::ActionDataMap& rData) { auto it = rData.find(ACTION_TYPE); if (it != rData.end()) @@ -98,7 +98,7 @@ OUString extractActionType(const ActionDataMap& rData) }; void JSDialogNotifyIdle::sendMessage(jsdialog::MessageType eType, VclPtr<vcl::Window> pWindow, - std::unique_ptr<ActionDataMap> pData) + std::unique_ptr<jsdialog::ActionDataMap> pData) { std::scoped_lock aGuard(m_aQueueMutex); @@ -172,7 +172,7 @@ std::unique_ptr<tools::JsonWriter> JSDialogNotifyIdle::generateCloseMessage() co std::unique_ptr<tools::JsonWriter> JSDialogNotifyIdle::generateActionMessage(VclPtr<vcl::Window> pWindow, - std::unique_ptr<ActionDataMap> pData) const + std::unique_ptr<jsdialog::ActionDataMap> pData) const { std::unique_ptr<tools::JsonWriter> aJsonWriter(new tools::JsonWriter()); @@ -270,6 +270,9 @@ void JSDialogNotifyIdle::Invoke() { jsdialog::MessageType eType = rMessage.m_eType; + if (m_sTypeOfJSON == "formulabar" && eType != jsdialog::MessageType::Action) + continue; + switch (eType) { case jsdialog::MessageType::FullUpdate: @@ -344,7 +347,8 @@ void JSDialogSender::sendUpdate(VclPtr<vcl::Window> pWindow, bool bForce) mpIdleNotify->Start(); } -void JSDialogSender::sendAction(VclPtr<vcl::Window> pWindow, std::unique_ptr<ActionDataMap> pData) +void JSDialogSender::sendAction(VclPtr<vcl::Window> pWindow, + std::unique_ptr<jsdialog::ActionDataMap> pData) { if (!mpIdleNotify) return; @@ -358,7 +362,7 @@ void JSDialogSender::sendPopup(VclPtr<vcl::Window> pWindow, OUString sParentId, if (!mpIdleNotify) return; - std::unique_ptr<ActionDataMap> pData = std::make_unique<ActionDataMap>(); + std::unique_ptr<jsdialog::ActionDataMap> pData = std::make_unique<jsdialog::ActionDataMap>(); (*pData)[PARENT_ID] = sParentId; (*pData)[CLOSE_ID] = sCloseId; mpIdleNotify->sendMessage(jsdialog::MessageType::Popup, pWindow, std::move(pData)); @@ -370,7 +374,7 @@ void JSDialogSender::sendClosePopup(vcl::LOKWindowId nWindowId) if (!mpIdleNotify) return; - std::unique_ptr<ActionDataMap> pData = std::make_unique<ActionDataMap>(); + std::unique_ptr<jsdialog::ActionDataMap> pData = std::make_unique<jsdialog::ActionDataMap>(); (*pData)[WINDOW_ID] = OUString::number(nWindowId); mpIdleNotify->sendMessage(jsdialog::MessageType::PopupClose, nullptr, std::move(pData)); flush(); @@ -607,7 +611,6 @@ JSInstanceBuilder::JSInstanceBuilder(vcl::Window* pParent, const OUString& rUIRo } initializeSender(GetNotifierWindow(), GetContentWindow(), GetTypeOfJSON()); - sendFullUpdate(); } std::unique_ptr<JSInstanceBuilder> JSInstanceBuilder::CreateDialogBuilder(weld::Widget* pParent, @@ -1666,7 +1669,7 @@ void JSIconView::select(int pos) { SalInstanceIconView::select(pos); - std::unique_ptr<ActionDataMap> pMap = std::make_unique<ActionDataMap>(); + std::unique_ptr<jsdialog::ActionDataMap> pMap = std::make_unique<jsdialog::ActionDataMap>(); (*pMap)[ACTION_TYPE] = "select"; (*pMap)["position"] = OUString::number(pos); sendAction(std::move(pMap)); |