1 /************************************************************************* 2 * 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * Copyright 2000, 2010 Oracle and/or its affiliates. 6 * 7 * OpenOffice.org - a multi-platform office productivity suite 8 * 9 * This file is part of OpenOffice.org. 10 * 11 * OpenOffice.org is free software: you can redistribute it and/or modify 12 * it under the terms of the GNU Lesser General Public License version 3 13 * only, as published by the Free Software Foundation. 14 * 15 * OpenOffice.org is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU Lesser General Public License version 3 for more details 19 * (a copy is included in the LICENSE file that accompanied this code). 20 * 21 * You should have received a copy of the GNU Lesser General Public License 22 * version 3 along with OpenOffice.org. If not, see 23 * <http://www.openoffice.org/license.html> 24 * for a copy of the LGPLv3 License. 25 * 26 ************************************************************************/ 27 28 // MARKER(update_precomp.py): autogen include statement, do not remove 29 #include "precompiled_forms.hxx" 30 31 #include "Pattern.hxx" 32 33 /** === begin UNO includes === **/ 34 /** === end UNO includes === **/ 35 36 //......................................................................... 37 namespace frm 38 { 39 //......................................................................... 40 41 /** === begin UNO using === **/ 42 using ::com::sun::star::uno::Reference; 43 using ::com::sun::star::lang::XMultiServiceFactory; 44 using ::com::sun::star::uno::Sequence; 45 using ::com::sun::star::uno::Type; 46 using ::com::sun::star::beans::Property; 47 using ::com::sun::star::uno::Exception; 48 using ::com::sun::star::uno::XInterface; 49 using ::com::sun::star::uno::Any; 50 using ::com::sun::star::uno::makeAny; 51 using ::com::sun::star::sdbc::XRowSet; 52 using ::com::sun::star::uno::UNO_QUERY; 53 /** === end UNO using === **/ 54 namespace FormComponentType = ::com::sun::star::form::FormComponentType; 55 56 //================================================================== 57 // OPatternControl 58 //================================================================== 59 //------------------------------------------------------------------ 60 OPatternControl::OPatternControl(const Reference<XMultiServiceFactory>& _rxFactory) 61 :OBoundControl(_rxFactory, VCL_CONTROL_PATTERNFIELD) 62 { 63 } 64 65 //------------------------------------------------------------------ 66 InterfaceRef SAL_CALL OPatternControl_CreateInstance(const Reference<XMultiServiceFactory>& _rxFactory) 67 { 68 return *(new OPatternControl(_rxFactory)); 69 } 70 71 //------------------------------------------------------------------------------ 72 Sequence<Type> OPatternControl::_getTypes() 73 { 74 return OBoundControl::_getTypes(); 75 } 76 77 //------------------------------------------------------------------------------ 78 StringSequence OPatternControl::getSupportedServiceNames() throw() 79 { 80 StringSequence aSupported = OBoundControl::getSupportedServiceNames(); 81 aSupported.realloc(aSupported.getLength() + 1); 82 83 ::rtl::OUString*pArray = aSupported.getArray(); 84 pArray[aSupported.getLength()-1] = FRM_SUN_CONTROL_PATTERNFIELD; 85 return aSupported; 86 } 87 88 //================================================================== 89 // OPatternModel 90 //================================================================== 91 //------------------------------------------------------------------ 92 InterfaceRef SAL_CALL OPatternModel_CreateInstance(const Reference<XMultiServiceFactory>& _rxFactory) 93 { 94 return *(new OPatternModel(_rxFactory)); 95 } 96 97 //------------------------------------------------------------------------------ 98 Sequence<Type> OPatternModel::_getTypes() 99 { 100 return OEditBaseModel::_getTypes(); 101 } 102 103 //------------------------------------------------------------------ 104 DBG_NAME( OPatternModel ) 105 //------------------------------------------------------------------ 106 OPatternModel::OPatternModel(const Reference<XMultiServiceFactory>& _rxFactory) 107 :OEditBaseModel( _rxFactory, VCL_CONTROLMODEL_PATTERNFIELD, FRM_SUN_CONTROL_PATTERNFIELD, sal_False, sal_False ) 108 // use the old control name for compytibility reasons 109 { 110 DBG_CTOR( OPatternModel, NULL ); 111 112 m_nClassId = FormComponentType::PATTERNFIELD; 113 initValueProperty( PROPERTY_TEXT, PROPERTY_ID_TEXT ); 114 } 115 116 //------------------------------------------------------------------ 117 OPatternModel::OPatternModel( const OPatternModel* _pOriginal, const Reference<XMultiServiceFactory>& _rxFactory ) 118 :OEditBaseModel( _pOriginal, _rxFactory ) 119 { 120 DBG_CTOR( OPatternModel, NULL ); 121 } 122 123 //------------------------------------------------------------------ 124 OPatternModel::~OPatternModel() 125 { 126 DBG_DTOR( OPatternModel, NULL ); 127 } 128 129 // XCloneable 130 //------------------------------------------------------------------------------ 131 IMPLEMENT_DEFAULT_CLONING( OPatternModel ) 132 133 // XServiceInfo 134 //------------------------------------------------------------------------------ 135 StringSequence SAL_CALL OPatternModel::getSupportedServiceNames() throw() 136 { 137 StringSequence aSupported = OBoundControlModel::getSupportedServiceNames(); 138 aSupported.realloc(aSupported.getLength() + 2); 139 140 ::rtl::OUString*pArray = aSupported.getArray(); 141 pArray[aSupported.getLength()-2] = FRM_SUN_COMPONENT_DATABASE_PATTERNFIELD; 142 pArray[aSupported.getLength()-1] = FRM_SUN_COMPONENT_PATTERNFIELD; 143 return aSupported; 144 } 145 146 147 //------------------------------------------------------------------------------ 148 void OPatternModel::describeFixedProperties( Sequence< Property >& _rProps ) const 149 { 150 BEGIN_DESCRIBE_PROPERTIES( 4, OEditBaseModel ) 151 DECL_PROP2(DEFAULT_TEXT, ::rtl::OUString, BOUND, MAYBEDEFAULT); 152 DECL_BOOL_PROP1(EMPTY_IS_NULL, BOUND); 153 DECL_PROP1(TABINDEX, sal_Int16, BOUND); 154 DECL_PROP2(FILTERPROPOSAL, sal_Bool, BOUND, MAYBEDEFAULT); 155 END_DESCRIBE_PROPERTIES(); 156 } 157 158 //------------------------------------------------------------------------------ 159 ::rtl::OUString SAL_CALL OPatternModel::getServiceName() throw ( ::com::sun::star::uno::RuntimeException) 160 { 161 return FRM_COMPONENT_PATTERNFIELD; // old (non-sun) name for compatibility ! 162 } 163 164 //------------------------------------------------------------------------------ 165 sal_Bool OPatternModel::commitControlValueToDbColumn( bool /*_bPostReset*/ ) 166 { 167 Any aNewValue( m_xAggregateFastSet->getFastPropertyValue( getValuePropertyAggHandle() ) ); 168 169 if ( aNewValue != m_aLastKnownValue ) 170 { 171 ::rtl::OUString sNewValue; 172 aNewValue >>= sNewValue; 173 174 if ( !aNewValue.hasValue() 175 || ( !sNewValue.getLength() // an empty string 176 && m_bEmptyIsNull // which should be interpreted as NULL 177 ) 178 ) 179 { 180 m_xColumnUpdate->updateNull(); 181 } 182 else 183 { 184 OSL_ENSURE( m_pFormattedValue.get(), "OPatternModel::commitControlValueToDbColumn: no value helper!" ); 185 if ( !m_pFormattedValue.get() ) 186 return sal_False; 187 188 if ( !m_pFormattedValue->setFormattedValue( sNewValue ) ) 189 return sal_False; 190 } 191 192 m_aLastKnownValue = aNewValue; 193 } 194 195 return sal_True; 196 } 197 198 //------------------------------------------------------------------------------ 199 void OPatternModel::onConnectedDbColumn( const Reference< XInterface >& _rxForm ) 200 { 201 OEditBaseModel::onConnectedDbColumn( _rxForm ); 202 203 Reference< XPropertySet > xField( getField() ); 204 if ( !xField.is() ) 205 return; 206 207 m_pFormattedValue.reset( new ::dbtools::FormattedColumnValue( getContext(), Reference< XRowSet >( _rxForm, UNO_QUERY ), xField ) ); 208 } 209 210 //------------------------------------------------------------------------------ 211 void OPatternModel::onDisconnectedDbColumn() 212 { 213 OEditBaseModel::onDisconnectedDbColumn(); 214 m_pFormattedValue.reset(); 215 } 216 217 // XPropertyChangeListener 218 //------------------------------------------------------------------------------ 219 Any OPatternModel::translateDbColumnToControlValue() 220 { 221 OSL_PRECOND( m_pFormattedValue.get(), "OPatternModel::translateDbColumnToControlValue: no value helper!" ); 222 223 if ( m_pFormattedValue.get() ) 224 { 225 ::rtl::OUString sValue( m_pFormattedValue->getFormattedValue() ); 226 if ( !sValue.getLength() 227 && m_pFormattedValue->getColumn().is() 228 && m_pFormattedValue->getColumn()->wasNull() 229 ) 230 { 231 m_aLastKnownValue.clear(); 232 } 233 else 234 { 235 m_aLastKnownValue <<= sValue; 236 } 237 } 238 else 239 m_aLastKnownValue.clear(); 240 241 return m_aLastKnownValue.hasValue() ? m_aLastKnownValue : makeAny( ::rtl::OUString() ); 242 // (m_aLastKnownValue is alllowed to be VOID, the control value isn't) 243 } 244 245 // XReset 246 //------------------------------------------------------------------------------ 247 Any OPatternModel::getDefaultForReset() const 248 { 249 return makeAny( m_aDefaultText ); 250 } 251 252 //------------------------------------------------------------------------------ 253 void OPatternModel::resetNoBroadcast() 254 { 255 OEditBaseModel::resetNoBroadcast(); 256 m_aLastKnownValue.clear(); 257 } 258 259 //......................................................................... 260 } // namespace frm 261 //......................................................................... 262 263