diff --git a/include/vcl/jsdialog/jsdialogbuilder.hxx b/include/vcl/jsdialog/jsdialogbuilder.hxx index 161d770d613a..62f6d11a2d7a 100644 --- a/include/vcl/jsdialog/jsdialogbuilder.hxx +++ b/include/vcl/jsdialog/jsdialogbuilder.hxx @@ -22,13 +22,24 @@ class ComboBox; typedef std::map WidgetMap; -class JSDialogSender +class JSDialogNotifyIdle : public Idle { - VclPtr m_aOwnedToplevel; + VclPtr m_aWindow; + std::string m_LastNotificationMessage; + +public: + JSDialogNotifyIdle(VclPtr aWindow); + + void Invoke() override; +}; + +class VCL_DLLPUBLIC JSDialogSender +{ + std::unique_ptr mpIdleNotify; public: JSDialogSender(VclPtr aOwnedToplevel) - : m_aOwnedToplevel(aOwnedToplevel) + : mpIdleNotify(new JSDialogNotifyIdle(aOwnedToplevel)) { } diff --git a/vcl/jsdialog/jsdialogbuilder.cxx b/vcl/jsdialog/jsdialogbuilder.cxx index 2ab05b40dd21..d7f35b7d6039 100644 --- a/vcl/jsdialog/jsdialogbuilder.cxx +++ b/vcl/jsdialog/jsdialogbuilder.cxx @@ -17,23 +17,44 @@ #include #include -void JSDialogSender::notifyDialogState() +JSDialogNotifyIdle::JSDialogNotifyIdle(VclPtr aWindow) + : Idle("JSDialog notify") + , m_aWindow(aWindow) + , m_LastNotificationMessage() { - if (!m_aOwnedToplevel) - return; + SetPriority(TaskPriority::POST_PAINT); +} - const vcl::ILibreOfficeKitNotifier* pNotifier = m_aOwnedToplevel->GetLOKNotifier(); - if (pNotifier) +void JSDialogNotifyIdle::Invoke() +{ + try { - std::stringstream aStream; - boost::property_tree::ptree aTree = m_aOwnedToplevel->DumpAsPropertyTree(); - aTree.put("id", m_aOwnedToplevel->GetLOKWindowId()); - boost::property_tree::write_json(aStream, aTree); - const std::string message = aStream.str(); - pNotifier->libreOfficeKitViewCallback(LOK_CALLBACK_JSDIALOG, message.c_str()); + if (!m_aWindow) + return; + + const vcl::ILibreOfficeKitNotifier* pNotifier = m_aWindow->GetLOKNotifier(); + if (pNotifier) + { + std::stringstream aStream; + boost::property_tree::ptree aTree = m_aWindow->DumpAsPropertyTree(); + aTree.put("id", m_aWindow->GetLOKWindowId()); + boost::property_tree::write_json(aStream, aTree); + const std::string message = aStream.str(); + if (message != m_LastNotificationMessage) + { + m_LastNotificationMessage = message; + pNotifier->libreOfficeKitViewCallback(LOK_CALLBACK_JSDIALOG, message.c_str()); + } + } + } + catch (boost::property_tree::json_parser::json_parser_error& rError) + { + SAL_WARN("vcl", rError.message()); } } +void JSDialogSender::notifyDialogState() { mpIdleNotify->Start(); } + JSInstanceBuilder::JSInstanceBuilder(weld::Widget* pParent, const OUString& rUIRoot, const OUString& rUIFile) : SalInstanceBuilder(dynamic_cast(pParent)