1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 * This file incorporates work covered by the following license notice:
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
21 #include <formcontrolfactory.hxx>
22 #include <fmcontrollayout.hxx>
24 #include <svx/strings.hrc>
25 #include <fmservs.hxx>
26 #include <svx/dialmgr.hxx>
27 #include <svx/svdouno.hxx>
29 #include <com/sun/star/form/XFormComponent.hpp>
30 #include <com/sun/star/form/FormComponentType.hpp>
31 #include <com/sun/star/awt/ScrollBarOrientation.hpp>
32 #include <com/sun/star/awt/MouseWheelBehavior.hpp>
33 #include <com/sun/star/form/XGridColumnFactory.hpp>
34 #include <com/sun/star/style/VerticalAlignment.hpp>
35 #include <com/sun/star/awt/LineEndFormat.hpp>
36 #include <com/sun/star/awt/ImageScaleMode.hpp>
37 #include <com/sun/star/sdbc/DataType.hpp>
38 #include <com/sun/star/sdbc/XDataSource.hpp>
39 #include <com/sun/star/util/XNumberFormatTypes.hpp>
40 #include <com/sun/star/sdbc/ColumnValue.hpp>
41 #include <com/sun/star/text/WritingMode2.hpp>
43 #include <comphelper/numbers.hxx>
44 #include <comphelper/processfactory.hxx>
45 #include <unotools/syslocale.hxx>
46 #include <tools/gen.hxx>
47 #include <comphelper/diagnose_ex.hxx>
48 #include <connectivity/dbtools.hxx>
49 #include <i18nlangtag/languagetag.hxx>
53 using namespace ::dbtools
;
59 using ::com::sun::star::uno::Reference
;
60 using ::com::sun::star::uno::UNO_QUERY
;
61 using ::com::sun::star::uno::UNO_QUERY_THROW
;
62 using ::com::sun::star::uno::UNO_SET_THROW
;
63 using ::com::sun::star::uno::Exception
;
64 using ::com::sun::star::uno::Any
;
65 using ::com::sun::star::uno::Sequence
;
66 using ::com::sun::star::uno::XComponentContext
;
67 using ::com::sun::star::beans::XPropertySet
;
68 using ::com::sun::star::form::XFormComponent
;
69 using ::com::sun::star::container::XIndexAccess
;
70 using ::com::sun::star::beans::XPropertySetInfo
;
71 using ::com::sun::star::beans::PropertyValue
;
72 using ::com::sun::star::container::XChild
;
73 using ::com::sun::star::form::XGridColumnFactory
;
74 using ::com::sun::star::style::VerticalAlignment_MIDDLE
;
75 using ::com::sun::star::beans::Property
;
76 using ::com::sun::star::uno::TypeClass_DOUBLE
;
77 using ::com::sun::star::uno::TypeClass_LONG
;
78 using ::com::sun::star::util::XNumberFormats
;
79 using ::com::sun::star::util::XNumberFormatTypes
;
80 using ::com::sun::star::lang::XServiceInfo
;
81 using ::com::sun::star::container::XNameAccess
;
83 namespace FormComponentType
= ::com::sun::star::form::FormComponentType
;
84 namespace ScrollBarOrientation
= ::com::sun::star::awt::ScrollBarOrientation
;
85 namespace MouseWheelBehavior
= ::com::sun::star::awt::MouseWheelBehavior
;
86 namespace LineEndFormat
= ::com::sun::star::awt::LineEndFormat
;
87 namespace ImageScaleMode
= ::com::sun::star::awt::ImageScaleMode
;
88 namespace DataType
= ::com::sun::star::sdbc::DataType
;
89 namespace ColumnValue
= ::com::sun::star::sdbc::ColumnValue
;
90 namespace WritingMode2
= ::com::sun::star::text::WritingMode2
;
92 FormControlFactory::FormControlFactory( const Reference
<XComponentContext
>& _rContext
)
93 :m_xContext( _rContext
)
97 FormControlFactory::FormControlFactory( )
98 :m_xContext( comphelper::getProcessComponentContext() )
103 FormControlFactory::~FormControlFactory()
108 sal_Int16
FormControlFactory::initializeControlModel( const DocumentType _eDocType
, const SdrUnoObj
& _rObject
)
110 return initializeControlModel(
112 Reference
< XPropertySet
>( _rObject
.GetUnoControlModel(), UNO_QUERY
),
113 _rObject
.GetCurrentBoundRect()
118 void FormControlFactory::initializeControlModel( const DocumentType _eDocType
, const Reference
< XPropertySet
>& _rxControlModel
)
120 initializeControlModel(
121 _eDocType
, _rxControlModel
, tools::Rectangle()
129 OUString
lcl_getUniqueLabel_nothrow( const Reference
< XPropertySet
>& _rxControlModel
, const OUString
& _rBaseLabel
)
131 OUString
sLabel( _rBaseLabel
);
134 typedef ::std::set
< OUString
> StringBag
;
135 StringBag aUsedLabels
;
137 Reference
< XFormComponent
> xFormComponent( _rxControlModel
, UNO_QUERY_THROW
);
138 Reference
< XIndexAccess
> xContainer( xFormComponent
->getParent(), UNO_QUERY_THROW
);
139 // loop through all siblings of the control model, and collect their labels
140 for ( sal_Int32 index
=xContainer
->getCount(); index
>0; )
142 Reference
< XPropertySet
> xElement( xContainer
->getByIndex( --index
), UNO_QUERY_THROW
);
143 if ( xElement
== _rxControlModel
)
146 Reference
< XPropertySetInfo
> xPSI( xElement
->getPropertySetInfo(), UNO_SET_THROW
);
147 if ( !xPSI
->hasPropertyByName( FM_PROP_LABEL
) )
150 OUString sElementLabel
;
151 OSL_VERIFY( xElement
->getPropertyValue( FM_PROP_LABEL
) >>= sElementLabel
);
152 aUsedLabels
.insert( sElementLabel
);
155 // now find a free label
157 while ( aUsedLabels
.find( sLabel
) != aUsedLabels
.end() )
159 OUStringBuffer
aBuffer( _rBaseLabel
);
160 aBuffer
.append( " " );
161 aBuffer
.append( i
++ );
162 sLabel
= aBuffer
.makeStringAndClear();
165 catch( const Exception
& )
167 DBG_UNHANDLED_EXCEPTION("svx");
173 Sequence
< PropertyValue
> lcl_getDataSourceIndirectProperties( const Reference
< XPropertySet
>& _rxControlModel
,
174 const Reference
<XComponentContext
>& _rContext
)
176 OSL_PRECOND( _rxControlModel
.is(), "lcl_getDataSourceIndirectProperties: invalid model!" );
178 Sequence
< PropertyValue
> aInfo
;
181 Reference
< XChild
> xChild( _rxControlModel
, UNO_QUERY
);
182 Reference
< XPropertySet
> xForm
;
184 xForm
.set(xChild
->getParent(), css::uno::UNO_QUERY
);
186 if ( Reference
< XGridColumnFactory
>( xForm
, UNO_QUERY
).is() )
187 { // hmm. the model is a grid column, in real
188 xChild
.set(xForm
, css::uno::UNO_QUERY
);
189 xForm
.set(xChild
->getParent(), css::uno::UNO_QUERY
);
192 OSL_ENSURE( xForm
.is(), "lcl_getDataSourceIndirectProperties: could not determine the form!" );
195 OUString sDataSourceName
;
196 xForm
->getPropertyValue( FM_PROP_DATASOURCE
) >>= sDataSourceName
;
198 Reference
< XPropertySet
> xDsProperties
;
199 if ( !sDataSourceName
.isEmpty() )
200 xDsProperties
.set(getDataSource( sDataSourceName
, _rContext
), css::uno::UNO_QUERY
);
201 if ( xDsProperties
.is() )
202 xDsProperties
->getPropertyValue("Info") >>= aInfo
;
204 catch( const Exception
& )
206 TOOLS_WARN_EXCEPTION( "svx", "lcl_getDataSourceIndirectProperties" );
212 const char* aCharacterAndParagraphProperties
[] =
227 "CharBackTransparent",
251 "CharRotationIsFitToLine",
256 "VisitedCharStyleName",
257 "UnvisitedCharStyleName",
258 "CharEscapementHeight",
260 "CharUnderlineColor",
261 "CharUnderlineHasColor",
266 "CharFontStyleNameAsian",
267 "CharFontFamilyAsian",
268 "CharFontCharSetAsian",
269 "CharFontPitchAsian",
272 "ParaIsCharacterDistance",
273 "ParaIsForbiddenRules",
274 "ParaIsHangingPunctuation",
277 "CharFontNameComplex",
278 "CharFontStyleNameComplex",
279 "CharFontFamilyComplex",
280 "CharFontCharSetComplex",
281 "CharFontPitchComplex",
282 "CharPostureComplex",
287 "ParaBackTransparent",
289 "ParaBackGraphicURL",
290 "ParaBackGraphicFilter",
291 "ParaBackGraphicLocation",
292 "ParaLastLineAdjust",
293 "ParaExpandSingleWord",
298 "ParaLineNumberCount",
299 "ParaLineNumberStartValue",
302 "ParaRegisterModeActive",
313 "NumberingStartValue",
314 "ParaIsNumberingRestart",
315 "NumberingStyleName",
324 "LeftBorderDistance",
325 "RightBorderDistance",
327 "BottomBorderDistance",
329 "DropCapCharStyleName",
330 "ParaFirstLineIndent",
331 "ParaIsAutoFirstLineIndent",
333 "ParaHyphenationMaxHyphens",
334 "ParaHyphenationMaxLeadingChars",
335 "ParaHyphenationMaxTrailingChars",
337 "ParaUserDefinedAttributes",
339 "ParaIsConnectBorder",
344 void lcl_initializeCharacterAttributes( const Reference
< XPropertySet
>& _rxModel
)
348 Reference
< XPropertySet
> xStyle( ControlLayouter::getDefaultDocumentTextStyle( _rxModel
), UNO_SET_THROW
);
350 // transfer all properties which are described by the style
351 Reference
< XPropertySetInfo
> xSourcePropInfo( xStyle
->getPropertySetInfo(), UNO_SET_THROW
);
352 Reference
< XPropertySetInfo
> xDestPropInfo( _rxModel
->getPropertySetInfo(), UNO_SET_THROW
);
354 OUString sPropertyName
;
355 const char** pCharacterProperty
= aCharacterAndParagraphProperties
;
356 while ( *pCharacterProperty
)
358 sPropertyName
= OUString::createFromAscii( *pCharacterProperty
);
360 if ( xSourcePropInfo
->hasPropertyByName( sPropertyName
) && xDestPropInfo
->hasPropertyByName( sPropertyName
) )
361 _rxModel
->setPropertyValue( sPropertyName
, xStyle
->getPropertyValue( sPropertyName
) );
363 ++pCharacterProperty
;
366 catch( const Exception
& )
368 DBG_UNHANDLED_EXCEPTION("svx");
374 sal_Int16
FormControlFactory::initializeControlModel( const DocumentType _eDocType
, const Reference
< XPropertySet
>& _rxControlModel
,
375 const tools::Rectangle
& _rControlBoundRect
)
377 sal_Int16 nClassId
= FormComponentType::CONTROL
;
379 OSL_ENSURE( _rxControlModel
.is(), "FormControlFactory::initializeControlModel: invalid model!" );
380 if ( !_rxControlModel
.is() )
385 ControlLayouter::initializeControlLayout( _rxControlModel
, _eDocType
);
387 _rxControlModel
->getPropertyValue( FM_PROP_CLASSID
) >>= nClassId
;
388 Reference
< XPropertySetInfo
> xPSI( _rxControlModel
->getPropertySetInfo(), UNO_SET_THROW
);
391 case FormComponentType::SCROLLBAR
:
392 _rxControlModel
->setPropertyValue("LiveScroll", Any( true ) );
394 case FormComponentType::SPINBUTTON
:
396 sal_Int32 eOrientation
= ScrollBarOrientation::HORIZONTAL
;
397 if ( !_rControlBoundRect
.IsEmpty() && ( _rControlBoundRect
.GetWidth() < _rControlBoundRect
.GetHeight() ) )
398 eOrientation
= ScrollBarOrientation::VERTICAL
;
399 _rxControlModel
->setPropertyValue( FM_PROP_ORIENTATION
, Any( eOrientation
) );
403 case FormComponentType::LISTBOX
:
404 case FormComponentType::COMBOBOX
:
406 bool bDropDown
= !_rControlBoundRect
.IsEmpty() && ( _rControlBoundRect
.GetWidth() >= 3 * _rControlBoundRect
.GetHeight() );
407 if ( xPSI
->hasPropertyByName( FM_PROP_DROPDOWN
) )
408 _rxControlModel
->setPropertyValue( FM_PROP_DROPDOWN
, Any( bDropDown
) );
409 _rxControlModel
->setPropertyValue( FM_PROP_LINECOUNT
, Any( sal_Int16( 20 ) ) );
413 case FormComponentType::TEXTFIELD
:
415 initializeTextFieldLineEnds( _rxControlModel
);
416 lcl_initializeCharacterAttributes( _rxControlModel
);
418 if ( !_rControlBoundRect
.IsEmpty()
419 && ( _rControlBoundRect
.GetWidth() <= 4 * _rControlBoundRect
.GetHeight() )
422 if ( xPSI
->hasPropertyByName( FM_PROP_MULTILINE
) )
423 _rxControlModel
->setPropertyValue( FM_PROP_MULTILINE
, Any( true ) );
428 case FormComponentType::RADIOBUTTON
:
429 case FormComponentType::CHECKBOX
:
430 case FormComponentType::FIXEDTEXT
:
432 OUString
sVertAlignPropertyName( "VerticalAlign" );
433 if ( xPSI
->hasPropertyByName( sVertAlignPropertyName
) )
434 _rxControlModel
->setPropertyValue( sVertAlignPropertyName
, Any( VerticalAlignment_MIDDLE
) );
438 case FormComponentType::IMAGEBUTTON
:
439 case FormComponentType::IMAGECONTROL
:
441 static const OUStringLiteral
sScaleModeProperty( u
"ScaleMode" );
442 if ( xPSI
->hasPropertyByName( sScaleModeProperty
) )
443 _rxControlModel
->setPropertyValue( sScaleModeProperty
, Any( ImageScaleMode::ISOTROPIC
) );
448 // initial default label for the control
449 if ( xPSI
->hasPropertyByName( FM_PROP_LABEL
) )
451 OUString sExistingLabel
;
452 OSL_VERIFY( _rxControlModel
->getPropertyValue( FM_PROP_LABEL
) >>= sExistingLabel
);
453 if ( sExistingLabel
.isEmpty() )
455 OUString sInitialLabel
;
456 OSL_VERIFY( _rxControlModel
->getPropertyValue( FM_PROP_NAME
) >>= sInitialLabel
);
458 TranslateId pTitleResId
;
461 case FormComponentType::COMMANDBUTTON
: pTitleResId
= RID_STR_PROPTITLE_PUSHBUTTON
; break;
462 case FormComponentType::RADIOBUTTON
: pTitleResId
= RID_STR_PROPTITLE_RADIOBUTTON
; break;
463 case FormComponentType::CHECKBOX
: pTitleResId
= RID_STR_PROPTITLE_CHECKBOX
; break;
464 case FormComponentType::GROUPBOX
: pTitleResId
= RID_STR_PROPTITLE_GROUPBOX
; break;
465 case FormComponentType::FIXEDTEXT
: pTitleResId
= RID_STR_PROPTITLE_FIXEDTEXT
; break;
469 sInitialLabel
= SvxResId(pTitleResId
);
471 _rxControlModel
->setPropertyValue(
473 Any( lcl_getUniqueLabel_nothrow( _rxControlModel
, sInitialLabel
) )
478 // strict format = yes is the default (i93467)
479 if ( xPSI
->hasPropertyByName( FM_PROP_STRICTFORMAT
) )
481 _rxControlModel
->setPropertyValue( FM_PROP_STRICTFORMAT
, Any( true ) );
484 // mouse wheel: don't use it for scrolling by default (i110036)
485 if ( xPSI
->hasPropertyByName( FM_PROP_MOUSE_WHEEL_BEHAVIOR
) )
487 _rxControlModel
->setPropertyValue( FM_PROP_MOUSE_WHEEL_BEHAVIOR
, Any( MouseWheelBehavior::SCROLL_DISABLED
) );
490 if ( xPSI
->hasPropertyByName( FM_PROP_WRITING_MODE
) )
491 _rxControlModel
->setPropertyValue( FM_PROP_WRITING_MODE
, Any( WritingMode2::CONTEXT
) );
493 catch( const Exception
& )
495 DBG_UNHANDLED_EXCEPTION("svx");
501 void FormControlFactory::initializeTextFieldLineEnds( const Reference
< XPropertySet
>& _rxModel
)
503 OSL_PRECOND( _rxModel
.is(), "initializeTextFieldLineEnds: invalid model!" );
504 if ( !_rxModel
.is() )
509 Reference
< XPropertySetInfo
> xInfo
= _rxModel
->getPropertySetInfo();
510 if ( !xInfo
.is() || !xInfo
->hasPropertyByName( FM_PROP_LINEENDFORMAT
) )
513 // let's see if the data source which the form belongs to (if any)
514 // has a setting for the preferred line end format
515 bool bDosLineEnds
= false;
516 const Sequence
< PropertyValue
> aInfo
= lcl_getDataSourceIndirectProperties( _rxModel
, m_xContext
);
517 const PropertyValue
* pInfo
= std::find_if(aInfo
.begin(), aInfo
.end(),
518 [](const PropertyValue
& rInfo
) { return rInfo
.Name
== "PreferDosLikeLineEnds"; });
519 if (pInfo
!= aInfo
.end())
520 pInfo
->Value
>>= bDosLineEnds
;
522 sal_Int16 nLineEndFormat
= bDosLineEnds
? LineEndFormat::CARRIAGE_RETURN_LINE_FEED
: LineEndFormat::LINE_FEED
;
523 _rxModel
->setPropertyValue( FM_PROP_LINEENDFORMAT
, Any( nLineEndFormat
) );
525 catch( const Exception
& )
527 DBG_UNHANDLED_EXCEPTION("svx");
532 void FormControlFactory::initializeFieldDependentProperties( const Reference
< XPropertySet
>& _rxDatabaseField
,
533 const Reference
< XPropertySet
>& _rxControlModel
, const Reference
< XNumberFormats
>& _rxNumberFormats
)
535 OSL_PRECOND( _rxDatabaseField
.is() && _rxControlModel
.is(),
536 "FormControlFactory::initializeFieldDependentProperties: illegal params!" );
537 if ( !_rxDatabaseField
.is() || !_rxControlModel
.is() )
543 // if the field has a numeric format, and the model has a "Scale" property, sync it
544 Reference
< XPropertySetInfo
> xFieldPSI( _rxDatabaseField
->getPropertySetInfo(), UNO_SET_THROW
);
545 Reference
< XPropertySetInfo
> xModelPSI( _rxControlModel
->getPropertySetInfo(), UNO_SET_THROW
);
547 if ( xModelPSI
->hasPropertyByName( FM_PROP_DECIMAL_ACCURACY
) )
549 sal_Int32 nFormatKey
= 0;
550 if ( xFieldPSI
->hasPropertyByName( FM_PROP_FORMATKEY
) )
552 _rxDatabaseField
->getPropertyValue( FM_PROP_FORMATKEY
) >>= nFormatKey
;
556 nFormatKey
= getDefaultNumberFormat(
558 Reference
< XNumberFormatTypes
>( _rxNumberFormats
, UNO_QUERY
),
559 SvtSysLocale().GetLanguageTag().getLocale()
563 Any
aScaleVal( ::comphelper::getNumberFormatDecimals( _rxNumberFormats
, nFormatKey
) );
564 _rxControlModel
->setPropertyValue( FM_PROP_DECIMAL_ACCURACY
, aScaleVal
);
568 // minimum and maximum of the control according to the type of the database field
569 sal_Int32 nDataType
= DataType::OTHER
;
570 OSL_VERIFY( _rxDatabaseField
->getPropertyValue( FM_PROP_FIELDTYPE
) >>= nDataType
);
572 if ( xModelPSI
->hasPropertyByName( FM_PROP_VALUEMIN
)
573 && xModelPSI
->hasPropertyByName( FM_PROP_VALUEMAX
)
576 sal_Int32 nMinValue
= -1000000000, nMaxValue
= 1000000000;
579 case DataType::TINYINT
: nMinValue
= 0; nMaxValue
= 255; break;
580 case DataType::SMALLINT
: nMinValue
= -32768; nMaxValue
= 32767; break;
581 case DataType::INTEGER
: nMinValue
= 0x80000000; nMaxValue
= 0x7FFFFFFF; break;
582 // double and singles are ignored
587 // both the minimum and the maximum value properties can be either Long or Double
588 Property aProperty
= xModelPSI
->getPropertyByName( FM_PROP_VALUEMIN
);
589 if ( aProperty
.Type
.getTypeClass() == TypeClass_DOUBLE
)
590 aValue
<<= static_cast<double>(nMinValue
);
591 else if ( aProperty
.Type
.getTypeClass() == TypeClass_LONG
)
592 aValue
<<= nMinValue
;
595 OSL_FAIL( "FormControlFactory::initializeFieldDependentProperties: unexpected property type (MinValue)!" );
597 _rxControlModel
->setPropertyValue( FM_PROP_VALUEMIN
, aValue
);
599 // both the minimum and the maximum value properties can be either Long or Double
600 aProperty
= xModelPSI
->getPropertyByName( FM_PROP_VALUEMAX
);
601 if ( aProperty
.Type
.getTypeClass() == TypeClass_DOUBLE
)
602 aValue
<<= static_cast<double>(nMaxValue
);
603 else if ( aProperty
.Type
.getTypeClass() == TypeClass_LONG
)
604 aValue
<<= nMaxValue
;
607 OSL_FAIL( "FormControlFactory::initializeFieldDependentProperties: unexpected property type (MaxValue)!" );
609 _rxControlModel
->setPropertyValue( FM_PROP_VALUEMAX
, aValue
);
613 // a check box can be tristate if and only if the column it is bound to is nullable
614 sal_Int16 nClassId
= FormComponentType::CONTROL
;
615 OSL_VERIFY( _rxControlModel
->getPropertyValue( FM_PROP_CLASSID
) >>= nClassId
);
616 if ( nClassId
== FormComponentType::CHECKBOX
)
618 sal_Int32 nNullable
= ColumnValue::NULLABLE_UNKNOWN
;
619 OSL_VERIFY( _rxDatabaseField
->getPropertyValue( FM_PROP_ISNULLABLE
) >>= nNullable
);
620 _rxControlModel
->setPropertyValue( FM_PROP_TRISTATE
, Any( ColumnValue::NO_NULLS
!= nNullable
) );
623 catch( const Exception
& )
625 DBG_UNHANDLED_EXCEPTION("svx");
630 OUString
FormControlFactory::getDefaultName( sal_Int16 _nClassId
, const Reference
< XServiceInfo
>& _rxObject
)
636 case FormComponentType::COMMANDBUTTON
: pResId
= RID_STR_PROPTITLE_PUSHBUTTON
; break;
637 case FormComponentType::RADIOBUTTON
: pResId
= RID_STR_PROPTITLE_RADIOBUTTON
; break;
638 case FormComponentType::CHECKBOX
: pResId
= RID_STR_PROPTITLE_CHECKBOX
; break;
639 case FormComponentType::LISTBOX
: pResId
= RID_STR_PROPTITLE_LISTBOX
; break;
640 case FormComponentType::COMBOBOX
: pResId
= RID_STR_PROPTITLE_COMBOBOX
; break;
641 case FormComponentType::GROUPBOX
: pResId
= RID_STR_PROPTITLE_GROUPBOX
; break;
642 case FormComponentType::IMAGEBUTTON
: pResId
= RID_STR_PROPTITLE_IMAGEBUTTON
; break;
643 case FormComponentType::FIXEDTEXT
: pResId
= RID_STR_PROPTITLE_FIXEDTEXT
; break;
644 case FormComponentType::GRIDCONTROL
: pResId
= RID_STR_PROPTITLE_DBGRID
; break;
645 case FormComponentType::FILECONTROL
: pResId
= RID_STR_PROPTITLE_FILECONTROL
; break;
646 case FormComponentType::DATEFIELD
: pResId
= RID_STR_PROPTITLE_DATEFIELD
; break;
647 case FormComponentType::TIMEFIELD
: pResId
= RID_STR_PROPTITLE_TIMEFIELD
; break;
648 case FormComponentType::NUMERICFIELD
: pResId
= RID_STR_PROPTITLE_NUMERICFIELD
; break;
649 case FormComponentType::CURRENCYFIELD
: pResId
= RID_STR_PROPTITLE_CURRENCYFIELD
; break;
650 case FormComponentType::PATTERNFIELD
: pResId
= RID_STR_PROPTITLE_PATTERNFIELD
; break;
651 case FormComponentType::IMAGECONTROL
: pResId
= RID_STR_PROPTITLE_IMAGECONTROL
; break;
652 case FormComponentType::HIDDENCONTROL
: pResId
= RID_STR_PROPTITLE_HIDDEN
; break;
653 case FormComponentType::SCROLLBAR
: pResId
= RID_STR_PROPTITLE_SCROLLBAR
; break;
654 case FormComponentType::SPINBUTTON
: pResId
= RID_STR_PROPTITLE_SPINBUTTON
; break;
655 case FormComponentType::NAVIGATIONBAR
: pResId
= RID_STR_PROPTITLE_NAVBAR
; break;
657 case FormComponentType::TEXTFIELD
:
658 pResId
= RID_STR_PROPTITLE_EDIT
;
659 if ( _rxObject
.is() && _rxObject
->supportsService( FM_SUN_COMPONENT_FORMATTEDFIELD
) )
660 pResId
= RID_STR_PROPTITLE_FORMATTED
;
664 pResId
= RID_STR_CONTROL
; break;
667 return SvxResId(pResId
);
671 OUString
FormControlFactory::getDefaultUniqueName_ByComponentType( const Reference
< XNameAccess
>& _rxContainer
,
672 const Reference
< XPropertySet
>& _rxObject
)
674 sal_Int16 nClassId
= FormComponentType::CONTROL
;
675 OSL_VERIFY( _rxObject
->getPropertyValue( FM_PROP_CLASSID
) >>= nClassId
);
676 OUString sBaseName
= getDefaultName( nClassId
, Reference
< XServiceInfo
>( _rxObject
, UNO_QUERY
) );
678 return getUniqueName( _rxContainer
, sBaseName
);
682 OUString
FormControlFactory::getUniqueName( const Reference
< XNameAccess
>& _rxContainer
, std::u16string_view _rBaseName
)
688 OUStringBuffer
aBuf( _rBaseName
);
691 sName
= aBuf
.makeStringAndClear();
693 while ( _rxContainer
->hasByName( sName
) );
702 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */