[PATCH] group undo action when hiding sheets
Laurent Godard (via Code Review)
gerrit at gerrit.libreoffice.org
Thu Mar 7 01:05:06 PST 2013
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.libre at laposte.net>
More information about the LibreOffice
mailing list