You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
koffice/kspread/kspread_util.h

356 lines
11 KiB

/* This file is part of the KDE project
Copyright (C) 2006 Stefan Nikolaus <stefan.nikolaus@kdemail.net>
Copyright (C) 1998, 1999 Torben Weis <weis@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_util_h__
#define __kspread_util_h__
#include <tqstring.h>
#include <tqrect.h>
#include <tqdatetime.h>
#include <koffice_export.h>
#include "kspread_global.h"
#include "kspread_value.h"
class TQFont;
class TQPen;
class TQDomElement;
class TQDomDocument;
class KLocale;
bool util_isPointValid(TQPoint point);
bool util_isRectValid(TQRect rect);
namespace KSpread
{
class Cell;
class Map;
class Sheet;
/**
* Represents the position of a single cell in a workbook. Each position has a row, column and optionally an associated Sheet.
* Columns and rows can be marked as fixed. This is for handling absolute coordinates in formulae (eg. in the
* formula "=$C$1" both the column (C) and row (1) are fixed.
*/
class KSPREAD_EXPORT Point
{
public:
Point() { _pos.setX( -1 ); _sheet = 0; _columnFixed = false; _rowFixed = false; }
Point( const TQString& );
Point( const TQString&, Map*, Sheet* default_sheet = 0 );
Point( const Point& c ) {
_pos = c._pos;
_sheet = c._sheet;
_sheetName = c._sheetName;
_columnFixed = c._columnFixed;
_rowFixed = c._rowFixed;
}
bool isValid() const { return ( util_isPointValid(pos()) && ( _sheet != 0 || _sheetName.isEmpty() ) ); }
bool isSheetKnown() const { return ( ! _sheetName.isEmpty() && _sheet != 0 ); }
Cell* cell() const;
bool operator== (const Point &cell) const;
bool operator< (const Point &cell) const;
int row () const { return _pos.y(); };
int column () const { return _pos.x(); };
void setRow (int r) { _pos.setY (r); };
void setColumn (int c) { _pos.setX (c); };
/**
* Sets the sheet which this point lies on.
*/
void setSheet(Sheet* sheet);
Sheet* sheet() const;
/**
* Sets the name of the sheet which this point lies on.
*/
void setSheetName(TQString name);
TQString sheetName() const;
/**
* Sets the position of this point (in rows and columns)
*/
void setPos(TQPoint pos);
TQPoint pos() const;
/**
* Sets whether or not the column (x coordinate) of this point is fixed (ie. it represents an absolute
* coordinate - eg. the column letter B in the formula "=$B30" is fixed)
*/
void setColumnFixed(bool colFixed);
bool columnFixed() const;
/**
* Sets whether or not the row (y coordinate) of this point is fixed (ie. it represents an absolute coordinate - eg. the row number 30 in the formula "=A$30" is fixed)
*/
void setRowFixed(bool rowFixed);
bool rowFixed() const;
private:
Sheet* _sheet;
TQString _sheetName;
TQPoint _pos;
bool _columnFixed;
bool _rowFixed;
private:
void init( const TQString& );
};
/**
* Represents a region within a workbook. The region has an area (the columns and rows that it includes) and
* optionally an associated @ref KSpread::Sheet
* A range is defined by four coordinates: Its left column, top row, right column and bottom row. Each
* of these coordinates may be set as fixed, to represent absolute coordinates in formulae.
*/
class KSPREAD_EXPORT Range
{
public:
Range();
Range( const TQString& );
Range( const TQString&, Map*, Sheet* default_sheet = 0 );
Range( const Range& r );
Range( const Point& ul, const Point& lr );
/**
* Returns true if this Range represents a valid region of a spreadsheet.
* A range is valid if:
* - It has an associated Sheet
* - The area is non-negative (ie.
* - The left-most column is non-negative
* - The top-most row is non-negative
*/
bool isValid() const;
/** Returns true if this range has an associated Sheet or false otherwise */
bool isSheetKnown() const { return ( !sheetName().isEmpty() && sheet() != 0 ); }
/** Fills a Point with info (row,column,sheet) about the first point in the range */
void getStartPoint(Point* pt);
/** Fills a Point with info (row,column,sheet) about the last point the range */
void getEndPoint(Point* pt);
int startRow () const { return range().top(); };
int startCol () const { return range().left(); };
int endRow () const { return range().bottom(); };
int endCol () const { return range().right(); };
/**
* Changes the area on the spreadsheet represented by this range
* @param newRange The new area for this range.
*/
virtual void setRange(const TQRect& newRange) {_range=newRange;}
void setRange(int newStartCol, int newStartRow, int newEndCol, int newEndRow)
{ _range=TQRect(newStartCol,newStartRow,newEndCol-newStartCol,newEndRow-newStartRow); }
/** Returns the area on the spreadsheet occupied by this range. */
TQRect range() const;
/** Returns true if this range includes the specified cell */
bool tqcontains (const Point &cell) const;
/**
* Returns true if this range intersects Range @p r (ie. there is at least one cell
* which is common to both Ranges )
*/
bool intersects (const Range &r) const;
/**
* Returns a string representation of this range as it would appear in a formula.
* ie. In the format " SheetName! [StartCell] : [EndCell] "
* The string representation uses $ characters to mark fixed parts of the range, eg. Sheet1!$A1:$A20
*/
TQString toString() const;
/** Sets whether or not the left column is fixed . */
void setLeftFixed(bool fixed);
bool leftFixed() const;
/** Sets whether or not the right column is fixed. */
void setRightFixed(bool fixed);
bool rightFixed() const;
/** Sets whether or not the top row is fixed. */
void setTopFixed(bool fixed);
bool topFixed() const;
/** Sets whether or not the bottom row is fixed. */
void setBottomFixed(bool fixed);
bool bottomFixed() const;
/** Sets the Sheet object associated with this range. The range can only span a single sheet. */
void setSheet(Sheet* sheet);
Sheet* sheet() const;
/** Sets the name of the sheet associated with this range. */
void setSheetName(TQString sheetName);
TQString sheetName() const;
/**
* Returns the named area represented by this range or an empty string otherwise.
* This is the name of the area which was passed as a TQString to the Range constructor
*/
TQString namedArea() const;
/**
* Returns true if the other range occupies the same area on the same sheet as this range.
*/
bool operator==(const Range& range) const;
private:
Sheet* _sheet;
TQString _sheetName;
TQString _namedArea;
TQRect _range;
bool _leftFixed;
bool _rightFixed;
bool _topFixed;
bool _bottomFixed;
};
/**
range-list and cell-list
TODO: move to a separate file, improve structure, add iterators and all that
TODO: use this class instead of other means of range-walking all over KSpread
TODO: use this as selection
TODO: anything I forgot ;)
*/
struct RangeList {
TQValueList<Point> cells;
TQValueList<Range> ranges;
};
/**
* RangeIterator
*
* Class to simplify the process of iterating through each cell in a
* range that has already been allocated
*/
class RangeIterator
{
public:
/**
* Contstruct the iterator with the rectangular cell area and which
* sheet the area is on
*/
RangeIterator(TQRect _range, Sheet* _sheet);
~RangeIterator();
/**
* @return the first allocated cell in the area
*/
Cell* first();
/**
* @return the next allocated cell in the area after the previous one
* retrieved, or NULL if it was the last one.
*/
Cell* next();
private:
TQRect range;
Sheet* sheet;
TQPoint current;
};
//helper functions for the formatting
bool formatIsDate (FormatType fmt);
bool formatIsTime (FormatType fmt);
bool formatIsFraction (FormatType fmt);
KSPREAD_EXPORT TQString util_rangeName( const TQRect &_area );
KSPREAD_EXPORT TQString util_rangeName( Sheet *_sheet, const TQRect &_area );
TQString util_rangeColumnName( const TQRect &_area);
TQString util_rangeRowName( const TQRect &_area);
/**
* Call this function to decode the text of a column label to an integer
* i.e. AA->27
*/
KSPREAD_EXPORT int util_decodeColumnLabelText( const TQString &_col );
/**
* Call this function to encode an integer to the text of the column label
* i.e. 27->AA
*/
KSPREAD_EXPORT TQString util_encodeColumnLabelText( int column );
bool util_isAllSelected(const TQRect &selection);
bool util_isColumnSelected(const TQRect &selection);
bool util_isRowSelected(const TQRect &selection);
bool util_isRowOrColumnSelected( const TQRect &selection );
bool util_validateSheetName(const TQString &name);
TQDomElement util_createElement( const TQString & tagName, const TQFont & font, TQDomDocument & doc );
TQDomElement util_createElement( const TQString & tagname, const TQPen & pen, TQDomDocument & doc );
TQFont util_toFont( TQDomElement & element );
TQPen util_toPen( TQDomElement & element );
int util_penCompare( TQPen const & pen1, TQPen const & pen2 );
TQString convertRefToRange( const TQString & sheet, const TQRect & rect );
TQString convertRefToBase( const TQString & sheet, const TQRect & rect );
TQString convertRangeToRef( const TQString & sheetName, const TQRect & _area );
void insertBracket( TQString & s );
TQString convertOasisPenToString( const TQPen & pen );
TQPen convertOasisStringToPen( const TQString &str );
//Return true when it's a reference to cell from sheet.
KSPREAD_EXPORT bool localReferenceAnchor( const TQString &_ref );
namespace Oasis
{
/**
* Converts an OpenDocument representation of a formula/cell reference to a
* localized formula/cell reference.
* @param expr The expression to convert from OpenDocument format.
* @param locale The locale to which the expression should be converted.
*/
// TODO check visibility
KSPREAD_EXPORT TQString decodeFormula(const TQString& expr, const KLocale* locale = 0);
/**
* Converts a localized formula/cell reference to an OpenDocument
* representation of a formula/cell reference.
* @param expr The expression to convert to OpenDocument format.
* @param locale The locale from which the expression should be converted.
*/
KSPREAD_EXPORT TQString encodeFormula(const TQString& expr, const KLocale* locale = 0);
}
} // namespace KSpread
#endif