2010-10-12 15:53:47 +02:00
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2009-09-18 15:35:47 +00:00
/*************************************************************************
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER .
*
2010-02-12 15:01:35 +01:00
* Copyright 2000 , 2010 Oracle and / or its affiliates .
2009-09-18 15:35:47 +00:00
*
* OpenOffice . org - a multi - platform office productivity suite
*
* This file is part of OpenOffice . org .
*
* OpenOffice . org is free software : you can redistribute it and / or modify
* it under the terms of the GNU Lesser General Public License version 3
* only , as published by the Free Software Foundation .
*
* OpenOffice . org is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU Lesser General Public License version 3 for more details
* ( a copy is included in the LICENSE file that accompanied this code ) .
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenOffice . org . If not , see
* < http : //www.openoffice.org/license.html>
* for a copy of the LGPLv3 License .
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
# include <com/sun/star/form/FormComponentType.hpp>
# include <com/sun/star/awt/XControlModel.hpp>
# include <com/sun/star/awt/XControl.hpp>
# include <com/sun/star/awt/XWindow2.hpp>
2010-10-06 10:16:27 +01:00
# include <com/sun/star/awt/XActionListener.hpp>
2009-09-18 15:35:47 +00:00
# include <com/sun/star/lang/XEventListener.hpp>
# include <com/sun/star/drawing/XShape.hpp>
# include <com/sun/star/drawing/XControlShape.hpp>
# include <com/sun/star/frame/XModel.hpp>
# include <com/sun/star/view/XControlAccess.hpp>
# include <com/sun/star/container/XChild.hpp>
# include <com/sun/star/form/binding/XBindableValue.hpp>
# include <com/sun/star/form/binding/XListEntrySink.hpp>
# include <com/sun/star/table/CellAddress.hpp>
# include <com/sun/star/table/CellRangeAddress.hpp>
2010-10-06 10:16:27 +01:00
# include <com/sun/star/script/XScriptListener.hpp>
# include <com/sun/star/document/XCodeNameQuery.hpp>
# include <com/sun/star/form/XChangeListener.hpp>
2009-09-18 15:35:47 +00:00
# include <ooo/vba/XControlProvider.hpp>
# ifdef VBA_OOBUILD_HACK
# include <svtools/bindablecontrolhelper.hxx>
# endif
2011-03-25 10:40:25 +01:00
# include "vbacontrol.hxx"
# include "vbacombobox.hxx"
2009-09-18 15:35:47 +00:00
# include "vbabutton.hxx"
# include "vbalabel.hxx"
# include "vbatextbox.hxx"
# include "vbaradiobutton.hxx"
# include "vbalistbox.hxx"
# include "vbatogglebutton.hxx"
# include "vbacheckbox.hxx"
# include "vbaframe.hxx"
# include "vbascrollbar.hxx"
# include "vbaprogressbar.hxx"
# include "vbamultipage.hxx"
# include "vbaspinbutton.hxx"
2010-06-15 20:02:53 +02:00
# include "vbasystemaxcontrol.hxx"
2009-09-18 15:35:47 +00:00
# include "vbaimage.hxx"
# include <vbahelper/helperdecl.hxx>
using namespace com : : sun : : star ;
using namespace ooo : : vba ;
uno : : Reference < css : : awt : : XWindowPeer >
ScVbaControl : : getWindowPeer ( ) throw ( uno : : RuntimeException )
{
uno : : Reference < drawing : : XControlShape > xControlShape ( m_xControl , uno : : UNO_QUERY ) ;
uno : : Reference < awt : : XControlModel > xControlModel ;
uno : : Reference < css : : awt : : XWindowPeer > xWinPeer ;
if ( ! xControlShape . is ( ) )
{
// would seem to be a Userform control
uno : : Reference < awt : : XControl > xControl ( m_xControl , uno : : UNO_QUERY_THROW ) ;
xWinPeer = xControl - > getPeer ( ) ;
return xWinPeer ;
}
// form control
xControlModel . set ( xControlShape - > getControl ( ) , uno : : UNO_QUERY_THROW ) ;
uno : : Reference < view : : XControlAccess > xControlAccess ( m_xModel - > getCurrentController ( ) , uno : : UNO_QUERY_THROW ) ;
try
{
uno : : Reference < awt : : XControl > xControl ( xControlAccess - > getControl ( xControlModel ) , uno : : UNO_QUERY ) ;
xWinPeer = xControl - > getPeer ( ) ;
}
2011-06-16 00:52:20 +01:00
catch ( const uno : : Exception & )
2009-09-18 15:35:47 +00:00
{
2010-11-10 14:43:14 +01:00
throw uno : : RuntimeException ( rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " The Control does not exsit " ) ) ,
2009-09-18 15:35:47 +00:00
uno : : Reference < uno : : XInterface > ( ) ) ;
}
return xWinPeer ;
}
//ScVbaControlListener
class ScVbaControlListener : public cppu : : WeakImplHelper1 < lang : : XEventListener >
{
private :
ScVbaControl * pControl ;
public :
ScVbaControlListener ( ScVbaControl * pTmpControl ) ;
virtual ~ ScVbaControlListener ( ) ;
virtual void SAL_CALL disposing ( const lang : : EventObject & rEventObject ) throw ( uno : : RuntimeException ) ;
} ;
ScVbaControlListener : : ScVbaControlListener ( ScVbaControl * pTmpControl ) : pControl ( pTmpControl )
{
}
ScVbaControlListener : : ~ ScVbaControlListener ( )
{
}
void SAL_CALL
ScVbaControlListener : : disposing ( const lang : : EventObject & ) throw ( uno : : RuntimeException )
{
if ( pControl )
{
pControl - > removeResouce ( ) ;
pControl = NULL ;
}
}
//ScVbaControl
2010-10-06 10:16:27 +01:00
ScVbaControl : : ScVbaControl ( const uno : : Reference < XHelperInterface > & xParent , const uno : : Reference < uno : : XComponentContext > & xContext , const uno : : Reference < : : uno : : XInterface > & xControl , const css : : uno : : Reference < css : : frame : : XModel > & xModel , AbstractGeometryAttributes * pGeomHelper ) : ControlImpl_BASE ( xParent , xContext ) , bIsDialog ( false ) , m_xControl ( xControl ) , m_xModel ( xModel )
2009-09-18 15:35:47 +00:00
{
//add listener
m_xEventListener . set ( new ScVbaControlListener ( this ) ) ;
setGeometryHelper ( pGeomHelper ) ;
uno : : Reference < lang : : XComponent > xComponent ( m_xControl , uno : : UNO_QUERY_THROW ) ;
xComponent - > addEventListener ( m_xEventListener ) ;
//init m_xProps
uno : : Reference < drawing : : XControlShape > xControlShape ( m_xControl , uno : : UNO_QUERY ) ;
uno : : Reference < awt : : XControl > xUserFormControl ( m_xControl , uno : : UNO_QUERY ) ;
if ( xControlShape . is ( ) ) // form control
2010-10-06 10:16:27 +01:00
{
2009-09-18 15:35:47 +00:00
m_xProps . set ( xControlShape - > getControl ( ) , uno : : UNO_QUERY_THROW ) ;
2010-10-06 10:16:27 +01:00
rtl : : OUString sDefaultControl ;
m_xProps - > getPropertyValue ( rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " DefaultControl " ) ) ) > > = sDefaultControl ;
uno : : Reference < lang : : XMultiComponentFactory > xMFac ( mxContext - > getServiceManager ( ) , uno : : UNO_QUERY_THROW ) ;
m_xEmptyFormControl . set ( xMFac - > createInstanceWithContext ( sDefaultControl , mxContext ) , uno : : UNO_QUERY_THROW ) ;
}
2009-09-18 15:35:47 +00:00
else if ( xUserFormControl . is ( ) ) // userform control
2010-10-06 10:16:27 +01:00
{
2009-09-18 15:35:47 +00:00
m_xProps . set ( xUserFormControl - > getModel ( ) , uno : : UNO_QUERY_THROW ) ;
2010-10-06 10:16:27 +01:00
bIsDialog = true ;
}
2009-09-18 15:35:47 +00:00
}
ScVbaControl : : ~ ScVbaControl ( )
{
if ( m_xControl . is ( ) )
{
uno : : Reference < lang : : XComponent > xComponent ( m_xControl , uno : : UNO_QUERY_THROW ) ;
xComponent - > removeEventListener ( m_xEventListener ) ;
}
}
void
ScVbaControl : : setGeometryHelper ( AbstractGeometryAttributes * pHelper )
{
mpGeometryHelper . reset ( pHelper ) ;
}
void ScVbaControl : : removeResouce ( ) throw ( uno : : RuntimeException )
{
uno : : Reference < lang : : XComponent > xComponent ( m_xControl , uno : : UNO_QUERY_THROW ) ;
xComponent - > removeEventListener ( m_xEventListener ) ;
m_xControl = NULL ;
m_xProps = NULL ;
}
//In design model has different behavior
sal_Bool SAL_CALL ScVbaControl : : getEnabled ( ) throw ( uno : : RuntimeException )
{
uno : : Any aValue = m_xProps - > getPropertyValue
( rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " Enabled " ) ) ) ;
sal_Bool bRet = false ;
aValue > > = bRet ;
return bRet ;
}
void SAL_CALL ScVbaControl : : setEnabled ( sal_Bool bVisible ) throw ( uno : : RuntimeException )
{
uno : : Any aValue ( bVisible ) ;
m_xProps - > setPropertyValue
( rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " Enabled " ) ) , aValue ) ;
}
sal_Bool SAL_CALL ScVbaControl : : getVisible ( ) throw ( uno : : RuntimeException )
{
2009-09-29 14:47:18 +00:00
sal_Bool bVisible ( sal_True ) ;
m_xProps - > getPropertyValue
( rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " EnableVisible " ) ) ) > > = bVisible ;
return bVisible ;
2009-09-18 15:35:47 +00:00
}
void SAL_CALL ScVbaControl : : setVisible ( sal_Bool bVisible ) throw ( uno : : RuntimeException )
{
2009-09-29 14:47:18 +00:00
uno : : Any aValue ( bVisible ) ;
m_xProps - > setPropertyValue
( rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " EnableVisible " ) ) , aValue ) ;
2009-09-18 15:35:47 +00:00
}
double SAL_CALL ScVbaControl : : getHeight ( ) throw ( uno : : RuntimeException )
{
return mpGeometryHelper - > getHeight ( ) ;
}
void SAL_CALL ScVbaControl : : setHeight ( double _height ) throw ( uno : : RuntimeException )
{
mpGeometryHelper - > setHeight ( _height ) ;
}
double SAL_CALL ScVbaControl : : getWidth ( ) throw ( uno : : RuntimeException )
{
return mpGeometryHelper - > getWidth ( ) ;
}
void SAL_CALL ScVbaControl : : setWidth ( double _width ) throw ( uno : : RuntimeException )
{
mpGeometryHelper - > setWidth ( _width ) ;
}
double SAL_CALL
ScVbaControl : : getLeft ( ) throw ( uno : : RuntimeException )
{
return mpGeometryHelper - > getLeft ( ) ;
}
void SAL_CALL
ScVbaControl : : setLeft ( double _left ) throw ( uno : : RuntimeException )
{
mpGeometryHelper - > setLeft ( _left ) ;
}
double SAL_CALL
ScVbaControl : : getTop ( ) throw ( uno : : RuntimeException )
{
return mpGeometryHelper - > getTop ( ) ;
}
void SAL_CALL
ScVbaControl : : setTop ( double _top ) throw ( uno : : RuntimeException )
{
mpGeometryHelper - > setTop ( _top ) ;
}
uno : : Reference < uno : : XInterface > SAL_CALL
ScVbaControl : : getObject ( ) throw ( uno : : RuntimeException )
{
uno : : Reference < msforms : : XControl > xRet ( this ) ;
return xRet ;
}
void SAL_CALL ScVbaControl : : SetFocus ( ) throw ( uno : : RuntimeException )
{
uno : : Reference < awt : : XWindow > xWin ( m_xControl , uno : : UNO_QUERY_THROW ) ;
xWin - > setFocus ( ) ;
}
2010-06-15 20:02:53 +02:00
void SAL_CALL ScVbaControl : : Move ( double Left , double Top , const uno : : Any & Width , const uno : : Any & Height )
throw ( uno : : RuntimeException )
{
2010-06-16 14:12:43 +02:00
double nWidth = 0.0 ;
double nHeight = 0.0 ;
2010-06-15 20:02:53 +02:00
setLeft ( Left ) ;
setTop ( Top ) ;
if ( Width > > = nWidth )
setWidth ( nWidth ) ;
if ( Height > > = nHeight )
setHeight ( nHeight ) ;
}
2009-09-18 15:35:47 +00:00
rtl : : OUString SAL_CALL
ScVbaControl : : getControlSource ( ) throw ( uno : : RuntimeException )
{
// #FIXME I *hate* having these upstream differences
// but this is necessary until I manage to upstream other
// dependant parts
# ifdef VBA_OOBUILD_HACK
rtl : : OUString sControlSource ;
uno : : Reference < form : : binding : : XBindableValue > xBindable ( m_xProps , uno : : UNO_QUERY ) ;
if ( xBindable . is ( ) )
{
try
{
uno : : Reference < lang : : XMultiServiceFactory > xFac ( m_xModel , uno : : UNO_QUERY_THROW ) ;
uno : : Reference < beans : : XPropertySet > xConvertor ( xFac - > createInstance ( rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " com.sun.star.table.CellAddressConversion " ) ) ) , uno : : UNO_QUERY ) ;
uno : : Reference < beans : : XPropertySet > xProps ( xBindable - > getValueBinding ( ) , uno : : UNO_QUERY_THROW ) ;
table : : CellAddress aAddress ;
xProps - > getPropertyValue ( rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " BoundCell " ) ) ) > > = aAddress ;
xConvertor - > setPropertyValue ( rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " Address " ) ) , uno : : makeAny ( aAddress ) ) ;
xConvertor - > getPropertyValue ( rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " XL_A1_Representation " ) ) ) > > = sControlSource ;
}
2011-06-16 00:52:20 +01:00
catch ( const uno : : Exception & )
2009-09-18 15:35:47 +00:00
{
}
}
return sControlSource ;
# else
throw uno : : RuntimeException ( rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " getControlSource not supported " ) ) , uno : : Reference < uno : : XInterface > ( ) ) ; // not supported
# endif
}
void SAL_CALL
ScVbaControl : : setControlSource ( const rtl : : OUString & _controlsource ) throw ( uno : : RuntimeException )
{
# ifdef VBA_OOBUILD_HACK
rtl : : OUString sEmpty ;
svt : : BindableControlHelper : : ApplyListSourceAndBindableData ( m_xModel , m_xProps , _controlsource , sEmpty ) ;
# else
throw uno : : RuntimeException ( rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " setControlSource not supported " ) ) . concat ( _controlsource ) , uno : : Reference < uno : : XInterface > ( ) ) ; // not supported
# endif
}
rtl : : OUString SAL_CALL
ScVbaControl : : getRowSource ( ) throw ( uno : : RuntimeException )
{
# ifdef VBA_OOBUILD_HACK
rtl : : OUString sRowSource ;
uno : : Reference < form : : binding : : XListEntrySink > xListSink ( m_xProps , uno : : UNO_QUERY ) ;
if ( xListSink . is ( ) )
{
try
{
uno : : Reference < lang : : XMultiServiceFactory > xFac ( m_xModel , uno : : UNO_QUERY_THROW ) ;
uno : : Reference < beans : : XPropertySet > xConvertor ( xFac - > createInstance ( rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " com.sun.star.table.CellRangeAddressConversion " ) ) ) , uno : : UNO_QUERY ) ;
uno : : Reference < beans : : XPropertySet > xProps ( xListSink - > getListEntrySource ( ) , uno : : UNO_QUERY_THROW ) ;
table : : CellRangeAddress aAddress ;
xProps - > getPropertyValue ( rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " CellRange " ) ) ) > > = aAddress ;
xConvertor - > setPropertyValue ( rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " Address " ) ) , uno : : makeAny ( aAddress ) ) ;
xConvertor - > getPropertyValue ( rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " XL_A1_Representation " ) ) ) > > = sRowSource ;
}
2011-06-16 00:52:20 +01:00
catch ( const uno : : Exception & )
2009-09-18 15:35:47 +00:00
{
}
}
return sRowSource ;
# else
throw uno : : RuntimeException ( rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " getRowSource not supported " ) ) , uno : : Reference < uno : : XInterface > ( ) ) ; // not supported
# endif
}
void SAL_CALL
ScVbaControl : : setRowSource ( const rtl : : OUString & _rowsource ) throw ( uno : : RuntimeException )
{
# ifdef VBA_OOBUILD_HACK
rtl : : OUString sEmpty ;
svt : : BindableControlHelper : : ApplyListSourceAndBindableData ( m_xModel , m_xProps , sEmpty , _rowsource ) ;
# else
throw uno : : RuntimeException ( rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " setRowSource not supported " ) ) . concat ( _rowsource ) , uno : : Reference < uno : : XInterface > ( ) ) ; // not supported
# endif
}
rtl : : OUString SAL_CALL
ScVbaControl : : getName ( ) throw ( uno : : RuntimeException )
{
rtl : : OUString sName ;
m_xProps - > getPropertyValue
( rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " Name " ) ) ) > > = sName ;
return sName ;
}
void SAL_CALL
ScVbaControl : : setName ( const rtl : : OUString & _name ) throw ( uno : : RuntimeException )
{
m_xProps - > setPropertyValue
( rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " Name " ) ) , uno : : makeAny ( _name ) ) ;
}
rtl : : OUString SAL_CALL
ScVbaControl : : getControlTipText ( ) throw ( css : : uno : : RuntimeException )
{
rtl : : OUString sName ;
m_xProps - > getPropertyValue
( rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " HelpText " ) ) ) > > = sName ;
return sName ;
}
void SAL_CALL
ScVbaControl : : setControlTipText ( const rtl : : OUString & rsToolTip ) throw ( css : : uno : : RuntimeException )
{
m_xProps - > setPropertyValue
( rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " HelpText " ) ) , uno : : makeAny ( rsToolTip ) ) ;
}
2010-06-15 20:02:53 +02:00
: : rtl : : OUString SAL_CALL ScVbaControl : : getTag ( )
throw ( css : : uno : : RuntimeException )
{
return m_aControlTag ;
}
void SAL_CALL ScVbaControl : : setTag ( const : : rtl : : OUString & aTag )
throw ( css : : uno : : RuntimeException )
{
m_aControlTag = aTag ;
}
2011-05-23 17:27:25 +02:00
: : sal_Int32 SAL_CALL ScVbaControl : : getForeColor ( ) throw ( : : com : : sun : : star : : uno : : RuntimeException )
{
sal_Int32 nForeColor = - 1 ;
m_xProps - > getPropertyValue ( rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " TextColor " ) ) ) > > = nForeColor ;
return OORGBToXLRGB ( nForeColor ) ;
}
void SAL_CALL ScVbaControl : : setForeColor ( : : sal_Int32 _forecolor ) throw ( : : com : : sun : : star : : uno : : RuntimeException )
{
m_xProps - > setPropertyValue ( rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " TextColor " ) ) , uno : : makeAny ( XLRGBToOORGB ( _forecolor ) ) ) ;
}
2010-10-06 10:16:27 +01:00
void ScVbaControl : : fireEvent ( script : : ScriptEvent & evt )
{
uno : : Reference < lang : : XMultiComponentFactory > xServiceManager ( mxContext - > getServiceManager ( ) , uno : : UNO_QUERY_THROW ) ;
uno : : Reference < script : : XScriptListener > xScriptListener ( xServiceManager - > createInstanceWithContext ( rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " ooo.vba.EventListener " ) ) , mxContext ) , uno : : UNO_QUERY_THROW ) ;
uno : : Reference < beans : : XPropertySet > xProps ( xScriptListener , uno : : UNO_QUERY_THROW ) ;
xProps - > setPropertyValue ( : : rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " Model " ) ) , uno : : makeAny ( m_xModel ) ) ;
// handling for sheet control
uno : : Reference < msforms : : XControl > xThisControl ( this ) ;
try
{
evt . Arguments . realloc ( 1 ) ;
lang : : EventObject aEvt ;
uno : : Reference < drawing : : XControlShape > xControlShape ( m_xControl , uno : : UNO_QUERY ) ;
uno : : Reference < awt : : XControl > xControl ( m_xControl , uno : : UNO_QUERY ) ;
if ( xControlShape . is ( ) )
{
evt . Source = xControlShape ;
aEvt . Source = m_xEmptyFormControl ;
// Set up proper scriptcode
uno : : Reference < lang : : XMultiServiceFactory > xDocFac ( m_xModel , uno : : UNO_QUERY_THROW ) ;
2010-11-10 14:43:14 +01:00
uno : : Reference < document : : XCodeNameQuery > xNameQuery ( xDocFac - > createInstance ( rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " ooo.vba.VBACodeNameProvider " ) ) ) , uno : : UNO_QUERY_THROW ) ;
2010-10-06 10:16:27 +01:00
uno : : Reference < uno : : XInterface > xIf ( xControlShape - > getControl ( ) , uno : : UNO_QUERY_THROW ) ;
2011-08-13 01:20:31 -04:00
evt . ScriptCode = xNameQuery - > getCodeNameForObject ( xIf ) ;
2010-10-06 10:16:27 +01:00
evt . Arguments [ 0 ] = uno : : makeAny ( aEvt ) ;
xScriptListener - > firing ( evt ) ;
}
else
{
if ( xControl . is ( ) ) // normal control ( from dialog/userform )
{
// #FIXME We should probably store a reference to the
// parent dialog/userform here ( other wise the name of
// dialog could be changed and we won't be aware of it.
// ( OTOH this is probably an unlikely scenario )
evt . Source = xThisControl ;
aEvt . Source = xControl ;
evt . ScriptCode = m_sLibraryAndCodeName ;
evt . Arguments [ 0 ] = uno : : makeAny ( aEvt ) ;
xScriptListener - > firing ( evt ) ;
}
}
}
2011-06-16 00:52:20 +01:00
catch ( const uno : : Exception & )
2010-10-06 10:16:27 +01:00
{
}
}
void ScVbaControl : : fireChangeEvent ( )
{
script : : ScriptEvent evt ;
evt . ScriptType = rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " VBAInterop " ) ) ;
evt . ListenerType = form : : XChangeListener : : static_type ( 0 ) ;
evt . MethodName = rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " changed " ) ) ;
fireEvent ( evt ) ;
}
void ScVbaControl : : fireClickEvent ( )
{
script : : ScriptEvent evt ;
evt . ScriptType = rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " VBAInterop " ) ) ;
evt . ListenerType = awt : : XActionListener : : static_type ( 0 ) ;
evt . MethodName = rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " actionPerformed " ) ) ;
fireEvent ( evt ) ;
}
2010-06-15 20:02:53 +02:00
2011-03-25 10:40:25 +01:00
sal_Int32 SAL_CALL ScVbaControl : : getTabIndex ( ) throw ( uno : : RuntimeException )
2009-09-18 15:35:47 +00:00
{
2011-03-25 10:40:25 +01:00
return 1 ;
2009-09-18 15:35:47 +00:00
}
2011-03-25 10:40:25 +01:00
void SAL_CALL ScVbaControl : : setTabIndex ( sal_Int32 /*nTabIndex*/ ) throw ( uno : : RuntimeException )
2009-09-18 15:35:47 +00:00
{
}
2011-03-25 10:40:25 +01:00
//ScVbaControlFactory
/*static*/ uno : : Reference < msforms : : XControl > ScVbaControlFactory : : createShapeControl (
const uno : : Reference < uno : : XComponentContext > & xContext ,
const uno : : Reference < drawing : : XControlShape > & xControlShape ,
const uno : : Reference < frame : : XModel > & xModel ) throw ( uno : : RuntimeException )
2009-09-18 15:35:47 +00:00
{
uno : : Reference < beans : : XPropertySet > xProps ( xControlShape - > getControl ( ) , uno : : UNO_QUERY_THROW ) ;
sal_Int32 nClassId = - 1 ;
const static rtl : : OUString sClassId ( RTL_CONSTASCII_USTRINGPARAM ( " ClassId " ) ) ;
xProps - > getPropertyValue ( sClassId ) > > = nClassId ;
uno : : Reference < XHelperInterface > xVbaParent ; // #FIXME - should be worksheet I guess
2011-05-23 17:27:25 +02:00
uno : : Reference < drawing : : XShape > xShape ( xControlShape , uno : : UNO_QUERY_THROW ) ;
: : std : : auto_ptr < ConcreteXShapeGeometryAttributes > xGeoHelper ( new ConcreteXShapeGeometryAttributes ( xContext , xShape ) ) ;
2009-09-18 15:35:47 +00:00
switch ( nClassId )
{
case form : : FormComponentType : : COMBOBOX :
2011-03-25 10:40:25 +01:00
return new ScVbaComboBox ( xVbaParent , xContext , xControlShape , xModel , xGeoHelper . release ( ) ) ;
2009-09-18 15:35:47 +00:00
case form : : FormComponentType : : COMMANDBUTTON :
2011-03-25 10:40:25 +01:00
return new ScVbaButton ( xVbaParent , xContext , xControlShape , xModel , xGeoHelper . release ( ) ) ;
2009-09-18 15:35:47 +00:00
case form : : FormComponentType : : FIXEDTEXT :
2011-03-25 10:40:25 +01:00
return new ScVbaLabel ( xVbaParent , xContext , xControlShape , xModel , xGeoHelper . release ( ) ) ;
2009-09-18 15:35:47 +00:00
case form : : FormComponentType : : TEXTFIELD :
2011-03-25 10:40:25 +01:00
return new ScVbaTextBox ( xVbaParent , xContext , xControlShape , xModel , xGeoHelper . release ( ) ) ;
2010-10-06 10:16:27 +01:00
case form : : FormComponentType : : CHECKBOX :
2011-05-23 17:27:25 +02:00
return new ScVbaCheckbox ( xVbaParent , xContext , xControlShape , xModel , xGeoHelper . release ( ) ) ;
2009-09-18 15:35:47 +00:00
case form : : FormComponentType : : RADIOBUTTON :
2011-03-25 10:40:25 +01:00
return new ScVbaRadioButton ( xVbaParent , xContext , xControlShape , xModel , xGeoHelper . release ( ) ) ;
2009-09-18 15:35:47 +00:00
case form : : FormComponentType : : LISTBOX :
2011-03-25 10:40:25 +01:00
return new ScVbaListBox ( xVbaParent , xContext , xControlShape , xModel , xGeoHelper . release ( ) ) ;
2009-09-18 15:35:47 +00:00
case form : : FormComponentType : : SPINBUTTON :
2011-03-25 10:40:25 +01:00
return new ScVbaSpinButton ( xVbaParent , xContext , xControlShape , xModel , xGeoHelper . release ( ) ) ;
2009-09-18 15:35:47 +00:00
case form : : FormComponentType : : IMAGECONTROL :
2011-03-25 10:40:25 +01:00
return new ScVbaImage ( xVbaParent , xContext , xControlShape , xModel , xGeoHelper . release ( ) ) ;
2012-03-20 15:35:30 +00:00
case form : : FormComponentType : : SCROLLBAR :
return new ScVbaScrollBar ( xVbaParent , xContext , xControlShape , xModel , xGeoHelper . release ( ) ) ;
2009-09-18 15:35:47 +00:00
}
2011-06-11 00:12:33 +01:00
throw uno : : RuntimeException ( rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " Unsupported control. " ) ) , uno : : Reference < uno : : XInterface > ( ) ) ;
2009-09-18 15:35:47 +00:00
}
2011-03-25 10:40:25 +01:00
/*static*/ uno : : Reference < msforms : : XControl > ScVbaControlFactory : : createUserformControl (
const uno : : Reference < uno : : XComponentContext > & xContext ,
const uno : : Reference < awt : : XControl > & xControl ,
const uno : : Reference < awt : : XControl > & xDialog ,
const uno : : Reference < frame : : XModel > & xModel ,
double fOffsetX , double fOffsetY ) throw ( uno : : RuntimeException )
2009-09-18 15:35:47 +00:00
{
uno : : Reference < beans : : XPropertySet > xProps ( xControl - > getModel ( ) , uno : : UNO_QUERY_THROW ) ;
uno : : Reference < lang : : XServiceInfo > xServiceInfo ( xProps , uno : : UNO_QUERY_THROW ) ;
2011-03-25 10:40:25 +01:00
uno : : Reference < msforms : : XControl > xVBAControl ;
2009-09-18 15:35:47 +00:00
uno : : Reference < XHelperInterface > xVbaParent ; // #FIXME - should be worksheet I guess
2011-03-25 10:40:25 +01:00
: : std : : auto_ptr < UserFormGeometryHelper > xGeoHelper ( new UserFormGeometryHelper ( xContext , xControl , fOffsetX , fOffsetY ) ) ;
2009-09-18 15:35:47 +00:00
if ( xServiceInfo - > supportsService ( rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " com.sun.star.awt.UnoControlCheckBoxModel " ) ) ) )
2011-03-25 10:40:25 +01:00
xVBAControl . set ( new ScVbaCheckbox ( xVbaParent , xContext , xControl , xModel , xGeoHelper . release ( ) ) ) ;
2009-09-18 15:35:47 +00:00
else if ( xServiceInfo - > supportsService ( rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " com.sun.star.awt.UnoControlRadioButtonModel " ) ) ) )
2011-03-25 10:40:25 +01:00
xVBAControl . set ( new ScVbaRadioButton ( xVbaParent , xContext , xControl , xModel , xGeoHelper . release ( ) ) ) ;
2009-09-18 15:35:47 +00:00
else if ( xServiceInfo - > supportsService ( rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " com.sun.star.awt.UnoControlEditModel " ) ) ) )
2011-03-25 10:40:25 +01:00
xVBAControl . set ( new ScVbaTextBox ( xVbaParent , xContext , xControl , xModel , xGeoHelper . release ( ) , true ) ) ;
2009-09-18 15:35:47 +00:00
else if ( xServiceInfo - > supportsService ( rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " com.sun.star.awt.UnoControlButtonModel " ) ) ) )
{
sal_Bool bToggle = sal_False ;
xProps - > getPropertyValue ( rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " Toggle " ) ) ) > > = bToggle ;
if ( bToggle )
2011-03-25 10:40:25 +01:00
xVBAControl . set ( new ScVbaToggleButton ( xVbaParent , xContext , xControl , xModel , xGeoHelper . release ( ) ) ) ;
2009-09-18 15:35:47 +00:00
else
2011-03-25 10:40:25 +01:00
xVBAControl . set ( new ScVbaButton ( xVbaParent , xContext , xControl , xModel , xGeoHelper . release ( ) ) ) ;
2009-09-18 15:35:47 +00:00
}
else if ( xServiceInfo - > supportsService ( rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " com.sun.star.awt.UnoControlComboBoxModel " ) ) ) )
2011-03-25 10:40:25 +01:00
xVBAControl . set ( new ScVbaComboBox ( xVbaParent , xContext , xControl , xModel , xGeoHelper . release ( ) , true ) ) ;
2009-09-18 15:35:47 +00:00
else if ( xServiceInfo - > supportsService ( rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " com.sun.star.awt.UnoControlListBoxModel " ) ) ) )
2011-03-25 10:40:25 +01:00
xVBAControl . set ( new ScVbaListBox ( xVbaParent , xContext , xControl , xModel , xGeoHelper . release ( ) ) ) ;
2009-09-18 15:35:47 +00:00
else if ( xServiceInfo - > supportsService ( rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " com.sun.star.awt.UnoControlFixedTextModel " ) ) ) )
2011-03-25 10:40:25 +01:00
xVBAControl . set ( new ScVbaLabel ( xVbaParent , xContext , xControl , xModel , xGeoHelper . release ( ) ) ) ;
2009-09-18 15:35:47 +00:00
else if ( xServiceInfo - > supportsService ( rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " com.sun.star.awt.UnoControlImageControlModel " ) ) ) )
2011-03-25 10:40:25 +01:00
xVBAControl . set ( new ScVbaImage ( xVbaParent , xContext , xControl , xModel , xGeoHelper . release ( ) ) ) ;
2009-09-18 15:35:47 +00:00
else if ( xServiceInfo - > supportsService ( rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " com.sun.star.awt.UnoControlProgressBarModel " ) ) ) )
2011-03-25 10:40:25 +01:00
xVBAControl . set ( new ScVbaProgressBar ( xVbaParent , xContext , xControl , xModel , xGeoHelper . release ( ) ) ) ;
2009-09-18 15:35:47 +00:00
else if ( xServiceInfo - > supportsService ( rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " com.sun.star.awt.UnoControlGroupBoxModel " ) ) ) )
2011-03-25 10:40:25 +01:00
xVBAControl . set ( new ScVbaFrame ( xVbaParent , xContext , xControl , xModel , xGeoHelper . release ( ) , xDialog ) ) ;
2009-09-18 15:35:47 +00:00
else if ( xServiceInfo - > supportsService ( rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " com.sun.star.awt.UnoControlScrollBarModel " ) ) ) )
2011-03-25 10:40:25 +01:00
xVBAControl . set ( new ScVbaScrollBar ( xVbaParent , xContext , xControl , xModel , xGeoHelper . release ( ) ) ) ;
2009-09-18 15:35:47 +00:00
else if ( xServiceInfo - > supportsService ( rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " com.sun.star.awt.UnoMultiPageModel " ) ) ) )
2011-08-23 14:38:00 +01:00
xVBAControl . set ( new ScVbaMultiPage ( xVbaParent , xContext , xControl , xModel , xGeoHelper . release ( ) ) ) ;
2009-09-18 15:35:47 +00:00
else if ( xServiceInfo - > supportsService ( rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " com.sun.star.awt.UnoControlSpinButtonModel " ) ) ) )
2011-03-25 10:40:25 +01:00
xVBAControl . set ( new ScVbaSpinButton ( xVbaParent , xContext , xControl , xModel , xGeoHelper . release ( ) ) ) ;
2010-06-15 20:02:53 +02:00
else if ( xServiceInfo - > supportsService ( rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " com.sun.star.custom.awt.UnoControlSystemAXContainerModel " ) ) ) )
2011-03-25 10:40:25 +01:00
xVBAControl . set ( new VbaSystemAXControl ( xVbaParent , xContext , xControl , xModel , xGeoHelper . release ( ) ) ) ;
2010-11-02 16:22:07 +00:00
// #FIXME implement a page control
else if ( xServiceInfo - > supportsService ( rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " com.sun.star.awt.UnoPageModel " ) ) ) )
2011-05-23 17:27:25 +02:00
xVBAControl . set ( new ScVbaControl ( xVbaParent , xContext , xControl , xModel , xGeoHelper . release ( ) ) ) ;
2010-11-02 16:22:07 +00:00
else if ( xServiceInfo - > supportsService ( rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " com.sun.star.awt.UnoFrameModel " ) ) ) )
2011-05-23 17:27:25 +02:00
xVBAControl . set ( new ScVbaFrame ( xVbaParent , xContext , xControl , xModel , xGeoHelper . release ( ) , xDialog ) ) ;
2009-09-18 15:35:47 +00:00
else if ( xServiceInfo - > supportsService ( rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " com.sun.star.awt.UnoControlSpinButtonModel " ) ) ) )
2011-05-23 17:27:25 +02:00
xVBAControl . set ( new ScVbaSpinButton ( xVbaParent , xContext , xControl , xModel , xGeoHelper . release ( ) ) ) ;
2010-06-15 20:02:53 +02:00
else if ( xServiceInfo - > supportsService ( rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " com.sun.star.custom.awt.UnoControlSystemAXContainerModel " ) ) ) )
2011-05-23 17:27:25 +02:00
xVBAControl . set ( new VbaSystemAXControl ( xVbaParent , xContext , xControl , xModel , xGeoHelper . release ( ) ) ) ;
2011-03-25 10:40:25 +01:00
if ( xVBAControl . is ( ) )
return xVBAControl ;
2011-06-11 00:12:33 +01:00
throw uno : : RuntimeException ( rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " Unsupported control. " ) ) , uno : : Reference < uno : : XInterface > ( ) ) ;
2009-09-18 15:35:47 +00:00
}
2012-03-24 14:00:06 +00:00
rtl : : OUString
2009-09-18 15:35:47 +00:00
ScVbaControl : : getServiceImplName ( )
{
2012-03-24 14:00:06 +00:00
return rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " ScVbaControl " ) ) ;
2009-09-18 15:35:47 +00:00
}
uno : : Sequence < rtl : : OUString >
ScVbaControl : : getServiceNames ( )
{
static uno : : Sequence < rtl : : OUString > aServiceNames ;
if ( aServiceNames . getLength ( ) = = 0 )
{
aServiceNames . realloc ( 1 ) ;
aServiceNames [ 0 ] = rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " ooo.vba.excel.Control " ) ) ;
}
return aServiceNames ;
}
2012-03-20 15:35:30 +00:00
sal_Int32 nSysCols [ ] = { 0xC8D0D4 , 0x0 , 0x6A240A , 0x808080 , 0xE4E4E4 , 0xFFFFFF , 0x0 , 0x0 , 0x0 , 0xFFFFFF , 0xE4E4E4 , 0xE4E4E4 , 0x808080 , 0x6A240A , 0xFFFFFF , 0xE4E4E4 , 0x808080 , 0x808080 , 0x0 , 0xC8D0D4 , 0xFFFFFF , 0x404040 , 0xE4E4E4 , 0x0 , 0xE1FFFF } ;
sal_Int32 ScVbaControl : : getBackColor ( ) throw ( uno : : RuntimeException )
{
sal_Int32 nBackColor = 0 ;
m_xProps - > getPropertyValue ( rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " BackgroundColor " ) ) ) > > = nBackColor ;
return nBackColor ;
}
void ScVbaControl : : setBackColor ( sal_Int32 nBackColor ) throw ( uno : : RuntimeException )
{
if ( ( nBackColor > = ( sal_Int32 ) 0x80000000 ) & & ( nBackColor < = ( sal_Int32 ) 0x80000018 ) )
{
nBackColor = nSysCols [ nBackColor - 0x80000000 ] ;
}
m_xProps - > setPropertyValue ( rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " BackgroundColor " ) ) , uno : : makeAny ( XLRGBToOORGB ( nBackColor ) ) ) ;
}
sal_Bool ScVbaControl : : getAutoSize ( ) throw ( uno : : RuntimeException )
{
return sal_False ;
}
// currently no implementation for this
void ScVbaControl : : setAutoSize ( sal_Bool /*bAutoSize*/ ) throw ( uno : : RuntimeException )
{
}
sal_Bool ScVbaControl : : getLocked ( ) throw ( uno : : RuntimeException )
{
sal_Bool bRes ( sal_False ) ;
m_xProps - > getPropertyValue ( rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " ReadOnly " ) ) ) > > = bRes ;
return bRes ;
}
void ScVbaControl : : setLocked ( sal_Bool bLocked ) throw ( uno : : RuntimeException )
{
m_xProps - > setPropertyValue ( rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " ReadOnly " ) ) , uno : : makeAny ( bLocked ) ) ;
}
2009-09-18 15:35:47 +00:00
typedef cppu : : WeakImplHelper1 < XControlProvider > ControlProvider_BASE ;
class ControlProviderImpl : public ControlProvider_BASE
{
uno : : Reference < uno : : XComponentContext > m_xCtx ;
public :
ControlProviderImpl ( const uno : : Reference < uno : : XComponentContext > & xCtx ) : m_xCtx ( xCtx ) { }
virtual uno : : Reference < msforms : : XControl > SAL_CALL createControl ( const uno : : Reference < drawing : : XControlShape > & xControl , const uno : : Reference < frame : : XModel > & xDocOwner ) throw ( uno : : RuntimeException ) ;
} ;
uno : : Reference < msforms : : XControl > SAL_CALL
ControlProviderImpl : : createControl ( const uno : : Reference < drawing : : XControlShape > & xControlShape , const uno : : Reference < frame : : XModel > & xDocOwner ) throw ( uno : : RuntimeException )
{
uno : : Reference < msforms : : XControl > xControlToReturn ;
if ( xControlShape . is ( ) )
2011-03-25 10:40:25 +01:00
xControlToReturn = ScVbaControlFactory : : createShapeControl ( m_xCtx , xControlShape , xDocOwner ) ;
2009-09-18 15:35:47 +00:00
return xControlToReturn ;
}
namespace controlprovider
{
namespace sdecl = comphelper : : service_decl ;
sdecl : : class_ < ControlProviderImpl , sdecl : : with_args < false > > serviceImpl ;
extern sdecl : : ServiceDecl const serviceDecl (
serviceImpl ,
" ControlProviderImpl " ,
" ooo.vba.ControlProvider " ) ;
}
2010-10-12 15:53:47 +02:00
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */