xref: /AOO41X/main/sc/inc/conditio.hxx (revision 38d50f7b14e1cf975d8c6468d9633894cd59b523)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 #ifndef SC_CONDITIO_HXX
25 #define SC_CONDITIO_HXX
26 
27 #include "global.hxx"
28 #include "address.hxx"
29 #include "formula/grammar.hxx"
30 #include <svl/svarray.hxx>
31 #include "scdllapi.h"
32 
33 class ScBaseCell;
34 class ScFormulaCell;
35 class ScTokenArray;
36 class ScRangeList;
37 
38 
39 #define SC_COND_GROW 16
40 
41 //  nOptions Flags
42 #define SC_COND_NOBLANKS    1
43 
44 
45             // Reihenfolge von ScConditionMode wie ScQueryOp,
46             // damit einmal zusammengefasst werden kann:
47 
48 enum ScConditionMode
49 {
50     SC_COND_EQUAL,
51     SC_COND_LESS,
52     SC_COND_GREATER,
53     SC_COND_EQLESS,
54     SC_COND_EQGREATER,
55     SC_COND_NOTEQUAL,
56     SC_COND_BETWEEN,
57     SC_COND_NOTBETWEEN,
58     SC_COND_DIRECT,
59     SC_COND_NONE
60 };
61 
62 enum ScConditionValType
63 {
64     SC_VAL_VALUE,
65     SC_VAL_STRING,
66     SC_VAL_FORMULA
67 };
68 
69 class SC_DLLPUBLIC ScConditionEntry
70 {
71                                         // gespeicherte Daten:
72     ScConditionMode     eOp;
73     sal_uInt16              nOptions;
74     double              nVal1;          // eingegeben oder berechnet
75     double              nVal2;
76     String              aStrVal1;       // eingegeben oder berechnet
77     String              aStrVal2;
78     String              aStrNmsp1;      // namespace to be used on (re)compilation, e.g. in XML import
79     String              aStrNmsp2;      // namespace to be used on (re)compilation, e.g. in XML import
80     formula::FormulaGrammar::Grammar eTempGrammar1;  // grammar to be used on (re)compilation, e.g. in XML import
81     formula::FormulaGrammar::Grammar eTempGrammar2;  // grammar to be used on (re)compilation, e.g. in XML import
82     sal_Bool                bIsStr1;        // um auch leere Strings zu erkennen
83     sal_Bool                bIsStr2;
84     ScTokenArray*       pFormula1;      // eingegebene Formel
85     ScTokenArray*       pFormula2;
86     ScAddress           aSrcPos;        // source position for formulas
87                                         // temporary data:
88     String              aSrcString;     // formula source position as text during XML import
89     ScFormulaCell*      pFCell1;
90     ScFormulaCell*      pFCell2;
91     ScDocument*         pDoc;
92     sal_Bool                bRelRef1;
93     sal_Bool                bRelRef2;
94     sal_Bool                bFirstRun;
95 
96     void    MakeCells( const ScAddress& rPos );
97     void    Compile( const String& rExpr1, const String& rExpr2,
98                         const String& rExprNmsp1, const String& rExprNmsp2,
99                         formula::FormulaGrammar::Grammar eGrammar1,
100                         formula::FormulaGrammar::Grammar eGrammar2,
101                         sal_Bool bTextToReal );
102     void    Interpret( const ScAddress& rPos );
103 
104     sal_Bool    IsValid( double nArg ) const;
105     sal_Bool    IsValidStr( const String& rArg ) const;
106 
107 public:
108             ScConditionEntry( ScConditionMode eOper,
109                                 const String& rExpr1, const String& rExpr2,
110                                 ScDocument* pDocument, const ScAddress& rPos,
111                                 const String& rExprNmsp1, const String& rExprNmsp2,
112                                 formula::FormulaGrammar::Grammar eGrammar1,
113                                 formula::FormulaGrammar::Grammar eGrammar2 );
114             ScConditionEntry( ScConditionMode eOper,
115                                 const ScTokenArray* pArr1, const ScTokenArray* pArr2,
116                                 ScDocument* pDocument, const ScAddress& rPos );
117             ScConditionEntry( const ScConditionEntry& r );  // flache Kopie der Formeln
118             // echte Kopie der Formeln (fuer Ref-Undo):
119             ScConditionEntry( ScDocument* pDocument, const ScConditionEntry& r );
120     virtual ~ScConditionEntry();
121 
122     int             operator== ( const ScConditionEntry& r ) const;
123 
124     sal_Bool            IsCellValid( ScBaseCell* pCell, const ScAddress& rPos ) const;
125 
GetOperation() const126     ScConditionMode GetOperation() const        { return eOp; }
IsIgnoreBlank() const127     sal_Bool            IsIgnoreBlank() const       { return ( nOptions & SC_COND_NOBLANKS ) == 0; }
128     void            SetIgnoreBlank(sal_Bool bSet);
GetSrcPos() const129     ScAddress       GetSrcPos() const           { return aSrcPos; }
130 
131     ScAddress       GetValidSrcPos() const;     // adjusted to allow textual representation of expressions
132 
133     void            SetSrcString( const String& rNew );     // for XML import
134 
135     void            SetFormula1( const ScTokenArray& rArray );
136     void            SetFormula2( const ScTokenArray& rArray );
137 
138     String          GetExpression( const ScAddress& rCursor, sal_uInt16 nPos, sal_uLong nNumFmt = 0,
139                                     const formula::FormulaGrammar::Grammar eGrammar = formula::FormulaGrammar::GRAM_DEFAULT ) const;
140 
141     ScTokenArray*   CreateTokenArry( sal_uInt16 nPos ) const;
142 
143     void            CompileAll();
144     void            CompileXML();
145     void            UpdateReference( UpdateRefMode eUpdateRefMode,
146                                 const ScRange& rRange, SCsCOL nDx, SCsROW nDy, SCsTAB nDz );
147     void            UpdateMoveTab( SCTAB nOldPos, SCTAB nNewPos );
148 
149     void            SourceChanged( const ScAddress& rChanged );
150 
151     bool            MarkUsedExternalReferences() const;
152 
153 protected:
154     virtual void    DataChanged( const ScRange* pModified ) const;
GetDocument() const155     ScDocument*     GetDocument() const     { return pDoc; }
156 };
157 
158 //
159 //  einzelner Eintrag fuer bedingte Formatierung
160 //
161 
162 class ScConditionalFormat;
163 
164 class SC_DLLPUBLIC ScCondFormatEntry : public ScConditionEntry
165 {
166     String                  aStyleName;
167     ScConditionalFormat*    pParent;
168 
169     using ScConditionEntry::operator==;
170 
171 public:
172             ScCondFormatEntry( ScConditionMode eOper,
173                                 const String& rExpr1, const String& rExpr2,
174                                 ScDocument* pDocument, const ScAddress& rPos,
175                                 const String& rStyle,
176                                 const String& rExprNmsp1 = EMPTY_STRING,
177                                 const String& rExprNmsp2 = EMPTY_STRING,
178                                 formula::FormulaGrammar::Grammar eGrammar1 = formula::FormulaGrammar::GRAM_DEFAULT,
179                                 formula::FormulaGrammar::Grammar eGrammar2 = formula::FormulaGrammar::GRAM_DEFAULT );
180             ScCondFormatEntry( ScConditionMode eOper,
181                                 const ScTokenArray* pArr1, const ScTokenArray* pArr2,
182                                 ScDocument* pDocument, const ScAddress& rPos,
183                                 const String& rStyle );
184             ScCondFormatEntry( const ScCondFormatEntry& r );
185             ScCondFormatEntry( ScDocument* pDocument, const ScCondFormatEntry& r );
186     virtual ~ScCondFormatEntry();
187 
SetParent(ScConditionalFormat * pNew)188     void            SetParent( ScConditionalFormat* pNew )  { pParent = pNew; }
189 
190     int             operator== ( const ScCondFormatEntry& r ) const;
191 
GetStyle() const192     const String&   GetStyle() const        { return aStyleName; }
UpdateStyleName(const String & rNew)193     void            UpdateStyleName(const String& rNew)  { aStyleName=rNew; }
194 
195 protected:
196     virtual void    DataChanged( const ScRange* pModified ) const;
197 };
198 
199 //
200 //  komplette bedingte Formatierung
201 //
202 
203 class SC_DLLPUBLIC ScConditionalFormat
204 {
205     ScDocument*         pDoc;
206     ScRangeList*        pAreas;             // Bereiche fuer Paint
207     sal_uInt32          nKey;               // Index in Attributen
208     ScCondFormatEntry** ppEntries;
209     sal_uInt16              nEntryCount;
210     sal_Bool                bIsUsed;            // temporaer beim Speichern
211 
212 public:
213             ScConditionalFormat(sal_uInt32 nNewKey, ScDocument* pDocument);
214             ScConditionalFormat(const ScConditionalFormat& r);
215             ~ScConditionalFormat();
216 
217     // echte Kopie der Formeln (fuer Ref-Undo / zwischen Dokumenten)
218     ScConditionalFormat* Clone(ScDocument* pNewDoc = NULL) const;
219 
220     void            AddEntry( const ScCondFormatEntry& rNew );
221 
IsEmpty() const222     sal_Bool            IsEmpty() const         { return (nEntryCount == 0); }
Count() const223     sal_uInt16          Count() const           { return nEntryCount; }
224 
225     void            CompileAll();
226     void            CompileXML();
227     void            UpdateReference( UpdateRefMode eUpdateRefMode,
228                                 const ScRange& rRange, SCsCOL nDx, SCsROW nDy, SCsTAB nDz );
229     void            UpdateMoveTab( SCTAB nOldPos, SCTAB nNewPos );
230     void            RenameCellStyle( const String& rOld, const String& rNew );
231 
232     void            SourceChanged( const ScAddress& rAddr );
233 
234     const ScCondFormatEntry* GetEntry( sal_uInt16 nPos ) const;
235 
236     const String&   GetCellStyle( ScBaseCell* pCell, const ScAddress& rPos ) const;
237 
238     sal_Bool            EqualEntries( const ScConditionalFormat& r ) const;
239 
240     void            DoRepaint( const ScRange* pModified );
241     void            InvalidateArea();
242 
GetKey() const243     sal_uInt32      GetKey() const          { return nKey; }
SetKey(sal_uInt32 nNew)244     void            SetKey(sal_uInt32 nNew) { nKey = nNew; }    // nur wenn nicht eingefuegt!
245 
SetUsed(sal_Bool bSet)246     void            SetUsed(sal_Bool bSet)      { bIsUsed = bSet; }
IsUsed() const247     sal_Bool            IsUsed() const          { return bIsUsed; }
248 
249     bool            MarkUsedExternalReferences() const;
250 
251     //  sortiert (per PTRARR) nach Index
252     //  operator== nur fuer die Sortierung
operator ==(const ScConditionalFormat & r) const253     sal_Bool operator ==( const ScConditionalFormat& r ) const  { return nKey == r.nKey; }
operator <(const ScConditionalFormat & r) const254     sal_Bool operator < ( const ScConditionalFormat& r ) const  { return nKey <  r.nKey; }
255 };
256 
257 //
258 //  Liste der Bereiche und Formate:
259 //
260 
261 typedef ScConditionalFormat* ScConditionalFormatPtr;
262 
263 SV_DECL_PTRARR_SORT(ScConditionalFormats_Impl, ScConditionalFormatPtr,
264                         SC_COND_GROW, SC_COND_GROW)
265 
266 class ScConditionalFormatList : public ScConditionalFormats_Impl
267 {
268 public:
ScConditionalFormatList()269         ScConditionalFormatList() {}
270         ScConditionalFormatList(const ScConditionalFormatList& rList);
271         ScConditionalFormatList(ScDocument* pNewDoc, const ScConditionalFormatList& rList);
~ScConditionalFormatList()272         ~ScConditionalFormatList() {}
273 
InsertNew(ScConditionalFormat * pNew)274     void    InsertNew( ScConditionalFormat* pNew )
275                 { if (!Insert(pNew)) delete pNew; }
276 
277     ScConditionalFormat* GetFormat( sal_uInt32 nKey );
278 
279     void    CompileAll();
280     void    CompileXML();
281     void    UpdateReference( UpdateRefMode eUpdateRefMode,
282                                 const ScRange& rRange, SCsCOL nDx, SCsROW nDy, SCsTAB nDz );
283     void    RenameCellStyle( const String& rOld, const String& rNew );
284     void    UpdateMoveTab( SCTAB nOldPos, SCTAB nNewPos );
285 
286     void    SourceChanged( const ScAddress& rAddr );
287 
288     /** Temporarily during save, returns RefManager's decision whether ALL
289      *  references are marked now. */
290     bool    MarkUsedExternalReferences() const;
291 
292     sal_Bool    operator==( const ScConditionalFormatList& r ) const;       // fuer Ref-Undo
293 };
294 
295 #endif
296 
297 
298