From 84ab11c230846101b6c77efc88cdf4d25f2a3a87 Mon Sep 17 00:00:00 2001 From: Kohei Yoshida Date: Mon, 29 Nov 2010 19:20:22 -0500 Subject: Re-calculate visible range when switching sheets. Visible range of the current sheet is used to decide whether or not to render cell cursor. Failing to do that was causing the cursor to disappear when switching sheets while the cursor on the current sheet was invisible. (fdo#31753) --- sc/source/ui/inc/gridwin.hxx | 1 + sc/source/ui/inc/tabview.hxx | 1 + sc/source/ui/view/gridwin2.cxx | 16 ++++++++++++++++ sc/source/ui/view/gridwin4.cxx | 40 +++++++++++++++++----------------------- sc/source/ui/view/tabview.cxx | 11 +++++++++++ sc/source/ui/view/tabview3.cxx | 8 ++++---- 6 files changed, 50 insertions(+), 27 deletions(-) (limited to 'sc/source/ui') diff --git a/sc/source/ui/inc/gridwin.hxx b/sc/source/ui/inc/gridwin.hxx index f847dd919791..294287aada3e 100644 --- a/sc/source/ui/inc/gridwin.hxx +++ b/sc/source/ui/inc/gridwin.hxx @@ -394,6 +394,7 @@ public: void CheckNeedsRepaint(); void UpdateDPFromFieldPopupMenu(); + void UpdateVisibleRange(); // #114409# void CursorChanged(); diff --git a/sc/source/ui/inc/tabview.hxx b/sc/source/ui/inc/tabview.hxx index 3bfc8096c3a5..5ff45c883668 100644 --- a/sc/source/ui/inc/tabview.hxx +++ b/sc/source/ui/inc/tabview.hxx @@ -210,6 +210,7 @@ protected: void ZoomChanged(); void UpdateShow(); + void UpdateVisibleRange(); void GetBorderSize( SvBorder& rBorder, const Size& rSize ); void ResetDrawDragMode(); diff --git a/sc/source/ui/view/gridwin2.cxx b/sc/source/ui/view/gridwin2.cxx index 4aa2b1476759..dd19b66fcf25 100644 --- a/sc/source/ui/view/gridwin2.cxx +++ b/sc/source/ui/view/gridwin2.cxx @@ -594,6 +594,22 @@ void ScGridWindow::UpdateDPFromFieldPopupMenu() aFunc.DataPilotUpdate(pDPObj, &aNewDPObj, true, false); } +void ScGridWindow::UpdateVisibleRange() +{ + SCCOL nPosX = pViewData->GetPosX(eHWhich); + SCROW nPosY = pViewData->GetPosY(eVWhich); + SCCOL nXRight = nPosX + pViewData->VisibleCellsX(eHWhich); + if (nXRight > MAXCOL) nXRight = MAXCOL; + SCROW nYBottom = nPosY + pViewData->VisibleCellsY(eVWhich); + if (nYBottom > MAXROW) nYBottom = MAXROW; + + // Store the current visible range. + maVisibleRange.mnCol1 = nPosX; + maVisibleRange.mnCol2 = nXRight; + maVisibleRange.mnRow1 = nPosY; + maVisibleRange.mnRow2 = nYBottom; +} + void ScGridWindow::DPMouseMove( const MouseEvent& rMEvt ) { DPTestMouse( rMEvt, TRUE ); diff --git a/sc/source/ui/view/gridwin4.cxx b/sc/source/ui/view/gridwin4.cxx index 136522fec177..1c5ec44dd44d 100644 --- a/sc/source/ui/view/gridwin4.cxx +++ b/sc/source/ui/view/gridwin4.cxx @@ -432,32 +432,26 @@ void ScGridWindow::Draw( SCCOL nX1, SCROW nY1, SCCOL nX2, SCROW nY2, ScUpdateMod DBG_ASSERT( ValidCol(nX2) && ValidRow(nY2), "GridWin Draw Bereich zu gross" ); - SCCOL nPosX = pViewData->GetPosX( eHWhich ); - SCROW nPosY = pViewData->GetPosY( eVWhich ); - if (nX2 < nPosX || nY2 < nPosY) - return; // unsichtbar - if (nX1 < nPosX) nX1 = nPosX; - if (nY1 < nPosY) nY1 = nPosY; + UpdateVisibleRange(); - SCCOL nXRight = nPosX + pViewData->VisibleCellsX(eHWhich); - if (nXRight > MAXCOL) nXRight = MAXCOL; - SCROW nYBottom = nPosY + pViewData->VisibleCellsY(eVWhich); - if (nYBottom > MAXROW) nYBottom = MAXROW; + if (nX2 < maVisibleRange.mnCol1 || nY2 < maVisibleRange.mnRow1) + return; + // unsichtbar + if (nX1 < maVisibleRange.mnCol1) + nX1 = maVisibleRange.mnCol1; + if (nY1 < maVisibleRange.mnRow1) + nY1 = maVisibleRange.mnRow1; - // Store the current visible range. - maVisibleRange.mnCol1 = nPosX; - maVisibleRange.mnCol2 = nXRight; - maVisibleRange.mnRow1 = nPosY; - maVisibleRange.mnRow2 = nYBottom; + if (nX1 > maVisibleRange.mnCol2 || nY1 > maVisibleRange.mnRow2) + return; - if (nX1 > nXRight || nY1 > nYBottom) - return; // unsichtbar - if (nX2 > nXRight) nX2 = nXRight; - if (nY2 > nYBottom) nY2 = nYBottom; + if (nX2 > maVisibleRange.mnCol2) + nX2 = maVisibleRange.mnCol2; + if (nY2 > maVisibleRange.mnRow2) + nY2 = maVisibleRange.mnRow2; - if ( eMode != SC_UPDATE_MARKS ) - if (nX2 < nXRight) - nX2 = nXRight; // zum Weiterzeichnen + if ( eMode != SC_UPDATE_MARKS && nX2 < maVisibleRange.mnCol2) + nX2 = maVisibleRange.mnCol2; // zum Weiterzeichnen // ab hier kein return mehr @@ -475,7 +469,7 @@ void ScGridWindow::Draw( SCCOL nX1, SCROW nY1, SCCOL nX2, SCROW nY2, ScUpdateMod long nLayoutSign = bLayoutRTL ? -1 : 1; if ( bLayoutRTL ) { - long nEndPixel = pViewData->GetScrPos( nX2+1, nPosY, eWhich ).X(); + long nEndPixel = pViewData->GetScrPos( nX2+1, maVisibleRange.mnRow1, eWhich ).X(); nMirrorWidth = aScrPos.X() - nEndPixel; aScrPos.X() = nEndPixel + 1; } diff --git a/sc/source/ui/view/tabview.cxx b/sc/source/ui/view/tabview.cxx index 01877252b078..195015c72c54 100644 --- a/sc/source/ui/view/tabview.cxx +++ b/sc/source/ui/view/tabview.cxx @@ -1691,6 +1691,17 @@ void ScTabView::UpdateShow() //! neue Gridwindows eintragen } +void ScTabView::UpdateVisibleRange() +{ + for (int i = 0; i < 4; ++i) + { + if (!pGridWin[i]) + continue; + + pGridWin[i]->UpdateVisibleRange(); + } +} + // --- Splitter -------------------------------------------------------- IMPL_LINK( ScTabView, SplitHdl, Splitter*, pSplitter ) diff --git a/sc/source/ui/view/tabview3.cxx b/sc/source/ui/view/tabview3.cxx index bffd30928982..e963dca31f2d 100644 --- a/sc/source/ui/view/tabview3.cxx +++ b/sc/source/ui/view/tabview3.cxx @@ -1638,13 +1638,13 @@ void ScTabView::SetTabNo( SCTAB nTab, BOOL bNew, BOOL bExtendSelection ) if ( bRefMode ) // hide EditView if necessary (after aViewData.SetTabNo !) { - for ( USHORT i=0; i<4; i++ ) - if ( pGridWin[i] ) - if ( pGridWin[i]->IsVisible() ) - pGridWin[i]->UpdateEditViewPos(); + for (USHORT i = 0; i < 4; ++i) + if (pGridWin[i] && pGridWin[i]->IsVisible()) + pGridWin[i]->UpdateEditViewPos(); } TabChanged(); // DrawView + UpdateVisibleRange(); aViewData.GetViewShell()->WindowChanged(); // falls das aktive Fenster anders ist if ( !bUnoRefDialog ) -- cgit