xref: /AOO41X/main/sc/inc/validat.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_VALIDAT_HXX
25 #define SC_VALIDAT_HXX
26 
27 #include "conditio.hxx"
28 #include <com/sun/star/sheet/TableValidationVisibility.hpp>
29 #include "scdllapi.h"
30 
31 namespace ValidListType = ::com::sun::star::sheet::TableValidationVisibility;
32 
33 class ScPatternAttr;
34 class ScTokenArray;
35 class TypedScStrCollection;
36 
37 enum ScValidationMode
38 {
39     SC_VALID_ANY,
40     SC_VALID_WHOLE,
41     SC_VALID_DECIMAL,
42     SC_VALID_DATE,
43     SC_VALID_TIME,
44     SC_VALID_TEXTLEN,
45     SC_VALID_LIST,
46     SC_VALID_CUSTOM
47 };
48 
49 enum ScValidErrorStyle
50 {
51     SC_VALERR_STOP,
52     SC_VALERR_WARNING,
53     SC_VALERR_INFO,
54     SC_VALERR_MACRO
55 };
56 
57 //
58 //  Eintrag fuer Gueltigkeit (es gibt nur eine Bedingung)
59 //
60 
61 class SC_DLLPUBLIC ScValidationData : public ScConditionEntry
62 {
63     sal_uInt32          nKey;               // Index in Attributen
64 
65     ScValidationMode    eDataMode;
66     sal_Bool                bShowInput;
67     sal_Bool                bShowError;
68     ScValidErrorStyle   eErrorStyle;
69     sal_Int16           mnListType;         // selection list type: none, unsorted, sorted.
70     String              aInputTitle;
71     String              aInputMessage;
72     String              aErrorTitle;
73     String              aErrorMessage;
74 
75     sal_Bool                bIsUsed;            // temporaer beim Speichern
76 
77     sal_Bool            DoMacro( const ScAddress& rPos, const String& rInput,
78                                 ScFormulaCell* pCell, Window* pParent ) const;
79 
80     sal_Bool            DoScript( const ScAddress& rPos, const String& rInput,
81                                 ScFormulaCell* pCell, Window* pParent ) const;
82 
83     using ScConditionEntry::operator==;
84 
85 public:
86             ScValidationData( ScValidationMode eMode, ScConditionMode eOper,
87                                 const String& rExpr1, const String& rExpr2,
88                                 ScDocument* pDocument, const ScAddress& rPos,
89                                 const String& rExprNmsp1 = EMPTY_STRING, const String& rExprNmsp2 = EMPTY_STRING,
90                                 formula::FormulaGrammar::Grammar eGrammar1 = formula::FormulaGrammar::GRAM_DEFAULT,
91                                 formula::FormulaGrammar::Grammar eGrammar2 = formula::FormulaGrammar::GRAM_DEFAULT );
92             ScValidationData( ScValidationMode eMode, ScConditionMode eOper,
93                                 const ScTokenArray* pArr1, const ScTokenArray* pArr2,
94                                 ScDocument* pDocument, const ScAddress& rPos );
95             ScValidationData( const ScValidationData& r );
96             ScValidationData( ScDocument* pDocument, const ScValidationData& r );
97     virtual ~ScValidationData();
98 
Clone() const99     ScValidationData* Clone() const     // echte Kopie
100                     { return new ScValidationData( GetDocument(), *this ); }
Clone(ScDocument * pNew) const101     ScValidationData* Clone(ScDocument* pNew) const
102                     { return new ScValidationData( pNew, *this ); }
103 
104     void            ResetInput();
105     void            ResetError();
106     void            SetInput( const String& rTitle, const String& rMsg );
107     void            SetError( const String& rTitle, const String& rMsg,
108                                 ScValidErrorStyle eStyle );
109 
GetInput(String & rTitle,String & rMsg) const110     sal_Bool            GetInput( String& rTitle, String& rMsg ) const
111                         { rTitle = aInputTitle; rMsg = aInputMessage; return bShowInput; }
112     sal_Bool            GetErrMsg( String& rTitle, String& rMsg, ScValidErrorStyle& rStyle ) const;
113 
HasErrMsg() const114     sal_Bool            HasErrMsg() const       { return bShowError; }
115 
GetDataMode() const116     ScValidationMode GetDataMode() const    { return eDataMode; }
117 
GetListType() const118     inline sal_Int16 GetListType() const                { return mnListType; }
SetListType(sal_Int16 nListType)119     inline void     SetListType( sal_Int16 nListType )  { mnListType = nListType; }
120 
121     /** Returns true, if the validation cell will show a selection list.
122         @descr  Use this instead of GetListType() which returns the raw property
123         regardless of the validation type. */
124     bool            HasSelectionList() const;
125     /** Tries to fill the passed collection with list validation entries.
126         @descr  Fills the list only, if this is a list validation and IsShowList() is enabled.
127         @param rStrings  (out-param) The string list to fill with list validation entires.
128         @return  true = rStrings has been filled with at least one entry. */
129     bool            FillSelectionList( TypedScStrCollection& rStrings, const ScAddress& rPos ) const;
130 
131                     //  mit String: bei Eingabe, mit Zelle: fuer Detektiv / RC_FORCED
132     sal_Bool            IsDataValid( const String& rTest, const ScPatternAttr& rPattern,
133                                     const ScAddress& rPos ) const;
134     sal_Bool            IsDataValid( ScBaseCell* pCell, const ScAddress& rPos ) const;
135 
136                     // sal_True -> Abbruch
137     sal_Bool            DoError( Window* pParent, const String& rInput, const ScAddress& rPos ) const;
138     void            DoCalcError( ScFormulaCell* pCell ) const;
139 
140     sal_Bool            IsEmpty() const;
GetKey() const141     sal_uInt32      GetKey() const          { return nKey; }
SetKey(sal_uInt32 nNew)142     void            SetKey(sal_uInt32 nNew) { nKey = nNew; }    // nur wenn nicht eingefuegt!
143 
SetUsed(sal_Bool bSet)144     void            SetUsed(sal_Bool bSet)      { bIsUsed = bSet; }
IsUsed() const145     sal_Bool            IsUsed() const          { return bIsUsed; }
146 
147     sal_Bool            EqualEntries( const ScValidationData& r ) const;    // fuer Undo
148 
149     //  sortiert (per PTRARR) nach Index
150     //  operator== nur fuer die Sortierung
operator ==(const ScValidationData & r) const151     sal_Bool operator ==( const ScValidationData& r ) const { return nKey == r.nKey; }
operator <(const ScValidationData & r) const152     sal_Bool operator < ( const ScValidationData& r ) const { return nKey <  r.nKey; }
153 
154 private:
155     /** Tries to fill the passed collection with list validation entries.
156         @descr  Fills the list only if it is non-NULL,
157         @param pStrings  (out-param) Optionally NULL, string list to fill with list validation entires.
158         @param pCell     can be NULL if it is not necessary to which element in the list is selected.
159         @param rPos      the base address for relative references.
160         @param rTokArr   Formula token array.
161         @param rMatch    (out-param) the index of the first item that matched, -1 if nothing matched.
162         @return  true = Cell range found, rRange is valid, or an error entry stuffed into the list if pCell==NULL. */
163     bool            GetSelectionFromFormula( TypedScStrCollection* pStrings,
164                                              ScBaseCell* pCell, const ScAddress& rPos,
165                                              const ScTokenArray& rTokArr, int& rMatch ) const;
166 
167     /** Tests, if pCell is equal to what the passed token array represents. */
168     bool            IsEqualToTokenArray( ScBaseCell* pCell, const ScAddress& rPos, const ScTokenArray& rTokArr ) const;
169 
170     /** Tests, if contents of pCell occur in cell range referenced by own formula, or in a string list. */
171     bool            IsListValid( ScBaseCell* pCell, const ScAddress& rPos ) const;
172 };
173 
174 //
175 //  Liste der Bedingungen:
176 //
177 
178 typedef ScValidationData* ScValidationDataPtr;
179 
180 SV_DECL_PTRARR_SORT(ScValidationEntries_Impl, ScValidationDataPtr,
181                         SC_COND_GROW, SC_COND_GROW)
182 
183 class ScValidationDataList : public ScValidationEntries_Impl
184 {
185 public:
ScValidationDataList()186         ScValidationDataList() {}
187         ScValidationDataList(const ScValidationDataList& rList);
188         ScValidationDataList(ScDocument* pNewDoc, const ScValidationDataList& rList);
~ScValidationDataList()189         ~ScValidationDataList() {}
190 
InsertNew(ScValidationData * pNew)191     void    InsertNew( ScValidationData* pNew )
192                 { if (!Insert(pNew)) delete pNew; }
193 
194     ScValidationData* GetData( sal_uInt32 nKey );
195 
196     void    CompileXML();
197     void    UpdateReference( UpdateRefMode eUpdateRefMode,
198                                 const ScRange& rRange, SCsCOL nDx, SCsROW nDy, SCsTAB nDz );
199     void    UpdateMoveTab( SCTAB nOldPos, SCTAB nNewPos );
200 
201     /** Temporarily during save, returns RefManager's decision whether ALL
202      *  references are marked now. */
203     bool    MarkUsedExternalReferences() const;
204 
205     sal_Bool    operator==( const ScValidationDataList& r ) const;      // fuer Ref-Undo
206 };
207 
208 #endif
209 
210