blob: 01d27bfa230a0dbe6ba4a527d1f982136842405c [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
#ifndef SC_TABLE_HXX
#define SC_TABLE_HXX
#include <vector>
#include <memory>
#include <utility>
#include <tools/gen.hxx>
#include <tools/color.hxx>
#include <com/sun/star/uno/Sequence.hxx>
#include "column.hxx"
#include "sortparam.hxx"
#include "compressedarray.hxx"
#include <memory>
#include <set>
#include <boost/shared_ptr.hpp>
namespace utl {
class SearchParam;
class TextSearch;
}
namespace com { namespace sun { namespace star {
namespace sheet {
struct TablePageBreakData;
}
} } }
class SfxItemSet;
class SfxStyleSheetBase;
class SvxBoxInfoItem;
class SvxBoxItem;
class SvxSearchItem;
class ScAutoFormat;
class ScAutoFormatData;
class ScBaseCell;
class ScDocument;
class ScDrawLayer;
class ScFormulaCell;
class ScOutlineTable;
class ScPostIt;
class ScPrintSaverTab;
class ScProgress;
class ScProgress;
class ScRangeList;
class ScSheetEvents;
class ScSortInfoArray;
class ScStyleSheet;
class ScTableLink;
class ScTableProtection;
class ScUserListData;
struct RowInfo;
struct ScFunctionData;
struct ScLineFlags;
class CollatorWrapper;
class ScFlatUInt16RowSegments;
class ScFlatBoolRowSegments;
class ScFlatBoolColSegments;
struct ScShowRowsEntry
{
SCROW mnRow1;
SCROW mnRow2;
bool mbShow;
ScShowRowsEntry( SCROW nR1, SCROW nR2, bool bS ) :
mnRow1(nR1), mnRow2(nR2), mbShow(bS) {}
};
class ScTable
{
private:
typedef ::std::vector< ScRange > ScRangeVec;
typedef ::std::pair< SCCOL, SCROW > ScAddress2D;
typedef ::std::vector< ScAddress2D > ScAddress2DVec;
typedef ::std::auto_ptr< ScAddress2DVec > ScAddress2DVecPtr;
// Daten pro Tabelle ------------------
ScColumn aCol[MAXCOLCOUNT];
String aName;
String aCodeName;
String aComment;
sal_Bool bScenario;
sal_Bool bLayoutRTL;
sal_Bool bLoadingRTL;
String aLinkDoc;
String aLinkFlt;
String aLinkOpt;
String aLinkTab;
sal_uLong nLinkRefreshDelay;
sal_uInt8 nLinkMode;
// Seitenformatvorlage
String aPageStyle;
sal_Bool bPageSizeValid;
Size aPageSizeTwips; // Groesse der Druck-Seite
SCCOL nRepeatStartX; // Wiederholungszeilen/Spalten
SCCOL nRepeatEndX; // REPEAT_NONE, wenn nicht benutzt
SCROW nRepeatStartY;
SCROW nRepeatEndY;
::std::auto_ptr<ScTableProtection> pTabProtection;
sal_uInt16* pColWidth;
::boost::shared_ptr<ScFlatUInt16RowSegments> mpRowHeights;
sal_uInt8* pColFlags;
ScBitMaskCompressedArray< SCROW, sal_uInt8>* pRowFlags;
::boost::shared_ptr<ScFlatBoolColSegments> mpHiddenCols;
::boost::shared_ptr<ScFlatBoolRowSegments> mpHiddenRows;
::boost::shared_ptr<ScFlatBoolColSegments> mpFilteredCols;
::boost::shared_ptr<ScFlatBoolRowSegments> mpFilteredRows;
::std::set<SCROW> maRowPageBreaks;
::std::set<SCROW> maRowManualBreaks;
::std::set<SCCOL> maColPageBreaks;
::std::set<SCCOL> maColManualBreaks;
ScOutlineTable* pOutlineTable;
ScSheetEvents* pSheetEvents;
SCCOL nTableAreaX;
SCROW nTableAreaY;
sal_Bool bTableAreaValid;
// interne Verwaltung ------------------
sal_Bool bVisible;
sal_Bool bStreamValid;
sal_Bool bPendingRowHeights;
sal_Bool bCalcNotification;
SCTAB nTab;
sal_uInt16 nRecalcLvl; // Rekursionslevel Size-Recalc
ScDocument* pDocument;
utl::SearchParam* pSearchParam;
utl::TextSearch* pSearchText;
mutable String aUpperName; // #i62977# filled only on demand, reset in SetName
ScAddress2DVecPtr mxUninitNotes;
// SortierParameter um den Stackbedarf von Quicksort zu Minimieren
ScSortParam aSortParam;
CollatorWrapper* pSortCollator;
sal_Bool bGlobalKeepQuery;
sal_Bool bSharedNameInserted;
ScRangeVec aPrintRanges;
sal_Bool bPrintEntireSheet;
ScRange* pRepeatColRange;
ScRange* pRepeatRowRange;
sal_uInt16 nLockCount;
ScRangeList* pScenarioRanges;
Color aScenarioColor;
Color aTabBgColor;
sal_uInt16 nScenarioFlags;
sal_Bool bActiveScenario;
bool mbPageBreaksValid;
friend class ScDocument; // fuer FillInfo
friend class ScDocumentIterator;
friend class ScValueIterator;
friend class ScHorizontalValueIterator;
friend class ScDBQueryDataIterator;
friend class ScCellIterator;
friend class ScQueryCellIterator;
friend class ScHorizontalCellIterator;
friend class ScHorizontalAttrIterator;
friend class ScDocAttrIterator;
friend class ScAttrRectIterator;
public:
ScTable( ScDocument* pDoc, SCTAB nNewTab, const String& rNewName,
sal_Bool bColInfo = sal_True, sal_Bool bRowInfo = sal_True );
~ScTable();
ScOutlineTable* GetOutlineTable() { return pOutlineTable; }
SCSIZE GetCellCount(SCCOL nCol) const;
sal_uLong GetCellCount() const;
sal_uLong GetWeightedCount() const;
sal_uLong GetCodeCount() const; // RPN-Code in Formeln
sal_Bool SetOutlineTable( const ScOutlineTable* pNewOutline );
void StartOutlineTable();
void DoAutoOutline( SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow );
sal_Bool TestRemoveSubTotals( const ScSubTotalParam& rParam );
void RemoveSubTotals( ScSubTotalParam& rParam );
sal_Bool DoSubTotals( ScSubTotalParam& rParam );
const ScSheetEvents* GetSheetEvents() const { return pSheetEvents; }
void SetSheetEvents( const ScSheetEvents* pNew );
sal_Bool IsVisible() const { return bVisible; }
void SetVisible( sal_Bool bVis );
sal_Bool IsStreamValid() const { return bStreamValid; }
void SetStreamValid( sal_Bool bSet, sal_Bool bIgnoreLock = sal_False );
sal_Bool IsPendingRowHeights() const { return bPendingRowHeights; }
void SetPendingRowHeights( sal_Bool bSet );
sal_Bool GetCalcNotification() const { return bCalcNotification; }
void SetCalcNotification( sal_Bool bSet );
sal_Bool IsLayoutRTL() const { return bLayoutRTL; }
sal_Bool IsLoadingRTL() const { return bLoadingRTL; }
void SetLayoutRTL( sal_Bool bSet );
void SetLoadingRTL( sal_Bool bSet );
sal_Bool IsScenario() const { return bScenario; }
void SetScenario( sal_Bool bFlag );
void GetScenarioComment( String& rComment) const { rComment = aComment; }
void SetScenarioComment( const String& rComment ) { aComment = rComment; }
const Color& GetScenarioColor() const { return aScenarioColor; }
void SetScenarioColor(const Color& rNew) { aScenarioColor = rNew; }
const Color& GetTabBgColor() const;
void SetTabBgColor(const Color& rColor);
sal_uInt16 GetScenarioFlags() const { return nScenarioFlags; }
void SetScenarioFlags(sal_uInt16 nNew) { nScenarioFlags = nNew; }
void SetActiveScenario(sal_Bool bSet) { bActiveScenario = bSet; }
sal_Bool IsActiveScenario() const { return bActiveScenario; }
sal_uInt8 GetLinkMode() const { return nLinkMode; }
sal_Bool IsLinked() const { return nLinkMode != SC_LINK_NONE; }
const String& GetLinkDoc() const { return aLinkDoc; }
const String& GetLinkFlt() const { return aLinkFlt; }
const String& GetLinkOpt() const { return aLinkOpt; }
const String& GetLinkTab() const { return aLinkTab; }
sal_uLong GetLinkRefreshDelay() const { return nLinkRefreshDelay; }
void SetLink( sal_uInt8 nMode, const String& rDoc, const String& rFlt,
const String& rOpt, const String& rTab, sal_uLong nRefreshDelay );
void GetName( String& rName ) const;
void SetName( const String& rNewName );
void GetCodeName( String& rName ) const { rName = aCodeName; }
void SetCodeName( const String& rNewName ) { aCodeName = rNewName; }
const String& GetUpperName() const;
const String& GetPageStyle() const { return aPageStyle; }
void SetPageStyle( const String& rName );
void PageStyleModified( const String& rNewName );
sal_Bool IsProtected() const;
void SetProtection(const ScTableProtection* pProtect);
ScTableProtection* GetProtection();
Size GetPageSize() const;
void SetPageSize( const Size& rSize );
void SetRepeatArea( SCCOL nStartCol, SCCOL nEndCol, SCROW nStartRow, SCROW nEndRow );
void RemoveAutoSpellObj();
void LockTable();
void UnlockTable();
sal_Bool IsBlockEditable( SCCOL nCol1, SCROW nRow1, SCCOL nCol2,
SCROW nRow2, sal_Bool* pOnlyNotBecauseOfMatrix = NULL ) const;
sal_Bool IsSelectionEditable( const ScMarkData& rMark,
sal_Bool* pOnlyNotBecauseOfMatrix = NULL ) const;
sal_Bool HasBlockMatrixFragment( SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2 ) const;
sal_Bool HasSelectionMatrixFragment( const ScMarkData& rMark ) const;
sal_Bool IsBlockEmpty( SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2, bool bIgnoreNotes = false ) const;
void PutCell( const ScAddress&, ScBaseCell* pCell );
//UNUSED2009-05 void PutCell( const ScAddress&, sal_uLong nFormatIndex, ScBaseCell* pCell);
void PutCell( SCCOL nCol, SCROW nRow, ScBaseCell* pCell );
void PutCell(SCCOL nCol, SCROW nRow, sal_uLong nFormatIndex, ScBaseCell* pCell);
// sal_True = Zahlformat gesetzt
sal_Bool SetString( SCCOL nCol, SCROW nRow, SCTAB nTab, const String& rString,
SvNumberFormatter* pFormatter = NULL, bool bDetectNumberFormat = true );
void SetValue( SCCOL nCol, SCROW nRow, const double& rVal );
void SetError( SCCOL nCol, SCROW nRow, sal_uInt16 nError);
SCSIZE GetPatternCount( SCCOL nCol );
SCSIZE GetPatternCount( SCCOL nCol, SCROW nRw1, SCROW nRw2 );
bool ReservedPatternCount( SCCOL nCol, SCSIZE nReserved );
void GetString( SCCOL nCol, SCROW nRow, String& rString );
void FillDPCache( ScDPTableDataCache * pCache, SCCOL nStartCol, SCCOL nEndCol, SCROW nStartRow, SCROW nEndRow );
void GetInputString( SCCOL nCol, SCROW nRow, String& rString );
double GetValue( const ScAddress& rPos ) const
{
return ValidColRow(rPos.Col(),rPos.Row()) ?
aCol[rPos.Col()].GetValue( rPos.Row() ) :
0.0;
}
double GetValue( SCCOL nCol, SCROW nRow );
void GetFormula( SCCOL nCol, SCROW nRow, String& rFormula,
sal_Bool bAsciiExport = sal_False );
CellType GetCellType( const ScAddress& rPos ) const
{
return ValidColRow(rPos.Col(),rPos.Row()) ?
aCol[rPos.Col()].GetCellType( rPos.Row() ) :
CELLTYPE_NONE;
}
CellType GetCellType( SCCOL nCol, SCROW nRow ) const;
ScBaseCell* GetCell( const ScAddress& rPos ) const
{
return ValidColRow(rPos.Col(),rPos.Row()) ?
aCol[rPos.Col()].GetCell( rPos.Row() ) :
NULL;
}
ScBaseCell* GetCell( SCCOL nCol, SCROW nRow ) const;
void GetFirstDataPos(SCCOL& rCol, SCROW& rRow) const;
void GetLastDataPos(SCCOL& rCol, SCROW& rRow) const;
/** Returns the pointer to a cell note object at the passed cell address. */
ScPostIt* GetNote( SCCOL nCol, SCROW nRow );
/** Sets the passed cell note object at the passed cell address. Takes ownership! */
void TakeNote( SCCOL nCol, SCROW nRow, ScPostIt*& rpNote );
/** Returns and forgets the cell note object at the passed cell address. */
ScPostIt* ReleaseNote( SCCOL nCol, SCROW nRow );
/** Deletes the note at the passed cell address. */
void DeleteNote( SCCOL nCol, SCROW nRow );
/** Creates the captions of all uninitialized cell notes.
@param bForced True = always create all captions, false = skip when Undo is disabled. */
void InitializeNoteCaptions( bool bForced = false );
sal_Bool TestInsertRow( SCCOL nStartCol, SCCOL nEndCol, SCSIZE nSize );
void InsertRow( SCCOL nStartCol, SCCOL nEndCol, SCROW nStartRow, SCSIZE nSize );
void DeleteRow( SCCOL nStartCol, SCCOL nEndCol, SCROW nStartRow, SCSIZE nSize,
sal_Bool* pUndoOutline = NULL );
sal_Bool TestInsertCol( SCROW nStartRow, SCROW nEndRow, SCSIZE nSize );
void InsertCol( SCCOL nStartCol, SCROW nStartRow, SCROW nEndRow, SCSIZE nSize );
void DeleteCol( SCCOL nStartCol, SCROW nStartRow, SCROW nEndRow, SCSIZE nSize,
sal_Bool* pUndoOutline = NULL );
void DeleteArea(SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2, sal_uInt16 nDelFlag);
void CopyToClip(SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2, ScTable* pTable,
sal_Bool bKeepScenarioFlags, sal_Bool bCloneNoteCaptions);
void CopyToClip(const ScRangeList& rRanges, ScTable* pTable,
bool bKeepScenarioFlags, bool bCloneNoteCaptions);
void CopyFromClip(SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2, SCsCOL nDx, SCsROW nDy,
sal_uInt16 nInsFlag, sal_Bool bAsLink, sal_Bool bSkipAttrForEmpty, ScTable* pTable);
void StartListeningInArea( SCCOL nCol1, SCROW nRow1,
SCCOL nCol2, SCROW nRow2 );
void BroadcastInArea( SCCOL nCol1, SCROW nRow1,
SCCOL nCol2, SCROW nRow2 );
void CopyToTable(SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2,
sal_uInt16 nFlags, sal_Bool bMarked, ScTable* pDestTab,
const ScMarkData* pMarkData = NULL,
sal_Bool bAsLink = sal_False, sal_Bool bColRowFlags = sal_True);
void UndoToTable(SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2,
sal_uInt16 nFlags, sal_Bool bMarked, ScTable* pDestTab,
const ScMarkData* pMarkData = NULL);
void TransposeClip( SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2,
ScTable* pTransClip, sal_uInt16 nFlags, sal_Bool bAsLink );
// Markierung von diesem Dokument
void MixMarked( const ScMarkData& rMark, sal_uInt16 nFunction,
sal_Bool bSkipEmpty, ScTable* pSrcTab );
void MixData( SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2,
sal_uInt16 nFunction, sal_Bool bSkipEmpty, ScTable* pSrcTab );
void CopyData( SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow,
SCCOL nDestCol, SCROW nDestRow, SCTAB nDestTab );
void CopyScenarioFrom( const ScTable* pSrcTab );
void CopyScenarioTo( ScTable* pDestTab ) const;
sal_Bool TestCopyScenarioTo( const ScTable* pDestTab ) const;
void MarkScenarioIn( ScMarkData& rMark, sal_uInt16 nNeededBits ) const;
sal_Bool HasScenarioRange( const ScRange& rRange ) const;
void InvalidateScenarioRanges();
const ScRangeList* GetScenarioRanges() const;
void CopyUpdated( const ScTable* pPosTab, ScTable* pDestTab ) const;
void InvalidateTableArea();
void InvalidatePageBreaks();
sal_Bool GetCellArea( SCCOL& rEndCol, SCROW& rEndRow ) const; // sal_False = leer
sal_Bool GetTableArea( SCCOL& rEndCol, SCROW& rEndRow ) const;
sal_Bool GetPrintArea( SCCOL& rEndCol, SCROW& rEndRow, sal_Bool bNotes ) const;
sal_Bool GetPrintAreaHor( SCROW nStartRow, SCROW nEndRow,
SCCOL& rEndCol, sal_Bool bNotes ) const;
sal_Bool GetPrintAreaVer( SCCOL nStartCol, SCCOL nEndCol,
SCROW& rEndRow, sal_Bool bNotes ) const;
/*
Get the last cell's postion, which has visual attribute or data and has max row number among all columns.
*/
void GetLastAttrCell( SCCOL& rEndCol, SCROW& rEndRow ) const;
sal_Bool GetDataStart( SCCOL& rStartCol, SCROW& rStartRow ) const;
void ExtendPrintArea( OutputDevice* pDev,
SCCOL nStartCol, SCROW nStartRow, SCCOL& rEndCol, SCROW nEndRow );
void GetDataArea( SCCOL& rStartCol, SCROW& rStartRow, SCCOL& rEndCol, SCROW& rEndRow,
sal_Bool bIncludeOld, bool bOnlyDown ) const;
bool ShrinkToUsedDataArea( bool& o_bShrunk, SCCOL& rStartCol, SCROW& rStartRow,
SCCOL& rEndCol, SCROW& rEndRow, bool bColumnsOnly ) const;
SCSIZE GetEmptyLinesInBlock( SCCOL nStartCol, SCROW nStartRow,
SCCOL nEndCol, SCROW nEndRow, ScDirection eDir );
void FindAreaPos( SCCOL& rCol, SCROW& rRow, SCsCOL nMovX, SCsROW nMovY );
void GetNextPos( SCCOL& rCol, SCROW& rRow, SCsCOL nMovX, SCsROW nMovY,
sal_Bool bMarked, sal_Bool bUnprotected, const ScMarkData& rMark );
void LimitChartArea( SCCOL& rStartCol, SCROW& rStartRow, SCCOL& rEndCol, SCROW& rEndRow );
sal_Bool HasData( SCCOL nCol, SCROW nRow );
sal_Bool HasStringData( SCCOL nCol, SCROW nRow );
sal_Bool HasValueData( SCCOL nCol, SCROW nRow );
//UNUSED2008-05 sal_uInt16 GetErrorData(SCCOL nCol, SCROW nRow) const;
sal_Bool HasStringCells( SCCOL nStartCol, SCROW nStartRow,
SCCOL nEndCol, SCROW nEndRow ) const;
sal_uInt16 GetErrCode( const ScAddress& rPos ) const
{
return ValidColRow(rPos.Col(),rPos.Row()) ?
aCol[rPos.Col()].GetErrCode( rPos.Row() ) :
0;
}
//UNUSED2008-05 sal_uInt16 GetErrCode( SCCOL nCol, SCROW nRow ) const;
void ResetChanged( const ScRange& rRange );
void SetDirty();
void SetDirty( const ScRange& );
void SetDirtyAfterLoad();
void SetDirtyVar();
void SetTableOpDirty( const ScRange& );
void CalcAll();
void CalcAfterLoad();
void CompileAll();
void CompileXML( ScProgress& rProgress );
void UpdateReference( UpdateRefMode eUpdateRefMode, SCCOL nCol1, SCROW nRow1, SCTAB nTab1,
SCCOL nCol2, SCROW nRow2, SCTAB nTab2,
SCsCOL nDx, SCsROW nDy, SCsTAB nDz,
ScDocument* pUndoDoc = NULL, sal_Bool bIncludeDraw = sal_True, bool bUpdateNoteCaptionPos = true );
void UpdateDrawRef( UpdateRefMode eUpdateRefMode, SCCOL nCol1, SCROW nRow1, SCTAB nTab1,
SCCOL nCol2, SCROW nRow2, SCTAB nTab2,
SCsCOL nDx, SCsROW nDy, SCsTAB nDz, bool bUpdateNoteCaptionPos = true );
void UpdateTranspose( const ScRange& rSource, const ScAddress& rDest,
ScDocument* pUndoDoc );
void UpdateGrow( const ScRange& rArea, SCCOL nGrowX, SCROW nGrowY );
void UpdateInsertTab(SCTAB nTable);
//UNUSED2008-05 void UpdateInsertTabOnlyCells(SCTAB nTable);
void UpdateDeleteTab( SCTAB nTable, sal_Bool bIsMove, ScTable* pRefUndo = NULL );
void UpdateMoveTab(SCTAB nOldPos, SCTAB nNewPos, SCTAB nTabNo, ScProgress& );
void UpdateCompile( sal_Bool bForceIfNameInUse = sal_False );
void SetTabNo(SCTAB nNewTab);
sal_Bool IsRangeNameInUse(SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2,
sal_uInt16 nIndex) const;
void FindRangeNamesInUse(SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2,
std::set<sal_uInt16>& rIndexes) const;
void ReplaceRangeNamesInUse(SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2,
const ScRangeData::IndexMap& rMap );
void Fill( SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2,
sal_uLong nFillCount, FillDir eFillDir, FillCmd eFillCmd, FillDateCmd eFillDateCmd,
double nStepValue, double nMaxValue);
String GetAutoFillPreview( const ScRange& rSource, SCCOL nEndX, SCROW nEndY );
void UpdateSelectionFunction( ScFunctionData& rData,
SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow,
const ScMarkData& rMark );
void AutoFormat( SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow,
sal_uInt16 nFormatNo );
void GetAutoFormatData(SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow, ScAutoFormatData& rData);
void ScReplaceTabsStr( String& rStr, const String& rSrch, const String& rRepl ); // aus sw
sal_Bool SearchAndReplace(const SvxSearchItem& rSearchItem,
SCCOL& rCol, SCROW& rRow, ScMarkData& rMark,
String& rUndoStr, ScDocument* pUndoDoc);
void FindMaxRotCol( RowInfo* pRowInfo, SCSIZE nArrCount, SCCOL nX1, SCCOL nX2 );
void GetBorderLines( SCCOL nCol, SCROW nRow,
const SvxBorderLine** ppLeft, const SvxBorderLine** ppTop,
const SvxBorderLine** ppRight, const SvxBorderLine** ppBottom ) const;
//UNUSED2009-05 sal_Bool HasLines( const ScRange& rRange, Rectangle& rSizes ) const;
bool HasAttrib( SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2, sal_uInt16 nMask ) const;
sal_Bool HasAttribSelection( const ScMarkData& rMark, sal_uInt16 nMask ) const;
sal_Bool ExtendMerge( SCCOL nStartCol, SCROW nStartRow,
SCCOL& rEndCol, SCROW& rEndRow,
sal_Bool bRefresh, sal_Bool bAttrs );
const SfxPoolItem* GetAttr( SCCOL nCol, SCROW nRow, sal_uInt16 nWhich ) const;
const ScPatternAttr* GetPattern( SCCOL nCol, SCROW nRow ) const;
const ScPatternAttr* GetMostUsedPattern( SCCOL nCol, SCROW nStartRow, SCROW nEndRow ) const;
sal_uLong GetNumberFormat( const ScAddress& rPos ) const
{
return ValidColRow(rPos.Col(),rPos.Row()) ?
aCol[rPos.Col()].GetNumberFormat( rPos.Row() ) :
0;
}
sal_uLong GetNumberFormat( SCCOL nCol, SCROW nRow ) const;
void MergeSelectionPattern( ScMergePatternState& rState,
const ScMarkData& rMark, sal_Bool bDeep ) const;
void MergePatternArea( ScMergePatternState& rState, SCCOL nCol1, SCROW nRow1,
SCCOL nCol2, SCROW nRow2, sal_Bool bDeep ) const;
void MergeBlockFrame( SvxBoxItem* pLineOuter, SvxBoxInfoItem* pLineInner,
ScLineFlags& rFlags,
SCCOL nStartCol, SCROW nStartRow,
SCCOL nEndCol, SCROW nEndRow ) const;
void ApplyBlockFrame( const SvxBoxItem* pLineOuter,
const SvxBoxInfoItem* pLineInner,
SCCOL nStartCol, SCROW nStartRow,
SCCOL nEndCol, SCROW nEndRow );
void ApplyAttr( SCCOL nCol, SCROW nRow, const SfxPoolItem& rAttr );
void ApplyPattern( SCCOL nCol, SCROW nRow, const ScPatternAttr& rAttr );
void ApplyPatternArea( SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow, const ScPatternAttr& rAttr );
void ApplyPooledPatternArea( SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow, const ScPatternAttr& rPooledAttr, const ScPatternAttr& rAttr );
void SetPattern( const ScAddress& rPos, const ScPatternAttr& rAttr, sal_Bool bPutToPool = sal_False )
{
if (ValidColRow(rPos.Col(),rPos.Row()))
aCol[rPos.Col()].SetPattern( rPos.Row(), rAttr, bPutToPool );
}
void SetPattern( SCCOL nCol, SCROW nRow, const ScPatternAttr& rAttr, sal_Bool bPutToPool = sal_False );
void ApplyPatternIfNumberformatIncompatible( const ScRange& rRange,
const ScPatternAttr& rPattern, short nNewType );
void ApplyStyle( SCCOL nCol, SCROW nRow, const ScStyleSheet& rStyle );
void ApplyStyleArea( SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow, const ScStyleSheet& rStyle );
void ApplySelectionStyle(const ScStyleSheet& rStyle, const ScMarkData& rMark);
void ApplySelectionLineStyle( const ScMarkData& rMark,
const SvxBorderLine* pLine, sal_Bool bColorOnly );
const ScStyleSheet* GetStyle( SCCOL nCol, SCROW nRow ) const;
const ScStyleSheet* GetSelectionStyle( const ScMarkData& rMark, sal_Bool& rFound ) const;
const ScStyleSheet* GetAreaStyle( sal_Bool& rFound, SCCOL nCol1, SCROW nRow1,
SCCOL nCol2, SCROW nRow2 ) const;
void StyleSheetChanged( const SfxStyleSheetBase* pStyleSheet, sal_Bool bRemoved,
OutputDevice* pDev,
double nPPTX, double nPPTY,
const Fraction& rZoomX, const Fraction& rZoomY );
sal_Bool IsStyleSheetUsed( const ScStyleSheet& rStyle, sal_Bool bGatherAllStyles ) const;
sal_Bool ApplyFlags( SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow, sal_Int16 nFlags );
sal_Bool RemoveFlags( SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow, sal_Int16 nFlags );
void ApplySelectionCache( SfxItemPoolCache* pCache, const ScMarkData& rMark );
void DeleteSelection( sal_uInt16 nDelFlag, const ScMarkData& rMark );
void ClearSelectionItems( const sal_uInt16* pWhich, const ScMarkData& rMark );
void ChangeSelectionIndent( sal_Bool bIncrement, const ScMarkData& rMark );
const ScRange* GetRepeatColRange() const { return pRepeatColRange; }
const ScRange* GetRepeatRowRange() const { return pRepeatRowRange; }
void SetRepeatColRange( const ScRange* pNew );
void SetRepeatRowRange( const ScRange* pNew );
sal_uInt16 GetPrintRangeCount() const { return static_cast< sal_uInt16 >( aPrintRanges.size() ); }
const ScRange* GetPrintRange(sal_uInt16 nPos) const;
/** Returns true, if the sheet is always printed. */
sal_Bool IsPrintEntireSheet() const { return bPrintEntireSheet; }
/** Removes all print ranges. */
void ClearPrintRanges();
/** Adds a new print ranges. */
void AddPrintRange( const ScRange& rNew );
//UNUSED2009-05 /** Removes all old print ranges and sets the passed print ranges. */
//UNUSED2009-05 void SetPrintRange( const ScRange& rNew );
/** Marks the specified sheet to be printed completely. Deletes old print ranges! */
void SetPrintEntireSheet();
void FillPrintSaver( ScPrintSaverTab& rSaveTab ) const;
void RestorePrintRanges( const ScPrintSaverTab& rSaveTab );
sal_uInt16 GetOptimalColWidth( SCCOL nCol, OutputDevice* pDev,
double nPPTX, double nPPTY,
const Fraction& rZoomX, const Fraction& rZoomY,
sal_Bool bFormula, const ScMarkData* pMarkData,
sal_Bool bSimpleTextImport );
sal_Bool SetOptimalHeight( SCROW nStartRow, SCROW nEndRow, sal_uInt16 nExtra,
OutputDevice* pDev,
double nPPTX, double nPPTY,
const Fraction& rZoomX, const Fraction& rZoomY,
sal_Bool bForce,
ScProgress* pOuterProgress = NULL, sal_uLong nProgressStart = 0 );
long GetNeededSize( SCCOL nCol, SCROW nRow,
OutputDevice* pDev,
double nPPTX, double nPPTY,
const Fraction& rZoomX, const Fraction& rZoomY,
sal_Bool bWidth, sal_Bool bTotalSize );
void SetColWidth( SCCOL nCol, sal_uInt16 nNewWidth );
void SetColWidthOnly( SCCOL nCol, sal_uInt16 nNewWidth );
void SetRowHeight( SCROW nRow, sal_uInt16 nNewHeight );
sal_Bool SetRowHeightRange( SCROW nStartRow, SCROW nEndRow, sal_uInt16 nNewHeight,
double nPPTX, double nPPTY );
/**
* Set specified row height to specified ranges. Don't check for drawing
* objects etc. Just set the row height. Nothing else.
*
* Note that setting a new row height via this function will not
* invalidate page breaks.
*/
void SetRowHeightOnly( SCROW nStartRow, SCROW nEndRow, sal_uInt16 nNewHeight );
// nPPT fuer Test auf Veraenderung
void SetManualHeight( SCROW nStartRow, SCROW nEndRow, sal_Bool bManual );
sal_uInt16 GetColWidth( SCCOL nCol ) const;
SC_DLLPUBLIC sal_uInt16 GetRowHeight( SCROW nRow, SCROW* pStartRow = NULL, SCROW* pEndRow = NULL, bool bHiddenAsZero = true ) const;
sal_uLong GetRowHeight( SCROW nStartRow, SCROW nEndRow ) const;
sal_uLong GetScaledRowHeight( SCROW nStartRow, SCROW nEndRow, double fScale ) const;
sal_uLong GetColOffset( SCCOL nCol ) const;
sal_uLong GetRowOffset( SCROW nRow ) const;
/**
* Get the last row such that the height of row 0 to the end row is as
* high as possible without exceeding the specified height value.
*
* @param nHeight maximum desired height
*
* @return SCROW last row of the range within specified height.
*/
SCROW GetRowForHeight(sal_uLong nHeight) const;
sal_uInt16 GetOriginalWidth( SCCOL nCol ) const;
sal_uInt16 GetOriginalHeight( SCROW nRow ) const;
sal_uInt16 GetCommonWidth( SCCOL nEndCol );
SCROW GetHiddenRowCount( SCROW nRow );
void ShowCol(SCCOL nCol, bool bShow);
void ShowRow(SCROW nRow, bool bShow);
void DBShowRow(SCROW nRow, bool bShow);
void ShowRows(SCROW nRow1, SCROW nRow2, bool bShow);
void DBShowRows(SCROW nRow1, SCROW nRow2, bool bShow, bool bSetFlags); // if bSetFlags=false, no SetRowHidden/SetRowFiltered
void SetColFlags( SCCOL nCol, sal_uInt8 nNewFlags );
void SetRowFlags( SCROW nRow, sal_uInt8 nNewFlags );
void SetRowFlags( SCROW nStartRow, SCROW nEndRow, sal_uInt8 nNewFlags );
/// @return the index of the last row with any set flags (auto-pagebreak is ignored).
SCROW GetLastFlaggedRow() const;
/// @return the index of the last changed column (flags and column width, auto pagebreak is ignored).
SCCOL GetLastChangedCol() const;
/// @return the index of the last changed row (flags and row height, auto pagebreak is ignored).
SCROW GetLastChangedRow() const;
sal_Bool IsDataFiltered() const;
sal_uInt8 GetColFlags( SCCOL nCol ) const;
sal_uInt8 GetRowFlags( SCROW nRow ) const;
const ScBitMaskCompressedArray< SCROW, sal_uInt8> * GetRowFlagsArray() const
{ return pRowFlags; }
sal_Bool UpdateOutlineCol( SCCOL nStartCol, SCCOL nEndCol, sal_Bool bShow );
sal_Bool UpdateOutlineRow( SCROW nStartRow, SCROW nEndRow, sal_Bool bShow );
void UpdatePageBreaks( const ScRange* pUserArea );
void RemoveManualBreaks();
sal_Bool HasManualBreaks() const;
void SetRowManualBreaks( const ::std::set<SCROW>& rBreaks );
void SetColManualBreaks( const ::std::set<SCCOL>& rBreaks );
void GetAllRowBreaks(::std::set<SCROW>& rBreaks, bool bPage, bool bManual) const;
void GetAllColBreaks(::std::set<SCCOL>& rBreaks, bool bPage, bool bManual) const;
bool HasRowPageBreak(SCROW nRow) const;
bool HasColPageBreak(SCCOL nCol) const;
bool HasRowManualBreak(SCROW nRow) const;
bool HasColManualBreak(SCCOL nCol) const;
/**
* Get the row position of the next manual break that occurs at or below
* specified row. When no more manual breaks are present at or below
* the specified row, -1 is returned.
*
* @param nRow row at which the search begins.
*
* @return SCROW next row position with manual page break, or -1 if no
* more manual breaks are present.
*/
SCROW GetNextManualBreak(SCROW nRow) const;
void RemoveRowPageBreaks(SCROW nStartRow, SCROW nEndRow);
void RemoveRowBreak(SCROW nRow, bool bPage, bool bManual);
void RemoveColBreak(SCCOL nCol, bool bPage, bool bManual);
void SetRowBreak(SCROW nRow, bool bPage, bool bManual);
void SetColBreak(SCCOL nCol, bool bPage, bool bManual);
::com::sun::star::uno::Sequence<
::com::sun::star::sheet::TablePageBreakData> GetRowBreakData() const;
bool RowHidden(SCROW nRow, SCROW* pFirstRow = NULL, SCROW* pLastRow = NULL) const;
bool RowHidden(SCROW nRow, SCROW& rLastRow) const;
bool HasHiddenRows(SCROW nStartRow, SCROW nEndRow) const;
bool ColHidden(SCCOL nCol, SCCOL& rLastCol) const;
bool ColHidden(SCCOL nCol, SCCOL* pFirstCol = NULL, SCCOL* pLastCol = NULL) const;
void SetRowHidden(SCROW nStartRow, SCROW nEndRow, bool bHidden);
void SetColHidden(SCCOL nStartCol, SCCOL nEndCol, bool bHidden);
void CopyColHidden(ScTable& rTable, SCCOL nStartCol, SCCOL nEndCol);
void CopyRowHidden(ScTable& rTable, SCROW nStartRow, SCROW nEndRow);
void CopyRowHeight(ScTable& rSrcTable, SCROW nStartRow, SCROW nEndRow, SCROW nSrcOffset);
SCROW FirstVisibleRow(SCROW nStartRow, SCROW nEndRow) const;
SCROW LastVisibleRow(SCROW nStartRow, SCROW nEndRow) const;
SCROW CountVisibleRows(SCROW nStartRow, SCROW nEndRow) const;
sal_uInt32 GetTotalRowHeight(SCROW nStartRow, SCROW nEndRow) const;
SCCOLROW LastHiddenColRow(SCCOLROW nPos, bool bCol) const;
bool RowFiltered(SCROW nRow, SCROW* pFirstRow = NULL, SCROW* pLastRow = NULL) const;
bool ColFiltered(SCCOL nCol, SCCOL* pFirstCol = NULL, SCCOL* pLastCol = NULL) const;
bool HasFilteredRows(SCROW nStartRow, SCROW nEndRow) const;
void CopyColFiltered(ScTable& rTable, SCCOL nStartCol, SCCOL nEndCol);
void CopyRowFiltered(ScTable& rTable, SCROW nStartRow, SCROW nEndRow);
void SetRowFiltered(SCROW nStartRow, SCROW nEndRow, bool bFiltered);
void SetColFiltered(SCCOL nStartCol, SCCOL nEndCol, bool bFiltered);
SCROW FirstNonFilteredRow(SCROW nStartRow, SCROW nEndRow) const;
SCROW LastNonFilteredRow(SCROW nStartRow, SCROW nEndRow) const;
SCROW CountNonFilteredRows(SCROW nStartRow, SCROW nEndRow) const;
void SyncColRowFlags();
void StripHidden( SCCOL& rX1, SCROW& rY1, SCCOL& rX2, SCROW& rY2 );
void ExtendHidden( SCCOL& rX1, SCROW& rY1, SCCOL& rX2, SCROW& rY2 );
void Sort(const ScSortParam& rSortParam, sal_Bool bKeepQuery);
sal_Bool ValidQuery(SCROW nRow, const ScQueryParam& rQueryParam,
sal_Bool* pSpecial = NULL, ScBaseCell* pCell = NULL,
sal_Bool* pbTestEqualCondition = NULL );
void TopTenQuery( ScQueryParam& );
SCSIZE Query(ScQueryParam& rQueryParam, sal_Bool bKeepSub);
sal_Bool CreateQueryParam(SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2, ScQueryParam& rQueryParam);
void GetFilterEntries(SCCOL nCol, SCROW nRow1, SCROW nRow2, TypedScStrCollection& rStrings, bool& rHasDates);
void GetFilteredFilterEntries( SCCOL nCol, SCROW nRow1, SCROW nRow2, const ScQueryParam& rParam, TypedScStrCollection& rStrings, bool& rHasDates );
sal_Bool GetDataEntries(SCCOL nCol, SCROW nRow, TypedScStrCollection& rStrings, sal_Bool bLimit);
sal_Bool HasColHeader( SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow );
sal_Bool HasRowHeader( SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow );
void DoColResize( SCCOL nCol1, SCCOL nCol2, SCSIZE nAdd );
sal_Int32 GetMaxStringLen( SCCOL nCol,
SCROW nRowStart, SCROW nRowEnd, CharSet eCharSet ) const;
xub_StrLen GetMaxNumberStringLen( sal_uInt16& nPrecision,
SCCOL nCol,
SCROW nRowStart, SCROW nRowEnd ) const;
void FindConditionalFormat( sal_uLong nKey, ScRangeList& rRanges );
void IncRecalcLevel() { ++nRecalcLvl; }
void DecRecalcLevel( bool bUpdateNoteCaptionPos = true ) { if (!--nRecalcLvl) SetDrawPageSize(true, bUpdateNoteCaptionPos); }
sal_Bool IsSortCollatorGlobal() const;
void InitSortCollator( const ScSortParam& rPar );
void DestroySortCollator();
private:
void FillSeries( SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2,
sal_uLong nFillCount, FillDir eFillDir, FillCmd eFillCmd,
FillDateCmd eFillDateCmd,
double nStepValue, double nMaxValue, sal_uInt16 nMinDigits,
sal_Bool bAttribs, ScProgress& rProgress );
void FillAnalyse( SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2,
FillCmd& rCmd, FillDateCmd& rDateCmd,
double& rInc, sal_uInt16& rMinDigits,
ScUserListData*& rListData, sal_uInt16& rListIndex);
void FillAuto( SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2,
sal_uLong nFillCount, FillDir eFillDir, ScProgress& rProgress );
sal_Bool ValidNextPos( SCCOL nCol, SCROW nRow, const ScMarkData& rMark,
sal_Bool bMarked, sal_Bool bUnprotected );
void AutoFormatArea(SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow,
const ScPatternAttr& rAttr, sal_uInt16 nFormatNo);
void GetAutoFormatAttr(SCCOL nCol, SCROW nRow, sal_uInt16 nIndex, ScAutoFormatData& rData);
void GetAutoFormatFrame(SCCOL nCol, SCROW nRow, sal_uInt16 nFlags, sal_uInt16 nIndex, ScAutoFormatData& rData);
sal_Bool SearchCell(const SvxSearchItem& rSearchItem, SCCOL nCol, SCROW nRow,
const ScMarkData& rMark, String& rUndoStr, ScDocument* pUndoDoc);
sal_Bool Search(const SvxSearchItem& rSearchItem, SCCOL& rCol, SCROW& rRow,
const ScMarkData& rMark, String& rUndoStr, ScDocument* pUndoDoc);
sal_Bool SearchAll(const SvxSearchItem& rSearchItem, ScMarkData& rMark,
String& rUndoStr, ScDocument* pUndoDoc);
sal_Bool Replace(const SvxSearchItem& rSearchItem, SCCOL& rCol, SCROW& rRow,
const ScMarkData& rMark, String& rUndoStr, ScDocument* pUndoDoc);
sal_Bool ReplaceAll(const SvxSearchItem& rSearchItem, ScMarkData& rMark,
String& rUndoStr, ScDocument* pUndoDoc);
sal_Bool SearchStyle(const SvxSearchItem& rSearchItem, SCCOL& rCol, SCROW& rRow,
ScMarkData& rMark);
sal_Bool ReplaceStyle(const SvxSearchItem& rSearchItem, SCCOL& rCol, SCROW& rRow,
ScMarkData& rMark, sal_Bool bIsUndo);
sal_Bool SearchAllStyle(const SvxSearchItem& rSearchItem, ScMarkData& rMark);
sal_Bool ReplaceAllStyle(const SvxSearchItem& rSearchItem, ScMarkData& rMark,
ScDocument* pUndoDoc);
// benutzen globalen SortParam:
sal_Bool IsSorted(SCCOLROW nStart, SCCOLROW nEnd);
void DecoladeRow( ScSortInfoArray*, SCROW nRow1, SCROW nRow2 );
void SwapCol(SCCOL nCol1, SCCOL nCol2);
void SwapRow(SCROW nRow1, SCROW nRow2);
short CompareCell( sal_uInt16 nSort,
ScBaseCell* pCell1, SCCOL nCell1Col, SCROW nCell1Row,
ScBaseCell* pCell2, SCCOL nCell2Col, SCROW nCell2Row );
short Compare(SCCOLROW nIndex1, SCCOLROW nIndex2);
short Compare( ScSortInfoArray*, SCCOLROW nIndex1, SCCOLROW nIndex2);
ScSortInfoArray* CreateSortInfoArray( SCCOLROW nInd1, SCCOLROW nInd2 );
void QuickSort( ScSortInfoArray*, SCsCOLROW nLo, SCsCOLROW nHi);
void SortReorder( ScSortInfoArray*, ScProgress& );
sal_Bool CreateExcelQuery(SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2, ScQueryParam& rQueryParam);
sal_Bool CreateStarQuery(SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2, ScQueryParam& rQueryParam);
void GetUpperCellString(SCCOL nCol, SCROW nRow, String& rStr);
sal_Bool RefVisible(ScFormulaCell* pCell);
sal_Bool IsEmptyLine(SCROW nRow, SCCOL nStartCol, SCCOL nEndCol);
void IncDate(double& rVal, sal_uInt16& nDayOfMonth, double nStep, FillDateCmd eCmd);
void FillFormula(sal_uLong& nFormulaCounter, sal_Bool bFirst, ScFormulaCell* pSrcCell,
SCCOL nDestCol, SCROW nDestRow, sal_Bool bLast );
void UpdateInsertTabAbs(SCTAB nNewPos);
sal_Bool GetNextSpellingCell(SCCOL& rCol, SCROW& rRow, sal_Bool bInSel,
const ScMarkData& rMark) const;
sal_Bool GetNextMarkedCell( SCCOL& rCol, SCROW& rRow, const ScMarkData& rMark );
void SetDrawPageSize( bool bResetStreamValid = true, bool bUpdateNoteCaptionPos = true );
sal_Bool TestTabRefAbs(SCTAB nTable);
void CompileDBFormula();
void CompileDBFormula( sal_Bool bCreateFormulaString );
void CompileNameFormula( sal_Bool bCreateFormulaString );
void CompileColRowNameFormula();
void StartListening( const ScAddress& rAddress, SvtListener* pListener );
void EndListening( const ScAddress& rAddress, SvtListener* pListener );
void StartAllListeners();
void StartNeededListeners(); // only for cells where NeedsListening()==TRUE
void SetRelNameDirty();
void SetLoadingMedium(bool bLoading);
SCSIZE FillMaxRot( RowInfo* pRowInfo, SCSIZE nArrCount, SCCOL nX1, SCCOL nX2,
SCCOL nCol, SCROW nAttrRow1, SCROW nAttrRow2, SCSIZE nArrY,
const ScPatternAttr* pPattern, const SfxItemSet* pCondSet );
// idle calculation of OutputDevice text width for cell
// also invalidates script type, broadcasts for "calc as shown"
void InvalidateTextWidth( const ScAddress* pAdrFrom, const ScAddress* pAdrTo,
sal_Bool bNumFormatChanged, sal_Bool bBroadcast );
/**
* In case the cell text goes beyond the column width, move the max column
* position to the right. This is called from ExtendPrintArea.
*/
void MaybeAddExtraColumn(SCCOL& rCol, SCROW nRow, OutputDevice* pDev, double nPPTX, double nPPTY);
/**
* Use this to iterate through non-empty visible cells in a single column.
*/
class VisibleDataCellIterator
{
public:
static SCROW ROW_NOT_FOUND;
explicit VisibleDataCellIterator(ScFlatBoolRowSegments& rRowSegs, ScColumn& rColumn);
~VisibleDataCellIterator();
/**
* Set the start row position. In case there is not visible data cell
* at the specified row position, it will move to the position of the
* first visible data cell below that point.
*
* @return First visible data cell if found, or NULL otherwise.
*/
ScBaseCell* reset(SCROW nRow);
/**
* Find the next visible data cell position.
*
* @return Next visible data cell if found, or NULL otherwise.
*/
ScBaseCell* next();
/**
* Get the current row position.
*
* @return Current row position, or ROW_NOT_FOUND if the iterator
* doesn't point to a valid data cell position.
*/
SCROW getRow() const;
private:
ScFlatBoolRowSegments& mrRowSegs;
ScColumn& mrColumn;
ScBaseCell* mpCell;
SCROW mnCurRow;
SCROW mnUBound;
};
public :
ScColumn* GetColumnByIndex(sal_Int32 index);
};
#endif