summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKohei Yoshida <kohei.yoshida@gmail.com>2012-12-03 16:12:21 -0500
committerKohei Yoshida <kohei.yoshida@gmail.com>2012-12-03 16:37:43 -0500
commit2792670a53deca5ccd5b0f23faa7f1816684945d (patch)
tree165854214c9fffb4aab49526ba43afb351008c2a
parent8b568c1dd472021ebeb9d1536a8aab7e0b286074 (diff)
Use mdds::flag_segment_tree to store column flags/widths.
Just like we do with the row height / flags. Change-Id: Ia55dc81fa8d238251c800fe5f87890b9ae4b4901
-rw-r--r--sc/source/filter/excel/colrowst.cxx68
-rw-r--r--sc/source/filter/inc/colrowst.hxx20
2 files changed, 64 insertions, 24 deletions
diff --git a/sc/source/filter/excel/colrowst.cxx b/sc/source/filter/excel/colrowst.cxx
index f77779fb22ec..5483324cd1ef 100644
--- a/sc/source/filter/excel/colrowst.cxx
+++ b/sc/source/filter/excel/colrowst.cxx
@@ -52,8 +52,8 @@ const sal_uInt8 EXC_COLROW_MAN = 0x08;
XclImpColRowSettings::XclImpColRowSettings( const XclImpRoot& rRoot ) :
XclImpRoot( rRoot ),
- maWidths( MAXCOLCOUNT, 0 ),
- maColFlags( MAXCOLCOUNT, 0 ),
+ maColWidths(0, MAXCOLCOUNT, 0),
+ maColFlags(0, MAXCOLCOUNT, 0),
maRowHeights(0, MAXROWCOUNT, 0),
maRowFlags(0, MAXROWCOUNT, 0),
maHiddenRows(0, MAXROWCOUNT, false),
@@ -88,7 +88,6 @@ void XclImpColRowSettings::SetDefWidth( sal_uInt16 nDefWidth, bool bStdWidthRec
void XclImpColRowSettings::SetWidthRange( SCCOL nScCol1, SCCOL nScCol2, sal_uInt16 nWidth )
{
- OSL_ENSURE( (nScCol1 <= nScCol2) && ValidCol( nScCol2 ), "XclImpColRowSettings::SetColWidthRange - invalid column range" );
nScCol2 = ::std::min( nScCol2, MAXCOL );
if (nScCol2 == 256)
// In BIFF8, the column range is 0-255, and the use of 256 probably
@@ -97,24 +96,28 @@ void XclImpColRowSettings::SetWidthRange( SCCOL nScCol1, SCCOL nScCol2, sal_uInt
nScCol2 = MAXCOL;
nScCol1 = ::std::min( nScCol1, nScCol2 );
- ::std::fill( maWidths.begin() + nScCol1, maWidths.begin() + nScCol2 + 1, nWidth );
- for( ScfUInt8Vec::iterator aIt = maColFlags.begin() + nScCol1, aEnd = maColFlags.begin() + nScCol2 + 1; aIt != aEnd; ++aIt )
- ::set_flag( *aIt, EXC_COLROW_USED );
+ maColWidths.insert_back(nScCol1, nScCol2+1, nWidth);
+
+ // We need to apply flag values individually since all flag values are aggregated for each column.
+ for (SCCOL nCol = nScCol1; nCol <= nScCol2; ++nCol)
+ ApplyColFlag(nCol, EXC_COLROW_USED);
}
void XclImpColRowSettings::HideCol( SCCOL nScCol )
{
- if( ValidCol( nScCol ) )
- ::set_flag( maColFlags[ nScCol ], EXC_COLROW_HIDDEN );
+ if (!ValidCol(nScCol))
+ return;
+
+ ApplyColFlag(nScCol, EXC_COLROW_HIDDEN);
}
void XclImpColRowSettings::HideColRange( SCCOL nScCol1, SCCOL nScCol2 )
{
- OSL_ENSURE( (nScCol1 <= nScCol2) && ValidCol( nScCol2 ), "XclImpColRowSettings::HideColRange - invalid column range" );
nScCol2 = ::std::min( nScCol2, MAXCOL );
nScCol1 = ::std::min( nScCol1, nScCol2 );
- for( ScfUInt8Vec::iterator aIt = maColFlags.begin() + nScCol1, aEnd = maColFlags.begin() + nScCol2 + 1; aIt != aEnd; ++aIt )
- ::set_flag( *aIt, EXC_COLROW_HIDDEN );
+
+ for (SCCOL nCol = nScCol1; nCol <= nScCol2; ++nCol)
+ ApplyColFlag(nCol, EXC_COLROW_HIDDEN);
}
void XclImpColRowSettings::SetDefHeight( sal_uInt16 nDefHeight, sal_uInt16 nFlags )
@@ -207,15 +210,23 @@ void XclImpColRowSettings::Convert( SCTAB nScTab )
// column widths ----------------------------------------------------------
+ maColWidths.build_tree();
for( SCCOL nScCol = 0; nScCol <= MAXCOL; ++nScCol )
{
- sal_uInt16 nWidth = ::get_flag( maColFlags[ nScCol ], EXC_COLROW_USED ) ? maWidths[ nScCol ] : mnDefWidth;
+ sal_uInt16 nWidth = mnDefWidth;
+ if (GetColFlag(nScCol, EXC_COLROW_USED))
+ {
+ sal_uInt16 nTmp;
+ if (maColWidths.search_tree(nScCol, nTmp))
+ nWidth = nTmp;
+ }
+
/* Hidden columns: remember hidden state, but do not set hidden state
in document here. Needed for #i11776#, no HIDDEN flags in the
document, until filters and outlines are inserted. */
if( nWidth == 0 )
{
- ::set_flag( maColFlags[ nScCol ], EXC_COLROW_HIDDEN );
+ ApplyColFlag(nScCol, EXC_COLROW_HIDDEN);
nWidth = mnDefWidth;
}
rDoc.SetColWidthOnly( nScCol, nScTab, nWidth );
@@ -233,7 +244,7 @@ void XclImpColRowSettings::Convert( SCTAB nScTab )
if (!maRowHeights.is_tree_valid())
return;
- RowFlagsType::const_iterator itrFlags = maRowFlags.begin(), itrFlagsEnd = maRowFlags.end();
+ ColRowFlagsType::const_iterator itrFlags = maRowFlags.begin(), itrFlagsEnd = maRowFlags.end();
SCROW nPrevRow = -1;
sal_uInt8 nPrevFlags = 0;
for (; itrFlags != itrFlagsEnd; ++itrFlags)
@@ -295,7 +306,7 @@ void XclImpColRowSettings::ConvertHiddenFlags( SCTAB nScTab )
// hide the columns
for( SCCOL nScCol = 0; nScCol <= MAXCOL; ++nScCol )
- if( ::get_flag( maColFlags[ nScCol ], EXC_COLROW_HIDDEN ) )
+ if (GetColFlag(nScCol, EXC_COLROW_HIDDEN))
rDoc.ShowCol( nScCol, nScTab, false );
// #i38093# rows hidden by filter need extra flag
@@ -335,7 +346,7 @@ void XclImpColRowSettings::ConvertHiddenFlags( SCTAB nScTab )
{
if (bPrevHidden)
{
- rDoc.SetRowHidden(nPrevRow, nRow-1, nScTab, true); // #i116460# SetRowHidden instead of ShowRow
+ rDoc.ShowRows(nPrevRow, nRow-1, nScTab, false);
// #i38093# rows hidden by filter need extra flag
if (nFirstFilterScRow <= nPrevRow && nPrevRow <= nLastFilterScRow)
{
@@ -354,4 +365,29 @@ void XclImpColRowSettings::ConvertHiddenFlags( SCTAB nScTab )
rDoc.ShowRows( mnLastScRow + 1, MAXROW, nScTab, false );
}
+void XclImpColRowSettings::ApplyColFlag(SCCOL nCol, sal_uInt8 nNewVal)
+{
+ // Get the original flag value.
+ sal_uInt8 nFlagVal = 0;
+ std::pair<ColRowFlagsType::const_iterator,bool> r = maColFlags.search(nCol, nFlagVal);
+ if (!r.second)
+ // Search failed.
+ return;
+
+ ::set_flag(nFlagVal, nNewVal);
+
+ // Re-insert the flag value.
+ maColFlags.insert(r.first, nCol, nCol+1, nFlagVal);
+}
+
+bool XclImpColRowSettings::GetColFlag(SCCOL nCol, sal_uInt8 nMask) const
+{
+ sal_uInt8 nFlagVal = 0;
+ if (!maColFlags.search(nCol, nFlagVal).second)
+ return false;
+ // Search failed.
+
+ return ::get_flag(nFlagVal, nMask);
+}
+
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/source/filter/inc/colrowst.hxx b/sc/source/filter/inc/colrowst.hxx
index e906a5242db4..21842b3ac2c2 100644
--- a/sc/source/filter/inc/colrowst.hxx
+++ b/sc/source/filter/inc/colrowst.hxx
@@ -57,15 +57,19 @@ public:
void ConvertHiddenFlags( SCTAB nScTab );
private:
- ScfUInt16Vec maWidths; /// Column widths in twips.
- ScfUInt8Vec maColFlags; /// Flags for all columns.
- ///
- typedef ::mdds::flat_segment_tree<SCROW, sal_uInt16> RowHeightsType;
- typedef ::mdds::flat_segment_tree<SCROW, sal_uInt8> RowFlagsType;
+ void ApplyColFlag(SCCOL nCol, sal_uInt8 nNewVal);
+ bool GetColFlag(SCCOL nCol, sal_uInt8 nMask) const;
+
+private:
+ typedef ::mdds::flat_segment_tree<SCROW, sal_uInt16> WidthHeightStoreType;
+ typedef ::mdds::flat_segment_tree<SCROW, sal_uInt8> ColRowFlagsType;
typedef ::mdds::flat_segment_tree<SCROW, bool> RowHiddenType;
- RowHeightsType maRowHeights;
- RowFlagsType maRowFlags;
- RowHiddenType maHiddenRows;
+
+ WidthHeightStoreType maColWidths;
+ ColRowFlagsType maColFlags;
+ WidthHeightStoreType maRowHeights;
+ ColRowFlagsType maRowFlags;
+ RowHiddenType maHiddenRows;
SCROW mnLastScRow;