office-gobmx/sc/inc/column.hxx
2002-11-07 12:06:40 +00:00

478 lines
20 KiB
C++

/*************************************************************************
*
* $RCSfile: column.hxx,v $
*
* $Revision: 1.7 $
*
* last change: $Author: nn $ $Date: 2002-11-07 13:06:13 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
*
* - GNU Lesser General Public License Version 2.1
* - Sun Industry Standards Source License Version 1.1
*
* Sun Microsystems Inc., October, 2000
*
* GNU Lesser General Public License Version 2.1
* =============================================
* Copyright 2000 by Sun Microsystems, Inc.
* 901 San Antonio Road, Palo Alto, CA 94303, USA
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License version 2.1, as published by the Free Software Foundation.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*
*
* Sun Industry Standards Source License Version 1.1
* =================================================
* The contents of this file are subject to the Sun Industry Standards
* Source License Version 1.1 (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.openoffice.org/license.html.
*
* Software provided under this License is provided on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
* WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
* MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
* See the License for the specific provisions governing your rights and
* obligations concerning the Software.
*
* The Initial Developer of the Original Code is: Sun Microsystems, Inc.
*
* Copyright: 2000 by Sun Microsystems, Inc.
*
* All Rights Reserved.
*
* Contributor(s): _______________________________________
*
*
************************************************************************/
#ifndef SC_COLUMN_HXX
#define SC_COLUMN_HXX
#ifndef SC_MARKARR_HXX
#include "markarr.hxx"
#endif
#ifndef SC_SCGLOB_HXX
#include "global.hxx"
#endif
class Fraction;
class OutputDevice;
class Rectangle;
class SfxBroadcaster;
class SfxItemPoolCache;
class SfxItemSet;
class SfxListener;
class SfxPoolItem;
class SfxStyleSheetBase;
class SvxBorderLine;
class SvxBoxInfoItem;
class SvxBoxItem;
class ScAttrIterator;
class ScAttrArray;
class ScBaseCell;
class ScDocument;
class ScFormulaCell;
class ScMarkData;
class ScMultipleReadHeader;
class ScMultipleWriteHeader;
class ScPatternAttr;
class ScStyleSheet;
class ScBroadcasterList;
class TypedStrCollection;
class ScProgress;
struct ScFunctionData;
struct ScLineFlags;
#define COLUMN_DELTA 4
struct ScNeededSizeOptions
{
const ScPatternAttr* pPattern;
BOOL bFormula;
BOOL bSkipMerged;
BOOL bGetFont;
BOOL bTotalSize;
ScNeededSizeOptions()
{
pPattern = NULL;
bFormula = FALSE;
bSkipMerged = TRUE;
bGetFont = TRUE;
bTotalSize = FALSE;
}
};
struct ColEntry
{
USHORT nRow;
ScBaseCell* pCell;
};
class ScIndexMap;
class ScColumn
{
private:
USHORT nCol;
USHORT nTab;
USHORT nCount;
USHORT nLimit;
ColEntry* pItems;
ScAttrArray* pAttrArray;
ScDocument* pDocument;
friend class ScDocument; // fuer FillInfo
friend class ScDocumentIterator;
friend class ScValueIterator;
friend class ScQueryValueIterator;
friend class ScColumnIterator;
friend class ScQueryCellIterator;
friend class ScMarkedDataIter;
friend class ScCellIterator;
friend class ScHorizontalCellIterator;
friend class ScHorizontalAttrIterator;
public:
static BOOL bDoubleAlloc; // fuer Import: Groesse beim Allozieren verdoppeln
public:
ScColumn();
~ScColumn();
void Init(USHORT nNewCol, USHORT nNewTab, ScDocument* pDoc);
BOOL Search( USHORT nRow, USHORT& nIndex ) const;
ScBaseCell* GetCell( USHORT nRow ) const;
void Insert( USHORT nRow, ScBaseCell* pCell );
void Insert( USHORT nRow, ULONG nFormatIndex, ScBaseCell* pCell );
void Append( USHORT nRow, ScBaseCell* pCell );
void Delete( USHORT nRow );
void DeleteAtIndex( USHORT nIndex );
void FreeAll();
void Resize( USHORT nSize );
void SetNewRow( USHORT nRow1, USHORT nRow2 );
void SwapRow( USHORT nRow1, USHORT nRow2 );
void SwapCell( USHORT nRow, ScColumn& rCol);
BOOL HasLines( USHORT nRow1, USHORT nRow2, Rectangle& rSizes,
BOOL bLeft, BOOL bRight ) const;
BOOL HasAttrib( USHORT nRow1, USHORT nRow2, USHORT nMask ) const;
BOOL HasAttribSelection( const ScMarkData& rMark, USHORT nMask ) const;
BOOL ExtendMerge( USHORT nThisCol, USHORT nStartRow, USHORT nEndRow,
USHORT& rPaintCol, USHORT& rPaintRow,
BOOL bRefresh, BOOL bAttrs );
BOOL IsEmptyVisData(BOOL bNotes) const; // ohne Broadcaster
BOOL IsEmptyData() const;
BOOL IsEmptyAttr() const;
BOOL IsEmpty() const;
// nur Daten:
BOOL IsEmptyBlock(USHORT nStartRow, USHORT nEndRow) const;
USHORT GetEmptyLinesInBlock( USHORT nStartRow, USHORT nEndRow, ScDirection eDir ) const;
BOOL HasDataAt(USHORT nRow) const;
BOOL HasVisibleDataAt(USHORT nRow) const;
USHORT GetFirstDataPos() const;
USHORT GetLastDataPos() const;
USHORT GetLastVisDataPos(BOOL bNotes) const; // ohne Broadcaster
USHORT GetFirstVisDataPos(BOOL bNotes) const;
BOOL GetPrevDataPos(USHORT& rRow) const;
BOOL GetNextDataPos(USHORT& rRow) const;
void FindDataAreaPos(USHORT& rRow, short nMovY) const; // (ohne Broadcaster)
void FindUsed( USHORT nStartRow, USHORT nEndRow, BOOL* pUsed ) const;
USHORT VisibleCount( USHORT nStartRow, USHORT nEndRow ) const;
USHORT GetBlockMatrixEdges( USHORT nRow1, USHORT nRow2, USHORT nMask ) const;
BOOL HasSelectionMatrixFragment(const ScMarkData& rMark) const;
// Daten oder Attribute:
USHORT GetFirstEntryPos() const;
USHORT GetLastEntryPos() const;
// nur Attribute:
USHORT GetLastAttrPos() const;
BOOL HasVisibleAttr( USHORT& rFirstRow, USHORT& rLastRow, BOOL bSkipFirst ) const;
BOOL HasVisibleAttrIn( USHORT nStartRow, USHORT nEndRow ) const;
BOOL IsVisibleAttrEqual( const ScColumn& rCol, USHORT nStartRow = 0,
USHORT nEndRow = MAXROW ) const;
BOOL IsAllAttrEqual( const ScColumn& rCol, USHORT nStartRow, USHORT nEndRow ) const;
BOOL TestInsertCol( USHORT nStartRow, USHORT nEndRow) const;
BOOL TestInsertRow( USHORT nSize ) const;
void InsertRow( USHORT nStartRow, USHORT nSize );
void DeleteRow( USHORT nStartRow, USHORT nSize );
void DeleteRange( USHORT nStartIndex, USHORT nEndIndex, USHORT nDelFlag );
void DeleteArea(USHORT nStartRow, USHORT nEndRow, USHORT nDelFlag );
void CopyToClip(USHORT nRow1, USHORT nRow2, ScColumn& rColumn, BOOL bKeepScenarioFlags);
void CopyFromClip(USHORT nRow1, USHORT nRow2, short nDy,
USHORT nInsFlag, BOOL bAsLink, BOOL bSkipAttrForEmpty, ScColumn& rColumn);
void StartListeningInArea( USHORT nRow1, USHORT nRow2 );
void BroadcastInArea( USHORT nRow1, USHORT nRow2 );
void RemoveEditAttribs( USHORT nStartRow, USHORT nEndRow );
// Markierung von diesem Dokument
void MixMarked( const ScMarkData& rMark, USHORT nFunction,
BOOL bSkipEmpty, ScColumn& rSrcCol );
void MixData( USHORT nRow1, USHORT nRow2, USHORT nFunction, BOOL bSkipEmpty,
ScColumn& rSrcCol );
ScFormulaCell* CreateRefCell( ScDocument* pDestDoc, const ScAddress& rDestPos,
USHORT nIndex, USHORT nFlags ) const;
ScAttrIterator* CreateAttrIterator( USHORT nStartRow, USHORT nEndRow ) const;
USHORT GetCol() const { return nCol; }
// UpdateSelectionFunction: Mehrfachselektion
void UpdateSelectionFunction( const ScMarkData& rMark,
ScFunctionData& rData, const BYTE* pRowFlags,
BOOL bDoExclude, USHORT nExStartRow, USHORT nExEndRow );
void UpdateAreaFunction( ScFunctionData& rData, BYTE* pRowFlags,
USHORT nStartRow, USHORT nEndRow );
void CopyToColumn(USHORT nRow1, USHORT nRow2, USHORT nFlags, BOOL bMarked,
ScColumn& rColumn, const ScMarkData* pMarkData = NULL,
BOOL bAsLink = FALSE );
void UndoToColumn(USHORT nRow1, USHORT nRow2, USHORT nFlags, BOOL bMarked,
ScColumn& rColumn, const ScMarkData* pMarkData = NULL );
void CopyScenarioFrom( const ScColumn& rSrcCol );
void CopyScenarioTo( ScColumn& rDestCol ) const;
BOOL TestCopyScenarioTo( const ScColumn& rDestCol ) const;
void MarkScenarioIn( ScMarkData& rDestMark ) const;
void CopyUpdated( const ScColumn& rPosCol, ScColumn& rDestCol ) const;
void SwapCol(ScColumn& rCol);
void MoveTo(USHORT nStartRow, USHORT nEndRow, ScColumn& rCol);
BOOL HasEditCells(USHORT nStartRow, USHORT nEndRow, USHORT& rFirst) const;
// TRUE = Zahlformat gesetzt
BOOL SetString( USHORT nRow, USHORT nTab, const String& rString );
void SetValue( USHORT nRow, const double& rVal);
void SetNote( USHORT nRow, const ScPostIt& rNote );
void SetError( USHORT nRow, const USHORT nError);
void GetString( USHORT nRow, String& rString ) const;
void GetInputString( USHORT nRow, String& rString ) const;
double GetValue( USHORT nRow ) const;
void GetFormula( USHORT nRow, String& rFormula,
BOOL bAsciiExport = FALSE ) const;
BOOL GetNote( USHORT nRow, ScPostIt& rNote ) const;
CellType GetCellType( USHORT nRow ) const;
USHORT GetCellCount() const { return nCount; }
long GetWeightedCount() const;
ULONG GetCodeCount() const; // RPN-Code in Formeln
USHORT GetErrCode( USHORT nRow ) const;
BOOL HasStringData( USHORT nRow ) const;
BOOL HasValueData( USHORT nRow ) const;
USHORT GetErrorData(USHORT nCol) const;
BOOL HasStringCells( USHORT nStartRow, USHORT nEndRow ) const;
void SetDirty();
void SetDirty( const ScRange& );
void SetDirtyVar();
void SetDirtyAfterLoad();
void SetTableOpDirty( const ScRange& );
void CalcAll();
void CalcAfterLoad();
void CompileAll();
void CompileXML( ScProgress& rProgress );
void ResetChanged( USHORT nStartRow, USHORT nEndRow );
void UpdateReference( UpdateRefMode eUpdateRefMode, USHORT nCol1, USHORT nRow1, USHORT nTab1,
USHORT nCol2, USHORT nRow2, USHORT nTab2,
short nDx, short nDy, short nDz,
ScDocument* pUndoDoc = NULL );
void UpdateInsertTab( USHORT nTable);
void UpdateInsertTabOnlyCells( USHORT nTable);
void UpdateDeleteTab( USHORT nTable, BOOL bIsMove, ScColumn* pRefUndo = NULL );
void UpdateMoveTab(USHORT nOldPos, USHORT nNewPos, USHORT nTabNo);
void UpdateCompile( BOOL bForceIfNameInUse = FALSE );
void UpdateTranspose( const ScRange& rSource, const ScAddress& rDest,
ScDocument* pUndoDoc );
void UpdateGrow( const ScRange& rArea, USHORT nGrowX, USHORT nGrowY );
void SetTabNo(USHORT nNewTab);
BOOL IsRangeNameInUse(USHORT nRow1, USHORT nRow2, USHORT nIndex) const;
void ReplaceRangeNamesInUse( USHORT nRow1, USHORT nRow2, const ScIndexMap& rMap );
const SfxPoolItem* GetAttr( USHORT nRow, USHORT nWhich ) const;
const ScPatternAttr* GetPattern( USHORT nRow ) const;
ULONG GetNumberFormat( USHORT nRow ) const;
void MergeSelectionPattern( SfxItemSet** ppSet, const ScMarkData& rMark, BOOL bDeep ) const;
void MergePatternArea( SfxItemSet** ppSet, USHORT nRow1, USHORT nRow2, BOOL bDeep ) const;
void MergeBlockFrame( SvxBoxItem* pLineOuter, SvxBoxInfoItem* pLineInner,
ScLineFlags& rFlags,
USHORT nStartRow, USHORT nEndRow, BOOL bLeft, USHORT nDistRight ) const;
void ApplyBlockFrame( const SvxBoxItem* pLineOuter, const SvxBoxInfoItem* pLineInner,
USHORT nStartRow, USHORT nEndRow, BOOL bLeft, USHORT nDistRight );
void ApplyAttr( USHORT nRow, const SfxPoolItem& rAttr );
void ApplyPattern( USHORT nRow, const ScPatternAttr& rPatAttr );
void ApplyPatternArea( USHORT nStartRow, USHORT nEndRow, const ScPatternAttr& rPatAttr );
void SetPattern( USHORT nRow, const ScPatternAttr& rPatAttr, BOOL bPutToPool = FALSE );
void SetPatternArea( USHORT nStartRow, USHORT nEndRow,
const ScPatternAttr& rPatAttr, BOOL bPutToPool = FALSE );
void ApplyPatternIfNumberformatIncompatible( const ScRange& rRange,
const ScPatternAttr& rPattern, short nNewType );
void ApplyStyle( USHORT nRow, const ScStyleSheet& rStyle );
void ApplyStyleArea( USHORT nStartRow, USHORT nEndRow, const ScStyleSheet& rStyle );
void ApplySelectionStyle(const ScStyleSheet& rStyle, const ScMarkData& rMark);
void ApplySelectionLineStyle( const ScMarkData& rMark,
const SvxBorderLine* pLine, BOOL bColorOnly );
const ScStyleSheet* GetStyle( USHORT nRow ) const;
const ScStyleSheet* GetSelectionStyle( const ScMarkData& rMark, BOOL& rFound ) const;
const ScStyleSheet* GetAreaStyle( BOOL& rFound, USHORT nRow1, USHORT nRow2 ) const;
void FindStyleSheet( const SfxStyleSheetBase* pStyleSheet, BOOL* pUsed, BOOL bReset );
BOOL IsStyleSheetUsed( const SfxStyleSheetBase& rStyle ) const;
short SearchStyle( short nRow, const ScStyleSheet* pSearchStyle,
BOOL bUp, BOOL bInSelection, const ScMarkData& rMark );
BOOL SearchStyleRange( short& rRow, short& rEndRow, const ScStyleSheet* pSearchStyle,
BOOL bUp, BOOL bInSelection, const ScMarkData& rMark );
BOOL ApplyFlags( USHORT nStartRow, USHORT nEndRow, INT16 nFlags );
BOOL RemoveFlags( USHORT nStartRow, USHORT nEndRow, INT16 nFlags );
void ClearItems( USHORT nStartRow, USHORT nEndRow, const USHORT* pWhich );
void RemoveProtected( USHORT nStartRow, USHORT nEndRow );
short ApplySelectionCache( SfxItemPoolCache* pCache, const ScMarkData& rMark );
void DeleteSelection( USHORT nDelFlag, const ScMarkData& rMark );
void ClearSelectionItems( const USHORT* pWhich, const ScMarkData& rMark );
void ChangeSelectionIndent( BOOL bIncrement, const ScMarkData& rMark );
long GetNeededSize( USHORT nRow, OutputDevice* pDev,
double nPPTX, double nPPTY,
const Fraction& rZoomX, const Fraction& rZoomY,
BOOL bWidth, const ScNeededSizeOptions& rOptions );
USHORT GetOptimalColWidth( OutputDevice* pDev, double nPPTX, double nPPTY,
const Fraction& rZoomX, const Fraction& rZoomY,
BOOL bFormula, USHORT nOldWidth,
const ScMarkData* pMarkData,
BOOL bSimpleTextImport );
void GetOptimalHeight( USHORT nStartRow, USHORT nEndRow, USHORT* pHeight,
OutputDevice* pDev,
double nPPTX, double nPPTY,
const Fraction& rZoomX, const Fraction& rZoomY,
BOOL bShrink, USHORT nMinHeight, USHORT nMinStart );
private:
long GetSimpleTextNeededSize( USHORT nIndex, OutputDevice* pDev,
BOOL bWidth );
public:
short GetNextUnprotected( short nRow, BOOL bUp ) const; // inkl. aktuelle
void GetFilterEntries(USHORT nStartRow, USHORT nEndRow, TypedStrCollection& rStrings);
BOOL GetDataEntries(USHORT nRow, TypedStrCollection& rStrings, BOOL bLimit);
USHORT NoteCount( USHORT nMaxRow = MAXROW ) const;
void LoadData( SvStream& rStream );
void SaveData( SvStream& rStream ) const;
void LoadNotes( SvStream& rStream );
void SaveNotes( SvStream& rStream ) const;
BOOL Load( SvStream& rStream, ScMultipleReadHeader& rHdr );
BOOL Save( SvStream& rStream, ScMultipleWriteHeader& rHdr ) const;
void UpdateInsertTabAbs(USHORT nNewPos);
BOOL TestTabRefAbs(USHORT nTable);
BOOL GetNextSpellingCell(USHORT& nRow, BOOL bInSel, const ScMarkData& rData) const;
void RemoveAutoSpellObj();
void StartListening( SfxListener& rLst, USHORT nRow );
void EndListening( SfxListener& rLst, USHORT nRow );
void MoveListeners( ScBroadcasterList& rSource, USHORT nDestRow );
void StartAllListeners();
void StartNameListeners( BOOL bOnlyRelNames );
void SetRelNameDirty();
void CompileDBFormula();
void CompileDBFormula( BOOL bCreateFormulaString );
void CompileNameFormula( BOOL bCreateFormulaString );
void CompileColRowNameFormula();
// maximale Stringlaengen einer Column, fuer z.B. dBase Export
xub_StrLen GetMaxStringLen( USHORT nRowStart, USHORT nRowEnd ) const;
xub_StrLen GetMaxNumberStringLen( USHORT& nPrecision,
USHORT nRowStart, USHORT nRowEnd ) const;
private:
ScBaseCell* CloneCell(USHORT nIndex, USHORT nFlags,
ScDocument* pDestDoc, const ScAddress& rDestPos);
void CorrectSymbolCells( CharSet eStreamCharSet );
};
class ScColumnIterator // alle Daten eines Bereichs durchgehen
{
const ScColumn* pColumn;
USHORT nPos;
USHORT nTop;
USHORT nBottom;
public:
ScColumnIterator( const ScColumn* pCol, USHORT nStart=0, USHORT nEnd=MAXROW );
~ScColumnIterator();
BOOL Next( USHORT& rRow, ScBaseCell*& rpCell );
USHORT GetIndex() const;
};
class ScMarkedDataIter // Daten in selektierten Bereichen durchgehen
{
const ScColumn* pColumn;
USHORT nPos;
ScMarkArrayIter* pMarkIter;
USHORT nTop;
USHORT nBottom;
BOOL bNext;
BOOL bAll;
public:
ScMarkedDataIter( const ScColumn* pCol, const ScMarkData* pMarkData,
BOOL bAllIfNone = FALSE );
~ScMarkedDataIter();
BOOL Next( USHORT& rIndex );
};
#endif