diff options
Diffstat (limited to 'vcl/inc/jsdialog/jsdialogbuilder.hxx')
-rw-r--r-- | vcl/inc/jsdialog/jsdialogbuilder.hxx | 61 |
1 files changed, 58 insertions, 3 deletions
diff --git a/vcl/inc/jsdialog/jsdialogbuilder.hxx b/vcl/inc/jsdialog/jsdialogbuilder.hxx index c228967eb0f5..13e9db2a178e 100644 --- a/vcl/inc/jsdialog/jsdialogbuilder.hxx +++ b/vcl/inc/jsdialog/jsdialogbuilder.hxx @@ -28,6 +28,7 @@ #include <boost/property_tree/ptree_fwd.hpp> #include <deque> +#include <unordered_map> class ToolBox; class SfxViewShell; @@ -35,6 +36,7 @@ class VclMultiLineEdit; class IconView; typedef std::map<OString, weld::Widget*> WidgetMap; +typedef std::unordered_map<std::string, OUString> ActionDataMap; namespace jsdialog { @@ -42,10 +44,51 @@ enum MessageType { FullUpdate, WidgetUpdate, - Close + Close, + Action }; } +class JSDialogMessageInfo +{ +public: + jsdialog::MessageType m_eType; + VclPtr<vcl::Window> m_pWindow; + std::unique_ptr<ActionDataMap> m_pData; + +private: + void copy(const JSDialogMessageInfo& rInfo) + { + this->m_eType = rInfo.m_eType; + this->m_pWindow = rInfo.m_pWindow; + if (rInfo.m_pData) + { + std::unique_ptr<ActionDataMap> pData(new ActionDataMap(*rInfo.m_pData)); + this->m_pData = std::move(pData); + } + } + +public: + JSDialogMessageInfo(jsdialog::MessageType eType, VclPtr<vcl::Window> pWindow, + std::unique_ptr<ActionDataMap> pData) + : m_eType(eType) + , m_pWindow(pWindow) + , m_pData(std::move(pData)) + { + } + + JSDialogMessageInfo(const JSDialogMessageInfo& rInfo) { copy(rInfo); } + + JSDialogMessageInfo& operator=(JSDialogMessageInfo aInfo) + { + if (this == &aInfo) + return *this; + + copy(aInfo); + return *this; + } +}; + class JSDialogNotifyIdle : public Idle { // used to send message @@ -56,7 +99,7 @@ class JSDialogNotifyIdle : public Idle std::string m_LastNotificationMessage; bool m_bForce; - std::deque<std::pair<jsdialog::MessageType, VclPtr<vcl::Window>>> m_aMessageQueue; + std::deque<JSDialogMessageInfo> m_aMessageQueue; public: JSDialogNotifyIdle(VclPtr<vcl::Window> aNotifierWindow, VclPtr<vcl::Window> aContentWindow, @@ -66,13 +109,16 @@ public: void clearQueue(); void forceUpdate(); - void sendMessage(jsdialog::MessageType eType, VclPtr<vcl::Window> pWindow); + void sendMessage(jsdialog::MessageType eType, VclPtr<vcl::Window> pWindow, + std::unique_ptr<ActionDataMap> pData = nullptr); private: void send(const boost::property_tree::ptree& rTree); boost::property_tree::ptree generateFullUpdate() const; boost::property_tree::ptree generateWidgetUpdate(VclPtr<vcl::Window> pWindow) const; boost::property_tree::ptree generateCloseMessage() const; + boost::property_tree::ptree generateActionMessage(VclPtr<vcl::Window> pWindow, + std::unique_ptr<ActionDataMap> pData) const; }; class VCL_DLLPUBLIC JSDialogSender @@ -92,6 +138,7 @@ public: virtual void sendFullUpdate(bool bForce = false); void sendClose(); virtual void sendUpdate(VclPtr<vcl::Window> pWindow, bool bForce = false); + virtual void sendAction(VclPtr<vcl::Window> pWindow, std::unique_ptr<ActionDataMap> pData); void flush() { mpIdleNotify->Invoke(); } protected: @@ -234,6 +281,8 @@ public: virtual void sendUpdate(bool bForce = false) = 0; virtual void sendFullUpdate(bool bForce = false) = 0; + + virtual void sendAction(std::unique_ptr<ActionDataMap> pData) = 0; }; template <class BaseInstanceClass, class VclClass> @@ -323,6 +372,12 @@ public: if ((!m_bIsFreezed || bForce) && m_pSender) m_pSender->sendFullUpdate(bForce); } + + virtual void sendAction(std::unique_ptr<ActionDataMap> pData) override + { + if (!m_bIsFreezed && m_pSender && pData) + m_pSender->sendAction(BaseInstanceClass::m_xWidget, std::move(pData)); + } }; class VCL_DLLPUBLIC JSDialog : public JSWidget<SalInstanceDialog, ::Dialog> |