include/sfx2/viewsh.hxx | 2 + sc/source/ui/inc/gridwin.hxx | 3 ++ sc/source/ui/inc/tabview.hxx | 5 +++ sc/source/ui/inc/tabvwsh.hxx | 6 ++++ sc/source/ui/inc/viewdata.hxx | 2 + sc/source/ui/view/gridwin.cxx | 1 sc/source/ui/view/gridwin4.cxx | 15 ++++++++--- sc/source/ui/view/tabview5.cxx | 46 ++++++++++++++++++++++++++++++++++++ sc/source/ui/view/viewdata.cxx | 6 ++++ sfx2/source/view/viewsh.cxx | 9 +++++++ svx/source/svdraw/sdrpagewindow.cxx | 46 +++++++++++++++++++++++++++++++----- 11 files changed, 131 insertions(+), 10 deletions(-)
New commits: commit 1b89b61bbf66472e633ee45e05b86c4030575cf0 Author: Marco Cecchetti <[email protected]> Date: Sun Jan 1 18:02:51 2017 +0100 LOK: Calc: invalidation on insert image Change-Id: Ib0ec104b14385473a2a7f7dc2a33558d998996fa Reviewed-on: https://gerrit.libreoffice.org/32690 Reviewed-by: Marco Cecchetti <[email protected]> Tested-by: Marco Cecchetti <[email protected]> diff --git a/include/sfx2/viewsh.hxx b/include/sfx2/viewsh.hxx index e2c0b75..a20672f 100644 --- a/include/sfx2/viewsh.hxx +++ b/include/sfx2/viewsh.hxx @@ -342,6 +342,8 @@ public: void NotifyOtherView(OutlinerViewShell* pOtherShell, int nType, const OString& rKey, const OString& rPayload) override; /// Ask this view to send its cursor position to pViewShell. virtual void NotifyCursor(SfxViewShell* /*pViewShell*/) const; + virtual bool UseLOKOutputDevice(const OutputDevice* pOutputDevice) const; + virtual void InvalidateWindows(std::function<void (vcl::Window& )>& f); }; diff --git a/sc/source/ui/inc/gridwin.hxx b/sc/source/ui/inc/gridwin.hxx index 0432532..0dc9599 100644 --- a/sc/source/ui/inc/gridwin.hxx +++ b/sc/source/ui/inc/gridwin.hxx @@ -127,6 +127,7 @@ class ScGridWindow : public vcl::Window, public DropTargetHelper, public DragSou std::unique_ptr<sc::SpellCheckContext> mpSpellCheckCxt; + VclPtr<OutputDevice> mpLOKOutputDevice; ScViewData* pViewData; ScSplitPos eWhich; ScHSplitPos eHWhich; @@ -435,6 +436,8 @@ public: long nTileHeight); void updateLibreOfficeKitCellCursor(SfxViewShell* pOtherShell) const; + const OutputDevice* GetLOKVirtualDevice() const { return mpLOKOutputDevice.get(); } + protected: void ImpCreateOverlayObjects(); void ImpDestroyOverlayObjects(); diff --git a/sc/source/ui/inc/tabview.hxx b/sc/source/ui/inc/tabview.hxx index cbb26bf..92bd6fe 100644 --- a/sc/source/ui/inc/tabview.hxx +++ b/sc/source/ui/inc/tabview.hxx @@ -134,6 +134,7 @@ private: ScHeaderFunctionSet aHdrFunc; ScDrawView* pDrawView; + std::unique_ptr<FmFormView> pLOKDrawView; Size aFrameSize; // passed on as for DoResize Point aBorderPos; @@ -328,6 +329,9 @@ public: // gegen CLOKs SdrView* GetSdrView() { return pDrawView; } + FmFormView* GetLOKDrawView(); + bool UseLOKOutputDevice(const OutputDevice* pOutputDevice) const; + bool IsMinimized() const { return bMinimized; } /** @@ -582,6 +586,7 @@ public: /// @see ScModelObj::getRowColumnHeaders(). OUString getRowColumnHeaders(const Rectangle& rRectangle); void OnLOKNoteStateChanged(const ScAddress& rPos); + void ForEachGridWindow(std::function<void (vcl::Window& )>& f); }; #endif diff --git a/sc/source/ui/inc/tabvwsh.hxx b/sc/source/ui/inc/tabvwsh.hxx index 6d24e07..c9134a6 100644 --- a/sc/source/ui/inc/tabvwsh.hxx +++ b/sc/source/ui/inc/tabvwsh.hxx @@ -394,6 +394,12 @@ public: int getPart() const override; /// See SfxViewShell::NotifyCursor(). void NotifyCursor(SfxViewShell* pViewShell) const override; + /// See SfxViewShell:: UseLOKOutputDevice(). + virtual bool UseLOKOutputDevice(const OutputDevice* pOutputDevice) const override + { return ScTabView::UseLOKOutputDevice(pOutputDevice); } + /// See SfxViewShell::InvalidateWindows(). + virtual void InvalidateWindows(std::function<void (vcl::Window& )>& f) override + { ScTabView::ForEachGridWindow(f); } }; #endif diff --git a/sc/source/ui/inc/viewdata.hxx b/sc/source/ui/inc/viewdata.hxx index d3b80fc..8175b91 100644 --- a/sc/source/ui/inc/viewdata.hxx +++ b/sc/source/ui/inc/viewdata.hxx @@ -103,6 +103,7 @@ class ScExtDocOptions; class ScViewData; class ScMarkData; class ScGridWindow; +class FmFormView; class ScViewDataTable // per-sheet data { @@ -252,6 +253,7 @@ public: const ScGridWindow* GetActiveWin() const; ScDrawView* GetScDrawView(); // from View bool IsMinimized(); // from View + FmFormView* GetLOKDrawView(); // from View void UpdateInputHandler( bool bForce = false, bool bStopEditing = true ); diff --git a/sc/source/ui/view/gridwin.cxx b/sc/source/ui/view/gridwin.cxx index bbb18e0..96b3036 100644 --- a/sc/source/ui/view/gridwin.cxx +++ b/sc/source/ui/view/gridwin.cxx @@ -544,6 +544,7 @@ void ScGridWindow::dispose() { ImpDestroyOverlayObjects(); + mpLOKOutputDevice.disposeAndClear(); mpFilterBox.disposeAndClear(); mpFilterFloat.disposeAndClear(); mpNoteMarker.reset(); diff --git a/sc/source/ui/view/gridwin4.cxx b/sc/source/ui/view/gridwin4.cxx index e9b9e67..1ca1503 100644 --- a/sc/source/ui/view/gridwin4.cxx +++ b/sc/source/ui/view/gridwin4.cxx @@ -1215,12 +1215,19 @@ void ScGridWindow::PaintTile( VirtualDevice& rDevice, // setup the SdrPage so that drawinglayer works correctly ScDrawLayer* pModel = pDoc->GetDrawLayer(); - std::unique_ptr<FmFormView> pDrawView; + if (pModel) { - pDrawView.reset(new FmFormView(pModel, &rDevice)); - pDrawView->ShowSdrPage(pDrawView->GetModel()->GetPage(nTab)); - aOutputData.SetDrawView( pDrawView.get() ); + FmFormView* pDrawView = pViewData->GetLOKDrawView(); + if (pDrawView) + { + if (mpLOKOutputDevice) + pDrawView->DeleteWindowFromPaintView(mpLOKOutputDevice.get()); + mpLOKOutputDevice.reset(&rDevice); + pDrawView->AddWindowToPaintView(&rDevice, nullptr); + pDrawView->ShowSdrPage(pDrawView->GetModel()->GetPage(nTab)); + aOutputData.SetDrawView( pDrawView ); + } } // draw the content diff --git a/sc/source/ui/view/tabview5.cxx b/sc/source/ui/view/tabview5.cxx index 49650b6..f743c2a 100644 --- a/sc/source/ui/view/tabview5.cxx +++ b/sc/source/ui/view/tabview5.cxx @@ -268,6 +268,40 @@ void ScTabView::MakeDrawView( TriState nForceDesignMode ) } } +FmFormView* ScTabView::GetLOKDrawView() +{ + if (!comphelper::LibreOfficeKit::isActive()) + return nullptr; + + if (!pLOKDrawView) + { + ScDrawLayer* pLayer = aViewData.GetDocument()->GetDrawLayer(); + OSL_ENSURE(pLayer, "no Draw Layer available"); + pLOKDrawView.reset(new FmFormView(pLayer, nullptr)); + } + + return pLOKDrawView.get(); +} + +bool ScTabView::UseLOKOutputDevice(const OutputDevice* pOutputDevice) const +{ + if (!comphelper::LibreOfficeKit::isActive()) + return false; + + if (pOutputDevice) + { + for (int i = 0; i < 4; ++i) + { + if (pGridWin[i]) + { + if (pGridWin[i]->GetLOKVirtualDevice() == pOutputDevice) + return true; + } + } + } + return false; +} + void ScTabView::DoAddWin( ScGridWindow* pWin ) { if (pDrawView) @@ -278,6 +312,7 @@ void ScTabView::DoAddWin( ScGridWindow* pWin ) } } + void ScTabView::TabChanged( bool bSameTabButMoved ) { if (pDrawView) @@ -692,4 +727,15 @@ void ScTabView::OnLOKNoteStateChanged(const ScAddress& rPos) } } +void ScTabView::ForEachGridWindow(std::function<void (vcl::Window& )>& f) +{ + for (auto& pWin: pGridWin) + { + if (pWin && pWin->IsVisible()) + { + f(*pWin); + } + } +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/ui/view/viewdata.cxx b/sc/source/ui/view/viewdata.cxx index 86814e7..b5180d4 100644 --- a/sc/source/ui/view/viewdata.cxx +++ b/sc/source/ui/view/viewdata.cxx @@ -2205,6 +2205,12 @@ ScDrawView* ScViewData::GetScDrawView() return pView->GetScDrawView(); } +FmFormView* ScViewData::GetLOKDrawView() +{ + OSL_ENSURE( pView, "GetLOKDrawView() without View" ); + return pView->GetLOKDrawView(); +} + bool ScViewData::IsMinimized() { OSL_ENSURE( pView, "IsMinimized() without View" ); diff --git a/sfx2/source/view/viewsh.cxx b/sfx2/source/view/viewsh.cxx index e308a1b..27758f3 100644 --- a/sfx2/source/view/viewsh.cxx +++ b/sfx2/source/view/viewsh.cxx @@ -1644,6 +1644,15 @@ void SfxViewShell::NotifyCursor(SfxViewShell* /*pViewShell*/) const { } +bool SfxViewShell::UseLOKOutputDevice(const OutputDevice* /*pOutputDevice*/) const +{ + return false; +} + +void SfxViewShell::InvalidateWindows(std::function<void (vcl::Window& )>& /*f*/) +{ +} + void SfxViewShell::setTiledSearching(bool bTiledSearching) { pImp->m_bTiledSearching = bTiledSearching; diff --git a/svx/source/svdraw/sdrpagewindow.cxx b/svx/source/svdraw/sdrpagewindow.cxx index 642c867..1932215 100644 --- a/svx/source/svdraw/sdrpagewindow.cxx +++ b/svx/source/svdraw/sdrpagewindow.cxx @@ -37,6 +37,9 @@ #include <svx/fmview.hxx> #include <basegfx/matrix/b2dhommatrix.hxx> +#include <LibreOfficeKit/LibreOfficeKitEnums.h> +#include <comphelper/lok.hxx> +#include <sfx2/lokhelper.hxx> using namespace ::com::sun::star; @@ -404,14 +407,10 @@ void SdrPageWindow::RedrawLayer( const SdrLayerID* pId, sdr::contact::ViewObject // reset redirector GetObjectContact().SetViewObjectContactRedirector(nullptr); } - -// Invalidate call, used from ObjectContact(OfPageView) in InvalidatePartOfView(...) -void SdrPageWindow::InvalidatePageWindow(const basegfx::B2DRange& rRange) -{ - if(GetPageView().IsVisible() && GetPaintWindow().OutputToWindow()) +namespace { + void lcl_InvalidateWindow(const basegfx::B2DRange& rRange, vcl::Window& rWindow) { const SvtOptionsDrawinglayer aDrawinglayerOpt; - vcl::Window& rWindow(static_cast< vcl::Window& >(GetPaintWindow().GetOutputDevice())); basegfx::B2DRange aDiscreteRange(rRange); aDiscreteRange.transform(rWindow.GetViewTransformation()); @@ -433,6 +432,41 @@ void SdrPageWindow::InvalidatePageWindow(const basegfx::B2DRange& rRange) rWindow.Invalidate(aVCLDiscreteRectangle, InvalidateFlags::NoErase); rWindow.EnableMapMode(bWasMapModeEnabled); } +} // end of anonymous namespace + +// Invalidate call, used from ObjectContact(OfPageView) in InvalidatePartOfView(...) +void SdrPageWindow::InvalidatePageWindow(const basegfx::B2DRange& rRange) +{ + if (!GetPageView().IsVisible()) + return; + SdrPaintWindow& rPaintWindow = GetPaintWindow(); + + if (comphelper::LibreOfficeKit::isActive()) + { + SfxViewShell* pCurViewShell = SfxViewShell::Current(); + if (pCurViewShell) + { + OutputDevice& rOutDev = rPaintWindow.GetOutputDevice(); + if (pCurViewShell->UseLOKOutputDevice(&rOutDev)) + { + std::function<void(vcl::Window&)> lInvalidateWindow = + std::bind(lcl_InvalidateWindow, rRange, std::placeholders::_1); + + SfxViewShell* pViewShell = SfxViewShell::GetFirst(); + while (pViewShell) + { + pViewShell->InvalidateWindows(lInvalidateWindow); + pViewShell = SfxViewShell::GetNext(*pViewShell); + } + } + } + } + + if(rPaintWindow.OutputToWindow()) + { + vcl::Window& rWindow(static_cast< vcl::Window& >(rPaintWindow.GetOutputDevice())); + lcl_InvalidateWindow(rRange, rWindow); + } } // ObjectContact section _______________________________________________ Libreoffice-commits mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
