24#include <property.hxx>
29#include <com/sun/star/xsd/DataTypeClass.hpp>
30#include <com/sun/star/xsd/WhiteSpaceTreatment.hpp>
32#include <tools/datetime.hxx>
33#include <rtl/math.hxx>
42 using ::com::sun::star::uno::Reference;
43 using ::com::sun::star::uno::Any;
44 using ::com::sun::star::util::Date;
45 using ::com::sun::star::util::Time;
46 using ::com::sun::star::util::DateTime;
47 using ::com::sun::star::lang::IllegalArgumentException;
48 using ::com::sun::star::beans::XPropertyChangeListener;
49 using ::com::sun::star::beans::XVetoableChangeListener;
51 using ::com::sun::star::beans::PropertyAttribute::BOUND;
52 using ::com::sun::star::beans::PropertyAttribute::READONLY;
55 using namespace ::
frm;
61 ,m_nTypeClass( _nTypeClass )
63 ,m_nWST( WhiteSpaceTreatment::
Preserve )
64 ,m_bPatternMatcherDirty( true )
97 pClone->initializeClone( *
this );
143 SAL_WARN_IF(
m_nWST != _whitespacetreatment,
"forms.misc",
"OXSDDataType::setWhiteSpaceTreatment: inconsistency!" );
179 if ( RID_STR_XFORMS_PATTERN_DOESNT_MATCH == rReason )
181 OSL_ENSURE( !
m_sPattern.isEmpty(),
"OXSDDataType::_explainInvalid: how can this error occur without a regular expression?" );
189 void lcl_initializePatternMatcher( ::std::unique_ptr< RegexMatcher >& _rpMatcher,
const OUString& _rPattern )
191 UErrorCode nMatchStatus = U_ZERO_ERROR;
192 UnicodeString aIcuPattern(
reinterpret_cast<const UChar *
>(_rPattern.getStr()), _rPattern.getLength() );
193 _rpMatcher.reset(
new RegexMatcher( aIcuPattern, 0, nMatchStatus ) );
194 OSL_ENSURE( U_SUCCESS( nMatchStatus ),
"lcl_initializePatternMatcher: invalid pattern property!" );
198 bool lcl_matchString( RegexMatcher& _rMatcher,
const OUString& _rText )
200 UErrorCode nMatchStatus = U_ZERO_ERROR;
201 UnicodeString aInput(
reinterpret_cast<const UChar *
>(_rText.getStr()), _rText.getLength() );
202 _rMatcher.reset( aInput );
203 if ( _rMatcher.matches( nMatchStatus ) )
205 int32_t nStart = _rMatcher.start( nMatchStatus );
206 int32_t nEnd = _rMatcher.end ( nMatchStatus );
207 if ( ( nStart == 0 ) && ( nEnd == _rText.getLength() ) )
229 return RID_STR_XFORMS_PATTERN_DOESNT_MATCH;
243 OUString sErrorMessage;
246 IllegalArgumentException aException;
247 aException.Message = sErrorMessage;
248 aException.Context = *
this;
269 OSL_VERIFY( _rNewValue >>= sPattern );
271 UnicodeString aIcuPattern(
reinterpret_cast<const UChar *
>(sPattern.getStr()), sPattern.getLength() );
272 UErrorCode nMatchStatus = U_ZERO_ERROR;
273 RegexMatcher aMatcher( aIcuPattern, 0, nMatchStatus );
274 if ( U_FAILURE( nMatchStatus ) )
276 _rErrorMessage =
"This is no valid pattern.";
286 OXSDDataType_PBase::setPropertyValue( aPropertyName, aValue );
292 return OXSDDataType_PBase::getPropertyValue( PropertyName );
298 OXSDDataType_PBase::addPropertyChangeListener( aPropertyName, xListener );
304 OXSDDataType_PBase::removePropertyChangeListener( aPropertyName, aListener );
310 OXSDDataType_PBase::addVetoableChangeListener( PropertyName, aListener );
316 OXSDDataType_PBase::removeVetoableChangeListener( PropertyName, aListener );
321 ,m_fCachedMaxInclusive( 0 )
322 ,m_fCachedMaxExclusive( 0 )
323 ,m_fCachedMinInclusive( 0 )
324 ,m_fCachedMinExclusive( 0 )
350 sal_Int32 _nHandle,
const css::uno::Any& _rValue )
405 rtl_math_ConversionStatus eStatus;
407 double f = ::rtl::math::stringToDouble(
408 rValue.replace(
',',
'.'),
'.',
u'\0', &eStatus, &nEnd );
411 bool bReturn =
false;
412 if( eStatus == rtl_math_ConversionStatus_Ok
413 && nEnd == rValue.getLength() )
430 pReason = RID_STR_XFORMS_VALUE_IS_NOT_A;
434 pReason = RID_STR_XFORMS_VALUE_MAX_INCL;
436 pReason = RID_STR_XFORMS_VALUE_MAX_EXCL;
438 pReason = RID_STR_XFORMS_VALUE_MIN_INCL;
440 pReason = RID_STR_XFORMS_VALUE_MIN_EXCL;
447 OUStringBuffer sInfo;
448 if (rReason == RID_STR_XFORMS_VALUE_IS_NOT_A)
450 else if (rReason == RID_STR_XFORMS_VALUE_MAX_INCL)
452 else if (rReason == RID_STR_XFORMS_VALUE_MAX_EXCL)
454 else if (rReason == RID_STR_XFORMS_VALUE_MIN_INCL)
456 else if (rReason == RID_STR_XFORMS_VALUE_MIN_EXCL)
458 return sInfo.makeStringAndClear();
508 _rErrorMessage.clear();
516 OSL_VERIFY( _rNewValue >>=
nValue );
518 _rErrorMessage =
"Length limits must denote positive integer values.";
524 return _rErrorMessage.isEmpty();
536 sal_Int32
nLength = rValue.getLength();
537 sal_Int32 nLimit = 0;
541 pReason = RID_STR_XFORMS_VALUE_LENGTH;
546 pReason = RID_STR_XFORMS_VALUE_MAX_LENGTH;
548 pReason = RID_STR_XFORMS_VALUE_MIN_LENGTH;
557 OUStringBuffer sInfo;
558 if (rReason == RID_STR_XFORMS_VALUE_LENGTH)
563 else if (rReason == RID_STR_XFORMS_VALUE_MAX_LENGTH)
568 else if (rReason == RID_STR_XFORMS_VALUE_MIN_LENGTH)
577 return sInfo.makeStringAndClear();
584 m_xURLTransformer = css::util::URLTransformer::create(::comphelper::getProcessComponentContext());
629 _rErrorMessage.clear();
637 OSL_VERIFY( _rNewValue >>=
nValue );
639 _rErrorMessage =
"Length limits must denote positive integer values.";
645 return _rErrorMessage.isEmpty();
657 sal_Int32
nLength = rValue.getLength();
658 sal_Int32 nLimit = 0;
662 pReason = RID_STR_XFORMS_VALUE_LENGTH;
667 pReason = RID_STR_XFORMS_VALUE_MAX_LENGTH;
669 pReason = RID_STR_XFORMS_VALUE_MIN_LENGTH;
672 css::util::URL aCommandURL;
673 aCommandURL.Complete = rValue;
675 pReason = RID_STR_XFORMS_INVALID_VALUE;
684 OUStringBuffer sInfo;
685 if (rReason == RID_STR_XFORMS_VALUE_LENGTH)
690 else if (rReason == RID_STR_XFORMS_VALUE_MAX_LENGTH)
695 else if (rReason == RID_STR_XFORMS_VALUE_MIN_LENGTH)
704 return sInfo.makeStringAndClear();
725 if ( pInvalidityReason )
726 return pInvalidityReason;
728 bool bValid = sValue ==
"0" || sValue ==
"1" || sValue ==
"true" || sValue ==
"false";
729 return bValid ?
TranslateId() : RID_STR_XFORMS_INVALID_VALUE;
734 return !rReason ? OUString() :
getName();
780 sal_Int32
nLength = rValue.getLength();
782 sal_Int32 nTotalDigits = 0;
783 sal_Int32 nFractionDigits = 0;
793 nTotalDigits += nFractionDigits;
797 pReason = RID_STR_XFORMS_VALUE_TOTAL_DIGITS;
799 ( nFractionDigits >
nValue ) )
800 pReason = RID_STR_XFORMS_VALUE_FRACTION_DIGITS;
809 OUStringBuffer sInfo;
810 if (rReason == RID_STR_XFORMS_VALUE_TOTAL_DIGITS)
815 else if (rReason == RID_STR_XFORMS_VALUE_FRACTION_DIGITS)
824 return sInfo.makeStringAndClear();
831 return OUString::number( fValue );
837 OSL_VERIFY( _rValue >>= _rDoubleValue );
852 initializeTypedClone(
static_cast< const ODateType&
>(_rCloneSource));
867 catch (com::sun::star::lang::IllegalArgumentException)
873 if ( !( aTypeValue >>= aValue ) )
876 ::Date aToolsDate( aValue.Day, aValue.Month, aValue.Year );
884 OSL_PRECOND( _rValue.getValueType().equals( getCppuType() ),
"ODateType::typedValueAsHumanReadableString: unexpected type" );
892 OSL_VERIFY( _rValue >>= aValue );
893 ::Date aToolsDate( aValue.Day, aValue.Month, aValue.Year );
894 _rDoubleValue = aToolsDate.
GetDate();
909 initializeTypedClone(
static_cast< const OTimeType&
>(_rCloneSource));
924 catch (com::sun::star::lang::IllegalArgumentException)
929 css::util::Time aValue;
930 if ( !( aTypedValue >>= aValue ) )
948 OSL_PRECOND( _rValue.getValueType().equals( getCppuType() ),
"OTimeType::typedValueAsHumanReadableString: unexpected type" );
955 css::util::Time aValue;
956 OSL_VERIFY( _rValue >>= aValue );
958 _rDoubleValue = aToolsTime.
GetTime();
973 initializeTypedClone(
static_cast< const ODateTimeType&
>(_rCloneSource));
983 double lcl_normalizeDateTime(
const DateTime& _rValue )
991 fValue += aToolsValue.GetTimeInDays();
1004 catch (com::sun::star::uno::RuntimeException)
1010 if ( !( aTypedValue >>= aValue ) )
1013 fValue = lcl_normalizeDateTime( aValue );
1020 OSL_PRECOND( _rValue.getValueType().equals( getCppuType() ),
"OTimeType::typedValueAsHumanReadableString: unexpected type" );
1025 OSL_ENSURE( sString.indexOf(
'T' ) != -1,
"ODateTimeType::typedValueAsHumanReadableString: hmm - no ISO notation?" );
1026 return sString.replace(
'T',
' ' );
1033 OSL_VERIFY( _rValue >>= aValue );
1034 _rDoubleValue = lcl_normalizeDateTime( aValue );
1049 initializeTypedClone(
static_cast< const OShortIntegerType&
>( _rCloneSource ) );
1054 if (
value.size() > 4)
1074 fValue =
static_cast<double>(
static_cast<sal_Int16
>(int32Value));
1080 if (
value.size() > 2)
1095 fValue =
static_cast<double>(
static_cast<sal_Int16
>(int32Value));
1101 if (
value.size() > 2)
1116 fValue =
static_cast<double>(
static_cast<sal_Int16
>(int32Value));
1124 case css::xsd::DataTypeClass::gYear:
1127 case css::xsd::DataTypeClass::gMonth:
1130 case css::xsd::DataTypeClass::gDay:
1143 OSL_VERIFY( _rValue >>=
nValue );
1144 return OUString::number(
nValue );
1151 OSL_VERIFY( _rValue >>=
nValue );
1156template<
typename CONCRETE_DATA_TYPE_IMPL,
typename SUPERCLASS >
1158 :SUPERCLASS( _rName, _nTypeClass )
1159 ,m_bPropertiesRegistered( false )
1164template<
typename CONCRETE_DATA_TYPE_IMPL,
typename SUPERCLASS >
1167 css::uno::Sequence< css::beans::Property > aProps;
1169 return new ::cppu::OPropertyArrayHelper( aProps );
1173template<
typename CONCRETE_DATA_TYPE_IMPL,
typename SUPERCLASS >
1176 return ::cppu::OPropertySetHelper::createPropertySetInfo( getInfoHelper() );
1180template<
typename CONCRETE_DATA_TYPE_IMPL,
typename SUPERCLASS >
1183 if ( !m_bPropertiesRegistered )
1185 this->registerProperties();
1186 m_bPropertiesRegistered =
true;
1193template<
typename VALUE_TYPE >
sal_Int32 GetDate() const
::cppu::IPropertyArrayHelper * getArrayHelper()
void describeProperties(css::uno::Sequence< css::beans::Property > &_rProps) const
void registerProperty(const OUString &_rName, sal_Int32 _nHandle, sal_Int32 _nAttributes, void *_pPointerToMember, const css::uno::Type &_rMemberType)
void registerMayBeVoidProperty(const OUString &_rName, sal_Int32 _nHandle, sal_Int32 _nAttributes, css::uno::Any *_pPointerToMember, const css::uno::Type &_rExpectedType)
virtual void SAL_CALL setFastPropertyValue(sal_Int32 nHandle, const css::uno::Any &rValue) override final
virtual sal_Bool SAL_CALL convertFastPropertyValue(css::uno::Any &rConvertedValue, css::uno::Any &rOldValue, sal_Int32 nHandle, const css::uno::Any &rValue) override
virtual void SAL_CALL setFastPropertyValue_NoBroadcast(sal_Int32 nHandle, const css::uno::Any &rValue) override
constexpr OUStringLiteral PROPERTY_XSD_TYPE_CLASS
constexpr OUStringLiteral PROPERTY_XSD_WHITESPACE
constexpr OUStringLiteral PROPERTY_NAME
constexpr OUStringLiteral PROPERTY_XSD_IS_BASIC
constexpr OUStringLiteral PROPERTY_XSD_MAX_LENGTH
constexpr OUStringLiteral PROPERTY_XSD_TOTAL_DIGITS
constexpr OUStringLiteral PROPERTY_XSD_LENGTH
constexpr OUStringLiteral PROPERTY_XSD_FRACTION_DIGITS
constexpr OUStringLiteral PROPERTY_XSD_MIN_LENGTH
constexpr OUStringLiteral PROPERTY_XSD_PATTERN
#define SAL_WARN_IF(condition, area, stream)
ListBox is a bit confusing / different from other form components, so here are a few notes:
sal_Int32 toInt32(std::u16string_view str, sal_Int16 radix=10)
bool equalsAscii(std::u16string_view s1, std::string_view s2)
IMPLEMENT_FORWARD_XTYPEPROVIDER2(ChildWindowPane, ChildWindowPaneInterfaceBase, Pane)
IMPLEMENT_FORWARD_XINTERFACE2(ChildWindowPane, ChildWindowPaneInterfaceBase, Pane)
#define PROPERTY_ID_XSD_MAX_INCLUSIVE_INT
#define PROPERTY_ID_XSD_LENGTH
#define PROPERTY_ID_XSD_PATTERN
#define PROPERTY_ID_XSD_WHITESPACE
#define PROPERTY_ID_XSD_MIN_INCLUSIVE_DATE_TIME
#define PROPERTY_ID_XSD_TYPE_CLASS
#define PROPERTY_ID_XSD_MAX_EXCLUSIVE_INT
#define PROPERTY_ID_XSD_MAX_EXCLUSIVE_DOUBLE
#define PROPERTY_ID_XSD_IS_BASIC
#define PROPERTY_ID_XSD_MAX_INCLUSIVE_TIME
#define PROPERTY_ID_XSD_MIN_EXCLUSIVE_DATE_TIME
#define PROPERTY_ID_XSD_MAX_EXCLUSIVE_DATE_TIME
#define PROPERTY_ID_XSD_MAX_INCLUSIVE_DATE
#define PROPERTY_ID_XSD_MIN_INCLUSIVE_DATE
#define PROPERTY_ID_XSD_MAX_EXCLUSIVE_TIME
#define PROPERTY_ID_XSD_TOTAL_DIGITS
#define PROPERTY_ID_XSD_MIN_INCLUSIVE_TIME
#define PROPERTY_ID_XSD_MIN_INCLUSIVE_DOUBLE
#define PROPERTY_ID_XSD_MIN_EXCLUSIVE_TIME
#define PROPERTY_ID_XSD_MAX_INCLUSIVE_DATE_TIME
#define PROPERTY_ID_XSD_MIN_EXCLUSIVE_DOUBLE
#define PROPERTY_ID_XSD_MAX_LENGTH
#define PROPERTY_ID_XSD_MIN_LENGTH
#define PROPERTY_ID_XSD_MIN_EXCLUSIVE_INT
#define PROPERTY_ID_XSD_MIN_EXCLUSIVE_DATE
#define PROPERTY_ID_XSD_MAX_EXCLUSIVE_DATE
#define PROPERTY_ID_XSD_MAX_INCLUSIVE_DOUBLE
#define PROPERTY_ID_XSD_FRACTION_DIGITS
#define PROPERTY_ID_XSD_MIN_INCLUSIVE_INT