summaryrefslogtreecommitdiff
path: root/sc/inc/cell.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'sc/inc/cell.hxx')
-rw-r--r--sc/inc/cell.hxx550
1 files changed, 0 insertions, 550 deletions
diff --git a/sc/inc/cell.hxx b/sc/inc/cell.hxx
deleted file mode 100644
index 4c92203ee..000000000
--- a/sc/inc/cell.hxx
+++ /dev/null
@@ -1,550 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org 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 version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-#ifndef SC_CELL_HXX
-#define SC_CELL_HXX
-
-#include <stddef.h>
-
-#include <set>
-#include <vector>
-#include <boost/shared_ptr.hpp>
-
-#include <tools/mempool.hxx>
-#include <svl/listener.hxx>
-#include "global.hxx"
-#include "rangenam.hxx"
-#include "formula/grammar.hxx"
-#include "tokenarray.hxx"
-#include "formularesult.hxx"
-#include <rtl/ustrbuf.hxx>
-#include <unotools/fontcvt.hxx>
-#include "scdllapi.h"
-
-#define USE_MEMPOOL
-#define TEXTWIDTH_DIRTY 0xffff
-
-// in addition to SCRIPTTYPE_... flags from scripttypeitem.hxx:
-// set (in nScriptType) if type has not been determined yet
-#define SC_SCRIPTTYPE_UNKNOWN 0x08
-
-class ScDocument;
-class EditTextObject;
-class ScMatrix;
-class SvtBroadcaster;
-class ScCodeArray;
-class ScProgress;
-class ScPostIt;
-class ScPatternAttr;
-
-// ============================================================================
-
-/** Default cell clone flags: do not start listening, do not adjust 3D refs to
- old position, clone note captions of cell notes. */
-const int SC_CLONECELL_DEFAULT = 0x0000;
-
-/** If set, cloned formula cells will start to listen to the document. */
-const int SC_CLONECELL_STARTLISTENING = 0x0001;
-
-/** If set, relative 3D references of cloned formula cells will be adjusted to
- old position (used while swapping cells for sorting a cell range). */
-const int SC_CLONECELL_ADJUST3DREL = 0x0002;
-
-/** If set, the caption object of a cell note will not be cloned (used while
- copying cells to undo document, where captions are handled in drawing undo). */
-const int SC_CLONECELL_NOCAPTION = 0x0004;
-
-// ============================================================================
-
-class SC_DLLPUBLIC ScBaseCell
-{
-protected:
- ~ScBaseCell(); // not virtual - not to be called directly.
-
-public:
- explicit ScBaseCell( CellType eNewType );
-
- /** Base copy constructor. Does NOT clone cell note or broadcaster! */
- ScBaseCell( const ScBaseCell& rCell );
-
- /** Returns a clone of this cell at the same position, cell note and
- broadcaster will not be cloned. */
- ScBaseCell* CloneWithoutNote( ScDocument& rDestDoc, int nCloneFlags = SC_CLONECELL_DEFAULT ) const;
-
- /** Returns a clone of this cell for the passed document position, cell
- note and broadcaster will not be cloned. */
- ScBaseCell* CloneWithoutNote( ScDocument& rDestDoc, const ScAddress& rDestPos, int nCloneFlags = SC_CLONECELL_DEFAULT ) const;
-
- /** Returns a clone of this cell, clones cell note and caption object too
- (unless SC_CLONECELL_NOCAPTION flag is set). Broadcaster will not be cloned. */
- ScBaseCell* CloneWithNote( const ScAddress& rOwnPos, ScDocument& rDestDoc, const ScAddress& rDestPos, int nCloneFlags = SC_CLONECELL_DEFAULT ) const;
-
- /** Due to the fact that ScBaseCell does not have a vtable, this function
- deletes the cell by calling the appropriate d'tor of the derived class. */
- void Delete();
-
- inline CellType GetCellType() const { return (CellType)eCellType; }
-
- /** Returns true, if the cell is empty (neither value nor formula nor cell note).
- Returns false for formula cells returning nothing, use HasEmptyData() for that. */
- bool IsBlank( bool bIgnoreNotes = false ) const;
-
-// for idle-calculations
- inline sal_uInt16 GetTextWidth() const { return nTextWidth; }
- inline void SetTextWidth( sal_uInt16 nNew ) { nTextWidth = nNew; }
-
- inline sal_uInt8 GetScriptType() const { return nScriptType; }
- inline void SetScriptType( sal_uInt8 nNew ) { nScriptType = nNew; }
-
- /** Returns true, if the cell contains a note. */
- inline bool HasNote() const { return mpNote != 0; }
- /** Returns the pointer to a cell note object (read-only). */
- inline const ScPostIt* GetNote() const { return mpNote; }
- /** Returns the pointer to a cell note object. */
- inline ScPostIt* GetNote() { return mpNote; }
- /** Takes ownership of the passed cell note object. */
- void TakeNote( ScPostIt* pNote );
- /** Returns and forgets the own cell note object. Caller takes ownership! */
- ScPostIt* ReleaseNote();
- /** Deletes the own cell note object. */
- void DeleteNote();
-
- /** Returns true, if the cell contains a broadcaster. */
- inline bool HasBroadcaster() const { return mpBroadcaster != 0; }
- /** Returns the pointer to the cell broadcaster. */
- inline SvtBroadcaster* GetBroadcaster() const { return mpBroadcaster; }
- /** Takes ownership of the passed cell broadcaster. */
- void TakeBroadcaster( SvtBroadcaster* pBroadcaster );
- /** Returns and forgets the own cell broadcaster. Caller takes ownership! */
- SvtBroadcaster* ReleaseBroadcaster();
- /** Deletes the own cell broadcaster. */
- void DeleteBroadcaster();
-
- // String- oder EditCell
- static ScBaseCell* CreateTextCell( const String& rString, ScDocument* );
-
- // nOnlyNames may be one or more of SC_LISTENING_NAMES_*
- void StartListeningTo( ScDocument* pDoc );
- void EndListeningTo( ScDocument* pDoc,
- ScTokenArray* pArr = NULL,
- ScAddress aPos = ScAddress() );
-
- /** Error code if ScFormulaCell, else 0. */
- sal_uInt16 GetErrorCode() const;
- /** ScFormulaCell with formula::svEmptyCell result, or ScNoteCell (may have been
- created due to reference to empty cell). */
- sal_Bool HasEmptyData() const;
- sal_Bool HasValueData() const;
- sal_Bool HasStringData() const;
- String GetStringData() const; // only real strings
-
- static sal_Bool CellEqual( const ScBaseCell* pCell1, const ScBaseCell* pCell2 );
-
-private:
- ScBaseCell& operator=( const ScBaseCell& );
-
-private:
- ScPostIt* mpNote; /// The cell note. Cell takes ownership!
- SvtBroadcaster* mpBroadcaster; /// Broadcaster for changed values. Cell takes ownership!
-
-protected:
- sal_uInt16 nTextWidth;
- sal_uInt8 eCellType; // enum CellType - sal_uInt8 spart Speicher
- sal_uInt8 nScriptType;
-};
-
-// ============================================================================
-
-class SC_DLLPUBLIC ScNoteCell : public ScBaseCell
-{
-public:
-#ifdef USE_MEMPOOL
- DECL_FIXEDMEMPOOL_NEWDEL( ScNoteCell )
-#endif
-
- /** Cell takes ownership of the passed broadcaster. */
- explicit ScNoteCell( SvtBroadcaster* pBC = 0 );
- /** Cell takes ownership of the passed note and broadcaster. */
- explicit ScNoteCell( ScPostIt* pNote, SvtBroadcaster* pBC = 0 );
-
-#if OSL_DEBUG_LEVEL > 0
- ~ScNoteCell();
-#endif
-
-private:
- ScNoteCell( const ScNoteCell& );
-};
-
-class SC_DLLPUBLIC ScValueCell : public ScBaseCell
-{
-public:
-#ifdef USE_MEMPOOL
- DECL_FIXEDMEMPOOL_NEWDEL( ScValueCell )
-#endif
- ScValueCell();
- explicit ScValueCell( double fValue );
-
-#if OSL_DEBUG_LEVEL > 0
- ~ScValueCell();
-#endif
-
- inline void SetValue( double fValue ) { mfValue = fValue; }
- inline double GetValue() const { return mfValue; }
-
-private:
- double mfValue;
-};
-
-class SC_DLLPUBLIC ScStringCell : public ScBaseCell
-{
-public:
-#ifdef USE_MEMPOOL
- DECL_FIXEDMEMPOOL_NEWDEL( ScStringCell )
-#endif
-
- ScStringCell();
- explicit ScStringCell( const String& rString );
-
-#if OSL_DEBUG_LEVEL > 0
- ~ScStringCell();
-#endif
-
- inline void SetString( const String& rString ) { maString = rString; }
- inline void GetString( String& rString ) const { rString = maString; }
- inline const String& GetString() const { return maString; }
-
-private:
- String maString;
-};
-
-class SC_DLLPUBLIC ScEditCell : public ScBaseCell
-{
-private:
- EditTextObject* pData;
- String* pString; // for faster access to formulas
- ScDocument* pDoc; // for EditEngine access with Pool
-
- void SetTextObject( const EditTextObject* pObject,
- const SfxItemPool* pFromPool );
-
- // not implemented
- ScEditCell( const ScEditCell& );
-
-public:
-
-#ifdef USE_MEMPOOL
- DECL_FIXEDMEMPOOL_NEWDEL( ScEditCell )
-#endif
-
- ~ScEditCell(); // always because of pData!
-
- ScEditCell( const EditTextObject* pObject, ScDocument*,
- const SfxItemPool* pFromPool /* = NULL */ );
- ScEditCell( const ScEditCell& rCell, ScDocument& rDoc );
- // for line breaks
- ScEditCell( const String& rString, ScDocument* );
-
- void SetData( const EditTextObject* pObject,
- const SfxItemPool* pFromPool /* = NULL */ );
- void GetData( const EditTextObject*& rpObject ) const;
- void GetString( String& rString ) const;
-
- const EditTextObject* GetData() const { return pData; }
-
- /** Removes character attribute based on new pattern attributes. */
- void RemoveCharAttribs( const ScPatternAttr& rAttr );
-};
-
-class ScEditDataArray
-{
-public:
- class Item
- {
- public:
- explicit Item(SCTAB nTab, SCCOL nCol, SCROW nRow,
- EditTextObject* pOldData, EditTextObject* pNewData);
- ~Item();
-
- const EditTextObject* GetOldData() const;
- const EditTextObject* GetNewData() const;
- SCTAB GetTab() const;
- SCCOL GetCol() const;
- SCROW GetRow() const;
-
- private:
- Item(); // disabled
-
- private:
- ::boost::shared_ptr<EditTextObject> mpOldData;
- ::boost::shared_ptr<EditTextObject> mpNewData;
- SCTAB mnTab;
- SCCOL mnCol;
- SCROW mnRow;
-
- };
-
- ScEditDataArray();
- ~ScEditDataArray();
-
- void AddItem(SCTAB nTab, SCCOL nCol, SCROW nRow,
- EditTextObject* pOldData, EditTextObject* pNewData);
-
- const Item* First();
- const Item* Next();
-
-private:
- ::std::vector<Item>::const_iterator maIter;
- ::std::vector<Item> maArray;
-};
-
-enum ScMatrixMode {
- MM_NONE = 0, // No matrix formula
- MM_FORMULA = 1, // Upper left matrix formula cell
- MM_REFERENCE = 2, // Remaining cells, via ocMatRef reference token
- MM_FAKE = 3 // Interpret "as-if" matrix formula (legacy)
-};
-
-class SC_DLLPUBLIC ScFormulaCell : public ScBaseCell, public SvtListener
-{
-private:
- ScFormulaResult aResult;
- formula::FormulaGrammar::Grammar eTempGrammar; // used between string (creation) and (re)compilation
- ScTokenArray* pCode; // The (new) token array
- ScDocument* pDocument;
- ScFormulaCell* pPrevious;
- ScFormulaCell* pNext;
- ScFormulaCell* pPreviousTrack;
- ScFormulaCell* pNextTrack;
- sal_uLong nFormatIndex; // Number format set by calculation
- short nFormatType; // Number format type set by calculation
- sal_uInt16 nSeenInIteration; // Iteration cycle in which the cell was last encountered
- sal_uInt8 cMatrixFlag; // One of ScMatrixMode
- sal_Bool bDirty : 1; // Must be (re)calculated
- sal_Bool bChanged : 1; // Whether something changed regarding display/representation
- sal_Bool bRunning : 1; // Already interpreting right now
- sal_Bool bCompile : 1; // Must be (re)compiled
- sal_Bool bSubTotal : 1; // Cell is part of or contains a SubTotal
- sal_Bool bIsIterCell : 1; // Cell is part of a circular reference
- sal_Bool bInChangeTrack : 1; // Cell is in ChangeTrack
- sal_Bool bTableOpDirty : 1; // Dirty flag for TableOp
- sal_Bool bNeedListening : 1; // Listeners need to be re-established after UpdateReference
-
- enum ScInterpretTailParameter
- {
- SCITP_NORMAL,
- SCITP_FROM_ITERATION,
- SCITP_CLOSE_ITERATION_CIRCLE
- };
- void InterpretTail( ScInterpretTailParameter );
-
- ScFormulaCell( const ScFormulaCell& );
-
-public:
-
-#ifdef USE_MEMPOOL
- DECL_FIXEDMEMPOOL_NEWDEL( ScFormulaCell )
-#endif
-
- ScAddress aPos;
-
- ~ScFormulaCell();
- ScFormulaCell();
-
- /** Empty formula cell, or with a preconstructed token array. */
- ScFormulaCell( ScDocument*, const ScAddress&, const ScTokenArray* = NULL,
- const formula::FormulaGrammar::Grammar = formula::FormulaGrammar::GRAM_DEFAULT,
- sal_uInt8 = MM_NONE );
-
- /** With formula string and grammar to compile with.
- formula::FormulaGrammar::GRAM_DEFAULT effectively isformula::FormulaGrammar::GRAM_NATIVE_UI that
- also includes formula::FormulaGrammar::CONV_UNSPECIFIED, therefor uses the address
- convention associated with rPos::nTab by default. */
- ScFormulaCell( ScDocument* pDoc, const ScAddress& rPos,
- const String& rFormula,
- const formula::FormulaGrammar::Grammar = formula::FormulaGrammar::GRAM_DEFAULT,
- sal_uInt8 cMatInd = MM_NONE );
-
- ScFormulaCell( const ScFormulaCell& rCell, ScDocument& rDoc, const ScAddress& rPos, int nCloneFlags = SC_CLONECELL_DEFAULT );
-
- void GetFormula( String& rFormula,
- const formula::FormulaGrammar::Grammar = formula::FormulaGrammar::GRAM_DEFAULT ) const;
- void GetFormula( rtl::OUStringBuffer& rBuffer,
- const formula::FormulaGrammar::Grammar = formula::FormulaGrammar::GRAM_DEFAULT ) const;
-
- void SetDirty();
- void SetDirtyVar();
- // If setting entire document dirty after load, no broadcasts but still append to FormulaTree.
- void SetDirtyAfterLoad();
- inline void ResetTableOpDirtyVar() { bTableOpDirty = false; }
- void SetTableOpDirty();
- sal_Bool IsDirtyOrInTableOpDirty() const;
- sal_Bool GetDirty() const { return bDirty; }
- void ResetDirty() { bDirty = false; }
- sal_Bool NeedsListening() const { return bNeedListening; }
- void SetNeedsListening( sal_Bool bVar ) { bNeedListening = bVar; }
- void Compile(const String& rFormula,
- sal_Bool bNoListening = false,
- const formula::FormulaGrammar::Grammar = formula::FormulaGrammar::GRAM_DEFAULT );
- void CompileTokenArray( sal_Bool bNoListening = false );
- void CompileXML( ScProgress& rProgress ); // compile temporary string tokens
- void CalcAfterLoad();
- bool MarkUsedExternalReferences();
- void Interpret();
- inline sal_Bool IsIterCell() const { return bIsIterCell; }
- inline sal_uInt16 GetSeenInIteration() const { return nSeenInIteration; }
-
- sal_Bool HasOneReference( ScRange& r ) const;
- /* Checks if the formula contains reference list that can be
- expressed by one reference (like A1;A2;A3:A5 -> A1:A5). The
- reference list is not required to be sorted (i.e. A3;A1;A2 is
- still recognized as A1:A3), but no overlapping is allowed.
- If one reference is recognized, the rRange is filled.
-
- It is similar to HasOneReference(), but more general.
- */
- bool HasRefListExpressibleAsOneReference(ScRange& rRange) const;
- sal_Bool HasRelNameReference() const;
- sal_Bool HasColRowName() const;
-
- bool UpdateReference(UpdateRefMode eUpdateRefMode,
- const ScRange& r,
- SCsCOL nDx, SCsROW nDy, SCsTAB nDz,
- ScDocument* pUndoDoc = NULL,
- const ScAddress* pUndoCellPos = NULL );
-
- void TransposeReference();
- void UpdateTranspose( const ScRange& rSource, const ScAddress& rDest,
- ScDocument* pUndoDoc );
-
- void UpdateGrow( const ScRange& rArea, SCCOL nGrowX, SCROW nGrowY );
-
- void UpdateInsertTab(SCTAB nTable, SCTAB nNewSheets = 1);
- void UpdateInsertTabAbs(SCTAB nTable);
- sal_Bool UpdateDeleteTab(SCTAB nTable, sal_Bool bIsMove = false, SCTAB nSheets = 1);
- void UpdateMoveTab(SCTAB nOldPos, SCTAB nNewPos, SCTAB nTabNo);
- void UpdateRenameTab(SCTAB nTable, const String& rName);
- sal_Bool TestTabRefAbs(SCTAB nTable);
- void UpdateCompile( sal_Bool bForceIfNameInUse = false );
- sal_Bool IsRangeNameInUse(sal_uInt16 nIndex) const;
- void FindRangeNamesInUse(std::set<sal_uInt16>& rIndexes) const;
- void ReplaceRangeNamesInUse( const ScRangeData::IndexMap& rMap );
- sal_Bool IsSubTotal() const { return bSubTotal; }
- sal_Bool IsChanged() const { return bChanged; }
- void ResetChanged() { bChanged = false; }
- sal_Bool IsEmpty(); // formula::svEmptyCell result
- // display as empty string if formula::svEmptyCell result
- sal_Bool IsEmptyDisplayedAsString();
- sal_Bool IsValue(); // also sal_True if formula::svEmptyCell
- double GetValue();
- double GetValueAlways(); // ignore errors
- void GetString( String& rString );
- const ScMatrix* GetMatrix();
- sal_Bool GetMatrixOrigin( ScAddress& rPos ) const;
- void GetResultDimensions( SCSIZE& rCols, SCSIZE& rRows );
- sal_uInt16 GetMatrixEdge( ScAddress& rOrgPos );
- sal_uInt16 GetErrCode(); // interpret first if necessary
- sal_uInt16 GetRawError(); // don't interpret, just return code or result error
- short GetFormatType() const { return nFormatType; }
- sal_uLong GetFormatIndex() const { return nFormatIndex; }
- void GetFormatInfo( short& nType, sal_uLong& nIndex ) const
- { nType = nFormatType; nIndex = nFormatIndex; }
- sal_uInt8 GetMatrixFlag() const { return cMatrixFlag; }
- ScTokenArray* GetCode() const { return pCode; }
-
- sal_Bool IsRunning() const { return bRunning; }
- void SetRunning( sal_Bool bVal ) { bRunning = bVal; }
- void CompileDBFormula();
- void CompileDBFormula( sal_Bool bCreateFormulaString );
- void CompileNameFormula( sal_Bool bCreateFormulaString );
- void CompileColRowNameFormula();
- ScFormulaCell* GetPrevious() const { return pPrevious; }
- ScFormulaCell* GetNext() const { return pNext; }
- void SetPrevious( ScFormulaCell* pF ) { pPrevious = pF; }
- void SetNext( ScFormulaCell* pF ) { pNext = pF; }
- ScFormulaCell* GetPreviousTrack() const { return pPreviousTrack; }
- ScFormulaCell* GetNextTrack() const { return pNextTrack; }
- void SetPreviousTrack( ScFormulaCell* pF ) { pPreviousTrack = pF; }
- void SetNextTrack( ScFormulaCell* pF ) { pNextTrack = pF; }
-
- virtual void Notify( SvtBroadcaster& rBC, const SfxHint& rHint);
- void SetCompile( sal_Bool bVal ) { bCompile = bVal; }
- ScDocument* GetDocument() const { return pDocument; }
- void SetMatColsRows( SCCOL nCols, SCROW nRows );
- void GetMatColsRows( SCCOL& nCols, SCROW& nRows ) const;
-
- // cell belongs to ChangeTrack and not to the real document
- void SetInChangeTrack( sal_Bool bVal ) { bInChangeTrack = bVal; }
- sal_Bool IsInChangeTrack() const { return bInChangeTrack; }
-
- // standard format for type and format
- // for format "Standard" possibly the format used in the formula cell
- sal_uLong GetStandardFormat( SvNumberFormatter& rFormatter, sal_uLong nFormat ) const;
-
- // For import filters!
- void AddRecalcMode( formula::ScRecalcMode );
- /** For import only: set a double result. */
- void SetHybridDouble( double n ) { aResult.SetHybridDouble( n); }
- /** For import only: set a string result.
- If for whatever reason you have to use both, SetHybridDouble() and
- SetHybridString() or SetHybridFormula(), use SetHybridDouble() first
- for performance reasons.*/
- void SetHybridString( const String& r )
- { aResult.SetHybridString( r); }
- /** For import only: set a temporary formula string to be compiled later.
- If for whatever reason you have to use both, SetHybridDouble() and
- SetHybridString() or SetHybridFormula(), use SetHybridDouble() first
- for performance reasons.*/
- void SetHybridFormula( const String& r,
- const formula::FormulaGrammar::Grammar eGrammar )
- { aResult.SetHybridFormula( r); eTempGrammar = eGrammar; }
- void SetErrCode( sal_uInt16 n );
- inline sal_Bool IsHyperLinkCell() const { return pCode && pCode->IsHyperLink(); }
- EditTextObject* CreateURLObject() ;
- void GetURLResult( String& rURL, String& rCellText );
-
- /** Determines whether or not the result string contains more than one paragraph */
- bool IsMultilineResult();
-
- void MaybeInterpret();
-};
-
-// Iterator for references in a formula cell
-class ScDetectiveRefIter
-{
-private:
- ScTokenArray* pCode;
- ScAddress aPos;
-public:
- ScDetectiveRefIter( ScFormulaCell* pCell );
- sal_Bool GetNextRef( ScRange& rRange );
- ScToken* GetNextRefToken();
-};
-
-#endif
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */