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