summaryrefslogtreecommitdiff
path: root/sc
diff options
context:
space:
mode:
Diffstat (limited to 'sc')
-rw-r--r--sc/source/ui/inc/tabview.hxx4
-rw-r--r--sc/source/ui/view/tabview3.cxx34
-rw-r--r--sc/source/ui/view/tabview5.cxx6
-rw-r--r--sc/source/ui/view/viewdata.cxx54
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() );