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