Hi, I have submitted a patch for review:
https://gerrit.libreoffice.org/2579 To pull it, you can do: git pull ssh://gerrit.libreoffice.org:29418/core refs/changes/79/2579/1 group undo action when hiding sheets - the test if there are enough tabs before hiding is now in HideTabs - a vector is passed to Undo - modification of the displayed text - minor optimization on looping over sheets (exit when condition is fullfilled) Change-Id: I86196c6bb0f5fd6ba5b44c69efadc16b119a7f11 --- M sc/inc/globstr.hrc M sc/source/ui/docshell/docfunc.cxx M sc/source/ui/inc/undotab.hxx M sc/source/ui/inc/viewfunc.hxx M sc/source/ui/src/globstr.src M sc/source/ui/undo/undotab.cxx M sc/source/ui/view/tabvwshf.cxx M sc/source/ui/view/viewfun2.cxx 8 files changed, 68 insertions(+), 62 deletions(-) diff --git a/sc/inc/globstr.hrc b/sc/inc/globstr.hrc index 66da261..772b56a 100644 --- a/sc/inc/globstr.hrc +++ b/sc/inc/globstr.hrc @@ -381,7 +381,7 @@ #define STR_MATRIXFRAGMENTERR 310 #define STR_UNDO_SHOWTAB 311 -#define STR_UNDO_HIDETAB 312 +#define STR_UNDO_HIDETABS 312 #define STR_UNDO_INSERTAREALINK 313 #define STR_REIMPORT_AFTER_LOAD 314 diff --git a/sc/source/ui/docshell/docfunc.cxx b/sc/source/ui/docshell/docfunc.cxx index 7173a89..28c7af4 100644 --- a/sc/source/ui/docshell/docfunc.cxx +++ b/sc/source/ui/docshell/docfunc.cxx @@ -3079,7 +3079,7 @@ sal_uInt16 nVisCount = 0; SCTAB nCount = pDoc->GetTableCount(); - for (SCTAB i=0; i<nCount; i++) + for (SCTAB i=0; i<nCount && nVisCount<2; i++) if (pDoc->IsVisible(i)) ++nVisCount; @@ -3093,7 +3093,11 @@ pDoc->SetVisible( nTab, bVisible ); if (bUndo) - rDocShell.GetUndoManager()->AddUndoAction( new ScUndoShowHideTab( &rDocShell, nTab, bVisible ) ); + { + std::vector<SCTAB> undoTabs; + undoTabs.push_back(nTab); + rDocShell.GetUndoManager()->AddUndoAction( new ScUndoShowHideTab( &rDocShell, undoTabs, bVisible ) ); + } // Views updaten: if (!bVisible) diff --git a/sc/source/ui/inc/undotab.hxx b/sc/source/ui/inc/undotab.hxx index 5b7d8e6..764a320 100644 --- a/sc/source/ui/inc/undotab.hxx +++ b/sc/source/ui/inc/undotab.hxx @@ -333,7 +333,8 @@ TYPEINFO(); ScUndoShowHideTab( ScDocShell* pShell, - SCTAB nNewTab, sal_Bool bNewShow ); + std::vector<SCTAB> newUndoTabs, + sal_Bool bNewShow ); virtual ~ScUndoShowHideTab(); virtual void Undo(); @@ -344,8 +345,8 @@ virtual rtl::OUString GetComment() const; private: - SCTAB nTab; - sal_Bool bShow; + std::vector<SCTAB> undoTabs; + sal_Bool bShow; void DoChange( sal_Bool bShow ) const; }; diff --git a/sc/source/ui/inc/viewfunc.hxx b/sc/source/ui/inc/viewfunc.hxx index 748a386..dce6830 100644 --- a/sc/source/ui/inc/viewfunc.hxx +++ b/sc/source/ui/inc/viewfunc.hxx @@ -274,7 +274,7 @@ const String& rSource, sal_uLong nRefresh ); void ShowTable( const String& rName ); - void HideTable( SCTAB nTabNr ); + void HideTable( const ScMarkData& rMark ); void MakeScenario( const String& rName, const String& rComment, const Color& rColor, sal_uInt16 nFlags ); diff --git a/sc/source/ui/src/globstr.src b/sc/source/ui/src/globstr.src index 7305950..c0019d3 100644 --- a/sc/source/ui/src/globstr.src +++ b/sc/source/ui/src/globstr.src @@ -1140,9 +1140,9 @@ { Text [ en-US ] = "Show Sheet" ; }; - String STR_UNDO_HIDETAB + String STR_UNDO_HIDETABS { - Text [ en-US ] = "Hide sheet" ; + Text [ en-US ] = "Hide sheets" ; }; String STR_UNDO_TAB_RTL { diff --git a/sc/source/ui/undo/undotab.cxx b/sc/source/ui/undo/undotab.cxx index 9732e21..9ac8070 100644 --- a/sc/source/ui/undo/undotab.cxx +++ b/sc/source/ui/undo/undotab.cxx @@ -1117,9 +1117,9 @@ return false; } -ScUndoShowHideTab::ScUndoShowHideTab( ScDocShell* pShell, SCTAB nNewTab, sal_Bool bNewShow ) : +ScUndoShowHideTab::ScUndoShowHideTab( ScDocShell* pShell, std::vector<SCTAB> newUndoTabs, sal_Bool bNewShow ) : ScSimpleUndo( pShell ), - nTab( nNewTab ), + undoTabs( newUndoTabs ), bShow( bNewShow ) { } @@ -1131,11 +1131,17 @@ void ScUndoShowHideTab::DoChange( sal_Bool bShowP ) const { ScDocument* pDoc = pDocShell->GetDocument(); - pDoc->SetVisible( nTab, bShowP ); - ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell(); - if (pViewShell) - pViewShell->SetTabNo(nTab,sal_True); + + SCTAB nTab; + + for (size_t i = 0; i < undoTabs.size(); ++i) + { + nTab = undoTabs[i]; + pDoc->SetVisible( nTab, bShowP ); + if (pViewShell) + pViewShell->SetTabNo(nTab,sal_True); + } SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_TABLES_CHANGED ) ); pDocShell->SetDocumentModified(); @@ -1166,7 +1172,7 @@ rtl::OUString ScUndoShowHideTab::GetComment() const { - sal_uInt16 nId = bShow ? STR_UNDO_SHOWTAB : STR_UNDO_HIDETAB; + sal_uInt16 nId = bShow ? STR_UNDO_SHOWTAB : STR_UNDO_HIDETABS; return ScGlobal::GetRscString( nId ); } diff --git a/sc/source/ui/view/tabvwshf.cxx b/sc/source/ui/view/tabvwshf.cxx index f3b629d..9131538 100644 --- a/sc/source/ui/view/tabvwshf.cxx +++ b/sc/source/ui/view/tabvwshf.cxx @@ -84,18 +84,11 @@ if( ! bVisible ) // ausblenden { - ScMarkData& rMark = pViewData->GetMarkData(); - SCTAB nTabSelCount = rMark.GetSelectCount(); - sal_uInt16 nVis = 0; - for ( SCTAB i=0; i < nTabCount && nVis<2; i++ ) - if (pDoc->IsVisible(i)) - ++nVis; - if ( nVis<2 || !pDoc->IsDocEditable() || nTabSelCount > 1 ) - break; - - SCTAB nHideTab; - if (pDoc->GetTable( aName, nHideTab )) - HideTable( nHideTab ); + if ( pDoc->IsDocEditable() ) + { + ScMarkData& rMark = pViewData->GetMarkData(); + HideTable( rMark ); + } } else // einblenden { @@ -106,27 +99,10 @@ case FID_TABLE_HIDE: { - ScMarkData& rMark = pViewData->GetMarkData(); - SCTAB nTabSelCount = rMark.GetSelectCount(); - sal_uInt16 nVis = 0; - - // check to make sure we won't hide all sheets. we need at least one visible at all times. - for ( SCTAB i=0; i < nTabCount && nVis<nTabSelCount + 1; i++ ) - if (pDoc->IsVisible(i)) - ++nVis; - if ( nVis<=nTabSelCount || !pDoc->IsDocEditable() ) - break; - - SCTAB nHideTab; - ScMarkData::MarkedTabsType::const_iterator it; - - ScMarkData::MarkedTabsType selectedTabs = rMark.GetSelectedTabs(); - - for (it=selectedTabs.begin(); it!=selectedTabs.end(); ++it) + if ( pDoc->IsDocEditable() ) { - nHideTab = *it; - if (pDoc->IsVisible( nHideTab )) - HideTable( nHideTab ); + ScMarkData& rMark = pViewData->GetMarkData(); + HideTable( rMark ); } } break; diff --git a/sc/source/ui/view/viewfun2.cxx b/sc/source/ui/view/viewfun2.cxx index b7d5221..bc11eaa 100644 --- a/sc/source/ui/view/viewfun2.cxx +++ b/sc/source/ui/view/viewfun2.cxx @@ -2803,13 +2803,13 @@ SCTAB nPos = 0; rtl::OUString aTabName; SCTAB nCount = pDoc->GetTableCount(); - for (SCTAB i=0; i<nCount; i++) + for (SCTAB i=0; i<nCount && !bFound; i++) { pDoc->GetName( i, aTabName ); if ( aTabName.equals(rName) ) { nPos = i; - bFound = sal_True; + bFound = true; } } @@ -2818,7 +2818,9 @@ pDoc->SetVisible( nPos, sal_True ); if (bUndo) { - pDocSh->GetUndoManager()->AddUndoAction( new ScUndoShowHideTab( pDocSh, nPos, sal_True ) ); + std::vector<SCTAB> undoTabs; + undoTabs.push_back(nPos); + pDocSh->GetUndoManager()->AddUndoAction( new ScUndoShowHideTab( pDocSh, undoTabs, true ) ); } SetTabNo( nPos, sal_True ); SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_TABLES_CHANGED ) ); @@ -2830,31 +2832,48 @@ //---------------------------------------------------------------------------- -void ScViewFunc::HideTable( SCTAB nTab ) +void ScViewFunc::HideTable( const ScMarkData& rMark ) { ScDocShell* pDocSh = GetViewData()->GetDocShell(); ScDocument* pDoc = pDocSh->GetDocument(); sal_Bool bUndo(pDoc->IsUndoEnabled()); SCTAB nVisible = 0; - SCTAB nCount = pDoc->GetTableCount(); - for (SCTAB i=0; i<nCount; i++) - { + SCTAB nTabCount = pDoc->GetTableCount(); + + SCTAB nTabSelCount = rMark.GetSelectCount(); + + // check to make sure we won't hide all sheets. we need at least one visible at all times. + for ( SCTAB i=0; i < nTabCount && nVisible<nTabSelCount + 1; i++ ) if (pDoc->IsVisible(i)) ++nVisible; - } - if (nVisible > 1) + if (nVisible > nTabSelCount) { - pDoc->SetVisible( nTab, false ); + SCTAB nTab; + ScMarkData::MarkedTabsType::const_iterator it; + std::vector<SCTAB> undoTabs; + + ScMarkData::MarkedTabsType selectedTabs = rMark.GetSelectedTabs(); + for (it=selectedTabs.begin(); it!=selectedTabs.end(); ++it) + { + nTab = *it; + if (pDoc->IsVisible( nTab )) + { + pDoc->SetVisible( nTab, false ); + // Update views + pDocSh->Broadcast( ScTablesHint( SC_TAB_HIDDEN, nTab ) ); + SetTabNo( nTab, true ); + // Store for undo + if (bUndo) + undoTabs.push_back(nTab); + } + } if (bUndo) { - pDocSh->GetUndoManager()->AddUndoAction( new ScUndoShowHideTab( pDocSh, nTab, false ) ); + pDocSh->GetUndoManager()->AddUndoAction( new ScUndoShowHideTab( pDocSh, undoTabs, false ) ); } // Update views - pDocSh->Broadcast( ScTablesHint( SC_TAB_HIDDEN, nTab ) ); - - SetTabNo( nTab, sal_True ); SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_TABLES_CHANGED ) ); pDocSh->PostPaint(0,0,0,MAXCOL,MAXROW,MAXTAB, PAINT_EXTRAS); pDocSh->SetDocumentModified(); -- To view, visit https://gerrit.libreoffice.org/2579 To unsubscribe, visit https://gerrit.libreoffice.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I86196c6bb0f5fd6ba5b44c69efadc16b119a7f11 Gerrit-PatchSet: 1 Gerrit-Project: core Gerrit-Branch: master Gerrit-Owner: Laurent Godard <lgodard.li...@laposte.net> _______________________________________________ LibreOffice mailing list LibreOffice@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice