diff options
author | Xisco Fauli <anistenis@gmail.com> | 2011-08-21 21:50:13 +0200 |
---|---|---|
committer | Xisco Fauli <anistenis@gmail.com> | 2011-08-21 21:50:13 +0200 |
commit | 6c76e4db034fd2c43884698b1a30225fd00b3bfd (patch) | |
tree | 1937cb9be81cd2b9f3d0ad27adcc7a7531b8f29d /sc/inc/conditio.hxx | |
parent | e9440fb5a0579096423c081b0f0a2185b628e896 (diff) | |
parent | 36703ca1de68cd62782d0d425123521a5bc6732b (diff) |
Merge branch 'master' into feature/gsoc2011_wizards
Conflicts:
automation/source/inc/cmdbasestream.hxx
automation/source/server/cmdbasestream.cxx
automation/source/server/retstrm.hxx
automation/source/testtool/cmdstrm.cxx
automation/source/testtool/cmdstrm.hxx
automation/source/testtool/tcommuni.cxx
basctl/prj/d.lst
basctl/uiconfig/basicide/toolbar/findbar.xml
cui/source/dialogs/about.cxx
cui/source/dialogs/about.src
cui/source/inc/about.hxx
extensions/source/abpilot/abpservices.cxx
extensions/source/dbpilots/dbpservices.cxx
extensions/source/propctrlr/pcrservices.cxx
extensions/source/svg/makefile.mk
forms/Library_frm.mk
lingucomponent/source/hyphenator/altlinuxhyph/hyphen/hyphenimp.cxx
lingucomponent/source/spellcheck/spell/sspellimp.cxx
package/prj/d.lst
package/source/zipapi/XMemoryStream.cxx
package/source/zipapi/XMemoryStream.hxx
setup_native/prj/d.lst
setup_native/source/win32/customactions/relnotes/makefile.mk
tools/test/export.map
wizards/com/sun/star/wizards/common/ConfigGroup.py
wizards/com/sun/star/wizards/common/ConfigNode.py
wizards/com/sun/star/wizards/common/Configuration.py
wizards/com/sun/star/wizards/common/Desktop.py
wizards/com/sun/star/wizards/common/FileAccess.py
wizards/com/sun/star/wizards/common/Helper.py
wizards/com/sun/star/wizards/common/SystemDialog.py
wizards/com/sun/star/wizards/document/OfficeDocument.py
wizards/com/sun/star/wizards/fax/FaxDocument.py
wizards/com/sun/star/wizards/fax/FaxWizardDialog.py
wizards/com/sun/star/wizards/fax/FaxWizardDialogConst.py
wizards/com/sun/star/wizards/fax/FaxWizardDialogImpl.py
wizards/com/sun/star/wizards/fax/FaxWizardDialogResources.py
wizards/com/sun/star/wizards/letter/LetterDocument.py
wizards/com/sun/star/wizards/letter/LetterWizardDialog.py
wizards/com/sun/star/wizards/letter/LetterWizardDialogConst.py
wizards/com/sun/star/wizards/letter/LetterWizardDialogImpl.py
wizards/com/sun/star/wizards/letter/LetterWizardDialogResources.py
wizards/com/sun/star/wizards/text/TextDocument.py
wizards/com/sun/star/wizards/text/TextFieldHandler.py
wizards/com/sun/star/wizards/text/TextSectionHandler.py
wizards/com/sun/star/wizards/text/ViewHandler.py
wizards/com/sun/star/wizards/ui/UnoDialog.py
wizards/com/sun/star/wizards/ui/UnoDialog2.py
wizards/com/sun/star/wizards/ui/WizardDialog.py
wizards/com/sun/star/wizards/ui/event/CommonListener.py
wizards/com/sun/star/wizards/ui/event/DataAware.py
wizards/com/sun/star/wizards/ui/event/RadioDataAware.py
wizards/com/sun/star/wizards/ui/event/UnoDataAware.py
wizards/util/helpids.h
wizards/util/hidother.src
xmlsecurity/prj/build.lst
xmlsecurity/prj/d.lst
xmlsecurity/qa/certext/SanCertExt.cxx
Diffstat (limited to 'sc/inc/conditio.hxx')
-rw-r--r-- | sc/inc/conditio.hxx | 308 |
1 files changed, 308 insertions, 0 deletions
diff --git a/sc/inc/conditio.hxx b/sc/inc/conditio.hxx new file mode 100644 index 000000000000..f541e247e7d8 --- /dev/null +++ b/sc/inc/conditio.hxx @@ -0,0 +1,308 @@ +/* -*- 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, 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: */ |