xref: /trunk/main/sc/source/ui/vba/vbacondition.cxx (revision b3f79822)
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 #include "vbacondition.hxx"
25 #include <ooo/vba/excel/XlFormatConditionOperator.hpp>
26 #include <ooo/vba/excel/XFormatCondition.hpp>
27 #include <com/sun/star/table/XCellRange.hpp>
28 #include <com/sun/star/sheet/XCellRangeAddressable.hpp>
29 
30 using namespace ::ooo::vba;
31 using namespace ::com::sun::star;
32 
33 const sal_Int32 ISFORMULA = 98765432;
34 
35 template< typename Ifc1 >
ScVbaCondition(const uno::Reference<XHelperInterface> & xParent,const uno::Reference<uno::XComponentContext> & xContext,const uno::Reference<sheet::XSheetCondition> & _xSheetCondition)36 ScVbaCondition< Ifc1 >::ScVbaCondition(  const uno::Reference< XHelperInterface >& xParent, const uno::Reference< uno::XComponentContext > & xContext, const uno::Reference< sheet::XSheetCondition >& _xSheetCondition ) : ScVbaCondition_BASE( xParent, xContext ), mxSheetCondition( _xSheetCondition )
37 {
38 	mxAddressable.set( xParent, uno::UNO_QUERY_THROW );
39 }
40 
41 template< typename Ifc1 >
42 sheet::ConditionOperator
retrieveAPIOperator(const uno::Any & _aOperator)43 ScVbaCondition< Ifc1 >::retrieveAPIOperator( const uno::Any& _aOperator) throw ( script::BasicErrorException )
44 {
45 	sheet::ConditionOperator aRetAPIOperator = sheet::ConditionOperator_NONE;
46 	sal_Int32 nOperator = 0;
47 	if ( (_aOperator >>= nOperator ) )
48 	{
49 		switch(nOperator)
50 		{
51 			case excel::XlFormatConditionOperator::xlBetween:
52 				aRetAPIOperator = sheet::ConditionOperator_BETWEEN;
53 				break;
54 			case  excel::XlFormatConditionOperator::xlNotBetween:
55 				aRetAPIOperator = sheet::ConditionOperator_NOT_BETWEEN;
56 				break;
57 			case excel::XlFormatConditionOperator::xlEqual:
58 				aRetAPIOperator = sheet::ConditionOperator_EQUAL;
59 				break;
60 			case excel::XlFormatConditionOperator::xlNotEqual:
61 				aRetAPIOperator = sheet::ConditionOperator_NOT_EQUAL;
62 				break;
63 			case excel::XlFormatConditionOperator::xlGreater:
64 				aRetAPIOperator = sheet::ConditionOperator_GREATER;
65 				break;
66 			case excel::XlFormatConditionOperator::xlLess:
67 				aRetAPIOperator = sheet::ConditionOperator_LESS;
68 				break;
69 			case excel::XlFormatConditionOperator::xlGreaterEqual:
70 				aRetAPIOperator = sheet::ConditionOperator_GREATER_EQUAL;
71 				break;
72 			case excel::XlFormatConditionOperator::xlLessEqual:
73 				aRetAPIOperator = sheet::ConditionOperator_LESS_EQUAL;
74 				break;
75 			default:
76 				aRetAPIOperator = sheet::ConditionOperator_NONE;
77 				break;
78 		}
79 	}
80 	return aRetAPIOperator;
81 }
82 
83 template< typename Ifc1 >
84 rtl::OUString
Formula1()85 ScVbaCondition< Ifc1 >::Formula1( ) throw ( script::BasicErrorException, uno::RuntimeException )
86 {
87 	 return mxSheetCondition->getFormula1();
88 }
89 
90 template< typename Ifc1 >
91 rtl::OUString
Formula2()92 ScVbaCondition< Ifc1 >::Formula2( ) throw ( script::BasicErrorException, uno::RuntimeException )
93 {
94 	 return mxSheetCondition->getFormula2();
95 }
96 
97 template< typename Ifc1 >
98 void
setFormula1(const uno::Any & _aFormula1)99 ScVbaCondition< Ifc1 >::setFormula1( const uno::Any& _aFormula1) throw ( script::BasicErrorException )
100 {
101 	rtl::OUString sFormula;
102 	if ( (_aFormula1 >>= sFormula ))
103 	{
104 		mxSheetCondition->setFormula1( sFormula );
105 		table::CellRangeAddress aCellRangeAddress = mxAddressable->getRangeAddress();
106 		table::CellAddress aCellAddress( aCellRangeAddress.Sheet, aCellRangeAddress.StartColumn,  aCellRangeAddress.StartRow );
107 		mxSheetCondition->setSourcePosition(aCellAddress);
108 	}
109 }
110 
111 template< typename Ifc1 >
112 void
setFormula2(const uno::Any & _aFormula2)113 ScVbaCondition< Ifc1 >::setFormula2( const uno::Any& _aFormula2) throw ( script::BasicErrorException )
114 {
115 	rtl::OUString sFormula2;
116 	// #TODO surely this can't be right?
117 	// ( from helperapi/impl/.../calc/ConditionImpl.java
118 	if ( (_aFormula2 >>= sFormula2 ))
119 		mxSheetCondition->setFormula1(sFormula2);
120 }
121 
122 template< typename Ifc1 >
123 sal_Int32
Operator(sal_Bool _bIncludeFormulaValue)124 ScVbaCondition< Ifc1 >::Operator(sal_Bool _bIncludeFormulaValue) throw ( script::BasicErrorException )
125 {
126 	sal_Int32 retvalue = -1;
127 	sheet::ConditionOperator aConditionalOperator =  mxSheetCondition->getOperator();
128 	switch (aConditionalOperator)
129 	{
130 		case sheet::ConditionOperator_EQUAL:
131 			retvalue = excel::XlFormatConditionOperator::xlEqual;
132 			break;
133 		case sheet::ConditionOperator_NOT_EQUAL:
134 			retvalue = excel::XlFormatConditionOperator::xlNotEqual;
135 			break;
136 		case sheet::ConditionOperator_GREATER:
137 			retvalue = excel::XlFormatConditionOperator::xlGreater;
138 			break;
139 		case sheet::ConditionOperator_GREATER_EQUAL:
140 			retvalue = excel::XlFormatConditionOperator::xlGreaterEqual;
141 			break;
142 		case sheet::ConditionOperator_LESS:
143 			retvalue = excel::XlFormatConditionOperator::xlLess;
144 			break;
145 		case sheet::ConditionOperator_LESS_EQUAL:
146 			retvalue = excel::XlFormatConditionOperator::xlLessEqual;
147 			break;
148 		case sheet::ConditionOperator_BETWEEN:
149 			retvalue = excel::XlFormatConditionOperator::xlBetween;
150 			break;
151 		case sheet::ConditionOperator_NOT_BETWEEN:
152 			retvalue = excel::XlFormatConditionOperator::xlNotBetween;
153 			break;
154 		case sheet::ConditionOperator_FORMULA:
155 			if (_bIncludeFormulaValue)
156 			{
157 				//#FIXME huh what's this all about
158 				// from	helperapi/impl/.../calc/ConditionImpl
159 				retvalue = ISFORMULA;
160 				break;
161 			}
162 		case sheet::ConditionOperator_NONE:
163 		default:
164 			DebugHelper::exception(SbERR_METHOD_FAILED, rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("Operator not supported")));
165 		break;
166 	}
167 	return retvalue;
168 }
169 
170 template class ScVbaCondition< excel::XFormatCondition >;
171 
172