nss: upgrade to release 3.73
[LibreOffice.git] / sc / source / ui / vba / vbavalidation.cxx
blob65d6f985c34387ce07aa69a9919f873a2dcf2edf
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 * This file incorporates work covered by the following license notice:
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
20 #include "vbavalidation.hxx"
21 #include "vbaformatcondition.hxx"
22 #include <com/sun/star/sheet/XSheetCondition.hpp>
23 #include <com/sun/star/sheet/ValidationType.hpp>
24 #include <com/sun/star/sheet/ValidationAlertStyle.hpp>
25 #include <com/sun/star/table/XCellRange.hpp>
26 #include <com/sun/star/beans/XPropertySet.hpp>
27 #include <ooo/vba/excel/XlDVType.hpp>
28 #include <ooo/vba/excel/XlDVAlertStyle.hpp>
30 #include <unonames.hxx>
31 #include <rangelst.hxx>
32 #include "excelvbahelper.hxx"
33 #include "vbarange.hxx"
35 using namespace ::ooo::vba;
36 using namespace ::com::sun::star;
38 static void
39 lcl_setValidationProps( const uno::Reference< table::XCellRange >& xRange, const uno::Reference< beans::XPropertySet >& xProps )
41 uno::Reference< beans::XPropertySet > xRangeProps( xRange, uno::UNO_QUERY_THROW );
42 xRangeProps->setPropertyValue( SC_UNONAME_VALIDAT , uno::makeAny( xProps ) );
45 static uno::Reference< beans::XPropertySet >
46 lcl_getValidationProps( const uno::Reference< table::XCellRange >& xRange )
48 uno::Reference< beans::XPropertySet > xProps( xRange, uno::UNO_QUERY_THROW );
49 uno::Reference< beans::XPropertySet > xValProps;
50 xValProps.set( xProps->getPropertyValue( SC_UNONAME_VALIDAT ), uno::UNO_QUERY_THROW );
51 return xValProps;
54 sal_Bool SAL_CALL
55 ScVbaValidation::getIgnoreBlank()
57 uno::Reference< beans::XPropertySet > xProps( lcl_getValidationProps( m_xRange ) );
58 bool bBlank = false;
59 xProps->getPropertyValue( SC_UNONAME_IGNOREBL ) >>= bBlank;
60 return bBlank;
63 void SAL_CALL
64 ScVbaValidation::setIgnoreBlank( sal_Bool _ignoreblank )
66 uno::Reference< beans::XPropertySet > xProps( lcl_getValidationProps( m_xRange ) );
67 xProps->setPropertyValue( SC_UNONAME_IGNOREBL, uno::makeAny( _ignoreblank ) );
68 lcl_setValidationProps( m_xRange, xProps );
71 sal_Bool SAL_CALL
72 ScVbaValidation::getInCellDropdown()
74 uno::Reference< beans::XPropertySet > xProps = lcl_getValidationProps( m_xRange );
75 sal_Int32 nShowList = 0;
76 xProps->getPropertyValue( SC_UNONAME_SHOWLIST ) >>= nShowList;
77 return nShowList != 0;
80 void SAL_CALL
81 ScVbaValidation::setInCellDropdown( sal_Bool _incelldropdown )
83 sal_Int32 nDropDown = 0;
84 if ( _incelldropdown )
85 nDropDown = 1;
86 uno::Reference< beans::XPropertySet > xProps( lcl_getValidationProps(m_xRange) );
87 xProps->setPropertyValue( SC_UNONAME_SHOWLIST, uno::makeAny( nDropDown ) );
88 lcl_setValidationProps( m_xRange, xProps );
91 sal_Bool SAL_CALL
92 ScVbaValidation::getShowInput()
94 uno::Reference< beans::XPropertySet > xProps = lcl_getValidationProps( m_xRange );
95 bool bShowInput = false;
96 xProps->getPropertyValue( SC_UNONAME_SHOWINP ) >>= bShowInput;
97 return bShowInput;
100 void SAL_CALL
101 ScVbaValidation:: setShowInput( sal_Bool _showinput )
103 uno::Reference< beans::XPropertySet > xProps( lcl_getValidationProps(m_xRange) );
104 xProps->setPropertyValue( SC_UNONAME_IGNOREBL, uno::makeAny( _showinput ) );
105 lcl_setValidationProps( m_xRange, xProps );
108 sal_Bool SAL_CALL
109 ScVbaValidation::getShowError()
111 uno::Reference< beans::XPropertySet > xProps = lcl_getValidationProps( m_xRange );
112 bool bShowError = false;
113 xProps->getPropertyValue( SC_UNONAME_SHOWERR ) >>= bShowError;
114 return bShowError;
117 void SAL_CALL
118 ScVbaValidation::setShowError( sal_Bool _showerror )
120 uno::Reference< beans::XPropertySet > xProps( lcl_getValidationProps( m_xRange ) );
121 xProps->setPropertyValue( SC_UNONAME_SHOWERR, uno::makeAny( _showerror ) );
122 lcl_setValidationProps( m_xRange, xProps );
125 OUString SAL_CALL
126 ScVbaValidation::getErrorTitle()
128 uno::Reference< beans::XPropertySet > xProps = lcl_getValidationProps( m_xRange );
129 OUString sErrorTitle;
130 xProps->getPropertyValue( SC_UNONAME_ERRTITLE ) >>= sErrorTitle;
131 return sErrorTitle;
134 void
135 ScVbaValidation::setErrorTitle( const OUString& _errormessage )
137 uno::Reference< beans::XPropertySet > xProps( lcl_getValidationProps( m_xRange ) );
138 xProps->setPropertyValue( SC_UNONAME_ERRTITLE, uno::makeAny( _errormessage ) );
139 lcl_setValidationProps( m_xRange, xProps );
142 OUString SAL_CALL
143 ScVbaValidation::getInputMessage()
145 uno::Reference< beans::XPropertySet > xProps = lcl_getValidationProps( m_xRange );
146 OUString sMsg;
147 xProps->getPropertyValue( SC_UNONAME_INPMESS ) >>= sMsg;
148 return sMsg;
151 void SAL_CALL
152 ScVbaValidation::setInputMessage( const OUString& _inputmessage )
154 uno::Reference< beans::XPropertySet > xProps( lcl_getValidationProps( m_xRange ) );
155 xProps->setPropertyValue( SC_UNONAME_INPMESS, uno::makeAny( _inputmessage ) );
156 lcl_setValidationProps( m_xRange, xProps );
159 OUString SAL_CALL
160 ScVbaValidation::getInputTitle()
162 uno::Reference< beans::XPropertySet > xProps = lcl_getValidationProps( m_xRange );
163 OUString sString;
164 xProps->getPropertyValue( SC_UNONAME_INPTITLE ) >>= sString;
165 return sString;
168 void SAL_CALL
169 ScVbaValidation::setInputTitle( const OUString& _inputtitle )
171 uno::Reference< beans::XPropertySet > xProps( lcl_getValidationProps( m_xRange ) );
172 xProps->setPropertyValue( SC_UNONAME_INPTITLE, uno::makeAny( _inputtitle ) );
173 lcl_setValidationProps( m_xRange, xProps );
176 OUString SAL_CALL
177 ScVbaValidation::getErrorMessage()
179 uno::Reference< beans::XPropertySet > xProps = lcl_getValidationProps( m_xRange );
180 OUString sString;
181 xProps->getPropertyValue( SC_UNONAME_ERRMESS ) >>= sString;
182 return sString;
185 void SAL_CALL
186 ScVbaValidation::setErrorMessage( const OUString& _errormessage )
188 uno::Reference< beans::XPropertySet > xProps( lcl_getValidationProps( m_xRange ) );
189 xProps->setPropertyValue( SC_UNONAME_ERRMESS, uno::makeAny( _errormessage ) );
190 lcl_setValidationProps( m_xRange, xProps );
193 void SAL_CALL
194 ScVbaValidation::Delete( )
196 OUString sBlank;
197 uno::Reference< beans::XPropertySet > xProps( lcl_getValidationProps( m_xRange ) );
198 uno::Reference< sheet::XSheetCondition > xCond( xProps, uno::UNO_QUERY_THROW );
199 xProps->setPropertyValue( SC_UNONAME_IGNOREBL, uno::makeAny( true ) );
200 xProps->setPropertyValue( SC_UNONAME_SHOWINP, uno::makeAny( true ) );
201 xProps->setPropertyValue( SC_UNONAME_SHOWERR, uno::makeAny( true ) );
202 xProps->setPropertyValue( SC_UNONAME_ERRTITLE, uno::makeAny( sBlank ) );
203 xProps->setPropertyValue( SC_UNONAME_INPMESS, uno::makeAny( sBlank) );
204 xProps->setPropertyValue( SC_UNONAME_ERRALSTY, uno::makeAny( sheet::ValidationAlertStyle_STOP) );
205 xProps->setPropertyValue( SC_UNONAME_TYPE, uno::makeAny( sheet::ValidationType_ANY ) );
206 xCond->setFormula1( sBlank );
207 xCond->setFormula2( sBlank );
208 xCond->setOperator( sheet::ConditionOperator_NONE );
210 lcl_setValidationProps( m_xRange, xProps );
213 // Fix the defect that validation cannot work when the input should be limited between a lower bound and an upper bound
214 void SAL_CALL
215 ScVbaValidation::Add( const uno::Any& Type, const uno::Any& AlertStyle, const uno::Any& Operator, const uno::Any& Formula1, const uno::Any& Formula2 )
217 uno::Reference< beans::XPropertySet > xProps( lcl_getValidationProps( m_xRange ) );
218 uno::Reference< sheet::XSheetCondition > xCond( xProps, uno::UNO_QUERY_THROW );
220 sheet::ValidationType nValType = sheet::ValidationType_ANY;
221 xProps->getPropertyValue( SC_UNONAME_TYPE ) >>= nValType;
222 if ( nValType != sheet::ValidationType_ANY )
223 throw uno::RuntimeException("validation object already exists" );
224 sal_Int32 nType = -1;
225 if ( !Type.hasValue() || !( Type >>= nType ) )
226 throw uno::RuntimeException("missing required param" );
228 Delete(); // set up defaults
229 OUString sFormula1;
230 Formula1 >>= sFormula1;
231 OUString sFormula2;
232 Formula2 >>= sFormula2;
233 switch ( nType )
235 case excel::XlDVType::xlValidateList:
237 // for validate list
238 // at least formula1 is required
239 if ( !Formula1.hasValue() )
240 throw uno::RuntimeException("missing param" );
241 nValType = sheet::ValidationType_LIST;
242 xProps->setPropertyValue( SC_UNONAME_TYPE, uno::makeAny(nValType ));
243 // #TODO validate required params
244 // #TODO need to correct the ';' delimited formula on get/set
245 break;
247 case excel::XlDVType::xlValidateWholeNumber:
248 nValType = sheet::ValidationType_WHOLE;
249 xProps->setPropertyValue( SC_UNONAME_TYPE, uno::makeAny(nValType ));
250 break;
251 default:
252 throw uno::RuntimeException("unsupported operation..." );
255 sheet::ValidationAlertStyle eStyle = sheet::ValidationAlertStyle_STOP;
256 sal_Int32 nVbaAlertStyle = excel::XlDVAlertStyle::xlValidAlertStop;
257 if ( AlertStyle.hasValue() && ( AlertStyle >>= nVbaAlertStyle ) )
259 switch( nVbaAlertStyle )
261 case excel::XlDVAlertStyle::xlValidAlertStop:
262 // yes I know it's already defaulted but safer to assume
263 // someone probably could change the code above
264 eStyle = sheet::ValidationAlertStyle_STOP;
265 break;
266 case excel::XlDVAlertStyle::xlValidAlertWarning:
267 eStyle = sheet::ValidationAlertStyle_WARNING;
268 break;
269 case excel::XlDVAlertStyle::xlValidAlertInformation:
270 eStyle = sheet::ValidationAlertStyle_INFO;
271 break;
272 default:
273 throw uno::RuntimeException("bad param..." );
278 xProps->setPropertyValue( SC_UNONAME_ERRALSTY, uno::makeAny( eStyle ) );
280 // i#108860: fix the defect that validation cannot work when the input
281 // should be limited between a lower bound and an upper bound
282 if ( Operator.hasValue() )
284 css::sheet::ConditionOperator conOperator = ScVbaFormatCondition::retrieveAPIOperator( Operator );
285 xCond->setOperator( conOperator );
288 if ( !sFormula1.isEmpty() )
289 xCond->setFormula1( sFormula1 );
290 if ( !sFormula2.isEmpty() )
291 xCond->setFormula2( sFormula2 );
293 lcl_setValidationProps( m_xRange, xProps );
296 OUString SAL_CALL
297 ScVbaValidation::getFormula1()
299 uno::Reference< sheet::XSheetCondition > xCond( lcl_getValidationProps( m_xRange ), uno::UNO_QUERY_THROW );
300 OUString sString = xCond->getFormula1();
302 ScRefFlags nFlags = ScRefFlags::ZERO;
303 ScRangeList aCellRanges;
305 ScDocShell* pDocSh = excel::GetDocShellFromRange( m_xRange );
306 // in calc validation formula is either a range or formula
307 // that results in range.
308 // In VBA both formula and address can have a leading '='
309 // in result of getFormula1, however it *seems* that a named range or
310 // real formula has to (or is expected to) have the '='
311 if ( pDocSh && !ScVbaRange::getCellRangesForAddress( nFlags, sString, pDocSh, aCellRanges, formula::FormulaGrammar::CONV_XL_A1, 0 ) )
312 sString = "=" + sString;
313 return sString;
316 OUString SAL_CALL
317 ScVbaValidation::getFormula2()
319 uno::Reference< sheet::XSheetCondition > xCond( lcl_getValidationProps( m_xRange ), uno::UNO_QUERY_THROW );
320 return xCond->getFormula2();
323 sal_Int32 SAL_CALL
324 ScVbaValidation::getType()
326 uno::Reference< beans::XPropertySet > xProps( lcl_getValidationProps( m_xRange ) );
327 sheet::ValidationType nValType = sheet::ValidationType_ANY;
328 xProps->getPropertyValue( SC_UNONAME_TYPE ) >>= nValType;
329 sal_Int32 nExcelType = excel::XlDVType::xlValidateList; // pick a default
330 if ( xProps.is() )
332 switch ( nValType )
334 case sheet::ValidationType_LIST:
335 nExcelType = excel::XlDVType::xlValidateList;
336 break;
337 case sheet::ValidationType_ANY: // not ANY not really a great match for anything I fear:-(
338 nExcelType = excel::XlDVType::xlValidateInputOnly;
339 break;
340 case sheet::ValidationType_CUSTOM:
341 nExcelType = excel::XlDVType::xlValidateCustom;
342 break;
343 case sheet::ValidationType_WHOLE:
344 nExcelType = excel::XlDVType::xlValidateWholeNumber;
345 break;
346 case sheet::ValidationType_DECIMAL:
347 nExcelType = excel::XlDVType::xlValidateDecimal;
348 break;
349 case sheet::ValidationType_DATE:
350 nExcelType = excel::XlDVType::xlValidateDate;
351 break;
352 case sheet::ValidationType_TIME:
353 nExcelType = excel::XlDVType::xlValidateTime;
354 break;
355 case sheet::ValidationType_TEXT_LEN:
356 nExcelType = excel::XlDVType::xlValidateTextLength;
357 break;
358 case sheet::ValidationType::ValidationType_MAKE_FIXED_SIZE:
359 default:
360 break;
363 return nExcelType;
366 OUString
367 ScVbaValidation::getServiceImplName()
369 return "ScVbaValidation";
372 uno::Sequence< OUString >
373 ScVbaValidation::getServiceNames()
375 static uno::Sequence< OUString > const aServiceNames
377 "ooo.vba.excel.Validation"
379 return aServiceNames;
382 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */