summaryrefslogtreecommitdiffstats
path: root/kspread/kspread_cell.h
diff options
context:
space:
mode:
authortpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2010-01-20 01:29:50 +0000
committertpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2010-01-20 01:29:50 +0000
commit8362bf63dea22bbf6736609b0f49c152f975eb63 (patch)
tree0eea3928e39e50fae91d4e68b21b1e6cbae25604 /kspread/kspread_cell.h
downloadkoffice-8362bf63dea22bbf6736609b0f49c152f975eb63.tar.gz
koffice-8362bf63dea22bbf6736609b0f49c152f975eb63.zip
Added old abandoned KDE3 version of koffice
git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/applications/koffice@1077364 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'kspread/kspread_cell.h')
-rw-r--r--kspread/kspread_cell.h1103
1 files changed, 1103 insertions, 0 deletions
diff --git a/kspread/kspread_cell.h b/kspread/kspread_cell.h
new file mode 100644
index 00000000..1de6a20b
--- /dev/null
+++ b/kspread/kspread_cell.h
@@ -0,0 +1,1103 @@
+/* This file is part of the KDE project
+
+ Copyright 2006 Stefan Nikolaus <stefan.nikolaus@kdemail.net>
+ Copyright 2004 Tomas Mecir <mecirt@gmail.com>
+ Copyright 1999-2002,2004 Laurent Montel <montel@kde.org>
+ Copyright 2002,2004 Ariya Hidayat <ariya@kde.org>
+ Copyright 2002-2003 Norbert Andres <nandres@web.de>
+ Copyright 2003 Stefan Hetzl <shetzl@chello.at>
+ Copyright 2001-2002 Philipp Mueller <philipp.mueller@gmx.de>
+ Copyright 2002 Harri Porten <porten@kde.org>
+ Copyright 2002 John Dailey <dailey@vt.edu>
+ Copyright 1999-2001 David Faure <faure@kde.org>
+ Copyright 2000-2001 Werner Trobin <trobin@kde.org>
+ Copyright 2000 Simon Hausmann <hausmann@kde.org
+ Copyright 1998-1999 Torben Weis <weis@kde.org>
+ Copyright 1999 Michael Reiher <michael.reiher.gmx.de>
+ Copyright 1999 Reginald Stadlbauer <reggie@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+*/
+
+#ifndef KSPREAD_CELL
+#define KSPREAD_CELL
+
+#include <qpainter.h>
+#include <qptrlist.h>
+#include <qdatetime.h>
+
+#include "kspread_condition.h"
+
+class KLocale;
+class QDomElement;
+class QDomDocument;
+class KoXmlWriter;
+class KoGenStyles;
+class KoGenStyle;
+class KSParseNode;
+class KoRect;
+class KoPoint;
+class KoOasisStyles;
+class KoOasisLoadingContext;
+
+namespace KSpread
+{
+class Canvas;
+class Format;
+class GenValidationStyles;
+class Sheet;
+class Value;
+class View;
+class ConditionalDialog;
+
+struct Validity
+{
+ Validity()
+ {
+ valMin = 0.0;
+ valMax = 0.0;
+ m_cond = Conditional::None;
+ m_action = Action::Stop;
+ m_restriction = Restriction::None;
+ displayMessage = true;
+ allowEmptyCell = false;
+ displayValidationInformation = false;
+ };
+
+ bool operator==( const Validity& other ) const
+ {
+ if ( message == other.message &&
+ title == other.title &&
+ titleInfo == other.titleInfo &&
+ messageInfo == other.messageInfo &&
+ valMin == other.valMin &&
+ valMax == other.valMax &&
+ m_cond == other.m_cond &&
+ m_action == other.m_action &&
+ m_restriction == other.m_restriction &&
+ timeMin == other.timeMin &&
+ timeMax == other.timeMax &&
+ dateMin == other.dateMin &&
+ dateMax == other.dateMax &&
+ displayMessage == other.displayMessage &&
+ allowEmptyCell == other.allowEmptyCell &&
+ displayValidationInformation == other.displayValidationInformation &&
+ listValidity == other.listValidity )
+ {
+ return true;
+ }
+ return false;
+ }
+ inline bool operator!=( const Validity& other ) const { return !operator==( other ); }
+
+ QString message;
+ QString title;
+ QString titleInfo;
+ QString messageInfo;
+ double valMin;
+ double valMax;
+ Conditional::Type m_cond;
+ Action::Type m_action;
+ Restriction::Type m_restriction;
+ QTime timeMin;
+ QTime timeMax;
+ QDate dateMin;
+ QDate dateMax;
+ bool displayMessage;
+ bool allowEmptyCell;
+ bool displayValidationInformation;
+ QStringList listValidity;
+};
+
+class Formula;
+
+/**
+ * For every cell in the spread sheet there is a Cell object.
+ *
+ * Cell contains format information and algorithm and it
+ * contains the calculation algorithm.
+ *
+ * However, all empty cells are represented by one instace, called the
+ * default cell. @ref #isDefault can be used to determine whether or not a Cell object represents
+ * the default one.
+ */
+class KSPREAD_EXPORT Cell
+{
+ friend class Conditions;
+public:
+
+ Cell (Sheet *_sheet, int _column, int _row);
+ Cell (Sheet *_sheet, Style * _style, int _column, int _row);
+
+ /**
+ * @see #sheetDies
+ */
+ ~Cell();
+
+ /**
+ * Returns the worksheet which owns this cell.
+ */
+ Sheet* sheet() const;
+
+ /**
+ * Returns true if this is a default cell (with row and column equal to zero).
+ * Normally, cell constructed within a sheet can't be a default cell.
+ */
+ bool isDefault() const;
+
+ /**
+ * Returns true if this cell has no content, i.e no text and no formula.
+ */
+ bool isEmpty() const;
+
+ /**
+ * Returns the cell's column. This could be 0 if the cell is the default cell.
+ */
+ int column() const;
+
+ /**
+ * Returns the cell's row. This could be 0 if the cell is the default cell.
+ */
+ int row() const;
+
+ /**
+ * Returns the name of the cell. For example, the cell in first column and
+ * first row is "A1".
+ */
+ QString name() const;
+
+ /**
+ * Returns the full name of the cell, i.e. including the worksheet name.
+ * Example: "Sheet1!A1"
+ */
+ QString fullName() const;
+
+ /**
+ * Returns the column name of the cell.
+ */
+ QString columnName() const;
+
+ /**
+ * Given the cell position, this static function returns the name of the cell.
+ * Example: name(5,4) will return "E4".
+ */
+ static QString name( int col, int row );
+
+ /**
+ * Given the sheet and cell position, this static function returns the full name
+ * of the cell, i.e. with the name of the sheet.
+ */
+ static QString fullName( const Sheet *s, int col, int row );
+
+ /**
+ * Given the column number, this static function returns the corresponding
+ * column name, i.e. the first column is "A", the second is "B", and so on.
+ */
+ static QString columnName( uint column );
+
+ /**
+ * Returns the locale setting of this cell.
+ */
+ KLocale* locale() const;
+ /**
+ * Returns true if this cell holds a formula.
+ */
+ bool isFormula() const;
+
+ /**
+ * Return the text the user entered. This could be a value (e.g. "14.03")
+ * or a formula (e.g. "=SUM(A1:A10)")
+ */
+ QString text() const;
+
+ QString strOutText() const;
+
+ Formula *formula () const;
+
+ /** Returns the format object of this cell */
+ Format* format() const;
+
+ /**
+ * Returns the value that this cell holds. It could be from the user
+ * (i.e. when s/he enters a value) or a result of formula.
+ */
+ const Value value() const;
+
+ /**
+ * Sets the value for this cell.
+ */
+ void setValue( const Value& value );
+
+ /**
+ * Sets the value for this cell and its formatting and input text, if
+ * appropriate. Can therefore be used as a replacement for setCellText,
+ * if we don't need to parse.
+ *
+ * If \p inputText is empty and the cell has NO formula, the input text
+ * is created from \p value .
+ *
+ * \param value the new cell value
+ * \param fmtType the formatting type
+ * \param inputText the new input text
+ *
+ * \note Calls setValue() after setting the formatting and input text.
+ */
+ void setCellValue (const Value& value, FormatType fmtType = No_format,
+ const QString& inputText = QString::null);
+
+ Cell* previousCell() const;
+ Cell* nextCell() const;
+ void setPreviousCell( Cell* c );
+ void setNextCell( Cell* c );
+
+ /**
+ * Moves around the cell. It cares about obscured and obscuring cells and
+ * forces, relayout, calculation and redrawing of the cell.
+ */
+ void move( int column, int row );
+
+ /**
+ * This method notifies the cell that the parent sheet is being deleted.
+ */
+ // Note: This used to remove any links from this cell to other cells. However, this caused a problem
+ // in other parts of the code which relied upon walking from one cell to the next using
+ // nextCell().
+ void sheetDies();
+
+ /**
+ * Save this cell.
+ * @param doc document to save cell in
+ * @param _x_offset x offset
+ * @param _y_offset y offset
+ * @param force if set to true, all the properties of the format are stored (used for "Copy"),
+ * otherwise only the non-default properties will be stored.
+ * Set this to false if you want smaller files.
+ * @param copy if set to true, all cell formats will be copied instead of referencing the format (style name),
+ * thus resulting in larger output (files).
+ * Set this to false if you want smaller files.
+ * @param era set this to true if you want to encode relative references as absolutely (they will be switched
+ * back to relative references during decoding) - is used for cutting to clipboard
+ * Usually this is false, to only store the properties explicitely set.
+ */
+ QDomElement save( QDomDocument& doc, int _x_offset = 0, int _y_offset = 0, bool force = false, bool copy = false, bool era = false );
+
+ bool saveOasis( KoXmlWriter& xmlwriter, KoGenStyles& mainStyles,
+ int row, int column, int &repeated,
+ GenValidationStyles &valStyle );
+
+ void saveOasisValue (KoXmlWriter &xmlWriter);
+
+ /**
+ * @return the OASIS style's name
+ */
+ QString saveOasisCellStyle( KoGenStyle &currentCellStyle,KoGenStyles &mainStyles );
+
+ bool load( const QDomElement& cell, int _xshift, int _yshift, Paste::Mode pm = Paste::Normal,
+ Paste::Operation op = Paste::OverWrite, bool paste = false );
+
+ /**
+ * Loads a cell from an OASIS XML element.
+ * @param element An OASIS XML element
+ * @param oasisContext The loading context assoiated with the XML element
+ */
+ bool loadOasis( const QDomElement & element, KoOasisLoadingContext &oasisContext , Style* style);
+
+ QTime toTime(const QDomElement &element);
+ QDate toDate(const QDomElement &element);
+
+ /**
+ * Copyies the format from the cell at the position (_column|_row).
+ *
+ * @see #copyAll
+ */
+ void copyFormat( const int column, const int row );
+ /**
+ * A convenience function.
+ *
+ * @see #copyAll
+ */
+ void copyFormat( const Cell* cell );
+ void copyContent( const Cell* cell );
+ /**
+ * Copies the format and the content. It does not copy the #m_row and #m_column attributes.
+ * Besides that all persistent attributes are copied. @ref #setCellText is called to set the real
+ * content.
+ *
+ * @see #copyFormat
+ */
+ void copyAll( Cell *cell);
+
+ enum BorderSides
+ {
+ Border_None =0x00,
+ Border_Left =0x01,
+ Border_Right =0x02,
+ Border_Top =0x04,
+ Border_Bottom =0x08,
+ Border_SizeGrip =0x10 //the size grip is the little square on the bottom right-hand corner of a highlighted range of cells
+ //which the user can click and drag to resize the range and change which cells are included.
+ //this is not used with normal borders
+ };
+
+ /**
+ * Paints the cell.
+ *
+ * @param rect the portion of the canvas that is actually in view
+ * @param painter the painter object to paint on
+ * @param view the view of this data. This may be NULL, but no selection
+ * will be included with the painting.
+ * @param coordinate coordinates on the painter where the top left corner
+ * of the cell should be painted plus width and height
+ * @param cellRef the column/row coordinates of the cell.
+ * @param paintBorder a combination of flags from the Cell::BorderSides enum which specifies which cell borders to paint
+ * @param rightPen pen to use to draw the right border if @p paintBorder includes the Border_Right flag
+ * @param bottomPen pen to use to draw the bottom border if @p paintBorderBottom includes the Border_Bottom flag
+ * @param leftPen pen to use to draw the left border if @p paintBorderLeft includes the Border_Left flag
+ * @param topPen pen to use to draw the top border if @p paintBorderTop includes the Border_Top flag
+ * @param mergedCellsPainted list of merged cells being painted
+ * @param drawCursor whether to draw the cursor and selection or not
+ */
+ void paintCell( const KoRect & rect, QPainter & painter,
+ View * view, const KoPoint & coordinate,
+ const QPoint & cellRef,
+ int paintBorder,
+ QPen & rightPen,
+ QPen & bottomPen,
+ QPen & leftPen,
+ QPen & topPen,
+ QValueList<QPoint> &mergedCellsPainted,
+ bool drawCursor = true );
+
+
+ /**
+ * @param _col the column this cell is assumed to be in.
+ * This parameter defaults to the return value of @ref #column.
+ * @param _canvas the canvas this cell is assumed to be in.
+ *
+ * @return the width of this cell as int
+ */
+ int width( int _col = -1, const Canvas *_canvas = 0L ) const;
+
+ /**
+ * @param _row the row this cell is assumed to be in.
+ * @param _canvas the canvas this cell is assumed to be in.
+ *
+ * @return the height of this cell as int
+ */
+ int height( int _row = -1, const Canvas *_canvas = 0L ) const;
+
+ /**
+ * @param _canvas the canvas this cell is assumed to be in.
+ * @param _col the column this cell is assumed to be in.
+ * This parameter defaults to the return value of @ref #column.
+ *
+ * @return the width of this cell as double
+ */
+ double dblWidth( int _col = -1, const Canvas *_canvas = 0L ) const;
+
+ /**
+ * @param _row the row this cell is assumed to be in.
+ * @param _canvas the canvas this cell is assumed to be in.
+ *
+ * @return the height of this cell as double
+ */
+ double dblHeight( int _row = -1, const Canvas *_canvas = 0L ) const;
+
+ /**
+ * @return a QRect for this cell (i.e., a 1x1 rect). @see zoomedCellRect
+ */
+ QRect cellRect();
+
+ /**
+ * @return true if the cell should be printed in a print out.
+ * That si the case if it has any content, border, backgroundcolor,
+ * or background brush.
+ *
+ * @see Sheet::print
+ */
+ bool needsPrinting() const;
+
+ /**
+ * Increases the precison of the
+ * value displayed. Precision means here the amount of
+ * digits behind the dot. If the current precision is the
+ * default of -1, then it is set to the number of digits
+ * behind the dot plus 1.
+ */
+ void incPrecision();
+ /**
+ * Decreases the precison of the
+ * value displayed. Precision means here the amount of
+ * digits behind the dot. If the current precision is the
+ * default of -1, then it is set to the number of digits
+ * behind the dot minus 1.
+ */
+ void decPrecision();
+
+ /**
+ * The high-level method for setting text, when the user inputs it.
+ * It will revert back to the old text if testValidity() returns action==stop.
+ */
+ void setCellText( const QString& _text, bool asString = false );
+
+ /**
+ * Sets the text in the cell when the user inputs it.
+ * Will determine the type of contents automatically.
+ * Called by setCellText.
+ */
+ void setDisplayText( const QString& _text );
+
+ /**
+ * Sets a link for this cell. For example, setLink( "mailto:joe@somewhere.com" )
+ * will open a new e-mail if this cell is clicked.
+ * Possible choices for link are URL (web, ftp), e-mail address, local file,
+ * or another cell.
+ */
+ void setLink( const QString& link );
+
+ /**
+ * Returns the link associated with cell. It is empty if this cell
+ * contains no link.
+ */
+ QString link() const;
+
+ ////////////////////////////////
+ //
+ // Methods for querying format stuff.
+ //
+ ////////////////////////////////
+
+ /**
+ * @return effective pen for the left border
+ * If this cell is merged by another cell, the other cell's
+ * left border pen. If this cell's conditional formatting contains
+ * a left border pen and the condition is matched, the conditional
+ * formatting's pen. Otherwise, its own left border pen.
+ */
+ const QPen & effLeftBorderPen( int col, int row ) const;
+ /**
+ * @return effective pen for the top border
+ * @see effLeftBorderPen
+ */
+ const QPen & effTopBorderPen( int col, int row ) const;
+ /**
+ * @return effective pen for the right border
+ * @see effLeftBorderPen
+ */
+ const QPen & effRightBorderPen( int col, int row ) const;
+ /**
+ * @return effective pen for the bottom border
+ * @see effLeftBorderPen
+ */
+ const QPen & effBottomBorderPen( int col, int row ) const;
+ /**
+ * @return effective pen for the go up diagonal border
+ * If this cell's conditional formatting contains a go up diagonal pen and
+ * the condition is matched, the conditional formatting's pen. Otherwise,
+ * its own go up diagonal pen.
+ */
+ const QPen & effGoUpDiagonalPen( int col, int row ) const;
+ /**
+ * @return effective pen for the go up diagonal border
+ * @see effGoUpDiagonalPen
+ */
+ const QPen & effFallDiagonalPen( int col, int row ) const;
+ const QColor & effTextColor( int col, int row ) const;
+
+ /**
+ * @return "worth" of the effective bottom border pen
+ * @see Style::calculateValue
+ * @see effLeftBorderPen
+ */
+ uint effBottomBorderValue( int col, int row ) const;
+ /**
+ * @return "worth" of the effective right border pen
+ * @see Style::calculateValue
+ * @see effLeftBorderPen
+ */
+ uint effRightBorderValue( int col, int row ) const;
+ /**
+ * @return "worth" of the effective left border pen
+ * @see Style::calculateValue
+ * @see effLeftBorderPen
+ */
+ uint effLeftBorderValue( int col, int row ) const;
+ /**
+ * @return "worth" of the effective top border pen
+ * @see Style::calculateValue
+ * @see effLeftBorderPen
+ */
+ uint effTopBorderValue( int col, int row ) const;
+
+ /**
+ * @see Format::leftBorderPen
+ */
+ const QPen& leftBorderPen( int col, int row ) const;
+
+ /**
+ * @see Format::topBorderPen
+ */
+ const QPen& topBorderPen( int col, int row ) const;
+
+ /**
+ * @see Format::rightBorderPen
+ */
+ const QPen& rightBorderPen( int col, int row ) const;
+
+ /**
+ * @see Format::bottomBorderPen
+ */
+ const QPen& bottomBorderPen( int col, int row ) const;
+
+ /**
+ * @see Format::bgColor
+ */
+ const QColor& bgColor( int col, int row ) const;
+
+ /**
+ * @see Format::backGroundBrush
+ */
+ const QBrush& backGroundBrush( int col, int row ) const;
+
+ ////////////////////////////////
+ //
+ // Methods for setting format stuff.
+ //
+ ////////////////////////////////
+
+ /**
+ * @see Format::setLeftBorderPen
+ */
+ void setLeftBorderPen( const QPen& p );
+
+ /**
+ * @see Format::setTopBorderPen
+ */
+ void setTopBorderPen( const QPen& p );
+
+ /**
+ * @see Format::setRightBorderPen
+ */
+ void setRightBorderPen( const QPen& p );
+
+ /**
+ * @see Format::setBottomBorderPen
+ */
+ void setBottomBorderPen( const QPen& p );
+
+ //////////////////////
+ //
+ // Other stuff
+ //
+ //////////////////////
+
+ /**
+ * Return the format of this cell.
+ * Convenience method for Format::getFormatType
+ * Note that this is "how the user would like the data to be displayed if possible".
+ * If he selects a date format, and the cell contains a string, we won't apply that format.
+ */
+ FormatType formatType() const;
+
+ /** returns true, if cell format is of date type or content is a date */
+ bool isDate() const;
+ /** returns true, if cell format is of time type or content is a time */
+ bool isTime() const;
+
+ void setNumber( double number );
+
+ /** return the cell's value as a double */
+ double getDouble ();
+
+ /** converts content to double format */
+ void convertToDouble ();
+ /** converts content to percentageformat */
+ void convertToPercent ();
+ /** converts content to money format */
+ void convertToMoney ();
+ /** converts content to time format */
+ void convertToTime ();
+ /** converts content to date format */
+ void convertToDate ();
+
+ /** return width of the text */
+ double textWidth() const;
+ /** return height of the text */
+ double textHeight() const;
+
+
+ /**
+ * Refreshing chart
+ * @param refresh is default true
+ * when it's false it's just for test
+ * it's used when you paste cell
+ */
+ bool updateChart(bool refresh=true);
+
+ QString testAnchor( int _x, int _y ) const;
+
+ /**
+ * Starts calculating.
+ * @param delay true if you want to check for delay condition in doc()
+ * false if you really have to calculate the value right now
+ * e.g. if you sort with formula as key
+ *
+ * @return true on success and false on error.
+ */
+ bool calc(bool delay = true);
+
+ /** Set the calcDirtyFlag */
+ void setCalcDirtyFlag();
+ /** Checks the calcDirtyFlag */
+ bool calcDirtyFlag();
+
+ /**
+ * Notify this cell that another cell is depending, or no longer depending on this cell's value
+ *
+ * @param col the column of the cell
+ * @param row the row of the cell
+ * @param sheet the sheet that the cell is on
+ * @param isDepending true if the cell is now depending on this one, false if it is not any longer
+ * depending on it.
+ */
+ void NotifyDepending( int col, int row, Sheet* sheet, bool isDepending );
+
+ /**
+ * Causes the format to be recalculated when the cell is drawn next time.
+ * This flag is for example set if the width of the column changes or if
+ * some cell specific format value like font or text change.
+ */
+ void setLayoutDirtyFlag( bool format = false );
+ bool layoutDirtyFlag() const;
+
+ void clearDisplayDirtyFlag();
+ void setDisplayDirtyFlag();
+
+ /**
+ * Tells this cell that the @ref Cell 'cell' obscures this one.
+ * If this cell has to be redrawn, then the obscuring cell is redrawn instead.
+ *
+ * @param cell the obscuring cell
+ * @param isForcing whether this is a forced obscuring (merged cells) or
+ * just a temporary obscure (text overlap).
+ */
+ void obscure( Cell *cell, bool isForcing = false);
+ /**
+ * Tells this cell that it is no longer obscured.
+ *
+ * @param cell the cell that is no longer obscuring this one.
+ */
+ void unobscure(Cell* cell);
+ /**
+ * @return true if this cell is obscured by another.
+ */
+ bool isObscured() const;
+ /**
+ * If this cell is part of a merged cell, then the marker may
+ * never reside on this cell.
+ *
+ * @return true if another cell has this one merged into itself.
+ */
+ bool isPartOfMerged() const;
+
+ /**
+ * Return the cell that is obscuring this one (merged cells only).
+ * If no obscuring, return the cell itself.
+ *
+ * @return the cell that decides the format for the cell in question.
+ */
+ Cell *ultimateObscuringCell() const;
+
+ /**
+ * @return the obscuring cell list (might be empty)
+ */
+ QValueList<Cell*> obscuringCells() const;
+
+ void clearObscuringCells();
+
+
+ /**
+ * Merge a number of cells, i.e. force the cell to occupy other
+ * cells space. If '_x' and '_y' are 0 then the merging is
+ * disabled.
+ *
+ * @param _col is the column this cell is assumed to be in.
+ * @param _row is the row this cell is assumed to be in.
+ * @param _x tells to occupy _x additional cells in the horizontal
+ * @param _y tells to occupy _y additional cells in the vertical
+ *
+ */
+ void mergeCells( int _col, int _row, int _x, int _y );
+
+ /**
+ * @return true if the cell is forced to obscure other cells.
+ */
+ bool doesMergeCells() const;
+
+ /**
+ * @return the number of obscured cells in the horizontal direction as a
+ * result of cell merging (forced obscuring)
+ */
+ int mergedXCells() const;
+
+ /**
+ * @return the number of obscured cells in the vertical direction as a
+ * result of cell merging (forced obscuring)
+ */
+ int mergedYCells() const;
+
+ /**
+ * @return the amount of obscured cells in the horizontal direction
+ */
+ int extraXCells() const;
+
+ /**
+ * @return the amount of obscured cells in the vertical direction
+ */
+ int extraYCells() const;
+
+ double extraWidth() const;
+ double extraHeight() const;
+
+ /**
+ * encode a formula into a text representation
+ *
+ * @param _era encode relative references absolutely (this is used for copying
+ * a cell to make the paste operation create a formula that points
+ * to the original cells, not the cells at the same relative position)
+ * @param _col row the formula is in
+ * @param _row column the formula is in
+ */
+ QString encodeFormula( bool _era = false, int _col = -1, int _row = -1 ) const;
+ QString decodeFormula( const QString &_text, int _col = -1, int _row = -1 ) const;
+
+ /**
+ * Merges the @p new_text with @p old_text during a paste operation.
+ * If both texts represent doubles, then the operation is performed on both
+ * values and the result is returned. If both texts represents a formula or
+ * one a formula and the other a double value, then a formula is returned.
+ * In all other cases @p new_text is returned.
+ *
+ * @return the merged text.
+ */
+ QString pasteOperation( const QString &new_text, const QString &old_text, Paste::Operation op );
+
+ /**
+ * @return true if the cell contains a formula that could not
+ * be evaluated. These cells usually appear with "####" on the screen.
+ */
+ bool hasError() const;
+
+ /**
+ * Clear all error flags from the cell.
+ */
+ void clearAllErrors();
+
+ /**
+ * Calculates the layout of the cell, i,e, determines what should be shown
+ * for this cell, m_strOutText.
+ */
+ void makeLayout( QPainter &_painter, int _col, int _row );
+
+ /**
+ * Parses the formula.
+ * Fills #dependList and #formula.
+ * @return false on error.
+ */
+ bool makeFormula();
+
+
+ void defaultStyle();
+
+ /**
+ * Gets a copy of the list of current conditions
+ */
+ QValueList<Conditional> conditionList() const;
+
+ /**
+ * Replace the old set of conditions with a new one
+ */
+ void setConditionList(const QValueList<Conditional> &newList);
+
+ Validity * getValidity( int newStruct = -1 );
+
+ void removeValidity();
+
+ /**
+ * return true if value is good
+ * else show a messagebox
+ */
+ bool testValidity() const;
+
+ /**
+ * Calculates the text parameters stored in cell
+ * Applies font to use to @p painter
+ */
+ void calculateTextParameters( QPainter &painter, int _col, int _row );
+
+ /**
+ * return align X when align is undefined
+ */
+ int defineAlignX();
+
+
+
+
+ /**
+ * Used for comparing cells (when sorting)
+ */
+ bool operator > ( const Cell & ) const;
+ bool operator < ( const Cell & ) const;
+
+ bool operator==( const Cell& other ) const;
+ inline bool operator!=( const Cell& other ) const { return !operator==( other ); }
+
+ void freeAllObscuredCells();
+
+ /* descriptions of the flags are just below */
+ enum CellFlags{
+ /* this uses the same flags variable as Format. The least significant
+ 16 bits are reserved for the base class, and the most significant 16
+ have been left for this subclass to use. */
+ Flag_LayoutDirty = 0x00010000,
+ Flag_CalcDirty = 0x00020000,
+ Flag_Progress = 0x00040000,
+ Flag_UpdatingDeps = 0x00080000,
+ Flag_DisplayDirty = 0x00100000,
+ Flag_Merged = 0x00200000,
+ Flag_CellTooShortX = 0x00400000,
+ Flag_CellTooShortY = 0x00800000,
+ Flag_ParseError = 0x01000000,
+ Flag_CircularCalculation = 0x02000000,
+ Flag_DependancyError = 0x04000000,
+ Flag_PaintingCell = 0x08000000, // On during painting
+ Flag_TextFormatDirty = 0x10000000
+ // Flag_Highlight = 0x20000000
+ };
+
+ void clearFlag( CellFlags flag );
+ void setFlag( CellFlags flag );
+ bool testFlag( CellFlags flag ) const;
+
+ /* descriptions of the flags are as follows: */
+
+ /*
+ * Error
+ * True if the cell is calculated and there was an error during calculation
+ * In that case the cell usually displays "#####"
+ *
+ * LayoutDirty
+ * Flag showing whether the current layout is OK.
+ * If you change for example the fonts point size, set this flag. When the
+ * cell must draw itself on the screen it will first recalculate its layout.
+ *
+ * CalcDirty
+ * Shows whether recalculation is necessary.
+ * If this cell must be recalculated for some reason, for example the user
+ * entered a new formula, then this flag is set. If @ref #bFormula is false
+ * nothing will happen at all.
+ *
+ * Progress
+ * Tells whether this cell it currently under calculation.
+ * If a cell thats 'progressFlag' is set is told to calculate we
+ * have detected a circular reference and we must stop calulating.
+ *
+ * UpdatingDeps
+ * Tells whether we've already calculated the reverse dependancies for this
+ * cell. Similar to the Progress flag but it's for when we are calculating
+ * in the reverse direction.
+ * @see updateDependancies()
+ *
+ * DisplayDirty - TODO - is this unused now??
+ * If this flag is set, then it is known that this cell has to be updated
+ * on the display. This means that somewhere in the calling stack there is a
+ * function which will call @ref Sheet::updateCell once it retains
+ * the control. If a function changes the contents/layout of this cell and this
+ * flag is not set, then the function must set it at once. After the changes
+ * are done the function must call <tt>m_pSheet->updateCell(...).
+ * The flag is cleared by the function format()->sheet()->updateCell.
+ *
+ * Merged
+ * Tells whether the cell is merged with other cells. Cells may
+ * occupy other cells space on demand. You may force a cell to
+ * do so by setting this flag. Merging the cell with 0 in both
+ * directions, will disable this flag!
+ *
+ * CellTooShortX
+ * When it's True displays ** and/or the red triangle and when the
+ * mouse is over it, the tooltip displays the full value
+ * it's true when text size is bigger that cell size
+ * and when Align is center or left
+ *
+ * CellTooShortY
+ * When it's True when mouseover it, the tooltip displays the full value
+ * it's true when text size is bigger that cell height
+ */
+
+protected:
+ /**
+ * Applies the font to use to @p painter
+ */
+ void applyZoomedFont( QPainter &painter, int _col, int _row );
+
+ /**
+ * Called from makeFormat() to determine the space
+ * needed for the text.
+ */
+ void textSize( QPainter &_paint );
+
+ /**
+ * Called from @ref #paintCell to determine the text
+ * wich can be displaying.
+ */
+ QString textDisplaying( QPainter &painter);
+
+ /**
+ * Cleans up formula stuff.
+ * Call this before you store a new formula or to delete the
+ * formula.
+ */
+ void clearFormula();
+
+ /**
+ * Check the input from the user, and determine the contents of the cell accordingly
+ * (in particular the data type).
+ * This is to be called only when m_content == Text.
+ *
+ * Input: m_strText
+ * Output: m_dataType
+ */
+ void checkTextInput();
+
+ /**
+ * Automatically chooses between a number format and
+ * a scientific format (if the number is too big)
+ */
+ void checkNumberFormat();
+
+ /**
+ * Load the text paragraphs from an OASIS XML cell description.
+ * @param parent The DOM element representing the cell.
+ */
+ void loadOasisCellText( const QDomElement& parent );
+ void loadOasisObjects( const QDomElement& e, KoOasisLoadingContext& oasisContext );
+ void loadOasisValidation( const QString& validationName );
+
+ void loadOasisValidationCondition( QString &valExpression );
+ void saveOasisAnnotation( KoXmlWriter &xmlwriter );
+ void loadOasisConditional( QDomElement * style );
+
+
+
+private:
+
+ class Extra;
+ class Private;
+ Private *d;
+ // static const char* s_dataTypeToString[];
+
+ /* helper functions to the paintCell(...) function */
+ /* void paintCellHighlight(QPainter& painter,
+ const KoRect& cellRect,
+ const QPoint& cellRef,
+ const int highlightBorder,
+ const QPen& rightPen,
+ const QPen& bottomPen,
+ const QPen& leftPen,
+ const QPen& topPen
+ );*/
+
+
+ void paintCellBorders( QPainter& painter, const KoRect &rect,
+ const KoRect &cellRect,
+ const QPoint &cellRef,
+ bool paintBorderRight, bool paintBorderBottom,
+ bool paintBorderLeft, bool paintBorderTop,
+ QPen & rightPen, QPen & bottomPen,
+ QPen & leftPen, QPen & topPen );
+ void paintPageBorders( QPainter& painter, const KoRect &cellRect,
+ const QPoint &cellRef,
+ bool paintBorderRight, bool paintBorderBottom );
+ void paintText( QPainter& painter, const KoRect &cellRect,
+ const QPoint &cellRef );
+ void paintMoreTextIndicator( QPainter& painter, const KoRect &cellRect,
+ QColor &backgroundColor );
+ void paintCommentIndicator( QPainter& painter, const KoRect &cellRect,
+ const QPoint &cellRef, QColor &backgroundColor );
+ void paintFormulaIndicator( QPainter& painter, const KoRect &cellRect,
+ QColor &backgroundColor );
+ void paintDefaultBorders( QPainter& painter, const KoRect &rect,
+ const KoRect &cellRect, const QPoint &cellRef,
+ bool paintBorderRight, bool paintBorderBottom,
+ bool paintBorderLeft, bool paintBorderTop,
+ QPen const & rightPen, QPen const & bottomPen,
+ QPen const & leftPen, QPen const & topPen );
+ void paintBackground( QPainter& painter, const KoRect &cellRect,
+ const QPoint &cellRef, bool selected,
+ QColor &backgroundColor );
+ void paintObscuredCells( const KoRect& rect, QPainter& painter,
+ View* view, const KoRect &cellRect,
+ const QPoint &cellRef,
+ bool paintBorderRight, bool paintBorderBottom,
+ bool paintBorderLeft, bool paintBorderTop,
+ QPen & rightPen, QPen & bottomPen,
+ QPen & leftPen, QPen & topPen,
+ QValueList<QPoint> &mergedCellsPainted );
+ void paintCellDiagonalLines( QPainter& painter, const KoRect &cellRect,
+ const QPoint &cellRef );
+
+
+
+
+ /** handle the fact that a cell has been updated - calls cellUpdated()
+ in the parent Sheet object */
+ void valueChanged ();
+
+ /* helper functions to the makeLayout(...) function */
+ /* (more to come) */
+ void setOutputText();
+
+
+ /* helper functions to the load/save routines */
+ bool loadCellData(const QDomElement &text, Paste::Operation op);
+ bool saveCellResult( QDomDocument& doc, QDomElement& result,
+ QString str );
+ void update();
+ int effAlignX();
+
+ /**
+ * When you insert a cell at bottom or right
+ * and the size is not the same so text offset
+ * will not good => recalc offset
+ */
+ void offsetAlign( int _col, int _row );
+
+ void checkForNamedAreas( QString & formula ) const;
+ /**
+ * replacements:
+ * 1. "==" -> "="
+ * 2. "Sheet1!A1" -> "[Sheet1.A1]"
+ * "A1" -> "[.A1]"
+ * 3. "," -> "."
+ */
+ QString convertFormulaToOasisFormat( const QString & formula ) const;
+ void loadOasisValidationValue( const QStringList &listVal );
+
+};
+
+} // namespace KSpread
+
+#endif // KSPREAD_CELL