summaryrefslogtreecommitdiff
path: root/vcl
diff options
context:
space:
mode:
authorSzymon Kłos <szymon.klos@collabora.com>2022-04-14 12:09:38 +0200
committerSzymon Kłos <szymon.klos@collabora.com>2022-05-01 20:18:52 +0200
commit7df8334b0078b4e8f8fbf5c55d9fdc54398b57b7 (patch)
treeb481558d291aec0ccb67eec7e991b5116e4e1f77 /vcl
parent3dd8b19b814e959d00235df8bc08f9892f45dd87 (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.hxx30
-rw-r--r--vcl/jsdialog/executor.cxx42
-rw-r--r--vcl/jsdialog/jsdialogbuilder.cxx19
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));