summaryrefslogtreecommitdiff
path: root/sw/inc/cellfml.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'sw/inc/cellfml.hxx')
-rw-r--r--sw/inc/cellfml.hxx164
1 files changed, 164 insertions, 0 deletions
diff --git a/sw/inc/cellfml.hxx b/sw/inc/cellfml.hxx
new file mode 100644
index 000000000000..3a8566f14ecc
--- /dev/null
+++ b/sw/inc/cellfml.hxx
@@ -0,0 +1,164 @@
+/* -*- 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 _CELLFML_HXX
+#define _CELLFML_HXX
+
+#include <tools/string.hxx>
+
+class SwTable;
+class SwNode;
+class SwTableSortBoxes;
+class SwSelBoxes;
+class SwCalc;
+class SwTableBox;
+class SwTableFmlUpdate;
+class SwDoc;
+class String;
+
+class SwTblCalcPara
+{
+ const SwTableBox* pLastTblBox;
+ sal_uInt16 nStackCnt, nMaxSize;
+
+public:
+ SwTableSortBoxes *pBoxStk; // stack for recognizing recursion
+ SwCalc& rCalc; // current Calculator
+ const SwTable* pTbl; // current table
+
+ SwTblCalcPara( SwCalc& rCalculator, const SwTable& rTable );
+ ~SwTblCalcPara();
+
+ sal_Bool CalcWithStackOverflow();
+ sal_Bool IsStackOverFlow() const { return nMaxSize == nStackCnt; }
+ sal_Bool IncStackCnt() { return nMaxSize == ++nStackCnt; }
+ void DecStackCnt() { if( nStackCnt ) --nStackCnt; }
+ void SetLastTblBox( const SwTableBox* pBox ) { pLastTblBox = pBox; }
+};
+
+
+
+class SwTableFormula
+{
+typedef void (SwTableFormula:: *FnScanFormel)( const SwTable&, String&,
+ String&, String*, void* ) const;
+
+ void BoxNmsToPtr( const SwTable&, String&, String&, String* = 0,
+ void* pPara = 0 ) const;
+ void PtrToBoxNms( const SwTable&, String&, String&, String* = 0,
+ void* pPara = 0 ) const;
+ void RelNmsToBoxNms( const SwTable&, String&, String&, String* = 0,
+ void* pPara = 0 ) const;
+ void RelBoxNmsToPtr( const SwTable&, String&, String&, String* = 0,
+ void* pPara = 0 ) const;
+ void BoxNmsToRelNm( const SwTable&, String&, String&, String* = 0,
+ void* pPara = 0 ) const;
+ void _MakeFormel( const SwTable&, String&, String&, String* = 0,
+ void* pPara = 0 ) const;
+ void _GetFmlBoxes( const SwTable&, String&, String&, String* = 0,
+ void* pPara = 0 ) const;
+ void _HasValidBoxes( const SwTable&, String&, String&, String* = 0,
+ void* pPara = 0 ) const;
+ void _SplitMergeBoxNm( const SwTable&, String&, String&, String* = 0,
+ void* pPara = 0 ) const;
+
+ void GetBoxes( const SwTableBox& rStt, const SwTableBox& rEnd,
+ SwSelBoxes& rBoxes ) const;
+ String ScanString( FnScanFormel fnFormel, const SwTable& rTbl,
+ void* = 0 ) const;
+
+ const SwTable* FindTable( SwDoc& rDoc, const String& rNm ) const;
+
+protected:
+ enum NameType { EXTRNL_NAME, INTRNL_NAME, REL_NAME };
+
+ String sFormel; // current formula
+ NameType eNmType; // current display method
+ sal_Bool bValidValue; // sal_True: recalculate formula
+
+ // find the node in which the formula is located
+ // TextFeld -> TextNode,
+ // BoxAttribut -> BoxStartNode
+ // !!! has to be overloaded by every derivation !!!
+ virtual const SwNode* GetNodeOfFormula() const = 0;
+
+ SwTableFormula( const String& rFormel );
+
+ String MakeFormel( SwTblCalcPara& rCalcPara ) const
+ {
+ return ScanString( &SwTableFormula::_MakeFormel,
+ *rCalcPara.pTbl, &rCalcPara );
+ }
+
+ static sal_uInt16 GetLnPosInTbl( const SwTable& rTbl, const SwTableBox* pBox );
+
+public:
+
+ SwTableFormula( const SwTableFormula& rCpy ) { *this = rCpy; }
+ virtual ~SwTableFormula();
+ SwTableFormula& operator=( const SwTableFormula& rCpy )
+ {
+ sFormel = rCpy.sFormel;
+ eNmType = rCpy.eNmType;
+ bValidValue = rCpy.bValidValue;
+ return *this;
+ }
+
+ // create from the internal formula (for CORE) the external formula (for UI)
+ void PtrToBoxNm( const SwTable* pTbl );
+ // create from the external formula the internal
+ void BoxNmToPtr( const SwTable* pTbl );
+ // create from the external/internal formula the relative formula
+ void ToRelBoxNm( const SwTable* pTbl );
+ // gets called before/after merging/splitting of tables
+ void ToSplitMergeBoxNm( SwTableFmlUpdate& rTblUpd );
+
+ bool IsIntrnlName() const { return eNmType == INTRNL_NAME; }
+ NameType GetNameType() const { return eNmType; }
+
+ bool IsValid() const { return bValidValue; }
+ inline void ChgValid( bool bNew ) { bValidValue = bNew; }
+
+ const String& GetFormula() const { return sFormel; }
+ void SetFormula( const String& rNew )
+ {
+ sFormel = rNew;
+ bValidValue = false;
+ eNmType = EXTRNL_NAME;
+ }
+
+ sal_uInt16 GetBoxesOfFormula( const SwTable& rTbl, SwSelBoxes& rBoxes );
+ // are all boxes valid which this formula relies on?
+ bool HasValidBoxes() const;
+};
+
+
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */