summaryrefslogtreecommitdiff
path: root/sc
diff options
context:
space:
mode:
authorMarco Cecchetti <marco.cecchetti@collabora.com>2016-10-11 22:50:53 +0200
committerMarco Cecchetti <mrcekets@gmail.com>2016-10-14 11:15:48 +0000
commit2cc717877527d0791cf879c3d9b38b967e0f094f (patch)
tree0027813d2eeb9c2741bbeaa3c708795ff726ae62 /sc
parent171ad6702e3a2346ed18d352fdcc457fff0024ea (diff)
LOK: Calc: fixed missed tile invalidations on cell text editing
What's new: 1) when an edit view is killed, the area which was used by the edit view is invalidated for both own window and other view windows after the edit view has been destroyed; 2) when an edit view is created or its out area is expanded, the windows of other views are invalidated too; 3) when a vertical scroll occurs in the edit view area the windows of other view are invalidated too; 4) same methods renaming since now we add/remove windows not edit views. Change-Id: Iac54f5b182c9562f08bb724f9ddde1c26cffa2e7 Reviewed-on: https://gerrit.libreoffice.org/29740 Reviewed-by: Marco Cecchetti <mrcekets@gmail.com> Tested-by: Marco Cecchetti <mrcekets@gmail.com>
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() );