xref: /trunk/main/sc/source/ui/vba/vbavalidation.cxx (revision f4553f15)
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 #include "vbavalidation.hxx"
24 #include "vbaformatcondition.hxx" //#i108860
25 #include <com/sun/star/sheet/XSheetCondition.hpp>
26 #include <com/sun/star/sheet/ValidationType.hpp>
27 #include <com/sun/star/sheet/ValidationAlertStyle.hpp>
28 #include <com/sun/star/beans/XPropertySet.hpp>
29 #include <ooo/vba/excel/XlDVType.hpp>
30 #include <ooo/vba/excel/XlFormatConditionOperator.hpp>
31 #include <ooo/vba/excel/XlDVAlertStyle.hpp>
32 
33 #include "unonames.hxx"
34 
35 using namespace ::ooo::vba;
36 using namespace ::com::sun::star;
37 
38 const static rtl::OUString VALIDATION( RTL_CONSTASCII_USTRINGPARAM( SC_UNONAME_VALIDAT ) );
39 const static rtl::OUString IGNOREBLANK( RTL_CONSTASCII_USTRINGPARAM( SC_UNONAME_IGNOREBL ) );
40 const static rtl::OUString SHOWINPUT( RTL_CONSTASCII_USTRINGPARAM( SC_UNONAME_SHOWINP  ) );
41 const static rtl::OUString SHOWERROR( RTL_CONSTASCII_USTRINGPARAM( SC_UNONAME_SHOWERR  ) );
42 const static rtl::OUString ERRORTITLE( RTL_CONSTASCII_USTRINGPARAM(  SC_UNONAME_ERRTITLE  ) );
43 const static rtl::OUString INPUTTITLE( RTL_CONSTASCII_USTRINGPARAM(  SC_UNONAME_INPTITLE  ) );
44 const static rtl::OUString INPUTMESS( RTL_CONSTASCII_USTRINGPARAM(  SC_UNONAME_INPMESS  ) );
45 const static rtl::OUString ERRORMESS( RTL_CONSTASCII_USTRINGPARAM(  SC_UNONAME_ERRMESS  ) );
46 const static rtl::OUString STYPE( RTL_CONSTASCII_USTRINGPARAM(  SC_UNONAME_TYPE  ) );
47 const static rtl::OUString SHOWLIST( RTL_CONSTASCII_USTRINGPARAM(  SC_UNONAME_SHOWLIST  ) );
48 const static rtl::OUString ALERTSTYLE( RTL_CONSTASCII_USTRINGPARAM(  SC_UNONAME_ERRALSTY  ) );
49 
50 void
lcl_setValidationProps(const uno::Reference<table::XCellRange> & xRange,const uno::Reference<beans::XPropertySet> & xProps)51 lcl_setValidationProps( const uno::Reference< table::XCellRange >& xRange, const uno::Reference< beans::XPropertySet >& xProps )
52 {
53 	uno::Reference< beans::XPropertySet > xRangeProps( xRange, uno::UNO_QUERY_THROW );
54 	xRangeProps->setPropertyValue( VALIDATION , uno::makeAny( xProps ) );
55 }
56 
57 uno::Reference< beans::XPropertySet >
lcl_getValidationProps(const uno::Reference<table::XCellRange> & xRange)58 lcl_getValidationProps( const uno::Reference< table::XCellRange >& xRange )
59 {
60 	uno::Reference< beans::XPropertySet > xProps( xRange, uno::UNO_QUERY_THROW );
61 	uno::Reference< beans::XPropertySet > xValProps;
62 	xValProps.set( xProps->getPropertyValue( VALIDATION ), uno::UNO_QUERY_THROW );
63 	return xValProps;
64 }
65 
66 ::sal_Bool SAL_CALL
getIgnoreBlank()67 ScVbaValidation::getIgnoreBlank() throw (uno::RuntimeException)
68 {
69 	uno::Reference< beans::XPropertySet > xProps( lcl_getValidationProps( m_xRange ) );
70 	sal_Bool bBlank = sal_False;
71 	xProps->getPropertyValue( IGNOREBLANK )  >>= bBlank;
72 	return bBlank;
73 }
74 
75 void SAL_CALL
setIgnoreBlank(::sal_Bool _ignoreblank)76 ScVbaValidation::setIgnoreBlank( ::sal_Bool _ignoreblank ) throw (uno::RuntimeException)
77 {
78 	uno::Reference< beans::XPropertySet > xProps( lcl_getValidationProps( m_xRange ) );
79 	xProps->setPropertyValue( IGNOREBLANK, uno::makeAny( _ignoreblank ) );
80 	lcl_setValidationProps( m_xRange, xProps );
81 }
82 
83 ::sal_Bool SAL_CALL
getInCellDropdown()84 ScVbaValidation::getInCellDropdown() throw (uno::RuntimeException)
85 {
86 	uno::Reference< beans::XPropertySet > xProps = lcl_getValidationProps( m_xRange );
87 	sal_Int32 nShowList = 0;
88 	xProps->getPropertyValue( SHOWLIST )  >>= nShowList;
89 	return ( nShowList ? sal_True : sal_False );
90 }
91 
92 void SAL_CALL
setInCellDropdown(::sal_Bool _incelldropdown)93 ScVbaValidation::setInCellDropdown( ::sal_Bool  _incelldropdown  ) throw (uno::RuntimeException)
94 {
95 	sal_Int32 nDropDown = sal_False;
96 	if ( _incelldropdown )
97 		nDropDown = 1;
98 	uno::Reference< beans::XPropertySet > xProps( lcl_getValidationProps(m_xRange) );
99 	xProps->setPropertyValue( SHOWLIST, uno::makeAny( nDropDown ) );
100 	lcl_setValidationProps( m_xRange, xProps );
101 }
102 
103 ::sal_Bool SAL_CALL
getShowInput()104 ScVbaValidation::getShowInput() throw (uno::RuntimeException)
105 {
106 	uno::Reference< beans::XPropertySet > xProps = lcl_getValidationProps( m_xRange );
107 	sal_Bool bShowInput = sal_False;
108 	xProps->getPropertyValue( SHOWINPUT )  >>= bShowInput;
109 	return bShowInput;
110 }
111 
112 void SAL_CALL
setShowInput(::sal_Bool _showinput)113 ScVbaValidation:: setShowInput( ::sal_Bool _showinput ) throw (uno::RuntimeException)
114 {
115 	uno::Reference< beans::XPropertySet > xProps( lcl_getValidationProps(m_xRange) );
116 	xProps->setPropertyValue( IGNOREBLANK, uno::makeAny( _showinput ) );
117 	lcl_setValidationProps( m_xRange, xProps );
118 }
119 
120 ::sal_Bool SAL_CALL
getShowError()121 ScVbaValidation::getShowError() throw (uno::RuntimeException)
122 {
123 	uno::Reference< beans::XPropertySet > xProps = lcl_getValidationProps( m_xRange );
124 	sal_Bool bShowError = sal_False;
125 	xProps->getPropertyValue( SHOWERROR )  >>= bShowError;
126 	return bShowError;
127 }
128 
129 void SAL_CALL
setShowError(::sal_Bool _showerror)130 ScVbaValidation::setShowError( ::sal_Bool _showerror ) throw (uno::RuntimeException)
131 {
132 	uno::Reference< beans::XPropertySet > xProps( lcl_getValidationProps( m_xRange ) );
133 	xProps->setPropertyValue( SHOWERROR, uno::makeAny( _showerror ) );
134 	lcl_setValidationProps( m_xRange, xProps );
135 }
136 
137 ::rtl::OUString SAL_CALL
getErrorTitle()138 ScVbaValidation::getErrorTitle() throw (uno::RuntimeException)
139 {
140 	uno::Reference< beans::XPropertySet > xProps = lcl_getValidationProps( m_xRange );
141 	rtl::OUString sErrorTitle;
142 	xProps->getPropertyValue( ERRORTITLE )  >>= sErrorTitle;
143 	return sErrorTitle;
144 }
145 
146 void
setErrorTitle(const rtl::OUString & _errormessage)147 ScVbaValidation::setErrorTitle( const rtl::OUString& _errormessage ) throw (uno::RuntimeException)
148 {
149 	uno::Reference< beans::XPropertySet > xProps( lcl_getValidationProps( m_xRange ) );
150 	xProps->setPropertyValue( ERRORTITLE, uno::makeAny( _errormessage ) );
151 	lcl_setValidationProps( m_xRange, xProps );
152 }
153 
154 ::rtl::OUString SAL_CALL
getInputMessage()155 ScVbaValidation::getInputMessage() throw (uno::RuntimeException)
156 {
157 	uno::Reference< beans::XPropertySet > xProps = lcl_getValidationProps( m_xRange );
158 	rtl::OUString sMsg;
159 	xProps->getPropertyValue( INPUTMESS )  >>= sMsg;
160 	return sMsg;
161 }
162 
163 void SAL_CALL
setInputMessage(const::rtl::OUString & _inputmessage)164 ScVbaValidation::setInputMessage( const ::rtl::OUString& _inputmessage ) throw (uno::RuntimeException)
165 {
166 	uno::Reference< beans::XPropertySet > xProps( lcl_getValidationProps( m_xRange ) );
167 	xProps->setPropertyValue( INPUTMESS, uno::makeAny( _inputmessage ) );
168 	lcl_setValidationProps( m_xRange, xProps );
169 }
170 
171 ::rtl::OUString SAL_CALL
getInputTitle()172 ScVbaValidation::getInputTitle() throw (uno::RuntimeException)
173 {
174 	uno::Reference< beans::XPropertySet > xProps = lcl_getValidationProps( m_xRange );
175 	rtl::OUString sString;
176 	xProps->getPropertyValue( INPUTTITLE )  >>= sString;
177 	return sString;
178 }
179 
180 void SAL_CALL
setInputTitle(const::rtl::OUString & _inputtitle)181 ScVbaValidation::setInputTitle( const ::rtl::OUString& _inputtitle ) throw (uno::RuntimeException)
182 {
183 	uno::Reference< beans::XPropertySet > xProps( lcl_getValidationProps( m_xRange ) );
184 	xProps->setPropertyValue( INPUTTITLE, uno::makeAny( _inputtitle ) );
185 	lcl_setValidationProps( m_xRange, xProps );
186 }
187 
188 ::rtl::OUString SAL_CALL
getErrorMessage()189 ScVbaValidation::getErrorMessage() throw (uno::RuntimeException)
190 {
191 	uno::Reference< beans::XPropertySet > xProps = lcl_getValidationProps( m_xRange );
192 	rtl::OUString sString;
193 	xProps->getPropertyValue( ERRORMESS )  >>= sString;
194 	return sString;
195 }
196 
197 void SAL_CALL
setErrorMessage(const::rtl::OUString & _errormessage)198 ScVbaValidation::setErrorMessage( const ::rtl::OUString& _errormessage ) throw (uno::RuntimeException)
199 {
200 	uno::Reference< beans::XPropertySet > xProps( lcl_getValidationProps( m_xRange ) );
201 	xProps->setPropertyValue( ERRORMESS, uno::makeAny( _errormessage ) );
202 	lcl_setValidationProps( m_xRange, xProps );
203 }
204 
205 
206 void SAL_CALL
Delete()207 ScVbaValidation::Delete(  ) throw (uno::RuntimeException)
208 {
209 	rtl::OUString sBlank;
210 	uno::Reference< beans::XPropertySet > xProps( lcl_getValidationProps( m_xRange ) );
211 	uno::Reference< sheet::XSheetCondition > xCond( xProps, uno::UNO_QUERY_THROW );
212 	xProps->setPropertyValue( IGNOREBLANK, uno::makeAny( sal_True ) );
213 	xProps->setPropertyValue( SHOWINPUT, uno::makeAny( sal_True ) );
214 	xProps->setPropertyValue( SHOWERROR, uno::makeAny( sal_True ) );
215 	xProps->setPropertyValue( ERRORTITLE, uno::makeAny( sBlank ) );
216 	xProps->setPropertyValue( INPUTMESS, uno::makeAny( sBlank) );
217 	xProps->setPropertyValue( ALERTSTYLE, uno::makeAny( sheet::ValidationAlertStyle_STOP) );
218 	xProps->setPropertyValue( STYPE, uno::makeAny( sheet::ValidationType_ANY ) );
219 	xCond->setFormula1( sBlank );
220 	xCond->setFormula2( sBlank );
221 	xCond->setOperator( sheet::ConditionOperator_NONE );
222 
223 	lcl_setValidationProps( m_xRange, xProps );
224 }
225 void SAL_CALL
Add(const uno::Any & Type,const uno::Any & AlertStyle,const uno::Any & Operator,const uno::Any & Formula1,const uno::Any & Formula2)226 ScVbaValidation::Add( const uno::Any& Type, const uno::Any& AlertStyle, const uno::Any& Operator, const uno::Any& Formula1, const uno::Any& Formula2 ) throw (uno::RuntimeException)
227 {
228 	uno::Reference< beans::XPropertySet > xProps( lcl_getValidationProps( m_xRange ) );
229 	uno::Reference< sheet::XSheetCondition > xCond( xProps, uno::UNO_QUERY_THROW );
230 
231 	sheet::ValidationType nValType = sheet::ValidationType_ANY;
232 	xProps->getPropertyValue( STYPE )  >>= nValType;
233 	if ( nValType  != sheet::ValidationType_ANY  )
234 		throw uno::RuntimeException( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "validation object already exists" ) ), uno::Reference< uno::XInterface >() );
235 	sal_Int32 nType = -1;
236 	if ( !Type.hasValue()  || !( Type >>= nType ) )
237 		throw uno::RuntimeException( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "missing required param" ) ), uno::Reference< uno::XInterface >() );
238 
239 	Delete(); // set up defaults
240 	rtl::OUString sFormula1;
241 	Formula1 >>= sFormula1;
242 	rtl::OUString sFormula2;
243 	Formula2 >>= sFormula2;
244 	switch ( nType )
245 	{
246 		case excel::XlDVType::xlValidateList:
247 			{
248 				// for validate list
249 				// at least formula1 is required
250 				if ( !Formula1.hasValue() )
251 					throw uno::RuntimeException( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "missing param" ) ), uno::Reference< uno::XInterface >() );
252 				nValType = sheet::ValidationType_LIST;
253 				xProps->setPropertyValue( STYPE, uno::makeAny(nValType ));
254 				// #TODO validate required params
255 				// #TODO need to correct the ';' delimited formula on get/set
256 				break;
257 			}
258 		case excel::XlDVType::xlValidateWholeNumber:
259 			nValType = sheet::ValidationType_WHOLE;
260 			xProps->setPropertyValue( STYPE, uno::makeAny(nValType ));
261 			break;
262 		default:
263 			throw uno::RuntimeException( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "unsupported operation..." ) ), uno::Reference< uno::XInterface >() );
264 	}
265 
266 	sheet::ValidationAlertStyle eStyle = sheet::ValidationAlertStyle_STOP;
267 	sal_Int32 nVbaAlertStyle = excel::XlDVAlertStyle::xlValidAlertStop;
268 	if ( AlertStyle.hasValue() && ( AlertStyle >>= nVbaAlertStyle ) )
269 	{
270 		switch( nVbaAlertStyle )
271 		{
272 			case excel::XlDVAlertStyle::xlValidAlertStop:
273 				// yes I know it's already defaulted but safer to assume
274 				// someone propbably could change the code above
275 				eStyle = sheet::ValidationAlertStyle_STOP;
276 				break;
277 			case excel::XlDVAlertStyle::xlValidAlertWarning:
278 				eStyle = sheet::ValidationAlertStyle_WARNING;
279 				break;
280 			case excel::XlDVAlertStyle::xlValidAlertInformation:
281 				eStyle = sheet::ValidationAlertStyle_INFO;
282 				break;
283 			default:
284 			throw uno::RuntimeException( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "bad param..." ) ), uno::Reference< uno::XInterface >() );
285 
286 		}
287 	}
288 
289 	xProps->setPropertyValue( ALERTSTYLE, uno::makeAny( eStyle ) );
290 
291 	//#i108860: fix the defect that validation cannot work when the input should be limited between a lower bound and an upper bound
292 	if ( Operator.hasValue() )
293 	{
294 		css::sheet::ConditionOperator conOperator = ScVbaFormatCondition::retrieveAPIOperator( Operator );
295 		xCond->setOperator( conOperator );
296 	}	//#ii108860
297 
298 	if ( sFormula1.getLength() )
299 		xCond->setFormula1( sFormula1 );
300 	if ( sFormula2.getLength() )
301 		xCond->setFormula2( sFormula2 );
302 
303 	lcl_setValidationProps( m_xRange, xProps );
304 }
305 
306 ::rtl::OUString SAL_CALL
getFormula1()307 ScVbaValidation::getFormula1() throw (uno::RuntimeException)
308 {
309 	uno::Reference< sheet::XSheetCondition > xCond( lcl_getValidationProps( m_xRange ), uno::UNO_QUERY_THROW );
310 	return xCond->getFormula1();
311 }
312 
313 ::rtl::OUString SAL_CALL
getFormula2()314 ScVbaValidation::getFormula2() throw (uno::RuntimeException)
315 {
316 		uno::Reference< sheet::XSheetCondition > xCond( lcl_getValidationProps( m_xRange ), uno::UNO_QUERY_THROW );
317 	return xCond->getFormula2();
318 }
319 
320 rtl::OUString&
getServiceImplName()321 ScVbaValidation::getServiceImplName()
322 {
323 	static rtl::OUString sImplName( RTL_CONSTASCII_USTRINGPARAM("ScVbaValidation") );
324 	return sImplName;
325 }
326 
327 uno::Sequence< rtl::OUString >
getServiceNames()328 ScVbaValidation::getServiceNames()
329 {
330 	static uno::Sequence< rtl::OUString > aServiceNames;
331 	if ( aServiceNames.getLength() == 0 )
332 	{
333 		aServiceNames.realloc( 1 );
334 		aServiceNames[ 0 ] = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("ooo.vba.excel.Validation" ) );
335 	}
336 	return aServiceNames;
337 }
338