Files
libreoffice/vbahelper/source/msforms/vbacontrols.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

506 lines
20 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 <com/sun/star/awt/XControl.hpp>
#include <com/sun/star/awt/XControlContainer.hpp>
#include <com/sun/star/awt/FontWeight.hpp>
#include <com/sun/star/awt/FontSlant.hpp>
#include <com/sun/star/awt/FontStrikeout.hpp>
#include <com/sun/star/awt/FontUnderline.hpp>
#include <com/sun/star/container/XNameContainer.hpp>
#include <com/sun/star/script/XInvocation.hpp>
#include <com/sun/star/lang/WrappedTargetException.hpp>
#include "vbacontrols.hxx"
#include "vbacontrol.hxx"
#include <cppuhelper/implbase2.hxx>
#include <ooo/vba/XControlProvider.hpp>
#include <boost/unordered_map.hpp>
using namespace com::sun::star;
using namespace ooo::vba;
typedef ::cppu::WeakImplHelper2< container::XNameAccess, container::XIndexAccess > ArrayWrapImpl;
typedef boost::unordered_map< OUString, sal_Int32, OUStringHash,
::std::equal_to< OUString > > ControlIndexMap;
typedef std::vector< uno::Reference< awt::XControl > > ControlVec;
class ControlArrayWrapper : public ArrayWrapImpl
{
uno::Reference< awt::XControlContainer > mxDialog;
uno::Sequence< OUString > msNames;
ControlVec mControls;
ControlIndexMap mIndices;
private:
void SetArrayElementTo( const uno::Reference< awt::XControl >& xCtrl, sal_Int32 nIndex = -1 )
{
// initialize the element with specified index to the control
if ( xCtrl.is() )
{
if ( nIndex == -1 )
nIndex = msNames.getLength();
if ( nIndex >= msNames.getLength() )
msNames.realloc( nIndex );
msNames[ nIndex ] = getControlName( xCtrl );
mControls.push_back( xCtrl );
mIndices[ msNames[ nIndex ] ] = nIndex;
}
}
void getNestedControls( ControlVec& vControls, uno::Reference< awt::XControlContainer >& xContainer )
{
uno::Sequence< uno::Reference< awt::XControl > > aControls = xContainer->getControls();
const uno::Reference< awt::XControl >* pCtrl = aControls.getConstArray();
const uno::Reference< awt::XControl >* pCtrlsEnd = pCtrl + aControls.getLength();
for ( ; pCtrl < pCtrlsEnd; ++pCtrl )
{
uno::Reference< awt::XControlContainer > xC( *pCtrl, uno::UNO_QUERY );
vControls.push_back( *pCtrl );
if ( xC.is() )
getNestedControls( vControls, xC );
}
}
public:
ControlArrayWrapper( const uno::Reference< awt::XControl >& xDialog )
{
try
{
mxDialog.set( xDialog, uno::UNO_QUERY_THROW );
uno::Sequence< uno::Reference< awt::XControl > > sXControls = mxDialog->getControls();
msNames.realloc( sXControls.getLength() );
for ( sal_Int32 i = 0; i < sXControls.getLength(); ++i )
SetArrayElementTo( sXControls[ i ], i );
}
catch (const uno::Exception&)
{
// accept the case when the dialog already does not exist
// in this case the wrapper should work in dummy mode
}
}
static OUString getControlName( const uno::Reference< awt::XControl >& xCtrl )
{
if ( !xCtrl.is() )
throw uno::RuntimeException();
uno::Reference< beans::XPropertySet > xProp( xCtrl->getModel(), uno::UNO_QUERY_THROW );
OUString sName;
xProp->getPropertyValue( "Name" ) >>= sName;
return sName;
}
// XElementAccess
virtual uno::Type SAL_CALL getElementType( ) throw (uno::RuntimeException)
{
return awt::XControl::static_type(0);
}
virtual ::sal_Bool SAL_CALL hasElements( ) throw (uno::RuntimeException)
{
return ( !mControls.empty() );
}
// XNameAcess
virtual uno::Any SAL_CALL getByName( const OUString& aName ) throw (container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException)
{
if ( !hasByName( aName ) )
throw container::NoSuchElementException();
return getByIndex( mIndices[ aName ] );
}
virtual uno::Sequence< OUString > SAL_CALL getElementNames( ) throw (uno::RuntimeException)
{
return msNames;
}
virtual ::sal_Bool SAL_CALL hasByName( const OUString& aName ) throw (css::uno::RuntimeException)
{
ControlIndexMap::iterator it = mIndices.find( aName );
return it != mIndices.end();
}
// XElementAccess
virtual ::sal_Int32 SAL_CALL getCount( ) throw (css::uno::RuntimeException)
{
return mControls.size();
}
virtual uno::Any SAL_CALL getByIndex( ::sal_Int32 Index ) throw (lang::IndexOutOfBoundsException, lang::WrappedTargetException, uno::RuntimeException )
{
if ( Index < 0 || Index >= static_cast< sal_Int32 >( mControls.size() ) )
throw lang::IndexOutOfBoundsException();
return uno::makeAny( mControls[ Index ] );
}
};
class ControlsEnumWrapper : public EnumerationHelper_BASE
{
uno::Reference<XHelperInterface > m_xParent;
uno::Reference<uno::XComponentContext > m_xContext;
uno::Reference<container::XIndexAccess > m_xIndexAccess;
uno::Reference<awt::XControl > m_xDlg;
uno::Reference< frame::XModel > m_xModel;
double mfOffsetX;
double mfOffsetY;
sal_Int32 nIndex;
public:
ControlsEnumWrapper(
const uno::Reference< XHelperInterface >& xParent,
const uno::Reference< uno::XComponentContext >& xContext,
const uno::Reference< container::XIndexAccess >& xIndexAccess,
const uno::Reference< awt::XControl >& xDlg,
const uno::Reference< frame::XModel >& xModel,
double fOffsetX, double fOffsetY ) :
m_xParent( xParent ),
m_xContext( xContext),
m_xIndexAccess( xIndexAccess ),
m_xDlg( xDlg ),
m_xModel( xModel ),
mfOffsetX( fOffsetX ),
mfOffsetY( fOffsetY ),
nIndex( 0 ) {}
virtual ::sal_Bool SAL_CALL hasMoreElements( ) throw (uno::RuntimeException)
{
return ( nIndex < m_xIndexAccess->getCount() );
}
virtual uno::Any SAL_CALL nextElement( ) throw (container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException)
{
if ( nIndex < m_xIndexAccess->getCount() )
{
uno::Reference< awt::XControl > xControl;
m_xIndexAccess->getByIndex( nIndex++ ) >>= xControl;
uno::Reference< msforms::XControl > xVBAControl;
if ( xControl.is() && m_xDlg.is() )
xVBAControl = ScVbaControlFactory::createUserformControl( m_xContext, xControl, m_xDlg, m_xModel, mfOffsetX, mfOffsetY );
return uno::makeAny( xVBAControl );
}
throw container::NoSuchElementException();
}
};
static uno::Reference<container::XIndexAccess >
lcl_controlsWrapper( const uno::Reference< awt::XControl >& xDlg )
{
return new ControlArrayWrapper( xDlg );
}
ScVbaControls::ScVbaControls(
const uno::Reference< XHelperInterface >& xParent,
const uno::Reference< uno::XComponentContext >& xContext,
const css::uno::Reference< awt::XControl >& xDialog,
const uno::Reference< frame::XModel >& xModel,
double fOffsetX, double fOffsetY ) :
ControlsImpl_BASE( xParent, xContext, lcl_controlsWrapper( xDialog ) ),
mxDialog( xDialog ),
mxModel( xModel ),
mfOffsetX( fOffsetX ),
mfOffsetY( fOffsetY )
{
}
uno::Reference< container::XEnumeration >
ScVbaControls::createEnumeration() throw (uno::RuntimeException)
{
uno::Reference< container::XEnumeration > xEnum( new ControlsEnumWrapper( mxParent, mxContext, m_xIndexAccess, mxDialog, mxModel, mfOffsetX, mfOffsetY ) );
if ( !xEnum.is() )
throw uno::RuntimeException();
return xEnum;
}
uno::Any
ScVbaControls::createCollectionObject( const css::uno::Any& aSource )
{
// Create control from awt::XControl
uno::Reference< awt::XControl > xControl( aSource, uno::UNO_QUERY_THROW );
uno::Reference< msforms::XControl > xVBAControl = ScVbaControlFactory::createUserformControl( mxContext, xControl, mxDialog, mxModel, mfOffsetX, mfOffsetY );
return uno::Any( xVBAControl );
}
void SAL_CALL
ScVbaControls::Move( double cx, double cy ) throw (uno::RuntimeException)
{
uno::Reference< container::XEnumeration > xEnum( createEnumeration() );
while ( xEnum->hasMoreElements() )
{
uno::Reference< msforms::XControl > xControl( xEnum->nextElement(), uno::UNO_QUERY_THROW );
xControl->setLeft( xControl->getLeft() + cx );
xControl->setTop( xControl->getTop() + cy );
}
}
uno::Any SAL_CALL ScVbaControls::Add( const uno::Any& Object, const uno::Any& StringKey, const uno::Any& /*Before*/, const uno::Any& /*After*/ )
throw (uno::RuntimeException)
{
uno::Any aResult;
OUString aComServiceName;
try
{
if ( !mxDialog.is() )
throw uno::RuntimeException();
uno::Reference< awt::XControl > xNewControl;
uno::Reference< lang::XMultiServiceFactory > xModelFactory( mxDialog->getModel(), uno::UNO_QUERY_THROW );
uno::Reference< container::XNameContainer > xDialogContainer( xModelFactory, uno::UNO_QUERY_THROW );
Object >>= aComServiceName;
// TODO: Support Before and After?
OUString aNewName;
StringKey >>= aNewName;
if ( aNewName.isEmpty() )
{
aNewName = aComServiceName;
if ( aNewName.isEmpty() )
aNewName = "Control";
sal_Int32 nInd = 0;
while( xDialogContainer->hasByName( aNewName ) && (nInd < SAL_MAX_INT32) )
{
aNewName = aComServiceName;
aNewName += OUString::valueOf( nInd++ );
}
}
double fDefWidth = 72.0, fDefHeight = 18.0;
if ( !aComServiceName.isEmpty() )
{
// create a UNO control model based on the passed control type
uno::Reference< awt::XControlModel > xNewModel;
bool bFontSupport = false;
bool bNativeAX = false;
if( aComServiceName.equalsIgnoreAsciiCase( "Forms.CommandButton.1" ) )
{
xNewModel.set( xModelFactory->createInstance( "com.sun.star.awt.UnoControlButtonModel" ), uno::UNO_QUERY_THROW );
fDefWidth = 72.0; fDefHeight = 24.0;
bFontSupport = true;
}
else if( aComServiceName.equalsIgnoreAsciiCase( "Forms.Label.1" ) )
{
xNewModel.set( xModelFactory->createInstance( "com.sun.star.awt.UnoControlFixedTextModel" ), uno::UNO_QUERY_THROW );
fDefWidth = 72.0; fDefHeight = 18.0;
bFontSupport = true;
}
else if( aComServiceName.equalsIgnoreAsciiCase( "Forms.Image.1" ) )
{
xNewModel.set( xModelFactory->createInstance( "com.sun.star.awt.UnoControlImageControlModel" ), uno::UNO_QUERY_THROW );
fDefWidth = 72.0; fDefHeight = 72.0;
}
else if( aComServiceName.equalsIgnoreAsciiCase( "Forms.CheckBox.1" ) )
{
xNewModel.set( xModelFactory->createInstance( "com.sun.star.awt.UnoControlCheckBoxModel" ), uno::UNO_QUERY_THROW );
fDefWidth = 108.0; fDefHeight = 18.0;
bFontSupport = true;
}
else if( aComServiceName.equalsIgnoreAsciiCase( "Forms.OptionButton.1" ) )
{
xNewModel.set( xModelFactory->createInstance( "com.sun.star.awt.UnoControlRadioButtonModel" ), uno::UNO_QUERY_THROW );
fDefWidth = 108.0; fDefHeight = 18.0;
bFontSupport = true;
}
else if( aComServiceName.equalsIgnoreAsciiCase( "Forms.TextBox.1" ) )
{
xNewModel.set( xModelFactory->createInstance( "com.sun.star.awt.UnoControlEditModel" ), uno::UNO_QUERY_THROW );
fDefWidth = 72.0; fDefHeight = 18.0;
bFontSupport = true;
}
else if( aComServiceName.equalsIgnoreAsciiCase( "Forms.ListBox.1" ) )
{
xNewModel.set( xModelFactory->createInstance( "com.sun.star.awt.UnoControlListBoxModel" ), uno::UNO_QUERY_THROW );
fDefWidth = 72.0; fDefHeight = 18.0;
bFontSupport = true;
}
else if( aComServiceName.equalsIgnoreAsciiCase( "Forms.ComboBox.1" ) )
{
xNewModel.set( xModelFactory->createInstance( "com.sun.star.awt.UnoControlComboBoxModel" ), uno::UNO_QUERY_THROW );
uno::Reference< beans::XPropertySet > xProps( xNewModel, uno::UNO_QUERY_THROW );
xProps->setPropertyValue( "Dropdown" , uno::Any( true ) );
fDefWidth = 72.0; fDefHeight = 18.0;
bFontSupport = true;
}
else if( aComServiceName.equalsIgnoreAsciiCase( "Forms.ToggleButton.1" ) )
{
xNewModel.set( xModelFactory->createInstance( "com.sun.star.awt.UnoControlButtonModel" ), uno::UNO_QUERY_THROW );
uno::Reference< beans::XPropertySet > xProps( xNewModel, uno::UNO_QUERY_THROW );
xProps->setPropertyValue( "Toggle" , uno::Any( true ) );
fDefWidth = 72.0; fDefHeight = 18.0;
bFontSupport = true;
}
else if( aComServiceName.equalsIgnoreAsciiCase( "Forms.Frame.1" ) )
{
xNewModel.set( xModelFactory->createInstance( "com.sun.star.awt.UnoControlGroupBoxModel" ), uno::UNO_QUERY_THROW );
fDefWidth = 216.0; fDefHeight = 144.0;
bFontSupport = true;
}
else if( aComServiceName.equalsIgnoreAsciiCase( "Forms.SpinButton.1" ) )
{
xNewModel.set( xModelFactory->createInstance( "com.sun.star.awt.UnoControlSpinButtonModel" ), uno::UNO_QUERY_THROW );
fDefWidth = 12.75; fDefHeight = 25.5;
}
else if( aComServiceName.equalsIgnoreAsciiCase( "Forms.ScrollBar.1" ) )
{
xNewModel.set( xModelFactory->createInstance( "com.sun.star.awt.UnoControlScrollBarModel" ), uno::UNO_QUERY_THROW );
fDefWidth = 12.75; fDefHeight = 63.8;
}
else
{
xNewModel.set( xModelFactory->createInstance( "com.sun.star.custom.awt.UnoControlSystemAXContainerModel" ), uno::UNO_QUERY_THROW );
fDefWidth = 72.0; fDefHeight = 18.0;
bNativeAX = true;
}
// need to set a few font properties to get rid of the default DONT_KNOW values
if( bFontSupport )
{
uno::Reference< beans::XPropertySet > xModelProps( xNewModel, uno::UNO_QUERY_THROW );
xModelProps->setPropertyValue( "FontName" , uno::Any( OUString("Tahoma" ) ) );
xModelProps->setPropertyValue( "FontHeight" , uno::Any( float( 8.0 ) ) );
xModelProps->setPropertyValue( "FontWeight" , uno::Any( awt::FontWeight::NORMAL ) );
xModelProps->setPropertyValue( "FontSlant" , uno::Any( awt::FontSlant_NONE ) );
xModelProps->setPropertyValue( "FontUnderline" , uno::Any( awt::FontUnderline::NONE ) );
xModelProps->setPropertyValue( "FontStrikeout" , uno::Any( awt::FontStrikeout::NONE ) );
}
xDialogContainer->insertByName( aNewName, uno::makeAny( xNewModel ) );
uno::Reference< awt::XControlContainer > xControlContainer( mxDialog, uno::UNO_QUERY_THROW );
xNewControl = xControlContainer->getControl( aNewName );
if( bNativeAX ) try
{
uno::Reference< script::XInvocation > xControlInvoke( xNewControl, uno::UNO_QUERY_THROW );
uno::Sequence< uno::Any > aArgs( 1 );
aArgs[0] <<= aComServiceName;
uno::Sequence< sal_Int16 > aOutIDDummy;
uno::Sequence< uno::Any > aOutDummy;
xControlInvoke->invoke( "SOAddAXControl" , aArgs, aOutIDDummy, aOutDummy );
}
catch (const uno::Exception&)
{
xDialogContainer->removeByName( aNewName );
throw;
}
}
if ( xNewControl.is() )
{
UpdateCollectionIndex( lcl_controlsWrapper( mxDialog ) );
aResult <<= xNewControl;
aResult = createCollectionObject( aResult );
uno::Reference< msforms::XControl > xVBAControl( aResult, uno::UNO_QUERY_THROW );
if( fDefWidth > 0.0 )
xVBAControl->setWidth( fDefWidth );
if( fDefHeight > 0.0 )
xVBAControl->setHeight( fDefHeight );
}
else
throw uno::RuntimeException();
}
catch (const uno::RuntimeException&)
{
throw;
}
catch (const uno::Exception& e)
{
throw lang::WrappedTargetException( "Can not create AXControl!",
uno::Reference< uno::XInterface >(),
uno::makeAny( e ) );
}
return aResult;
}
void SAL_CALL ScVbaControls::Remove( const uno::Any& StringKeyOrIndex )
throw (uno::RuntimeException)
{
OUString aControlName;
sal_Int32 nIndex = -1;
try
{
if ( !mxDialog.is() )
throw uno::RuntimeException();
uno::Reference< lang::XMultiServiceFactory > xModelFactory( mxDialog->getModel(), uno::UNO_QUERY_THROW );
uno::Reference< container::XNameContainer > xDialogContainer( xModelFactory, uno::UNO_QUERY_THROW );
if ( !( ( StringKeyOrIndex >>= aControlName ) && !aControlName.isEmpty() )
&& !( ( StringKeyOrIndex >>= nIndex ) && nIndex >= 0 && nIndex < m_xIndexAccess->getCount() ) )
throw uno::RuntimeException();
uno::Reference< awt::XControl > xControl;
if ( !aControlName.isEmpty() )
{
uno::Reference< awt::XControlContainer > xControlContainer( mxDialog, uno::UNO_QUERY_THROW );
xControl = xControlContainer->getControl( aControlName );
}
else
{
m_xIndexAccess->getByIndex( nIndex ) >>= xControl;
}
if ( !xControl.is() )
throw uno::RuntimeException();
if ( aControlName.isEmpty() )
aControlName = ControlArrayWrapper::getControlName( xControl );
xDialogContainer->removeByName( aControlName );
xControl->dispose();
}
catch (const uno::RuntimeException&)
{
// the exceptions are not rethrown, impossibility to find or remove the control is currently not reported
// since in most cases it means just that the controls is already not there, the VBA seems to do it in the same way
// throw;
}
catch (const uno::Exception&)
{
// throw lang::WrappedTargetException("Can not create AXControl!",
// uno::Reference< uno::XInterface >(),
// uno::makeAny( e ) );
}
}
uno::Type
ScVbaControls::getElementType() throw (uno::RuntimeException)
{
return ooo::vba::msforms::XControl::static_type(0);
}
VBAHELPER_IMPL_XHELPERINTERFACE( ScVbaControls, "ooo.vba.msforms.Controls" )
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */