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 "vbaformatcondition.hxx" 24 #include "vbaformatconditions.hxx" 25 #include <ooo/vba/excel/XlFormatConditionType.hpp> 26 27 using namespace ::ooo::vba; 28 using namespace ::com::sun::star; 29 30 ScVbaFormatConditions* 31 lcl_getScVbaFormatConditionsPtr( const uno::Reference< excel::XFormatConditions >& xFormatConditions ) throw ( script::BasicErrorException ) 32 { 33 ScVbaFormatConditions* pFormatConditions = static_cast< ScVbaFormatConditions* >( xFormatConditions.get() ); 34 if ( !pFormatConditions ) 35 DebugHelper::exception(SbERR_METHOD_FAILED, rtl::OUString() ); 36 return pFormatConditions; 37 } 38 ScVbaFormatCondition::ScVbaFormatCondition( const uno::Reference< XHelperInterface >& xParent, const uno::Reference< uno::XComponentContext > & xContext, const uno::Reference< sheet::XSheetConditionalEntry >& _xSheetConditionalEntry, const uno::Reference< excel::XStyle >& _xStyle, const uno::Reference< excel::XFormatConditions >& _xFormatConditions, const uno::Reference< css::beans::XPropertySet >& _xPropertySet ) throw ( css::uno::RuntimeException ) : ScVbaFormatCondition_BASE( xParent, xContext, uno::Reference< sheet::XSheetCondition >( _xSheetConditionalEntry, css::uno::UNO_QUERY_THROW ) ), moFormatConditions( _xFormatConditions ), mxStyle( _xStyle ), mxParentRangePropertySet( _xPropertySet ) 39 { 40 mxSheetConditionalEntries = lcl_getScVbaFormatConditionsPtr( moFormatConditions )->getSheetConditionalEntries(); 41 42 mxSheetConditionalEntry = _xSheetConditionalEntry; 43 msStyleName = mxStyle->getName(); 44 } 45 46 47 void SAL_CALL 48 ScVbaFormatCondition::Delete( ) throw (script::BasicErrorException, uno::RuntimeException) 49 { 50 ScVbaFormatConditions* pFormatConditions = lcl_getScVbaFormatConditionsPtr( moFormatConditions ); 51 pFormatConditions->removeFormatCondition(msStyleName, sal_True); 52 notifyRange(); 53 } 54 55 void SAL_CALL 56 ScVbaFormatCondition::Modify( ::sal_Int32 _nType, const uno::Any& _aOperator, const uno::Any& _aFormula1, const uno::Any& _aFormula2 ) throw (script::BasicErrorException, uno::RuntimeException) 57 { 58 try 59 { 60 ScVbaFormatConditions* pFormatConditions = lcl_getScVbaFormatConditionsPtr( moFormatConditions ); 61 pFormatConditions->removeFormatCondition(msStyleName, sal_False); 62 pFormatConditions->Add(_nType, _aOperator, _aFormula1, _aFormula2, mxStyle); 63 } 64 catch (uno::Exception& ) 65 { 66 DebugHelper::exception(SbERR_METHOD_FAILED, rtl::OUString() ); 67 } 68 } 69 70 uno::Reference< excel::XInterior > SAL_CALL 71 ScVbaFormatCondition::Interior( ) throw (script::BasicErrorException, uno::RuntimeException) 72 { 73 return mxStyle->Interior(); 74 } 75 76 uno::Reference< excel::XFont > SAL_CALL 77 ScVbaFormatCondition::Font( ) throw (script::BasicErrorException, uno::RuntimeException) 78 { 79 return mxStyle->Font(); 80 } 81 uno::Any SAL_CALL 82 ScVbaFormatCondition::Borders( const uno::Any& Index ) throw (script::BasicErrorException, uno::RuntimeException) 83 { return mxStyle->Borders( Index ); 84 } 85 86 sheet::ConditionOperator 87 ScVbaFormatCondition::retrieveAPIType(sal_Int32 _nVBAType, const uno::Reference< sheet::XSheetCondition >& _xSheetCondition ) throw ( script::BasicErrorException ) 88 { 89 sheet::ConditionOperator aAPIType = sheet::ConditionOperator_NONE; 90 switch (_nVBAType) 91 { 92 case excel::XlFormatConditionType::xlExpression: 93 aAPIType = sheet::ConditionOperator_FORMULA; 94 break; 95 case excel::XlFormatConditionType::xlCellValue: 96 if ( _xSheetCondition.is() && (_xSheetCondition->getOperator() == sheet::ConditionOperator_FORMULA ) ) 97 aAPIType = sheet::ConditionOperator_NONE; 98 break; 99 default: 100 DebugHelper::exception(SbERR_METHOD_FAILED, rtl::OUString() ); 101 } 102 return aAPIType; 103 } 104 105 void 106 ScVbaFormatCondition::setFormula1( const uno::Any& _aFormula1) throw ( script::BasicErrorException ) 107 { 108 // getA1Formula *SHOULD* detect whether the formula is r1c1 or A1 syntax 109 // and if R1C1 convert to A1 110 ScVbaFormatCondition_BASE::setFormula1( uno::makeAny( lcl_getScVbaFormatConditionsPtr( moFormatConditions )->getA1Formula(_aFormula1) ) ); 111 } 112 113 void 114 ScVbaFormatCondition::setFormula2( const uno::Any& _aFormula2) throw ( script::BasicErrorException ) 115 { 116 ScVbaFormatCondition_BASE::setFormula1( uno::makeAny( lcl_getScVbaFormatConditionsPtr( moFormatConditions )->getA1Formula(_aFormula2)) ); 117 } 118 119 ::sal_Int32 SAL_CALL 120 ScVbaFormatCondition::Type( ) throw ( script::BasicErrorException, uno::RuntimeException ) 121 { 122 sal_Int32 nReturnType = 0; 123 if ( mxSheetCondition->getOperator() == sheet::ConditionOperator_FORMULA) 124 nReturnType = excel::XlFormatConditionType::xlExpression; 125 else 126 nReturnType = excel::XlFormatConditionType::xlCellValue; 127 return nReturnType; 128 } 129 130 131 ::sal_Int32 132 ScVbaFormatCondition::Operator( sal_Bool bVal ) throw (script::BasicErrorException ) 133 { 134 return ScVbaFormatCondition_BASE::Operator( bVal ); 135 } 136 ::sal_Int32 SAL_CALL 137 ScVbaFormatCondition::Operator( ) throw (script::BasicErrorException, uno::RuntimeException) 138 { 139 return ScVbaFormatCondition_BASE::Operator( sal_True ); 140 } 141 142 void 143 ScVbaFormatCondition::notifyRange() throw ( script::BasicErrorException ) 144 { 145 try 146 { 147 mxParentRangePropertySet->setPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("ConditionalFormat") ), uno::makeAny( mxSheetConditionalEntries) ); 148 } 149 catch (uno::Exception& ) 150 { 151 DebugHelper::exception(SbERR_METHOD_FAILED, rtl::OUString() ); 152 } 153 } 154 155 rtl::OUString& 156 ScVbaFormatCondition::getServiceImplName() 157 { 158 static rtl::OUString sImplName( RTL_CONSTASCII_USTRINGPARAM("ScVbaFormatCondition") ); 159 return sImplName; 160 } 161 162 uno::Sequence< rtl::OUString > 163 ScVbaFormatCondition::getServiceNames() 164 { 165 static uno::Sequence< rtl::OUString > aServiceNames; 166 if ( aServiceNames.getLength() == 0 ) 167 { 168 aServiceNames.realloc( 1 ); 169 aServiceNames[ 0 ] = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("ooo.vba.excel.FormatCondition" ) ); 170 } 171 return aServiceNames; 172 } 173