7c704c78d3
SAL_UNUSED_PARAMETER (expanding to __attribute__ ((unused)) for GCC) is used to annotate legitimately unused parameters, so that static analysis tools can tell legitimately unused parameters from truly unnecessary ones. To that end, some patches for external modules are also added, that are only applied when compiling with GCC and add necessary __attribute__ ((unused)) in headers.
308 lines
12 KiB
C++
308 lines
12 KiB
C++
/* -*- 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_CONDITIO_HXX
|
|
#define SC_CONDITIO_HXX
|
|
|
|
#include "global.hxx"
|
|
#include "address.hxx"
|
|
#include "formula/grammar.hxx"
|
|
#include <svl/svarray.hxx>
|
|
#include "scdllapi.h"
|
|
#include "rangelst.hxx"
|
|
|
|
class ScBaseCell;
|
|
class ScFormulaCell;
|
|
class ScTokenArray;
|
|
|
|
|
|
#define SC_COND_GROW 16
|
|
|
|
// nOptions Flags
|
|
#define SC_COND_NOBLANKS 1
|
|
|
|
|
|
// ordering of ScConditionMode and ScQueryOp is equal,
|
|
// to facilitate the merging of both in the future
|
|
|
|
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_DUPLICATE,
|
|
SC_COND_NOTDUPLICATE,
|
|
SC_COND_DIRECT,
|
|
SC_COND_NONE
|
|
};
|
|
|
|
enum ScConditionValType
|
|
{
|
|
SC_VAL_VALUE,
|
|
SC_VAL_STRING,
|
|
SC_VAL_FORMULA
|
|
};
|
|
|
|
class ScConditionalFormat;
|
|
|
|
class SC_DLLPUBLIC ScConditionEntry
|
|
{
|
|
// stored data:
|
|
ScConditionMode eOp;
|
|
sal_uInt16 nOptions;
|
|
double nVal1; // input or calculated
|
|
double nVal2;
|
|
String aStrVal1; // input or calculated
|
|
String aStrVal2;
|
|
String aStrNmsp1; // namespace to be used on (re)compilation, e.g. in XML import
|
|
String aStrNmsp2; // namespace to be used on (re)compilation, e.g. in XML import
|
|
formula::FormulaGrammar::Grammar eTempGrammar1; // grammar to be used on (re)compilation, e.g. in XML import
|
|
formula::FormulaGrammar::Grammar eTempGrammar2; // grammar to be used on (re)compilation, e.g. in XML import
|
|
sal_Bool bIsStr1; // for recognition of empty strings
|
|
sal_Bool bIsStr2;
|
|
ScTokenArray* pFormula1; // entered formula
|
|
ScTokenArray* pFormula2;
|
|
ScAddress aSrcPos; // source position for formulas
|
|
// temporary data:
|
|
String aSrcString; // formula source position as text during XML import
|
|
ScFormulaCell* pFCell1;
|
|
ScFormulaCell* pFCell2;
|
|
ScDocument* pDoc;
|
|
sal_Bool bRelRef1;
|
|
sal_Bool bRelRef2;
|
|
sal_Bool bFirstRun;
|
|
|
|
void MakeCells( const ScAddress& rPos );
|
|
void Compile( const String& rExpr1, const String& rExpr2,
|
|
const String& rExprNmsp1, const String& rExprNmsp2,
|
|
formula::FormulaGrammar::Grammar eGrammar1,
|
|
formula::FormulaGrammar::Grammar eGrammar2,
|
|
sal_Bool bTextToReal );
|
|
void Interpret( const ScAddress& rPos );
|
|
|
|
sal_Bool IsValid( double nArg, const ScAddress& rAddr ) const;
|
|
sal_Bool IsValidStr( const String& rArg, const ScAddress& rAddr ) const;
|
|
|
|
public:
|
|
ScConditionEntry( ScConditionMode eOper,
|
|
const String& rExpr1, const String& rExpr2,
|
|
ScDocument* pDocument, const ScAddress& rPos,
|
|
const String& rExprNmsp1, const String& rExprNmsp2,
|
|
formula::FormulaGrammar::Grammar eGrammar1,
|
|
formula::FormulaGrammar::Grammar eGrammar2 );
|
|
ScConditionEntry( ScConditionMode eOper,
|
|
const ScTokenArray* pArr1, const ScTokenArray* pArr2,
|
|
ScDocument* pDocument, const ScAddress& rPos );
|
|
ScConditionEntry( const ScConditionEntry& r ); // flat copy of formulas
|
|
// true copy of formulas (for Ref-Undo):
|
|
ScConditionEntry( ScDocument* pDocument, const ScConditionEntry& r );
|
|
virtual ~ScConditionEntry();
|
|
|
|
int operator== ( const ScConditionEntry& r ) const;
|
|
|
|
void SetParent( ScConditionalFormat* pNew ) { pCondFormat = pNew; }
|
|
|
|
sal_Bool IsCellValid( ScBaseCell* pCell, const ScAddress& rPos ) const;
|
|
|
|
ScConditionMode GetOperation() const { return eOp; }
|
|
sal_Bool IsIgnoreBlank() const { return ( nOptions & SC_COND_NOBLANKS ) == 0; }
|
|
void SetIgnoreBlank(sal_Bool bSet);
|
|
ScAddress GetSrcPos() const { return aSrcPos; }
|
|
|
|
ScAddress GetValidSrcPos() const; // adjusted to allow textual representation of expressions
|
|
|
|
void SetSrcString( const String& rNew ); // for XML import
|
|
|
|
void SetFormula1( const ScTokenArray& rArray );
|
|
void SetFormula2( const ScTokenArray& rArray );
|
|
|
|
String GetExpression( const ScAddress& rCursor, sal_uInt16 nPos, sal_uLong nNumFmt = 0,
|
|
const formula::FormulaGrammar::Grammar eGrammar = formula::FormulaGrammar::GRAM_DEFAULT ) const;
|
|
|
|
ScTokenArray* CreateTokenArry( sal_uInt16 nPos ) const;
|
|
|
|
void CompileAll();
|
|
void CompileXML();
|
|
void UpdateReference( UpdateRefMode eUpdateRefMode,
|
|
const ScRange& rRange, SCsCOL nDx, SCsROW nDy, SCsTAB nDz );
|
|
void UpdateMoveTab( SCTAB nOldPos, SCTAB nNewPos );
|
|
|
|
void SourceChanged( const ScAddress& rChanged );
|
|
|
|
bool MarkUsedExternalReferences() const;
|
|
|
|
protected:
|
|
virtual void DataChanged( const ScRange* pModified ) const;
|
|
ScDocument* GetDocument() const { return pDoc; }
|
|
ScConditionalFormat* pCondFormat;
|
|
};
|
|
|
|
//
|
|
// single entry for conditional formatting
|
|
//
|
|
|
|
class SC_DLLPUBLIC ScCondFormatEntry : public ScConditionEntry
|
|
{
|
|
String aStyleName;
|
|
|
|
using ScConditionEntry::operator==;
|
|
|
|
public:
|
|
ScCondFormatEntry( ScConditionMode eOper,
|
|
const String& rExpr1, const String& rExpr2,
|
|
ScDocument* pDocument, const ScAddress& rPos,
|
|
const String& rStyle,
|
|
const String& rExprNmsp1 = EMPTY_STRING,
|
|
const String& rExprNmsp2 = EMPTY_STRING,
|
|
formula::FormulaGrammar::Grammar eGrammar1 = formula::FormulaGrammar::GRAM_DEFAULT,
|
|
formula::FormulaGrammar::Grammar eGrammar2 = formula::FormulaGrammar::GRAM_DEFAULT );
|
|
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 );
|
|
virtual ~ScCondFormatEntry();
|
|
|
|
int operator== ( const ScCondFormatEntry& r ) const;
|
|
|
|
const String& GetStyle() const { return aStyleName; }
|
|
void UpdateStyleName(const String& rNew) { aStyleName=rNew; }
|
|
|
|
protected:
|
|
virtual void DataChanged( const ScRange* pModified ) const;
|
|
};
|
|
|
|
//
|
|
// complete conditional formatting
|
|
//
|
|
|
|
class SC_DLLPUBLIC ScConditionalFormat
|
|
{
|
|
ScDocument* pDoc;
|
|
ScRangeList* pAreas; // area for Paint
|
|
sal_uInt32 nKey; // Index in attributes
|
|
ScCondFormatEntry** ppEntries;
|
|
sal_uInt16 nEntryCount;
|
|
sal_Bool bIsUsed; // temporary at Save
|
|
ScRangeListRef pRanges; // Ranges for conditional format
|
|
|
|
public:
|
|
ScConditionalFormat(sal_uInt32 nNewKey, ScDocument* pDocument);
|
|
ScConditionalFormat(const ScConditionalFormat& r);
|
|
~ScConditionalFormat();
|
|
|
|
// true copy of formulas (for Ref-Undo / between documents)
|
|
ScConditionalFormat* Clone(ScDocument* pNewDoc = NULL) const;
|
|
|
|
void AddEntry( const ScCondFormatEntry& rNew );
|
|
void AddRangeInfo( const ScRangeListRef& rRanges );
|
|
const ScRangeListRef& GetRangeInfo() const { return pRanges; }
|
|
|
|
sal_Bool IsEmpty() const { return (nEntryCount == 0); }
|
|
sal_uInt16 Count() const { return nEntryCount; }
|
|
|
|
void CompileAll();
|
|
void CompileXML();
|
|
void UpdateReference( UpdateRefMode eUpdateRefMode,
|
|
const ScRange& rRange, SCsCOL nDx, SCsROW nDy, SCsTAB nDz );
|
|
void UpdateMoveTab( SCTAB nOldPos, SCTAB nNewPos );
|
|
void RenameCellStyle( const String& rOld, const String& rNew );
|
|
|
|
void SourceChanged( const ScAddress& rAddr );
|
|
|
|
const ScCondFormatEntry* GetEntry( sal_uInt16 nPos ) const;
|
|
|
|
const String& GetCellStyle( ScBaseCell* pCell, const ScAddress& rPos ) const;
|
|
|
|
sal_Bool EqualEntries( const ScConditionalFormat& r ) const;
|
|
|
|
void DoRepaint( const ScRange* pModified );
|
|
void InvalidateArea();
|
|
|
|
sal_uInt32 GetKey() const { return nKey; }
|
|
void SetKey(sal_uInt32 nNew) { nKey = nNew; } // only if not inserted!
|
|
|
|
void SetUsed(sal_Bool bSet) { bIsUsed = bSet; }
|
|
sal_Bool IsUsed() const { return bIsUsed; }
|
|
|
|
bool MarkUsedExternalReferences() const;
|
|
|
|
// sorted (via PTRARR) by Index
|
|
// operator== only for sorting
|
|
sal_Bool operator ==( const ScConditionalFormat& r ) const { return nKey == r.nKey; }
|
|
sal_Bool operator < ( const ScConditionalFormat& r ) const { return nKey < r.nKey; }
|
|
};
|
|
|
|
//
|
|
// List of areas and formats:
|
|
//
|
|
|
|
typedef ScConditionalFormat* ScConditionalFormatPtr;
|
|
|
|
SV_DECL_PTRARR_SORT(ScConditionalFormats_Impl, ScConditionalFormatPtr,
|
|
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( sal_uInt32 nKey );
|
|
|
|
void CompileAll();
|
|
void CompileXML();
|
|
void UpdateReference( UpdateRefMode eUpdateRefMode,
|
|
const ScRange& rRange, SCsCOL nDx, SCsROW nDy, SCsTAB nDz );
|
|
void RenameCellStyle( const String& rOld, const String& rNew );
|
|
void UpdateMoveTab( SCTAB nOldPos, SCTAB nNewPos );
|
|
|
|
void SourceChanged( const ScAddress& rAddr );
|
|
|
|
/** Temporarily during save, returns RefManager's decision whether ALL
|
|
* references are marked now. */
|
|
bool MarkUsedExternalReferences() const;
|
|
|
|
sal_Bool operator==( const ScConditionalFormatList& r ) const; // for Ref-Undo
|
|
};
|
|
|
|
#endif
|
|
|
|
|
|
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|