xref: /AOO41X/main/sc/source/ui/vba/vbavalidation.cxx (revision f4553f15e560e0ff9e7a9a7df7cae27c9d0eac9b)
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