12a97ec55SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
32a97ec55SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
42a97ec55SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
52a97ec55SAndrew Rist  * distributed with this work for additional information
62a97ec55SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
72a97ec55SAndrew Rist  * to you under the Apache License, Version 2.0 (the
82a97ec55SAndrew Rist  * "License"); you may not use this file except in compliance
92a97ec55SAndrew Rist  * with the License.  You may obtain a copy of the License at
102a97ec55SAndrew Rist  *
112a97ec55SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
122a97ec55SAndrew Rist  *
132a97ec55SAndrew Rist  * Unless required by applicable law or agreed to in writing,
142a97ec55SAndrew Rist  * software distributed under the License is distributed on an
152a97ec55SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
162a97ec55SAndrew Rist  * KIND, either express or implied.  See the License for the
172a97ec55SAndrew Rist  * specific language governing permissions and limitations
182a97ec55SAndrew Rist  * under the License.
192a97ec55SAndrew Rist  *
202a97ec55SAndrew Rist  *************************************************************/
212a97ec55SAndrew Rist 
222a97ec55SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_extensions.hxx"
26cdf0e10cSrcweir #include "xsdvalidationpropertyhandler.hxx"
27cdf0e10cSrcweir #include "formstrings.hxx"
28cdf0e10cSrcweir #include "formmetadata.hxx"
29cdf0e10cSrcweir #include "xsddatatypes.hxx"
30cdf0e10cSrcweir #include "modulepcr.hxx"
31cdf0e10cSrcweir #include "formresid.hrc"
32cdf0e10cSrcweir #include "formlocalid.hrc"
33cdf0e10cSrcweir #include "propctrlr.hrc"
34cdf0e10cSrcweir #include "newdatatype.hxx"
35cdf0e10cSrcweir #include "xsdvalidationhelper.hxx"
36cdf0e10cSrcweir #include "pcrcommon.hxx"
37cdf0e10cSrcweir #include "handlerhelper.hxx"
38cdf0e10cSrcweir 
39cdf0e10cSrcweir /** === begin UNO includes === **/
40cdf0e10cSrcweir #include <com/sun/star/beans/PropertyAttribute.hpp>
41cdf0e10cSrcweir #include <com/sun/star/xsd/WhiteSpaceTreatment.hpp>
42cdf0e10cSrcweir #include <com/sun/star/xsd/DataTypeClass.hpp>
43cdf0e10cSrcweir #include <com/sun/star/inspection/PropertyControlType.hpp>
44cdf0e10cSrcweir #include <com/sun/star/beans/Optional.hpp>
45cdf0e10cSrcweir #include <com/sun/star/inspection/XObjectInspectorUI.hpp>
46cdf0e10cSrcweir #include <com/sun/star/inspection/PropertyLineElement.hpp>
47cdf0e10cSrcweir /** === end UNO includes === **/
48cdf0e10cSrcweir #include <vcl/msgbox.hxx>
49cdf0e10cSrcweir #include <tools/debug.hxx>
50cdf0e10cSrcweir #include <svtools/localresaccess.hxx>
51cdf0e10cSrcweir 
52cdf0e10cSrcweir #include <algorithm>
53cdf0e10cSrcweir #include <functional>
54cdf0e10cSrcweir #include <limits>
55cdf0e10cSrcweir 
56cdf0e10cSrcweir //------------------------------------------------------------------------
createRegistryInfo_XSDValidationPropertyHandler()57cdf0e10cSrcweir extern "C" void SAL_CALL createRegistryInfo_XSDValidationPropertyHandler()
58cdf0e10cSrcweir {
59cdf0e10cSrcweir     ::pcr::XSDValidationPropertyHandler::registerImplementation();
60cdf0e10cSrcweir }
61cdf0e10cSrcweir 
62cdf0e10cSrcweir //........................................................................
63cdf0e10cSrcweir namespace pcr
64cdf0e10cSrcweir {
65cdf0e10cSrcweir //........................................................................
66cdf0e10cSrcweir 
67cdf0e10cSrcweir     using namespace ::com::sun::star;
68cdf0e10cSrcweir     using namespace ::com::sun::star::uno;
69cdf0e10cSrcweir     using namespace ::com::sun::star::lang;
70cdf0e10cSrcweir     using namespace ::com::sun::star::beans;
71cdf0e10cSrcweir     using namespace ::com::sun::star::xforms;
72cdf0e10cSrcweir     using namespace ::com::sun::star::xsd;
73cdf0e10cSrcweir     using namespace ::com::sun::star::script;
74cdf0e10cSrcweir     using namespace ::com::sun::star::inspection;
75cdf0e10cSrcweir 
76cdf0e10cSrcweir     using ::com::sun::star::beans::PropertyAttribute::MAYBEVOID;
77cdf0e10cSrcweir 
78cdf0e10cSrcweir     //====================================================================
79cdf0e10cSrcweir 	//= XSDValidationPropertyHandler
80cdf0e10cSrcweir 	//====================================================================
DBG_NAME(XSDValidationPropertyHandler)81cdf0e10cSrcweir     DBG_NAME( XSDValidationPropertyHandler )
82cdf0e10cSrcweir 	//--------------------------------------------------------------------
83cdf0e10cSrcweir     XSDValidationPropertyHandler::XSDValidationPropertyHandler( const Reference< XComponentContext >& _rxContext )
84cdf0e10cSrcweir         :XSDValidationPropertyHandler_Base( _rxContext )
85cdf0e10cSrcweir     {
86cdf0e10cSrcweir         DBG_CTOR( XSDValidationPropertyHandler, NULL );
87cdf0e10cSrcweir     }
88cdf0e10cSrcweir 
89cdf0e10cSrcweir 	//--------------------------------------------------------------------
~XSDValidationPropertyHandler()90cdf0e10cSrcweir     XSDValidationPropertyHandler::~XSDValidationPropertyHandler()
91cdf0e10cSrcweir     {
92cdf0e10cSrcweir         DBG_DTOR( XSDValidationPropertyHandler, NULL );
93cdf0e10cSrcweir     }
94cdf0e10cSrcweir 
95cdf0e10cSrcweir     //--------------------------------------------------------------------
getImplementationName_static()96cdf0e10cSrcweir     ::rtl::OUString SAL_CALL XSDValidationPropertyHandler::getImplementationName_static(  ) throw (RuntimeException)
97cdf0e10cSrcweir     {
98cdf0e10cSrcweir         return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.extensions.XSDValidationPropertyHandler" ) );
99cdf0e10cSrcweir     }
100cdf0e10cSrcweir 
101cdf0e10cSrcweir     //--------------------------------------------------------------------
getSupportedServiceNames_static()102cdf0e10cSrcweir     Sequence< ::rtl::OUString > SAL_CALL XSDValidationPropertyHandler::getSupportedServiceNames_static(  ) throw (RuntimeException)
103cdf0e10cSrcweir     {
104cdf0e10cSrcweir         Sequence< ::rtl::OUString > aSupported( 1 );
105cdf0e10cSrcweir         aSupported[0] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.form.inspection.XSDValidationPropertyHandler" ) );
106cdf0e10cSrcweir         return aSupported;
107cdf0e10cSrcweir     }
108cdf0e10cSrcweir 
109cdf0e10cSrcweir     //--------------------------------------------------------------------
getPropertyValue(const::rtl::OUString & _rPropertyName)110cdf0e10cSrcweir     Any SAL_CALL XSDValidationPropertyHandler::getPropertyValue( const ::rtl::OUString& _rPropertyName ) throw (UnknownPropertyException, RuntimeException)
111cdf0e10cSrcweir     {
112cdf0e10cSrcweir         ::osl::MutexGuard aGuard( m_aMutex );
113cdf0e10cSrcweir         PropertyId nPropId( impl_getPropertyId_throw( _rPropertyName ) );
114cdf0e10cSrcweir 
115cdf0e10cSrcweir         OSL_ENSURE( m_pHelper.get(), "XSDValidationPropertyHandler::getPropertyValue: inconsistency!" );
116cdf0e10cSrcweir             // if we survived impl_getPropertyId_throw, we should have a helper, since no helper implies no properties
117cdf0e10cSrcweir 
118cdf0e10cSrcweir         Any aReturn;
119cdf0e10cSrcweir         ::rtl::Reference< XSDDataType > pType = m_pHelper->getValidatingDataType();
120cdf0e10cSrcweir         switch ( nPropId )
121cdf0e10cSrcweir         {
122cdf0e10cSrcweir         // common facets
123cdf0e10cSrcweir         case PROPERTY_ID_XSD_DATA_TYPE:  aReturn = pType.is() ? pType->getFacet( PROPERTY_NAME ) : makeAny( ::rtl::OUString() ); break;
124cdf0e10cSrcweir         case PROPERTY_ID_XSD_WHITESPACES:aReturn = pType.is() ? pType->getFacet( PROPERTY_XSD_WHITESPACES ) : makeAny( WhiteSpaceTreatment::Preserve ); break;
125cdf0e10cSrcweir         case PROPERTY_ID_XSD_PATTERN:    aReturn = pType.is() ? pType->getFacet( PROPERTY_XSD_PATTERN ) : makeAny( ::rtl::OUString() ); break;
126cdf0e10cSrcweir 
127cdf0e10cSrcweir         // all other properties are simply forwarded, if they exist at the given type
128cdf0e10cSrcweir         default:
129cdf0e10cSrcweir         {
130cdf0e10cSrcweir             if ( pType.is() && pType->hasFacet( _rPropertyName ) )
131cdf0e10cSrcweir                 aReturn = pType->getFacet( _rPropertyName );
132cdf0e10cSrcweir         }
133cdf0e10cSrcweir         break;
134cdf0e10cSrcweir         }
135cdf0e10cSrcweir 
136cdf0e10cSrcweir         return aReturn;
137cdf0e10cSrcweir     }
138cdf0e10cSrcweir 
139cdf0e10cSrcweir     //--------------------------------------------------------------------
setPropertyValue(const::rtl::OUString & _rPropertyName,const Any & _rValue)140cdf0e10cSrcweir     void SAL_CALL XSDValidationPropertyHandler::setPropertyValue( const ::rtl::OUString& _rPropertyName, const Any& _rValue ) throw (UnknownPropertyException, RuntimeException)
141cdf0e10cSrcweir     {
142cdf0e10cSrcweir         ::osl::MutexGuard aGuard( m_aMutex );
143cdf0e10cSrcweir         PropertyId nPropId( impl_getPropertyId_throw( _rPropertyName ) );
144cdf0e10cSrcweir 
145cdf0e10cSrcweir         OSL_ENSURE( m_pHelper.get(), "XSDValidationPropertyHandler::getPropertyValue: inconsistency!" );
146cdf0e10cSrcweir             // if we survived impl_getPropertyId_throw, we should have a helper, since no helper implies no properties
147cdf0e10cSrcweir 
148cdf0e10cSrcweir         if ( PROPERTY_ID_XSD_DATA_TYPE == nPropId )
149cdf0e10cSrcweir         {
150cdf0e10cSrcweir             ::rtl::OUString sTypeName;
151cdf0e10cSrcweir             OSL_VERIFY( _rValue >>= sTypeName );
152cdf0e10cSrcweir             m_pHelper->setValidatingDataTypeByName( sTypeName );
153cdf0e10cSrcweir             impl_setContextDocumentModified_nothrow();
154cdf0e10cSrcweir             return;
155cdf0e10cSrcweir         }
156cdf0e10cSrcweir 
157cdf0e10cSrcweir         ::rtl::Reference< XSDDataType > pType = m_pHelper->getValidatingDataType();
158cdf0e10cSrcweir         if ( !pType.is() )
159cdf0e10cSrcweir         {
160cdf0e10cSrcweir             DBG_ERROR( "XSDValidationPropertyHandler::setPropertyValue: you're trying to set a type facet, without a current type!" );
161cdf0e10cSrcweir             return;
162cdf0e10cSrcweir         }
163cdf0e10cSrcweir 
164cdf0e10cSrcweir         pType->setFacet( _rPropertyName, _rValue );
165cdf0e10cSrcweir         impl_setContextDocumentModified_nothrow();
166cdf0e10cSrcweir     }
167cdf0e10cSrcweir 
168cdf0e10cSrcweir     //--------------------------------------------------------------------
onNewComponent()169cdf0e10cSrcweir     void XSDValidationPropertyHandler::onNewComponent()
170cdf0e10cSrcweir     {
171cdf0e10cSrcweir         XSDValidationPropertyHandler_Base::onNewComponent();
172cdf0e10cSrcweir 
173cdf0e10cSrcweir         Reference< frame::XModel > xDocument( impl_getContextDocument_nothrow() );
174cdf0e10cSrcweir         DBG_ASSERT( xDocument.is(), "XSDValidationPropertyHandler::onNewComponent: no document!" );
175cdf0e10cSrcweir         if ( EFormsHelper::isEForm( xDocument ) )
176cdf0e10cSrcweir             m_pHelper.reset( new XSDValidationHelper( m_aMutex, m_xComponent, xDocument ) );
177cdf0e10cSrcweir         else
178*3d762826SHerbert Dürr             m_pHelper.reset();
179cdf0e10cSrcweir     }
180cdf0e10cSrcweir 
181cdf0e10cSrcweir     //--------------------------------------------------------------------
doDescribeSupportedProperties() const182cdf0e10cSrcweir     Sequence< Property > XSDValidationPropertyHandler::doDescribeSupportedProperties() const
183cdf0e10cSrcweir     {
184cdf0e10cSrcweir         ::std::vector< Property > aProperties;
185cdf0e10cSrcweir 
186cdf0e10cSrcweir         if ( m_pHelper.get() )
187cdf0e10cSrcweir         {
188cdf0e10cSrcweir             bool bAllowBinding = m_pHelper->canBindToAnyDataType();
189cdf0e10cSrcweir 
190cdf0e10cSrcweir             if ( bAllowBinding )
191cdf0e10cSrcweir             {
192cdf0e10cSrcweir                 aProperties.reserve( 12 );
193cdf0e10cSrcweir 
194cdf0e10cSrcweir                 addStringPropertyDescription( aProperties, PROPERTY_XSD_DATA_TYPE   );
195cdf0e10cSrcweir                 addInt16PropertyDescription ( aProperties, PROPERTY_XSD_WHITESPACES );
196cdf0e10cSrcweir                 addStringPropertyDescription( aProperties, PROPERTY_XSD_PATTERN     );
197cdf0e10cSrcweir 
198cdf0e10cSrcweir                 // string facets
199cdf0e10cSrcweir                 addInt32PropertyDescription( aProperties, PROPERTY_XSD_LENGTH,          MAYBEVOID );
200cdf0e10cSrcweir                 addInt32PropertyDescription( aProperties, PROPERTY_XSD_MIN_LENGTH,      MAYBEVOID );
201cdf0e10cSrcweir                 addInt32PropertyDescription( aProperties, PROPERTY_XSD_MAX_LENGTH,      MAYBEVOID );
202cdf0e10cSrcweir 
203cdf0e10cSrcweir                 // decimal facets
204cdf0e10cSrcweir                 addInt32PropertyDescription( aProperties, PROPERTY_XSD_TOTAL_DIGITS,    MAYBEVOID );
205cdf0e10cSrcweir                 addInt32PropertyDescription( aProperties, PROPERTY_XSD_FRACTION_DIGITS, MAYBEVOID );
206cdf0e10cSrcweir 
207cdf0e10cSrcweir                 // facets for different types
208cdf0e10cSrcweir                 addInt16PropertyDescription( aProperties, PROPERTY_XSD_MAX_INCLUSIVE_INT, MAYBEVOID );
209cdf0e10cSrcweir                 addInt16PropertyDescription( aProperties, PROPERTY_XSD_MAX_EXCLUSIVE_INT, MAYBEVOID );
210cdf0e10cSrcweir                 addInt16PropertyDescription( aProperties, PROPERTY_XSD_MIN_INCLUSIVE_INT, MAYBEVOID );
211cdf0e10cSrcweir                 addInt16PropertyDescription( aProperties, PROPERTY_XSD_MIN_EXCLUSIVE_INT, MAYBEVOID );
212cdf0e10cSrcweir                 addDoublePropertyDescription( aProperties, PROPERTY_XSD_MAX_INCLUSIVE_DOUBLE, MAYBEVOID );
213cdf0e10cSrcweir                 addDoublePropertyDescription( aProperties, PROPERTY_XSD_MAX_EXCLUSIVE_DOUBLE, MAYBEVOID );
214cdf0e10cSrcweir                 addDoublePropertyDescription( aProperties, PROPERTY_XSD_MIN_INCLUSIVE_DOUBLE, MAYBEVOID );
215cdf0e10cSrcweir                 addDoublePropertyDescription( aProperties, PROPERTY_XSD_MIN_EXCLUSIVE_DOUBLE, MAYBEVOID );
216cdf0e10cSrcweir                 addDatePropertyDescription( aProperties, PROPERTY_XSD_MAX_INCLUSIVE_DATE, MAYBEVOID );
217cdf0e10cSrcweir                 addDatePropertyDescription( aProperties, PROPERTY_XSD_MAX_EXCLUSIVE_DATE, MAYBEVOID );
218cdf0e10cSrcweir                 addDatePropertyDescription( aProperties, PROPERTY_XSD_MIN_INCLUSIVE_DATE, MAYBEVOID );
219cdf0e10cSrcweir                 addDatePropertyDescription( aProperties, PROPERTY_XSD_MIN_EXCLUSIVE_DATE, MAYBEVOID );
220cdf0e10cSrcweir                 addTimePropertyDescription( aProperties, PROPERTY_XSD_MAX_INCLUSIVE_TIME, MAYBEVOID );
221cdf0e10cSrcweir                 addTimePropertyDescription( aProperties, PROPERTY_XSD_MAX_EXCLUSIVE_TIME, MAYBEVOID );
222cdf0e10cSrcweir                 addTimePropertyDescription( aProperties, PROPERTY_XSD_MIN_INCLUSIVE_TIME, MAYBEVOID );
223cdf0e10cSrcweir                 addTimePropertyDescription( aProperties, PROPERTY_XSD_MIN_EXCLUSIVE_TIME, MAYBEVOID );
224cdf0e10cSrcweir                 addDateTimePropertyDescription( aProperties, PROPERTY_XSD_MAX_INCLUSIVE_DATE_TIME, MAYBEVOID );
225cdf0e10cSrcweir                 addDateTimePropertyDescription( aProperties, PROPERTY_XSD_MAX_EXCLUSIVE_DATE_TIME, MAYBEVOID );
226cdf0e10cSrcweir                 addDateTimePropertyDescription( aProperties, PROPERTY_XSD_MIN_INCLUSIVE_DATE_TIME, MAYBEVOID );
227cdf0e10cSrcweir                 addDateTimePropertyDescription( aProperties, PROPERTY_XSD_MIN_EXCLUSIVE_DATE_TIME, MAYBEVOID );
228cdf0e10cSrcweir             }
229cdf0e10cSrcweir         }
230cdf0e10cSrcweir 
231cdf0e10cSrcweir         if ( aProperties.empty() )
232cdf0e10cSrcweir             return Sequence< Property >();
233cdf0e10cSrcweir         return Sequence< Property >( &(*aProperties.begin()), aProperties.size() );
234cdf0e10cSrcweir     }
235cdf0e10cSrcweir 
236cdf0e10cSrcweir     //--------------------------------------------------------------------
getSupersededProperties()237cdf0e10cSrcweir     Sequence< ::rtl::OUString > SAL_CALL XSDValidationPropertyHandler::getSupersededProperties( ) throw (RuntimeException)
238cdf0e10cSrcweir     {
239cdf0e10cSrcweir         ::osl::MutexGuard aGuard( m_aMutex );
240cdf0e10cSrcweir 
241cdf0e10cSrcweir         ::std::vector< ::rtl::OUString > aSuperfluous;
242cdf0e10cSrcweir         if ( m_pHelper.get() )
243cdf0e10cSrcweir         {
244cdf0e10cSrcweir             aSuperfluous.push_back( PROPERTY_CONTROLSOURCE );
245cdf0e10cSrcweir             aSuperfluous.push_back( PROPERTY_EMPTY_IS_NULL );
246cdf0e10cSrcweir             aSuperfluous.push_back( PROPERTY_FILTERPROPOSAL );
247cdf0e10cSrcweir             aSuperfluous.push_back( PROPERTY_LISTSOURCETYPE );
248cdf0e10cSrcweir             aSuperfluous.push_back( PROPERTY_LISTSOURCE );
249cdf0e10cSrcweir             aSuperfluous.push_back( PROPERTY_BOUNDCOLUMN );
250cdf0e10cSrcweir 
251cdf0e10cSrcweir             bool bAllowBinding = m_pHelper->canBindToAnyDataType();
252cdf0e10cSrcweir 
253cdf0e10cSrcweir             if ( bAllowBinding )
254cdf0e10cSrcweir             {
255cdf0e10cSrcweir                 aSuperfluous.push_back( PROPERTY_MAXTEXTLEN );
256cdf0e10cSrcweir                 aSuperfluous.push_back( PROPERTY_VALUEMIN );
257cdf0e10cSrcweir                 aSuperfluous.push_back( PROPERTY_VALUEMAX );
258cdf0e10cSrcweir                 aSuperfluous.push_back( PROPERTY_DECIMAL_ACCURACY );
259cdf0e10cSrcweir                 aSuperfluous.push_back( PROPERTY_TIMEMIN );
260cdf0e10cSrcweir                 aSuperfluous.push_back( PROPERTY_TIMEMAX );
261cdf0e10cSrcweir                 aSuperfluous.push_back( PROPERTY_DATEMIN );
262cdf0e10cSrcweir                 aSuperfluous.push_back( PROPERTY_DATEMAX );
263cdf0e10cSrcweir                 aSuperfluous.push_back( PROPERTY_EFFECTIVE_MIN );
264cdf0e10cSrcweir                 aSuperfluous.push_back( PROPERTY_EFFECTIVE_MAX );
265cdf0e10cSrcweir             }
266cdf0e10cSrcweir         }
267cdf0e10cSrcweir 
268cdf0e10cSrcweir         if ( aSuperfluous.empty() )
269cdf0e10cSrcweir             return Sequence< ::rtl::OUString >();
270cdf0e10cSrcweir         return Sequence< ::rtl::OUString >( &(*aSuperfluous.begin()), aSuperfluous.size() );
271cdf0e10cSrcweir     }
272cdf0e10cSrcweir 
273cdf0e10cSrcweir     //--------------------------------------------------------------------
getActuatingProperties()274cdf0e10cSrcweir     Sequence< ::rtl::OUString > SAL_CALL XSDValidationPropertyHandler::getActuatingProperties( ) throw (RuntimeException)
275cdf0e10cSrcweir     {
276cdf0e10cSrcweir         ::osl::MutexGuard aGuard( m_aMutex );
277cdf0e10cSrcweir         ::std::vector< ::rtl::OUString > aInterestedInActuations( 2 );
278cdf0e10cSrcweir         if ( m_pHelper.get() )
279cdf0e10cSrcweir         {
280cdf0e10cSrcweir             aInterestedInActuations.push_back( PROPERTY_XSD_DATA_TYPE );
281cdf0e10cSrcweir             aInterestedInActuations.push_back( PROPERTY_XML_DATA_MODEL );
282cdf0e10cSrcweir         }
283cdf0e10cSrcweir         if ( aInterestedInActuations.empty() )
284cdf0e10cSrcweir             return Sequence< ::rtl::OUString >();
285cdf0e10cSrcweir         return Sequence< ::rtl::OUString >( &(*aInterestedInActuations.begin()), aInterestedInActuations.size() );
286cdf0e10cSrcweir     }
287cdf0e10cSrcweir 
288cdf0e10cSrcweir     //--------------------------------------------------------------------
289cdf0e10cSrcweir     namespace
290cdf0e10cSrcweir     {
showPropertyUI(const Reference<XObjectInspectorUI> & _rxInspectorUI,const::rtl::OUString & _rPropertyName,bool _bShow)291cdf0e10cSrcweir         void showPropertyUI( const Reference< XObjectInspectorUI >& _rxInspectorUI, const ::rtl::OUString& _rPropertyName, bool _bShow )
292cdf0e10cSrcweir         {
293cdf0e10cSrcweir             if ( _bShow )
294cdf0e10cSrcweir                 _rxInspectorUI->showPropertyUI( _rPropertyName );
295cdf0e10cSrcweir             else
296cdf0e10cSrcweir                 _rxInspectorUI->hidePropertyUI( _rPropertyName );
297cdf0e10cSrcweir         }
298cdf0e10cSrcweir     }
299cdf0e10cSrcweir 
300cdf0e10cSrcweir     //--------------------------------------------------------------------
describePropertyLine(const::rtl::OUString & _rPropertyName,const Reference<XPropertyControlFactory> & _rxControlFactory)301cdf0e10cSrcweir     LineDescriptor SAL_CALL XSDValidationPropertyHandler::describePropertyLine( const ::rtl::OUString& _rPropertyName,
302cdf0e10cSrcweir         const Reference< XPropertyControlFactory >& _rxControlFactory )
303cdf0e10cSrcweir         throw (UnknownPropertyException, NullPointerException, RuntimeException)
304cdf0e10cSrcweir     {
305cdf0e10cSrcweir         ::osl::MutexGuard aGuard( m_aMutex );
306cdf0e10cSrcweir         if ( !_rxControlFactory.is() )
307cdf0e10cSrcweir             throw NullPointerException();
308cdf0e10cSrcweir         if ( !m_pHelper.get() )
309cdf0e10cSrcweir             throw RuntimeException();
310cdf0e10cSrcweir 
311cdf0e10cSrcweir         PropertyId nPropId( impl_getPropertyId_throw( _rPropertyName ) );
312cdf0e10cSrcweir 
313cdf0e10cSrcweir         LineDescriptor aDescriptor;
314cdf0e10cSrcweir         if ( nPropId != PROPERTY_ID_XSD_DATA_TYPE )
315cdf0e10cSrcweir             aDescriptor.IndentLevel = 1;
316cdf0e10cSrcweir 
317cdf0e10cSrcweir         // collect some information about the to-be-created control
318cdf0e10cSrcweir         sal_Int16 nControlType = PropertyControlType::TextField;
319cdf0e10cSrcweir         ::std::vector< ::rtl::OUString > aListEntries;
320cdf0e10cSrcweir         Optional< double > aMinValue( sal_False, 0 );
321cdf0e10cSrcweir         Optional< double > aMaxValue( sal_False, 0 );
322cdf0e10cSrcweir 
323cdf0e10cSrcweir         switch ( nPropId )
324cdf0e10cSrcweir         {
325cdf0e10cSrcweir         case PROPERTY_ID_XSD_DATA_TYPE:
326cdf0e10cSrcweir             nControlType = PropertyControlType::ListBox;
327cdf0e10cSrcweir 
328cdf0e10cSrcweir             implGetAvailableDataTypeNames( aListEntries );
329cdf0e10cSrcweir 
330cdf0e10cSrcweir             aDescriptor.PrimaryButtonId = rtl::OUString::createFromAscii(UID_PROP_ADD_DATA_TYPE);
331cdf0e10cSrcweir             aDescriptor.SecondaryButtonId = rtl::OUString::createFromAscii(UID_PROP_REMOVE_DATA_TYPE);;
332cdf0e10cSrcweir             aDescriptor.HasPrimaryButton = aDescriptor.HasSecondaryButton = sal_True;
333cdf0e10cSrcweir             aDescriptor.PrimaryButtonImageURL = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "private:graphicrepository/extensions/res/buttonplus.png" ) );
334cdf0e10cSrcweir             aDescriptor.SecondaryButtonImageURL = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "private:graphicrepository/extensions/res/buttonminus.png" ) );
335cdf0e10cSrcweir             break;
336cdf0e10cSrcweir 
337cdf0e10cSrcweir         case PROPERTY_ID_XSD_WHITESPACES:
338cdf0e10cSrcweir         {
339cdf0e10cSrcweir             nControlType = PropertyControlType::ListBox;
340cdf0e10cSrcweir             aListEntries = m_pInfoService->getPropertyEnumRepresentations( PROPERTY_ID_XSD_WHITESPACES );
341cdf0e10cSrcweir         }
342cdf0e10cSrcweir         break;
343cdf0e10cSrcweir 
344cdf0e10cSrcweir         case PROPERTY_ID_XSD_PATTERN:
345cdf0e10cSrcweir             nControlType = PropertyControlType::TextField;
346cdf0e10cSrcweir             break;
347cdf0e10cSrcweir 
348cdf0e10cSrcweir         case PROPERTY_ID_XSD_LENGTH:
349cdf0e10cSrcweir         case PROPERTY_ID_XSD_MIN_LENGTH:
350cdf0e10cSrcweir         case PROPERTY_ID_XSD_MAX_LENGTH:
351cdf0e10cSrcweir             nControlType = PropertyControlType::NumericField;
352cdf0e10cSrcweir             break;
353cdf0e10cSrcweir 
354cdf0e10cSrcweir         case PROPERTY_ID_XSD_TOTAL_DIGITS:
355cdf0e10cSrcweir         case PROPERTY_ID_XSD_FRACTION_DIGITS:
356cdf0e10cSrcweir             nControlType = PropertyControlType::NumericField;
357cdf0e10cSrcweir             break;
358cdf0e10cSrcweir 
359cdf0e10cSrcweir         case PROPERTY_ID_XSD_MAX_INCLUSIVE_INT:
360cdf0e10cSrcweir         case PROPERTY_ID_XSD_MAX_EXCLUSIVE_INT:
361cdf0e10cSrcweir         case PROPERTY_ID_XSD_MIN_INCLUSIVE_INT:
362cdf0e10cSrcweir         case PROPERTY_ID_XSD_MIN_EXCLUSIVE_INT:
363cdf0e10cSrcweir         {
364cdf0e10cSrcweir             nControlType = PropertyControlType::NumericField;
365cdf0e10cSrcweir 
366cdf0e10cSrcweir             // handle limits for various 'INT' types according to
367cdf0e10cSrcweir             // their actual semantics (year, month, day)
368cdf0e10cSrcweir 
369cdf0e10cSrcweir             ::rtl::Reference< XSDDataType > xDataType( m_pHelper->getValidatingDataType() );
370cdf0e10cSrcweir             sal_Int16 nTypeClass = xDataType.is() ? xDataType->classify() : DataTypeClass::STRING;
371cdf0e10cSrcweir 
372cdf0e10cSrcweir             aMinValue.IsPresent = aMaxValue.IsPresent = sal_True;
373cdf0e10cSrcweir             aMinValue.Value = DataTypeClass::gYear == nTypeClass ? 0 : 1;
374cdf0e10cSrcweir             aMaxValue.Value = ::std::numeric_limits< sal_Int32 >::max();
375cdf0e10cSrcweir             if ( DataTypeClass::gMonth == nTypeClass )
376cdf0e10cSrcweir                 aMaxValue.Value = 12;
377cdf0e10cSrcweir             else if ( DataTypeClass::gDay == nTypeClass )
378cdf0e10cSrcweir                 aMaxValue.Value = 31;
379cdf0e10cSrcweir         }
380cdf0e10cSrcweir         break;
381cdf0e10cSrcweir 
382cdf0e10cSrcweir         case PROPERTY_ID_XSD_MAX_INCLUSIVE_DOUBLE:
383cdf0e10cSrcweir         case PROPERTY_ID_XSD_MAX_EXCLUSIVE_DOUBLE:
384cdf0e10cSrcweir         case PROPERTY_ID_XSD_MIN_INCLUSIVE_DOUBLE:
385cdf0e10cSrcweir         case PROPERTY_ID_XSD_MIN_EXCLUSIVE_DOUBLE:
386cdf0e10cSrcweir             nControlType = PropertyControlType::NumericField;
387cdf0e10cSrcweir             // TODO/eForms: do we have "auto-digits"?
388cdf0e10cSrcweir             break;
389cdf0e10cSrcweir 
390cdf0e10cSrcweir         case PROPERTY_ID_XSD_MAX_INCLUSIVE_DATE:
391cdf0e10cSrcweir         case PROPERTY_ID_XSD_MAX_EXCLUSIVE_DATE:
392cdf0e10cSrcweir         case PROPERTY_ID_XSD_MIN_INCLUSIVE_DATE:
393cdf0e10cSrcweir         case PROPERTY_ID_XSD_MIN_EXCLUSIVE_DATE:
394cdf0e10cSrcweir             nControlType = PropertyControlType::DateField;
395cdf0e10cSrcweir             break;
396cdf0e10cSrcweir 
397cdf0e10cSrcweir         case PROPERTY_ID_XSD_MAX_INCLUSIVE_TIME:
398cdf0e10cSrcweir         case PROPERTY_ID_XSD_MAX_EXCLUSIVE_TIME:
399cdf0e10cSrcweir         case PROPERTY_ID_XSD_MIN_INCLUSIVE_TIME:
400cdf0e10cSrcweir         case PROPERTY_ID_XSD_MIN_EXCLUSIVE_TIME:
401cdf0e10cSrcweir             nControlType = PropertyControlType::TimeField;
402cdf0e10cSrcweir             break;
403cdf0e10cSrcweir 
404cdf0e10cSrcweir         case PROPERTY_ID_XSD_MAX_INCLUSIVE_DATE_TIME:
405cdf0e10cSrcweir         case PROPERTY_ID_XSD_MAX_EXCLUSIVE_DATE_TIME:
406cdf0e10cSrcweir         case PROPERTY_ID_XSD_MIN_INCLUSIVE_DATE_TIME:
407cdf0e10cSrcweir         case PROPERTY_ID_XSD_MIN_EXCLUSIVE_DATE_TIME:
408cdf0e10cSrcweir             nControlType = PropertyControlType::DateTimeField;
409cdf0e10cSrcweir             break;
410cdf0e10cSrcweir 
411cdf0e10cSrcweir         default:
412cdf0e10cSrcweir             DBG_ERROR( "XSDValidationPropertyHandler::describePropertyLine: cannot handle this property!" );
413cdf0e10cSrcweir             break;
414cdf0e10cSrcweir         }
415cdf0e10cSrcweir 
416cdf0e10cSrcweir         switch ( nControlType )
417cdf0e10cSrcweir         {
418cdf0e10cSrcweir         case PropertyControlType::ListBox:
419cdf0e10cSrcweir             aDescriptor.Control = PropertyHandlerHelper::createListBoxControl( _rxControlFactory, aListEntries, sal_False, sal_False );
420cdf0e10cSrcweir             break;
421cdf0e10cSrcweir         case PropertyControlType::NumericField:
422cdf0e10cSrcweir             aDescriptor.Control = PropertyHandlerHelper::createNumericControl( _rxControlFactory, 0, aMinValue, aMaxValue, sal_False );
423cdf0e10cSrcweir             break;
424cdf0e10cSrcweir         default:
425cdf0e10cSrcweir             aDescriptor.Control = _rxControlFactory->createPropertyControl( nControlType, sal_False );
426cdf0e10cSrcweir             break;
427cdf0e10cSrcweir         }
428cdf0e10cSrcweir 
429cdf0e10cSrcweir         aDescriptor.Category = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Data" ) );
430cdf0e10cSrcweir         aDescriptor.DisplayName = m_pInfoService->getPropertyTranslation( nPropId );
431cdf0e10cSrcweir         aDescriptor.HelpURL = HelpIdUrl::getHelpURL( m_pInfoService->getPropertyHelpId( nPropId ) );
432cdf0e10cSrcweir 
433cdf0e10cSrcweir         return aDescriptor;
434cdf0e10cSrcweir     }
435cdf0e10cSrcweir 
436cdf0e10cSrcweir     //--------------------------------------------------------------------
onInteractivePropertySelection(const::rtl::OUString & _rPropertyName,sal_Bool _bPrimary,Any &,const Reference<XObjectInspectorUI> & _rxInspectorUI)437cdf0e10cSrcweir     InteractiveSelectionResult SAL_CALL XSDValidationPropertyHandler::onInteractivePropertySelection( const ::rtl::OUString& _rPropertyName, sal_Bool _bPrimary, Any& /*_rData*/, const Reference< XObjectInspectorUI >& _rxInspectorUI ) throw (UnknownPropertyException, NullPointerException, RuntimeException)
438cdf0e10cSrcweir     {
439cdf0e10cSrcweir         if ( !_rxInspectorUI.is() )
440cdf0e10cSrcweir             throw NullPointerException();
441cdf0e10cSrcweir 
442cdf0e10cSrcweir         ::osl::MutexGuard aGuard( m_aMutex );
443cdf0e10cSrcweir         OSL_ENSURE( m_pHelper.get(), "XSDValidationPropertyHandler::onInteractivePropertySelection: we don't have any SupportedProperties!" );
444cdf0e10cSrcweir         if ( !m_pHelper.get() )
445cdf0e10cSrcweir             return InteractiveSelectionResult_Cancelled;
446cdf0e10cSrcweir 
447cdf0e10cSrcweir         PropertyId nPropId( impl_getPropertyId_throw( _rPropertyName ) );
448cdf0e10cSrcweir 
449cdf0e10cSrcweir         switch ( nPropId )
450cdf0e10cSrcweir         {
451cdf0e10cSrcweir         case PROPERTY_ID_XSD_DATA_TYPE:
452cdf0e10cSrcweir         {
453cdf0e10cSrcweir             if ( _bPrimary )
454cdf0e10cSrcweir             {
455cdf0e10cSrcweir                 ::rtl::OUString sNewDataTypeName;
456cdf0e10cSrcweir                 if ( implPrepareCloneDataCurrentType( sNewDataTypeName ) )
457cdf0e10cSrcweir                 {
458cdf0e10cSrcweir                     implDoCloneCurrentDataType( sNewDataTypeName );
459cdf0e10cSrcweir                     return InteractiveSelectionResult_Success;
460cdf0e10cSrcweir                 }
461cdf0e10cSrcweir             }
462cdf0e10cSrcweir             else
463cdf0e10cSrcweir                 return implPrepareRemoveCurrentDataType() && implDoRemoveCurrentDataType() ? InteractiveSelectionResult_Success : InteractiveSelectionResult_Cancelled;
464cdf0e10cSrcweir         }
465cdf0e10cSrcweir         break;
466cdf0e10cSrcweir 
467cdf0e10cSrcweir         default:
468cdf0e10cSrcweir             DBG_ERROR( "XSDValidationPropertyHandler::onInteractivePropertySelection: unexpected property to build a dedicated UI!" );
469cdf0e10cSrcweir             break;
470cdf0e10cSrcweir         }
471cdf0e10cSrcweir         return InteractiveSelectionResult_Cancelled;
472cdf0e10cSrcweir     }
473cdf0e10cSrcweir 
474cdf0e10cSrcweir     //--------------------------------------------------------------------
addPropertyChangeListener(const Reference<XPropertyChangeListener> & _rxListener)475cdf0e10cSrcweir     void SAL_CALL XSDValidationPropertyHandler::addPropertyChangeListener( const Reference< XPropertyChangeListener >& _rxListener ) throw (RuntimeException)
476cdf0e10cSrcweir     {
477cdf0e10cSrcweir         ::osl::MutexGuard aGuard( m_aMutex );
478cdf0e10cSrcweir         XSDValidationPropertyHandler_Base::addPropertyChangeListener( _rxListener );
479cdf0e10cSrcweir         if ( m_pHelper.get() )
480cdf0e10cSrcweir             m_pHelper->registerBindingListener( _rxListener );
481cdf0e10cSrcweir     }
482cdf0e10cSrcweir 
483cdf0e10cSrcweir     //--------------------------------------------------------------------
removePropertyChangeListener(const Reference<XPropertyChangeListener> & _rxListener)484cdf0e10cSrcweir     void SAL_CALL XSDValidationPropertyHandler::removePropertyChangeListener( const Reference< XPropertyChangeListener >& _rxListener ) throw (RuntimeException)
485cdf0e10cSrcweir     {
486cdf0e10cSrcweir         ::osl::MutexGuard aGuard( m_aMutex );
487cdf0e10cSrcweir         if ( m_pHelper.get() )
488cdf0e10cSrcweir             m_pHelper->revokeBindingListener( _rxListener );
489cdf0e10cSrcweir         XSDValidationPropertyHandler_Base::removePropertyChangeListener( _rxListener );
490cdf0e10cSrcweir     }
491cdf0e10cSrcweir 
492cdf0e10cSrcweir     //--------------------------------------------------------------------
implPrepareCloneDataCurrentType(::rtl::OUString & _rNewName)493cdf0e10cSrcweir     bool XSDValidationPropertyHandler::implPrepareCloneDataCurrentType( ::rtl::OUString& _rNewName ) SAL_THROW(())
494cdf0e10cSrcweir     {
495cdf0e10cSrcweir         OSL_PRECOND( m_pHelper.get(), "XSDValidationPropertyHandler::implPrepareCloneDataCurrentType: this will crash!" );
496cdf0e10cSrcweir 
497cdf0e10cSrcweir         ::rtl::Reference< XSDDataType > pType = m_pHelper->getValidatingDataType();
498cdf0e10cSrcweir         if ( !pType.is() )
499cdf0e10cSrcweir         {
500cdf0e10cSrcweir             DBG_ERROR( "XSDValidationPropertyHandler::implPrepareCloneDataCurrentType: invalid current data type!" );
501cdf0e10cSrcweir             return false;
502cdf0e10cSrcweir         }
503cdf0e10cSrcweir 
504cdf0e10cSrcweir         ::std::vector< ::rtl::OUString > aExistentNames;
505cdf0e10cSrcweir         m_pHelper->getAvailableDataTypeNames( aExistentNames );
506cdf0e10cSrcweir 
507cdf0e10cSrcweir         NewDataTypeDialog aDialog( NULL, pType->getName(), aExistentNames );  // TODO/eForms: proper parent
508cdf0e10cSrcweir         if ( aDialog.Execute() != RET_OK )
509cdf0e10cSrcweir             return false;
510cdf0e10cSrcweir 
511cdf0e10cSrcweir         _rNewName = aDialog.GetName();
512cdf0e10cSrcweir         return true;
513cdf0e10cSrcweir     }
514cdf0e10cSrcweir 
515cdf0e10cSrcweir     //--------------------------------------------------------------------
implDoCloneCurrentDataType(const::rtl::OUString & _rNewName)516cdf0e10cSrcweir     bool XSDValidationPropertyHandler::implDoCloneCurrentDataType( const ::rtl::OUString& _rNewName ) SAL_THROW(())
517cdf0e10cSrcweir     {
518cdf0e10cSrcweir         OSL_PRECOND( m_pHelper.get(), "XSDValidationPropertyHandler::implDoCloneCurrentDataType: this will crash!" );
519cdf0e10cSrcweir 
520cdf0e10cSrcweir         ::rtl::Reference< XSDDataType > pType = m_pHelper->getValidatingDataType();
521cdf0e10cSrcweir         if ( !pType.is() )
522cdf0e10cSrcweir             return false;
523cdf0e10cSrcweir 
524cdf0e10cSrcweir         if ( !m_pHelper->cloneDataType( pType, _rNewName ) )
525cdf0e10cSrcweir             return false;
526cdf0e10cSrcweir 
527cdf0e10cSrcweir         m_pHelper->setValidatingDataTypeByName( _rNewName );
528cdf0e10cSrcweir         return true;
529cdf0e10cSrcweir     }
530cdf0e10cSrcweir 
531cdf0e10cSrcweir     //--------------------------------------------------------------------
implPrepareRemoveCurrentDataType()532cdf0e10cSrcweir     bool XSDValidationPropertyHandler::implPrepareRemoveCurrentDataType() SAL_THROW(())
533cdf0e10cSrcweir     {
534cdf0e10cSrcweir         OSL_PRECOND( m_pHelper.get(), "XSDValidationPropertyHandler::implPrepareRemoveCurrentDataType: this will crash!" );
535cdf0e10cSrcweir 
536cdf0e10cSrcweir         ::rtl::Reference< XSDDataType > pType = m_pHelper->getValidatingDataType();
537cdf0e10cSrcweir         if ( !pType.is() )
538cdf0e10cSrcweir         {
539cdf0e10cSrcweir             DBG_ERROR( "XSDValidationPropertyHandler::implPrepareRemoveCurrentDataType: invalid current data type!" );
540cdf0e10cSrcweir             return false;
541cdf0e10cSrcweir         }
542cdf0e10cSrcweir 
543cdf0e10cSrcweir         // confirmation message
544cdf0e10cSrcweir         String sConfirmation( PcrRes( RID_STR_CONFIRM_DELETE_DATA_TYPE ) );
545cdf0e10cSrcweir         sConfirmation.SearchAndReplaceAscii( "#type#", pType->getName() );
546cdf0e10cSrcweir         QueryBox aQuery( NULL, WB_YES_NO, sConfirmation ); // TODO/eForms: proper parent
547cdf0e10cSrcweir         if ( aQuery.Execute() != RET_YES )
548cdf0e10cSrcweir             return false;
549cdf0e10cSrcweir 
550cdf0e10cSrcweir         return true;
551cdf0e10cSrcweir     }
552cdf0e10cSrcweir 
553cdf0e10cSrcweir     //--------------------------------------------------------------------
implDoRemoveCurrentDataType()554cdf0e10cSrcweir     bool XSDValidationPropertyHandler::implDoRemoveCurrentDataType() SAL_THROW(())
555cdf0e10cSrcweir     {
556cdf0e10cSrcweir         OSL_PRECOND( m_pHelper.get(), "XSDValidationPropertyHandler::implDoRemoveCurrentDataType: this will crash!" );
557cdf0e10cSrcweir 
558cdf0e10cSrcweir         ::rtl::Reference< XSDDataType > pType = m_pHelper->getValidatingDataType();
559cdf0e10cSrcweir         if ( !pType.is() )
560cdf0e10cSrcweir             return false;
561cdf0e10cSrcweir 
562cdf0e10cSrcweir         // set a new data type at the binding, which is the "basic" type for the one
563cdf0e10cSrcweir         // we are going to delete
564cdf0e10cSrcweir         // (do this before the actual deletion, so the old type is still valid for property change
565cdf0e10cSrcweir         // notifications)
566cdf0e10cSrcweir         m_pHelper->setValidatingDataTypeByName( m_pHelper->getBasicTypeNameForClass( pType->classify() ) );
567cdf0e10cSrcweir         // now remove the type
568cdf0e10cSrcweir         m_pHelper->removeDataTypeFromRepository( pType->getName() );
569cdf0e10cSrcweir 
570cdf0e10cSrcweir         return true;
571cdf0e10cSrcweir     }
572cdf0e10cSrcweir 
573cdf0e10cSrcweir     //--------------------------------------------------------------------
actuatingPropertyChanged(const::rtl::OUString & _rActuatingPropertyName,const Any & _rNewValue,const Any & _rOldValue,const Reference<XObjectInspectorUI> & _rxInspectorUI,sal_Bool _bFirstTimeInit)574cdf0e10cSrcweir     void SAL_CALL XSDValidationPropertyHandler::actuatingPropertyChanged( const ::rtl::OUString& _rActuatingPropertyName, const Any& _rNewValue, const Any& _rOldValue, const Reference< XObjectInspectorUI >& _rxInspectorUI, sal_Bool _bFirstTimeInit ) throw (NullPointerException, RuntimeException)
575cdf0e10cSrcweir     {
576cdf0e10cSrcweir         if ( !_rxInspectorUI.is() )
577cdf0e10cSrcweir             throw NullPointerException();
578cdf0e10cSrcweir 
579cdf0e10cSrcweir         ::osl::MutexGuard aGuard( m_aMutex );
580cdf0e10cSrcweir         PropertyId nActuatingPropId( impl_getPropertyId_throw( _rActuatingPropertyName ) );
581cdf0e10cSrcweir         if ( !m_pHelper.get() )
582cdf0e10cSrcweir             throw RuntimeException();
583cdf0e10cSrcweir             // if we survived impl_getPropertyId_throw, we should have a helper, since no helper implies no properties
584cdf0e10cSrcweir 
585cdf0e10cSrcweir         switch ( nActuatingPropId )
586cdf0e10cSrcweir         {
587cdf0e10cSrcweir         case PROPERTY_ID_XSD_DATA_TYPE:
588cdf0e10cSrcweir         {
589cdf0e10cSrcweir             ::rtl::Reference< XSDDataType > xDataType( m_pHelper->getValidatingDataType() );
590cdf0e10cSrcweir 
591cdf0e10cSrcweir             // is removal of this type possible?
592cdf0e10cSrcweir             sal_Bool bIsBasicType = xDataType.is() && xDataType->isBasicType();
593cdf0e10cSrcweir             _rxInspectorUI->enablePropertyUIElements( PROPERTY_XSD_DATA_TYPE, PropertyLineElement::PrimaryButton, xDataType.is() );
594cdf0e10cSrcweir             _rxInspectorUI->enablePropertyUIElements( PROPERTY_XSD_DATA_TYPE, PropertyLineElement::SecondaryButton, xDataType.is() && !bIsBasicType );
595cdf0e10cSrcweir 
596cdf0e10cSrcweir             //------------------------------------------------------------
597cdf0e10cSrcweir             // show the facets which are available at the data type
598cdf0e10cSrcweir             ::rtl::OUString aFacets[] = {
599cdf0e10cSrcweir                 PROPERTY_XSD_WHITESPACES, PROPERTY_XSD_PATTERN,
600cdf0e10cSrcweir                 PROPERTY_XSD_LENGTH, PROPERTY_XSD_MIN_LENGTH, PROPERTY_XSD_MAX_LENGTH, PROPERTY_XSD_TOTAL_DIGITS,
601cdf0e10cSrcweir                 PROPERTY_XSD_FRACTION_DIGITS,
602cdf0e10cSrcweir                 PROPERTY_XSD_MAX_INCLUSIVE_INT,
603cdf0e10cSrcweir                 PROPERTY_XSD_MAX_EXCLUSIVE_INT,
604cdf0e10cSrcweir                 PROPERTY_XSD_MIN_INCLUSIVE_INT,
605cdf0e10cSrcweir                 PROPERTY_XSD_MIN_EXCLUSIVE_INT,
606cdf0e10cSrcweir                 PROPERTY_XSD_MAX_INCLUSIVE_DOUBLE,
607cdf0e10cSrcweir                 PROPERTY_XSD_MAX_EXCLUSIVE_DOUBLE,
608cdf0e10cSrcweir                 PROPERTY_XSD_MIN_INCLUSIVE_DOUBLE,
609cdf0e10cSrcweir                 PROPERTY_XSD_MIN_EXCLUSIVE_DOUBLE,
610cdf0e10cSrcweir                 PROPERTY_XSD_MAX_INCLUSIVE_DATE,
611cdf0e10cSrcweir                 PROPERTY_XSD_MAX_EXCLUSIVE_DATE,
612cdf0e10cSrcweir                 PROPERTY_XSD_MIN_INCLUSIVE_DATE,
613cdf0e10cSrcweir                 PROPERTY_XSD_MIN_EXCLUSIVE_DATE,
614cdf0e10cSrcweir                 PROPERTY_XSD_MAX_INCLUSIVE_TIME,
615cdf0e10cSrcweir                 PROPERTY_XSD_MAX_EXCLUSIVE_TIME,
616cdf0e10cSrcweir                 PROPERTY_XSD_MIN_INCLUSIVE_TIME,
617cdf0e10cSrcweir                 PROPERTY_XSD_MIN_EXCLUSIVE_TIME,
618cdf0e10cSrcweir                 PROPERTY_XSD_MAX_INCLUSIVE_DATE_TIME,
619cdf0e10cSrcweir                 PROPERTY_XSD_MAX_EXCLUSIVE_DATE_TIME,
620cdf0e10cSrcweir                 PROPERTY_XSD_MIN_INCLUSIVE_DATE_TIME,
621cdf0e10cSrcweir                 PROPERTY_XSD_MIN_EXCLUSIVE_DATE_TIME
622cdf0e10cSrcweir             };
623cdf0e10cSrcweir 
624cdf0e10cSrcweir             size_t i=0;
625cdf0e10cSrcweir             const ::rtl::OUString* pLoop = NULL;
626cdf0e10cSrcweir             for ( i = 0, pLoop = aFacets;
627cdf0e10cSrcweir                   i < sizeof( aFacets ) / sizeof( aFacets[0] );
628cdf0e10cSrcweir                   ++i, ++pLoop
629cdf0e10cSrcweir                 )
630cdf0e10cSrcweir             {
631cdf0e10cSrcweir                 showPropertyUI( _rxInspectorUI, *pLoop, xDataType.is() && xDataType->hasFacet( *pLoop ) );
632cdf0e10cSrcweir                 _rxInspectorUI->enablePropertyUI( *pLoop, !bIsBasicType );
633cdf0e10cSrcweir             }
634cdf0e10cSrcweir         }
635cdf0e10cSrcweir         break;
636cdf0e10cSrcweir 
637cdf0e10cSrcweir         case PROPERTY_ID_XML_DATA_MODEL:
638cdf0e10cSrcweir         {
639cdf0e10cSrcweir             // The data type which the current binding works with may not be present in the
640cdf0e10cSrcweir             // new model. Thus, transfer it.
641cdf0e10cSrcweir             ::rtl::OUString sOldModelName; _rOldValue >>= sOldModelName;
642cdf0e10cSrcweir             ::rtl::OUString sNewModelName; _rNewValue >>= sNewModelName;
643cdf0e10cSrcweir             ::rtl::OUString sDataType = m_pHelper->getValidatingDataTypeName();
644cdf0e10cSrcweir             m_pHelper->copyDataType( sOldModelName, sNewModelName, sDataType );
645cdf0e10cSrcweir 
646cdf0e10cSrcweir             // the list of available data types depends on the chosen model, so update this
647cdf0e10cSrcweir             if ( !_bFirstTimeInit )
648cdf0e10cSrcweir                 _rxInspectorUI->rebuildPropertyUI( PROPERTY_XSD_DATA_TYPE );
649cdf0e10cSrcweir         }
650cdf0e10cSrcweir         break;
651cdf0e10cSrcweir 
652cdf0e10cSrcweir         default:
653cdf0e10cSrcweir             DBG_ERROR( "XSDValidationPropertyHandler::actuatingPropertyChanged: cannot handle this property!" );
654cdf0e10cSrcweir             return;
655cdf0e10cSrcweir         }
656cdf0e10cSrcweir 
657cdf0e10cSrcweir         // in both cases, we need to care for the current value of the XSD_DATA_TYPE property,
658cdf0e10cSrcweir         // and update the FormatKey of the formatted field we're inspecting (if any)
659cdf0e10cSrcweir         if ( !_bFirstTimeInit && m_pHelper->isInspectingFormattedField() )
660cdf0e10cSrcweir             m_pHelper->findDefaultFormatForIntrospectee();
661cdf0e10cSrcweir     }
662cdf0e10cSrcweir 
663cdf0e10cSrcweir     //--------------------------------------------------------------------
implGetAvailableDataTypeNames(::std::vector<::rtl::OUString> & _rNames) const664cdf0e10cSrcweir     void XSDValidationPropertyHandler::implGetAvailableDataTypeNames( ::std::vector< ::rtl::OUString >& /* [out] */ _rNames ) const SAL_THROW(())
665cdf0e10cSrcweir     {
666cdf0e10cSrcweir         OSL_PRECOND( m_pHelper.get(), "XSDValidationPropertyHandler::implGetAvailableDataTypeNames: this will crash!" );
667cdf0e10cSrcweir         // start with *all* types which are available at the model
668cdf0e10cSrcweir         ::std::vector< ::rtl::OUString > aAllTypes;
669cdf0e10cSrcweir         m_pHelper->getAvailableDataTypeNames( aAllTypes );
670cdf0e10cSrcweir         _rNames.clear();
671cdf0e10cSrcweir         _rNames.reserve( aAllTypes.size() );
672cdf0e10cSrcweir 
673cdf0e10cSrcweir         // then allow only those which are "compatible" with our control
674cdf0e10cSrcweir         for ( ::std::vector< ::rtl::OUString >::const_iterator dataType = aAllTypes.begin();
675cdf0e10cSrcweir               dataType != aAllTypes.end();
676cdf0e10cSrcweir               ++dataType
677cdf0e10cSrcweir             )
678cdf0e10cSrcweir         {
679cdf0e10cSrcweir             ::rtl::Reference< XSDDataType > pType = m_pHelper->getDataTypeByName( *dataType );
680cdf0e10cSrcweir             if ( pType.is() && m_pHelper->canBindToDataType( pType->classify() ) )
681cdf0e10cSrcweir                 _rNames.push_back( *dataType );
682cdf0e10cSrcweir         }
683cdf0e10cSrcweir     }
684cdf0e10cSrcweir 
685cdf0e10cSrcweir //........................................................................
686cdf0e10cSrcweir } // namespace pcr
687cdf0e10cSrcweir //........................................................................
688cdf0e10cSrcweir 
689