summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPranav Kant <pranavk@collabora.co.uk>2017-12-01 13:54:45 +0530
committerJan Holesovsky <kendy@collabora.com>2017-12-04 13:03:07 +0100
commitc7b4877f1951a23be82208ee444405560e06799b (patch)
treef85a7d88badb80693cdc8909b3768016520ff805
parent65d1b6efa687179af6b09843f33ff2c02e2a8bf8 (diff)
lokdialog: Simplify; make the LOK dialog API more generic
Merge the dialog floating window callbacks and function calls into one. Unique window ids across vcl::Window is enough to distinguish between them. Floating windows don't have a LOK notifier as they are created in the vcl itself (so we can't access them from sfx2). Use the parent LOK notifier in that case (which would be a dialog). This API should also help in autopopup filter tunneling later. Change-Id: I63a2c97ffdd84695dc967e14c793089a7c50b41b
-rw-r--r--desktop/source/lib/init.cxx55
-rw-r--r--include/LibreOfficeKit/LibreOfficeKit.h3
-rw-r--r--include/LibreOfficeKit/LibreOfficeKit.hxx19
-rw-r--r--include/LibreOfficeKit/LibreOfficeKitEnums.h21
-rw-r--r--include/sfx2/lokhelper.hxx6
-rw-r--r--include/sfx2/viewsh.hxx1
-rw-r--r--include/vcl/IDialogRenderable.hxx2
-rw-r--r--include/vcl/dialog.hxx2
-rw-r--r--include/vcl/floatwin.hxx2
-rw-r--r--include/vcl/window.hxx1
-rw-r--r--libreofficekit/qa/gtktiledviewer/gtv-application-window.cxx45
-rw-r--r--libreofficekit/qa/gtktiledviewer/gtv-application-window.hxx4
-rw-r--r--libreofficekit/qa/gtktiledviewer/gtv-lok-dialog.cxx145
-rw-r--r--libreofficekit/qa/gtktiledviewer/gtv-lok-dialog.hxx6
-rw-r--r--libreofficekit/qa/gtktiledviewer/gtv-lokdocview-signal-handlers.cxx106
-rw-r--r--libreofficekit/qa/gtktiledviewer/gtv-lokdocview-signal-handlers.hxx3
-rw-r--r--libreofficekit/source/gtk/lokdocview.cxx55
-rw-r--r--sfx2/source/dialog/basedlgs.cxx3
-rw-r--r--sfx2/source/dialog/tabdlg.cxx1
-rw-r--r--sfx2/source/view/lokhelper.cxx20
-rw-r--r--sfx2/source/view/viewsh.cxx5
-rw-r--r--vcl/source/control/ctrl.cxx22
-rw-r--r--vcl/source/window/dialog.cxx12
-rw-r--r--vcl/source/window/floatwin.cxx39
-rw-r--r--vcl/source/window/window.cxx47
25 files changed, 229 insertions, 396 deletions
diff --git a/desktop/source/lib/init.cxx b/desktop/source/lib/init.cxx
index 98d3ac7c86a7..ef2d45dce173 100644
--- a/desktop/source/lib/init.cxx
+++ b/desktop/source/lib/init.cxx
@@ -637,8 +637,6 @@ static void doc_paintWindow(LibreOfficeKitDocument* pThis, unsigned nLOKWindowId
const int nX, const int nY,
const int nWidth, const int nHeight);
-static void doc_paintActiveFloatingWindow(LibreOfficeKitDocument* pThis, unsigned nLOKWindowId, unsigned char* pBuffer, int* nWidth, int* nHeight);
-
static void doc_postWindow(LibreOfficeKitDocument* pThis, unsigned nLOKWindowId, int nAction);
LibLODocument_Impl::LibLODocument_Impl(const uno::Reference <css::lang::XComponent> &xComponent)
@@ -692,7 +690,6 @@ LibLODocument_Impl::LibLODocument_Impl(const uno::Reference <css::lang::XCompone
m_pDocumentClass->getPartHash = doc_getPartHash;
m_pDocumentClass->paintWindow = doc_paintWindow;
- m_pDocumentClass->paintActiveFloatingWindow = doc_paintActiveFloatingWindow;
m_pDocumentClass->postWindow = doc_postWindow;
gDocumentClass = m_pDocumentClass;
@@ -812,8 +809,7 @@ void CallbackFlushHandler::queue(const int type, const char* data)
case LOK_CALLBACK_SET_PART:
case LOK_CALLBACK_TEXT_VIEW_SELECTION:
case LOK_CALLBACK_INVALIDATE_HEADER:
- case LOK_CALLBACK_DIALOG:
- case LOK_CALLBACK_DIALOG_CHILD:
+ case LOK_CALLBACK_WINDOW:
{
const auto& pos = std::find_if(m_queue.rbegin(), m_queue.rend(),
[type] (const queue_type::value_type& elem) { return (elem.first == type); });
@@ -1046,27 +1042,27 @@ void CallbackFlushHandler::queue(const int type, const char* data)
}
break;
- case LOK_CALLBACK_DIALOG:
+ case LOK_CALLBACK_WINDOW:
{
// reading JSON by boost might be slow?
boost::property_tree::ptree aTree;
std::stringstream aStream(payload);
boost::property_tree::read_json(aStream, aTree);
- const unsigned nLOKWindowId = aTree.get<unsigned>("dialogId", 0);
+ const unsigned nLOKWindowId = aTree.get<unsigned>("id", 0);
if (aTree.get<std::string>("action", "") == "invalidate")
{
std::string aRectStr = aTree.get<std::string>("rectangle", "");
- // no 'rectangle' field => invalidate all of the dialog =>
- // remove all previous dialog part invalidations
+ // no 'rectangle' field => invalidate all of the window =>
+ // remove all previous window part invalidations
if (aRectStr.empty())
{
removeAll([&nLOKWindowId] (const queue_type::value_type& elem) {
- if (elem.first == LOK_CALLBACK_DIALOG)
+ if (elem.first == LOK_CALLBACK_WINDOW)
{
boost::property_tree::ptree aOldTree;
std::stringstream aOldStream(elem.second);
boost::property_tree::read_json(aOldStream, aOldTree);
- const unsigned nOldDialogId = aOldTree.get<unsigned>("dialogId", 0);
+ const unsigned nOldDialogId = aOldTree.get<unsigned>("id", 0);
if (aOldTree.get<std::string>("action", "") == "invalidate" &&
nLOKWindowId == nOldDialogId)
{
@@ -1078,18 +1074,18 @@ void CallbackFlushHandler::queue(const int type, const char* data)
}
else
{
- // if we have to invalidate all of the dialog, ignore
+ // if we have to invalidate all of the window, ignore
// any part invalidation message
const auto& pos = std::find_if(m_queue.rbegin(), m_queue.rend(),
[&nLOKWindowId] (const queue_type::value_type& elem)
{
- if (elem.first != LOK_CALLBACK_DIALOG)
+ if (elem.first != LOK_CALLBACK_WINDOW)
return false;
boost::property_tree::ptree aOldTree;
std::stringstream aOldStream(elem.second);
boost::property_tree::read_json(aOldStream, aOldTree);
- const unsigned nOldDialogId = aOldTree.get<unsigned>("dialogId", 0);
+ const unsigned nOldDialogId = aOldTree.get<unsigned>("id", 0);
if (aOldTree.get<std::string>("action", "") == "invalidate" &&
nLOKWindowId == nOldDialogId &&
aOldTree.get<std::string>("rectangle", "").empty())
@@ -1099,10 +1095,10 @@ void CallbackFlushHandler::queue(const int type, const char* data)
return false;
});
- // we found a invalidate-all dialog callback
+ // we found a invalidate-all window callback
if (pos != m_queue.rend())
{
- SAL_INFO("lok.dialog", "Skipping queue [" << type << "]: [" << payload << "] since whole dialog needs to be invalidated.");
+ SAL_INFO("lok.dialog", "Skipping queue [" << type << "]: [" << payload << "] since whole window needs to be invalidated.");
return;
}
@@ -1113,7 +1109,7 @@ void CallbackFlushHandler::queue(const int type, const char* data)
Rectangle aNewRect = Rectangle(nLeft, nTop, nLeft + nWidth, nTop + nHeight);
bool currentIsRedundant = false;
removeAll([&aNewRect, &nLOKWindowId, &currentIsRedundant] (const queue_type::value_type& elem) {
- if (elem.first != LOK_CALLBACK_DIALOG)
+ if (elem.first != LOK_CALLBACK_WINDOW)
return false;
boost::property_tree::ptree aOldTree;
@@ -1121,7 +1117,7 @@ void CallbackFlushHandler::queue(const int type, const char* data)
boost::property_tree::read_json(aOldStream, aOldTree);
if (aOldTree.get<std::string>("action", "") == "invalidate")
{
- const unsigned nOldDialogId = aOldTree.get<unsigned>("dialogId", 0);
+ const unsigned nOldDialogId = aOldTree.get<unsigned>("id", 0);
std::string aOldRectStr = aOldTree.get<std::string>("rectangle", "");
// not possible that we encounter an empty
// rectangle here; we already handled this
@@ -3341,29 +3337,6 @@ static void doc_paintWindow(LibreOfficeKitDocument* /*pThis*/, unsigned nLOKWind
comphelper::LibreOfficeKit::setDialogPainting(false);
}
-static void doc_paintActiveFloatingWindow(LibreOfficeKitDocument* /*pThis*/, unsigned nLOKWindowId, unsigned char* pBuffer, int* nWidth, int* nHeight)
-{
- SolarMutexGuard aGuard;
-
- VclPtr<Window> pWindow = vcl::Window::FindLOKWindow(nLOKWindowId);
- if (!pWindow)
- {
- gImpl->maLastExceptionMsg = "Document doesn't support dialog rendering, or window not found.";
- return;
- }
-
- ScopedVclPtrInstance<VirtualDevice> pDevice(nullptr, Size(1, 1), DeviceFormat::DEFAULT);
- pDevice->SetBackground(Wallpaper(Color(COL_TRANSPARENT)));
-
- pDevice->SetOutputSizePixelScaleOffsetAndBuffer(Size(*nWidth, *nHeight), Fraction(1.0), Point(), pBuffer);
-
- comphelper::LibreOfficeKit::setDialogPainting(true);
- const Size aSize = pWindow->PaintActiveFloatingWindow(*pDevice.get());
- *nWidth = aSize.getWidth();
- *nHeight = aSize.getHeight();
- comphelper::LibreOfficeKit::setDialogPainting(false);
-}
-
static void doc_postWindow(LibreOfficeKitDocument* /*pThis*/, unsigned nLOKWindowId, int nAction)
{
SolarMutexGuard aGuard;
diff --git a/include/LibreOfficeKit/LibreOfficeKit.h b/include/LibreOfficeKit/LibreOfficeKit.h
index 2a5f2cd43e49..cc8d77a54ade 100644
--- a/include/LibreOfficeKit/LibreOfficeKit.h
+++ b/include/LibreOfficeKit/LibreOfficeKit.h
@@ -266,9 +266,6 @@ struct _LibreOfficeKitDocumentClass
const int x, const int y,
const int width, const int height);
- /// @see lok::Document::paintActiveFloatingWindow().
- void (*paintActiveFloatingWindow) (LibreOfficeKitDocument* pThis, unsigned nDialogId, unsigned char* pBuffer, int* nWidth, int* nHeight);
-
/// @see lok::Document::postWindow().
void (*postWindow) (LibreOfficeKitDocument* pThis, unsigned nWindowId, int nAction);
diff --git a/include/LibreOfficeKit/LibreOfficeKit.hxx b/include/LibreOfficeKit/LibreOfficeKit.hxx
index ae48b6ac5242..51b08f2bd151 100644
--- a/include/LibreOfficeKit/LibreOfficeKit.hxx
+++ b/include/LibreOfficeKit/LibreOfficeKit.hxx
@@ -176,25 +176,6 @@ public:
}
/**
- * Renders the active floating window of a dialog
- *
- * Client must truncate pBuffer according to the nWidth and nHeight returned after the call.
- *
- * @param nDialogId Unique dialog id
- * @param pBuffer Buffer with enough memory allocated to render any dialog
- * @param nWidth output parameter returning the width of the rendered dialog.
- * @param nHeight output parameter returning the height of the rendered dialog
- */
- void paintActiveFloatingWindow(unsigned nDialogId,
- unsigned char* pBuffer,
- int& nWidth,
- int& nHeight)
- {
- return mpDoc->pClass->paintActiveFloatingWindow(mpDoc, nDialogId, pBuffer,
- &nWidth, &nHeight);
- }
-
- /**
* Posts a command to the window (dialog, popup, etc.) with given id
*
* @param nWindowid
diff --git a/include/LibreOfficeKit/LibreOfficeKitEnums.h b/include/LibreOfficeKit/LibreOfficeKitEnums.h
index facbd351633d..cf85d7c6b592 100644
--- a/include/LibreOfficeKit/LibreOfficeKitEnums.h
+++ b/include/LibreOfficeKit/LibreOfficeKitEnums.h
@@ -531,26 +531,7 @@ typedef enum
/**
* Dialog invalidation
*/
- LOK_CALLBACK_DIALOG = 36,
-
- /**
- * Invalidation corresponding to dialog's children.
- * Eg: Floating window etc.
- *
- * Payload example:
- * {
- * "dialogID": "SpellDialog",
- * "action": "close"
- * }
- *
- * - dialogID is the UNO command of the dialog
- * - action can be
- * - close, means dialog child window is closed now
- * - invalidate, means dialog child window is invalidated
- * It also means that dialog child window is created if it's the first
- * invalidate
- */
- LOK_CALLBACK_DIALOG_CHILD = 37
+ LOK_CALLBACK_WINDOW = 36,
}
LibreOfficeKitCallbackType;
diff --git a/include/sfx2/lokhelper.hxx b/include/sfx2/lokhelper.hxx
index 810d537c1bed..eff40dd2f4ee 100644
--- a/include/sfx2/lokhelper.hxx
+++ b/include/sfx2/lokhelper.hxx
@@ -41,12 +41,10 @@ public:
static void notifyOtherViews(SfxViewShell* pThisView, int nType, const OString& rKey, const OString& rPayload);
/// Same as notifyOtherViews(), but works on a selected "other" view, not on all of them.
static void notifyOtherView(SfxViewShell* pThisView, SfxViewShell* pOtherView, int nType, const OString& rKey, const OString& rPayload);
- /// Emits a LOK_CALLBACK_DIALOG
- static void notifyWindow(vcl::LOKWindowId nDialogId,
+ /// Emits a LOK_CALLBACK_WINDOW
+ static void notifyWindow(vcl::LOKWindowId nWindowId,
const OUString& rAction,
const std::vector<vcl::LOKPayloadItem>& rPayload = std::vector<vcl::LOKPayloadItem>());
- /// Emits a LOK_CALLBACK_DIALOG_CHILD
- static void notifyWindowChild(vcl::LOKWindowId nDialogId, const OUString& rAction, const Point& rPos);
/// Emits a LOK_CALLBACK_INVALIDATE_TILES, but tweaks it according to setOptionalFeatures() if needed.
static void notifyInvalidation(SfxViewShell* pThisView, const OString& rPayload);
/// A special value to signify 'infinity'.
diff --git a/include/sfx2/viewsh.hxx b/include/sfx2/viewsh.hxx
index 5bfea3a81dcf..256f499f8547 100644
--- a/include/sfx2/viewsh.hxx
+++ b/include/sfx2/viewsh.hxx
@@ -228,7 +228,6 @@ public:
// ILibreOfficeKitNotifier
virtual void notifyWindow(vcl::LOKWindowId nLOKWindowId, const OUString& rAction, const std::vector<vcl::LOKPayloadItem>& rPayload = std::vector<vcl::LOKPayloadItem>()) const override;
- virtual void notifyWindowChild(vcl::LOKWindowId nLOKWindowId, const OUString& rAction, const Point& rPos) const override;
// Focus, KeyInput, Cursor
virtual void ShowCursor( bool bOn = true );
diff --git a/include/vcl/IDialogRenderable.hxx b/include/vcl/IDialogRenderable.hxx
index 281d04385aee..ef8d42a4a46c 100644
--- a/include/vcl/IDialogRenderable.hxx
+++ b/include/vcl/IDialogRenderable.hxx
@@ -34,8 +34,6 @@ public:
virtual void notifyWindow(vcl::LOKWindowId nLOKWindowId,
const OUString& rAction,
const std::vector<LOKPayloadItem>& rPayload = std::vector<LOKPayloadItem>()) const = 0;
-
- virtual void notifyWindowChild(vcl::LOKWindowId nLOKWindowId, const OUString& rAction, const Point& rPos) const = 0;
};
} // namespace vcl
diff --git a/include/vcl/dialog.hxx b/include/vcl/dialog.hxx
index 83a80eed84e6..c396fe766c29 100644
--- a/include/vcl/dialog.hxx
+++ b/include/vcl/dialog.hxx
@@ -65,8 +65,6 @@ protected:
public:
SAL_DLLPRIVATE bool IsInClose() const { return mbInClose; }
virtual void doDeferredInit(WinBits nBits) override;
- void InvalidateFloatingWindow(const Point& rPos);
- void CloseFloatingWindow();
protected:
explicit Dialog( WindowType nType );
diff --git a/include/vcl/floatwin.hxx b/include/vcl/floatwin.hxx
index da69f7b9cbe7..a5d780c23c6f 100644
--- a/include/vcl/floatwin.hxx
+++ b/include/vcl/floatwin.hxx
@@ -129,7 +129,7 @@ public:
SAL_DLLPRIVATE Rectangle& ImplGetItemEdgeClipRect();
SAL_DLLPRIVATE bool ImplIsInPrivatePopupMode() const { return mbInPopupMode; }
virtual void doDeferredInit(WinBits nBits) override;
- virtual void LogicInvalidate(const Rectangle* pRectangle) override;
+ void LogicInvalidate(const Rectangle* pRectangle) override;
public:
explicit FloatingWindow(vcl::Window* pParent, WinBits nStyle);
diff --git a/include/vcl/window.hxx b/include/vcl/window.hxx
index 489a200b5cbf..9b52a4da7810 100644
--- a/include/vcl/window.hxx
+++ b/include/vcl/window.hxx
@@ -1208,6 +1208,7 @@ public:
void SetLOKNotifier(const vcl::ILibreOfficeKitNotifier* pNotifier);
const vcl::ILibreOfficeKitNotifier* GetLOKNotifier() const;
vcl::LOKWindowId GetLOKWindowId() const;
+ vcl::Window* GetParentWithLOKNotifier();
/// Indicate that LOK is not going to use this dialog any more.
void ReleaseLOKNotifier();
diff --git a/libreofficekit/qa/gtktiledviewer/gtv-application-window.cxx b/libreofficekit/qa/gtktiledviewer/gtv-application-window.cxx
index 64d79e4c3d9c..efe9b3da7061 100644
--- a/libreofficekit/qa/gtktiledviewer/gtv-application-window.cxx
+++ b/libreofficekit/qa/gtktiledviewer/gtv-application-window.cxx
@@ -14,13 +14,14 @@
#include <LibreOfficeKit/LibreOfficeKitGtk.h>
#include <LibreOfficeKit/LibreOfficeKitEnums.h>
-#include <gtv-application-window.hxx>
-#include <gtv-main-toolbar.hxx>
-#include <gtv-helpers.hxx>
-#include <gtv-signal-handlers.hxx>
-#include <gtv-lokdocview-signal-handlers.hxx>
-#include <gtv-calc-header-bar.hxx>
-#include <gtv-comments-sidebar.hxx>
+#include "gtv-application-window.hxx"
+#include "gtv-main-toolbar.hxx"
+#include "gtv-helpers.hxx"
+#include "gtv-signal-handlers.hxx"
+#include "gtv-lokdocview-signal-handlers.hxx"
+#include "gtv-calc-header-bar.hxx"
+#include "gtv-comments-sidebar.hxx"
+#include "gtv-lok-dialog.hxx"
#include <boost/property_tree/json_parser.hpp>
#include <boost/optional.hpp>
@@ -314,8 +315,7 @@ static void setupDocView(GtvApplicationWindow* window)
g_signal_connect(window->lokdocview, "formula-changed", G_CALLBACK(LOKDocViewSigHandlers::formulaChanged), nullptr);
g_signal_connect(window->lokdocview, "password-required", G_CALLBACK(LOKDocViewSigHandlers::passwordRequired), nullptr);
g_signal_connect(window->lokdocview, "comment", G_CALLBACK(LOKDocViewSigHandlers::comment), nullptr);
- g_signal_connect(window->lokdocview, "dialog", G_CALLBACK(LOKDocViewSigHandlers::dialog), nullptr);
- g_signal_connect(window->lokdocview, "dialog-child", G_CALLBACK(LOKDocViewSigHandlers::dialogChild), nullptr);
+ g_signal_connect(window->lokdocview, "window", G_CALLBACK(LOKDocViewSigHandlers::window), nullptr);
g_signal_connect(window->lokdocview, "configure-event", G_CALLBACK(LOKDocViewSigHandlers::configureEvent), nullptr);
}
@@ -422,7 +422,7 @@ gtv_application_window_unregister_child_window(GtvApplicationWindow* window, Gtk
}
GtkWindow*
-gtv_application_window_get_child_window_by_id(GtvApplicationWindow* window, const gchar* pWinId)
+gtv_application_window_get_child_window_by_id(GtvApplicationWindow* window, guint nWinId)
{
GtvApplicationWindowPrivate* priv = getPrivate(window);
GList* pIt = nullptr;
@@ -430,25 +430,32 @@ gtv_application_window_get_child_window_by_id(GtvApplicationWindow* window, cons
// For now, only dialogs are registered as child window
for (pIt = priv->m_pChildWindows; pIt != nullptr; pIt = pIt->next)
{
- gchar* dialogId = nullptr;
+ guint dialogId = 0;
g_object_get(G_OBJECT(pIt->data), "dialogid", &dialogId, nullptr);
- // prepend .uno:
- gchar* completeWinId = nullptr;
- if (pWinId != nullptr)
- {
- completeWinId = g_strconcat(".uno:", pWinId, nullptr);
- }
-
- if (dialogId != nullptr && g_str_equal(dialogId, completeWinId))
+ if (dialogId == nWinId)
{
ret = GTK_WINDOW(pIt->data);
break;
}
}
+
return ret;
}
+GtkWidget* gtv_application_window_get_parent(GtvApplicationWindow* window, guint nWinId)
+{
+ GtvApplicationWindowPrivate* priv = getPrivate(window);
+ GList* pIt = nullptr;
+ for (pIt = priv->m_pChildWindows; pIt != nullptr; pIt = pIt->next)
+ {
+ if (gtv_lok_dialog_is_parent_of(GTV_LOK_DIALOG(pIt->data), nWinId))
+ return GTK_WIDGET(pIt->data);
+ }
+ return nullptr;
+}
+
+
// temporary function to invalidate all opened dialogs
// because currently the dialog id returned in dialog invalidation payload
// doesn't match our hard-coded list of dialog ids (uno commands) for some dialogs
diff --git a/libreofficekit/qa/gtktiledviewer/gtv-application-window.hxx b/libreofficekit/qa/gtktiledviewer/gtv-application-window.hxx
index 239471ae4ac8..b6aac5466133 100644
--- a/libreofficekit/qa/gtktiledviewer/gtv-application-window.hxx
+++ b/libreofficekit/qa/gtktiledviewer/gtv-application-window.hxx
@@ -103,10 +103,12 @@ void gtv_application_window_register_child_window(GtvApplicationWindow* window,
void gtv_application_window_unregister_child_window(GtvApplicationWindow* window, GtkWindow* pChildWin);
-GtkWindow* gtv_application_window_get_child_window_by_id(GtvApplicationWindow* window, const gchar* pWinId);
+GtkWindow* gtv_application_window_get_child_window_by_id(GtvApplicationWindow* window, guint nWinId);
GList* gtv_application_window_get_all_child_windows(GtvApplicationWindow* window);
+GtkWidget* gtv_application_window_get_parent(GtvApplicationWindow* window, guint nWinId);
+
G_END_DECLS
#endif /* GTV_APPLICATION_WINDOW_H */
diff --git a/libreofficekit/qa/gtktiledviewer/gtv-lok-dialog.cxx b/libreofficekit/qa/gtktiledviewer/gtv-lok-dialog.cxx
index 15e67cf7a967..4d5ce9ca7ec9 100644
--- a/libreofficekit/qa/gtktiledviewer/gtv-lok-dialog.cxx
+++ b/libreofficekit/qa/gtktiledviewer/gtv-lok-dialog.cxx
@@ -43,6 +43,9 @@ struct GtvLokDialogPrivate
guint32 m_nHeight;
// state for child floating windows
+ guint32 m_nChildId;
+ guint32 m_nChildWidth;
+ guint32 m_nChildHeight;
guint32 m_nChildLastButtonPressTime;
guint32 m_nChildLastButtonReleaseTime;
guint32 m_nChildKeyModifier;
@@ -132,11 +135,9 @@ gtv_lok_dialog_signal_button(GtkWidget* pDialogDrawingArea, GdkEventButton* pEve
else if (pEvent->type == GDK_BUTTON_RELEASE)
aEventType = "BUTTON_RELEASE";
- g_info("lok_dialog_signal_button (type: %s): %d, %d (in twips: %d, %d)",
+ g_info("lok_dialog_signal_button (type: %s): %d, %d",
aEventType.c_str(),
- (int)pEvent->x, (int)pEvent->y,
- (int)pixelToTwip(pEvent->x),
- (int)pixelToTwip(pEvent->y));
+ (int)pEvent->x, (int)pEvent->y);
gtk_widget_grab_focus(pDialogDrawingArea);
switch (pEvent->type)
@@ -355,6 +356,9 @@ gtv_lok_dialog_init(GtvLokDialog* dialog)
GtkWidget* pContentArea = gtk_dialog_get_content_area(GTK_DIALOG(dialog));
priv->pDialogDrawingArea = gtk_drawing_area_new();
priv->pFloatingWin = nullptr;
+ priv->m_nChildId = 0;
+ priv->m_nChildWidth = 0;
+ priv->m_nChildHeight = 0;
priv->m_nLastButtonPressTime = 0;
priv->m_nLastButtonReleaseTime = 0;
@@ -478,17 +482,14 @@ gtv_lok_dialog_floating_win_draw(GtkWidget* pDrawingArea, cairo_t* pCairo, gpoin
GtvLokDialogPrivate* priv = getPrivate(pDialog);
g_info("gtv_lok_dialog_floating_win_draw triggered");
- int nWidth = 800;
- int nHeight = 600;
- cairo_surface_t* pSurface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, nWidth, nHeight);
+ cairo_surface_t* pSurface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, priv->m_nChildWidth, priv->m_nChildHeight);
unsigned char* pBuffer = cairo_image_surface_get_data(pSurface);
LibreOfficeKitDocument* pDocument = lok_doc_view_get_document(LOK_DOC_VIEW(priv->lokdocview));
- pDocument->pClass->paintActiveFloatingWindow(pDocument, priv->dialogid, pBuffer, &nWidth, &nHeight);
- g_info("Size of floating window: %d x %d", nWidth, nHeight);
+ pDocument->pClass->paintWindow(pDocument, priv->m_nChildId, pBuffer, 0, 0, priv->m_nChildWidth, priv->m_nChildHeight);
- gtk_widget_set_size_request(GTK_WIDGET(pDrawingArea), nWidth, nHeight);
- gtk_widget_set_size_request(GTK_WIDGET(pDialog), nWidth, nHeight);
- gtk_window_resize(GTK_WINDOW(pDialog), nWidth, nHeight);
+ gtk_widget_set_size_request(GTK_WIDGET(pDrawingArea), priv->m_nChildWidth, priv->m_nChildHeight);
+ //gtk_widget_set_size_request(GTK_WIDGET(pDialog), nWidth, nHeight);
+ //gtk_window_resize(GTK_WINDOW(pDialog), nWidth, nHeight);
cairo_surface_flush(pSurface);
cairo_surface_mark_dirty(pSurface);
@@ -497,16 +498,6 @@ gtv_lok_dialog_floating_win_draw(GtkWidget* pDrawingArea, cairo_t* pCairo, gpoin
cairo_paint(pCairo);
}
-void
-gtv_lok_dialog_invalidate(GtvLokDialog* dialog, const GdkRectangle& aRectangle)
-{
- GtvLokDialogPrivate* priv = getPrivate(dialog);
- if (aRectangle.width != 0 && aRectangle.height != 0)
- gtk_widget_queue_draw_area(priv->pDialogDrawingArea, aRectangle.x, aRectangle.y, aRectangle.width, aRectangle.height);
- else
- gtk_widget_queue_draw(priv->pDialogDrawingArea);
-}
-
static gboolean
gtv_lok_dialog_floating_win_signal_button(GtkWidget* /*pDialogChildDrawingArea*/, GdkEventButton* pEvent, gpointer userdata)
{
@@ -551,13 +542,13 @@ gtv_lok_dialog_floating_win_signal_button(GtkWidget* /*pDialogChildDrawingArea*/
}
priv->m_nChildLastButtonPressed = nEventButton;
pDocument->pClass->postDialogChildMouseEvent(pDocument,
- priv->dialogid,
- LOK_MOUSEEVENT_MOUSEBUTTONDOWN,
- (pEvent->x),
- (pEvent->y),
- nCount,
- nEventButton,
- priv->m_nChildKeyModifier);
+ priv->m_nChildId,
+ LOK_MOUSEEVENT_MOUSEBUTTONDOWN,
+ (pEvent->x),
+ (pEvent->y),
+ nCount,
+ nEventButton,
+ priv->m_nChildKeyModifier);
break;
}
@@ -582,7 +573,7 @@ gtv_lok_dialog_floating_win_signal_button(GtkWidget* /*pDialogChildDrawingArea*/
}
priv->m_nChildLastButtonPressed = nEventButton;
pDocument->pClass->postDialogChildMouseEvent(pDocument,
- priv->dialogid,
+ priv->m_nChildId,
LOK_MOUSEEVENT_MOUSEBUTTONUP,
(pEvent->x),
(pEvent->y),
@@ -612,7 +603,7 @@ gtv_lok_dialog_floating_win_signal_motion(GtkWidget* /*pDialogDrawingArea*/, Gdk
(int)pixelToTwip(pEvent->y));
pDocument->pClass->postDialogChildMouseEvent(pDocument,
- priv->dialogid,
+ priv->m_nChildId,
LOK_MOUSEEVENT_MOUSEMOVE,
(pEvent->x),
(pEvent->y),
@@ -623,40 +614,58 @@ gtv_lok_dialog_floating_win_signal_motion(GtkWidget* /*pDialogDrawingArea*/, Gdk
return FALSE;
}
-void gtv_lok_dialog_child_invalidate(GtvLokDialog* dialog, int nX, int nY)
+// Public methods below
+
+void gtv_lok_dialog_invalidate(GtvLokDialog* dialog, const GdkRectangle& aRectangle)
+{
+ GtvLokDialogPrivate* priv = getPrivate(dialog);
+ if (aRectangle.width != 0 && aRectangle.height != 0)
+ gtk_widget_queue_draw_area(priv->pDialogDrawingArea, aRectangle.x, aRectangle.y, aRectangle.width, aRectangle.height);
+ else
+ gtk_widget_queue_draw(priv->pDialogDrawingArea);
+}
+
+// checks if we are the parent of given childId
+gboolean gtv_lok_dialog_is_parent_of(GtvLokDialog* dialog, guint childId)
{
- g_info("Dialog's floating window invalidate");
+ GtvLokDialogPrivate* priv = getPrivate(dialog);
+
+ return priv->m_nChildId == childId;
+}
+void gtv_lok_dialog_child_create(GtvLokDialog* dialog, guint childId, guint nX, guint nY, guint width, guint height)
+{
GtvLokDialogPrivate* priv = getPrivate(dialog);
- // create new if doesn't exist
- if (!priv->pFloatingWin)
- {
- priv->pFloatingWin = gtk_window_new(GTK_WINDOW_POPUP);
- GtkWidget* pDrawingArea = gtk_drawing_area_new();
- gtk_container_add(GTK_CONTAINER(priv->pFloatingWin), pDrawingArea);
-
- gtk_window_set_transient_for(GTK_WINDOW(priv->pFloatingWin), GTK_WINDOW(dialog));
- gtk_window_set_destroy_with_parent(GTK_WINDOW(priv->pFloatingWin), true);
-
- gtk_widget_add_events(pDrawingArea,
- GDK_BUTTON_PRESS_MASK
- |GDK_POINTER_MOTION_MASK
- |GDK_BUTTON_RELEASE_MASK
- |GDK_BUTTON_MOTION_MASK);
-
- g_signal_connect(G_OBJECT(pDrawingArea), "draw", G_CALLBACK(gtv_lok_dialog_floating_win_draw), dialog);
- g_signal_connect(G_OBJECT(pDrawingArea), "button-press-event", G_CALLBACK(gtv_lok_dialog_floating_win_signal_button), dialog);
- g_signal_connect(G_OBJECT(pDrawingArea), "button-release-event", G_CALLBACK(gtv_lok_dialog_floating_win_signal_button), dialog);
- g_signal_connect(G_OBJECT(pDrawingArea), "motion-notify-event", G_CALLBACK(gtv_lok_dialog_floating_win_signal_motion), dialog);
-
- gtk_widget_set_size_request(priv->pFloatingWin, 1, 1);
- gtk_window_set_type_hint(GTK_WINDOW(priv->pFloatingWin), GDK_WINDOW_TYPE_HINT_POPUP_MENU);
- gtk_window_set_screen(GTK_WINDOW(priv->pFloatingWin), gtk_window_get_screen(GTK_WINDOW(dialog)));
-
- gtk_widget_show_all(priv->pFloatingWin);
- gtk_window_present(GTK_WINDOW(priv->pFloatingWin));
- gtk_widget_grab_focus(pDrawingArea);
- }
+
+ g_debug("Dialog [ %d ] child window [ %d] being created, with dimensions [%dx%d]@(%d,%d)", priv->dialogid, childId, width, height, nX, nY);
+ priv->pFloatingWin = gtk_window_new(GTK_WINDOW_POPUP);
+ priv->m_nChildId = childId;
+ priv->m_nChildWidth = width;
+ priv->m_nChildHeight = height;
+ GtkWidget* pDrawingArea = gtk_drawing_area_new();
+ gtk_container_add(GTK_CONTAINER(priv->pFloatingWin), pDrawingArea);
+
+ gtk_window_set_transient_for(GTK_WINDOW(priv->pFloatingWin), GTK_WINDOW(dialog));
+ gtk_window_set_destroy_with_parent(GTK_WINDOW(priv->pFloatingWin), true);
+
+ gtk_widget_add_events(pDrawingArea,
+ GDK_BUTTON_PRESS_MASK
+ |GDK_POINTER_MOTION_MASK
+ |GDK_BUTTON_RELEASE_MASK
+ |GDK_BUTTON_MOTION_MASK);
+
+ g_signal_connect(G_OBJECT(pDrawingArea), "draw", G_CALLBACK(gtv_lok_dialog_floating_win_draw), dialog);
+ g_signal_connect(G_OBJECT(pDrawingArea), "button-press-event", G_CALLBACK(gtv_lok_dialog_floating_win_signal_button), dialog);
+ g_signal_connect(G_OBJECT(pDrawingArea), "button-release-event", G_CALLBACK(gtv_lok_dialog_floating_win_signal_button), dialog);
+ g_signal_connect(G_OBJECT(pDrawingArea), "motion-notify-event", G_CALLBACK(gtv_lok_dialog_floating_win_signal_motion), dialog);
+
+ gtk_widget_set_size_request(priv->pFloatingWin, 1, 1);
+ gtk_window_set_type_hint(GTK_WINDOW(priv->pFloatingWin), GDK_WINDOW_TYPE_HINT_POPUP_MENU);
+ gtk_window_set_screen(GTK_WINDOW(priv->pFloatingWin), gtk_window_get_screen(GTK_WINDOW(dialog)));
+
+ gtk_widget_show_all(priv->pFloatingWin);
+ gtk_window_present(GTK_WINDOW(priv->pFloatingWin));
+ gtk_widget_grab_focus(pDrawingArea);
// Get the root coords of our new floating window
GdkWindow* pGdkWin = gtk_widget_get_window(GTK_WIDGET(dialog));
@@ -664,7 +673,12 @@ void gtv_lok_dialog_child_invalidate(GtvLokDialog* dialog, int nX, int nY)
int nrY = 0;
gdk_window_get_root_coords(pGdkWin, nX, nY, &nrX, &nrY);
gtk_window_move(GTK_WINDOW(priv->pFloatingWin), nrX, nrY);
+}
+void gtv_lok_dialog_child_invalidate(GtvLokDialog* dialog)
+{
+ GtvLokDialogPrivate* priv = getPrivate(dialog);
+ g_debug("Dialog [ %d ] child invalidate request", priv->dialogid);
gtk_widget_queue_draw(priv->pFloatingWin);
}
@@ -677,12 +691,13 @@ void gtv_lok_dialog_child_close(GtvLokDialog* dialog)
{
gtk_widget_destroy(priv->pFloatingWin);
priv->pFloatingWin = nullptr;
+ priv->m_nChildId = 0;
+ priv->m_nChildWidth = 0;
+ priv->m_nChildHeight = 0;
}
}
-
-GtkWidget*
-gtv_lok_dialog_new(LOKDocView* pDocView, guint dialogId, guint width, guint height)
+GtkWidget* gtv_lok_dialog_new(LOKDocView* pDocView, guint dialogId, guint width, guint height)
{
g_debug("Dialog [ %d ] of size: %d x %d created", dialogId, width, height);
GtkWindow* pWindow = GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(pDocView)));
diff --git a/libreofficekit/qa/gtktiledviewer/gtv-lok-dialog.hxx b/libreofficekit/qa/gtktiledviewer/gtv-lok-dialog.hxx
index 0f7002c359d7..2a5bfb5957f8 100644
--- a/libreofficekit/qa/gtktiledviewer/gtv-lok-dialog.hxx
+++ b/libreofficekit/qa/gtktiledviewer/gtv-lok-dialog.hxx
@@ -39,10 +39,14 @@ GtkWidget* gtv_lok_dialog_new(LOKDocView* pDocView, guint dialogId, guint width,
void gtv_lok_dialog_invalidate(GtvLokDialog* dialog, const GdkRectangle& aRectangle);
-void gtv_lok_dialog_child_invalidate(GtvLokDialog* dialog, int nX, int nY);
+void gtv_lok_dialog_child_create(GtvLokDialog* dialog, guint childId, guint nX, guint nY, guint width, guint height);
+
+void gtv_lok_dialog_child_invalidate(GtvLokDialog* dialog);
void gtv_lok_dialog_child_close(GtvLokDialog* dialog);
+gboolean gtv_lok_dialog_is_parent_of(GtvLokDialog* dialog, guint childId);
+
G_END_DECLS
#endif /* GTV_LOK_DIALOG_H */
diff --git a/libreofficekit/qa/gtktiledviewer/gtv-lokdocview-signal-handlers.cxx b/libreofficekit/qa/gtktiledviewer/gtv-lokdocview-signal-handlers.cxx
index 41d332d30fc7..8d3a116df97e 100644
--- a/libreofficekit/qa/gtktiledviewer/gtv-lokdocview-signal-handlers.cxx
+++ b/libreofficekit/qa/gtktiledviewer/gtv-lokdocview-signal-handlers.cxx
@@ -301,47 +301,60 @@ void LOKDocViewSigHandlers::comment(LOKDocView* pDocView, gchar* pComment, gpoin
}
}
-void LOKDocViewSigHandlers::dialog(LOKDocView* pDocView, gchar* pPayload, gpointer)
+void LOKDocViewSigHandlers::window(LOKDocView* pDocView, gchar* pPayload, gpointer)
{
GtvApplicationWindow* window = GTV_APPLICATION_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(pDocView)));
std::stringstream aStream(pPayload);
boost::property_tree::ptree aRoot;
boost::property_tree::read_json(aStream, aRoot);
- const unsigned nDialogId = aRoot.get<unsigned>("dialogId");
+ const unsigned nWinId = aRoot.get<unsigned>("id");
const std::string aAction = aRoot.get<std::string>("action");
if (aAction == "created")
{
+ const std::string aType = aRoot.get<std::string>("type");
const std::string aSize = aRoot.get<std::string>("size");
- std::vector<int> aPoints = GtvHelpers::split<int>(aSize, ", ", 2);
- GtkWidget* pDialog = gtv_lok_dialog_new(pDocView, nDialogId, aPoints[0], aPoints[1]);
- g_info("created dialog, for dialogid: %d with size: %s", nDialogId, aSize.c_str());
+ std::vector<int> aSizePoints = GtvHelpers::split<int>(aSize, ", ", 2);
- gtv_application_window_register_child_window(window, GTK_WINDOW(pDialog));
- g_signal_connect(pDialog, "destroy", G_CALLBACK(destroyLokDialog), window);
- g_signal_connect(pDialog, "delete-event", G_CALLBACK(deleteLokDialog), window);
+ if (aType == "dialog")
+ {
+ GtkWidget* pDialog = gtv_lok_dialog_new(pDocView, nWinId, aSizePoints[0], aSizePoints[1]);
+ g_info("created dialog, for dialogid: %d with size: %s", nWinId, aSize.c_str());
- gtk_window_set_resizable(GTK_WINDOW(pDialog), false);
- gtk_widget_show_all(GTK_WIDGET(pDialog));
- gtk_window_present(GTK_WINDOW(pDialog));
+ gtv_application_window_register_child_window(window, GTK_WINDOW(pDialog));
+ g_signal_connect(pDialog, "destroy", G_CALLBACK(destroyLokDialog), window);
+ g_signal_connect(pDialog, "delete-event", G_CALLBACK(deleteLokDialog), window);
- return;
+ gtk_window_set_resizable(GTK_WINDOW(pDialog), false);
+ gtk_widget_show_all(GTK_WIDGET(pDialog));
+ gtk_window_present(GTK_WINDOW(pDialog));
+ }
+ else if (aType == "child")
+ {
+ const unsigned nParentId = std::atoi(aRoot.get<std::string>("parentId").c_str());
+ GtkWindow* pDialog = gtv_application_window_get_child_window_by_id(window, nParentId);
+ const std::string aPos = aRoot.get<std::string>("position");
+ std::vector<int> aPosPoints = GtvHelpers::split<int>(aPos, ", ", 2);
+ gtv_lok_dialog_child_create(GTV_LOK_DIALOG(pDialog), nWinId, aPosPoints[0], aPosPoints[1], aSizePoints[0], aSizePoints[1]);
+ }
}
-
- GList* pChildWins = gtv_application_window_get_all_child_windows(window);
- GList* pIt = nullptr;
- bool found = false;
- for (pIt = pChildWins; !found && pIt != nullptr; pIt = pIt->next)
+ else
{
- guint nChildDialogId = 0;
- g_object_get(pIt->data, "dialogid", &nChildDialogId, nullptr);
- if (nDialogId == nChildDialogId)
+ // check if it's a child window
+ GtkWidget* pParent = gtv_application_window_get_parent(window, nWinId);
+ if (pParent) // it's a floating window in the dialog
{
- found = true;
-
+ if (aAction == "invalidate")
+ gtv_lok_dialog_child_invalidate(GTV_LOK_DIALOG(pParent));
+ else if (aAction == "close")
+ gtv_lok_dialog_child_close(GTV_LOK_DIALOG(pParent));
+ }
+ else // it's the dialog window itself
+ {
+ GtkWindow* pDialog = gtv_application_window_get_child_window_by_id(window, nWinId);
if (aAction == "close")
- gtk_widget_destroy(GTK_WIDGET(pIt->data));
+ gtk_widget_destroy(GTK_WIDGET(pDialog));
else if (aAction == "size_changed")
{
const std::string aSize = aRoot.get<std::string>("size");
@@ -349,16 +362,16 @@ void LOKDocViewSigHandlers::dialog(LOKDocView* pDocView, gchar* pPayload, gpoint
if (aSizePoints.size() != 2)
{
g_error("Malformed size_changed callback");
- break;
+ return;
}
- g_object_set(G_OBJECT(pIt->data),
+ g_object_set(G_OBJECT(pDialog),
"width", aSizePoints[0],
"height", aSizePoints[1],
nullptr);
GdkRectangle aGdkRectangle = {0, 0, 0, 0};
- gtv_lok_dialog_invalidate(GTV_LOK_DIALOG(pIt->data), aGdkRectangle);
+ gtv_lok_dialog_invalidate(GTV_LOK_DIALOG(pDialog), aGdkRectangle);
}
else if (aAction == "invalidate")
{
@@ -373,51 +386,12 @@ void LOKDocViewSigHandlers::dialog(LOKDocView* pDocView, gchar* pPayload, gpoint
catch(const std::exception& e)
{}
- gtv_lok_dialog_invalidate(GTV_LOK_DIALOG(pIt->data), aGdkRectangle);
+ gtv_lok_dialog_invalidate(GTV_LOK_DIALOG(pDialog), aGdkRectangle);
}
}
}
}
-void LOKDocViewSigHandlers::dialogChild(LOKDocView* pDocView, gchar* pPayload, gpointer)
-{
- GtvApplicationWindow* window = GTV_APPLICATION_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(pDocView)));
-
- std::stringstream aStream(pPayload);
- boost::property_tree::ptree aRoot;
- boost::property_tree::read_json(aStream, aRoot);
- const unsigned nDialogId = aRoot.get<unsigned>("dialogId");
- const std::string aAction = aRoot.get<std::string>("action");
- const std::string aPos = aRoot.get<std::string>("position");
- gchar** ppCoordinates = g_strsplit(aPos.c_str(), ", ", 2);
- gchar** ppCoordinate = ppCoordinates;
- int nX = 0;
- int nY = 0;
-
- if (*ppCoordinate)
- nX = atoi(*ppCoordinate);
- ++ppCoordinate;
- if (*ppCoordinate)
- nY = atoi(*ppCoordinate);
-
- g_strfreev(ppCoordinates);
-
- GList* pChildWins = gtv_application_window_get_all_child_windows(window);
- GList* pIt = nullptr;
- for (pIt = pChildWins; pIt != nullptr; pIt = pIt->next)
- {
- guint nChildDialogId = 0;
- g_object_get(pIt->data, "dialogid", &nChildDialogId, nullptr);
- if (nDialogId == nChildDialogId)
- {
- if (aAction == "invalidate")
- gtv_lok_dialog_child_invalidate(GTV_LOK_DIALOG(pIt->data), nX, nY);
- else if (aAction == "close")
- gtv_lok_dialog_child_close(GTV_LOK_DIALOG(pIt->data));
- }
- }
-}
-
gboolean LOKDocViewSigHandlers::configureEvent(GtkWidget* pWidget, GdkEventConfigure* /*pEvent*/, gpointer /*pData*/)
{
GtvApplicationWindow* window = GTV_APPLICATION_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(pWidget)));
diff --git a/libreofficekit/qa/gtktiledviewer/gtv-lokdocview-signal-handlers.hxx b/libreofficekit/qa/gtktiledviewer/gtv-lokdocview-signal-handlers.hxx
index 54f54b396bf3..aedc8d216ad0 100644
--- a/libreofficekit/qa/gtktiledviewer/gtv-lokdocview-signal-handlers.hxx
+++ b/libreofficekit/qa/gtktiledviewer/gtv-lokdocview-signal-handlers.hxx
@@ -25,8 +25,7 @@ namespace LOKDocViewSigHandlers {
void formulaChanged(LOKDocView* pDocView, char* pPayload, gpointer);
void passwordRequired(LOKDocView* pDocView, char* pUrl, gboolean bModify, gpointer);
void comment(LOKDocView* pDocView, gchar* pComment, gpointer);
- void dialog(LOKDocView* pDocView, gchar* pDialogId, gpointer);
- void dialogChild(LOKDocView* pDocView, gchar* pPayload, gpointer);
+ void window(LOKDocView* pDocView, gchar* pPayload, gpointer);
gboolean configureEvent(GtkWidget* pWidget, GdkEventConfigure* pEvent, gpointer pData);
}
diff --git a/libreofficekit/source/gtk/lokdocview.cxx b/libreofficekit/source/gtk/lokdocview.cxx
index 69644d287cde..6414e2fa5892 100644
--- a/libreofficekit/source/gtk/lokdocview.cxx
+++ b/libreofficekit/source/gtk/lokdocview.cxx
@@ -279,8 +279,7 @@ enum
PASSWORD_REQUIRED,
COMMENT,
RULER,
- DIALOG,
- DIALOG_CHILD,
+ WINDOW,
LAST_SIGNAL
};
@@ -438,10 +437,8 @@ callbackTypeToString (int nType)
return "LOK_CALLBACK_COMMENT";
case LOK_CALLBACK_RULER_UPDATE:
return "LOK_CALLBACK_RULER_UPDATE";
- case LOK_CALLBACK_DIALOG:
- return "LOK_CALLBACK_DIALOG";
- case LOK_CALLBACK_DIALOG_CHILD:
- return "LOK_CALLBACK_DIALOG_CHILD";
+ case LOK_CALLBACK_WINDOW:
+ return "LOK_CALLBACK_WINDOW";
}
g_assert(false);
return nullptr;
@@ -1416,11 +1413,8 @@ callback (gpointer pData)
case LOK_CALLBACK_RULER_UPDATE:
g_signal_emit(pCallback->m_pDocView, doc_view_signals[RULER], 0, pCallback->m_aPayload.c_str());
break;
- case LOK_CALLBACK_DIALOG:
- g_signal_emit(pCallback->m_pDocView, doc_view_signals[DIALOG], 0, pCallback->m_aPayload.c_str());
- break;
- case LOK_CALLBACK_DIALOG_CHILD:
- g_signal_emit(pCallback->m_pDocView, doc_view_signals[DIALOG_CHILD], 0, pCallback->m_aPayload.c_str());
+ case LOK_CALLBACK_WINDOW:
+ g_signal_emit(pCallback->m_pDocView, doc_view_signals[WINDOW], 0, pCallback->m_aPayload.c_str());
break;
default:
g_assert(false);
@@ -3199,43 +3193,12 @@ static void lok_doc_view_class_init (LOKDocViewClass* pClass)
G_TYPE_STRING);
/**
- * LOKDocView::dialog-invalidate:
+ * LOKDocView::window
* @pDocView: the #LOKDocView on which the signal is emitted
- * @pDialogId: The uno command for the dialog (dialog ID)
- */
- doc_view_signals[DIALOG] =
- g_signal_new("dialog",
- G_TYPE_FROM_CLASS(pGObjectClass),
- G_SIGNAL_RUN_FIRST,
- 0,
- nullptr, nullptr,
- g_cclosure_marshal_generic,
- G_TYPE_NONE, 1,
- G_TYPE_STRING);
-
- /**
- * LOKDocView::dialog-child:
- * @pDocView: the #LOKDocView on which the signal is emitted
- * @pPayload: JSON described below:
- *
- * Invalidation corresponding to dialog's children.
- * Eg: Floating window etc.
- *
- * Payload example:
- * {
- * "dialogID": "SpellDialog",
- * "action": "close"
- * }
- *
- * - dialogID is the UNO command of the dialog
- * - action can be
- * - close, means dialog child window is closed now
- * - invalidate, means dialog child window is invalidated
- * It also means that dialog child window is created if it's the first
- * invalidate
+ * @pPayload: JSON containing the information, including id, about the window
*/
- doc_view_signals[DIALOG_CHILD] =
- g_signal_new("dialog-child",
+ doc_view_signals[WINDOW] =
+ g_signal_new("window",
G_TYPE_FROM_CLASS(pGObjectClass),
G_SIGNAL_RUN_FIRST,
0,
diff --git a/sfx2/source/dialog/basedlgs.cxx b/sfx2/source/dialog/basedlgs.cxx
index 97d3c1c8b45e..0fd2abc9ba8e 100644
--- a/sfx2/source/dialog/basedlgs.cxx
+++ b/sfx2/source/dialog/basedlgs.cxx
@@ -185,6 +185,7 @@ short SfxModalDialog::Execute()
SetLOKNotifier(pViewShell);
const Size aSize = GetOptimalSize();
std::vector<vcl::LOKPayloadItem> aItems;
+ aItems.emplace_back(std::make_pair("type", "dialog"));
aItems.emplace_back(std::make_pair("size", aSize.toString()));
pViewShell->notifyWindow(GetLOKWindowId(), "created", aItems);
}
@@ -279,6 +280,7 @@ void SfxModelessDialog::StateChanged( StateChangedType nStateChange )
// Check GetSizePixel() ?
const Size aOptimalSize = GetOptimalSize();
std::vector<vcl::LOKPayloadItem> aItems;
+ aItems.emplace_back(std::make_pair("type", "dialog"));
aItems.emplace_back(std::make_pair("size", aOptimalSize.toString()));
pViewShell->notifyWindow(GetLOKWindowId(), "created", aItems);
}
@@ -545,6 +547,7 @@ bool SfxFloatingWindow::Close()
pBindings->GetDispatcher_Impl()->ExecuteList(
pImpl->pMgr->GetType(),
SfxCallMode::RECORD|SfxCallMode::SYNCHRON, { &aValue });
+
return true;
}
diff --git a/sfx2/source/dialog/tabdlg.cxx b/sfx2/source/dialog/tabdlg.cxx
index 23113c7836ea..c9f1577f691b 100644
--- a/sfx2/source/dialog/tabdlg.cxx
+++ b/sfx2/source/dialog/tabdlg.cxx
@@ -526,6 +526,7 @@ short SfxTabDialog::Execute()
SetLOKNotifier(pViewShell);
const Size aSize = GetOptimalSize();
std::vector<vcl::LOKPayloadItem> aItems;
+ aItems.emplace_back(std::make_pair("type", "dialog"));
aItems.emplace_back(std::make_pair("size", aSize.toString()));
pViewShell->notifyWindow(GetLOKWindowId(), "created", aItems);
}
diff --git a/sfx2/source/view/lokhelper.cxx b/sfx2/source/view/lokhelper.cxx
index d39c3ac2cacb..d28e5a835dd6 100644
--- a/sfx2/source/view/lokhelper.cxx
+++ b/sfx2/source/view/lokhelper.cxx
@@ -139,8 +139,7 @@ void SfxLokHelper::notifyWindow(vcl::LOKWindowId nLOKWindowId,
if (SfxLokHelper::getViewsCount() <= 0 || nLOKWindowId == 0)
return;
-
- OString aPayload = OString("{ \"dialogId\": \"") + OString::number(nLOKWindowId) + OString("\"");
+ OString aPayload = OString("{ \"id\": \"") + OString::number(nLOKWindowId) + OString("\"");
aPayload += OString(", \"action\": \"") + OUStringToOString(rAction, RTL_TEXTENCODING_UTF8).getStr() + OString("\"");
for (const auto& rItem: rPayload)
@@ -154,22 +153,7 @@ void SfxLokHelper::notifyWindow(vcl::LOKWindowId nLOKWindowId,
aPayload += "}";
if (SfxViewShell* pViewShell = SfxViewShell::Current())
- pViewShell->libreOfficeKitViewCallback(LOK_CALLBACK_DIALOG, aPayload.getStr());
-}
-
-void SfxLokHelper::notifyWindowChild(vcl::LOKWindowId nLOKWindowId, const OUString& rAction, const Point& rPos)
-{
- if (SfxLokHelper::getViewsCount() <= 0 || nLOKWindowId == 0)
- return;
-
-
- const OString aPayload = OString("{ \"dialogId\": \"") + OString::number(nLOKWindowId) +
- OString("\", \"action\": \"") + OUStringToOString(rAction, RTL_TEXTENCODING_UTF8).getStr() +
- OString("\", \"position\": \"") + OString::number(rPos.getX()) + OString(", ") + OString::number(rPos.getY()) +
- + "\" }";
-
- if (SfxViewShell* pViewShell = SfxViewShell::Current())
- pViewShell->libreOfficeKitViewCallback(LOK_CALLBACK_DIALOG_CHILD, aPayload.getStr());
+ pViewShell->libreOfficeKitViewCallback(LOK_CALLBACK_WINDOW, aPayload.getStr());
}
void SfxLokHelper::notifyInvalidation(SfxViewShell* pThisView, const OString& rPayload)
diff --git a/sfx2/source/view/viewsh.cxx b/sfx2/source/view/viewsh.cxx
index 78c43ed863f2..23b3237e4c83 100644
--- a/sfx2/source/view/viewsh.cxx
+++ b/sfx2/source/view/viewsh.cxx
@@ -2041,11 +2041,6 @@ void SfxViewShell::notifyWindow(vcl::LOKWindowId nDialogId, const OUString& rAct
SfxLokHelper::notifyWindow(nDialogId, rAction, rPayload);
}
-void SfxViewShell::notifyWindowChild(vcl::LOKWindowId nDialogId, const OUString& rAction, const Point& rPos) const
-{
- SfxLokHelper::notifyWindowChild(nDialogId, rAction, rPos);
-}
-
uno::Reference< datatransfer::clipboard::XClipboardNotifier > SfxViewShell::GetClipboardNotifier()
{
uno::Reference< datatransfer::clipboard::XClipboardNotifier > xClipboardNotifier;
diff --git a/vcl/source/control/ctrl.cxx b/vcl/source/control/ctrl.cxx
index b3d67d438961..9b5b16a7509a 100644
--- a/vcl/source/control/ctrl.cxx
+++ b/vcl/source/control/ctrl.cxx
@@ -425,25 +425,15 @@ void Control::LogicInvalidate(const Rectangle* /*pRectangle*/)
// ignore all of those
if (comphelper::LibreOfficeKit::isActive() && !comphelper::LibreOfficeKit::isDialogPainting())
{
- // If parent is a floating window, trigger an invalidate there
- vcl::Window* pWindow = this;
- while (pWindow)
+ if (vcl::Window* pParent = GetParentWithLOKNotifier())
{
- if (pWindow->ImplIsFloatingWindow())
- {
- dynamic_cast<FloatingWindow*>(pWindow)->LogicInvalidate(nullptr);
- return;
- }
+ // invalidate the complete floating window for now
+ if (pParent->ImplIsFloatingWindow())
+ return pParent->LogicInvalidate(nullptr);
- pWindow = pWindow->GetParent();
+ const Rectangle aRect(Point(GetOutOffXPixel(), GetOutOffYPixel()), Size(GetOutputWidthPixel(), GetOutputHeightPixel()));
+ pParent->LogicInvalidate(&aRect);
}
-
- // otherwise, for now, just invalidate the whole dialog
- Dialog* pParentDlg = GetParentDialog();
-
- const Rectangle aRect(Point(GetOutOffXPixel(), GetOutOffYPixel()), Size(GetOutputWidthPixel(), GetOutputHeightPixel()));
- if (pParentDlg)
- pParentDlg->LogicInvalidate(&aRect);
}
}
diff --git a/vcl/source/window/dialog.cxx b/vcl/source/window/dialog.cxx
index 976e26751a07..aae947c805c0 100644
--- a/vcl/source/window/dialog.cxx
+++ b/vcl/source/window/dialog.cxx
@@ -883,18 +883,6 @@ bool Dialog::selectPageByUIXMLDescription(const OString& /*rUIXMLDescription*/)
return true;
}
-void Dialog::InvalidateFloatingWindow(const Point& rPos)
-{
- if (const vcl::ILibreOfficeKitNotifier* pNotifier = GetLOKNotifier())
- pNotifier->notifyWindowChild(GetLOKWindowId(), "invalidate", rPos);
-}
-
-void Dialog::CloseFloatingWindow()
-{
- if (const vcl::ILibreOfficeKitNotifier* pNotifier = GetLOKNotifier())
- pNotifier->notifyWindowChild(GetLOKWindowId(), "close", Point(0, 0));
-}
-
void Dialog::ensureRepaint()
{
// ensure repaint
diff --git a/vcl/source/window/floatwin.cxx b/vcl/source/window/floatwin.cxx
index 6a3385360ed7..ce289a804e50 100644
--- a/vcl/source/window/floatwin.cxx
+++ b/vcl/source/window/floatwin.cxx
@@ -597,10 +597,10 @@ bool FloatingWindow::Notify( NotifyEvent& rNEvt )
void FloatingWindow::LogicInvalidate(const Rectangle* /*pRectangle*/)
{
- Dialog* pParentDlg = GetParentDialog();
- if (pParentDlg)
+ if (vcl::Window* pParent = GetParentWithLOKNotifier())
{
- pParentDlg->InvalidateFloatingWindow(mpImplData->maPos);
+ const vcl::ILibreOfficeKitNotifier* pNotifier = pParent->GetLOKNotifier();
+ pNotifier->notifyWindow(GetLOKWindowId(), "invalidate");
}
}
@@ -612,14 +612,26 @@ void FloatingWindow::StateChanged( StateChangedType nType )
}
SystemWindow::StateChanged( nType );
- Dialog* pParentDlg = GetParentDialog();
- if (pParentDlg && nType == StateChangedType::InitShow && IsVisible())
- {
- pParentDlg->InvalidateFloatingWindow(mpImplData->maPos);
- }
- else if (pParentDlg && !IsVisible())
+
+ if (vcl::Window* pParent = GetParentWithLOKNotifier())
{
- pParentDlg->CloseFloatingWindow();
+ const vcl::ILibreOfficeKitNotifier* pNotifier = pParent->GetLOKNotifier();
+ if (nType == StateChangedType::InitShow && IsVisible())
+ {
+ SetLOKNotifier(pNotifier);
+
+ std::vector<vcl::LOKPayloadItem> aItems;
+ aItems.emplace_back(std::make_pair("type", "child"));
+ aItems.emplace_back(std::make_pair("parentId", OString::number(pParent->GetLOKWindowId())));
+ aItems.emplace_back(std::make_pair("size", GetSizePixel().toString()));
+ aItems.emplace_back(std::make_pair("position", mpImplData->maPos.toString()));
+ pNotifier->notifyWindow(GetLOKWindowId(), "created", aItems);
+ }
+ else if (!IsVisible())
+ {
+ pNotifier->notifyWindow(GetLOKWindowId(), "close");
+ ReleaseLOKNotifier();
+ }
}
if ( nType == StateChangedType::ControlBackground )
@@ -729,13 +741,6 @@ void FloatingWindow::StartPopupMode( const Rectangle& rRect, FloatWinPopupFlags
GrabFocus();
}
Show( true, ShowFlags::NoActivate );
-
- if (const vcl::ILibreOfficeKitNotifier* pNotifier = GetLOKNotifier())
- {
- std::vector<vcl::LOKPayloadItem> aItems;
- aItems.emplace_back(std::make_pair("size", rRect.GetSize().toString()));
- pNotifier->notifyWindow(GetLOKWindowId(), "created", aItems);
- }
}
void FloatingWindow::StartPopupMode( ToolBox* pBox, FloatWinPopupFlags nFlags )
diff --git a/vcl/source/window/window.cxx b/vcl/source/window/window.cxx
index be2855057397..36faa9a32f20 100644
--- a/vcl/source/window/window.cxx
+++ b/vcl/source/window/window.cxx
@@ -3240,27 +3240,19 @@ vcl::LOKWindowId Window::GetLOKWindowId() const
return mpWindowImpl->mnLOKWindowId;
}
-Size Window::PaintActiveFloatingWindow(VirtualDevice& rDevice) const
+vcl::Window* Window::GetParentWithLOKNotifier()
{
- Size aRet;
- ImplSVData* pSVData = ImplGetSVData();
- FloatingWindow* pFirstFloat = pSVData->maWinData.mpFirstFloat;
- if (pFirstFloat)
+ vcl::Window* pWindow = this;
+ bool found = false;
+ while (pWindow && !found)
{
- // TODO:: run a while loop here and check all the active floating
- // windows ( chained together, cf. pFirstFloat->mpNextFloat )
- // For now just assume that the active floating window is the one we
- // want to render
- if (pFirstFloat->GetParentDialog() == this)
- {
- pFirstFloat->PaintToDevice(&rDevice, Point(0, 0), Size());
- aRet = pFirstFloat->GetSizePixel();
- }
-
- pFirstFloat = nullptr;
+ if (pWindow->GetLOKNotifier())
+ found = true;
+ else
+ pWindow = pWindow->GetParent();
}
- return aRet;
+ return found ? pWindow : nullptr;
}
void Window::LogicMouseButtonDown(const MouseEvent& rMouseEvent)
@@ -3291,36 +3283,21 @@ void Window::LogicMouseButtonDownChild(const MouseEvent& rMouseEvent)
{
assert(comphelper::LibreOfficeKit::isActive());
- ImplSVData* pSVData = ImplGetSVData();
- FloatingWindow* pFirstFloat = pSVData->maWinData.mpFirstFloat;
- if (pFirstFloat && pFirstFloat->GetParentDialog() == this)
- {
- ImplWindowFrameProc(pFirstFloat->ImplGetBorderWindow(), SalEvent::ExternalMouseButtonDown, &rMouseEvent);
- }
+ ImplWindowFrameProc(ImplGetBorderWindow(), SalEvent::ExternalMouseButtonDown, &rMouseEvent);
}
void Window::LogicMouseButtonUpChild(const MouseEvent& rMouseEvent)
{
assert(comphelper::LibreOfficeKit::isActive());
- ImplSVData* pSVData = ImplGetSVData();
- FloatingWindow* pFirstFloat = pSVData->maWinData.mpFirstFloat;
- if (pFirstFloat && pFirstFloat->GetParentDialog() == this)
- {
- ImplWindowFrameProc(pFirstFloat->ImplGetBorderWindow(), SalEvent::ExternalMouseButtonUp, &rMouseEvent);
- }
+ ImplWindowFrameProc(ImplGetBorderWindow(), SalEvent::ExternalMouseButtonUp, &rMouseEvent);
}
void Window::LogicMouseMoveChild(const MouseEvent& rMouseEvent)
{
assert(comphelper::LibreOfficeKit::isActive());
- ImplSVData* pSVData = ImplGetSVData();
- FloatingWindow* pFirstFloat = pSVData->maWinData.mpFirstFloat;
- if (pFirstFloat && pFirstFloat->GetParentDialog() == this)
- {
- ImplWindowFrameProc(pFirstFloat->ImplGetBorderWindow(), SalEvent::ExternalMouseMove, &rMouseEvent);
- }
+ ImplWindowFrameProc(ImplGetBorderWindow(), SalEvent::ExternalMouseMove, &rMouseEvent);
}
void Window::LOKKeyInput(const KeyEvent& rKeyEvent)