diff options
Diffstat (limited to 'sc')
-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 |
4 files changed, 64 insertions, 34 deletions
diff --git a/sc/source/ui/inc/tabview.hxx b/sc/source/ui/inc/tabview.hxx index 4de89b701aca..43aaf7d0c471 100644 --- a/sc/source/ui/inc/tabview.hxx +++ b/sc/source/ui/inc/tabview.hxx @@ -489,8 +489,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 f3b56e22cb8a..14fbad91a666 100644 --- a/sc/source/ui/view/tabview3.cxx +++ b/sc/source/ui/view/tabview3.cxx @@ -1915,12 +1915,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); } @@ -1942,7 +1942,7 @@ void ScTabView::OnLibreOfficeKitTabChanged() { if (rOtherViewData.HasEditView( (ScSplitPos)(i))) { - pThisViewShell->AddEditViewToOtherView(pOtherViewShell, (ScSplitPos)(i)); + pThisViewShell->AddWindowToForeignEditView(pOtherViewShell, (ScSplitPos)(i)); } } } @@ -1952,7 +1952,7 @@ void ScTabView::OnLibreOfficeKitTabChanged() { if (rOtherViewData.HasEditView( (ScSplitPos)(i))) { - pThisViewShell->RemoveEditViewFromOtherView(pOtherViewShell, (ScSplitPos)(i)); + pThisViewShell->RemoveWindowFromForeignEditView(pOtherViewShell, (ScSplitPos)(i)); } } } @@ -2044,6 +2044,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 @@ -2054,7 +2055,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 @@ -2070,8 +2076,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 ); pGridWin[i]->UpdateSelectionOverlay(); diff --git a/sc/source/ui/view/tabview5.cxx b/sc/source/ui/view/tabview5.cxx index 710b6a784a53..83d9094be120 100644 --- a/sc/source/ui/view/tabview5.cxx +++ b/sc/source/ui/view/tabview5.cxx @@ -164,18 +164,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 e45a1d5fe9a2..b14d84621277 100644 --- a/sc/source/ui/view/viewdata.cxx +++ b/sc/source/ui/view/viewdata.cxx @@ -77,15 +77,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); } } @@ -961,13 +961,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"); } @@ -982,6 +982,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(); @@ -1137,23 +1154,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_TYPED( ScViewData, EditEngineHdl, EditStatus&, rStatus, void ) @@ -1352,6 +1352,9 @@ void ScViewData::EditGrowX() else if ( !bAsianVertical && !bGrowToLeft && !bGrowCentered ) aArea.Left() = nOldRight; pWin->Invalidate(aArea); + + // invalidate other views + pCurView->InvalidateOtherViewWindows(aArea); } } @@ -1432,6 +1435,9 @@ void ScViewData::EditGrowY( bool bInitial ) aArea.Top() = nOldBottom; pWin->Invalidate(aArea); + + // invalidate other views + pCurView->InvalidateOtherViewWindows(aArea); } } @@ -1443,7 +1449,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() ); |