diff options
-rw-r--r-- | comphelper/source/misc/lok.cxx | 12 | ||||
-rw-r--r-- | include/LibreOfficeKit/LibreOfficeKitEnums.h | 6 | ||||
-rw-r--r-- | include/comphelper/lok.hxx | 4 | ||||
-rw-r--r-- | include/sfx2/basedlgs.hxx | 2 | ||||
-rw-r--r-- | include/sfx2/lokhelper.hxx | 2 | ||||
-rw-r--r-- | include/vcl/ctrl.hxx | 2 | ||||
-rw-r--r-- | include/vcl/dialog.hxx | 7 | ||||
-rw-r--r-- | libreofficekit/source/gtk/lokdocview.cxx | 4 | ||||
-rw-r--r-- | sfx2/source/dialog/basedlgs.cxx | 11 | ||||
-rw-r--r-- | sfx2/source/view/lokhelper.cxx | 13 | ||||
-rw-r--r-- | vcl/source/control/ctrl.cxx | 15 | ||||
-rw-r--r-- | vcl/source/window/dialog.cxx | 2 |
12 files changed, 76 insertions, 4 deletions
diff --git a/comphelper/source/misc/lok.cxx b/comphelper/source/misc/lok.cxx index 44487da953ca..a4f60ac6c565 100644 --- a/comphelper/source/misc/lok.cxx +++ b/comphelper/source/misc/lok.cxx @@ -21,6 +21,8 @@ static bool g_bPartInInvalidation(false); static bool g_bTiledPainting(false); +static bool g_bDialogPainting(false); + static bool g_bTiledAnnotations(true); void setActive(bool bActive) @@ -53,6 +55,16 @@ bool isTiledPainting() return g_bTiledPainting; } +void setDialogPainting(bool bDialogPainting) +{ + g_bDialogPainting = bDialogPainting; +} + +bool isDialogPainting() +{ + return g_bDialogPainting; +} + void setTiledAnnotations(bool bTiledAnnotations) { g_bTiledAnnotations = bTiledAnnotations; diff --git a/include/LibreOfficeKit/LibreOfficeKitEnums.h b/include/LibreOfficeKit/LibreOfficeKitEnums.h index c3b71f3f1aad..fdad6919e0e1 100644 --- a/include/LibreOfficeKit/LibreOfficeKitEnums.h +++ b/include/LibreOfficeKit/LibreOfficeKitEnums.h @@ -521,7 +521,11 @@ typedef enum * * Here all aproperties are same as described in svxruler. */ - LOK_CALLBACK_RULER_UPDATE = 35 + LOK_CALLBACK_RULER_UPDATE = 35, + /** + * Dialog invalidation + */ + LOK_CALLBACK_DIALOG_INVALIDATE = 36 } LibreOfficeKitCallbackType; diff --git a/include/comphelper/lok.hxx b/include/comphelper/lok.hxx index 253541a80cb6..7a293ca70352 100644 --- a/include/comphelper/lok.hxx +++ b/include/comphelper/lok.hxx @@ -52,6 +52,10 @@ COMPHELPER_DLLPUBLIC void setPartInInvalidation(bool bPartInInvalidation); COMPHELPER_DLLPUBLIC bool isTiledPainting(); /// Set if we are doing tiled painting. COMPHELPER_DLLPUBLIC void setTiledPainting(bool bTiledPainting); +/// Check if we are painting the dialog. +COMPHELPER_DLLPUBLIC bool isDialogPainting(); +/// Set if we are painting the dialog. +COMPHELPER_DLLPUBLIC void setDialogPainting(bool bDialogPainting); /// Set if we want no annotations rendering COMPHELPER_DLLPUBLIC void setTiledAnnotations(bool bTiledAnnotations); /// Check if annotations rendering is turned off diff --git a/include/sfx2/basedlgs.hxx b/include/sfx2/basedlgs.hxx index cb403c78a075..7609229db2a6 100644 --- a/include/sfx2/basedlgs.hxx +++ b/include/sfx2/basedlgs.hxx @@ -105,6 +105,8 @@ public: SfxBindings& GetBindings() { return *pBindings; } + virtual void LogicInvalidate(const tools::Rectangle* pRectangle) override; + DECL_LINK(TimerHdl, Timer *, void); }; diff --git a/include/sfx2/lokhelper.hxx b/include/sfx2/lokhelper.hxx index 9cf98fa40c88..514726ee1e0b 100644 --- a/include/sfx2/lokhelper.hxx +++ b/include/sfx2/lokhelper.hxx @@ -40,6 +40,8 @@ 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 const* pOtherView, int nType, const OString& rKey, const OString& rPayload); + /// Emits a LOK_CALLBACK_DIALOG_INVALIDATE with 'invalidate' action + static void notifyDialogInvalidation(const OUString& rPayload); /// Emits a LOK_CALLBACK_INVALIDATE_TILES, but tweaks it according to setOptionalFeatures() if needed. static void notifyInvalidation(SfxViewShell const* pThisView, const OString& rPayload); /// A special value to signify 'infinity'. diff --git a/include/vcl/ctrl.hxx b/include/vcl/ctrl.hxx index cb68cfe8f78a..8e2926ae1774 100644 --- a/include/vcl/ctrl.hxx +++ b/include/vcl/ctrl.hxx @@ -44,6 +44,8 @@ private: SAL_DLLPRIVATE void ImplInitControlData(); + virtual void LogicInvalidate(const tools::Rectangle* pRectangle) override; + Control (const Control &) = delete; Control & operator= (const Control &) = delete; diff --git a/include/vcl/dialog.hxx b/include/vcl/dialog.hxx index 457943c08d37..7a3aa4c0c1c0 100644 --- a/include/vcl/dialog.hxx +++ b/include/vcl/dialog.hxx @@ -72,10 +72,14 @@ private: protected: using Window::ImplInit; SAL_DLLPRIVATE void ImplInit( vcl::Window* pParent, WinBits nStyle, InitFlag eFlag = InitFlag::Default ); + OUString maID; // identifier for this dialog public: SAL_DLLPRIVATE bool IsInClose() const { return mbInClose; } virtual void doDeferredInit(WinBits nBits) override; + virtual void LogicInvalidate(const tools::Rectangle* pRectangle) override { (void)pRectangle; } + // Paints the current dialog to the given virtual device + void paintDialog(VirtualDevice& rDevice); protected: explicit Dialog( WindowType nType ); @@ -114,9 +118,6 @@ public: virtual void PrePaint(vcl::RenderContext& rRenderContext) override; virtual void PostPaint(vcl::RenderContext& rRenderContext) override; - // Paints the current dialog to the given virtual device - void paintDialog(VirtualDevice& rDevice); - // ensureRepaint - triggers Application::Yield until the dialog is // completely repainted. Sometimes needed for dialogs showing progress // during actions diff --git a/libreofficekit/source/gtk/lokdocview.cxx b/libreofficekit/source/gtk/lokdocview.cxx index 3d4b0fa8279d..4700cffadab6 100644 --- a/libreofficekit/source/gtk/lokdocview.cxx +++ b/libreofficekit/source/gtk/lokdocview.cxx @@ -436,6 +436,8 @@ callbackTypeToString (int nType) return "LOK_CALLBACK_COMMENT"; case LOK_CALLBACK_RULER_UPDATE: return "LOK_CALLBACK_RULER_UPDATE"; + case LOK_CALLBACK_DIALOG_INVALIDATE: + return "LOK_CALLBACK_DIALOG_INVALIDATE"; } g_assert(false); return nullptr; @@ -1427,6 +1429,8 @@ callback (gpointer pData) break; case LOK_CALLBACK_RULER_UPDATE: g_signal_emit(pCallback->m_pDocView, doc_view_signals[RULER], 0, pCallback->m_aPayload.c_str()); + case LOK_CALLBACK_DIALOG_INVALIDATE: + // TODO: Register the signal with lokdocview and emit it break; default: g_assert(false); diff --git a/sfx2/source/dialog/basedlgs.cxx b/sfx2/source/dialog/basedlgs.cxx index fceeab0d7e50..0d2d90d142de 100644 --- a/sfx2/source/dialog/basedlgs.cxx +++ b/sfx2/source/dialog/basedlgs.cxx @@ -18,7 +18,10 @@ */ #include <stdlib.h> + +#include <comphelper/lok.hxx> #include <comphelper/processfactory.hxx> + #include <osl/file.hxx> #include <vcl/fixed.hxx> #include <vcl/help.hxx> @@ -29,6 +32,7 @@ #include <vcl/idle.hxx> #include <sfx2/basedlgs.hxx> +#include <sfx2/lokhelper.hxx> #include <sfx2/viewfrm.hxx> #include <sfx2/tabdlg.hxx> #include <sfx2/app.hxx> @@ -390,6 +394,13 @@ void SfxModelessDialog::FillInfo(SfxChildWinInfo& rInfo) const } +void SfxModelessDialog::LogicInvalidate(const tools::Rectangle* /*pRectangle*/) +{ + if (!comphelper::LibreOfficeKit::isDialogPainting()) + SfxLokHelper::notifyDialogInvalidation(maID); +} + + bool SfxFloatingWindow::EventNotify( NotifyEvent& rEvt ) /* [Description] diff --git a/sfx2/source/view/lokhelper.cxx b/sfx2/source/view/lokhelper.cxx index 1597174af5b0..d63d0ad2fb4f 100644 --- a/sfx2/source/view/lokhelper.cxx +++ b/sfx2/source/view/lokhelper.cxx @@ -144,6 +144,19 @@ void SfxLokHelper::notifyOtherViews(SfxViewShell* pThisView, int nType, const OS } } +void SfxLokHelper::notifyDialogInvalidation(const OUString& rDialogID) +{ + if (SfxLokHelper::getViewsCount() <= 0) + return; + + SfxViewShell* pViewShell = SfxViewShell::GetFirst(); + while (pViewShell) + { + pViewShell->libreOfficeKitViewCallback(LOK_CALLBACK_DIALOG_INVALIDATE, OUStringToOString(rDialogID, RTL_TEXTENCODING_UTF8).getStr()); + pViewShell = SfxViewShell::GetNext(*pViewShell); + } +} + void SfxLokHelper::notifyInvalidation(SfxViewShell const* pThisView, const OString& rPayload) { OStringBuffer aBuf; diff --git a/vcl/source/control/ctrl.cxx b/vcl/source/control/ctrl.cxx index 5df29a0d3560..3bd877ea7162 100644 --- a/vcl/source/control/ctrl.cxx +++ b/vcl/source/control/ctrl.cxx @@ -18,11 +18,13 @@ */ #include <comphelper/processfactory.hxx> +#include <comphelper/lok.hxx> #include <vcl/svapp.hxx> #include <vcl/event.hxx> #include <vcl/ctrl.hxx> #include <vcl/decoview.hxx> +#include <vcl/dialog.hxx> #include <vcl/salnativewidgets.hxx> #include <vcl/settings.hxx> #include <vcl/uitest/logger.hxx> @@ -412,6 +414,19 @@ void Control::ImplInitSettings() ApplySettings(*this); } +void Control::LogicInvalidate(const tools::Rectangle* /*pRectangle*/) +{ + // Several repaint, resize invalidations are emitted when we are painting, + // ignore all of those + if (comphelper::LibreOfficeKit::isActive() && !comphelper::LibreOfficeKit::isDialogPainting()) + { + // For now just invalidate the whole dialog + Dialog* pParentDlg = GetParentDialog(); + if (pParentDlg) + pParentDlg->LogicInvalidate(nullptr); + } +} + tools::Rectangle Control::DrawControlText( OutputDevice& _rTargetDevice, const tools::Rectangle& rRect, const OUString& _rStr, DrawTextFlags _nStyle, MetricVector* _pVector, OUString* _pDisplayText, const Size* i_pDeviceSize ) const { diff --git a/vcl/source/window/dialog.cxx b/vcl/source/window/dialog.cxx index 679c83ba462b..b4e5b6a667fb 100644 --- a/vcl/source/window/dialog.cxx +++ b/vcl/source/window/dialog.cxx @@ -514,6 +514,7 @@ void Dialog::doDeferredInit(WinBits nBits) Dialog::Dialog(vcl::Window* pParent, const OUString& rID, const OUString& rUIXMLDescription) : SystemWindow(WindowType::DIALOG) , mnInitFlag(InitFlag::Default) + , maID(rID) { ImplInitDialogData(); loadUI(pParent, OUStringToOString(rID, RTL_TEXTENCODING_UTF8), rUIXMLDescription); @@ -522,6 +523,7 @@ Dialog::Dialog(vcl::Window* pParent, const OUString& rID, const OUString& rUIXML Dialog::Dialog(vcl::Window* pParent, const OUString& rID, const OUString& rUIXMLDescription, WindowType nType, InitFlag eFlag) : SystemWindow(nType) , mnInitFlag(eFlag) + , maID(rID) { ImplInitDialogData(); loadUI(pParent, OUStringToOString(rID, RTL_TEXTENCODING_UTF8), rUIXMLDescription); |