Files
loongoffice/extensions/source/propctrlr/formcomponenthandler.cxx
Thomas Arnhold ba0a57702c remove OUString wrap for string literals
For some functions and all kinds of Exceptions.

CannotConvertException
CloseVetoException
DisposedException
EmptyUndoStackException
ErrorCodeIOException
Exception
GridInvalidDataException
GridInvalidModelException
IOException
IllegalAccessException
IllegalArgumentException
IllegalTypeException
IndexOutOfBoundsException
NoMasterException
NoSuchElementException
NoSupportException
PropertyVetoException
RuntimeException
SAXException
ScannerException
StorageWrappedTargetException
UnsupportedFlavorException
VetoException
WrappedTargetException
ZipIOException
throwGenericSQLException
throwIllegallArgumentException

createInstance
createInstanceWithContext
forName
getByName
getPackageManager
getPropertyValue
getUnpackedValueOrDefault
getValueByName
hasPropertyByName
openKey
setName
setPropertyValue
supportsService

bash command:

for i in `cat list`; do git grep "$i\s*(\s*OUString(\s*\"" -- '*.[hc]xx'
	| cut -d ':' -f1 | sort -u
	| xargs sed -i
		-e "s/\(\<$i\s*(\)\s*OUString(\s*\(\"[^\")\\]*\"\)\s*)\s*/\1\2/g"
		-e "s/\($i.*\)\"+ /\1\" + /g";
done

Change-Id: Iaf8e641b0abf28c082906014f87a183517630535
Reviewed-on: https://gerrit.libreoffice.org/4624
Tested-by: LibreOffice gerrit bot <gerrit@libreoffice.org>
Reviewed-by: Thomas Arnhold <thomas@arnhold.org>
Tested-by: Thomas Arnhold <thomas@arnhold.org>
2013-06-29 21:52:54 +00:00

3329 lines
142 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* This file incorporates work covered by the following license notice:
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you under the Apache
* License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
#include "controltype.hxx"
#include "propctrlr.hrc"
#include "extensio.hrc"
#include "fontdialog.hxx"
#include "formcomponenthandler.hxx"
#include "formlinkdialog.hxx"
#include "formmetadata.hxx"
#include "formresid.hrc"
#include "formstrings.hxx"
#include "handlerhelper.hxx"
#include "listselectiondlg.hxx"
#include "pcrcommon.hxx"
#include "selectlabeldialog.hxx"
#include "taborder.hxx"
#include "usercontrol.hxx"
#include <com/sun/star/lang/NullPointerException.hpp>
#include <com/sun/star/awt/XControlModel.hpp>
#include <com/sun/star/lang/XServiceInfo.hpp>
#include <com/sun/star/form/FormComponentType.hpp>
#include <com/sun/star/beans/PropertyAttribute.hpp>
#include <com/sun/star/util/XNumberFormatsSupplier.hpp>
#include <com/sun/star/container/XNameAccess.hpp>
#include <com/sun/star/form/XForm.hpp>
#include <com/sun/star/container/XChild.hpp>
#include <com/sun/star/sdb/OrderDialog.hpp>
#include <com/sun/star/sdb/FilterDialog.hpp>
#include <com/sun/star/sdbc/XConnection.hpp>
#include <com/sun/star/sdb/CommandType.hpp>
#include <com/sun/star/sdb/DatabaseContext.hpp>
#include <com/sun/star/form/XGridColumnFactory.hpp>
#include <com/sun/star/sdb/SQLContext.hpp>
#include <com/sun/star/sdbcx/XTablesSupplier.hpp>
#include <com/sun/star/sdb/XQueriesSupplier.hpp>
#include <com/sun/star/form/ListSourceType.hpp>
#include <com/sun/star/ui/dialogs/XExecutableDialog.hpp>
#include <com/sun/star/sdb/XSingleSelectQueryComposer.hpp>
#include <com/sun/star/ui/dialogs/XFilePickerControlAccess.hpp>
#include <com/sun/star/ui/dialogs/TemplateDescription.hpp>
#include <com/sun/star/ui/dialogs/ExtendedFilePickerElementIds.hpp>
#include <com/sun/star/awt/XTabControllerModel.hpp>
#include <com/sun/star/form/FormSubmitEncoding.hpp>
#include <com/sun/star/awt/VisualEffect.hpp>
#include <com/sun/star/form/FormButtonType.hpp>
#include <com/sun/star/inspection/PropertyControlType.hpp>
#include <com/sun/star/util/MeasureUnit.hpp>
#include <com/sun/star/inspection/XObjectInspectorUI.hpp>
#include <com/sun/star/inspection/PropertyLineElement.hpp>
#include <com/sun/star/resource/XStringResourceManager.hpp>
#include <com/sun/star/resource/MissingResourceException.hpp>
#include <com/sun/star/graphic/GraphicObject.hpp>
#include <com/sun/star/text/WritingMode2.hpp>
#include <comphelper/extract.hxx>
#include <connectivity/dbconversion.hxx>
#include <connectivity/dbexception.hxx>
#include <cppuhelper/exc_hlp.hxx>
#include <sfx2/app.hxx>
#include <sfx2/basedlgs.hxx>
#include <sfx2/docfilt.hxx>
#include <sfx2/filedlghelper.hxx>
#include <svl/ctloptions.hxx>
#include <svtools/colrdlg.hxx>
#include <svl/filenotation.hxx>
#include <svl/intitem.hxx>
#include <svl/itemset.hxx>
#include <unotools/moduleoptions.hxx>
#include <svl/numuno.hxx>
#include <svl/urihelper.hxx>
#include <svx/dialogs.hrc>
#include <svx/numinf.hxx>
#include <svx/svxdlg.hxx>
#include <svx/svxids.hrc>
#include <toolkit/helper/vclunohelper.hxx>
#include <tools/diagnose_ex.h>
#include <vcl/msgbox.hxx>
#include <vcl/stdtext.hxx>
#include <vcl/wrkwin.hxx>
#include <tools/StringListResource.hxx>
#include <sal/macros.h>
#include <limits>
#define GRAPHOBJ_URLPREFIX "vnd.sun.star.GraphicObject:"
//------------------------------------------------------------------------
extern "C" void SAL_CALL createRegistryInfo_FormComponentPropertyHandler()
{
::pcr::FormComponentPropertyHandler::registerImplementation();
}
//........................................................................
namespace pcr
{
//........................................................................
using namespace ::com::sun::star;
using namespace uno;
using namespace lang;
using namespace beans;
using namespace frame;
using namespace script;
using namespace form;
using namespace util;
using namespace awt;
using namespace sdb;
using namespace sdbc;
using namespace sdbcx;
using namespace container;
using namespace ui::dialogs;
using namespace inspection;
using namespace ::dbtools;
namespace WritingMode2 = ::com::sun::star::text::WritingMode2;
//====================================================================
//= FormComponentPropertyHandler
//====================================================================
DBG_NAME( FormComponentPropertyHandler )
#define PROPERTY_ID_ROWSET 1
//--------------------------------------------------------------------
FormComponentPropertyHandler::FormComponentPropertyHandler( const Reference< XComponentContext >& _rxContext )
:FormComponentPropertyHandler_Base( _rxContext )
,::comphelper::OPropertyContainer(FormComponentPropertyHandler_Base::rBHelper)
,m_sDefaultValueString( String( PcrRes( RID_STR_STANDARD ) ) )
,m_eComponentClass( eUnknown )
,m_bComponentIsSubForm( false )
,m_bHaveListSource( false )
,m_bHaveCommand( false )
,m_nClassId( 0 )
{
DBG_CTOR( FormComponentPropertyHandler, NULL );
registerProperty(PROPERTY_ROWSET,PROPERTY_ID_ROWSET,0,&m_xRowSet,::getCppuType(&m_xRowSet));
}
//--------------------------------------------------------------------
FormComponentPropertyHandler::~FormComponentPropertyHandler()
{
DBG_DTOR( FormComponentPropertyHandler, NULL );
}
//--------------------------------------------------------------------
IMPLEMENT_FORWARD_XINTERFACE2(FormComponentPropertyHandler,FormComponentPropertyHandler_Base,::comphelper::OPropertyContainer)
//--------------------------------------------------------------------
OUString SAL_CALL FormComponentPropertyHandler::getImplementationName_static( ) throw (RuntimeException)
{
return OUString( "com.sun.star.comp.extensions.FormComponentPropertyHandler" );
}
//--------------------------------------------------------------------
Sequence< OUString > SAL_CALL FormComponentPropertyHandler::getSupportedServiceNames_static( ) throw (RuntimeException)
{
Sequence< OUString > aSupported( 1 );
aSupported[0] = OUString( "com.sun.star.form.inspection.FormComponentPropertyHandler" );
return aSupported;
}
//============================================
// TODO: -> export from toolkit
struct LanguageDependentProp
{
const char* pPropName;
sal_Int32 nPropNameLength;
};
static LanguageDependentProp aLanguageDependentProp[] =
{
{ "Text", 4 },
{ "Label", 5 },
{ "Title", 5 },
{ "HelpText", 8 },
{ "CurrencySymbol", 14 },
{ "StringItemList", 14 },
{ 0, 0 }
};
namespace
{
bool lcl_isLanguageDependentProperty( OUString aName )
{
bool bRet = false;
LanguageDependentProp* pLangDepProp = aLanguageDependentProp;
while( pLangDepProp->pPropName != 0 )
{
if( aName.equalsAsciiL( pLangDepProp->pPropName, pLangDepProp->nPropNameLength ))
{
bRet = true;
break;
}
pLangDepProp++;
}
return bRet;
}
Reference< resource::XStringResourceResolver > lcl_getStringResourceResolverForProperty
( Reference< XPropertySet > _xComponent, const OUString& _rPropertyName,
const Any& _rPropertyValue )
{
Reference< resource::XStringResourceResolver > xRet;
const TypeClass eType = _rPropertyValue.getValueType().getTypeClass();
if ( (eType == TypeClass_STRING || eType == TypeClass_SEQUENCE) &&
lcl_isLanguageDependentProperty( _rPropertyName ) )
{
static const OUString s_sResourceResolverPropName("ResourceResolver");
Reference< resource::XStringResourceResolver > xStringResourceResolver;
try
{
xStringResourceResolver.set( _xComponent->getPropertyValue( s_sResourceResolverPropName ),UNO_QUERY);
if( xStringResourceResolver.is() &&
xStringResourceResolver->getLocales().getLength() > 0 )
{
xRet = xStringResourceResolver;
}
}
catch(const UnknownPropertyException&)
{
// nii
}
}
return xRet;
}
}
//--------------------------------------------------------------------
Any FormComponentPropertyHandler::impl_getPropertyValue_throw( const OUString& _rPropertyName ) const
{
const PropertyId nPropId( impl_getPropertyId_throw( _rPropertyName ) );
Any aPropertyValue( m_xComponent->getPropertyValue( _rPropertyName ) );
Reference< resource::XStringResourceResolver > xStringResourceResolver
= lcl_getStringResourceResolverForProperty( m_xComponent, _rPropertyName, aPropertyValue );
if( xStringResourceResolver.is() )
{
TypeClass eType = aPropertyValue.getValueType().getTypeClass();
if( eType == TypeClass_STRING )
{
OUString aPropStr;
aPropertyValue >>= aPropStr;
if( aPropStr.getLength() > 1 )
{
OUString aPureIdStr = aPropStr.copy( 1 );
if( xStringResourceResolver->hasEntryForId( aPureIdStr ) )
{
OUString aResourceStr = xStringResourceResolver->resolveString( aPureIdStr );
aPropertyValue <<= aResourceStr;
}
}
}
// StringItemList?
else if( eType == TypeClass_SEQUENCE )
{
Sequence< OUString > aStrings;
aPropertyValue >>= aStrings;
const OUString* pStrings = aStrings.getConstArray();
sal_Int32 nCount = aStrings.getLength();
Sequence< OUString > aResolvedStrings;
aResolvedStrings.realloc( nCount );
OUString* pResolvedStrings = aResolvedStrings.getArray();
try
{
for ( sal_Int32 i = 0; i < nCount; ++i )
{
OUString aIdStr = pStrings[i];
OUString aPureIdStr = aIdStr.copy( 1 );
if( xStringResourceResolver->hasEntryForId( aPureIdStr ) )
pResolvedStrings[i] = xStringResourceResolver->resolveString( aPureIdStr );
else
pResolvedStrings[i] = aIdStr;
}
}
catch( const resource::MissingResourceException & )
{}
aPropertyValue <<= aResolvedStrings;
}
}
else
impl_normalizePropertyValue_nothrow( aPropertyValue, nPropId );
return aPropertyValue;
}
//--------------------------------------------------------------------
Any SAL_CALL FormComponentPropertyHandler::getPropertyValue( const OUString& _rPropertyName ) throw (UnknownPropertyException, RuntimeException)
{
if( _rPropertyName == PROPERTY_ROWSET )
return ::comphelper::OPropertyContainer::getPropertyValue( _rPropertyName );
::osl::MutexGuard aGuard( m_aMutex );
return impl_getPropertyValue_throw( _rPropertyName );
}
//--------------------------------------------------------------------
void SAL_CALL FormComponentPropertyHandler::setPropertyValue( const OUString& _rPropertyName, const Any& _rValue ) throw (UnknownPropertyException, RuntimeException)
{
if( _rPropertyName == PROPERTY_ROWSET )
{
::comphelper::OPropertyContainer::setPropertyValue( _rPropertyName, _rValue );
return;
}
::osl::MutexGuard aGuard( m_aMutex );
PropertyId nPropId( impl_getPropertyId_throw( _rPropertyName ) ); // check if property is known by the handler
Reference< graphic::XGraphicObject > xGrfObj;
if ( PROPERTY_ID_IMAGE_URL == nPropId && ( _rValue >>= xGrfObj ) )
{
DBG_ASSERT( xGrfObj.is(), "FormComponentPropertyHandler::setPropertyValue() xGrfObj is invalid");
OUString sObjectID( GRAPHOBJ_URLPREFIX );
sObjectID = sObjectID + xGrfObj->getUniqueID();
m_xComponent->setPropertyValue( _rPropertyName, uno::makeAny( sObjectID ) );
}
else if ( PROPERTY_ID_FONT == nPropId )
{
// special handling, the value is a faked value we generated ourself in impl_executeFontDialog_nothrow
Sequence< NamedValue > aFontPropertyValues;
OSL_VERIFY( _rValue >>= aFontPropertyValues );
const NamedValue* fontPropertyValue = aFontPropertyValues.getConstArray();
const NamedValue* fontPropertyValueEnd = fontPropertyValue + aFontPropertyValues.getLength();
for ( ; fontPropertyValue != fontPropertyValueEnd; ++fontPropertyValue )
m_xComponent->setPropertyValue( fontPropertyValue->Name, fontPropertyValue->Value );
}
else
{
Any aValue = _rValue;
Reference< resource::XStringResourceResolver > xStringResourceResolver
= lcl_getStringResourceResolverForProperty( m_xComponent, _rPropertyName, _rValue );
if( xStringResourceResolver.is() )
{
Reference< resource::XStringResourceManager >
xStringResourceManager( xStringResourceResolver, UNO_QUERY );
if( xStringResourceManager.is() )
{
Any aPropertyValue( m_xComponent->getPropertyValue( _rPropertyName ) );
TypeClass eType = aPropertyValue.getValueType().getTypeClass();
if( eType == TypeClass_STRING )
{
OUString aPropStr;
aPropertyValue >>= aPropStr;
if( aPropStr.getLength() > 1 )
{
OUString aPureIdStr = aPropStr.copy( 1 );
OUString aValueStr;
_rValue >>= aValueStr;
xStringResourceManager->setString( aPureIdStr, aValueStr );
aValue = aPropertyValue; // set value to force modified
}
}
// StringItemList?
else if( eType == TypeClass_SEQUENCE )
{
static OUString aDot(".");
static OUString aEsc("&");
// Put strings into resource using new ids
Sequence< OUString > aNewStrings;
_rValue >>= aNewStrings;
const OUString* pNewStrings = aNewStrings.getConstArray();
sal_Int32 nNewCount = aNewStrings.getLength();
// Create new Ids
OUString* pNewPureIds = new OUString[nNewCount];
OUString aIdStrBase = aDot;
Any aNameAny = m_xComponent->getPropertyValue(PROPERTY_NAME);
OUString sControlName;
aNameAny >>= sControlName;
aIdStrBase += sControlName;
aIdStrBase += aDot;
aIdStrBase += _rPropertyName;
sal_Int32 i;
OUString aDummyStr;
for ( i = 0; i < nNewCount; ++i )
{
sal_Int32 nUniqueId = xStringResourceManager->getUniqueNumericId();
OUString aPureIdStr = OUString::valueOf( nUniqueId );
aPureIdStr += aIdStrBase;
pNewPureIds[i] = aPureIdStr;
// Force usage of next Unique Id
xStringResourceManager->setString( aPureIdStr, aDummyStr );
}
// Move strings to new Ids for all locales
Sequence< Locale > aLocaleSeq = xStringResourceManager->getLocales();
const Locale* pLocale = aLocaleSeq.getConstArray();
sal_Int32 nLocaleCount = aLocaleSeq.getLength();
Sequence< OUString > aOldIdStrings;
aPropertyValue >>= aOldIdStrings;
try
{
const OUString* pOldIdStrings = aOldIdStrings.getConstArray();
sal_Int32 nOldIdCount = aOldIdStrings.getLength();
for ( i = 0; i < nNewCount; ++i )
{
OUString aOldIdStr;
OUString aOldPureIdStr;
if( i < nOldIdCount )
{
aOldIdStr = pOldIdStrings[i];
aOldPureIdStr = aOldIdStr.copy( 1 );
}
OUString aNewPureIdStr = pNewPureIds[i];
for ( sal_Int32 iLocale = 0; iLocale < nLocaleCount; ++iLocale )
{
Locale aLocale = pLocale[iLocale];
OUString aResourceStr;
if( !aOldPureIdStr.isEmpty() )
{
if( xStringResourceManager->hasEntryForIdAndLocale( aOldPureIdStr, aLocale ) )
{
aResourceStr = xStringResourceManager->
resolveStringForLocale( aOldPureIdStr, aLocale );
}
}
xStringResourceManager->setStringForLocale( aNewPureIdStr, aResourceStr, aLocale );
}
}
}
catch( const resource::MissingResourceException & )
{}
// Set new strings for current locale and create
// new Id sequence as new property value
Sequence< OUString > aNewIdStrings;
aNewIdStrings.realloc( nNewCount );
OUString* pNewIdStrings = aNewIdStrings.getArray();
for ( i = 0; i < nNewCount; ++i )
{
OUString aPureIdStr = pNewPureIds[i];
OUString aStr = pNewStrings[i];
xStringResourceManager->setString( aPureIdStr, aStr );
OUString aIdStr = aEsc;
aIdStr += aPureIdStr;
pNewIdStrings[i] = aIdStr;
}
aValue <<= aNewIdStrings;
// Remove old ids from resource for all locales
const OUString* pOldIdStrings = aOldIdStrings.getConstArray();
sal_Int32 nOldIdCount = aOldIdStrings.getLength();
for( i = 0 ; i < nOldIdCount ; ++i )
{
OUString aIdStr = pOldIdStrings[i];
OUString aPureIdStr = aIdStr.copy( 1 );
for ( sal_Int32 iLocale = 0; iLocale < nLocaleCount; ++iLocale )
{
Locale aLocale = pLocale[iLocale];
try
{
xStringResourceManager->removeIdForLocale( aPureIdStr, aLocale );
}
catch( const resource::MissingResourceException & )
{}
}
}
delete[] pNewPureIds;
}
}
}
m_xComponent->setPropertyValue( _rPropertyName, aValue );
}
}
//--------------------------------------------------------------------
Any SAL_CALL FormComponentPropertyHandler::convertToPropertyValue( const OUString& _rPropertyName, const Any& _rControlValue ) throw (UnknownPropertyException, RuntimeException)
{
::osl::MutexGuard aGuard( m_aMutex );
PropertyId nPropId( impl_getPropertyId_throw( _rPropertyName ) );
Property aProperty( impl_getPropertyFromId_throw( nPropId ) );
Any aPropertyValue( _rControlValue );
if ( !aPropertyValue.hasValue() )
{
if ( ( aProperty.Attributes & PropertyAttribute::MAYBEVOID ) == 0 )
// default construct an instance of the proper type
aPropertyValue = Any( NULL, aProperty.Type );
// nothing to do
return aPropertyValue;
}
/// care for the special "default" string, translate it to VOID
if ( m_aPropertiesWithDefListEntry.find( _rPropertyName ) != m_aPropertiesWithDefListEntry.end() )
{
// it's a control with a string list
OUString sStringValue;
if ( _rControlValue >>= sStringValue )
{ // note that ColorListBoxes might transfer values either as string or as css.util.Color,
// so this check here is important
if ( sStringValue == m_sDefaultValueString )
return Any();
}
}
switch ( nPropId )
{
case PROPERTY_ID_DATASOURCE:
{
OUString sControlValue;
OSL_VERIFY( _rControlValue >>= sControlValue );
if ( !sControlValue.isEmpty() )
{
Reference< XDatabaseContext > xDatabaseContext = sdb::DatabaseContext::create( m_xContext );
if ( !xDatabaseContext->hasByName( sControlValue ) )
{
::svt::OFileNotation aTransformer(sControlValue);
aPropertyValue <<= OUString( aTransformer.get( ::svt::OFileNotation::N_URL ) );
}
}
}
break; // case PROPERTY_ID_DATASOURCE
case PROPERTY_ID_SHOW_POSITION:
case PROPERTY_ID_SHOW_NAVIGATION:
case PROPERTY_ID_SHOW_RECORDACTIONS:
case PROPERTY_ID_SHOW_FILTERSORT:
{
OUString sControlValue;
OSL_VERIFY( _rControlValue >>= sControlValue );
::std::vector< OUString > aListEntries;
tools::StringListResource aRes( PcrRes( RID_RSC_ENUM_SHOWHIDE ), aListEntries );
OSL_ENSURE( aListEntries.size() == 2, "FormComponentPropertyHandler::convertToPropertyValue: broken resource for Show/Hide!" );
sal_Bool bShow = ( aListEntries.size() < 2 ) || ( sControlValue == aListEntries[1] );
aPropertyValue <<= bShow;
}
break;
case PROPERTY_ID_TARGET_URL:
case PROPERTY_ID_IMAGE_URL:
{
OUString sControlValue;
OSL_VERIFY( _rControlValue >>= sControlValue );
// Don't convert a placeholder
if ( nPropId == PROPERTY_ID_IMAGE_URL && sControlValue.equals( String( PcrRes( RID_EMBED_IMAGE_PLACEHOLDER ) ) ) )
aPropertyValue <<= sControlValue;
else
{
INetURLObject aDocURL( impl_getDocumentURL_nothrow() );
aPropertyValue <<= (OUString)URIHelper::SmartRel2Abs( aDocURL, sControlValue, Link(), false, true, INetURLObject::WAS_ENCODED, INetURLObject::DECODE_TO_IURI );
}
}
break;
case PROPERTY_ID_DATEMIN:
case PROPERTY_ID_DATEMAX:
case PROPERTY_ID_DEFAULT_DATE:
case PROPERTY_ID_DATE:
{
util::Date aDate;
OSL_VERIFY( _rControlValue >>= aDate );
aPropertyValue <<= (sal_Int32)DBTypeConversion::toINT32( aDate );
}
break;
case PROPERTY_ID_TIMEMIN:
case PROPERTY_ID_TIMEMAX:
case PROPERTY_ID_DEFAULT_TIME:
case PROPERTY_ID_TIME:
{
util::Time aTime;
OSL_VERIFY( _rControlValue >>= aTime );
aPropertyValue <<= DBTypeConversion::toINT64( aTime );
}
break;
case PROPERTY_ID_WRITING_MODE:
{
aPropertyValue = FormComponentPropertyHandler_Base::convertToPropertyValue( _rPropertyName, _rControlValue );
sal_Int16 nNormalizedValue( 2 );
OSL_VERIFY( aPropertyValue >>= nNormalizedValue );
sal_Int16 nWritingMode = WritingMode2::CONTEXT;
switch ( nNormalizedValue )
{
case 0: nWritingMode = WritingMode2::LR_TB; break;
case 1: nWritingMode = WritingMode2::RL_TB; break;
case 2: nWritingMode = WritingMode2::CONTEXT; break;
default:
OSL_FAIL( "FormComponentPropertyHandler::convertToPropertyValue: unexpected 'normalized value' for WritingMode!" );
nWritingMode = WritingMode2::CONTEXT;
break;
}
aPropertyValue <<= nWritingMode;
}
break;
default:
aPropertyValue = FormComponentPropertyHandler_Base::convertToPropertyValue( _rPropertyName, _rControlValue );
break; // default
} // switch ( nPropId )
return aPropertyValue;
}
//--------------------------------------------------------------------
Any SAL_CALL FormComponentPropertyHandler::convertToControlValue( const OUString& _rPropertyName, const Any& _rPropertyValue, const Type& _rControlValueType ) throw (UnknownPropertyException, RuntimeException)
{
::osl::MutexGuard aGuard( m_aMutex );
sal_Int32 nPropId = m_pInfoService->getPropertyId( _rPropertyName );
DBG_ASSERT( nPropId != -1, "FormComponentPropertyHandler::convertToPropertyValue: not one of my properties!!" );
Property aProperty( impl_getPropertyFromId_throw( nPropId ) );
Any aControlValue( _rPropertyValue );
if ( !aControlValue.hasValue() )
{
// if the property is represented with a list box or color list box, we need to
// translate this into the string "Default"
if ( m_aPropertiesWithDefListEntry.find( _rPropertyName ) != m_aPropertiesWithDefListEntry.end() )
aControlValue <<= m_sDefaultValueString;
return aControlValue;
}
switch ( nPropId )
{
//////////////////////////////////////////////////////////////
case PROPERTY_ID_SHOW_POSITION:
case PROPERTY_ID_SHOW_NAVIGATION:
case PROPERTY_ID_SHOW_RECORDACTIONS:
case PROPERTY_ID_SHOW_FILTERSORT:
{
::std::vector< OUString > aListEntries;
tools::StringListResource aRes( PcrRes( RID_RSC_ENUM_SHOWHIDE ), aListEntries );
OSL_ENSURE( aListEntries.size() == 2, "FormComponentPropertyHandler::convertToControlValue: broken resource for Show/Hide!" );
if ( aListEntries.size() == 2 )
{
OUString sControlValue = ::comphelper::getBOOL( _rPropertyValue )
? aListEntries[1]
: aListEntries[0];
aControlValue <<= sControlValue;
}
}
break;
//////////////////////////////////////////////////////////////
case PROPERTY_ID_DATASOURCE:
{
OSL_ENSURE( _rControlValueType.getTypeClass() == TypeClass_STRING,
"FormComponentPropertyHandler::convertToControlValue: wrong ControlValueType!" );
OUString sDataSource;
_rPropertyValue >>= sDataSource;
if ( !sDataSource.isEmpty() )
{
::svt::OFileNotation aTransformer( sDataSource );
sDataSource = aTransformer.get( ::svt::OFileNotation::N_SYSTEM );
}
aControlValue <<= sDataSource;
}
break;
//////////////////////////////////////////////////////////////
case PROPERTY_ID_CONTROLLABEL:
{
OUString sControlValue;
Reference< XPropertySet > xSet;
_rPropertyValue >>= xSet;
Reference< XPropertySetInfo > xPSI;
if ( xSet.is() )
xPSI = xSet->getPropertySetInfo();
if ( xPSI.is() && xPSI->hasPropertyByName( PROPERTY_LABEL ) )
{
OUStringBuffer aValue;
aValue.append( (sal_Unicode)'<' );
OUString sLabel;
OSL_VERIFY( xSet->getPropertyValue( PROPERTY_LABEL ) >>= sLabel );
aValue.append( sLabel );
aValue.append( (sal_Unicode)'>' );
sControlValue = aValue.makeStringAndClear();
}
aControlValue <<= sControlValue;
}
break;
//////////////////////////////////////////////////////////////
case PROPERTY_ID_DATEMIN:
case PROPERTY_ID_DATEMAX:
case PROPERTY_ID_DEFAULT_DATE:
case PROPERTY_ID_DATE:
{
sal_Int32 nDate = 0;
OSL_VERIFY( _rPropertyValue >>= nDate );
aControlValue <<= DBTypeConversion::toDate( nDate );
}
break;
case PROPERTY_ID_TIMEMIN:
case PROPERTY_ID_TIMEMAX:
case PROPERTY_ID_DEFAULT_TIME:
case PROPERTY_ID_TIME:
{
sal_Int64 nTime = 0;
OSL_VERIFY( _rPropertyValue >>= nTime );
aControlValue <<= DBTypeConversion::toTime( nTime );
}
break;
case PROPERTY_ID_WRITING_MODE:
{
sal_Int16 nWritingMode( WritingMode2::CONTEXT );
OSL_VERIFY( _rPropertyValue >>= nWritingMode );
sal_Int16 nNormalized = 2;
switch ( nWritingMode )
{
case WritingMode2::LR_TB: nNormalized = 0; break;
case WritingMode2::RL_TB: nNormalized = 1; break;
case WritingMode2::CONTEXT: nNormalized = 2; break;
default:
OSL_FAIL( "FormComponentPropertyHandler::convertToControlValue: unsupported API value for WritingMode!" );
nNormalized = 2;
break;
}
aControlValue = FormComponentPropertyHandler_Base::convertToControlValue( _rPropertyName, makeAny( nNormalized ), _rControlValueType );
}
break;
case PROPERTY_ID_FONT:
{
FontDescriptor aFont;
OSL_VERIFY( _rPropertyValue >>= aFont );
OUStringBuffer displayName;
if ( aFont.Name.isEmpty() )
{
displayName.append( String( PcrRes( RID_STR_FONT_DEFAULT ) ) );
}
else
{
// font name
displayName.append( aFont.Name );
displayName.appendAscii( ", " );
// font style
::FontWeight eWeight = VCLUnoHelper::ConvertFontWeight( aFont.Weight );
sal_uInt16 nStyleResID = RID_STR_FONTSTYLE_REGULAR;
if ( aFont.Slant == FontSlant_ITALIC )
{
if ( eWeight > WEIGHT_NORMAL )
nStyleResID = RID_STR_FONTSTYLE_BOLD_ITALIC;
else
nStyleResID = RID_STR_FONTSTYLE_ITALIC;
}
else
{
if ( eWeight > WEIGHT_NORMAL )
nStyleResID = RID_STR_FONTSTYLE_BOLD;
}
displayName.append( String( PcrRes( nStyleResID ) ) );
// font size
if ( aFont.Height )
{
displayName.appendAscii( ", " );
displayName.append( sal_Int32( aFont.Height ) );
}
}
aControlValue <<= displayName.makeStringAndClear();
}
break;
default:
aControlValue = FormComponentPropertyHandler_Base::convertToControlValue( _rPropertyName, _rPropertyValue, _rControlValueType );
break;
} // switch ( nPropId )
return aControlValue;
}
//--------------------------------------------------------------------
PropertyState SAL_CALL FormComponentPropertyHandler::getPropertyState( const OUString& _rPropertyName ) throw (UnknownPropertyException, RuntimeException)
{
::osl::MutexGuard aGuard( m_aMutex );
if ( m_xPropertyState.is() )
return m_xPropertyState->getPropertyState( _rPropertyName );
return PropertyState_DIRECT_VALUE;
}
//--------------------------------------------------------------------
void SAL_CALL FormComponentPropertyHandler::addPropertyChangeListener( const Reference< XPropertyChangeListener >& _rxListener ) throw (RuntimeException)
{
::osl::MutexGuard aGuard( m_aMutex );
FormComponentPropertyHandler_Base::addPropertyChangeListener( _rxListener );
if ( m_xComponent.is() )
m_xComponent->addPropertyChangeListener( OUString(), _rxListener );
}
//--------------------------------------------------------------------
void SAL_CALL FormComponentPropertyHandler::removePropertyChangeListener( const Reference< XPropertyChangeListener >& _rxListener ) throw (RuntimeException)
{
::osl::MutexGuard aGuard( m_aMutex );
if ( m_xComponent.is() )
m_xComponent->removePropertyChangeListener( OUString(), _rxListener );
FormComponentPropertyHandler_Base::removePropertyChangeListener( _rxListener );
}
//--------------------------------------------------------------------
void FormComponentPropertyHandler::onNewComponent()
{
FormComponentPropertyHandler_Base::onNewComponent();
if ( !m_xComponentPropertyInfo.is() && m_xComponent.is() )
throw NullPointerException();
m_xPropertyState.set( m_xComponent, UNO_QUERY );
m_eComponentClass = eUnknown;
m_bComponentIsSubForm = m_bHaveListSource = m_bHaveCommand = false;
m_nClassId = 0;
impl_initComponentMetaData_throw();
}
//--------------------------------------------------------------------
Sequence< Property > SAL_CALL FormComponentPropertyHandler::doDescribeSupportedProperties() const
{
if ( !m_xComponentPropertyInfo.is() )
return Sequence< Property >();
::std::vector< Property > aProperties;
Sequence< Property > aAllProperties( m_xComponentPropertyInfo->getProperties() );
aProperties.reserve( aAllProperties.getLength() );
// filter the properties
PropertyId nPropId( 0 );
OUString sDisplayName;
Property* pProperty = aAllProperties.getArray();
Property* pPropertiesEnd = pProperty + aAllProperties.getLength();
for ( ; pProperty != pPropertiesEnd; ++pProperty )
{
nPropId = m_pInfoService->getPropertyId( pProperty->Name );
if ( nPropId == -1 )
continue;
pProperty->Handle = nPropId;
sDisplayName = m_pInfoService->getPropertyTranslation( nPropId );
if ( sDisplayName.isEmpty() )
continue;
sal_uInt32 nPropertyUIFlags = m_pInfoService->getPropertyUIFlags( nPropId );
bool bIsVisibleForForms = ( nPropertyUIFlags & PROP_FLAG_FORM_VISIBLE ) != 0;
bool bIsVisibleForDialogs = ( nPropertyUIFlags & PROP_FLAG_DIALOG_VISIBLE ) != 0;
// depending on whether we're working for a form or a UNO dialog, some
// properties are not displayed
if ( ( m_eComponentClass == eFormControl && !bIsVisibleForForms )
|| ( m_eComponentClass == eDialogControl && !bIsVisibleForDialogs )
)
continue;
// some generic sanity checks
if ( impl_shouldExcludeProperty_nothrow( *pProperty ) )
continue;
switch ( nPropId )
{
case PROPERTY_ID_BORDER:
case PROPERTY_ID_TABSTOP:
// BORDER and TABSTOP are normalized (see impl_normalizePropertyValue_nothrow)
// to not allow VOID values
pProperty->Attributes &= ~( PropertyAttribute::MAYBEVOID );
break;
case PROPERTY_ID_LISTSOURCE:
// no cursor source if no Base is installed. #124939#
// This fix is not intendend to appear on the main trunk. If you find it there,
// please tell me! frank.schoenheit@sun.com
if ( SvtModuleOptions().IsModuleInstalled( SvtModuleOptions::E_SDATABASE ) )
const_cast< FormComponentPropertyHandler* >( this )->m_bHaveListSource = true;
break;
case PROPERTY_ID_COMMAND:
// no cursor source if no Base is installed. #124939#
// This fix is not intendend to appear on the main trunk. If you find it there,
// please tell me! frank.schoenheit@sun.com
if ( SvtModuleOptions().IsModuleInstalled( SvtModuleOptions::E_SDATABASE ) )
const_cast< FormComponentPropertyHandler* >( this )->m_bHaveCommand = true;
break;
} // switch ( nPropId )
aProperties.push_back( *pProperty );
}
if ( aProperties.empty() )
return Sequence< Property >();
return Sequence< Property >( &(*aProperties.begin()), aProperties.size() );
}
//--------------------------------------------------------------------
Sequence< OUString > SAL_CALL FormComponentPropertyHandler::getSupersededProperties( ) throw (RuntimeException)
{
return Sequence< OUString >( );
}
//--------------------------------------------------------------------
Sequence< OUString > SAL_CALL FormComponentPropertyHandler::getActuatingProperties( ) throw (RuntimeException)
{
::osl::MutexGuard aGuard( m_aMutex );
::std::vector< OUString > aInterestingProperties;
aInterestingProperties.push_back( static_cast<const OUString&>(PROPERTY_DATASOURCE) );
aInterestingProperties.push_back( static_cast<const OUString&>(PROPERTY_COMMAND) );
aInterestingProperties.push_back( static_cast<const OUString&>(PROPERTY_COMMANDTYPE) );
aInterestingProperties.push_back( static_cast<const OUString&>(PROPERTY_LISTSOURCE) );
aInterestingProperties.push_back( static_cast<const OUString&>(PROPERTY_LISTSOURCETYPE) );
aInterestingProperties.push_back( static_cast<const OUString&>(PROPERTY_SUBMIT_ENCODING) );
aInterestingProperties.push_back( static_cast<const OUString&>(PROPERTY_REPEAT) );
aInterestingProperties.push_back( static_cast<const OUString&>(PROPERTY_TABSTOP) );
aInterestingProperties.push_back( static_cast<const OUString&>(PROPERTY_BORDER) );
aInterestingProperties.push_back( static_cast<const OUString&>(PROPERTY_CONTROLSOURCE) );
aInterestingProperties.push_back( static_cast<const OUString&>(PROPERTY_DROPDOWN) );
aInterestingProperties.push_back( static_cast<const OUString&>(PROPERTY_IMAGE_URL) );
aInterestingProperties.push_back( static_cast<const OUString&>(PROPERTY_TARGET_URL) );
aInterestingProperties.push_back( static_cast<const OUString&>(PROPERTY_STRINGITEMLIST) );
aInterestingProperties.push_back( static_cast<const OUString&>(PROPERTY_BUTTONTYPE) );
aInterestingProperties.push_back( static_cast<const OUString&>(PROPERTY_ESCAPE_PROCESSING) );
aInterestingProperties.push_back( static_cast<const OUString&>(PROPERTY_TRISTATE) );
aInterestingProperties.push_back( static_cast<const OUString&>(PROPERTY_DECIMAL_ACCURACY) );
aInterestingProperties.push_back( static_cast<const OUString&>(PROPERTY_SHOWTHOUSANDSEP) );
aInterestingProperties.push_back( static_cast<const OUString&>(PROPERTY_FORMATKEY) );
aInterestingProperties.push_back( static_cast<const OUString&>(PROPERTY_EMPTY_IS_NULL) );
aInterestingProperties.push_back( static_cast<const OUString&>(PROPERTY_TOGGLE) );
return Sequence< OUString >( &(*aInterestingProperties.begin()), aInterestingProperties.size() );
}
//--------------------------------------------------------------------
LineDescriptor SAL_CALL FormComponentPropertyHandler::describePropertyLine( const OUString& _rPropertyName,
const Reference< XPropertyControlFactory >& _rxControlFactory )
throw (UnknownPropertyException, NullPointerException, RuntimeException)
{
if ( !_rxControlFactory.is() )
throw NullPointerException();
::osl::MutexGuard aGuard( m_aMutex );
PropertyId nPropId( impl_getPropertyId_throw( _rPropertyName ) );
Property aProperty( impl_getPropertyFromId_throw( nPropId ) );
//////////////////////////////////////////////////////////////////////
// for the MultiLine property, we have different UI translations depending on the control
// type
if ( nPropId == PROPERTY_ID_MULTILINE )
{
if ( ( m_nClassId == FormComponentType::FIXEDTEXT )
|| ( m_nClassId == FormComponentType::COMMANDBUTTON )
|| ( m_nClassId == FormComponentType::RADIOBUTTON )
|| ( m_nClassId == FormComponentType::CHECKBOX )
)
nPropId = PROPERTY_ID_WORDBREAK;
}
String sDisplayName = m_pInfoService->getPropertyTranslation( nPropId );
if ( !sDisplayName.Len() )
{
OSL_FAIL( "FormComponentPropertyHandler::describePropertyLine: did getSupportedProperties not work properly?" );
throw UnknownPropertyException();
}
//////////////////////////////////////////////////////////////////////
LineDescriptor aDescriptor;
aDescriptor.HelpURL = HelpIdUrl::getHelpURL( m_pInfoService->getPropertyHelpId( nPropId ) );
aDescriptor.DisplayName = sDisplayName;
// for the moment, assume a text field
sal_Int16 nControlType = PropertyControlType::TextField;
sal_Bool bReadOnly = sal_False;
aDescriptor.Control.clear();
//////////////////////////////////////////////////////////////////////
bool bNeedDefaultStringIfVoidAllowed = false;
TypeClass eType = aProperty.Type.getTypeClass();
switch ( nPropId )
{
case PROPERTY_ID_DEFAULT_SELECT_SEQ:
case PROPERTY_ID_SELECTEDITEMS:
aDescriptor.PrimaryButtonId = OUString::createFromAscii(UID_PROP_DLG_SELECTION);
break;
case PROPERTY_ID_FILTER:
aDescriptor.PrimaryButtonId = OUString::createFromAscii(UID_PROP_DLG_FILTER);
break;
case PROPERTY_ID_SORT:
aDescriptor.PrimaryButtonId = OUString::createFromAscii(UID_PROP_DLG_ORDER);
break;
case PROPERTY_ID_MASTERFIELDS:
case PROPERTY_ID_DETAILFIELDS:
nControlType = PropertyControlType::StringListField;
aDescriptor.PrimaryButtonId = OUString::createFromAscii(UID_PROP_DLG_FORMLINKFIELDS);
break;
case PROPERTY_ID_COMMAND:
aDescriptor.PrimaryButtonId = OUString::createFromAscii(UID_PROP_DLG_SQLCOMMAND);
break;
case PROPERTY_ID_TABINDEX:
{
Reference< XControlContainer > xControlContext( impl_getContextControlContainer_nothrow() );
if ( xControlContext.is() )
aDescriptor.PrimaryButtonId = OUString::createFromAscii(UID_PROP_DLG_TABINDEX);
nControlType = PropertyControlType::NumericField;
};
break;
case PROPERTY_ID_FONT:
bReadOnly = sal_True;
aDescriptor.PrimaryButtonId = OUString::createFromAscii(UID_PROP_DLG_FONT_TYPE);
break;
case PROPERTY_ID_TARGET_URL:
case PROPERTY_ID_IMAGE_URL:
{
aDescriptor.Control = new OFileUrlControl( impl_getDefaultDialogParent_nothrow(), WB_TABSTOP | WB_BORDER );
aDescriptor.PrimaryButtonId = OUString::createFromAscii(( PROPERTY_ID_TARGET_URL == nPropId )
? UID_PROP_DLG_ATTR_TARGET_URL : UID_PROP_DLG_IMAGE_URL);
}
break;
case PROPERTY_ID_ECHO_CHAR:
nControlType = PropertyControlType::CharacterField;
break;
case PROPERTY_ID_BACKGROUNDCOLOR:
case PROPERTY_ID_FILLCOLOR:
case PROPERTY_ID_SYMBOLCOLOR:
case PROPERTY_ID_BORDERCOLOR:
nControlType = PropertyControlType::ColorListBox;
switch( nPropId )
{
case PROPERTY_ID_BACKGROUNDCOLOR:
aDescriptor.PrimaryButtonId = OUString::createFromAscii(UID_PROP_DLG_BACKGROUNDCOLOR); break;
case PROPERTY_ID_FILLCOLOR:
aDescriptor.PrimaryButtonId = OUString::createFromAscii(UID_PROP_DLG_FILLCOLOR); break;
case PROPERTY_ID_SYMBOLCOLOR:
aDescriptor.PrimaryButtonId = OUString::createFromAscii(UID_PROP_DLG_SYMBOLCOLOR); break;
case PROPERTY_ID_BORDERCOLOR:
aDescriptor.PrimaryButtonId = OUString::createFromAscii(UID_PROP_DLG_BORDERCOLOR); break;
}
break;
case PROPERTY_ID_LABEL:
nControlType = PropertyControlType::MultiLineTextField;
break;
case PROPERTY_ID_DEFAULT_TEXT:
{
if (FormComponentType::FILECONTROL == m_nClassId)
nControlType = PropertyControlType::TextField;
else
nControlType = PropertyControlType::MultiLineTextField;
}
break;
case PROPERTY_ID_TEXT:
if ( impl_componentHasProperty_throw( PROPERTY_MULTILINE ) )
nControlType = PropertyControlType::MultiLineTextField;
break;
case PROPERTY_ID_CONTROLLABEL:
bReadOnly = sal_True;
aDescriptor.PrimaryButtonId = OUString::createFromAscii(UID_PROP_DLG_CONTROLLABEL);
break;
case PROPERTY_ID_FORMATKEY:
case PROPERTY_ID_EFFECTIVE_MIN:
case PROPERTY_ID_EFFECTIVE_MAX:
case PROPERTY_ID_EFFECTIVE_DEFAULT:
case PROPERTY_ID_EFFECTIVE_VALUE:
{
// and the supplier is really available
Reference< XNumberFormatsSupplier > xSupplier;
m_xComponent->getPropertyValue( PROPERTY_FORMATSSUPPLIER ) >>= xSupplier;
if (xSupplier.is())
{
Reference< XUnoTunnel > xTunnel(xSupplier,UNO_QUERY);
DBG_ASSERT(xTunnel.is(), "FormComponentPropertyHandler::describePropertyLine : xTunnel is invalid!");
SvNumberFormatsSupplierObj* pSupplier = reinterpret_cast<SvNumberFormatsSupplierObj*>(xTunnel->getSomething(SvNumberFormatsSupplierObj::getUnoTunnelId()));
if (pSupplier != NULL)
{
sal_Bool bIsFormatKey = (PROPERTY_ID_FORMATKEY == nPropId);
bReadOnly = bIsFormatKey;
if ( bIsFormatKey )
{
OFormatSampleControl* pControl = new OFormatSampleControl( impl_getDefaultDialogParent_nothrow(), WB_READONLY | WB_TABSTOP | WB_BORDER );
aDescriptor.Control = pControl;
pControl->SetFormatSupplier( pSupplier );
aDescriptor.PrimaryButtonId = OUString::createFromAscii(UID_PROP_DLG_NUMBER_FORMAT);
}
else
{
OFormattedNumericControl* pControl = new OFormattedNumericControl( impl_getDefaultDialogParent_nothrow(), WB_TABSTOP | WB_BORDER );
aDescriptor.Control = pControl;
FormatDescription aDesc;
aDesc.pSupplier = pSupplier;
Any aFormatKeyValue = m_xComponent->getPropertyValue(PROPERTY_FORMATKEY);
if ( !( aFormatKeyValue >>= aDesc.nKey ) )
aDesc.nKey = 0;
pControl->SetFormatDescription( aDesc );
}
}
}
}
break;
case PROPERTY_ID_DATEMIN:
case PROPERTY_ID_DATEMAX:
case PROPERTY_ID_DEFAULT_DATE:
case PROPERTY_ID_DATE:
nControlType = PropertyControlType::DateField;
break;
case PROPERTY_ID_TIMEMIN:
case PROPERTY_ID_TIMEMAX:
case PROPERTY_ID_DEFAULT_TIME:
case PROPERTY_ID_TIME:
nControlType = PropertyControlType::TimeField;
break;
case PROPERTY_ID_VALUEMIN:
case PROPERTY_ID_VALUEMAX:
case PROPERTY_ID_DEFAULT_VALUE:
case PROPERTY_ID_VALUE:
{
OFormattedNumericControl* pControl = new OFormattedNumericControl( impl_getDefaultDialogParent_nothrow(), WB_TABSTOP | WB_BORDER | WB_SPIN | WB_REPEAT );
aDescriptor.Control = pControl;
// we don't set a formatter so the control uses a default (which uses the application
// language and a default numeric format)
// but we set the decimal digits
pControl->SetDecimalDigits(
::comphelper::getINT16( m_xComponent->getPropertyValue( PROPERTY_DECIMAL_ACCURACY ) )
);
// and the thousands separator
pControl->SetThousandsSep(
::comphelper::getBOOL( m_xComponent->getPropertyValue(PROPERTY_SHOWTHOUSANDSEP) )
);
// and the default value for the property
try
{
if (m_xPropertyState.is() && ((PROPERTY_ID_VALUEMIN == nPropId) || (PROPERTY_ID_VALUEMAX == nPropId)))
{
double nDefault = 0;
if ( m_xPropertyState->getPropertyDefault( aProperty.Name ) >>= nDefault )
pControl->SetDefaultValue( nDefault );
}
}
catch (const Exception&)
{
// just ignore it
}
// and allow empty values only for the default value and the value
pControl->EnableEmptyField( ( PROPERTY_ID_DEFAULT_VALUE == nPropId )
|| ( PROPERTY_ID_VALUE == nPropId ) );
}
break;
default:
if ( TypeClass_BYTE <= eType && eType <= TypeClass_DOUBLE )
{
sal_Int16 nDigits = 0;
sal_Int16 nValueUnit = -1;
sal_Int16 nDisplayUnit = -1;
if ( m_eComponentClass == eFormControl )
{
if ( ( nPropId == PROPERTY_ID_WIDTH )
|| ( nPropId == PROPERTY_ID_ROWHEIGHT )
|| ( nPropId == PROPERTY_ID_HEIGHT )
)
{
nValueUnit = MeasureUnit::MM_10TH;
nDisplayUnit = impl_getDocumentMeasurementUnit_throw();
nDigits = 2;
}
}
Optional< double > aValueNotPresent( sal_False, 0 );
aDescriptor.Control = PropertyHandlerHelper::createNumericControl(
_rxControlFactory, nDigits, aValueNotPresent, aValueNotPresent, sal_False );
Reference< XNumericControl > xNumericControl( aDescriptor.Control, UNO_QUERY_THROW );
if ( nValueUnit != -1 )
xNumericControl->setValueUnit( nValueUnit );
if ( nDisplayUnit != -1 )
xNumericControl->setDisplayUnit( nDisplayUnit );
}
break;
}
//////////////////////////////////////////////////////////////////////
if ( eType == TypeClass_SEQUENCE )
nControlType = PropertyControlType::StringListField;
//////////////////////////////////////////////////////////////////////
// boolean values
if ( eType == TypeClass_BOOLEAN )
{
sal_uInt16 nResId = RID_RSC_ENUM_YESNO;
if ( ( nPropId == PROPERTY_ID_SHOW_POSITION )
|| ( nPropId == PROPERTY_ID_SHOW_NAVIGATION )
|| ( nPropId == PROPERTY_ID_SHOW_RECORDACTIONS )
|| ( nPropId == PROPERTY_ID_SHOW_FILTERSORT )
)
nResId = RID_RSC_ENUM_SHOWHIDE;
::std::vector< OUString > aListEntries;
tools::StringListResource aRes(PcrRes(nResId),aListEntries);
aDescriptor.Control = PropertyHandlerHelper::createListBoxControl( _rxControlFactory, aListEntries, sal_False, sal_False );
bNeedDefaultStringIfVoidAllowed = true;
}
//////////////////////////////////////////////////////////////////////
// enum properties
sal_uInt32 nPropertyUIFlags = m_pInfoService->getPropertyUIFlags( nPropId );
bool bIsEnumProperty = ( nPropertyUIFlags & PROP_FLAG_ENUM ) != 0;
if ( bIsEnumProperty || ( PROPERTY_ID_TARGET_FRAME == nPropId ) )
{
::std::vector< OUString > aEnumValues = m_pInfoService->getPropertyEnumRepresentations( nPropId );
::std::vector< OUString >::const_iterator pStart = aEnumValues.begin();
::std::vector< OUString >::const_iterator pEnd = aEnumValues.end();
// for a checkbox: if "ambiguous" is not allowed, remove this from the sequence
if ( ( PROPERTY_ID_DEFAULT_STATE == nPropId )
|| ( PROPERTY_ID_STATE == nPropId )
)
{
if ( impl_componentHasProperty_throw( PROPERTY_TRISTATE ) )
{
if ( !::comphelper::getBOOL( m_xComponent->getPropertyValue( PROPERTY_TRISTATE ) ) )
{ // remove the last sequence element
if ( pEnd > pStart )
--pEnd;
}
}
else
--pEnd;
}
if ( PROPERTY_ID_LISTSOURCETYPE == nPropId )
if ( FormComponentType::COMBOBOX == m_nClassId )
// remove the first sequence element -> value list not possible for combo boxes
++pStart;
// copy the sequence
::std::vector< OUString > aListEntries( pEnd - pStart );
::std::copy( pStart, pEnd, aListEntries.begin() );
// create the control
if ( PROPERTY_ID_TARGET_FRAME == nPropId )
aDescriptor.Control = PropertyHandlerHelper::createComboBoxControl( _rxControlFactory, aListEntries, sal_False, sal_False );
else
{
aDescriptor.Control = PropertyHandlerHelper::createListBoxControl( _rxControlFactory, aListEntries, sal_False, sal_False );
bNeedDefaultStringIfVoidAllowed = true;
}
}
//////////////////////////////////////////////////////////////////////
switch( nPropId )
{
case PROPERTY_ID_REPEAT_DELAY:
{
OTimeDurationControl* pControl = new OTimeDurationControl( impl_getDefaultDialogParent_nothrow(), WB_BORDER | WB_TABSTOP );
aDescriptor.Control = pControl;
pControl->setMinValue( Optional< double >( sal_True, 0 ) );
pControl->setMaxValue( Optional< double >( sal_True, ::std::numeric_limits< double >::max() ) );
}
break;
case PROPERTY_ID_TABINDEX:
case PROPERTY_ID_BOUNDCOLUMN:
case PROPERTY_ID_VISIBLESIZE:
case PROPERTY_ID_MAXTEXTLEN:
case PROPERTY_ID_LINEINCREMENT:
case PROPERTY_ID_BLOCKINCREMENT:
case PROPERTY_ID_SPININCREMENT:
{
Optional< double > aMinValue( sal_True, 0 );
Optional< double > aMaxValue( sal_True, 0x7FFFFFFF );
if ( nPropId == PROPERTY_ID_MAXTEXTLEN || nPropId == PROPERTY_ID_BOUNDCOLUMN )
aMinValue.Value = -1;
else if ( nPropId == PROPERTY_ID_VISIBLESIZE )
aMinValue.Value = 1;
else
aMinValue.Value = 0;
aDescriptor.Control = PropertyHandlerHelper::createNumericControl(
_rxControlFactory, 0, aMinValue, aMaxValue, sal_False );
}
break;
case PROPERTY_ID_DECIMAL_ACCURACY:
{
Optional< double > aMinValue( sal_True, 0 );
Optional< double > aMaxValue( sal_True, 20 );
aDescriptor.Control = PropertyHandlerHelper::createNumericControl(
_rxControlFactory, 0, aMinValue, aMaxValue, sal_False );
}
break;
//////////////////////////////////////////////////////////////////////
// DataSource
case PROPERTY_ID_DATASOURCE:
{
aDescriptor.PrimaryButtonId = OUString::createFromAscii(UID_PROP_DLG_ATTR_DATASOURCE);
::std::vector< OUString > aListEntries;
Reference< XDatabaseContext > xDatabaseContext = sdb::DatabaseContext::create( m_xContext );
Sequence< OUString > aDatasources = xDatabaseContext->getElementNames();
aListEntries.resize( aDatasources.getLength() );
::std::copy( aDatasources.getConstArray(), aDatasources.getConstArray() + aDatasources.getLength(),
aListEntries.begin() );
aDescriptor.Control = PropertyHandlerHelper::createComboBoxControl(
_rxControlFactory, aListEntries, sal_False, sal_True );
}
break;
case PROPERTY_ID_CONTROLSOURCE:
{
::std::vector< OUString > aFieldNames;
impl_initFieldList_nothrow( aFieldNames );
aDescriptor.Control = PropertyHandlerHelper::createComboBoxControl(
_rxControlFactory, aFieldNames, sal_False, sal_False );
}
break;
case PROPERTY_ID_COMMAND:
impl_describeCursorSource_nothrow( aDescriptor, _rxControlFactory );
break;
case PROPERTY_ID_LISTSOURCE:
impl_describeListSourceUI_throw( aDescriptor, _rxControlFactory );
break;
}
if ( !aDescriptor.Control.is() )
aDescriptor.Control = _rxControlFactory->createPropertyControl( nControlType, bReadOnly );
if ( ( aProperty.Attributes & PropertyAttribute::MAYBEVOID ) != 0 )
{
// insert the string "Default" string, if necessary
if ( bNeedDefaultStringIfVoidAllowed || ( nControlType == PropertyControlType::ColorListBox ) )
{
Reference< XStringListControl > xStringList( aDescriptor.Control, UNO_QUERY_THROW );
xStringList->prependListEntry( m_sDefaultValueString );
m_aPropertiesWithDefListEntry.insert( _rPropertyName );
}
}
if ( !aDescriptor.PrimaryButtonId.isEmpty() )
aDescriptor.HasPrimaryButton = sal_True;
if ( !aDescriptor.SecondaryButtonId.isEmpty() )
aDescriptor.HasSecondaryButton = sal_True;
bool bIsDataProperty = ( nPropertyUIFlags & PROP_FLAG_DATA_PROPERTY ) != 0;
aDescriptor.Category = bIsDataProperty ? OUString("Data") : OUString("General");
return aDescriptor;
}
//--------------------------------------------------------------------
InteractiveSelectionResult SAL_CALL FormComponentPropertyHandler::onInteractivePropertySelection( const OUString& _rPropertyName, sal_Bool /*_bPrimary*/, Any& _rData, const Reference< XObjectInspectorUI >& _rxInspectorUI ) throw (UnknownPropertyException, NullPointerException, RuntimeException)
{
if ( !_rxInspectorUI.is() )
throw NullPointerException();
::osl::ClearableMutexGuard aGuard( m_aMutex );
PropertyId nPropId( impl_getPropertyId_throw( _rPropertyName ) );
InteractiveSelectionResult eResult = InteractiveSelectionResult_Cancelled;
switch ( nPropId )
{
case PROPERTY_ID_DEFAULT_SELECT_SEQ:
case PROPERTY_ID_SELECTEDITEMS:
if ( impl_dialogListSelection_nothrow( _rPropertyName, aGuard ) )
eResult = InteractiveSelectionResult_Success;
break;
case PROPERTY_ID_FILTER:
case PROPERTY_ID_SORT:
{
OUString sClause;
if ( impl_dialogFilterOrSort_nothrow( PROPERTY_ID_FILTER == nPropId, sClause, aGuard ) )
{
_rData <<= sClause;
eResult = InteractiveSelectionResult_ObtainedValue;
}
}
break;
case PROPERTY_ID_MASTERFIELDS:
case PROPERTY_ID_DETAILFIELDS:
if ( impl_dialogLinkedFormFields_nothrow( aGuard ) )
eResult = InteractiveSelectionResult_Success;
break;
case PROPERTY_ID_FORMATKEY:
if ( impl_dialogFormatting_nothrow( _rData, aGuard ) )
eResult = InteractiveSelectionResult_ObtainedValue;
break;
case PROPERTY_ID_IMAGE_URL:
if ( impl_browseForImage_nothrow( _rData, aGuard ) )
eResult = InteractiveSelectionResult_ObtainedValue;
break;
case PROPERTY_ID_TARGET_URL:
if ( impl_browseForTargetURL_nothrow( _rData, aGuard ) )
eResult = InteractiveSelectionResult_ObtainedValue;
break;
case PROPERTY_ID_FONT:
if ( impl_executeFontDialog_nothrow( _rData, aGuard ) )
eResult = InteractiveSelectionResult_ObtainedValue;
break;
case PROPERTY_ID_DATASOURCE:
if ( impl_browseForDatabaseDocument_throw( _rData, aGuard ) )
eResult = InteractiveSelectionResult_ObtainedValue;
break;
case PROPERTY_ID_BACKGROUNDCOLOR:
case PROPERTY_ID_FILLCOLOR:
case PROPERTY_ID_SYMBOLCOLOR:
case PROPERTY_ID_BORDERCOLOR:
if ( impl_dialogColorChooser_throw( nPropId, _rData, aGuard ) )
eResult = InteractiveSelectionResult_ObtainedValue;
break;
case PROPERTY_ID_CONTROLLABEL:
if ( impl_dialogChooseLabelControl_nothrow( _rData, aGuard ) )
eResult = InteractiveSelectionResult_ObtainedValue;
break;
case PROPERTY_ID_TABINDEX:
if ( impl_dialogChangeTabOrder_nothrow( aGuard ) )
eResult = InteractiveSelectionResult_Success;
break;
case PROPERTY_ID_COMMAND:
case PROPERTY_ID_LISTSOURCE:
if ( impl_doDesignSQLCommand_nothrow( _rxInspectorUI, nPropId ) )
eResult = InteractiveSelectionResult_Pending;
break;
default:
OSL_FAIL( "FormComponentPropertyHandler::onInteractivePropertySelection: request for a property which does not have dedicated UI!" );
break;
}
return eResult;
}
//--------------------------------------------------------------------
namespace
{
void lcl_rebuildAndResetCommand( const Reference< XObjectInspectorUI >& _rxInspectorUI, const Reference< XPropertyHandler >& _rxHandler )
{
OSL_PRECOND( _rxInspectorUI.is(), "lcl_rebuildAndResetCommand: invalid BrowserUI!" );
OSL_PRECOND( _rxHandler.is(), "lcl_rebuildAndResetCommand: invalid handler!" );
_rxInspectorUI->rebuildPropertyUI( PROPERTY_COMMAND );
_rxHandler->setPropertyValue( PROPERTY_COMMAND, makeAny( OUString() ) );
}
}
//--------------------------------------------------------------------
void SAL_CALL FormComponentPropertyHandler::actuatingPropertyChanged( const OUString& _rActuatingPropertyName, const Any& _rNewValue, const Any& /*_rOldValue*/, const Reference< XObjectInspectorUI >& _rxInspectorUI, sal_Bool _bFirstTimeInit ) throw (NullPointerException, RuntimeException)
{
if ( !_rxInspectorUI.is() )
throw NullPointerException();
::osl::MutexGuard aGuard( m_aMutex );
PropertyId nActuatingPropId( impl_getPropertyId_throw( _rActuatingPropertyName ) );
::std::vector< PropertyId > aDependentProperties;
switch ( nActuatingPropId )
{
// ----- EscapeProcessing -----
case PROPERTY_ID_ESCAPE_PROCESSING:
aDependentProperties.push_back( PROPERTY_ID_FILTER );
aDependentProperties.push_back( PROPERTY_ID_SORT );
break; // case PROPERTY_ID_ESCAPE_PROCESSING
// ----- CommandType -----
case PROPERTY_ID_COMMANDTYPE:
// available commands (tables or queries) might have changed
if ( !_bFirstTimeInit && m_bHaveCommand )
lcl_rebuildAndResetCommand( _rxInspectorUI, this );
aDependentProperties.push_back( PROPERTY_ID_COMMAND );
break; // case PROPERTY_ID_COMMANDTYPE
// ----- DataSourceName -----
case PROPERTY_ID_DATASOURCE:
// reset the connection, now that we have a new data source
impl_clearRowsetConnection_nothrow();
// available list source values (tables or queries) might have changed
if ( !_bFirstTimeInit && m_bHaveListSource )
_rxInspectorUI->rebuildPropertyUI( PROPERTY_LISTSOURCE );
// available commands (tables or queries) might have changed
if ( !_bFirstTimeInit && m_bHaveCommand )
lcl_rebuildAndResetCommand( _rxInspectorUI, this );
// Command also depends on DataSource
aDependentProperties.push_back( PROPERTY_ID_COMMAND );
// NO break!
// ----- Command -----
case PROPERTY_ID_COMMAND:
aDependentProperties.push_back( PROPERTY_ID_FILTER );
aDependentProperties.push_back( PROPERTY_ID_SORT );
if ( m_bComponentIsSubForm )
aDependentProperties.push_back( PROPERTY_ID_DETAILFIELDS );
break;
// ----- ListSourceType -----
case PROPERTY_ID_LISTSOURCETYPE:
if ( !_bFirstTimeInit && m_bHaveListSource )
// available list source values (tables or queries) might have changed
_rxInspectorUI->rebuildPropertyUI( PROPERTY_LISTSOURCE );
aDependentProperties.push_back( PROPERTY_ID_STRINGITEMLIST );
aDependentProperties.push_back( PROPERTY_ID_BOUNDCOLUMN );
// NO break!
// ----- StringItemList -----
case PROPERTY_ID_STRINGITEMLIST:
aDependentProperties.push_back( PROPERTY_ID_SELECTEDITEMS );
aDependentProperties.push_back( PROPERTY_ID_DEFAULT_SELECT_SEQ );
break;
// ----- ListSource -----
case PROPERTY_ID_LISTSOURCE:
aDependentProperties.push_back( PROPERTY_ID_STRINGITEMLIST );
break;
// ----- DataField -----
case PROPERTY_ID_CONTROLSOURCE:
{
OUString sControlSource;
_rNewValue >>= sControlSource;
if ( impl_componentHasProperty_throw( PROPERTY_FILTERPROPOSAL ) )
_rxInspectorUI->enablePropertyUI( PROPERTY_FILTERPROPOSAL, !sControlSource.isEmpty() );
if ( impl_componentHasProperty_throw( PROPERTY_EMPTY_IS_NULL ) )
_rxInspectorUI->enablePropertyUI( PROPERTY_EMPTY_IS_NULL, !sControlSource.isEmpty() );
aDependentProperties.push_back( PROPERTY_ID_BOUNDCOLUMN );
aDependentProperties.push_back( PROPERTY_ID_SCALEIMAGE );
aDependentProperties.push_back( PROPERTY_ID_SCALE_MODE );
aDependentProperties.push_back( PROPERTY_ID_INPUT_REQUIRED );
}
break;
case PROPERTY_ID_EMPTY_IS_NULL:
aDependentProperties.push_back( PROPERTY_ID_INPUT_REQUIRED );
break;
// ----- SubmitEncoding -----
case PROPERTY_ID_SUBMIT_ENCODING:
{
FormSubmitEncoding eEncoding = FormSubmitEncoding_URL;
OSL_VERIFY( _rNewValue >>= eEncoding );
_rxInspectorUI->enablePropertyUI( PROPERTY_SUBMIT_METHOD, eEncoding == FormSubmitEncoding_URL );
}
break;
// ----- Repeat -----
case PROPERTY_ID_REPEAT:
{
sal_Bool bIsRepeating = sal_False;
OSL_VERIFY( _rNewValue >>= bIsRepeating );
_rxInspectorUI->enablePropertyUI( PROPERTY_REPEAT_DELAY, bIsRepeating );
}
break;
// ----- TabStop -----
case PROPERTY_ID_TABSTOP:
{
if ( !impl_componentHasProperty_throw( PROPERTY_TABINDEX ) )
break;
sal_Bool bHasTabStop = sal_False;
_rNewValue >>= bHasTabStop;
_rxInspectorUI->enablePropertyUI( PROPERTY_TABINDEX, bHasTabStop );
}
break;
// ----- Border -----
case PROPERTY_ID_BORDER:
{
sal_Int16 nBordeType = VisualEffect::NONE;
OSL_VERIFY( _rNewValue >>= nBordeType );
_rxInspectorUI->enablePropertyUI( PROPERTY_BORDERCOLOR, nBordeType == VisualEffect::FLAT );
}
break;
// ----- DropDown -----
case PROPERTY_ID_DROPDOWN:
{
if ( impl_isSupportedProperty_nothrow( PROPERTY_ID_LINECOUNT ) )
{
sal_Bool bDropDown = sal_True;
_rNewValue >>= bDropDown;
_rxInspectorUI->enablePropertyUI( PROPERTY_LINECOUNT, bDropDown );
}
}
break;
// ----- ImageURL -----
case PROPERTY_ID_IMAGE_URL:
{
if ( impl_isSupportedProperty_nothrow( PROPERTY_ID_IMAGEPOSITION ) )
{
OUString sImageURL;
OSL_VERIFY( _rNewValue >>= sImageURL );
_rxInspectorUI->enablePropertyUI( PROPERTY_IMAGEPOSITION, !sImageURL.isEmpty() );
}
aDependentProperties.push_back( PROPERTY_ID_SCALEIMAGE );
aDependentProperties.push_back( PROPERTY_ID_SCALE_MODE );
}
break;
// ----- ButtonType -----
case PROPERTY_ID_BUTTONTYPE:
{
FormButtonType eButtonType( FormButtonType_PUSH );
OSL_VERIFY( _rNewValue >>= eButtonType );
_rxInspectorUI->enablePropertyUI( PROPERTY_TARGET_URL, FormButtonType_URL == eButtonType );
}
// NO break!
// ----- TargetURL -----
case PROPERTY_ID_TARGET_URL:
aDependentProperties.push_back( PROPERTY_ID_TARGET_FRAME );
break; // case PROPERTY_ID_TARGET_URL
// ----- TriState -----
case PROPERTY_ID_TRISTATE:
if ( !_bFirstTimeInit )
_rxInspectorUI->rebuildPropertyUI( m_eComponentClass == eFormControl ? OUString(PROPERTY_DEFAULT_STATE) : OUString(PROPERTY_STATE) );
break; // case PROPERTY_ID_TRISTATE
// ----- DecimalAccuracy -----
case PROPERTY_ID_DECIMAL_ACCURACY:
// ----- ShowThousandsSeparator -----
case PROPERTY_ID_SHOWTHOUSANDSEP:
{
sal_Bool bAccuracy = (PROPERTY_ID_DECIMAL_ACCURACY == nActuatingPropId);
sal_uInt16 nNewDigits = 0;
sal_Bool bUseSep = sal_False;
if ( bAccuracy )
OSL_VERIFY( _rNewValue >>= nNewDigits );
else
OSL_VERIFY( _rNewValue >>= bUseSep );
// propagate the changes to the min/max/default fields
Any aCurrentProp;
OUString aAffectedProps[] = { OUString(PROPERTY_VALUE), OUString(PROPERTY_DEFAULT_VALUE), OUString(PROPERTY_VALUEMIN), OUString(PROPERTY_VALUEMAX) };
for (sal_uInt16 i=0; i<SAL_N_ELEMENTS(aAffectedProps); ++i)
{
Reference< XPropertyControl > xControl;
try
{
xControl = _rxInspectorUI->getPropertyControl( aAffectedProps[i] );
}
catch( const UnknownPropertyException& ) {}
if ( xControl.is() )
{
OFormattedNumericControl* pControl = dynamic_cast< OFormattedNumericControl* >( xControl.get() );
DBG_ASSERT( pControl, "FormComponentPropertyHandler::actuatingPropertyChanged: invalid control!" );
if ( pControl )
{
if ( bAccuracy )
pControl->SetDecimalDigits( nNewDigits );
else
pControl->SetThousandsSep( bUseSep );
}
}
}
}
break;
// ----- FormatKey -----
case PROPERTY_ID_FORMATKEY:
{
FormatDescription aNewDesc;
Reference< XNumberFormatsSupplier > xSupplier;
OSL_VERIFY( m_xComponent->getPropertyValue( PROPERTY_FORMATSSUPPLIER ) >>= xSupplier );
Reference< XUnoTunnel > xTunnel( xSupplier, UNO_QUERY );
DBG_ASSERT(xTunnel.is(), "FormComponentPropertyHandler::actuatingPropertyChanged: xTunnel is invalid!");
if ( xTunnel.is() )
{
SvNumberFormatsSupplierObj* pSupplier = reinterpret_cast<SvNumberFormatsSupplierObj*>(xTunnel->getSomething(SvNumberFormatsSupplierObj::getUnoTunnelId()));
// the same again
aNewDesc.pSupplier = pSupplier;
if ( !( _rNewValue >>= aNewDesc.nKey ) )
aNewDesc.nKey = 0;
// give each control which has to know this an own copy of the description
OUString aFormattedPropertyControls[] = {
OUString(PROPERTY_EFFECTIVE_MIN), OUString(PROPERTY_EFFECTIVE_MAX), OUString(PROPERTY_EFFECTIVE_DEFAULT), OUString(PROPERTY_EFFECTIVE_VALUE)
};
for ( sal_uInt16 i=0; i<SAL_N_ELEMENTS(aFormattedPropertyControls); ++i )
{
Reference< XPropertyControl > xControl;
try
{
xControl = _rxInspectorUI->getPropertyControl( aFormattedPropertyControls[i] );
}
catch( const UnknownPropertyException& ) {}
if ( xControl.is() )
{
OFormattedNumericControl* pControl = dynamic_cast< OFormattedNumericControl* >( xControl.get() );
DBG_ASSERT( pControl, "FormComponentPropertyHandler::actuatingPropertyChanged: invalid control!" );
if ( pControl )
pControl->SetFormatDescription( aNewDesc );
}
}
}
}
break;
case PROPERTY_ID_TOGGLE:
{
sal_Bool bIsToggleButton = sal_False;
OSL_VERIFY( _rNewValue >>= bIsToggleButton );
_rxInspectorUI->enablePropertyUI( PROPERTY_DEFAULT_STATE, bIsToggleButton );
}
break;
default:
OSL_FAIL( "FormComponentPropertyHandler::actuatingPropertyChanged: did not register for this property!" );
break;
} // switch ( nActuatingPropId )
for ( ::std::vector< PropertyId >::const_iterator loopAffected = aDependentProperties.begin();
loopAffected != aDependentProperties.end();
++loopAffected
)
{
if ( impl_isSupportedProperty_nothrow( *loopAffected ) )
impl_updateDependentProperty_nothrow( *loopAffected, _rxInspectorUI );
}
}
//------------------------------------------------------------------------
void FormComponentPropertyHandler::impl_updateDependentProperty_nothrow( PropertyId _nPropId, const Reference< XObjectInspectorUI >& _rxInspectorUI ) const
{
try
{
switch ( _nPropId )
{
// ----- StringItemList -----
case PROPERTY_ID_STRINGITEMLIST:
{
ListSourceType eLSType = ListSourceType_VALUELIST;
OSL_VERIFY( impl_getPropertyValue_throw( PROPERTY_LISTSOURCETYPE ) >>= eLSType );
OUString sListSource;
{
Sequence< OUString > aListSource;
Any aListSourceValue( impl_getPropertyValue_throw( PROPERTY_LISTSOURCE ) );
if ( aListSourceValue >>= aListSource )
{
if ( aListSource.getLength() )
sListSource = aListSource[0];
}
else
OSL_VERIFY( aListSourceValue >>= sListSource );
}
sal_Bool bIsEnabled = ( ( eLSType == ListSourceType_VALUELIST )
|| ( sListSource.isEmpty() )
);
_rxInspectorUI->enablePropertyUI( PROPERTY_STRINGITEMLIST, bIsEnabled );
}
break; // case PROPERTY_ID_STRINGITEMLIST
// ----- BoundColumn -----
case PROPERTY_ID_BOUNDCOLUMN:
{
ListSourceType eLSType = ListSourceType_VALUELIST;
OSL_VERIFY( impl_getPropertyValue_throw( PROPERTY_LISTSOURCETYPE ) >>= eLSType );
_rxInspectorUI->enablePropertyUI( PROPERTY_BOUNDCOLUMN,
( eLSType != ListSourceType_VALUELIST )
);
}
break; // case PROPERTY_ID_BOUNDCOLUMN
// ----- ScaleImage, ScaleMode -----
case PROPERTY_ID_SCALEIMAGE:
case PROPERTY_ID_SCALE_MODE:
{
OUString sControlSource;
if ( impl_isSupportedProperty_nothrow( PROPERTY_ID_CONTROLSOURCE ) )
impl_getPropertyValue_throw( PROPERTY_CONTROLSOURCE ) >>= sControlSource;
OUString sImageURL;
impl_getPropertyValue_throw( PROPERTY_IMAGE_URL ) >>= sImageURL;
_rxInspectorUI->enablePropertyUI( impl_getPropertyNameFromId_nothrow( _nPropId ),
( !sControlSource.isEmpty() ) || ( !sImageURL.isEmpty() )
);
}
break; // case PROPERTY_ID_SCALEIMAGE, PROPERTY_ID_SCALE_MODE
// ----- InputRequired -----
case PROPERTY_ID_INPUT_REQUIRED:
{
OUString sControlSource;
OSL_VERIFY( impl_getPropertyValue_throw( PROPERTY_CONTROLSOURCE ) >>= sControlSource );
sal_Bool bEmptyIsNULL = sal_False;
sal_Bool bHasEmptyIsNULL = impl_componentHasProperty_throw( PROPERTY_EMPTY_IS_NULL );
if ( bHasEmptyIsNULL )
OSL_VERIFY( impl_getPropertyValue_throw( PROPERTY_EMPTY_IS_NULL ) >>= bEmptyIsNULL );
// if the control is not bound to a DB field, there is no sense in having the "Input required"
// property
// Also, if an empty input of this control are *not* written as NULL, but as empty strings,
// then "Input required" does not make sense, too (since there's always an input, even if the control
// is empty).
_rxInspectorUI->enablePropertyUI( PROPERTY_INPUT_REQUIRED,
( !sControlSource.isEmpty() ) && ( !bHasEmptyIsNULL || bEmptyIsNULL )
);
}
break;
// ----- SelectedItems, DefaultSelection -----
case PROPERTY_ID_SELECTEDITEMS:
case PROPERTY_ID_DEFAULT_SELECT_SEQ:
{
Sequence< OUString > aEntries;
impl_getPropertyValue_throw( PROPERTY_STRINGITEMLIST ) >>= aEntries;
bool isEnabled = aEntries.getLength() != 0;
if ( ( m_nClassId == FormComponentType::LISTBOX ) && ( m_eComponentClass == eFormControl ) )
{
ListSourceType eLSType = ListSourceType_VALUELIST;
impl_getPropertyValue_throw( PROPERTY_LISTSOURCETYPE ) >>= eLSType;
isEnabled &= ( eLSType == ListSourceType_VALUELIST );
}
_rxInspectorUI->enablePropertyUIElements( impl_getPropertyNameFromId_nothrow( _nPropId ),
PropertyLineElement::PrimaryButton, isEnabled );
}
break; // case PROPERTY_ID_DEFAULT_SELECT_SEQ
// ----- TargetFrame ------
case PROPERTY_ID_TARGET_FRAME:
{
OUString sTargetURL;
impl_getPropertyValue_throw( PROPERTY_TARGET_URL ) >>= sTargetURL;
FormButtonType eButtonType( FormButtonType_URL );
if ( 0 != m_nClassId )
{
OSL_VERIFY( impl_getPropertyValue_throw( PROPERTY_BUTTONTYPE ) >>= eButtonType );
}
// if m_nClassId is 0, then we're inspecting a form. In this case, eButtonType is always
// FormButtonType_URL here
_rxInspectorUI->enablePropertyUI( PROPERTY_TARGET_FRAME,
( eButtonType == FormButtonType_URL ) && ( !sTargetURL.isEmpty() )
);
}
break;
// ----- Order ------
case PROPERTY_ID_SORT:
// ----- Filter ------
case PROPERTY_ID_FILTER:
{
Reference< XConnection > xConnection;
bool bAllowEmptyDS = ::dbtools::isEmbeddedInDatabase( m_xComponent, xConnection );
// if there's no escape processing, we cannot enter any values for this property
sal_Bool bDoEscapeProcessing( sal_False );
impl_getPropertyValue_throw( PROPERTY_ESCAPE_PROCESSING ) >>= bDoEscapeProcessing;
_rxInspectorUI->enablePropertyUI(
impl_getPropertyNameFromId_nothrow( _nPropId ),
bDoEscapeProcessing
);
// also care for the browse button - enabled if we have escape processing, and a valid
// data source signature
_rxInspectorUI->enablePropertyUIElements(
impl_getPropertyNameFromId_nothrow( _nPropId ),
PropertyLineElement::PrimaryButton,
impl_hasValidDataSourceSignature_nothrow( m_xComponent, bAllowEmptyDS )
&& bDoEscapeProcessing
);
}
break; // case PROPERTY_ID_FILTER:
// ----- Command -----
case PROPERTY_ID_COMMAND:
{
sal_Int32 nCommandType( CommandType::COMMAND );
OSL_VERIFY( impl_getPropertyValue_throw( PROPERTY_COMMANDTYPE ) >>= nCommandType );
impl_ensureRowsetConnection_nothrow();
Reference< XConnection > xConnection = m_xRowSetConnection.getTyped();
bool bAllowEmptyDS = false;
if ( !xConnection.is() )
bAllowEmptyDS = ::dbtools::isEmbeddedInDatabase( m_xComponent, xConnection );
bool doEnable = ( nCommandType == CommandType::COMMAND )
&& ( m_xRowSetConnection.is()
|| xConnection.is()
|| impl_hasValidDataSourceSignature_nothrow( m_xComponent, bAllowEmptyDS)
);
_rxInspectorUI->enablePropertyUIElements(
PROPERTY_COMMAND,
PropertyLineElement::PrimaryButton,
doEnable
);
}
break; // case PROPERTY_ID_COMMAND
// ----- DetailFields -----
case PROPERTY_ID_DETAILFIELDS:
{
Reference< XConnection > xConnection;
bool bAllowEmptyDS = ::dbtools::isEmbeddedInDatabase( m_xComponent, xConnection );
// both our current form, and it's parent form, need to have a valid
// data source signature
bool bDoEnableMasterDetailFields =
impl_hasValidDataSourceSignature_nothrow( m_xComponent, bAllowEmptyDS )
&& impl_hasValidDataSourceSignature_nothrow( Reference< XPropertySet >( m_xObjectParent, UNO_QUERY ), bAllowEmptyDS );
// in opposite to the other properties, here in real *two* properties are
// affected
_rxInspectorUI->enablePropertyUIElements( PROPERTY_DETAILFIELDS, PropertyLineElement::PrimaryButton, bDoEnableMasterDetailFields );
_rxInspectorUI->enablePropertyUIElements( PROPERTY_MASTERFIELDS, PropertyLineElement::PrimaryButton, bDoEnableMasterDetailFields );
}
break;
default:
OSL_FAIL( "FormComponentPropertyHandler::impl_updateDependentProperty_nothrow: unexpected property to update!" );
break;
} // switch
}
catch( const Exception& )
{
OSL_FAIL( "FormComponentPropertyHandler::impl_updateDependentProperty_nothrow: caught an exception!" );
}
}
//------------------------------------------------------------------------
void SAL_CALL FormComponentPropertyHandler::disposing()
{
FormComponentPropertyHandler_Base::disposing();
if ( m_xCommandDesigner.is() && m_xCommandDesigner->isActive() )
m_xCommandDesigner->dispose();
}
//------------------------------------------------------------------------
sal_Bool SAL_CALL FormComponentPropertyHandler::suspend( sal_Bool _bSuspend ) throw (RuntimeException)
{
::osl::MutexGuard aGuard( m_aMutex );
if ( _bSuspend )
if ( m_xCommandDesigner.is() && m_xCommandDesigner->isActive() )
return m_xCommandDesigner->suspend();
return sal_True;
}
//------------------------------------------------------------------------
void FormComponentPropertyHandler::impl_initComponentMetaData_throw()
{
try
{
//////////////////////////////////////////////////////////////////
// component class
m_eComponentClass = eUnknown;
if ( impl_componentHasProperty_throw( PROPERTY_WIDTH )
&& impl_componentHasProperty_throw( PROPERTY_HEIGHT )
&& impl_componentHasProperty_throw( PROPERTY_POSITIONX )
&& impl_componentHasProperty_throw( PROPERTY_POSITIONY )
&& impl_componentHasProperty_throw( PROPERTY_STEP )
&& impl_componentHasProperty_throw( PROPERTY_TABINDEX )
)
{
m_eComponentClass = eDialogControl;
}
else
{
m_eComponentClass = eFormControl;
}
//////////////////////////////////////////////////////////////////
// (database) sub form?
Reference< XForm > xAsForm( m_xComponent, UNO_QUERY );
if ( xAsForm.is() )
{
Reference< XForm > xFormsParent = xFormsParent.query( xAsForm->getParent() );
m_bComponentIsSubForm = xFormsParent.is();
}
//////////////////////////////////////////////////////////////////
// ClassId
Reference< XChild > xCompAsChild( m_xComponent, UNO_QUERY );
if ( xCompAsChild.is() )
m_xObjectParent = xCompAsChild->getParent();
//////////////////////////////////////////////////////////////////
// ClassId
impl_classifyControlModel_throw();
}
catch( const RuntimeException& )
{
throw;
}
catch( const Exception& )
{
OSL_FAIL( "FormComponentPropertyHandler::impl_initComponentMetaData_throw: caught an exception!" );
}
}
//------------------------------------------------------------------------
void FormComponentPropertyHandler::impl_classifyControlModel_throw( )
{
if ( impl_componentHasProperty_throw( PROPERTY_CLASSID ) )
{
OSL_VERIFY( m_xComponent->getPropertyValue( PROPERTY_CLASSID ) >>= m_nClassId );
}
else if ( eDialogControl == m_eComponentClass )
{
Reference< XControlModel > xControlModel( m_xComponent, UNO_QUERY );
Reference< XServiceInfo > xServiceInfo( m_xComponent, UNO_QUERY );
if ( xServiceInfo.is() )
{
// it's a control model, and can tell about it's supported services
m_nClassId = FormComponentType::CONTROL;
const sal_Char* aControlModelServiceNames[] =
{
"UnoControlButtonModel",
"UnoControlCheckBoxModel",
"UnoControlComboBoxModel",
"UnoControlCurrencyFieldModel",
"UnoControlDateFieldModel",
"UnoControlEditModel",
"UnoControlFileControlModel",
"UnoControlFixedTextModel",
"UnoControlGroupBoxModel",
"UnoControlImageControlModel",
"UnoControlListBoxModel",
"UnoControlNumericFieldModel",
"UnoControlPatternFieldModel",
"UnoControlRadioButtonModel",
"UnoControlScrollBarModel",
"UnoControlSpinButtonModel",
"UnoControlTimeFieldModel",
"UnoControlFixedLineModel",
"UnoControlFormattedFieldModel",
"UnoControlProgressBarModel"
};
const sal_Int16 nClassIDs[] =
{
FormComponentType::COMMANDBUTTON,
FormComponentType::CHECKBOX,
FormComponentType::COMBOBOX,
FormComponentType::CURRENCYFIELD,
FormComponentType::DATEFIELD,
FormComponentType::TEXTFIELD,
FormComponentType::FILECONTROL,
FormComponentType::FIXEDTEXT,
FormComponentType::GROUPBOX,
FormComponentType::IMAGECONTROL,
FormComponentType::LISTBOX,
FormComponentType::NUMERICFIELD,
FormComponentType::PATTERNFIELD,
FormComponentType::RADIOBUTTON,
FormComponentType::SCROLLBAR,
FormComponentType::SPINBUTTON,
FormComponentType::TIMEFIELD,
ControlType::FIXEDLINE,
ControlType::FORMATTEDFIELD,
ControlType::PROGRESSBAR
};
sal_Int32 nKnownControlTypes = SAL_N_ELEMENTS( aControlModelServiceNames );
OSL_ENSURE( nKnownControlTypes == SAL_N_ELEMENTS( nClassIDs ),
"FormComponentPropertyHandler::impl_classifyControlModel_throw: inconsistence" );
for ( sal_Int32 i = 0; i < nKnownControlTypes; ++i )
{
OUString sServiceName( "com.sun.star.awt." );
sServiceName += OUString::createFromAscii( aControlModelServiceNames[ i ] );
if ( xServiceInfo->supportsService( sServiceName ) )
{
m_nClassId = nClassIDs[ i ];
break;
}
}
}
}
}
//------------------------------------------------------------------------
void FormComponentPropertyHandler::impl_normalizePropertyValue_nothrow( Any& _rValue, PropertyId _nPropId ) const
{
switch ( _nPropId )
{
case PROPERTY_ID_TABSTOP:
if ( !_rValue.hasValue() )
{
switch ( m_nClassId )
{
case FormComponentType::COMMANDBUTTON:
case FormComponentType::RADIOBUTTON:
case FormComponentType::CHECKBOX:
case FormComponentType::TEXTFIELD:
case FormComponentType::LISTBOX:
case FormComponentType::COMBOBOX:
case FormComponentType::FILECONTROL:
case FormComponentType::DATEFIELD:
case FormComponentType::TIMEFIELD:
case FormComponentType::NUMERICFIELD:
case ControlType::FORMATTEDFIELD:
case FormComponentType::CURRENCYFIELD:
case FormComponentType::PATTERNFIELD:
_rValue = makeAny( (sal_Bool)sal_True );
break;
default:
_rValue = makeAny( (sal_Bool)sal_False );
break;
}
}
break;
}
}
//------------------------------------------------------------------------
bool FormComponentPropertyHandler::impl_shouldExcludeProperty_nothrow( const Property& _rProperty ) const
{
OSL_ENSURE( _rProperty.Handle == m_pInfoService->getPropertyId( _rProperty.Name ),
"FormComponentPropertyHandler::impl_shouldExcludeProperty_nothrow: insonsistency in the property!" );
if ( _rProperty.Handle == PROPERTY_ID_CONTROLLABEL )
// prevent that this is caught below
return false;
if ( ( _rProperty.Type.getTypeClass() == TypeClass_INTERFACE )
|| ( _rProperty.Type.getTypeClass() == TypeClass_ARRAY )
|| ( _rProperty.Type.getTypeClass() == TypeClass_UNKNOWN )
)
return true;
if ( ( _rProperty.Attributes & PropertyAttribute::TRANSIENT ) && ( m_eComponentClass != eDialogControl ) )
// strange enough, dialog controls declare a lot of their properties as transient
return true;
if ( _rProperty.Attributes & PropertyAttribute::READONLY )
return true;
switch ( _rProperty.Handle )
{
case PROPERTY_ID_MASTERFIELDS:
case PROPERTY_ID_DETAILFIELDS:
if ( !m_bComponentIsSubForm )
// no master and detail fields for forms which are no sub forms
return true;
break;
case PROPERTY_ID_DATASOURCE:
{
// don't show DataSource if the component is part of an embedded form document
Reference< XConnection > xConn;
if ( isEmbeddedInDatabase( m_xComponent, xConn ) )
return true;
}
break;
case PROPERTY_ID_TEXT:
// don't show the "Text" property of formatted fields
if ( ControlType::FORMATTEDFIELD == m_nClassId )
return true;
break;
case PROPERTY_ID_FORMATKEY:
case PROPERTY_ID_EFFECTIVE_MIN:
case PROPERTY_ID_EFFECTIVE_MAX:
case PROPERTY_ID_EFFECTIVE_DEFAULT:
case PROPERTY_ID_EFFECTIVE_VALUE:
// only if the set has a formats supplier, too
if ( !impl_componentHasProperty_throw( PROPERTY_FORMATSSUPPLIER ) )
return true;
// (form) date and time fields also have a formats supplier, but the format itself
// is reflected in another property
if ( ( FormComponentType::DATEFIELD == m_nClassId )
|| ( FormComponentType::TIMEFIELD == m_nClassId )
)
return true;
break;
case PROPERTY_ID_SCALEIMAGE:
if ( impl_componentHasProperty_throw( PROPERTY_SCALE_MODE ) )
// ScaleImage is superseded by ScaleMode
return true;
break;
case PROPERTY_ID_WRITING_MODE:
if ( !SvtCTLOptions().IsCTLFontEnabled() )
return true;
break;
}
sal_uInt32 nPropertyUIFlags = m_pInfoService->getPropertyUIFlags( _rProperty.Handle );
// don't show experimental properties unless allowed to do so
if ( ( nPropertyUIFlags & PROP_FLAG_EXPERIMENTAL ) != 0 )
{
if ( true ) // TODO
return true;
}
// no data properties if no Base is installed. #124939#
// This fix is not intendend to appear on the main trunk. If you find it there,
// please tell me! frank.schoenheit@sun.com
if ( ( nPropertyUIFlags & PROP_FLAG_DATA_PROPERTY ) != 0 )
if ( !SvtModuleOptions().IsModuleInstalled( SvtModuleOptions::E_SDATABASE ) )
return true;
return false;
}
//------------------------------------------------------------------------
Reference< XRowSet > FormComponentPropertyHandler::impl_getRowSet_throw( ) const
{
Reference< XRowSet > xRowSet = m_xRowSet;
if ( !xRowSet.is() )
{
xRowSet.set( m_xComponent, UNO_QUERY );
if ( !xRowSet.is() )
{
xRowSet = Reference< XRowSet >( m_xObjectParent, UNO_QUERY );
if ( !xRowSet.is() )
{
// are we inspecting a grid column?
if (Reference< XGridColumnFactory >( m_xObjectParent, UNO_QUERY) .is())
{ // yes
Reference< XChild > xParentAsChild( m_xObjectParent, UNO_QUERY );
if ( xParentAsChild.is() )
xRowSet = Reference< XRowSet >( xParentAsChild->getParent(), UNO_QUERY );
}
}
if ( !xRowSet.is() )
xRowSet = m_xRowSet;
}
DBG_ASSERT( xRowSet.is(), "FormComponentPropertyHandler::impl_getRowSet_throw: could not obtain the rowset for the introspectee!" );
}
return xRowSet;
}
//------------------------------------------------------------------------
Reference< XRowSet > FormComponentPropertyHandler::impl_getRowSet_nothrow( ) const
{
Reference< XRowSet > xReturn;
try
{
xReturn = impl_getRowSet_throw();
}
catch( const Exception& )
{
OSL_FAIL( "FormComponentPropertyHandler::impl_getRowSet_nothrow: caught an exception!" );
}
return xReturn;
}
//------------------------------------------------------------------------
void FormComponentPropertyHandler::impl_initFieldList_nothrow( ::std::vector< OUString >& _rFieldNames ) const
{
clearContainer( _rFieldNames );
try
{
WaitCursor aWaitCursor( impl_getDefaultDialogParent_nothrow() );
Reference< XPreparedStatement > xStatement;
// get the form of the control we're inspecting
Reference< XPropertySet > xFormSet( impl_getRowSet_throw(), UNO_QUERY );
if ( !xFormSet.is() )
return;
OUString sObjectName;
OSL_VERIFY( xFormSet->getPropertyValue( PROPERTY_COMMAND ) >>= sObjectName );
// when there is no command we don't need to ask for columns
if ( !sObjectName.isEmpty() && impl_ensureRowsetConnection_nothrow() )
{
OUString aDatabaseName;
OSL_VERIFY( xFormSet->getPropertyValue( PROPERTY_DATASOURCE ) >>= aDatabaseName );
sal_Int32 nObjectType = CommandType::COMMAND;
OSL_VERIFY( xFormSet->getPropertyValue( PROPERTY_COMMANDTYPE ) >>= nObjectType );
Sequence< OUString > aFields( ::dbtools::getFieldNamesByCommandDescriptor( m_xRowSetConnection, nObjectType, sObjectName ) );
const OUString* pFields = aFields.getConstArray();
for ( sal_Int32 i = 0; i < aFields.getLength(); ++i, ++pFields )
_rFieldNames.push_back( *pFields );
}
}
catch (const Exception&)
{
OSL_FAIL( "FormComponentPropertyHandler::impl_initFieldList_nothrow: caught an exception!" );
}
}
//------------------------------------------------------------------------
void FormComponentPropertyHandler::impl_clearRowsetConnection_nothrow()
{
m_xRowSetConnection.clear();
}
//------------------------------------------------------------------------
void FormComponentPropertyHandler::impl_displaySQLError_nothrow( const ::dbtools::SQLExceptionInfo& _rErrorDescriptor ) const
{
::dbtools::showError( _rErrorDescriptor, VCLUnoHelper::GetInterface( impl_getDefaultDialogParent_nothrow() ), m_xContext );
}
//------------------------------------------------------------------------
bool FormComponentPropertyHandler::impl_ensureRowsetConnection_nothrow() const
{
if ( !m_xRowSetConnection.is() )
{
uno::Reference<sdbc::XConnection> xConnection;
Any any = m_xContext->getValueByName( "ActiveConnection" );
any >>= xConnection;
m_xRowSetConnection.reset(xConnection,::dbtools::SharedConnection::NoTakeOwnership);
}
if ( m_xRowSetConnection.is() )
return true;
Reference< XRowSet > xRowSet( impl_getRowSet_throw() );
Reference< XPropertySet > xRowSetProps( xRowSet, UNO_QUERY );
// connect the row set - this is delegated to elsewhere - while observing errors
SQLExceptionInfo aError;
try
{
if ( xRowSetProps.is() )
{
WaitCursor aWaitCursor( impl_getDefaultDialogParent_nothrow() );
m_xRowSetConnection = ::dbtools::ensureRowSetConnection( xRowSet, m_xContext, false );
}
}
catch ( const SQLException& ) { aError = SQLExceptionInfo( ::cppu::getCaughtException() ); }
catch ( const WrappedTargetException& e ) { aError = SQLExceptionInfo( e.TargetException ); }
catch ( const Exception& ) { DBG_UNHANDLED_EXCEPTION(); }
// report errors, if necessary
if ( aError.isValid() )
{
OUString sDataSourceName;
try
{
xRowSetProps->getPropertyValue( PROPERTY_DATASOURCE ) >>= sDataSourceName;
}
catch( const Exception& )
{
OSL_FAIL( "FormComponentPropertyHandler::impl_ensureRowsetConnection_nothrow: caught an exception during error handling!" );
}
// additional info about what happended
String sInfo( PcrRes( RID_STR_UNABLETOCONNECT ) );
INetURLObject aParser( sDataSourceName );
if ( aParser.GetProtocol() != INET_PROT_NOT_VALID )
sDataSourceName = aParser.getBase( INetURLObject::LAST_SEGMENT, true, INetURLObject::DECODE_WITH_CHARSET );
sInfo.SearchAndReplaceAllAscii( "$name$", sDataSourceName );
SQLContext aContext;
aContext.Message = sInfo;
aContext.NextException = aError.get();
impl_displaySQLError_nothrow( aContext );
}
return m_xRowSetConnection.is();
}
//------------------------------------------------------------------------
void FormComponentPropertyHandler::impl_describeCursorSource_nothrow( LineDescriptor& _out_rProperty, const Reference< XPropertyControlFactory >& _rxControlFactory ) const
{
try
{
WaitCursor aWaitCursor( impl_getDefaultDialogParent_nothrow() );
////////////////////////////////////////////////////////////
// Setzen der UI-Daten
_out_rProperty.DisplayName = m_pInfoService->getPropertyTranslation( PROPERTY_ID_COMMAND );
_out_rProperty.HelpURL = HelpIdUrl::getHelpURL( m_pInfoService->getPropertyHelpId( PROPERTY_ID_COMMAND ) );
_out_rProperty.PrimaryButtonId = OUString::createFromAscii(UID_PROP_DLG_SQLCOMMAND);
////////////////////////////////////////////////////////////
sal_Int32 nCommandType = CommandType::COMMAND;
impl_getPropertyValue_throw( PROPERTY_COMMANDTYPE ) >>= nCommandType;
switch ( nCommandType )
{
case CommandType::TABLE:
case CommandType::QUERY:
{
::std::vector< OUString > aNames;
if ( impl_ensureRowsetConnection_nothrow() )
{
if ( nCommandType == CommandType::TABLE )
impl_fillTableNames_throw( aNames );
else
impl_fillQueryNames_throw( aNames );
}
_out_rProperty.Control = PropertyHandlerHelper::createComboBoxControl( _rxControlFactory, aNames, sal_False, sal_True );
}
break;
default:
_out_rProperty.Control = _rxControlFactory->createPropertyControl( PropertyControlType::MultiLineTextField, sal_False );
break;
}
}
catch (const Exception&)
{
OSL_FAIL("FormComponentPropertyHandler::impl_describeCursorSource_nothrow: caught an exception !");
}
}
//------------------------------------------------------------------------
void FormComponentPropertyHandler::impl_fillTableNames_throw( ::std::vector< OUString >& _out_rNames ) const
{
OSL_PRECOND( m_xRowSetConnection.is(), "FormComponentPropertyHandler::impl_fillTableNames_throw: need a connection!" );
_out_rNames.resize( 0 );
Reference< XTablesSupplier > xSupplyTables( m_xRowSetConnection, UNO_QUERY );
Reference< XNameAccess > xTableNames;
if ( xSupplyTables.is() )
xTableNames = xSupplyTables->getTables();
DBG_ASSERT( xTableNames.is(), "FormComponentPropertyHandler::impl_fillTableNames_throw: no way to obtain the tables of the connection!" );
if ( !xTableNames.is() )
return;
Sequence< OUString> aTableNames = xTableNames->getElementNames();
sal_uInt32 nCount = aTableNames.getLength();
const OUString* pTableNames = aTableNames.getConstArray();
for ( sal_uInt32 i=0; i<nCount; ++i ,++pTableNames )
_out_rNames.push_back( *pTableNames );
}
//------------------------------------------------------------------------
void FormComponentPropertyHandler::impl_fillQueryNames_throw( ::std::vector< OUString >& _out_rNames ) const
{
OSL_PRECOND( m_xRowSetConnection.is(), "FormComponentPropertyHandler::impl_fillQueryNames_throw: need a connection!" );
_out_rNames.resize( 0 );
Reference< XQueriesSupplier > xSupplyQueries( m_xRowSetConnection, UNO_QUERY );
Reference< XNameAccess > xQueryNames;
if ( xSupplyQueries.is() )
{
xQueryNames = xSupplyQueries->getQueries();
impl_fillQueryNames_throw(xQueryNames,_out_rNames);
}
}
//------------------------------------------------------------------------
void FormComponentPropertyHandler::impl_fillQueryNames_throw( const Reference< XNameAccess >& _xQueryNames,::std::vector< OUString >& _out_rNames,const OUString& _sName ) const
{
DBG_ASSERT( _xQueryNames.is(), "FormComponentPropertyHandler::impl_fillQueryNames_throw: no way to obtain the queries of the connection!" );
if ( !_xQueryNames.is() )
return;
Sequence< OUString> aQueryNames = _xQueryNames->getElementNames();
sal_uInt32 nCount = aQueryNames.getLength();
const OUString* pQueryNames = aQueryNames.getConstArray();
sal_Bool bAdd = !_sName.isEmpty();
for ( sal_uInt32 i=0; i<nCount; i++, ++pQueryNames )
{
OUStringBuffer sTemp;
if ( bAdd )
{
sTemp.append(_sName);
sTemp.appendAscii("/");
}
sTemp.append(*pQueryNames);
Reference< XNameAccess > xSubQueries(_xQueryNames->getByName(*pQueryNames),UNO_QUERY);
if ( xSubQueries.is() )
impl_fillQueryNames_throw(xSubQueries,_out_rNames,sTemp.makeStringAndClear());
else
_out_rNames.push_back( sTemp.makeStringAndClear() );
}
}
//------------------------------------------------------------------------
void FormComponentPropertyHandler::impl_describeListSourceUI_throw( LineDescriptor& _out_rDescriptor, const Reference< XPropertyControlFactory >& _rxControlFactory ) const
{
OSL_PRECOND( m_xComponent.is(), "FormComponentPropertyHandler::impl_describeListSourceUI_throw: no component!" );
////////////////////////////////////////////////////////////
// Auslesen des ListSourceTypes
Any aListSourceType( m_xComponent->getPropertyValue( PROPERTY_LISTSOURCETYPE ) );
sal_Int32 nListSourceType = ListSourceType_VALUELIST;
::cppu::enum2int( nListSourceType, aListSourceType );
_out_rDescriptor.DisplayName = m_pInfoService->getPropertyTranslation( PROPERTY_ID_LISTSOURCE );
_out_rDescriptor.HelpURL = HelpIdUrl::getHelpURL( m_pInfoService->getPropertyHelpId( PROPERTY_ID_LISTSOURCE ) );
////////////////////////////////////////////////////////////
// Enums setzen
switch( nListSourceType )
{
case ListSourceType_VALUELIST:
_out_rDescriptor.Control = _rxControlFactory->createPropertyControl( PropertyControlType::StringListField, sal_False );
break;
case ListSourceType_TABLEFIELDS:
case ListSourceType_TABLE:
case ListSourceType_QUERY:
{
::std::vector< OUString > aListEntries;
if ( impl_ensureRowsetConnection_nothrow() )
{
if ( nListSourceType == ListSourceType_QUERY )
impl_fillQueryNames_throw( aListEntries );
else
impl_fillTableNames_throw( aListEntries );
}
_out_rDescriptor.Control = PropertyHandlerHelper::createComboBoxControl( _rxControlFactory, aListEntries, sal_False, sal_False );
}
break;
case ListSourceType_SQL:
case ListSourceType_SQLPASSTHROUGH:
impl_ensureRowsetConnection_nothrow();
_out_rDescriptor.HasPrimaryButton = m_xRowSetConnection.is();
break;
}
}
//------------------------------------------------------------------------
bool FormComponentPropertyHandler::impl_dialogListSelection_nothrow( const OUString& _rProperty, ::osl::ClearableMutexGuard& _rClearBeforeDialog ) const
{
OSL_PRECOND( m_pInfoService.get(), "FormComponentPropertyHandler::impl_dialogListSelection_nothrow: no property meta data!" );
String sPropertyUIName( m_pInfoService->getPropertyTranslation( m_pInfoService->getPropertyId( _rProperty ) ) );
ListSelectionDialog aDialog( impl_getDefaultDialogParent_nothrow(), m_xComponent, _rProperty, sPropertyUIName );
_rClearBeforeDialog.clear();
return ( RET_OK == aDialog.Execute() );
}
//------------------------------------------------------------------------
bool FormComponentPropertyHandler::impl_dialogFilterOrSort_nothrow( bool _bFilter, OUString& _out_rSelectedClause, ::osl::ClearableMutexGuard& _rClearBeforeDialog ) const
{
OSL_PRECOND( Reference< XRowSet >( m_xComponent, UNO_QUERY ).is(),
"FormComponentPropertyHandler::impl_dialogFilterOrSort_nothrow: to be called for forms only!" );
_out_rSelectedClause = OUString();
bool bSuccess = false;
SQLExceptionInfo aErrorInfo;
try
{
if ( !impl_ensureRowsetConnection_nothrow() )
return false;
// get a composer for the statement which the form is currently based on
Reference< XSingleSelectQueryComposer > xComposer( ::dbtools::getCurrentSettingsComposer( m_xComponent, m_xContext ) );
OSL_ENSURE( xComposer.is(), "FormComponentPropertyHandler::impl_dialogFilterOrSort_nothrow: could not obtain a composer!" );
if ( !xComposer.is() )
return false;
OUString sPropertyUIName( m_pInfoService->getPropertyTranslation( _bFilter ? PROPERTY_ID_FILTER : PROPERTY_ID_SORT ) );
// create the dialog
Reference< XExecutableDialog > xDialog;
if ( _bFilter)
{
xDialog.set( sdb::FilterDialog::createDefault(m_xContext) );
}
else
{
xDialog.set( sdb::OrderDialog::createDefault(m_xContext) );
}
// initialize the dialog
Reference< XPropertySet > xDialogProps( xDialog, UNO_QUERY_THROW );
xDialogProps->setPropertyValue("QueryComposer", makeAny( xComposer ) );
xDialogProps->setPropertyValue("RowSet", makeAny( m_xComponent ) );
xDialogProps->setPropertyValue("ParentWindow", makeAny( VCLUnoHelper::GetInterface( impl_getDefaultDialogParent_nothrow() ) ) );
xDialogProps->setPropertyValue("Title", makeAny( sPropertyUIName ) );
_rClearBeforeDialog.clear();
bSuccess = ( xDialog->execute() != 0 );
if ( bSuccess )
_out_rSelectedClause = _bFilter ? xComposer->getFilter() : xComposer->getOrder();
}
catch (const SQLContext& e) { aErrorInfo = e; }
catch (const SQLWarning& e) { aErrorInfo = e; }
catch (const SQLException& e) { aErrorInfo = e; }
catch( const Exception& )
{
OSL_FAIL( "FormComponentPropertyHandler::impl_dialogFilterOrSort_nothrow: caught an exception!" );
}
if ( aErrorInfo.isValid() )
impl_displaySQLError_nothrow( aErrorInfo );
return bSuccess;
}
//------------------------------------------------------------------------
bool FormComponentPropertyHandler::impl_dialogLinkedFormFields_nothrow( ::osl::ClearableMutexGuard& _rClearBeforeDialog ) const
{
Reference< XForm > xDetailForm( m_xComponent, UNO_QUERY );
Reference< XForm > xMasterForm( m_xObjectParent, UNO_QUERY );
uno::Reference<beans::XPropertySet> xMasterProp(m_xObjectParent,uno::UNO_QUERY);
OSL_PRECOND( xDetailForm.is() && xMasterForm.is(), "FormComponentPropertyHandler::impl_dialogLinkedFormFields_nothrow: no forms!" );
if ( !xDetailForm.is() || !xMasterForm.is() )
return false;
FormLinkDialog aDialog( impl_getDefaultDialogParent_nothrow(), m_xComponent, xMasterProp, m_xContext );
_rClearBeforeDialog.clear();
return ( RET_OK == aDialog.Execute() );
}
//------------------------------------------------------------------------
bool FormComponentPropertyHandler::impl_dialogFormatting_nothrow( Any& _out_rNewValue, ::osl::ClearableMutexGuard& _rClearBeforeDialog ) const
{
bool bChanged = false;
try
{
// create the itemset for the dialog
SfxItemSet aCoreSet(SFX_APP()->GetPool(),
SID_ATTR_NUMBERFORMAT_VALUE, SID_ATTR_NUMBERFORMAT_VALUE,
SID_ATTR_NUMBERFORMAT_INFO, SID_ATTR_NUMBERFORMAT_INFO,
0); // ripped this somewhere ... don't understand it :(
// get the number formats supplier
Reference< XNumberFormatsSupplier > xSupplier;
m_xComponent->getPropertyValue( PROPERTY_FORMATSSUPPLIER ) >>= xSupplier;
DBG_ASSERT(xSupplier.is(), "FormComponentPropertyHandler::impl_dialogFormatting_nothrow: invalid call !" );
Reference< XUnoTunnel > xTunnel( xSupplier, UNO_QUERY_THROW );
SvNumberFormatsSupplierObj* pSupplier =
reinterpret_cast< SvNumberFormatsSupplierObj* >( xTunnel->getSomething( SvNumberFormatsSupplierObj::getUnoTunnelId() ) );
DBG_ASSERT( pSupplier != NULL, "FormComponentPropertyHandler::impl_dialogFormatting_nothrow: invalid call !" );
sal_Int32 nFormatKey = 0;
impl_getPropertyValue_throw( PROPERTY_FORMATKEY ) >>= nFormatKey;
aCoreSet.Put( SfxUInt32Item( SID_ATTR_NUMBERFORMAT_VALUE, nFormatKey ) );
SvNumberFormatter* pFormatter = pSupplier->GetNumberFormatter();
double dPreviewVal = OFormatSampleControl::getPreviewValue(pFormatter,nFormatKey);
SvxNumberInfoItem aFormatter( pFormatter, dPreviewVal, String( PcrRes( RID_STR_TEXT_FORMAT ) ), SID_ATTR_NUMBERFORMAT_INFO );
aCoreSet.Put( aFormatter );
// a tab dialog with a single page
::std::auto_ptr< SfxNoLayoutSingleTabDialog > pDialog( new SfxNoLayoutSingleTabDialog( impl_getDefaultDialogParent_nothrow(), aCoreSet, 0 ) );
SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
DBG_ASSERT( pFact, "CreateFactory fail!" );
::CreateTabPage fnCreatePage = pFact->GetTabPageCreatorFunc( RID_SVXPAGE_NUMBERFORMAT );
if ( !fnCreatePage )
throw RuntimeException(); // caught below
SfxTabPage* pPage = (*fnCreatePage)( pDialog.get(), aCoreSet );
pDialog->SetTabPage( pPage );
_rClearBeforeDialog.clear();
if ( RET_OK == pDialog->Execute() )
{
const SfxItemSet* pResult = pDialog->GetOutputItemSet();
const SfxPoolItem* pItem = pResult->GetItem( SID_ATTR_NUMBERFORMAT_INFO );
const SvxNumberInfoItem* pInfoItem = dynamic_cast< const SvxNumberInfoItem* >( pItem );
if (pInfoItem && pInfoItem->GetDelCount())
{
const sal_uInt32* pDeletedKeys = pInfoItem->GetDelArray();
for (sal_uInt16 i=0; i< pInfoItem->GetDelCount(); ++i, ++pDeletedKeys)
pFormatter->DeleteEntry(*pDeletedKeys);
}
pItem = NULL;
if ( SFX_ITEM_SET == pResult->GetItemState( SID_ATTR_NUMBERFORMAT_VALUE, sal_False, &pItem ) )
{
_out_rNewValue <<= (sal_Int32)( static_cast< const SfxUInt32Item* >( pItem )->GetValue() );
bChanged = true;
}
}
}
catch( const Exception& )
{
OSL_FAIL( "FormComponentPropertyHandler::impl_dialogFormatting_nothrow: : caught an exception!" );
}
return bChanged;
}
//------------------------------------------------------------------------
bool FormComponentPropertyHandler::impl_browseForImage_nothrow( Any& _out_rNewValue, ::osl::ClearableMutexGuard& _rClearBeforeDialog ) const
{
bool bIsLink = true;// reflect the legacy behavior
OUString aStrTrans = m_pInfoService->getPropertyTranslation( PROPERTY_ID_IMAGE_URL );
::sfx2::FileDialogHelper aFileDlg(
ui::dialogs::TemplateDescription::FILEOPEN_LINK_PREVIEW,
SFXWB_GRAPHIC);
aFileDlg.SetTitle(aStrTrans);
// non-linked images ( e.g. those located in the document
// stream ) only if document is available
Reference< XModel > xModel( impl_getContextDocument_nothrow() );
bool bHandleNonLink = false;
Reference< XFilePickerControlAccess > xController(aFileDlg.GetFilePicker(), UNO_QUERY);
DBG_ASSERT(xController.is(), "FormComponentPropertyHandler::impl_browseForImage_nothrow: missing the controller interface on the file picker!");
if (xController.is())
{
// do a preview by default
xController->setValue(ExtendedFilePickerElementIds::CHECKBOX_PREVIEW, 0, ::cppu::bool2any(sal_True));
xController->setValue(ExtendedFilePickerElementIds::CHECKBOX_LINK, 0, ::cppu::bool2any(bIsLink));
xController->enableControl(ExtendedFilePickerElementIds::CHECKBOX_LINK, bHandleNonLink );
}
OUString sCurValue;
OSL_VERIFY( impl_getPropertyValue_throw( PROPERTY_IMAGE_URL ) >>= sCurValue );
if ( !sCurValue.isEmpty() && !sCurValue.startsWith(GRAPHOBJ_URLPREFIX) )
{
aFileDlg.SetDisplayDirectory( sCurValue );
// TODO: need to set the display directory _and_ the default name
}
_rClearBeforeDialog.clear();
bool bSuccess = ( 0 == aFileDlg.Execute() );
if ( bSuccess )
{
if ( bHandleNonLink && xController.is() )
{
xController->getValue(ExtendedFilePickerElementIds::CHECKBOX_LINK, 0) >>= bIsLink;
}
if ( !bIsLink )
{
Graphic aGraphic;
aFileDlg.GetGraphic( aGraphic );
Reference< graphic::XGraphicObject > xGrfObj = graphic::GraphicObject::create( m_xContext );
xGrfObj->setGraphic( aGraphic.GetXGraphic() );
_out_rNewValue <<= xGrfObj;
}
else
_out_rNewValue <<= (OUString)aFileDlg.GetPath();
}
return bSuccess;
}
//------------------------------------------------------------------------
bool FormComponentPropertyHandler::impl_browseForTargetURL_nothrow( Any& _out_rNewValue, ::osl::ClearableMutexGuard& _rClearBeforeDialog ) const
{
::sfx2::FileDialogHelper aFileDlg(
ui::dialogs::TemplateDescription::FILEOPEN_READONLY_VERSION, 0);
OUString sURL;
OSL_VERIFY( impl_getPropertyValue_throw( PROPERTY_TARGET_URL ) >>= sURL );
INetURLObject aParser( sURL );
if ( INET_PROT_FILE == aParser.GetProtocol() )
// set the initial directory only for file-URLs. Everything else
// is considered to be potentially expensive
aFileDlg.SetDisplayDirectory( sURL );
_rClearBeforeDialog.clear();
bool bSuccess = ( 0 == aFileDlg.Execute() );
if ( bSuccess )
_out_rNewValue <<= (OUString)aFileDlg.GetPath();
return bSuccess;
}
//------------------------------------------------------------------------
bool FormComponentPropertyHandler::impl_executeFontDialog_nothrow( Any& _out_rNewValue, ::osl::ClearableMutexGuard& _rClearBeforeDialog ) const
{
bool bSuccess = false;
// create an item set for use with the dialog
SfxItemSet* pSet = NULL;
SfxItemPool* pPool = NULL;
SfxPoolItem** pDefaults = NULL;
ControlCharacterDialog::createItemSet(pSet, pPool, pDefaults);
ControlCharacterDialog::translatePropertiesToItems(m_xComponent, pSet);
{ // do this in an own block. The dialog needs to be destroyed before we call
// destroyItemSet
ControlCharacterDialog aDlg( impl_getDefaultDialogParent_nothrow(), *pSet );
_rClearBeforeDialog.clear();
if ( RET_OK == aDlg.Execute() )
{
const SfxItemSet* pOut = aDlg.GetOutputItemSet();
if ( pOut )
{
Sequence< NamedValue > aFontPropertyValues;
ControlCharacterDialog::translateItemsToProperties( *pOut, aFontPropertyValues );
_out_rNewValue <<= aFontPropertyValues;
bSuccess = true;
}
}
}
ControlCharacterDialog::destroyItemSet(pSet, pPool, pDefaults);
return bSuccess;
}
//------------------------------------------------------------------------
bool FormComponentPropertyHandler::impl_browseForDatabaseDocument_throw( Any& _out_rNewValue, ::osl::ClearableMutexGuard& _rClearBeforeDialog ) const
{
::sfx2::FileDialogHelper aFileDlg(
ui::dialogs::TemplateDescription::FILEOPEN_READONLY_VERSION, 0,
OUString("sdatabase"));
OUString sDataSource;
OSL_VERIFY( impl_getPropertyValue_throw( PROPERTY_DATASOURCE ) >>= sDataSource );
INetURLObject aParser( sDataSource );
if ( INET_PROT_FILE == aParser.GetProtocol() )
// set the initial directory only for file-URLs. Everything else
// is considered to be potentially expensive
aFileDlg.SetDisplayDirectory( sDataSource );
const SfxFilter* pFilter = SfxFilter::GetFilterByName(OUString("StarOffice XML (Base)"));
OSL_ENSURE(pFilter,"Filter: StarOffice XML (Base) could not be found!");
if ( pFilter )
{
aFileDlg.SetCurrentFilter(pFilter->GetUIName());
//aFileDlg.AddFilter(pFilter->GetFilterName(),pFilter->GetDefaultExtension());
}
_rClearBeforeDialog.clear();
bool bSuccess = ( 0 == aFileDlg.Execute() );
if ( bSuccess )
_out_rNewValue <<= (OUString)aFileDlg.GetPath();
return bSuccess;
}
//------------------------------------------------------------------------
bool FormComponentPropertyHandler::impl_dialogColorChooser_throw( sal_Int32 _nColorPropertyId, Any& _out_rNewValue, ::osl::ClearableMutexGuard& _rClearBeforeDialog ) const
{
sal_Int32 nColor = 0;
OSL_VERIFY( impl_getPropertyValue_throw( impl_getPropertyNameFromId_nothrow( _nColorPropertyId ) ) >>= nColor );
::Color aColor( nColor );
SvColorDialog aColorDlg( impl_getDefaultDialogParent_nothrow() );
aColorDlg.SetColor( aColor );
_rClearBeforeDialog.clear();
if ( !aColorDlg.Execute() )
return false;
aColor = aColorDlg.GetColor();
nColor = aColor.GetColor();
_out_rNewValue <<= (sal_Int32)nColor;
return true;
}
//------------------------------------------------------------------------
bool FormComponentPropertyHandler::impl_dialogChooseLabelControl_nothrow( Any& _out_rNewValue, ::osl::ClearableMutexGuard& _rClearBeforeDialog ) const
{
OSelectLabelDialog dlgSelectLabel( impl_getDefaultDialogParent_nothrow(), m_xComponent );
_rClearBeforeDialog.clear();
bool bSuccess = ( RET_OK == dlgSelectLabel.Execute() );
if ( bSuccess )
_out_rNewValue <<= dlgSelectLabel.GetSelected();
return bSuccess;
}
//------------------------------------------------------------------------
Reference< XControlContainer > FormComponentPropertyHandler::impl_getContextControlContainer_nothrow() const
{
Reference< XControlContainer > xControlContext;
Any any = m_xContext->getValueByName( "ControlContext" );
any >>= xControlContext;
return xControlContext;
}
//------------------------------------------------------------------------
bool FormComponentPropertyHandler::impl_dialogChangeTabOrder_nothrow( ::osl::ClearableMutexGuard& _rClearBeforeDialog ) const
{
OSL_PRECOND( impl_getContextControlContainer_nothrow().is(), "FormComponentPropertyHandler::impl_dialogChangeTabOrder_nothrow: invalid control context!" );
Reference< XTabControllerModel > xTabControllerModel( impl_getRowSet_nothrow(), UNO_QUERY );
TabOrderDialog aDialog(
impl_getDefaultDialogParent_nothrow(),
xTabControllerModel,
impl_getContextControlContainer_nothrow(),
m_xContext
);
_rClearBeforeDialog.clear();
return ( RET_OK == aDialog.Execute() );
}
//------------------------------------------------------------------------
namespace
{
//--------------------------------------------------------------------
//- ISQLCommandPropertyUI
//--------------------------------------------------------------------
class ISQLCommandPropertyUI : public ISQLCommandAdapter
{
public:
/** returns the empty-string-terminated list of names of properties
whose UI is to be disabled while the SQL command property is
being edited.
*/
virtual OUString* getPropertiesToDisable() = 0;
};
//--------------------------------------------------------------------
//- SQLCommandPropertyUI
//--------------------------------------------------------------------
class SQLCommandPropertyUI : public ISQLCommandPropertyUI
{
protected:
SQLCommandPropertyUI( const Reference< XPropertySet >& _rxObject )
:m_xObject( _rxObject )
{
if ( !m_xObject.is() )
throw NullPointerException();
}
virtual oslInterlockedCount SAL_CALL acquire()
{
return osl_atomic_increment( &m_refCount );
}
virtual oslInterlockedCount SAL_CALL release()
{
if ( 0 == osl_atomic_decrement( &m_refCount ) )
{
delete this;
return 0;
}
return m_refCount;
}
protected:
Reference< XPropertySet > m_xObject;
private:
oslInterlockedCount m_refCount;
};
//--------------------------------------------------------------------
//- FormSQLCommandUI - declaration
//--------------------------------------------------------------------
class FormSQLCommandUI : public SQLCommandPropertyUI
{
public:
FormSQLCommandUI( const Reference< XPropertySet >& _rxForm );
// ISQLCommandAdapter
virtual OUString getSQLCommand() const;
virtual sal_Bool getEscapeProcessing() const;
virtual void setSQLCommand( const OUString& _rCommand ) const;
virtual void setEscapeProcessing( const sal_Bool _bEscapeProcessing ) const;
// ISQLCommandPropertyUI
virtual OUString* getPropertiesToDisable();
};
//--------------------------------------------------------------------
//- FormSQLCommandUI - implementation
//--------------------------------------------------------------------
//....................................................................
FormSQLCommandUI::FormSQLCommandUI( const Reference< XPropertySet >& _rxForm )
:SQLCommandPropertyUI( _rxForm )
{
}
//....................................................................
OUString FormSQLCommandUI::getSQLCommand() const
{
OUString sCommand;
OSL_VERIFY( m_xObject->getPropertyValue( PROPERTY_COMMAND ) >>= sCommand );
return sCommand;
}
//....................................................................
sal_Bool FormSQLCommandUI::getEscapeProcessing() const
{
sal_Bool bEscapeProcessing( sal_False );
OSL_VERIFY( m_xObject->getPropertyValue( PROPERTY_ESCAPE_PROCESSING ) >>= bEscapeProcessing );
return bEscapeProcessing;
}
//....................................................................
void FormSQLCommandUI::setSQLCommand( const OUString& _rCommand ) const
{
m_xObject->setPropertyValue( PROPERTY_COMMAND, makeAny( _rCommand ) );
}
//....................................................................
void FormSQLCommandUI::setEscapeProcessing( const sal_Bool _bEscapeProcessing ) const
{
m_xObject->setPropertyValue( PROPERTY_ESCAPE_PROCESSING, makeAny( _bEscapeProcessing ) );
}
//....................................................................
OUString* FormSQLCommandUI::getPropertiesToDisable()
{
static OUString s_aCommandProps[] = {
OUString(PROPERTY_DATASOURCE),
OUString(PROPERTY_COMMAND),
OUString(PROPERTY_COMMANDTYPE),
OUString(PROPERTY_ESCAPE_PROCESSING),
OUString()
};
return s_aCommandProps;
}
//--------------------------------------------------------------------
//- ValueListCommandUI - declaration
//--------------------------------------------------------------------
class ValueListCommandUI : public SQLCommandPropertyUI
{
public:
ValueListCommandUI( const Reference< XPropertySet >& _rxListOrCombo );
// ISQLCommandAdapter
virtual OUString getSQLCommand() const;
virtual sal_Bool getEscapeProcessing() const;
virtual void setSQLCommand( const OUString& _rCommand ) const;
virtual void setEscapeProcessing( const sal_Bool _bEscapeProcessing ) const;
// ISQLCommandPropertyUI
virtual OUString* getPropertiesToDisable();
private:
mutable bool m_bPropertyValueIsList;
};
//--------------------------------------------------------------------
//- ValueListCommandUI - implementation
//--------------------------------------------------------------------
//....................................................................
ValueListCommandUI::ValueListCommandUI( const Reference< XPropertySet >& _rxListOrCombo )
:SQLCommandPropertyUI( _rxListOrCombo )
,m_bPropertyValueIsList( false )
{
}
//....................................................................
OUString ValueListCommandUI::getSQLCommand() const
{
OUString sValue;
m_bPropertyValueIsList = false;
// for combo boxes, the property is a mere string
Any aValue( m_xObject->getPropertyValue( PROPERTY_LISTSOURCE ) );
if ( aValue >>= sValue )
return sValue;
Sequence< OUString > aValueList;
if ( aValue >>= aValueList )
{
m_bPropertyValueIsList = true;
if ( aValueList.getLength() )
sValue = aValueList[0];
return sValue;
}
OSL_FAIL( "ValueListCommandUI::getSQLCommand: unexpected property type!" );
return sValue;
}
//....................................................................
sal_Bool ValueListCommandUI::getEscapeProcessing() const
{
enum ListSourceType eType( ListSourceType_SQL );
OSL_VERIFY( m_xObject->getPropertyValue( PROPERTY_LISTSOURCETYPE ) >>= eType );
OSL_ENSURE( ( eType == ListSourceType_SQL ) || ( eType == ListSourceType_SQLPASSTHROUGH ),
"ValueListCommandUI::getEscapeProcessing: unexpected list source type!" );
return ( eType == ListSourceType_SQL );
}
//....................................................................
void ValueListCommandUI::setSQLCommand( const OUString& _rCommand ) const
{
Any aValue;
if ( m_bPropertyValueIsList )
aValue <<= Sequence< OUString >( &_rCommand, 1 );
else
aValue <<= _rCommand;
m_xObject->setPropertyValue( PROPERTY_LISTSOURCE, aValue );
}
//....................................................................
void ValueListCommandUI::setEscapeProcessing( const sal_Bool _bEscapeProcessing ) const
{
m_xObject->setPropertyValue( PROPERTY_LISTSOURCETYPE, makeAny(
_bEscapeProcessing ? ListSourceType_SQL : ListSourceType_SQLPASSTHROUGH ) );
}
//....................................................................
OUString* ValueListCommandUI::getPropertiesToDisable()
{
static OUString s_aListSourceProps[] = {
OUString(PROPERTY_LISTSOURCETYPE),
OUString(PROPERTY_LISTSOURCE),
OUString()
};
return s_aListSourceProps;
}
}
//------------------------------------------------------------------------
bool FormComponentPropertyHandler::impl_doDesignSQLCommand_nothrow( const Reference< XObjectInspectorUI >& _rxInspectorUI, PropertyId _nDesignForProperty )
{
try
{
if ( m_xCommandDesigner.is() )
{
if ( m_xCommandDesigner->isActive() )
{
m_xCommandDesigner->raise();
return true;
}
m_xCommandDesigner->dispose();
m_xCommandDesigner.set( NULL );
}
if ( !impl_ensureRowsetConnection_nothrow() )
return false;
Reference< XPropertySet > xComponentProperties( m_xComponent, UNO_QUERY_THROW );
::rtl::Reference< ISQLCommandPropertyUI > xCommandUI;
switch ( _nDesignForProperty )
{
case PROPERTY_ID_COMMAND:
xCommandUI = new FormSQLCommandUI( xComponentProperties );
break;
case PROPERTY_ID_LISTSOURCE:
xCommandUI = new ValueListCommandUI( xComponentProperties );
break;
default:
OSL_FAIL( "FormComponentPropertyHandler::OnDesignerClosed: invalid property id!" );
return false;
}
m_xCommandDesigner.set( new SQLCommandDesigner( m_xContext, xCommandUI.get(), m_xRowSetConnection, LINK( this, FormComponentPropertyHandler, OnDesignerClosed ) ) );
DBG_ASSERT( _rxInspectorUI.is(), "FormComponentPropertyHandler::OnDesignerClosed: no access to the property browser ui!" );
if ( m_xCommandDesigner->isActive() && _rxInspectorUI.is() )
{
m_xBrowserUI = _rxInspectorUI;
// disable everything which would affect this property
const OUString* pToDisable = xCommandUI->getPropertiesToDisable();
while ( !pToDisable->isEmpty() )
{
m_xBrowserUI->enablePropertyUIElements( *pToDisable++, PropertyLineElement::All, sal_False );
}
// but enable the browse button for the property itself - so it can be used to raise the query designer
OUString sPropertyName( impl_getPropertyNameFromId_nothrow( _nDesignForProperty ) );
m_xBrowserUI->enablePropertyUIElements( sPropertyName, PropertyLineElement::PrimaryButton, sal_True );
}
}
catch( const Exception& )
{
DBG_UNHANDLED_EXCEPTION();
}
return m_xCommandDesigner.is();
}
//------------------------------------------------------------------------
IMPL_LINK( FormComponentPropertyHandler, OnDesignerClosed, void*, /*NOTINTERESTEDIN*/ )
{
OSL_ENSURE( m_xBrowserUI.is() && m_xCommandDesigner.is(), "FormComponentPropertyHandler::OnDesignerClosed: too many NULLs!" );
if ( m_xBrowserUI.is() && m_xCommandDesigner.is() )
{
try
{
::rtl::Reference< ISQLCommandPropertyUI > xCommandUI(
dynamic_cast< ISQLCommandPropertyUI* >( m_xCommandDesigner->getPropertyAdapter().get() ) );
if ( !xCommandUI.is() )
throw NullPointerException();
const OUString* pToEnable = xCommandUI->getPropertiesToDisable();
while ( !pToEnable->isEmpty() )
{
m_xBrowserUI->enablePropertyUIElements( *pToEnable++, PropertyLineElement::All, sal_True );
}
}
catch( const Exception& )
{
DBG_UNHANDLED_EXCEPTION();
}
}
return 0L;
}
//------------------------------------------------------------------------
bool FormComponentPropertyHandler::impl_hasValidDataSourceSignature_nothrow( const Reference< XPropertySet >& _xFormProperties, bool _bAllowEmptyDataSourceName ) SAL_THROW(())
{
bool bHas = false;
if ( _xFormProperties.is() )
{
try
{
OUString sPropertyValue;
// first, we need the name of an existent data source
if ( _xFormProperties->getPropertySetInfo()->hasPropertyByName(PROPERTY_DATASOURCE) )
_xFormProperties->getPropertyValue( PROPERTY_DATASOURCE ) >>= sPropertyValue;
bHas = ( !sPropertyValue.isEmpty() ) || _bAllowEmptyDataSourceName;
// then, the command should not be empty
if ( bHas )
{
if ( _xFormProperties->getPropertySetInfo()->hasPropertyByName(PROPERTY_COMMAND) )
_xFormProperties->getPropertyValue( PROPERTY_COMMAND ) >>= sPropertyValue;
bHas = !sPropertyValue.isEmpty();
}
}
catch( const Exception& )
{
OSL_FAIL( "FormComponentPropertyHandler::impl_hasValidDataSourceSignature_nothrow: caught an exception!" );
}
}
return bHas;
}
//------------------------------------------------------------------------
OUString FormComponentPropertyHandler::impl_getDocumentURL_nothrow() const
{
OUString sURL;
try
{
Reference< XModel > xDocument( impl_getContextDocument_nothrow() );
if ( xDocument.is() )
sURL = xDocument->getURL();
}
catch( const Exception& )
{
DBG_UNHANDLED_EXCEPTION();
}
return sURL;
}
// -------------------------------------------------------------------------
::cppu::IPropertyArrayHelper* FormComponentPropertyHandler::createArrayHelper( ) const
{
uno::Sequence< beans::Property > aProps;
describeProperties(aProps);
return new ::cppu::OPropertyArrayHelper(aProps);
}
// -------------------------------------------------------------------------
::cppu::IPropertyArrayHelper & FormComponentPropertyHandler::getInfoHelper()
{
return *const_cast<FormComponentPropertyHandler*>(this)->getArrayHelper();
}
// -----------------------------------------------------------------------------
uno::Reference< beans::XPropertySetInfo > SAL_CALL FormComponentPropertyHandler::getPropertySetInfo( ) throw(uno::RuntimeException)
{
return ::cppu::OPropertySetHelper::createPropertySetInfo(getInfoHelper());
}
//........................................................................
} // namespace pcr
//........................................................................
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */