desktop/inc/lib/init.hxx | 3 - desktop/source/lib/init.cxx | 14 ++++- include/editeng/outliner.hxx | 2 include/sfx2/lokhelper.hxx | 12 +++- include/sfx2/viewsh.hxx | 2 include/svl/undo.hxx | 2 sc/source/ui/docshell/dbdocfun.cxx | 4 - sc/source/ui/docshell/docfunc.cxx | 5 +- sc/source/ui/docshell/docsh4.cxx | 5 +- sc/source/ui/docshell/olinefun.cxx | 9 +-- sc/source/ui/inc/tabvwsh.hxx | 5 -- sc/source/ui/undo/undoblk.cxx | 8 +-- sc/source/ui/undo/undodat.cxx | 10 ++-- sc/source/ui/view/dbfunc3.cxx | 7 +- sc/source/ui/view/gridwin.cxx | 5 +- sc/source/ui/view/gridwin4.cxx | 4 - sc/source/ui/view/tabview4.cxx | 2 sc/source/ui/view/tabview5.cxx | 3 - sc/source/ui/view/tabvwsh4.cxx | 15 ++++-- sc/source/ui/view/tabvwshc.cxx | 14 +---- sc/source/ui/view/viewfun2.cxx | 4 - sc/source/ui/view/viewfunc.cxx | 17 ++++--- sd/source/ui/sidebar/SlideBackground.cxx | 10 ++-- sfx2/source/view/lokcharthelper.cxx | 4 - sfx2/source/view/lokhelper.cxx | 75 ++++++++++++++++++++++++++----- sfx2/source/view/viewimp.hxx | 1 sfx2/source/view/viewsh.cxx | 19 ++++++- starmath/source/smmod.cxx | 3 + sw/source/core/doc/docredln.cxx | 3 - 29 files changed, 186 insertions(+), 81 deletions(-)
New commits: commit b0da52d19ed40dd0871f208eb7387ec1d8252de4 Author: Tor Lillqvist <t...@collabora.com> AuthorDate: Tue Jun 2 12:46:51 2020 +0300 Commit: Tor Lillqvist <t...@collabora.com> CommitDate: Thu Jun 25 10:31:38 2020 +0200 tdf#128502: Try to support multiple documents in LibreOfficeKit-using process The LibreOfficeKit-specific code typically has assumed that all the "views" (SfxViewShell instances) are for the same document, because all LibreOfficeKit-based application processes (including the "kit" processes in Online and the iOS app) so far have only had one document open at a time. It is now possible to pass several document file names on the command line to gtktiledviewer and that is an easy way to demonstrate how badly it still works even with this patch. Introduce a unique numeric document id that is increased in the LibLODocument_Impl constructor. Add APIs to access that. When iterating over views, try to skip views that are not of the document visible in the "current" view, if we know what the "current" view is. Also add a couple of FIXMEs at places where it is a bit unclear (to me) whether it is correct to iterate over all views, or whether only views for the "current" document are what we would want. Change-Id: I6e2d85e61a6743ca110500bf48b3d80b2027dfb1 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/97085 Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com> Reviewed-by: Tor Lillqvist <t...@collabora.com> diff --git a/desktop/inc/lib/init.hxx b/desktop/inc/lib/init.hxx index 5957f56ed344..237a17a59eee 100644 --- a/desktop/inc/lib/init.hxx +++ b/desktop/inc/lib/init.hxx @@ -149,8 +149,9 @@ namespace desktop { css::uno::Reference<css::lang::XComponent> mxComponent; std::shared_ptr< LibreOfficeKitDocumentClass > m_pDocumentClass; std::map<size_t, std::shared_ptr<CallbackFlushHandler>> mpCallbackFlushHandlers; + const int mnDocumentId; - explicit LibLODocument_Impl(const css::uno::Reference <css::lang::XComponent> &xComponent); + explicit LibLODocument_Impl(const css::uno::Reference <css::lang::XComponent> &xComponent, int nDocumentId = -1); ~LibLODocument_Impl(); }; diff --git a/desktop/source/lib/init.cxx b/desktop/source/lib/init.cxx index 2e5f9380fa44..568363fea289 100644 --- a/desktop/source/lib/init.cxx +++ b/desktop/source/lib/init.cxx @@ -1207,8 +1207,9 @@ VclPtr<Window> getSidebarWindow() } // anonymous namespace -LibLODocument_Impl::LibLODocument_Impl(const uno::Reference <css::lang::XComponent> &xComponent) +LibLODocument_Impl::LibLODocument_Impl(const uno::Reference <css::lang::XComponent> &xComponent, int nDocumentId) : mxComponent(xComponent) + , mnDocumentId(nDocumentId) { if (!(m_pDocumentClass = gDocumentClass.lock())) { @@ -2150,6 +2151,8 @@ static LibreOfficeKitDocument* lo_documentLoadWithOptions(LibreOfficeKit* pThis, SolarMutexGuard aGuard; + static int nDocumentIdCounter = 0; + LibLibreOffice_Impl* pLib = static_cast<LibLibreOffice_Impl*>(pThis); pLib->maLastExceptionMsg.clear(); @@ -2246,7 +2249,10 @@ static LibreOfficeKitDocument* lo_documentLoadWithOptions(LibreOfficeKit* pThis, return nullptr; } - LibLODocument_Impl* pDocument = new LibLODocument_Impl(xComponent); + LibLODocument_Impl* pDocument = new LibLODocument_Impl(xComponent, nDocumentIdCounter++); + + // Do we know that after loading the document, its initial view is the "current" view? + SfxLokHelper::setDocumentIdOfView(pDocument->mnDocumentId); if (pLib->mpCallback) { int nState = doc_getSignatureState(pDocument); @@ -3137,7 +3143,9 @@ static void doc_paintPartTile(LibreOfficeKitDocument* pThis, { // tile painting always needs a SfxViewShell::Current(), but actually // it does not really matter which one - all of them should paint the - // same thing. + // same thing. It's important to get a view for the correct document, + // though. + // doc_getViewsCount() returns the count of views for the document in the current view. int viewCount = doc_getViewsCount(pThis); if (viewCount == 0) return; diff --git a/include/editeng/outliner.hxx b/include/editeng/outliner.hxx index 68b13a311f36..05a1aae85851 100644 --- a/include/editeng/outliner.hxx +++ b/include/editeng/outliner.hxx @@ -376,6 +376,8 @@ class SAL_NO_VTABLE SAL_DLLPUBLIC_RTTI OutlinerViewShell public: virtual void libreOfficeKitViewCallback(int nType, const char* pPayload) const = 0; virtual ViewShellId GetViewShellId() const = 0; + virtual void SetDocId(ViewShellDocId nId) = 0; + virtual ViewShellDocId GetDocId() const = 0; /// Wrapper around SfxLokHelper::notifyOtherViews(). virtual void NotifyOtherViews(int nType, const OString& rKey, const OString& rPayload) = 0; /// Wrapper around SfxLokHelper::notifyOtherView(). diff --git a/include/sfx2/lokhelper.hxx b/include/sfx2/lokhelper.hxx index 63c88b988b2e..d88ae25adcff 100644 --- a/include/sfx2/lokhelper.hxx +++ b/include/sfx2/lokhelper.hxx @@ -53,8 +53,12 @@ public: static int getView(SfxViewShell* pViewShell = nullptr); /// Get the number of views of the current object shell. static std::size_t getViewsCount(); - /// Get viewIds of all existing views. + /// Get viewIds of views of the current object shell. static bool getViewIds(int* pArray, size_t nSize); + /// Set the document id of the currently active view + static void setDocumentIdOfView(int nId); + /// Get the document id for a view + static int getDocumentIdOfView(int nViewId); /// Get the default language that should be used for views static LanguageTag getDefaultLanguage(); /// Set language of the given view. @@ -70,7 +74,7 @@ public: /// Iterate over any view shell, except pThisViewShell, passing it to the f function. template<typename ViewShellType, typename FunctionType> static void forEachOtherView(ViewShellType* pThisViewShell, FunctionType f); - /// Invoke the LOK callback of all views except pThisView, with a payload of rKey-rPayload. + /// Invoke the LOK callback of all other views showing the same document as pThisView, with a payload of rKey-rPayload. 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); @@ -83,7 +87,7 @@ public: const std::vector<vcl::LOKPayloadItem>& rPayload = std::vector<vcl::LOKPayloadItem>()); /// Emits a LOK_CALLBACK_DOCUMENT_SIZE_CHANGED - if @bInvalidateAll - first invalidates all parts static void notifyDocumentSizeChanged(SfxViewShell const* pThisView, const OString& rPayload, vcl::ITiledRenderable* pDoc, bool bInvalidateAll = true); - /// Emits a LOK_CALLBACK_DOCUMENT_SIZE_CHANGED for all views - if @bInvalidateAll - first invalidates all parts + /// Emits a LOK_CALLBACK_DOCUMENT_SIZE_CHANGED for all views of the same document - if @bInvalidateAll - first invalidates all parts static void notifyDocumentSizeChangedAllViews(vcl::ITiledRenderable* pDoc, bool bInvalidateAll = true); /// Emits a LOK_CALLBACK_INVALIDATE_TILES, but tweaks it according to setOptionalFeatures() if needed. static void notifyInvalidation(SfxViewShell const* pThisView, const OString& rPayload); @@ -118,7 +122,7 @@ void SfxLokHelper::forEachOtherView(ViewShellType* pThisViewShell, FunctionType while (pViewShell) { auto pOtherViewShell = dynamic_cast<ViewShellType*>(pViewShell); - if (pOtherViewShell != nullptr && pOtherViewShell != pThisViewShell) + if (pOtherViewShell != nullptr && pOtherViewShell != pThisViewShell && pOtherViewShell->GetDocId() == pThisViewShell->GetDocId()) { f(pOtherViewShell); } diff --git a/include/sfx2/viewsh.hxx b/include/sfx2/viewsh.hxx index 6628b7f822aa..a54909ace2b5 100644 --- a/include/sfx2/viewsh.hxx +++ b/include/sfx2/viewsh.hxx @@ -341,6 +341,8 @@ public: virtual void dumpAsXml(struct _xmlTextWriter* pWriter) const; /// See OutlinerViewShell::GetViewShellId(). ViewShellId GetViewShellId() const override; + void SetDocId(ViewShellDocId nId) override; + ViewShellDocId GetDocId() const override; /// See OutlinerViewShell::NotifyOtherViews(). void NotifyOtherViews(int nType, const OString& rKey, const OString& rPayload) override; /// See OutlinerViewShell::NotifyOtherView(). diff --git a/include/svl/undo.hxx b/include/svl/undo.hxx index c2862b886c6f..1ca989fd4a5d 100644 --- a/include/svl/undo.hxx +++ b/include/svl/undo.hxx @@ -28,6 +28,8 @@ #include <vector> typedef o3tl::strong_int<sal_Int32, struct ViewShellIdTag> ViewShellId; +typedef o3tl::strong_int<int, struct ViewShellDocIdTag> ViewShellDocId; + class SVL_DLLPUBLIC SfxRepeatTarget { diff --git a/sc/source/ui/docshell/dbdocfun.cxx b/sc/source/ui/docshell/dbdocfun.cxx index 5060c53ff205..3ad4fc6032eb 100644 --- a/sc/source/ui/docshell/dbdocfun.cxx +++ b/sc/source/ui/docshell/dbdocfun.cxx @@ -620,7 +620,8 @@ bool ScDBDocFunc::Query( SCTAB nTab, const ScQueryParam& rQueryParam, ScDocument& rDoc = rDocShell.GetDocument(); - if (ScTabViewShell::isAnyEditViewInRange(/*bColumns*/ false, rQueryParam.nRow1, rQueryParam.nRow2)) + ScTabViewShell* pViewSh = rDocShell.GetBestViewShell(); + if (pViewSh && ScTabViewShell::isAnyEditViewInRange(pViewSh, /*bColumns*/ false, rQueryParam.nRow1, rQueryParam.nRow2)) { return false; } @@ -935,7 +936,6 @@ bool ScDBDocFunc::Query( SCTAB nTab, const ScQueryParam& rQueryParam, pOld, bDoSize, pAdvSource ) ); } - ScTabViewShell* pViewSh = rDocShell.GetBestViewShell(); if ( pViewSh ) { // could there be horizontal autofilter ? diff --git a/sc/source/ui/docshell/docfunc.cxx b/sc/source/ui/docshell/docfunc.cxx index 38af064a918c..ffb74bc7411c 100644 --- a/sc/source/ui/docshell/docfunc.cxx +++ b/sc/source/ui/docshell/docfunc.cxx @@ -139,6 +139,7 @@ static void lcl_PaintAbove( ScDocShell& rDocShell, const ScRange& rRange ) bool ScDocFunc::AdjustRowHeight( const ScRange& rRange, bool bPaint ) { ScDocument& rDoc = rDocShell.GetDocument(); + SfxViewShell* pSomeViewForThisDoc = rDocShell.GetBestViewShell(false); if ( rDoc.IsImportingXML() ) { // for XML import, all row heights are updated together after importing @@ -159,7 +160,7 @@ bool ScDocFunc::AdjustRowHeight( const ScRange& rRange, bool bPaint ) while (pViewShell) { ScTabViewShell* pTabViewShell = dynamic_cast<ScTabViewShell*>(pViewShell); - if (pTabViewShell) + if (pTabViewShell && pTabViewShell->GetDocId() == pSomeViewForThisDoc->GetDocId()) { pTabViewShell->GetViewData().GetLOKHeightHelper(nTab)->invalidateByIndex(nStartRow); } @@ -181,7 +182,7 @@ bool ScDocFunc::AdjustRowHeight( const ScRange& rRange, bool bPaint ) PaintPartFlags::Grid | PaintPartFlags::Left); if (comphelper::LibreOfficeKit::isActive()) - ScTabViewShell::notifyAllViewsHeaderInvalidation(ROW_HEADER, nTab); + ScTabViewShell::notifyAllViewsHeaderInvalidation(pSomeViewForThisDoc, ROW_HEADER, nTab); return bChanged; } diff --git a/sc/source/ui/docshell/docsh4.cxx b/sc/source/ui/docshell/docsh4.cxx index 8d9d5ce9cb12..6cce2f468b4d 100644 --- a/sc/source/ui/docshell/docsh4.cxx +++ b/sc/source/ui/docshell/docsh4.cxx @@ -2528,10 +2528,13 @@ void ScDocShell::LOKCommentNotify(LOKCommentNotificationType nType, const ScDocu boost::property_tree::write_json(aStream, aTree); std::string aPayload = aStream.str(); + ScViewData* pViewData = GetViewData(); + SfxViewShell* pThisViewShell = ( pViewData ? pViewData->GetViewShell() : nullptr ); SfxViewShell* pViewShell = SfxViewShell::GetFirst(); while (pViewShell) { - pViewShell->libreOfficeKitViewCallback(LOK_CALLBACK_COMMENT, aPayload.c_str()); + if (pThisViewShell == nullptr || pViewShell->GetDocId() == pThisViewShell->GetDocId()) + pViewShell->libreOfficeKitViewCallback(LOK_CALLBACK_COMMENT, aPayload.c_str()); pViewShell = SfxViewShell::GetNext(*pViewShell); } } diff --git a/sc/source/ui/docshell/olinefun.cxx b/sc/source/ui/docshell/olinefun.cxx index 23a8f846af35..d92de37eca25 100644 --- a/sc/source/ui/docshell/olinefun.cxx +++ b/sc/source/ui/docshell/olinefun.cxx @@ -317,6 +317,7 @@ bool ScOutlineDocFunc::SelectLevel( SCTAB nTab, bool bColumns, sal_uInt16 nLevel bool bRecord, bool bPaint ) { ScDocument& rDoc = rDocShell.GetDocument(); + ScTabViewShell* pViewSh = rDocShell.GetBestViewShell(); if (bRecord && !rDoc.IsUndoEnabled()) bRecord = false; @@ -364,7 +365,7 @@ bool ScOutlineDocFunc::SelectLevel( SCTAB nTab, bool bColumns, sal_uInt16 nLevel sal_uInt16 nThisLevel = aIter.LastLevel(); bool bShow = (nThisLevel < nLevel); - if (!bShow && ScTabViewShell::isAnyEditViewInRange(bColumns, nThisStart, nThisEnd)) + if (!bShow && pViewSh && ScTabViewShell::isAnyEditViewInRange(pViewSh, bColumns, nThisStart, nThisEnd)) continue; if (bShow) // enable @@ -412,7 +413,6 @@ bool ScOutlineDocFunc::SelectLevel( SCTAB nTab, bool bColumns, sal_uInt16 nLevel rDoc.SetDrawPageSize(nTab); rDoc.UpdatePageBreaks( nTab ); - ScTabViewShell* pViewSh = rDocShell.GetBestViewShell(); if ( pViewSh ) pViewSh->OnLOKShowHideColRow(bColumns, nStart - 1); @@ -735,8 +735,8 @@ bool ScOutlineDocFunc::HideOutline( SCTAB nTab, bool bColumns, sal_uInt16 nLevel SCCOLROW nStart = pEntry->GetStart(); SCCOLROW nEnd = pEntry->GetEnd(); - - if (ScTabViewShell::isAnyEditViewInRange(bColumns, nStart, nEnd)) + ScTabViewShell* pViewSh = rDocShell.GetBestViewShell(); + if (pViewSh && ScTabViewShell::isAnyEditViewInRange(pViewSh, bColumns, nStart, nEnd)) return false; // TODO undo can mess things up when another view is editing a cell in the range of group entry @@ -777,7 +777,6 @@ bool ScOutlineDocFunc::HideOutline( SCTAB nTab, bool bColumns, sal_uInt16 nLevel rDoc.InvalidatePageBreaks(nTab); rDoc.UpdatePageBreaks( nTab ); - ScTabViewShell* pViewSh = rDocShell.GetBestViewShell(); if ( pViewSh ) pViewSh->OnLOKShowHideColRow(bColumns, nStart - 1); diff --git a/sc/source/ui/inc/tabvwsh.hxx b/sc/source/ui/inc/tabvwsh.hxx index 8191d629b381..bbce30066e3b 100644 --- a/sc/source/ui/inc/tabvwsh.hxx +++ b/sc/source/ui/inc/tabvwsh.hxx @@ -390,9 +390,8 @@ public: /// See SfxViewShell::NotifyCursor(). void NotifyCursor(SfxViewShell* pViewShell) const override; /// Emits a LOK_CALLBACK_INVALIDATE_HEADER for all views whose current tab is equal to nCurrentTabIndex - static void notifyAllViewsHeaderInvalidation(HeaderType eHeaderType, SCTAB nCurrentTabIndex); - static void notifyAllViewsHeaderInvalidation(bool Columns, SCTAB nCurrentTabIndex); - static bool isAnyEditViewInRange(bool bColumns, SCCOLROW nStart, SCCOLROW nEnd); + static void notifyAllViewsHeaderInvalidation(SfxViewShell* pForViewShell, HeaderType eHeaderType, SCTAB nCurrentTabIndex); + static bool isAnyEditViewInRange(SfxViewShell* pForViewShell, bool bColumns, SCCOLROW nStart, SCCOLROW nEnd); css::uno::Reference<css::drawing::XShapes> getSelectedXShapes(); static css::uno::Reference<css::datatransfer::XTransferable2> GetClipData(vcl::Window* pWin); diff --git a/sc/source/ui/undo/undoblk.cxx b/sc/source/ui/undo/undoblk.cxx index 6e0f254d34bb..956d99d91cab 100644 --- a/sc/source/ui/undo/undoblk.cxx +++ b/sc/source/ui/undo/undoblk.cxx @@ -278,10 +278,10 @@ void ScUndoInsertCells::DoChange( const bool bUndo ) if (comphelper::LibreOfficeKit::isActive()) { if (eCmd == INS_INSCOLS_BEFORE || eCmd == INS_INSCOLS_AFTER || eCmd == INS_CELLSRIGHT) - ScTabViewShell::notifyAllViewsHeaderInvalidation(COLUMN_HEADER, pViewShell->GetViewData().GetTabNo()); + ScTabViewShell::notifyAllViewsHeaderInvalidation(pViewShell, COLUMN_HEADER, pViewShell->GetViewData().GetTabNo()); if (eCmd == INS_INSROWS_BEFORE || eCmd == INS_INSROWS_AFTER || eCmd == INS_CELLSDOWN) - ScTabViewShell::notifyAllViewsHeaderInvalidation(ROW_HEADER, pViewShell->GetViewData().GetTabNo()); + ScTabViewShell::notifyAllViewsHeaderInvalidation(pViewShell, ROW_HEADER, pViewShell->GetViewData().GetTabNo()); } } } @@ -538,10 +538,10 @@ void ScUndoDeleteCells::DoChange( const bool bUndo ) if (comphelper::LibreOfficeKit::isActive()) { if (eCmd == DelCellCmd::Cols || eCmd == DelCellCmd::CellsLeft) - ScTabViewShell::notifyAllViewsHeaderInvalidation(COLUMN_HEADER, pViewShell->GetViewData().GetTabNo()); + ScTabViewShell::notifyAllViewsHeaderInvalidation(pViewShell, COLUMN_HEADER, pViewShell->GetViewData().GetTabNo()); if (eCmd == DelCellCmd::Rows || eCmd == DelCellCmd::CellsUp) - ScTabViewShell::notifyAllViewsHeaderInvalidation(ROW_HEADER, pViewShell->GetViewData().GetTabNo()); + ScTabViewShell::notifyAllViewsHeaderInvalidation(pViewShell, ROW_HEADER, pViewShell->GetViewData().GetTabNo()); } } diff --git a/sc/source/ui/undo/undodat.cxx b/sc/source/ui/undo/undodat.cxx index 45047082faca..20d6eac3b6ea 100644 --- a/sc/source/ui/undo/undodat.cxx +++ b/sc/source/ui/undo/undodat.cxx @@ -184,7 +184,7 @@ void ScUndoMakeOutline::Undo() pDocShell->PostPaint(0,0,nTab,MAXCOL,MAXROW,nTab,PaintPartFlags::Grid|PaintPartFlags::Left|PaintPartFlags::Top|PaintPartFlags::Size); - ScTabViewShell::notifyAllViewsHeaderInvalidation( bColumns, nTab ); + ScTabViewShell::notifyAllViewsHeaderInvalidation( pViewShell, bColumns ? COLUMN_HEADER : ROW_HEADER, nTab ); EndUndo(); } @@ -453,7 +453,7 @@ void ScUndoRemoveAllOutlines::Undo() pDocShell->PostPaint(0,0,nTab,MAXCOL,MAXROW,nTab,PaintPartFlags::Grid|PaintPartFlags::Left|PaintPartFlags::Top|PaintPartFlags::Size); - ScTabViewShell::notifyAllViewsHeaderInvalidation(BOTH_HEADERS, nTab); + ScTabViewShell::notifyAllViewsHeaderInvalidation(pViewShell, BOTH_HEADERS, nTab); EndUndo(); } @@ -737,13 +737,13 @@ OUString ScUndoQuery::GetComment() const void ScUndoQuery::Undo() { - if (ScTabViewShell::isAnyEditViewInRange(/*bColumns*/ false, aQueryParam.nRow1, aQueryParam.nRow2)) + ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell(); + if (ScTabViewShell::isAnyEditViewInRange(pViewShell, /*bColumns*/ false, aQueryParam.nRow1, aQueryParam.nRow2)) return; BeginUndo(); ScDocument& rDoc = pDocShell->GetDocument(); - ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell(); bool bCopy = !aQueryParam.bInplace; SCCOL nDestEndCol = 0; @@ -818,7 +818,7 @@ void ScUndoQuery::Undo() // invalidate cache positions and update cursor and selection pViewShell->OnLOKShowHideColRow(/*bColumns*/ false, aQueryParam.nRow1 - 1); - ScTabViewShell::notifyAllViewsHeaderInvalidation(ROW_HEADER, nTab); + ScTabViewShell::notifyAllViewsHeaderInvalidation(pViewShell, ROW_HEADER, nTab); // Paint diff --git a/sc/source/ui/view/dbfunc3.cxx b/sc/source/ui/view/dbfunc3.cxx index d1f57b46dead..fc849c2ba8c0 100644 --- a/sc/source/ui/view/dbfunc3.cxx +++ b/sc/source/ui/view/dbfunc3.cxx @@ -105,7 +105,7 @@ void ScDBFunc::MakeOutline( bool bColumns, bool bRecord ) ScOutlineDocFunc aFunc(*pDocSh); aFunc.MakeOutline( aRange, bColumns, bRecord, false ); - ScTabViewShell::notifyAllViewsHeaderInvalidation(bColumns, GetViewData().GetTabNo()); + ScTabViewShell::notifyAllViewsHeaderInvalidation(GetViewData().GetViewShell(), bColumns ? COLUMN_HEADER : ROW_HEADER, GetViewData().GetTabNo()); } else ErrorMessage(STR_NOMULTISELECT); @@ -122,7 +122,7 @@ void ScDBFunc::RemoveOutline( bool bColumns, bool bRecord ) ScOutlineDocFunc aFunc(*pDocSh); aFunc.RemoveOutline( aRange, bColumns, bRecord, false ); - ScTabViewShell::notifyAllViewsHeaderInvalidation(bColumns, GetViewData().GetTabNo()); + ScTabViewShell::notifyAllViewsHeaderInvalidation(GetViewData().GetViewShell(), bColumns ? COLUMN_HEADER : ROW_HEADER, GetViewData().GetTabNo()); } else ErrorMessage(STR_NOMULTISELECT); @@ -2253,11 +2253,12 @@ void ScDBFunc::OnLOKShowHideColRow(bool bColumns, SCCOLROW nStart) return; SCTAB nCurrentTabIndex = GetViewData().GetTabNo(); + SfxViewShell* pThisViewShell = GetViewData().GetViewShell(); SfxViewShell* pViewShell = SfxViewShell::GetFirst(); while (pViewShell) { ScTabViewShell* pTabViewShell = dynamic_cast<ScTabViewShell*>(pViewShell); - if (pTabViewShell) + if (pTabViewShell && pTabViewShell->GetDocId() == pThisViewShell->GetDocId()) { if (bColumns) pTabViewShell->GetViewData().GetLOKWidthHelper(nCurrentTabIndex)->invalidateByIndex(nStart); diff --git a/sc/source/ui/view/gridwin.cxx b/sc/source/ui/view/gridwin.cxx index c0fd0034c55c..e30818c50c00 100644 --- a/sc/source/ui/view/gridwin.cxx +++ b/sc/source/ui/view/gridwin.cxx @@ -825,7 +825,7 @@ void ScGridWindow::UpdateAutoFilterFromMenu(AutoFilterMode eMode) // Something went terribly wrong! return; - if (ScTabViewShell::isAnyEditViewInRange(/*bColumns*/ false, aParam.nRow1, aParam.nRow2)) + if (ScTabViewShell::isAnyEditViewInRange(pViewData->GetViewShell(), /*bColumns*/ false, aParam.nRow1, aParam.nRow2)) return; pEntry->bDoQuery = true; @@ -5733,6 +5733,9 @@ void ScGridWindow::notifyKitCellViewCursor(const SfxViewShell* pForShell) const { ScTabViewShell* pViewShell = pViewData->GetViewShell(); + if (pViewShell->GetDocId() != pForShell->GetDocId()) + return; + OString aCursor("EMPTY"); if (mpOOCursors) // cf. getCellCursor above { diff --git a/sc/source/ui/view/gridwin4.cxx b/sc/source/ui/view/gridwin4.cxx index 065f56bf1591..80739983cf80 100644 --- a/sc/source/ui/view/gridwin4.cxx +++ b/sc/source/ui/view/gridwin4.cxx @@ -336,7 +336,7 @@ void ScGridWindow::InvalidateLOKViewCursor(const tools::Rectangle& rCursorRect, while (pViewShell) { - if (pViewShell != pThisViewShell) + if (pViewShell != pThisViewShell && pViewShell->GetDocId() == pThisViewShell->GetDocId()) { ScTabViewShell* pOtherViewShell = dynamic_cast<ScTabViewShell*>(pViewShell); if (pOtherViewShell) @@ -955,7 +955,7 @@ void ScGridWindow::DrawContent(OutputDevice &rDevice, const ScTableInfo& rTableI while (pViewShell) { - if (pViewShell != pThisViewShell) + if (pViewShell != pThisViewShell && pViewShell->GetDocId() == pThisViewShell->GetDocId()) { ScTabViewShell* pTabViewShell = dynamic_cast<ScTabViewShell*>(pViewShell); if (pTabViewShell) diff --git a/sc/source/ui/view/tabview4.cxx b/sc/source/ui/view/tabview4.cxx index 2efc0ef197ca..a8051c7e8128 100644 --- a/sc/source/ui/view/tabview4.cxx +++ b/sc/source/ui/view/tabview4.cxx @@ -392,7 +392,7 @@ static long lcl_GetScrollRange( SCCOLROW nDocEnd, SCCOLROW nPos, SCCOLROW nVis, void ScTabView::UpdateScrollBars( HeaderType eHeaderType ) { - ScTabViewShell::notifyAllViewsHeaderInvalidation(eHeaderType, GetViewData().GetTabNo()); + ScTabViewShell::notifyAllViewsHeaderInvalidation(GetViewData().GetViewShell(), eHeaderType, GetViewData().GetTabNo()); long nDiff; bool bTop = ( aViewData.GetVSplitMode() != SC_SPLIT_NONE ); diff --git a/sc/source/ui/view/tabview5.cxx b/sc/source/ui/view/tabview5.cxx index b8736dd6d6e5..abf8a1e8ccb4 100644 --- a/sc/source/ui/view/tabview5.cxx +++ b/sc/source/ui/view/tabview5.cxx @@ -677,11 +677,12 @@ void ScTabView::OnLOKNoteStateChanged(const ScPostIt* pNote) aInvalidRect.AdjustTop( -nBorderSize ); aInvalidRect.AdjustBottom( nBorderSize ); + SfxViewShell* pCurrentViewShell = SfxViewShell::Current(); SfxViewShell* pViewShell = SfxViewShell::GetFirst(); while (pViewShell) { ScTabViewShell* pTabViewShell = dynamic_cast<ScTabViewShell*>(pViewShell); - if (pTabViewShell) + if (pTabViewShell && pViewShell->GetDocId() == pCurrentViewShell->GetDocId()) { for (auto& pWin: pTabViewShell->pGridWin) { diff --git a/sc/source/ui/view/tabvwsh4.cxx b/sc/source/ui/view/tabvwsh4.cxx index ec912c115848..afbe40780c3f 100644 --- a/sc/source/ui/view/tabvwsh4.cxx +++ b/sc/source/ui/view/tabvwsh4.cxx @@ -1,4 +1,4 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */ /* * This file is part of the LibreOffice project. * @@ -141,6 +141,11 @@ void ScTabViewShell::Activate(bool bMDI) SfxViewShell* pSh = SfxViewShell::GetFirst( true, checkSfxViewShell<ScTabViewShell> ); while ( pSh!=nullptr && pOldHdl!=nullptr) { + // Hmm, what if pSh is a shell for a different document? But as this code + // does not seem to be LibreOfficeKit-specific, probably that doesn't + // happen, because having multiple documents open simultaneously has of + // course not been a problem at all in traditional desktop LibreOffice. + // (Unlike in a LibreOfficeKit-based process where it has been a problem.) if (static_cast<ScTabViewShell*>(pSh)->GetInputHandler() == pOldHdl) { pOldHdl->ResetDelayTimer(); @@ -1716,8 +1721,12 @@ ScTabViewShell::ScTabViewShell( SfxViewFrame* pViewFrame, // have we already one view ? if (pViewShell) { - // this view is not yet visible at this stage, so we look for not visible views, too - SfxViewShell* pViewShell2 = SfxViewShell::GetNext(*pViewShell, /*only visible shells*/ false); + // this view is not yet visible at this stage, so we look for not visible views, too, for this same document + SfxViewShell* pViewShell2 = pViewShell; + do + { + pViewShell2 = SfxViewShell::GetNext(*pViewShell2, /*only visible shells*/ false); + } while (pViewShell2 && pViewShell2->GetDocId() != pViewShell->GetDocId()); // if the second view is not this one, it means that there is // already more than one active view and so the formula mode // has already been disabled diff --git a/sc/source/ui/view/tabvwshc.cxx b/sc/source/ui/view/tabvwshc.cxx index 1f0cd9bf737b..aba771e1035a 100644 --- a/sc/source/ui/view/tabvwshc.cxx +++ b/sc/source/ui/view/tabvwshc.cxx @@ -572,7 +572,7 @@ css::uno::Reference<css::datatransfer::XTransferable2> ScTabViewShell::GetClipDa return xTransferable; } -void ScTabViewShell::notifyAllViewsHeaderInvalidation(HeaderType eHeaderType, SCTAB nCurrentTabIndex) +void ScTabViewShell::notifyAllViewsHeaderInvalidation(SfxViewShell* pForViewShell, HeaderType eHeaderType, SCTAB nCurrentTabIndex) { if (comphelper::LibreOfficeKit::isActive()) { @@ -595,7 +595,7 @@ void ScTabViewShell::notifyAllViewsHeaderInvalidation(HeaderType eHeaderType, SC while (pViewShell) { ScTabViewShell* pTabViewShell = dynamic_cast<ScTabViewShell*>(pViewShell); - if (pTabViewShell && (nCurrentTabIndex == -1 || pTabViewShell->getPart() == nCurrentTabIndex)) + if (pTabViewShell && pViewShell->GetDocId() == pForViewShell->GetDocId() && (nCurrentTabIndex == -1 || pTabViewShell->getPart() == nCurrentTabIndex)) { pViewShell->libreOfficeKitViewCallback(LOK_CALLBACK_INVALIDATE_HEADER, aPayload.getStr()); } @@ -604,13 +604,7 @@ void ScTabViewShell::notifyAllViewsHeaderInvalidation(HeaderType eHeaderType, SC } } -void ScTabViewShell::notifyAllViewsHeaderInvalidation(bool bColumns, SCTAB nCurrentTabIndex) -{ - HeaderType eHeaderType = bColumns ? COLUMN_HEADER : ROW_HEADER; - ScTabViewShell::notifyAllViewsHeaderInvalidation(eHeaderType, nCurrentTabIndex); -} - -bool ScTabViewShell::isAnyEditViewInRange(bool bColumns, SCCOLROW nStart, SCCOLROW nEnd) +bool ScTabViewShell::isAnyEditViewInRange(SfxViewShell* pForViewShell, bool bColumns, SCCOLROW nStart, SCCOLROW nEnd) { if (comphelper::LibreOfficeKit::isActive()) { @@ -618,7 +612,7 @@ bool ScTabViewShell::isAnyEditViewInRange(bool bColumns, SCCOLROW nStart, SCCOLR while (pViewShell) { ScTabViewShell* pTabViewShell = dynamic_cast<ScTabViewShell*>(pViewShell); - if (pTabViewShell) + if (pTabViewShell && pTabViewShell->GetDocId() == pForViewShell->GetDocId()) { ScInputHandler* pInputHandler = pTabViewShell->GetInputHandler(); if (pInputHandler && pInputHandler->GetActiveView()) diff --git a/sc/source/ui/view/viewfun2.cxx b/sc/source/ui/view/viewfun2.cxx index 1b948b916746..aa4f05844693 100644 --- a/sc/source/ui/view/viewfun2.cxx +++ b/sc/source/ui/view/viewfun2.cxx @@ -170,7 +170,7 @@ bool ScViewFunc::AdjustBlockHeight( bool bPaint, ScMarkData* pMarkData ) pDocSh->UpdateOle(&GetViewData()); if (comphelper::LibreOfficeKit::isActive()) - ScTabViewShell::notifyAllViewsHeaderInvalidation(ROW_HEADER, GetViewData().GetTabNo()); + ScTabViewShell::notifyAllViewsHeaderInvalidation(GetViewData().GetViewShell(), ROW_HEADER, GetViewData().GetTabNo()); return bAnyChanged; } @@ -219,7 +219,7 @@ bool ScViewFunc::AdjustRowHeight( SCROW nStartRow, SCROW nEndRow ) PaintPartFlags::Grid | PaintPartFlags::Left ); if (comphelper::LibreOfficeKit::isActive()) - ScTabViewShell::notifyAllViewsHeaderInvalidation(ROW_HEADER, GetViewData().GetTabNo()); + ScTabViewShell::notifyAllViewsHeaderInvalidation(GetViewData().GetViewShell(), ROW_HEADER, GetViewData().GetTabNo()); return bChanged; } diff --git a/sc/source/ui/view/viewfunc.cxx b/sc/source/ui/view/viewfunc.cxx index a0e1185a6d3f..bed9550e77b1 100644 --- a/sc/source/ui/view/viewfunc.cxx +++ b/sc/source/ui/view/viewfunc.cxx @@ -1481,11 +1481,12 @@ void ScViewFunc::OnLOKInsertDeleteColumn(SCCOL nStartCol, long nOffset) return; SCTAB nCurrentTabIndex = GetViewData().GetTabNo(); + SfxViewShell* pCurrentViewShell = GetViewData().GetViewShell(); SfxViewShell* pViewShell = SfxViewShell::GetFirst(); while (pViewShell) { ScTabViewShell* pTabViewShell = dynamic_cast<ScTabViewShell*>(pViewShell); - if (pTabViewShell) + if (pTabViewShell && pTabViewShell->GetDocId() == pCurrentViewShell->GetDocId()) { pTabViewShell->GetViewData().GetLOKWidthHelper(nCurrentTabIndex)->invalidateByIndex(nStartCol); @@ -1536,11 +1537,12 @@ void ScViewFunc::OnLOKInsertDeleteRow(SCROW nStartRow, long nOffset) return; SCTAB nCurrentTabIndex = GetViewData().GetTabNo(); + SfxViewShell* pCurrentViewShell = GetViewData().GetViewShell(); SfxViewShell* pViewShell = SfxViewShell::GetFirst(); while (pViewShell) { ScTabViewShell* pTabViewShell = dynamic_cast<ScTabViewShell*>(pViewShell); - if (pTabViewShell) + if (pTabViewShell && pTabViewShell->GetDocId() == pCurrentViewShell->GetDocId()) { pTabViewShell->GetViewData().GetLOKHeightHelper(nCurrentTabIndex)->invalidateByIndex(nStartRow); @@ -1591,11 +1593,12 @@ void ScViewFunc::OnLOKSetWidthOrHeight(SCCOLROW nStart, bool bWidth) return; SCTAB nCurTab = GetViewData().GetTabNo(); + SfxViewShell* pCurrentViewShell = GetViewData().GetViewShell(); SfxViewShell* pViewShell = SfxViewShell::GetFirst(); while (pViewShell) { ScTabViewShell* pTabViewShell = dynamic_cast<ScTabViewShell*>(pViewShell); - if (pTabViewShell) + if (pTabViewShell && pTabViewShell->GetDocId() == pCurrentViewShell->GetDocId()) { if (bWidth) pTabViewShell->GetViewData().GetLOKWidthHelper(nCurTab)->invalidateByIndex(nStart); @@ -1636,10 +1639,10 @@ bool ScViewFunc::InsertCells( InsCellCmd eCmd, bool bRecord, bool bPartOfPaste ) if (comphelper::LibreOfficeKit::isActive()) { if (bInsertCols) - ScTabViewShell::notifyAllViewsHeaderInvalidation(COLUMN_HEADER, GetViewData().GetTabNo()); + ScTabViewShell::notifyAllViewsHeaderInvalidation(GetViewData().GetViewShell(), COLUMN_HEADER, GetViewData().GetTabNo()); if (bInsertRows) - ScTabViewShell::notifyAllViewsHeaderInvalidation(ROW_HEADER, GetViewData().GetTabNo()); + ScTabViewShell::notifyAllViewsHeaderInvalidation(GetViewData().GetViewShell(), ROW_HEADER, GetViewData().GetTabNo()); } } return bSuccess; @@ -1711,10 +1714,10 @@ void ScViewFunc::DeleteCells( DelCellCmd eCmd ) if (comphelper::LibreOfficeKit::isActive()) { if (eCmd == DelCellCmd::Cols) - ScTabViewShell::notifyAllViewsHeaderInvalidation(COLUMN_HEADER, GetViewData().GetTabNo()); + ScTabViewShell::notifyAllViewsHeaderInvalidation(GetViewData().GetViewShell(), COLUMN_HEADER, GetViewData().GetTabNo()); if (eCmd == DelCellCmd::Rows) - ScTabViewShell::notifyAllViewsHeaderInvalidation(ROW_HEADER, GetViewData().GetTabNo()); + ScTabViewShell::notifyAllViewsHeaderInvalidation(GetViewData().GetViewShell(), ROW_HEADER, GetViewData().GetTabNo()); } } else diff --git a/sd/source/ui/sidebar/SlideBackground.cxx b/sd/source/ui/sidebar/SlideBackground.cxx index 9182f6984056..d59cd6616f46 100644 --- a/sd/source/ui/sidebar/SlideBackground.cxx +++ b/sd/source/ui/sidebar/SlideBackground.cxx @@ -1044,10 +1044,14 @@ IMPL_LINK_NOARG(SlideBackground, PaperSizeModifyHdl, ListBox&, void) if (comphelper::LibreOfficeKit::isActive()) { SfxViewShell* pViewShell = SfxViewShell::GetFirst(); - if (pViewShell) + while (pViewShell) { - SdXImpressDocument* pModel = SdXImpressDocument::getImplementation(pViewShell->GetCurrentDocument()); - SfxLokHelper::notifyDocumentSizeChangedAllViews(pModel); + if (pViewShell->GetDocId() == mrBase.GetDocId()) + { + SdXImpressDocument* pModel = SdXImpressDocument::getImplementation(pViewShell->GetCurrentDocument()); + SfxLokHelper::notifyDocumentSizeChangedAllViews(pModel); + } + pViewShell = SfxViewShell::GetNext(*pViewShell); } } } diff --git a/sfx2/source/view/lokcharthelper.cxx b/sfx2/source/view/lokcharthelper.cxx index 903e4727eb62..23d84851f5a5 100644 --- a/sfx2/source/view/lokcharthelper.cxx +++ b/sfx2/source/view/lokcharthelper.cxx @@ -180,7 +180,7 @@ bool LokChartHelper::HitAny(const Point& aPos) SfxViewShell* pViewShell = SfxViewShell::GetFirst(); while (pViewShell) { - if (pViewShell->getPart() == nPartForCurView) + if (pViewShell->GetDocId() == pCurView->GetDocId() && pViewShell->getPart() == nPartForCurView) { LokChartHelper aChartHelper(pViewShell); if (aChartHelper.Hit(aPos)) @@ -262,7 +262,7 @@ void LokChartHelper::PaintAllChartsOnTile(VirtualDevice& rDevice, SfxViewShell* pViewShell = SfxViewShell::GetFirst(); while (pViewShell) { - if (pViewShell->getPart() == nPartForCurView) + if (pCurView && pViewShell->GetDocId() == pCurView->GetDocId() && pViewShell->getPart() == nPartForCurView) { LokChartHelper aChartHelper(pViewShell); aChartHelper.PaintTile(rDevice, aTileRect); diff --git a/sfx2/source/view/lokhelper.cxx b/sfx2/source/view/lokhelper.cxx index 4fb7761cec95..2f78bfc1eaa5 100644 --- a/sfx2/source/view/lokhelper.cxx +++ b/sfx2/source/view/lokhelper.cxx @@ -69,11 +69,17 @@ int SfxLokHelper::createView() SfxViewFrame* pViewFrame = SfxViewFrame::GetFirst(); if (!pViewFrame) return -1; + SfxViewShell* pPrevViewShell = SfxViewShell::Current(); + ViewShellDocId nId; + if (pPrevViewShell) + nId = pPrevViewShell->GetDocId(); SfxRequest aRequest(pViewFrame, SID_NEWWINDOW); pViewFrame->ExecView_Impl(aRequest); SfxViewShell* pViewShell = SfxViewShell::Current(); if (!pViewShell) return -1; + if (pPrevViewShell) + pViewShell->SetDocId(nId); return static_cast<sal_Int32>(pViewShell->GetViewShellId()); } @@ -147,7 +153,20 @@ int SfxLokHelper::getView(SfxViewShell* pViewShell) std::size_t SfxLokHelper::getViewsCount() { SfxApplication* pApp = SfxApplication::Get(); - return !pApp ? 0 : pApp->GetViewShells_Impl().size(); + if (!pApp) + return 0; + + const SfxViewShell* const pCurrentViewShell = SfxViewShell::Current(); + const ViewShellDocId nCurrentDocId = pCurrentViewShell ? pCurrentViewShell->GetDocId() : ViewShellDocId(-1); + std::size_t n = 0; + SfxViewShell* pViewShell = SfxViewShell::GetFirst(); + while (pViewShell) + { + if (pViewShell->GetDocId() == nCurrentDocId) + n++; + pViewShell = SfxViewShell::GetNext(*pViewShell); + } + return n; } bool SfxLokHelper::getViewIds(int* pArray, size_t nSize) @@ -156,18 +175,45 @@ bool SfxLokHelper::getViewIds(int* pArray, size_t nSize) if (!pApp) return false; - SfxViewShellArr_Impl& rViewArr = pApp->GetViewShells_Impl(); - if (rViewArr.size() > nSize) - return false; - - for (std::size_t i = 0; i < rViewArr.size(); ++i) + const SfxViewShell* const pCurrentViewShell = SfxViewShell::Current(); + const ViewShellDocId nCurrentDocId = pCurrentViewShell ? pCurrentViewShell->GetDocId() : ViewShellDocId(-1); + std::size_t n = 0; + SfxViewShell* pViewShell = SfxViewShell::GetFirst(); + while (pViewShell) { - SfxViewShell* pViewShell = rViewArr[i]; - pArray[i] = static_cast<sal_Int32>(pViewShell->GetViewShellId()); + if (n == nSize) + return false; + if (pViewShell->GetDocId() == nCurrentDocId) + { + pArray[n] = static_cast<sal_Int32>(pViewShell->GetViewShellId()); + n++; + } + pViewShell = SfxViewShell::GetNext(*pViewShell); } return true; } +void SfxLokHelper::setDocumentIdOfView(int nId) +{ + SfxViewShell* pViewShell = SfxViewShell::Current(); + assert(pViewShell); + if (!pViewShell) + return; + pViewShell->SetDocId(ViewShellDocId(nId)); +} + +int SfxLokHelper::getDocumentIdOfView(int nViewId) +{ + SfxViewShell* pViewShell = SfxViewShell::GetFirst(); + while (pViewShell) + { + if (pViewShell->GetViewShellId() == ViewShellId(nViewId)) + return static_cast<int>(pViewShell->GetDocId()); + pViewShell = SfxViewShell::GetNext(*pViewShell); + } + return -1; +} + LanguageTag SfxLokHelper::getDefaultLanguage() { return g_defaultLanguageTag; @@ -252,13 +298,13 @@ void SfxLokHelper::notifyOtherView(SfxViewShell* pThisView, SfxViewShell const* void SfxLokHelper::notifyOtherViews(SfxViewShell* pThisView, int nType, const OString& rKey, const OString& rPayload) { - if (SfxLokHelper::getViewsCount() <= 1 || DisableCallbacks::disabled()) + if (DisableCallbacks::disabled()) return; SfxViewShell* pViewShell = SfxViewShell::GetFirst(); while (pViewShell) { - if (pViewShell != pThisView) + if (pViewShell != pThisView && pViewShell->GetDocId() == pThisView-> GetDocId()) notifyOtherView(pThisView, pViewShell, nType, rKey, rPayload); pViewShell = SfxViewShell::GetNext(*pViewShell); @@ -371,10 +417,13 @@ void SfxLokHelper::notifyDocumentSizeChangedAllViews(vcl::ITiledRenderable* pDoc if (!comphelper::LibreOfficeKit::isActive() || DisableCallbacks::disabled()) return; + // FIXME: Do we know whether it is the views for the document that is in the "current" view that has changed? + const SfxViewShell* const pCurrentViewShell = SfxViewShell::Current(); SfxViewShell* pViewShell = SfxViewShell::GetFirst(); while (pViewShell) { - SfxLokHelper::notifyDocumentSizeChanged(pViewShell, "", pDoc, bInvalidateAll); + if (pViewShell->GetDocId() == pCurrentViewShell-> GetDocId()) + SfxLokHelper::notifyDocumentSizeChanged(pViewShell, "", pDoc, bInvalidateAll); pViewShell = SfxViewShell::GetNext(*pViewShell); } } @@ -406,10 +455,12 @@ void SfxLokHelper::notifyAllViews(int nType, const OString& rPayload) return; const auto payload = rPayload.getStr(); + const SfxViewShell* const pCurrentViewShell = SfxViewShell::Current(); SfxViewShell* pViewShell = SfxViewShell::GetFirst(); while (pViewShell) { - pViewShell->libreOfficeKitViewCallback(nType, payload); + if (pViewShell->GetDocId() == pCurrentViewShell->GetDocId()) + pViewShell->libreOfficeKitViewCallback(nType, payload); pViewShell = SfxViewShell::GetNext(*pViewShell); } } diff --git a/sfx2/source/view/viewimp.hxx b/sfx2/source/view/viewimp.hxx index 00b7b51590fe..ef919a2fd89f 100644 --- a/sfx2/source/view/viewimp.hxx +++ b/sfx2/source/view/viewimp.hxx @@ -59,6 +59,7 @@ struct SfxViewShell_Impl bool m_bTiledSearching; static sal_uInt32 m_nLastViewShellId; const ViewShellId m_nViewShellId; + ViewShellDocId m_nDocId; explicit SfxViewShell_Impl(SfxViewShellFlags const nFlags); ~SfxViewShell_Impl(); diff --git a/sfx2/source/view/viewsh.cxx b/sfx2/source/view/viewsh.cxx index dcbdc9ceef3a..ad46e704478f 100644 --- a/sfx2/source/view/viewsh.cxx +++ b/sfx2/source/view/viewsh.cxx @@ -228,7 +228,9 @@ SfxViewShell_Impl::SfxViewShell_Impl(SfxViewShellFlags const nFlags) , m_pLibreOfficeKitViewData(nullptr) , m_bTiledSearching(false) , m_nViewShellId(SfxViewShell_Impl::m_nLastViewShellId++) -{} +, m_nDocId(-1) +{ +} SfxViewShell_Impl::~SfxViewShell_Impl() { @@ -1096,7 +1098,6 @@ SfxViewShell::SfxViewShell SfxViewShell::~SfxViewShell() { - // Remove from list const SfxViewShell *pThis = this; SfxViewShellArr_Impl &rViewArr = SfxGetpApp()->GetViewShells_Impl(); @@ -1478,7 +1479,8 @@ void SfxViewShell::registerLibreOfficeKitViewCallback(LibreOfficeKitCallback pCa SfxViewShell* pViewShell = SfxViewShell::GetFirst(); while (pViewShell) { - pViewShell->NotifyCursor(this); + if (pViewShell->GetDocId() == GetDocId()) + pViewShell->NotifyCursor(this); pViewShell = SfxViewShell::GetNext(*pViewShell); } } @@ -1573,6 +1575,17 @@ ViewShellId SfxViewShell::GetViewShellId() const return pImpl->m_nViewShellId; } +void SfxViewShell::SetDocId(ViewShellDocId nId) +{ + assert(static_cast<int>(pImpl->m_nDocId) == -1); + pImpl->m_nDocId = nId; +} + +ViewShellDocId SfxViewShell::GetDocId() const +{ + return pImpl->m_nDocId; +} + void SfxViewShell::NotifyOtherViews(int nType, const OString& rKey, const OString& rPayload) { SfxLokHelper::notifyOtherViews(this, nType, rKey, rPayload); diff --git a/starmath/source/smmod.cxx b/starmath/source/smmod.cxx index 32cd5550d9e5..93f27da82eef 100644 --- a/starmath/source/smmod.cxx +++ b/starmath/source/smmod.cxx @@ -139,6 +139,9 @@ void SmModule::ApplyColorConfigValues( const svtools::ColorConfig &rColorCfg ) SfxViewShell* pViewShell = SfxViewShell::GetFirst(); while (pViewShell) { + // FIXME: What if pViewShell is for a different document, + // but OTOH Math is presumably never used through + // LibreOfficeKit, so maybe an irrelevant concern? if (dynamic_cast<const SmViewShell *>(pViewShell) != nullptr) { SmViewShell *pSmView = static_cast<SmViewShell *>(pViewShell); diff --git a/sw/source/core/doc/docredln.cxx b/sw/source/core/doc/docredln.cxx index a3fabfaf514d..1f642b5c9b3e 100644 --- a/sw/source/core/doc/docredln.cxx +++ b/sw/source/core/doc/docredln.cxx @@ -426,7 +426,8 @@ void SwRedlineTable::LOKRedlineNotification(RedlineNotification nType, SwRangeRe SfxViewShell* pViewShell = SfxViewShell::GetFirst(); while (pViewShell) { - pViewShell->libreOfficeKitViewCallback(nType == RedlineNotification::Modify ? LOK_CALLBACK_REDLINE_TABLE_ENTRY_MODIFIED : LOK_CALLBACK_REDLINE_TABLE_SIZE_CHANGED, aPayload.c_str()); + if (pView && pView->GetDocId() == pViewShell->GetDocId()) + pViewShell->libreOfficeKitViewCallback(nType == RedlineNotification::Modify ? LOK_CALLBACK_REDLINE_TABLE_ENTRY_MODIFIED : LOK_CALLBACK_REDLINE_TABLE_SIZE_CHANGED, aPayload.c_str()); pViewShell = SfxViewShell::GetNext(*pViewShell); } } _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits