diff options
-rw-r--r-- | editeng/source/editeng/editview.cxx | 25 | ||||
-rw-r--r-- | editeng/source/editeng/impedit.cxx | 4 | ||||
-rw-r--r-- | editeng/source/editeng/impedit3.cxx | 8 | ||||
-rw-r--r-- | include/editeng/editview.hxx | 2 | ||||
-rw-r--r-- | sc/source/ui/inc/tabview.hxx | 4 | ||||
-rw-r--r-- | sc/source/ui/view/tabview3.cxx | 34 | ||||
-rw-r--r-- | sc/source/ui/view/tabview5.cxx | 6 | ||||
-rw-r--r-- | sc/source/ui/view/viewdata.cxx | 54 |
8 files changed, 92 insertions, 45 deletions
diff --git a/editeng/source/editeng/editview.cxx b/editeng/source/editeng/editview.cxx index 63b7b30c57cc..3ada3d3fb264 100644 --- a/editeng/source/editeng/editview.cxx +++ b/editeng/source/editeng/editview.cxx @@ -173,10 +173,10 @@ EditEngine* EditView::GetEditEngine() const return pImpEditView->pEditEngine; } -void EditView::Invalidate() +Rectangle EditView::GetInvalidateRect() const { if ( !pImpEditView->DoInvalidateMore() ) - pImpEditView->GetWindow()->Invalidate( pImpEditView->aOutArea ); + return pImpEditView->aOutArea; else { Rectangle aRect( pImpEditView->aOutArea ); @@ -185,10 +185,29 @@ void EditView::Invalidate() aRect.Right() += nMore; aRect.Top() -= nMore; aRect.Bottom() += nMore; - pImpEditView->GetWindow()->Invalidate( aRect ); + return aRect; + } +} + +void EditView::InvalidateOtherViewWindows( const Rectangle& rInvRect ) +{ + if (comphelper::LibreOfficeKit::isActive()) + { + for (auto& pWin: GetOtherViewWindows()) + { + if (pWin) + pWin->Invalidate( rInvRect ); + } } } +void EditView::Invalidate() +{ + const Rectangle& rInvRect = GetInvalidateRect(); + pImpEditView->GetWindow()->Invalidate( rInvRect ); + InvalidateOtherViewWindows( rInvRect ); +} + void EditView::SetReadOnly( bool bReadOnly ) { pImpEditView->bReadOnly = bReadOnly; diff --git a/editeng/source/editeng/impedit.cxx b/editeng/source/editeng/impedit.cxx index 7426862afabd..f23bd81943e5 100644 --- a/editeng/source/editeng/impedit.cxx +++ b/editeng/source/editeng/impedit.cxx @@ -1150,8 +1150,10 @@ Pair ImpEditView::Scroll( long ndX, long ndY, ScrollRangeCheck nRangeCheck ) pOutWin->Scroll( nRealDiffX, nRealDiffY, aRect, ScrollFlags::Clip ); if (comphelper::LibreOfficeKit::isActive()) + { // Need to invalidate the window, otherwise no tile will be re-painted. - pOutWin->Invalidate(); + pEditView->Invalidate(); + } pOutWin->Update(); pCrsr->SetPos( pCrsr->GetPos() + Point( nRealDiffX, nRealDiffY ) ); diff --git a/editeng/source/editeng/impedit3.cxx b/editeng/source/editeng/impedit3.cxx index 7d30eda43478..1d62eba9c4ed 100644 --- a/editeng/source/editeng/impedit3.cxx +++ b/editeng/source/editeng/impedit3.cxx @@ -289,13 +289,7 @@ void ImpEditEngine::UpdateViews( EditView* pCurView ) // convert to window coordinates .... aClipRect = pView->pImpEditView->GetWindowPos( aClipRect ); pView->GetWindow()->Invalidate( aClipRect ); - - EditView::OutWindowSet& rOutWindowSet = pView->GetOtherViewWindows(); - for (auto pWin: rOutWindowSet) - { - if (pWin) - pWin->Invalidate(aClipRect); - } + pView->InvalidateOtherViewWindows( aClipRect ); } } diff --git a/include/editeng/editview.hxx b/include/editeng/editview.hxx index b66486dcb8f3..007f368e9c90 100644 --- a/include/editeng/editview.hxx +++ b/include/editeng/editview.hxx @@ -115,6 +115,8 @@ public: bool RemoveOtherViewWindow( vcl::Window* pWin ); void Paint( const Rectangle& rRect, OutputDevice* pTargetDevice = nullptr ); + Rectangle GetInvalidateRect() const; + void InvalidateOtherViewWindows( const Rectangle& rInvRect ); void Invalidate(); Pair Scroll( long nHorzScroll, long nVertScroll, ScrollRangeCheck nRangeCheck = ScrollRangeCheck::NoNegative ); diff --git a/sc/source/ui/inc/tabview.hxx b/sc/source/ui/inc/tabview.hxx index c04d027f5a1c..cadeb94e9cc1 100644 --- a/sc/source/ui/inc/tabview.hxx +++ b/sc/source/ui/inc/tabview.hxx @@ -491,8 +491,8 @@ public: void InvalidateAttribs(); void OnLibreOfficeKitTabChanged(); - void AddEditViewToOtherView(SfxViewShell* pViewShell, ScSplitPos eWhich); - void RemoveEditViewFromOtherView(SfxViewShell* pViewShell, ScSplitPos eWhich); + void AddWindowToForeignEditView(SfxViewShell* pViewShell, ScSplitPos eWhich); + void RemoveWindowFromForeignEditView(SfxViewShell* pViewShell, ScSplitPos eWhich); void MakeEditView( ScEditEngineDefaulter* pEngine, SCCOL nCol, SCROW nRow ); void KillEditView( bool bNoPaint ); void UpdateEditView(); diff --git a/sc/source/ui/view/tabview3.cxx b/sc/source/ui/view/tabview3.cxx index 06ef0b9dff9f..6c387bfa70cf 100644 --- a/sc/source/ui/view/tabview3.cxx +++ b/sc/source/ui/view/tabview3.cxx @@ -1941,12 +1941,12 @@ void ScTabView::SetTabNo( SCTAB nTab, bool bNew, bool bExtendSelection, bool bSa } } -void ScTabView::AddEditViewToOtherView(SfxViewShell* pViewShell, ScSplitPos eWhich) +void ScTabView::AddWindowToForeignEditView(SfxViewShell* pViewShell, ScSplitPos eWhich) { aExtraEditViewManager.Add(pViewShell, eWhich); } -void ScTabView::RemoveEditViewFromOtherView(SfxViewShell* pViewShell, ScSplitPos eWhich) +void ScTabView::RemoveWindowFromForeignEditView(SfxViewShell* pViewShell, ScSplitPos eWhich) { aExtraEditViewManager.Remove(pViewShell, eWhich); } @@ -1968,7 +1968,7 @@ void ScTabView::OnLibreOfficeKitTabChanged() { if (rOtherViewData.HasEditView( (ScSplitPos)(i))) { - pThisViewShell->AddEditViewToOtherView(pOtherViewShell, (ScSplitPos)(i)); + pThisViewShell->AddWindowToForeignEditView(pOtherViewShell, (ScSplitPos)(i)); } } } @@ -1978,7 +1978,7 @@ void ScTabView::OnLibreOfficeKitTabChanged() { if (rOtherViewData.HasEditView( (ScSplitPos)(i))) { - pThisViewShell->RemoveEditViewFromOtherView(pOtherViewShell, (ScSplitPos)(i)); + pThisViewShell->RemoveWindowFromForeignEditView(pOtherViewShell, (ScSplitPos)(i)); } } } @@ -2070,6 +2070,7 @@ void ScTabView::KillEditView( bool bNoPaint ) SCROW nRow2 = aViewData.GetEditEndRow(); bool bPaint[4]; bool bNotifyAcc = false; + Rectangle aRectangle[4]; bool bExtended = nRow1 != nRow2; // column is painted to the end anyway @@ -2080,7 +2081,12 @@ void ScTabView::KillEditView( bool bNoPaint ) { bPaint[i] = aViewData.HasEditView( (ScSplitPos) i ); if (bPaint[i]) + { bNotifyAcc = true; + + EditView* pView = aViewData.GetEditView( (ScSplitPos) i ); + aRectangle[i] = pView->GetInvalidateRect(); + } } // #108931#; notify accessibility before all things happen @@ -2096,8 +2102,26 @@ void ScTabView::KillEditView( bool bNoPaint ) pGridWin[i]->SetMapMode(pGridWin[i]->GetDrawMapMode()); + if (comphelper::LibreOfficeKit::isActive()) + { + const Rectangle& rInvRect = aRectangle[i]; + pGridWin[i]->Invalidate(rInvRect); + + // invalidate other views + auto lInvalidateWindows = + [&rInvRect] (ScTabView* pTabView) + { + for (ScGridWindow* pWin: pTabView->pGridWin) + { + if (pWin) + pWin->Invalidate(rInvRect); + } + }; + + SfxLokHelper::forEachOtherView(GetViewData().GetViewShell(), lInvalidateWindows); + } // #i73567# the cell still has to be repainted - if (bExtended || ( bAtCursor && !bNoPaint )) + else if (bExtended || ( bAtCursor && !bNoPaint )) { pGridWin[i]->Draw( nCol1, nRow1, nCol2, nRow2, SC_UPDATE_ALL ); pGridWin[i]->UpdateSelectionOverlay(); diff --git a/sc/source/ui/view/tabview5.cxx b/sc/source/ui/view/tabview5.cxx index 10a39b3a2555..fdb0823baa8e 100644 --- a/sc/source/ui/view/tabview5.cxx +++ b/sc/source/ui/view/tabview5.cxx @@ -163,18 +163,18 @@ ScTabView::~ScTabView() { ScTabViewShell* pThisViewShell = GetViewData().GetViewShell(); - auto lRemoveEditView = + auto lRemoveWindows = [pThisViewShell] (ScTabViewShell* pOtherViewShell) { ScViewData& rOtherViewData = pOtherViewShell->GetViewData(); for (int k = 0; k < 4; ++k) { if (rOtherViewData.HasEditView((ScSplitPos)(k))) - pThisViewShell->RemoveEditViewFromOtherView(pOtherViewShell, (ScSplitPos)(k)); + pThisViewShell->RemoveWindowFromForeignEditView(pOtherViewShell, (ScSplitPos)(k)); } }; - SfxLokHelper::forEachOtherView(pThisViewShell, lRemoveEditView); + SfxLokHelper::forEachOtherView(pThisViewShell, lRemoveWindows); } aViewData.KillEditView(); // solange GridWin's noch existieren diff --git a/sc/source/ui/view/viewdata.cxx b/sc/source/ui/view/viewdata.cxx index d14d72183f07..a569559536fd 100644 --- a/sc/source/ui/view/viewdata.cxx +++ b/sc/source/ui/view/viewdata.cxx @@ -76,15 +76,15 @@ using namespace com::sun::star; namespace { -void lcl_LOKRemoveEditView(ScTabViewShell* pTabViewShell, ScSplitPos eWhich) +void lcl_LOKRemoveWindow(ScTabViewShell* pTabViewShell, ScSplitPos eWhich) { if (comphelper::LibreOfficeKit::isActive()) { - auto lRemoveEditView = + auto lRemoveWindows = [pTabViewShell, eWhich] (ScTabViewShell* pOtherViewShell) - { pOtherViewShell->RemoveEditViewFromOtherView(pTabViewShell, eWhich); }; + { pOtherViewShell->RemoveWindowFromForeignEditView(pTabViewShell, eWhich); }; - SfxLokHelper::forEachOtherView(pTabViewShell, lRemoveEditView); + SfxLokHelper::forEachOtherView(pTabViewShell, lRemoveWindows); } } @@ -987,13 +987,13 @@ void ScViewData::SetEditEngine( ScSplitPos eWhich, } else { - lcl_LOKRemoveEditView(GetViewShell(), eWhich); + lcl_LOKRemoveWindow(GetViewShell(), eWhich); pEditView[eWhich]->SetEditEngine(pNewEngine); } if (pEditView[eWhich]->GetWindow() != pWin) { - lcl_LOKRemoveEditView(GetViewShell(), eWhich); + lcl_LOKRemoveWindow(GetViewShell(), eWhich); pEditView[eWhich]->SetWindow(pWin); OSL_FAIL("EditView Window has changed"); } @@ -1008,6 +1008,23 @@ void ScViewData::SetEditEngine( ScSplitPos eWhich, } } + // add windows from other views + if (comphelper::LibreOfficeKit::isActive()) + { + ScTabViewShell* pThisViewShell = GetViewShell(); + SCTAB nThisTabNo = GetTabNo(); + auto lAddWindows = + [pThisViewShell, nThisTabNo, eWhich] (ScTabViewShell* pOtherViewShell) + { + ScViewData& rOtherViewData = pOtherViewShell->GetViewData(); + SCTAB nOtherTabNo = rOtherViewData.GetTabNo(); + if (nThisTabNo == nOtherTabNo) + pOtherViewShell->AddWindowToForeignEditView(pThisViewShell, eWhich); + }; + + SfxLokHelper::forEachOtherView(pThisViewShell, lAddWindows); + } + // bei IdleFormat wird manchmal ein Cursor gemalt, wenn die View schon weg ist (23576) EEControlBits nEC = pNewEngine->GetControlWord(); @@ -1163,23 +1180,6 @@ void ScViewData::SetEditEngine( ScSplitPos eWhich, pEditView[eWhich]->Invalidate(); // needed? // needed, wenn position changed - - if (comphelper::LibreOfficeKit::isActive()) - { - ScTabViewShell* pThisViewShell = GetViewShell(); - SCTAB nThisTabNo = GetTabNo(); - auto lAddEditView = - [pThisViewShell, nThisTabNo, eWhich] (ScTabViewShell* pOtherViewShell) - { - ScViewData& rOtherViewData = pOtherViewShell->GetViewData(); - SCTAB nOtherTabNo = rOtherViewData.GetTabNo(); - if (nThisTabNo == nOtherTabNo) - pOtherViewShell->AddEditViewToOtherView(pThisViewShell, eWhich); - }; - - SfxLokHelper::forEachOtherView(pThisViewShell, lAddEditView); - } - } IMPL_LINK( ScViewData, EditEngineHdl, EditStatus&, rStatus, void ) @@ -1379,6 +1379,9 @@ void ScViewData::EditGrowX() else if ( !bAsianVertical && !bGrowToLeft && !bGrowCentered ) aArea.Left() = nOldRight; pWin->Invalidate(aArea); + + // invalidate other views + pCurView->InvalidateOtherViewWindows(aArea); } } @@ -1459,6 +1462,9 @@ void ScViewData::EditGrowY( bool bInitial ) aArea.Top() = nOldBottom; pWin->Invalidate(aArea); + + // invalidate other views + pCurView->InvalidateOtherViewWindows(aArea); } } @@ -1470,7 +1476,7 @@ void ScViewData::ResetEditView() { if (bEditActive[i]) { - lcl_LOKRemoveEditView(GetViewShell(), (ScSplitPos)(i)); + lcl_LOKRemoveWindow(GetViewShell(), (ScSplitPos)(i)); pEngine = pEditView[i]->GetEditEngine(); pEngine->RemoveView(pEditView[i]); pEditView[i]->SetOutputArea( Rectangle() ); |