324 lines
12 KiB
C++
324 lines
12 KiB
C++
/*************************************************************************
|
|
*
|
|
* $RCSfile: conditio.hxx,v $
|
|
*
|
|
* $Revision: 1.4 $
|
|
*
|
|
* last change: $Author: nn $ $Date: 2002-06-27 16:28:45 $
|
|
*
|
|
* 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_CONDITIO_HXX
|
|
#define SC_CONDITIO_HXX
|
|
|
|
#ifndef SC_SCGLOB_HXX
|
|
#include "global.hxx"
|
|
#endif
|
|
|
|
#ifndef _SVARRAY_HXX //autogen
|
|
#include <svtools/svarray.hxx>
|
|
#endif
|
|
|
|
class ScBaseCell;
|
|
class ScFormulaCell;
|
|
class ScTokenArray;
|
|
class ScMultipleReadHeader;
|
|
class ScMultipleWriteHeader;
|
|
class ScRangeList;
|
|
|
|
|
|
#define SC_COND_GROW 16
|
|
|
|
// nOptions Flags
|
|
#define SC_COND_NOBLANKS 1
|
|
|
|
|
|
// Reihenfolge von ScConditionMode wie ScQueryOp,
|
|
// damit einmal zusammengefasst werden kann:
|
|
|
|
enum ScConditionMode
|
|
{
|
|
SC_COND_EQUAL,
|
|
SC_COND_LESS,
|
|
SC_COND_GREATER,
|
|
SC_COND_EQLESS,
|
|
SC_COND_EQGREATER,
|
|
SC_COND_NOTEQUAL,
|
|
SC_COND_BETWEEN,
|
|
SC_COND_NOTBETWEEN,
|
|
SC_COND_DIRECT,
|
|
SC_COND_NONE
|
|
};
|
|
|
|
enum ScConditionValType
|
|
{
|
|
SC_VAL_VALUE,
|
|
SC_VAL_STRING,
|
|
SC_VAL_FORMULA
|
|
};
|
|
|
|
class ScConditionEntry
|
|
{
|
|
// gespeicherte Daten:
|
|
ScConditionMode eOp;
|
|
USHORT nOptions;
|
|
double nVal1; // eingegeben oder berechnet
|
|
double nVal2;
|
|
String aStrVal1; // eingegeben oder berechnet
|
|
String aStrVal2;
|
|
BOOL bIsStr1; // um auch leere Strings zu erkennen
|
|
BOOL bIsStr2;
|
|
ScTokenArray* pFormula1; // eingegebene Formel
|
|
ScTokenArray* pFormula2;
|
|
ScAddress aSrcPos; // Quell-Adresse fuer Formeln
|
|
// temporaere Daten:
|
|
ScFormulaCell* pFCell1;
|
|
ScFormulaCell* pFCell2;
|
|
ScDocument* pDoc;
|
|
BOOL bRelRef1;
|
|
BOOL bRelRef2;
|
|
BOOL bFirstRun;
|
|
|
|
void MakeCells( const ScAddress& rPos );
|
|
void Compile( const String& rExpr1, const String& rExpr2, BOOL bEnglish,
|
|
BOOL bCompileXML, BOOL bTextToReal );
|
|
void Interpret( const ScAddress& rPos );
|
|
|
|
BOOL IsValid( double nArg ) const;
|
|
BOOL IsValidStr( const String& rArg ) const;
|
|
|
|
protected:
|
|
ScConditionEntry( SvStream& rStream, ScMultipleReadHeader& rHdr,
|
|
ScDocument* pDocument );
|
|
void StoreCondition(SvStream& rStream, ScMultipleWriteHeader& rHdr) const;
|
|
|
|
public:
|
|
ScConditionEntry( ScConditionMode eOper,
|
|
const String& rExpr1, const String& rExpr2,
|
|
ScDocument* pDocument, const ScAddress& rPos,
|
|
BOOL bCompileEnglish, BOOL bCompileXML );
|
|
ScConditionEntry( ScConditionMode eOper,
|
|
const ScTokenArray* pArr1, const ScTokenArray* pArr2,
|
|
ScDocument* pDocument, const ScAddress& rPos );
|
|
ScConditionEntry( const ScConditionEntry& r ); // flache Kopie der Formeln
|
|
// echte Kopie der Formeln (fuer Ref-Undo):
|
|
ScConditionEntry( ScDocument* pDocument, const ScConditionEntry& r );
|
|
~ScConditionEntry();
|
|
|
|
int operator== ( const ScConditionEntry& r ) const;
|
|
|
|
BOOL IsCellValid( ScBaseCell* pCell, const ScAddress& rPos ) const;
|
|
|
|
ScConditionMode GetOperation() const { return eOp; }
|
|
BOOL IsIgnoreBlank() const { return ( nOptions & SC_COND_NOBLANKS ) == 0; }
|
|
void SetIgnoreBlank(BOOL bSet);
|
|
ScAddress GetSrcPos() const { return aSrcPos; }
|
|
|
|
String GetExpression( const ScAddress& rCursor, USHORT nPos, ULONG nNumFmt = 0,
|
|
BOOL bEnglish = FALSE, BOOL bCompileXML = FALSE,
|
|
BOOL bTextToReal = FALSE ) const;
|
|
|
|
ScTokenArray* CreateTokenArry( USHORT nPos ) const;
|
|
|
|
void CompileAll();
|
|
void CompileXML();
|
|
void UpdateReference( UpdateRefMode eUpdateRefMode,
|
|
const ScRange& rRange, short nDx, short nDy, short nDz );
|
|
void UpdateMoveTab( USHORT nOldPos, USHORT nNewPos );
|
|
|
|
void SourceChanged( const ScAddress& rChanged );
|
|
|
|
protected:
|
|
virtual void DataChanged( const ScRange* pModified ) const;
|
|
ScDocument* GetDocument() const { return pDoc; }
|
|
};
|
|
|
|
//
|
|
// einzelner Eintrag fuer bedingte Formatierung
|
|
//
|
|
|
|
class ScConditionalFormat;
|
|
|
|
class ScCondFormatEntry : public ScConditionEntry
|
|
{
|
|
String aStyleName;
|
|
ScConditionalFormat* pParent;
|
|
|
|
public:
|
|
ScCondFormatEntry( ScConditionMode eOper,
|
|
const String& rExpr1, const String& rExpr2,
|
|
ScDocument* pDocument, const ScAddress& rPos,
|
|
const String& rStyle,
|
|
BOOL bCompileEnglish = FALSE, BOOL bCompileXML = FALSE );
|
|
ScCondFormatEntry( ScConditionMode eOper,
|
|
const ScTokenArray* pArr1, const ScTokenArray* pArr2,
|
|
ScDocument* pDocument, const ScAddress& rPos,
|
|
const String& rStyle );
|
|
ScCondFormatEntry( const ScCondFormatEntry& r );
|
|
ScCondFormatEntry( ScDocument* pDocument, const ScCondFormatEntry& r );
|
|
ScCondFormatEntry( SvStream& rStream, ScMultipleReadHeader& rHdr,
|
|
ScDocument* pDocument );
|
|
~ScCondFormatEntry();
|
|
|
|
void SetParent( ScConditionalFormat* pNew ) { pParent = pNew; }
|
|
|
|
void Store(SvStream& rStream, ScMultipleWriteHeader& rHdr) const;
|
|
|
|
int operator== ( const ScCondFormatEntry& r ) const;
|
|
|
|
const String& GetStyle() const { return aStyleName; }
|
|
|
|
protected:
|
|
virtual void DataChanged( const ScRange* pModified ) const;
|
|
};
|
|
|
|
//
|
|
// komplette bedingte Formatierung
|
|
//
|
|
|
|
class ScConditionalFormat
|
|
{
|
|
ScDocument* pDoc;
|
|
ScRangeList* pAreas; // Bereiche fuer Paint
|
|
ULONG nKey; // Index in Attributen
|
|
ScCondFormatEntry** ppEntries;
|
|
USHORT nEntryCount;
|
|
BOOL bIsUsed; // temporaer beim Speichern
|
|
|
|
public:
|
|
ScConditionalFormat(ULONG nNewKey, ScDocument* pDocument);
|
|
ScConditionalFormat(const ScConditionalFormat& r);
|
|
ScConditionalFormat(SvStream& rStream, ScMultipleReadHeader& rHdr,
|
|
ScDocument* pDocument);
|
|
~ScConditionalFormat();
|
|
|
|
// echte Kopie der Formeln (fuer Ref-Undo / zwischen Dokumenten)
|
|
ScConditionalFormat* Clone(ScDocument* pNewDoc = NULL) const;
|
|
|
|
void Store(SvStream& rStream, ScMultipleWriteHeader& rHdr) const;
|
|
|
|
void AddEntry( const ScCondFormatEntry& rNew );
|
|
|
|
BOOL IsEmpty() const { return (nEntryCount == 0); }
|
|
USHORT Count() const { return nEntryCount; }
|
|
|
|
void CompileAll();
|
|
void CompileXML();
|
|
void UpdateReference( UpdateRefMode eUpdateRefMode,
|
|
const ScRange& rRange, short nDx, short nDy, short nDz );
|
|
void UpdateMoveTab( USHORT nOldPos, USHORT nNewPos );
|
|
|
|
void SourceChanged( const ScAddress& rAddr );
|
|
|
|
const ScCondFormatEntry* GetEntry( USHORT nPos ) const;
|
|
|
|
const String& GetCellStyle( ScBaseCell* pCell, const ScAddress& rPos ) const;
|
|
|
|
BOOL EqualEntries( const ScConditionalFormat& r ) const;
|
|
|
|
void DoRepaint( const ScRange* pModified );
|
|
void InvalidateArea();
|
|
|
|
ULONG GetKey() const { return nKey; }
|
|
void SetKey(ULONG nNew) { nKey = nNew; } // nur wenn nicht eingefuegt!
|
|
|
|
void SetUsed(BOOL bSet) { bIsUsed = bSet; }
|
|
BOOL IsUsed() const { return bIsUsed; }
|
|
|
|
// sortiert (per PTRARR) nach Index
|
|
// operator== nur fuer die Sortierung
|
|
BOOL operator ==( const ScConditionalFormat& r ) const { return nKey == r.nKey; }
|
|
BOOL operator < ( const ScConditionalFormat& r ) const { return nKey < r.nKey; }
|
|
};
|
|
|
|
//
|
|
// Liste der Bereiche und Formate:
|
|
//
|
|
|
|
typedef ScConditionalFormat* ScConditionalFormatPtr;
|
|
|
|
SV_DECL_PTRARR_SORT(ScConditionalFormats_Impl, ScConditionalFormatPtr,
|
|
SC_COND_GROW, SC_COND_GROW);
|
|
|
|
class ScConditionalFormatList : public ScConditionalFormats_Impl
|
|
{
|
|
public:
|
|
ScConditionalFormatList() {}
|
|
ScConditionalFormatList(const ScConditionalFormatList& rList);
|
|
ScConditionalFormatList(ScDocument* pNewDoc, const ScConditionalFormatList& rList);
|
|
~ScConditionalFormatList() {}
|
|
|
|
void InsertNew( ScConditionalFormat* pNew )
|
|
{ if (!Insert(pNew)) delete pNew; }
|
|
|
|
ScConditionalFormat* GetFormat( ULONG nKey );
|
|
|
|
void Load( SvStream& rStream, ScDocument* pDocument );
|
|
void Store( SvStream& rStream ) const;
|
|
void ResetUsed();
|
|
|
|
void CompileAll();
|
|
void CompileXML();
|
|
void UpdateReference( UpdateRefMode eUpdateRefMode,
|
|
const ScRange& rRange, short nDx, short nDy, short nDz );
|
|
void UpdateMoveTab( USHORT nOldPos, USHORT nNewPos );
|
|
|
|
void SourceChanged( const ScAddress& rAddr );
|
|
|
|
BOOL operator==( const ScConditionalFormatList& r ) const; // fuer Ref-Undo
|
|
};
|
|
|
|
#endif
|
|
|
|
|