xref: /trunk/main/forms/source/component/CheckBox.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
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 #include "CheckBox.hxx"
31 #include "property.hxx"
32 #ifndef _FRM_PROPERTY_HRC_
33 #include "property.hrc"
34 #endif
35 #include "services.hxx"
36 #include <tools/debug.hxx>
37 #include <comphelper/basicio.hxx>
38 
39 //.........................................................................
40 namespace frm
41 {
42 using namespace ::com::sun::star::uno;
43 using namespace ::com::sun::star::sdb;
44 using namespace ::com::sun::star::sdbc;
45 using namespace ::com::sun::star::sdbcx;
46 using namespace ::com::sun::star::beans;
47 using namespace ::com::sun::star::container;
48 using namespace ::com::sun::star::form;
49 using namespace ::com::sun::star::awt;
50 using namespace ::com::sun::star::io;
51 using namespace ::com::sun::star::lang;
52 using namespace ::com::sun::star::util;
53 using namespace ::com::sun::star::form::binding;
54 
55 //==================================================================
56 //= OCheckBoxControl
57 //==================================================================
58 
59 //------------------------------------------------------------------
60 OCheckBoxControl::OCheckBoxControl(const Reference<XMultiServiceFactory>& _rxFactory)
61     :OBoundControl(_rxFactory, VCL_CONTROL_CHECKBOX)
62 {
63 }
64 
65 //------------------------------------------------------------------
66 InterfaceRef SAL_CALL OCheckBoxControl_CreateInstance(const Reference<XMultiServiceFactory>& _rxFactory) throw (RuntimeException)
67 {
68     return *(new OCheckBoxControl(_rxFactory));
69 }
70 
71 //------------------------------------------------------------------------------
72 StringSequence SAL_CALL OCheckBoxControl::getSupportedServiceNames() throw(::com::sun::star::uno::RuntimeException)
73 {
74     StringSequence aSupported = OBoundControl::getSupportedServiceNames();
75     aSupported.realloc(aSupported.getLength() + 1);
76 
77     ::rtl::OUString* pArray = aSupported.getArray();
78     pArray[aSupported.getLength()-1] = FRM_SUN_CONTROL_CHECKBOX;
79     return aSupported;
80 }
81 
82 //==================================================================
83 //= OCheckBoxModel
84 //==================================================================
85 
86 //==================================================================
87 InterfaceRef SAL_CALL OCheckBoxModel_CreateInstance(const Reference<XMultiServiceFactory>& _rxFactory) throw (RuntimeException)
88 {
89     return *(new OCheckBoxModel(_rxFactory));
90 }
91 
92 //------------------------------------------------------------------
93 DBG_NAME( OCheckBoxModel )
94 //------------------------------------------------------------------
95 OCheckBoxModel::OCheckBoxModel(const Reference<XMultiServiceFactory>& _rxFactory)
96     :OReferenceValueComponent( _rxFactory, VCL_CONTROLMODEL_CHECKBOX, FRM_SUN_CONTROL_CHECKBOX, sal_True )
97                     // use the old control name for compytibility reasons
98 {
99     DBG_CTOR( OCheckBoxModel, NULL );
100 
101     m_nClassId = FormComponentType::CHECKBOX;
102     initValueProperty( PROPERTY_STATE, PROPERTY_ID_STATE );
103 }
104 
105 //------------------------------------------------------------------
106 OCheckBoxModel::OCheckBoxModel( const OCheckBoxModel* _pOriginal, const Reference<XMultiServiceFactory>& _rxFactory )
107     :OReferenceValueComponent( _pOriginal, _rxFactory )
108 {
109     DBG_CTOR( OCheckBoxModel, NULL );
110 }
111 
112 //------------------------------------------------------------------------------
113 OCheckBoxModel::~OCheckBoxModel()
114 {
115     DBG_DTOR( OCheckBoxModel, NULL );
116 }
117 
118 //------------------------------------------------------------------------------
119 IMPLEMENT_DEFAULT_CLONING( OCheckBoxModel )
120 
121 // XServiceInfo
122 //------------------------------------------------------------------------------
123 StringSequence SAL_CALL OCheckBoxModel::getSupportedServiceNames() throw(::com::sun::star::uno::RuntimeException)
124 {
125     StringSequence aSupported = OReferenceValueComponent::getSupportedServiceNames();
126 
127     sal_Int32 nOldLen = aSupported.getLength();
128     aSupported.realloc( nOldLen + 8 );
129     ::rtl::OUString* pStoreTo = aSupported.getArray() + nOldLen;
130 
131     *pStoreTo++ = BINDABLE_CONTROL_MODEL;
132     *pStoreTo++ = DATA_AWARE_CONTROL_MODEL;
133     *pStoreTo++ = VALIDATABLE_CONTROL_MODEL;
134 
135     *pStoreTo++ = BINDABLE_DATA_AWARE_CONTROL_MODEL;
136     *pStoreTo++ = VALIDATABLE_BINDABLE_CONTROL_MODEL;
137 
138     *pStoreTo++ = FRM_SUN_COMPONENT_CHECKBOX;
139     *pStoreTo++ = FRM_SUN_COMPONENT_DATABASE_CHECKBOX;
140     *pStoreTo++ = BINDABLE_DATABASE_CHECK_BOX;
141 
142     return aSupported;
143 }
144 
145 //------------------------------------------------------------------------------
146 void OCheckBoxModel::describeFixedProperties( Sequence< Property >& _rProps ) const
147 {
148     BEGIN_DESCRIBE_PROPERTIES( 1, OReferenceValueComponent )
149         DECL_PROP1(TABINDEX,        sal_Int16,          BOUND);
150     END_DESCRIBE_PROPERTIES();
151 }
152 
153 //------------------------------------------------------------------------------
154 ::rtl::OUString SAL_CALL OCheckBoxModel::getServiceName() throw(RuntimeException)
155 {
156     return FRM_COMPONENT_CHECKBOX;  // old (non-sun) name for compatibility !
157 }
158 
159 //------------------------------------------------------------------------------
160 void SAL_CALL OCheckBoxModel::write(const Reference<stario::XObjectOutputStream>& _rxOutStream)
161     throw(stario::IOException, RuntimeException)
162 {
163     OReferenceValueComponent::write(_rxOutStream);
164 
165     // Version
166     _rxOutStream->writeShort(0x0003);
167     // Properties
168     _rxOutStream << getReferenceValue();
169     _rxOutStream << (sal_Int16)getDefaultChecked();
170     writeHelpTextCompatibly(_rxOutStream);
171     // from version 0x0003 : common properties
172     writeCommonProperties(_rxOutStream);
173 }
174 
175 //------------------------------------------------------------------------------
176 void SAL_CALL OCheckBoxModel::read(const Reference<stario::XObjectInputStream>& _rxInStream) throw(stario::IOException, RuntimeException)
177 {
178     OReferenceValueComponent::read(_rxInStream);
179     osl::MutexGuard aGuard(m_aMutex);
180 
181     // Version
182     sal_uInt16 nVersion = _rxInStream->readShort();
183 
184     ::rtl::OUString sReferenceValue;
185     sal_Int16       nDefaultChecked( 0 );
186     switch ( nVersion )
187     {
188         case 0x0001:
189             _rxInStream >> sReferenceValue;
190             nDefaultChecked = _rxInStream->readShort();
191             break;
192         case 0x0002:
193             _rxInStream >> sReferenceValue;
194             _rxInStream >> nDefaultChecked;
195             readHelpTextCompatibly( _rxInStream );
196             break;
197         case 0x0003:
198             _rxInStream >> sReferenceValue;
199             _rxInStream >> nDefaultChecked;
200             readHelpTextCompatibly(_rxInStream);
201             readCommonProperties(_rxInStream);
202             break;
203         default:
204             DBG_ERROR("OCheckBoxModel::read : unknown version !");
205             defaultCommonProperties();
206             break;
207     }
208     setReferenceValue( sReferenceValue );
209     setDefaultChecked( static_cast< ToggleState >( nDefaultChecked ) );
210 
211     // Nach dem Lesen die Defaultwerte anzeigen
212     if ( getControlSource().getLength() )
213         // (not if we don't have a control source - the "State" property acts like it is persistent, then
214         resetNoBroadcast();
215 }
216 
217 //------------------------------------------------------------------------------
218 Any OCheckBoxModel::translateDbColumnToControlValue()
219 {
220     Any aValue;
221 
222     //////////////////////////////////////////////////////////////////
223     // Wert an ControlModel setzen
224     sal_Bool bValue = m_xColumn->getBoolean();
225     if ( m_xColumn->wasNull() )
226     {
227         sal_Bool bTriState = sal_True;
228         if ( m_xAggregateSet.is() )
229             m_xAggregateSet->getPropertyValue( PROPERTY_TRISTATE ) >>= bTriState;
230         aValue <<= (sal_Int16)( bTriState ? STATE_DONTKNOW : getDefaultChecked() );
231     }
232     else
233         aValue <<= (sal_Int16)( bValue ? STATE_CHECK : STATE_NOCHECK );
234 
235     return aValue;
236 }
237 
238 //-----------------------------------------------------------------------------
239 sal_Bool OCheckBoxModel::commitControlValueToDbColumn( bool /*_bPostReset*/ )
240 {
241     OSL_PRECOND( m_xColumnUpdate.is(), "OCheckBoxModel::commitControlValueToDbColumn: not bound!" );
242     if ( m_xColumnUpdate.is() )
243     {
244         Any aControlValue( m_xAggregateSet->getPropertyValue( PROPERTY_STATE ) );
245         try
246         {
247             sal_Int16 nValue = STATE_DONTKNOW;
248             aControlValue >>= nValue;
249             switch (nValue)
250             {
251                 case STATE_DONTKNOW:
252                     m_xColumnUpdate->updateNull();
253                     break;
254                 case STATE_CHECK:
255                     m_xColumnUpdate->updateBoolean( sal_True );
256                     break;
257                 case STATE_NOCHECK:
258                     m_xColumnUpdate->updateBoolean( sal_False );
259                     break;
260                 default:
261                     DBG_ERROR("OCheckBoxModel::commitControlValueToDbColumn: invalid value !");
262             }
263         }
264         catch(Exception&)
265         {
266             DBG_ERROR("OCheckBoxModel::commitControlValueToDbColumn: could not commit !");
267         }
268     }
269     return sal_True;
270 }
271 
272 //.........................................................................
273 }
274 //.........................................................................
275 
276