diff options
Diffstat (limited to 'vbahelper/source/msforms')
44 files changed, 5392 insertions, 0 deletions
diff --git a/vbahelper/source/msforms/service.cxx b/vbahelper/source/msforms/service.cxx new file mode 100644 index 000000000..ed348af03 --- /dev/null +++ b/vbahelper/source/msforms/service.cxx @@ -0,0 +1,45 @@ +/* -*- 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 <comphelper/servicedecl.hxx> +#include <sal/log.hxx> + +#include "service.hxx" + +// component exports + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; + +namespace sdecl = comphelper::service_decl; + +extern "C" +{ + SAL_DLLPUBLIC_EXPORT void * msforms_component_getFactory( + const char * pImplName, void *, void *) + { + SAL_INFO("vbahelper", "In component_getFactory for " << pImplName ); + void* pRet = sdecl::component_getFactoryHelper( + pImplName, {&controlprovider::serviceDecl, &userform::serviceDecl} ); + SAL_INFO("vbahelper", "Ret is 0x" << std::hex << pRet); + return pRet; + } +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vbahelper/source/msforms/service.hxx b/vbahelper/source/msforms/service.hxx new file mode 100644 index 000000000..a94d54e3c --- /dev/null +++ b/vbahelper/source/msforms/service.hxx @@ -0,0 +1,27 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */ +/* + * 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/. + */ + +#ifndef INCLUDED_VBAHELPER_SOURCE_MSFORMS_SERVICE_HXX +#define INCLUDED_VBAHELPER_SOURCE_MSFORMS_SERVICE_HXX + +#include <sal/config.h> + +namespace comphelper::service_decl { class ServiceDecl; } + +namespace controlprovider { +extern comphelper::service_decl::ServiceDecl const serviceDecl; +} + +namespace userform { +extern comphelper::service_decl::ServiceDecl const serviceDecl; +} + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ diff --git a/vbahelper/source/msforms/vbabutton.cxx b/vbahelper/source/msforms/vbabutton.cxx new file mode 100644 index 000000000..b1d07ba99 --- /dev/null +++ b/vbahelper/source/msforms/vbabutton.cxx @@ -0,0 +1,128 @@ +/* -*- 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 "vbabutton.hxx" +#include "vbanewfont.hxx" + +using namespace com::sun::star; +using namespace ooo::vba; + +VbaButton::VbaButton( const uno::Reference< XHelperInterface >& xParent, const uno::Reference< uno::XComponentContext >& xContext, const uno::Reference< uno::XInterface >& xControl, const uno::Reference< frame::XModel >& xModel, std::unique_ptr<AbstractGeometryAttributes> pGeomHelper ) + : ButtonImpl_BASE( xParent, xContext, xControl, xModel, std::move(pGeomHelper) ) +{ +} + +// Attributes +OUString SAL_CALL +VbaButton::getCaption() +{ + OUString Label; + m_xProps->getPropertyValue( "Label" ) >>= Label; + return Label; +} + +void SAL_CALL +VbaButton::setCaption( const OUString& _caption ) +{ + m_xProps->setPropertyValue( "Label", uno::makeAny( _caption ) ); +} + +sal_Bool SAL_CALL VbaButton::getAutoSize() +{ + return ScVbaControl::getAutoSize(); +} + +void SAL_CALL VbaButton::setAutoSize( sal_Bool bAutoSize ) +{ + ScVbaControl::setAutoSize( bAutoSize ); +} + +sal_Bool SAL_CALL VbaButton::getLocked() +{ + return ScVbaControl::getLocked(); +} + +void SAL_CALL VbaButton::setLocked( sal_Bool bLocked ) +{ + ScVbaControl::setLocked( bLocked ); +} + +sal_Bool SAL_CALL VbaButton::getCancel() +{ + return false; +} + +void SAL_CALL VbaButton::setCancel( sal_Bool /*bCancel*/ ) +{ + // #STUB +} + +sal_Bool SAL_CALL VbaButton::getDefault() +{ + // #STUB + return false; +} + +void SAL_CALL VbaButton::setDefault( sal_Bool /*bDefault*/ ) +{ + // #STUB +} + +sal_Int32 SAL_CALL VbaButton::getBackColor() +{ + return ScVbaControl::getBackColor(); +} + +void SAL_CALL VbaButton::setBackColor( sal_Int32 nBackColor ) +{ + ScVbaControl::setBackColor( nBackColor ); +} + +sal_Int32 SAL_CALL VbaButton::getForeColor() +{ + return ScVbaControl::getForeColor(); +} + +void SAL_CALL VbaButton::setForeColor( sal_Int32 /*nForeColor*/ ) +{ + // #STUB +} + +uno::Reference< msforms::XNewFont > SAL_CALL VbaButton::getFont() +{ + return new VbaNewFont( m_xProps ); +} + +OUString +VbaButton::getServiceImplName() +{ + return "VbaButton"; +} + +uno::Sequence< OUString > +VbaButton::getServiceNames() +{ + static uno::Sequence< OUString > const aServiceNames + { + "ooo.vba.msforms.Button" + }; + return aServiceNames; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vbahelper/source/msforms/vbabutton.hxx b/vbahelper/source/msforms/vbabutton.hxx new file mode 100644 index 000000000..ad2aed40d --- /dev/null +++ b/vbahelper/source/msforms/vbabutton.hxx @@ -0,0 +1,55 @@ +/* -*- 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 . + */ +#ifndef INCLUDED_VBAHELPER_SOURCE_MSFORMS_VBABUTTON_HXX +#define INCLUDED_VBAHELPER_SOURCE_MSFORMS_VBABUTTON_HXX +#include <cppuhelper/implbase.hxx> +#include <ooo/vba/msforms/XCommandButton.hpp> + +#include "vbacontrol.hxx" +#include <vbahelper/vbahelper.hxx> + +typedef cppu::ImplInheritanceHelper< ScVbaControl, ov::msforms::XCommandButton > ButtonImpl_BASE; + +class VbaButton : public ButtonImpl_BASE +{ +public: + VbaButton( const css::uno::Reference< ov::XHelperInterface >& xParent, const css::uno::Reference< css::uno::XComponentContext >& xContext, const css::uno::Reference< css::uno::XInterface >& xControl, const css::uno::Reference< css::frame::XModel >& xModel, std::unique_ptr<ov::AbstractGeometryAttributes> pGeomHelper ); + // Attributes + virtual OUString SAL_CALL getCaption() override; + virtual void SAL_CALL setCaption( const OUString& _caption ) override; + virtual sal_Bool SAL_CALL getAutoSize() override; + virtual void SAL_CALL setAutoSize( sal_Bool bAutoSize ) override; + virtual sal_Bool SAL_CALL getCancel() override; + virtual void SAL_CALL setCancel( sal_Bool bCancel ) override; + virtual sal_Bool SAL_CALL getDefault() override; + virtual void SAL_CALL setDefault( sal_Bool bDefault ) override; + virtual sal_Int32 SAL_CALL getBackColor() override; + virtual void SAL_CALL setBackColor( sal_Int32 nBackColor ) override; + virtual sal_Int32 SAL_CALL getForeColor() override; + virtual void SAL_CALL setForeColor( sal_Int32 nForeColor ) override; + virtual sal_Bool SAL_CALL getLocked() override; + virtual void SAL_CALL setLocked( sal_Bool bAutoSize ) override; + virtual css::uno::Reference< ov::msforms::XNewFont > SAL_CALL getFont() override; + //XHelperInterface + virtual OUString getServiceImplName() override; + virtual css::uno::Sequence<OUString> getServiceNames() override; +}; +#endif // INCLUDED_VBAHELPER_SOURCE_MSFORMS_VBABUTTON_HXX + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vbahelper/source/msforms/vbacheckbox.cxx b/vbahelper/source/msforms/vbacheckbox.cxx new file mode 100644 index 000000000..61e2216c2 --- /dev/null +++ b/vbahelper/source/msforms/vbacheckbox.cxx @@ -0,0 +1,130 @@ +/* -*- 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 "vbacheckbox.hxx" +#include "vbanewfont.hxx" + +using namespace com::sun::star; +using namespace ooo::vba; + +ScVbaCheckbox::ScVbaCheckbox( const uno::Reference< ov::XHelperInterface >& xParent, const uno::Reference< uno::XComponentContext >& xContext, const uno::Reference< uno::XInterface >& xControl, const uno::Reference< frame::XModel >& xModel, std::unique_ptr<ov::AbstractGeometryAttributes> pGeomHelper ) + : CheckBoxImpl_BASE( xParent, xContext, xControl, xModel, std::move(pGeomHelper) ) +{ +} + +// Attributes +OUString SAL_CALL +ScVbaCheckbox::getCaption() +{ + OUString Label; + m_xProps->getPropertyValue( "Label" ) >>= Label; + return Label; +} + +void SAL_CALL +ScVbaCheckbox::setCaption( const OUString& _caption ) +{ + m_xProps->setPropertyValue( "Label", uno::makeAny( _caption ) ); +} + +uno::Any SAL_CALL +ScVbaCheckbox::getValue() +{ + sal_Int16 nValue = -1; + m_xProps->getPropertyValue( "State" ) >>= nValue; + if( nValue != 0 ) + nValue = -1; +// return uno::makeAny( nValue ); +// I must be missing something MSO says value should be -1 if selected, 0 if not +// selected + return uno::makeAny( nValue == -1 ); +} + +void SAL_CALL +ScVbaCheckbox::setValue( const uno::Any& _value ) +{ + sal_Int16 nValue = 0; + sal_Int16 nOldValue = 0; + m_xProps->getPropertyValue( "State" ) >>= nOldValue; + if( !( _value >>= nValue ) ) + { + bool bValue = false; + _value >>= bValue; + if ( bValue ) + nValue = -1; + } + + if( nValue == -1) + nValue = 1; + m_xProps->setPropertyValue( "State", uno::makeAny( nValue ) ); + if ( nValue != nOldValue ) + fireClickEvent(); +} + +uno::Reference< msforms::XNewFont > SAL_CALL ScVbaCheckbox::getFont() +{ + return new VbaNewFont( m_xProps ); +} + +OUString +ScVbaCheckbox::getServiceImplName() +{ + return "ScVbaCheckbox"; +} + +uno::Sequence< OUString > +ScVbaCheckbox::getServiceNames() +{ + static uno::Sequence< OUString > const aServiceNames + { + "ooo.vba.msforms.CheckBox" + }; + return aServiceNames; +} + +sal_Int32 SAL_CALL ScVbaCheckbox::getBackColor() +{ + return ScVbaControl::getBackColor(); +} + +void SAL_CALL ScVbaCheckbox::setBackColor( sal_Int32 nBackColor ) +{ + ScVbaControl::setBackColor( nBackColor ); +} + +sal_Bool SAL_CALL ScVbaCheckbox::getAutoSize() +{ + return ScVbaControl::getAutoSize(); +} + +void SAL_CALL ScVbaCheckbox::setAutoSize( sal_Bool bAutoSize ) +{ + ScVbaControl::setAutoSize( bAutoSize ); +} + +sal_Bool SAL_CALL ScVbaCheckbox::getLocked() +{ + return ScVbaControl::getLocked(); +} + +void SAL_CALL ScVbaCheckbox::setLocked( sal_Bool bLocked ) +{ + ScVbaControl::setLocked( bLocked ); +} +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vbahelper/source/msforms/vbacheckbox.hxx b/vbahelper/source/msforms/vbacheckbox.hxx new file mode 100644 index 000000000..91de78eb5 --- /dev/null +++ b/vbahelper/source/msforms/vbacheckbox.hxx @@ -0,0 +1,55 @@ +/* -*- 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 . + */ +#ifndef INCLUDED_VBAHELPER_SOURCE_MSFORMS_VBACHECKBOX_HXX +#define INCLUDED_VBAHELPER_SOURCE_MSFORMS_VBACHECKBOX_HXX +#include <cppuhelper/implbase.hxx> +#include <ooo/vba/msforms/XCheckBox.hpp> +#include <com/sun/star/script/XDefaultProperty.hpp> + +#include "vbacontrol.hxx" +#include <vbahelper/vbahelper.hxx> + +typedef cppu::ImplInheritanceHelper< ScVbaControl, ov::msforms::XCheckBox, css::script::XDefaultProperty > CheckBoxImpl_BASE; + +class ScVbaCheckbox : public CheckBoxImpl_BASE +{ +public: + ScVbaCheckbox( const css::uno::Reference< ov::XHelperInterface >& xParent, const css::uno::Reference< css::uno::XComponentContext >& xContext, const css::uno::Reference< css::uno::XInterface >& xControl, const css::uno::Reference< css::frame::XModel >& xModel, std::unique_ptr<ov::AbstractGeometryAttributes> pGeomHelper ); + // Attributes + virtual OUString SAL_CALL getCaption() override; + virtual void SAL_CALL setCaption( const OUString& _caption ) override; + virtual css::uno::Any SAL_CALL getValue() override; + virtual void SAL_CALL setValue( const css::uno::Any& _value ) override; + virtual css::uno::Reference< ov::msforms::XNewFont > SAL_CALL getFont() override; + virtual sal_Int32 SAL_CALL getBackColor() override; + virtual void SAL_CALL setBackColor( sal_Int32 nBackColor ) override; + virtual sal_Bool SAL_CALL getAutoSize() override; + virtual void SAL_CALL setAutoSize( sal_Bool bAutoSize ) override; + virtual sal_Bool SAL_CALL getLocked() override; + virtual void SAL_CALL setLocked( sal_Bool bAutoSize ) override; + // XDefaultProperty + OUString SAL_CALL getDefaultPropertyName( ) override { return "Value"; } + //XHelperInterface + virtual OUString getServiceImplName() override; + virtual css::uno::Sequence<OUString> getServiceNames() override; +}; + +#endif // INCLUDED_VBAHELPER_SOURCE_MSFORMS_VBACHECKBOX_HXX + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vbahelper/source/msforms/vbacombobox.cxx b/vbahelper/source/msforms/vbacombobox.cxx new file mode 100644 index 000000000..07c937ccb --- /dev/null +++ b/vbahelper/source/msforms/vbacombobox.cxx @@ -0,0 +1,306 @@ +/* -*- 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 "vbacombobox.hxx" +#include <comphelper/sequence.hxx> +#include "vbanewfont.hxx" +#include <ooo/vba/msforms/fmStyle.hpp> +#include <ooo/vba/msforms/fmDropButtonStyle.hpp> +#include <ooo/vba/msforms/fmDragBehavior.hpp> +#include <ooo/vba/msforms/fmEnterFieldBehavior.hpp> +#include <ooo/vba/msforms/fmListStyle.hpp> +#include <ooo/vba/msforms/fmTextAlign.hpp> +#include <sal/log.hxx> + +using namespace com::sun::star; +using namespace ooo::vba; + + +//SelectedItems list of integer indexes +//StringItemList list of items + +ScVbaComboBox::ScVbaComboBox( const uno::Reference< XHelperInterface >& xParent, const uno::Reference< uno::XComponentContext >& xContext, const uno::Reference< uno::XInterface >& xControl, const uno::Reference< frame::XModel >& xModel, std::unique_ptr<ov::AbstractGeometryAttributes> pGeomHelper ) + : ComboBoxImpl_BASE( xParent, xContext, xControl, xModel, std::move(pGeomHelper) ) +{ + mpListHelper.reset( new ListControlHelper( m_xProps ) ); + try + { + // grab the default value property name + m_xProps->getPropertyValue( "DataFieldProperty" ) >>= sSourceName; + } + catch( uno::Exception& ) + { + } + if( sSourceName.isEmpty() ) + sSourceName = "Text"; +} + +// Attributes + + +// Value, [read] e.g. getValue returns the value of ooo Text property e.g. the value in +// the drop down +uno::Any SAL_CALL +ScVbaComboBox::getValue() +{ + return m_xProps->getPropertyValue( sSourceName ); +} + +void SAL_CALL +ScVbaComboBox::setListIndex( const uno::Any& _value ) +{ + sal_Int16 nIndex = 0; + if( _value >>= nIndex ) + { + sal_Int32 nOldIndex = -1; + getListIndex() >>= nOldIndex; + uno::Sequence< OUString > sItems; + m_xProps->getPropertyValue( "StringItemList" ) >>= sItems; + if( ( nIndex >= 0 ) && ( sItems.getLength() > nIndex ) ) + { + OUString sText = sItems[ nIndex ]; + m_xProps->setPropertyValue( "Text", uno::makeAny( sText ) ); + + // fire the _Change event + if( nOldIndex != nIndex ) + fireClickEvent(); + } + } +} + +uno::Any SAL_CALL +ScVbaComboBox::getListIndex() +{ + uno::Sequence< OUString > sItems; + m_xProps->getPropertyValue( "StringItemList" ) >>= sItems; + // should really return the item that has focus regardless of + // it been selected + if ( sItems.hasElements() ) + { + OUString sText = getText(); + if (!sText.isEmpty()) + { + sal_Int32 index = comphelper::findValue(sItems, sText); + if (index != -1) + { + SAL_INFO("vbahelper", "getListIndex returning " << index ); + return uno::makeAny( index ); + } + } + } + SAL_INFO("vbahelper", "getListIndex returning -1" ); + return uno::makeAny( sal_Int32( -1 ) ); +} + +// Value, [write]e.g. setValue sets the value in the drop down, and if the value is one +// of the values in the list then the selection is also set +void SAL_CALL +ScVbaComboBox::setValue( const uno::Any& _value ) +{ + // booleans are converted to uppercase strings + OUString oldValue = extractStringFromAny( getValue(), OUString(), true ); + m_xProps->setPropertyValue( sSourceName, uno::Any( extractStringFromAny( _value, OUString(), true ) ) ); + OUString newValue = extractStringFromAny( getValue(), OUString(), true ); + if ( oldValue != newValue ) + { + sal_Int32 index = 0; + uno::Any aIndex = getListIndex(); + aIndex >>= index; + if ( index < 0 ) + fireChangeEvent(); + else + fireClickEvent(); + } +} + +// see Value + +OUString SAL_CALL +ScVbaComboBox::getText() +{ + OUString result; + getValue() >>= result; + return result; +} + +void SAL_CALL +ScVbaComboBox::setText( const OUString& _text ) +{ + setValue( uno::makeAny( _text ) ); // seems the same +} + +// Methods +void SAL_CALL +ScVbaComboBox::AddItem( const uno::Any& pvargItem, const uno::Any& pvargIndex ) +{ + mpListHelper->AddItem( pvargItem, pvargIndex ); +} + +void SAL_CALL +ScVbaComboBox::removeItem( const uno::Any& index ) +{ + mpListHelper->removeItem( index ); +} + +void SAL_CALL +ScVbaComboBox::Clear( ) +{ + mpListHelper->Clear(); +} + +void SAL_CALL +ScVbaComboBox::setRowSource( const OUString& _rowsource ) +{ + ScVbaControl::setRowSource( _rowsource ); + mpListHelper->setRowSource( _rowsource ); +} + +sal_Int32 SAL_CALL +ScVbaComboBox::getListCount() +{ + return mpListHelper->getListCount(); +} + +uno::Any SAL_CALL +ScVbaComboBox::List( const ::uno::Any& pvargIndex, const uno::Any& pvarColumn ) +{ + return mpListHelper->List( pvargIndex, pvarColumn ); +} + +sal_Int32 SAL_CALL ScVbaComboBox::getStyle() +{ + return msforms::fmStyle::fmStyleDropDownCombo; +} + +void SAL_CALL ScVbaComboBox::setStyle( sal_Int32 /*nStyle*/ ) +{ +} + +sal_Int32 SAL_CALL ScVbaComboBox::getDropButtonStyle() +{ + return msforms::fmDropButtonStyle::fmDropButtonStyleArrow; +} + +void SAL_CALL ScVbaComboBox::setDropButtonStyle( sal_Int32 /*nDropButtonStyle*/ ) +{ +} + +sal_Int32 SAL_CALL ScVbaComboBox::getDragBehavior() +{ + return msforms::fmDragBehavior::fmDragBehaviorDisabled; +} + +void SAL_CALL ScVbaComboBox::setDragBehavior( sal_Int32 /*nDragBehavior*/ ) +{ +} + +sal_Int32 SAL_CALL ScVbaComboBox::getEnterFieldBehavior() +{ + return msforms::fmEnterFieldBehavior::fmEnterFieldBehaviorSelectAll; +} + +void SAL_CALL ScVbaComboBox::setEnterFieldBehavior( sal_Int32 /*nEnterFieldBehavior*/ ) +{ +} + +sal_Int32 SAL_CALL ScVbaComboBox::getListStyle() +{ + return msforms::fmListStyle::fmListStylePlain; +} + +void SAL_CALL ScVbaComboBox::setListStyle( sal_Int32 /*nListStyle*/ ) +{ +} + +sal_Int32 SAL_CALL ScVbaComboBox::getTextAlign() +{ + return msforms::fmTextAlign::fmTextAlignLeft; +} + +void SAL_CALL ScVbaComboBox::setTextAlign( sal_Int32 /*nTextAlign*/ ) +{ +} + +sal_Int32 SAL_CALL ScVbaComboBox::getTextLength() +{ + return getText().getLength(); +} + +uno::Reference< msforms::XNewFont > SAL_CALL ScVbaComboBox::getFont() +{ + return new VbaNewFont( m_xProps ); +} + +OUString +ScVbaComboBox::getServiceImplName() +{ + return "ScVbaComboBox"; +} + +sal_Int32 SAL_CALL ScVbaComboBox::getBackColor() +{ + return ScVbaControl::getBackColor(); +} + +void SAL_CALL ScVbaComboBox::setBackColor( sal_Int32 nBackColor ) +{ + ScVbaControl::setBackColor( nBackColor ); +} + +sal_Bool SAL_CALL ScVbaComboBox::getAutoSize() +{ + return ScVbaControl::getAutoSize(); +} + +void SAL_CALL ScVbaComboBox::setAutoSize( sal_Bool bAutoSize ) +{ + ScVbaControl::setAutoSize( bAutoSize ); +} + +sal_Bool SAL_CALL ScVbaComboBox::getLocked() +{ + return ScVbaControl::getLocked(); +} + +void SAL_CALL ScVbaComboBox::setLocked( sal_Bool bLocked ) +{ + ScVbaControl::setLocked( bLocked ); +} + +OUString SAL_CALL ScVbaComboBox::getLinkedCell() +{ + return ScVbaControl::getControlSource(); +} + +void SAL_CALL ScVbaComboBox::setLinkedCell( const OUString& _linkedcell ) +{ + ScVbaControl::setControlSource( _linkedcell ); +} + +uno::Sequence< OUString > +ScVbaComboBox::getServiceNames() +{ + static uno::Sequence< OUString > const aServiceNames + { + "ooo.vba.msforms.ComboBox" + }; + return aServiceNames; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vbahelper/source/msforms/vbacombobox.hxx b/vbahelper/source/msforms/vbacombobox.hxx new file mode 100644 index 000000000..feea8e52c --- /dev/null +++ b/vbahelper/source/msforms/vbacombobox.hxx @@ -0,0 +1,90 @@ +/* -*- 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 . + */ +#ifndef INCLUDED_VBAHELPER_SOURCE_MSFORMS_VBACOMBOBOX_HXX +#define INCLUDED_VBAHELPER_SOURCE_MSFORMS_VBACOMBOBOX_HXX +#include <memory> +#include <cppuhelper/implbase.hxx> +#include <com/sun/star/uno/XComponentContext.hpp> +#include <com/sun/star/beans/XPropertySet.hpp> +#include <com/sun/star/script/XDefaultProperty.hpp> +#include <ooo/vba/msforms/XComboBox.hpp> +#include <com/sun/star/beans/PropertyAttribute.hpp> + +#include "vbacontrol.hxx" +#include "vbalistcontrolhelper.hxx" +#include <vbahelper/vbahelper.hxx> + +typedef cppu::ImplInheritanceHelper<ScVbaControl, ov::msforms::XComboBox, css::script::XDefaultProperty > ComboBoxImpl_BASE; +class ScVbaComboBox : public ComboBoxImpl_BASE +{ + std::unique_ptr< ListControlHelper > mpListHelper; + OUString sSourceName; + +public: + ScVbaComboBox( const css::uno::Reference< ov::XHelperInterface >& xParent, const css::uno::Reference< css::uno::XComponentContext >& xContext, const css::uno::Reference< css::uno::XInterface >& xControl, const css::uno::Reference< css::frame::XModel >& xModel, std::unique_ptr<ov::AbstractGeometryAttributes> pGeomHelper ); + + // Attributes + virtual css::uno::Any SAL_CALL getListIndex() override; + virtual ::sal_Int32 SAL_CALL getListCount() override; + virtual void SAL_CALL setListIndex( const css::uno::Any& _value ) override; + virtual css::uno::Any SAL_CALL getValue() override; + virtual void SAL_CALL setValue( const css::uno::Any& _value ) override; + virtual OUString SAL_CALL getText() override; + virtual void SAL_CALL setText( const OUString& _text ) override; + virtual sal_Int32 SAL_CALL getStyle() override; + virtual void SAL_CALL setStyle( sal_Int32 nStyle ) override; + virtual sal_Int32 SAL_CALL getDropButtonStyle() override; + virtual void SAL_CALL setDropButtonStyle( sal_Int32 nDropButtonStyle ) override; + virtual sal_Int32 SAL_CALL getDragBehavior() override; + virtual void SAL_CALL setDragBehavior( sal_Int32 nDragBehavior ) override; + virtual sal_Int32 SAL_CALL getEnterFieldBehavior() override; + virtual void SAL_CALL setEnterFieldBehavior( sal_Int32 nEnterFieldBehavior ) override; + virtual sal_Int32 SAL_CALL getListStyle() override; + virtual void SAL_CALL setListStyle( sal_Int32 nListStyle ) override; + virtual sal_Int32 SAL_CALL getTextAlign() override; + virtual void SAL_CALL setTextAlign( sal_Int32 nTextAlign ) override; + virtual sal_Int32 SAL_CALL getTextLength() override; + virtual css::uno::Reference< ov::msforms::XNewFont > SAL_CALL getFont() override; + virtual sal_Int32 SAL_CALL getBackColor() override; + virtual void SAL_CALL setBackColor( sal_Int32 nBackColor ) override; + virtual sal_Bool SAL_CALL getAutoSize() override; + virtual void SAL_CALL setAutoSize( sal_Bool bAutoSize ) override; + virtual sal_Bool SAL_CALL getLocked() override; + virtual void SAL_CALL setLocked( sal_Bool bAutoSize ) override; + virtual OUString SAL_CALL getLinkedCell() override; + virtual void SAL_CALL setLinkedCell( const OUString& _linkedcell ) override; + + // Methods + virtual void SAL_CALL AddItem( const css::uno::Any& pvargItem, const css::uno::Any& pvargIndex ) override; + virtual void SAL_CALL removeItem( const css::uno::Any& index ) override; + virtual void SAL_CALL Clear( ) override; + virtual css::uno::Any SAL_CALL List( const css::uno::Any& pvargIndex, const css::uno::Any& pvarColumn ) override; + // XControl + virtual void SAL_CALL setRowSource( const OUString& _rowsource ) override; + + // XDefaultProperty + OUString SAL_CALL getDefaultPropertyName( ) override { return "Value"; } + //XHelperInterface + virtual OUString getServiceImplName() override; + virtual css::uno::Sequence<OUString> getServiceNames() override; +}; + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vbahelper/source/msforms/vbacontrol.cxx b/vbahelper/source/msforms/vbacontrol.cxx new file mode 100644 index 000000000..8efb94de7 --- /dev/null +++ b/vbahelper/source/msforms/vbacontrol.cxx @@ -0,0 +1,801 @@ +/* -*- 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 <memory> +#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/XActionListener.hpp> +#include <com/sun/star/lang/XEventListener.hpp> +#include <com/sun/star/lang/XMultiServiceFactory.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/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> +#include <com/sun/star/script/XScriptListener.hpp> +#include <com/sun/star/document/XCodeNameQuery.hpp> +#include <com/sun/star/form/XChangeListener.hpp> +#include <ooo/vba/XControlProvider.hpp> +#include <ooo/vba/msforms/fmMousePointer.hpp> +#include <svtools/bindablecontrolhelper.hxx> +#include "service.hxx" +#include "vbacontrol.hxx" +#include "vbacombobox.hxx" +#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" +#include "vbasystemaxcontrol.hxx" +#include "vbaimage.hxx" +#include <toolkit/helper/vclunohelper.hxx> +#include <vcl/window.hxx> +#include <comphelper/servicedecl.hxx> +#include <com/sun/star/drawing/XDrawPagesSupplier.hpp> +#include <com/sun/star/form/XFormsSupplier.hpp> +#include <svx/svdobj.hxx> +#include <cppuhelper/implbase.hxx> + +using namespace com::sun::star; +using namespace ooo::vba; + +uno::Reference< css::awt::XWindowPeer > +ScVbaControl::getWindowPeer() +{ + 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_SET_THROW ); + + uno::Reference< view::XControlAccess > xControlAccess( m_xModel->getCurrentController(), uno::UNO_QUERY_THROW ); + try + { + uno::Reference< awt::XControl > xControl = xControlAccess->getControl( xControlModel ); + xWinPeer = xControl->getPeer(); + } + catch(const uno::Exception&) + { + throw uno::RuntimeException( "The Control does not exist" ); + } + return xWinPeer; +} + +namespace { + +//ScVbaControlListener +class ScVbaControlListener: public cppu::WeakImplHelper< lang::XEventListener > +{ +private: + ScVbaControl *pControl; +public: + explicit ScVbaControlListener( ScVbaControl *pTmpControl ); + + virtual void SAL_CALL disposing( const lang::EventObject& rEventObject ) override; +}; + +} + +ScVbaControlListener::ScVbaControlListener( ScVbaControl *pTmpControl ): pControl( pTmpControl ) +{ +} + +void SAL_CALL +ScVbaControlListener::disposing( const lang::EventObject& ) +{ + if( pControl ) + { + pControl->removeResource(); + pControl = nullptr; + } +} + +//ScVbaControl + +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, std::unique_ptr<ov::AbstractGeometryAttributes> pGeomHelper ) + : ControlImpl_BASE( xParent, xContext ), m_xControl( xControl ), m_xModel( xModel ) +{ + //add listener + m_xEventListener.set( new ScVbaControlListener( this ) ); + setGeometryHelper( std::move(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 + { + m_xProps.set( xControlShape->getControl(), uno::UNO_QUERY_THROW ); + OUString sDefaultControl; + m_xProps->getPropertyValue( "DefaultControl" ) >>= sDefaultControl; + uno::Reference< lang::XMultiComponentFactory > xMFac( mxContext->getServiceManager(), uno::UNO_SET_THROW ); + m_xEmptyFormControl.set( xMFac->createInstanceWithContext( sDefaultControl, mxContext ), uno::UNO_QUERY_THROW ); + } + else if ( xUserFormControl.is() ) // userform control + { + m_xProps.set( xUserFormControl->getModel(), uno::UNO_QUERY_THROW ); + } +} + +ScVbaControl::~ScVbaControl() +{ + if( m_xControl.is() ) + { + uno::Reference< lang::XComponent > xComponent( m_xControl, uno::UNO_QUERY_THROW ); + xComponent->removeEventListener( m_xEventListener ); + } +} + +void +ScVbaControl::setGeometryHelper( std::unique_ptr<AbstractGeometryAttributes> pHelper ) +{ + mpGeometryHelper = std::move( pHelper ); +} + +void ScVbaControl::removeResource() +{ + uno::Reference< lang::XComponent > xComponent( m_xControl, uno::UNO_QUERY_THROW ); + xComponent->removeEventListener( m_xEventListener ); + m_xControl= nullptr; + m_xProps = nullptr; +} + +//In design model has different behavior +sal_Bool SAL_CALL ScVbaControl::getEnabled() +{ + uno::Any aValue = m_xProps->getPropertyValue ( "Enabled" ); + bool bRet = false; + aValue >>= bRet; + return bRet; +} + +void SAL_CALL ScVbaControl::setEnabled( sal_Bool bVisible ) +{ + uno::Any aValue( bVisible ); + m_xProps->setPropertyValue( "Enabled" , aValue); + +} + +sal_Bool SAL_CALL ScVbaControl::getVisible() +{ + bool bVisible( true ); + m_xProps->getPropertyValue ( "EnableVisible" ) >>= bVisible; + uno::Reference< drawing::XControlShape > xControlShape( m_xControl, uno::UNO_QUERY ); + if ( xControlShape.is() ) + { + bool bEnableVisible = bVisible; + uno::Reference< beans::XPropertySet > xProps( m_xControl, uno::UNO_QUERY_THROW ); + xProps->getPropertyValue ( "Visible" ) >>= bVisible; + bVisible = bVisible && bEnableVisible; + } + else + m_xProps->getPropertyValue ( "EnableVisible" ) >>= bVisible; + return bVisible; +} + +void SAL_CALL ScVbaControl::setVisible( sal_Bool bVisible ) +{ + uno::Any aValue( bVisible ); + m_xProps->setPropertyValue( "EnableVisible" , aValue); + uno::Reference< drawing::XControlShape > xControlShape( m_xControl, uno::UNO_QUERY ); + if ( xControlShape.is() ) + { + uno::Reference< beans::XPropertySet > xProps( m_xControl, uno::UNO_QUERY_THROW ); + xProps->setPropertyValue ( "Visible", aValue ); + } +} +double SAL_CALL ScVbaControl::getHeight() +{ + return mpGeometryHelper->getHeight(); +} +void SAL_CALL ScVbaControl::setHeight( double _height ) +{ + mpGeometryHelper->setHeight( _height ); +} + +double SAL_CALL ScVbaControl::getWidth() +{ + return mpGeometryHelper->getWidth(); +} +void SAL_CALL ScVbaControl::setWidth( double _width ) +{ + mpGeometryHelper->setWidth( _width ); +} + +double SAL_CALL +ScVbaControl::getLeft() +{ + return mpGeometryHelper->getLeft(); +} + +void SAL_CALL +ScVbaControl::setLeft( double _left ) +{ + mpGeometryHelper->setLeft( _left ); +} + +double SAL_CALL +ScVbaControl::getTop() +{ + return mpGeometryHelper->getTop(); +} + +void SAL_CALL +ScVbaControl::setTop( double _top ) +{ + mpGeometryHelper->setTop( _top ); +} + +uno::Reference< uno::XInterface > SAL_CALL +ScVbaControl::getObject() +{ + uno::Reference< msforms::XControl > xRet( this ); + return xRet; +} + +void SAL_CALL ScVbaControl::SetFocus() +{ + uno::Reference< awt::XWindow > xWin( m_xControl, uno::UNO_QUERY_THROW ); + xWin->setFocus(); +} + +void SAL_CALL ScVbaControl::Move( double Left, double Top, const uno::Any& Width, const uno::Any& Height ) +{ + double nWidth = 0.0; + double nHeight = 0.0; + + setLeft( Left ); + setTop( Top ); + + if ( Width >>= nWidth ) + setWidth( nWidth ); + + if ( Height >>= nHeight ) + setHeight( nHeight ); +} + +OUString SAL_CALL +ScVbaControl::getControlSource() +{ +// #FIXME I *hate* having these upstream differences +// but this is necessary until I manage to upstream other +// dependent parts + 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( "com.sun.star.table.CellAddressConversion" ), uno::UNO_QUERY ); + uno::Reference< beans::XPropertySet > xProps( xBindable->getValueBinding(), uno::UNO_QUERY_THROW ); + table::CellAddress aAddress; + xProps->getPropertyValue( "BoundCell" ) >>= aAddress; + xConvertor->setPropertyValue( "Address" , uno::makeAny( aAddress ) ); + xConvertor->getPropertyValue( "XLA1Representation" ) >>= sControlSource; + } + catch(const uno::Exception&) + { + } + } + return sControlSource; +} + +void SAL_CALL +ScVbaControl::setControlSource( const OUString& _controlsource ) +{ + // afaik this is only relevant for Excel documents ( and we need to set up a + // reference tab in case no Sheet is specified in "_controlsource" + // Can't use the active sheet either, code may of course access + uno::Reference< drawing::XDrawPagesSupplier > xSupplier( m_xModel, uno::UNO_QUERY_THROW ); + uno::Reference< container::XIndexAccess > xIndex( xSupplier->getDrawPages(), uno::UNO_QUERY_THROW ); + sal_Int32 nLen = xIndex->getCount(); + bool bMatched = false; + sal_Int16 nRefTab = 0; + for ( sal_Int32 index = 0; index < nLen; ++index ) + { + try + { + uno::Reference< form::XFormsSupplier > xFormSupplier( xIndex->getByIndex( index ), uno::UNO_QUERY_THROW ); + uno::Reference< container::XIndexAccess > xFormIndex( xFormSupplier->getForms(), uno::UNO_QUERY_THROW ); + // get the www-standard container + uno::Reference< container::XIndexAccess > xFormControls( xFormIndex->getByIndex(0), uno::UNO_QUERY_THROW ); + sal_Int32 nCntrls = xFormControls->getCount(); + for( sal_Int32 cIndex = 0; cIndex < nCntrls; ++cIndex ) + { + uno::Reference< uno::XInterface > xControl( xFormControls->getByIndex( cIndex ), uno::UNO_QUERY_THROW ); + bMatched = ( m_xProps == xControl ); + if ( bMatched ) + { + nRefTab = index; + break; + } + } + } + catch( uno::Exception& ) {} + if ( bMatched ) + break; + } + + svt::BindableControlHelper::ApplyListSourceAndBindableData( m_xModel, m_xProps, _controlsource, "", sal_uInt16( nRefTab ) ); +} + +OUString SAL_CALL +ScVbaControl::getRowSource() +{ + 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( "com.sun.star.table.CellRangeAddressConversion" ), uno::UNO_QUERY ); + + uno::Reference< beans::XPropertySet > xProps( xListSink->getListEntrySource(), uno::UNO_QUERY_THROW ); + table::CellRangeAddress aAddress; + xProps->getPropertyValue( "CellRange" ) >>= aAddress; + xConvertor->setPropertyValue( "Address" , uno::makeAny( aAddress ) ); + xConvertor->getPropertyValue( "XLA1Representation" ) >>= sRowSource; + } + catch(const uno::Exception&) + { + } + } + return sRowSource; +} + +void SAL_CALL +ScVbaControl::setRowSource( const OUString& _rowsource ) +{ + svt::BindableControlHelper::ApplyListSourceAndBindableData( m_xModel, m_xProps, "", _rowsource ); +} + +OUString SAL_CALL +ScVbaControl::getName() +{ + OUString sName; + m_xProps->getPropertyValue( "Name" ) >>= sName; + return sName; + +} + +void SAL_CALL +ScVbaControl::setName( const OUString& _name ) +{ + m_xProps->setPropertyValue( "Name" , uno::makeAny( _name ) ); + } + +OUString SAL_CALL +ScVbaControl::getControlTipText() +{ + OUString sName; + m_xProps->getPropertyValue( "HelpText" ) >>= sName; + return sName; +} + +void SAL_CALL +ScVbaControl::setControlTipText( const OUString& rsToolTip ) +{ + m_xProps->setPropertyValue( "HelpText" , uno::makeAny( rsToolTip ) ); +} + +OUString SAL_CALL ScVbaControl::getTag() +{ + return m_aControlTag; +} + +void SAL_CALL ScVbaControl::setTag( const OUString& aTag ) +{ + m_aControlTag = aTag; +} + +::sal_Int32 SAL_CALL ScVbaControl::getForeColor() +{ + Color nForeColor; + m_xProps->getPropertyValue( "TextColor" ) >>= nForeColor; + return OORGBToXLRGB( nForeColor ); +} + +namespace { + +struct PointerStyles +{ + long msoPointerStyle; + PointerStyle loPointStyle; +}; + +} + +// 1 -> 1 map of styles ( some dubious choices in there though ) +PointerStyles const styles[] = { + /// assuming pointer default is Arrow + { msforms::fmMousePointer::fmMousePointerDefault, PointerStyle::Arrow }, + { msforms::fmMousePointer::fmMousePointerArrow, PointerStyle::Arrow }, + { msforms::fmMousePointer::fmMousePointerCross, PointerStyle::Cross }, + { msforms::fmMousePointer::fmMousePointerIBeam, PointerStyle::Text }, + { msforms::fmMousePointer::fmMousePointerSizeNESW, PointerStyle::AutoScrollNSWE }, // #TODO not correct, need to check, need to find the right one + { msforms::fmMousePointer::fmMousePointerSizeNS, PointerStyle::AutoScrollNS }, + { msforms::fmMousePointer::fmMousePointerSizeNWSE, PointerStyle::AutoScrollNSWE }, // #TODO not correct, need to check, need to find the right one + { msforms::fmMousePointer::fmMousePointerSizeWE, PointerStyle::AutoScrollWE }, + { msforms::fmMousePointer::fmMousePointerUpArrow, PointerStyle::WindowNSize }, + { msforms::fmMousePointer::fmMousePointerHourGlass, PointerStyle::Wait }, + { msforms::fmMousePointer::fmMousePointerNoDrop, PointerStyle::NotAllowed }, + { msforms::fmMousePointer::fmMousePointerAppStarting, PointerStyle::Wait }, + { msforms::fmMousePointer::fmMousePointerHelp, PointerStyle::Help }, + { msforms::fmMousePointer::fmMousePointerSizeAll, PointerStyle::Cross }, + { msforms::fmMousePointer::fmMousePointerCustom, PointerStyle::Arrow }, // not supported I guess + +}; + +static long lcl_loPointerToMsoPointer( PointerStyle eType ) +{ + long nRet = msforms::fmMousePointer::fmMousePointerDefault; + for ( int i = 0; i < int(SAL_N_ELEMENTS( styles )); ++i ) + { + if ( styles[ i ].loPointStyle == eType ) + { + nRet = styles[ i ].msoPointerStyle; + break; + } + } + return nRet; +} + +static PointerStyle lcl_msoPointerToLOPointer( long msoPointerStyle ) +{ + PointerStyle aPointer( PointerStyle::Arrow ); + for ( int i = 0; i < int(SAL_N_ELEMENTS( styles )); ++i ) + { + if ( styles[ i ].msoPointerStyle == msoPointerStyle ) + { + aPointer = styles[ i ].loPointStyle; + break; + } + } + return aPointer; +} + +::sal_Int32 SAL_CALL +ScVbaControl::getMousePointer() +{ + PointerStyle eType = PointerStyle::Arrow; // default ? + VclPtr<vcl::Window> pWindow = VCLUnoHelper::GetWindow( getWindowPeer() ); + if ( pWindow ) + { + eType = pWindow->GetPointer(); + } + return lcl_loPointerToMsoPointer( eType ); +} + +void SAL_CALL +ScVbaControl::setMousePointer( ::sal_Int32 _mousepointer ) +{ + VclPtr<vcl::Window> pWindow = VCLUnoHelper::GetWindow( getWindowPeer() ); + if ( pWindow ) + { + PointerStyle aPointer = lcl_msoPointerToLOPointer( _mousepointer ); + pWindow->SetPointer( aPointer ); + } +} + +void SAL_CALL ScVbaControl::fireEvent( const script::ScriptEvent& rEvt ) +{ + script::ScriptEvent evt( rEvt ); + uno::Reference<lang::XMultiComponentFactory > xServiceManager( mxContext->getServiceManager(), uno::UNO_SET_THROW ); + uno::Reference< script::XScriptListener > xScriptListener( xServiceManager->createInstanceWithContext( "ooo.vba.EventListener" , mxContext ), uno::UNO_QUERY_THROW ); + + uno::Reference< beans::XPropertySet > xProps( xScriptListener, uno::UNO_QUERY_THROW ); + xProps->setPropertyValue( "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 ); + uno::Reference< document::XCodeNameQuery > xNameQuery( xDocFac->createInstance( "ooo.vba.VBACodeNameProvider" ), uno::UNO_QUERY_THROW ); + uno::Reference< uno::XInterface > xIf( xControlShape->getControl(), uno::UNO_QUERY_THROW ); + evt.ScriptCode = xNameQuery->getCodeNameForObject( xIf ); + // handle if we passed in our own arguments + if ( !rEvt.Arguments.hasElements() ) + evt.Arguments[ 0 ] <<= 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 (otherwise 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 ] <<= aEvt; + xScriptListener->firing( evt ); + } + } + } + catch(const uno::Exception&) + { + } +} +void ScVbaControl::fireChangeEvent() +{ + script::ScriptEvent evt; + evt.ScriptType = "VBAInterop"; + evt.ListenerType = cppu::UnoType<form::XChangeListener>::get(); + evt.MethodName = "changed"; + fireEvent( evt ); +} + +void ScVbaControl::fireClickEvent() +{ + script::ScriptEvent evt; + evt.ScriptType = "VBAInterop"; + evt.ListenerType = cppu::UnoType<awt::XActionListener>::get(); + evt.MethodName = "actionPerformed"; + fireEvent( evt ); +} + +sal_Int32 SAL_CALL ScVbaControl::getTabIndex() +{ + return 1; +} + +void SAL_CALL ScVbaControl::setTabIndex( sal_Int32 /*nTabIndex*/ ) +{ +} + +//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 ) +{ + uno::Reference< beans::XPropertySet > xProps( xControlShape->getControl(), uno::UNO_QUERY_THROW ); + sal_Int32 nClassId = -1; + xProps->getPropertyValue( "ClassId" ) >>= nClassId; + uno::Reference< XHelperInterface > xVbaParent; // #FIXME - should be worksheet I guess + uno::Reference< drawing::XShape > xShape( xControlShape, uno::UNO_QUERY_THROW ); + ::std::unique_ptr< ConcreteXShapeGeometryAttributes > xGeoHelper( new ConcreteXShapeGeometryAttributes( xShape ) ); + switch( nClassId ) + { + case form::FormComponentType::COMBOBOX: + return new ScVbaComboBox( xVbaParent, xContext, xControlShape, xModel, std::move(xGeoHelper) ); + case form::FormComponentType::COMMANDBUTTON: + { + bool bToggle = false; + xProps->getPropertyValue( "Toggle" ) >>= bToggle; + if ( bToggle ) + return new ScVbaToggleButton( xVbaParent, xContext, xControlShape, xModel, std::move(xGeoHelper) ); + else + return new VbaButton( xVbaParent, xContext, xControlShape, xModel, std::move(xGeoHelper) ); + } + case form::FormComponentType::FIXEDTEXT: + return new ScVbaLabel( xVbaParent, xContext, xControlShape, xModel, std::move(xGeoHelper) ); + case form::FormComponentType::TEXTFIELD: + return new ScVbaTextBox( xVbaParent, xContext, xControlShape, xModel, std::move(xGeoHelper) ); + case form::FormComponentType::CHECKBOX: + return new ScVbaCheckbox( xVbaParent, xContext, xControlShape, xModel, std::move(xGeoHelper) ); + case form::FormComponentType::RADIOBUTTON: + return new ScVbaRadioButton( xVbaParent, xContext, xControlShape, xModel, std::move(xGeoHelper) ); + case form::FormComponentType::LISTBOX: + return new ScVbaListBox( xVbaParent, xContext, xControlShape, xModel, std::move(xGeoHelper) ); + case form::FormComponentType::SPINBUTTON: + return new ScVbaSpinButton( xVbaParent, xContext, xControlShape, xModel, std::move(xGeoHelper) ); + case form::FormComponentType::IMAGECONTROL: + return new ScVbaImage( xVbaParent, xContext, xControlShape, xModel, std::move(xGeoHelper) ); + case form::FormComponentType::SCROLLBAR: + return new ScVbaScrollBar( xVbaParent, xContext, xControlShape, xModel, std::move(xGeoHelper) ); + } + throw uno::RuntimeException( "Unsupported control." ); +} + +/*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 ) +{ + uno::Reference< beans::XPropertySet > xProps( xControl->getModel(), uno::UNO_QUERY_THROW ); + uno::Reference< lang::XServiceInfo > xServiceInfo( xProps, uno::UNO_QUERY_THROW ); + uno::Reference< msforms::XControl > xVBAControl; + uno::Reference< XHelperInterface > xVbaParent; // #FIXME - should be worksheet I guess + ::std::unique_ptr< UserFormGeometryHelper > xGeoHelper( new UserFormGeometryHelper( xControl, fOffsetX, fOffsetY ) ); + + if ( xServiceInfo->supportsService( "com.sun.star.awt.UnoControlCheckBoxModel" ) ) + xVBAControl.set( new ScVbaCheckbox( xVbaParent, xContext, xControl, xModel, std::move(xGeoHelper) ) ); + else if ( xServiceInfo->supportsService( "com.sun.star.awt.UnoControlRadioButtonModel" ) ) + xVBAControl.set( new ScVbaRadioButton( xVbaParent, xContext, xControl, xModel, std::move(xGeoHelper) ) ); + else if ( xServiceInfo->supportsService( "com.sun.star.awt.UnoControlEditModel" ) ) + xVBAControl.set( new ScVbaTextBox( xVbaParent, xContext, xControl, xModel, std::move(xGeoHelper), true ) ); + else if ( xServiceInfo->supportsService( "com.sun.star.awt.UnoControlButtonModel" ) ) + { + bool bToggle = false; + xProps->getPropertyValue( "Toggle" ) >>= bToggle; + if ( bToggle ) + xVBAControl.set( new ScVbaToggleButton( xVbaParent, xContext, xControl, xModel, std::move(xGeoHelper) ) ); + else + xVBAControl.set( new VbaButton( xVbaParent, xContext, xControl, xModel, std::move(xGeoHelper) ) ); + } + else if ( xServiceInfo->supportsService( "com.sun.star.awt.UnoControlComboBoxModel" ) ) + xVBAControl.set( new ScVbaComboBox( xVbaParent, xContext, xControl, xModel, std::move(xGeoHelper) ) ); + else if ( xServiceInfo->supportsService( "com.sun.star.awt.UnoControlListBoxModel" ) ) + xVBAControl.set( new ScVbaListBox( xVbaParent, xContext, xControl, xModel, std::move(xGeoHelper) ) ); + else if ( xServiceInfo->supportsService( "com.sun.star.awt.UnoControlFixedTextModel" ) ) + xVBAControl.set( new ScVbaLabel( xVbaParent, xContext, xControl, xModel, std::move(xGeoHelper) ) ); + else if ( xServiceInfo->supportsService( "com.sun.star.awt.UnoControlImageControlModel" ) ) + xVBAControl.set( new ScVbaImage( xVbaParent, xContext, xControl, xModel, std::move(xGeoHelper) ) ); + else if ( xServiceInfo->supportsService( "com.sun.star.awt.UnoControlProgressBarModel" ) ) + xVBAControl.set( new ScVbaProgressBar( xVbaParent, xContext, xControl, xModel, std::move(xGeoHelper) ) ); + else if ( xServiceInfo->supportsService( "com.sun.star.awt.UnoControlGroupBoxModel" ) ) + xVBAControl.set( new ScVbaFrame( xVbaParent, xContext, xControl, xModel, std::move(xGeoHelper), xDialog ) ); + else if ( xServiceInfo->supportsService( "com.sun.star.awt.UnoControlScrollBarModel" ) ) + xVBAControl.set( new ScVbaScrollBar( xVbaParent, xContext, xControl, xModel, std::move(xGeoHelper) ) ); + else if ( xServiceInfo->supportsService( "com.sun.star.awt.UnoMultiPageModel" ) ) + xVBAControl.set( new ScVbaMultiPage( xVbaParent, xContext, xControl, xModel, std::move(xGeoHelper) ) ); + else if ( xServiceInfo->supportsService( "com.sun.star.awt.UnoControlSpinButtonModel" ) ) + xVBAControl.set( new ScVbaSpinButton( xVbaParent, xContext, xControl, xModel, std::move(xGeoHelper) ) ); + else if ( xServiceInfo->supportsService( "com.sun.star.custom.awt.UnoControlSystemAXContainerModel" ) ) + xVBAControl.set( new VbaSystemAXControl( xVbaParent, xContext, xControl, xModel, std::move(xGeoHelper) ) ); + // #FIXME implement a page control + else if ( xServiceInfo->supportsService( "com.sun.star.awt.UnoPageModel" ) ) + xVBAControl.set( new ScVbaControl( xVbaParent, xContext, xControl, xModel, std::move(xGeoHelper) ) ); + else if ( xServiceInfo->supportsService( "com.sun.star.awt.UnoFrameModel" ) ) + xVBAControl.set( new ScVbaFrame( xVbaParent, xContext, xControl, xModel, std::move(xGeoHelper), xDialog ) ); + if( xVBAControl.is() ) + return xVBAControl; + throw uno::RuntimeException( "Unsupported control." ); +} + +OUString +ScVbaControl::getServiceImplName() +{ + return "ScVbaControl"; +} + +uno::Sequence< OUString > +ScVbaControl::getServiceNames() +{ + static uno::Sequence< OUString > const aServiceNames + { + "ooo.vba.excel.Control" + }; + return aServiceNames; +} + +sal_Int32 const 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() +{ + sal_Int32 nBackColor = 0; + m_xProps->getPropertyValue( "BackgroundColor" ) >>= nBackColor; + return nBackColor; +} + +void ScVbaControl::setBackColor( sal_Int32 nBackColor ) +{ + auto const col = static_cast<sal_uInt32>(nBackColor); + if ( ( col >= sal_uInt32(0x80000000) ) && + ( col <= sal_uInt32(0x80000000) + SAL_N_ELEMENTS(nSysCols) ) ) + { + nBackColor = nSysCols[ col & 0x0FF]; + } + m_xProps->setPropertyValue( "BackgroundColor" , uno::makeAny( XLRGBToOORGB( nBackColor ) ) ); +} + +bool ScVbaControl::getAutoSize() const +{ + bool bIsResizeEnabled = false; + uno::Reference< uno::XInterface > xIf( m_xControl, uno::UNO_SET_THROW ); + SdrObject* pObj = SdrObject::getSdrObjectFromXShape( xIf ); + if ( pObj ) + bIsResizeEnabled = !pObj->IsResizeProtect(); + return bIsResizeEnabled; +} + +// currently no implementation for this +void ScVbaControl::setAutoSize( bool bAutoSize ) +{ + uno::Reference< uno::XInterface > xIf( m_xControl, uno::UNO_SET_THROW ); + SdrObject* pObj = SdrObject::getSdrObjectFromXShape( xIf ); + if ( pObj ) + pObj->SetResizeProtect( !bAutoSize ); +} + +bool ScVbaControl::getLocked() +{ + bool bRes( false ); + m_xProps->getPropertyValue( "ReadOnly" ) >>= bRes; + return bRes; +} + +void ScVbaControl::setLocked( bool bLocked ) +{ + m_xProps->setPropertyValue( "ReadOnly" , uno::makeAny( bLocked ) ); +} + +namespace { + +class ControlProviderImpl : public cppu::WeakImplHelper< XControlProvider > +{ + uno::Reference< uno::XComponentContext > m_xCtx; +public: + explicit 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 ) override; +}; + +} + +uno::Reference< msforms::XControl > SAL_CALL +ControlProviderImpl::createControl( const uno::Reference< drawing::XControlShape >& xControlShape, const uno::Reference< frame::XModel >& xDocOwner ) +{ + uno::Reference< msforms::XControl > xControlToReturn; + if ( xControlShape.is() ) + xControlToReturn = ScVbaControlFactory::createShapeControl( m_xCtx, xControlShape, xDocOwner ); + return xControlToReturn; + +} + +namespace controlprovider +{ +namespace sdecl = comphelper::service_decl; +sdecl::class_<ControlProviderImpl, sdecl::with_args<false> > const serviceImpl; +sdecl::ServiceDecl const serviceDecl( + serviceImpl, + "ControlProviderImpl", + "ooo.vba.ControlProvider" ); +} + + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vbahelper/source/msforms/vbacontrol.hxx b/vbahelper/source/msforms/vbacontrol.hxx new file mode 100644 index 000000000..e96cd5fa9 --- /dev/null +++ b/vbahelper/source/msforms/vbacontrol.hxx @@ -0,0 +1,142 @@ +/* -*- 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 . + */ +#ifndef INCLUDED_VBAHELPER_SOURCE_MSFORMS_VBACONTROL_HXX +#define INCLUDED_VBAHELPER_SOURCE_MSFORMS_VBACONTROL_HXX + +#include <com/sun/star/beans/XPropertySet.hpp> +#include <com/sun/star/uno/XComponentContext.hpp> +#include <com/sun/star/drawing/XControlShape.hpp> +#include <com/sun/star/awt/XControl.hpp> +#include <com/sun/star/awt/XWindowPeer.hpp> +#include <com/sun/star/script/ScriptEvent.hpp> +#include <ooo/vba/msforms/XControl.hpp> + +#include <vbahelper/vbahelper.hxx> +#include <vbahelper/vbahelperinterface.hxx> +#include <memory> + +typedef InheritedHelperInterfaceWeakImpl< ov::msforms::XControl > ControlImpl_BASE; + +class ScVbaControl : public ControlImpl_BASE +{ +private: + css::uno::Reference< css::lang::XEventListener > m_xEventListener; + css::uno::Reference< css::awt::XControl > m_xEmptyFormControl; +protected: + // awt control has nothing similar to Tag property of Mso controls, + // whether it is necessary is another question + OUString m_aControlTag; + + OUString m_sLibraryAndCodeName; + std::unique_ptr< ov::AbstractGeometryAttributes > mpGeometryHelper; + css::uno::Reference< css::beans::XPropertySet > m_xProps; + css::uno::Reference< css::uno::XInterface > m_xControl; + css::uno::Reference< css::frame::XModel > m_xModel; + + /// @throws css::uno::RuntimeException + css::uno::Reference< css::awt::XWindowPeer > getWindowPeer(); + void fireChangeEvent(); + void fireClickEvent(); +public: + ScVbaControl( const css::uno::Reference< ov::XHelperInterface >& xParent, const css::uno::Reference< css::uno::XComponentContext >& xContext, + const css::uno::Reference< css::uno::XInterface >& xControl, const css::uno::Reference< css::frame::XModel >& xModel, std::unique_ptr<ov::AbstractGeometryAttributes> pHelper ); + virtual ~ScVbaControl() override; + // This class will own the helper, so make sure it is allocated from + // the heap + void setGeometryHelper( std::unique_ptr<ov::AbstractGeometryAttributes> pHelper ); + // sets the name of the associated library ( used for UserForm controls ) + void setLibraryAndCodeName( const OUString& sLibCodeName ) { m_sLibraryAndCodeName = sLibCodeName; } + + // XControl + virtual sal_Bool SAL_CALL getEnabled() override; + virtual void SAL_CALL setEnabled( sal_Bool _enabled ) override; + virtual sal_Bool SAL_CALL getVisible() override; + virtual void SAL_CALL setVisible( sal_Bool _visible ) override; + virtual double SAL_CALL getHeight() override; + virtual void SAL_CALL setHeight( double _height ) override; + virtual double SAL_CALL getWidth() override; + virtual void SAL_CALL setWidth( double _width ) override; + virtual double SAL_CALL getLeft() override; + virtual void SAL_CALL setLeft( double _left ) override; + virtual double SAL_CALL getTop() override; + virtual void SAL_CALL setTop( double _top ) override; + virtual void SAL_CALL SetFocus( ) override; + virtual void SAL_CALL Move( double Left, double Top, const css::uno::Any& Width, const css::uno::Any& Height ) override; + virtual void SAL_CALL fireEvent( const css::script::ScriptEvent& evt ) override; + + virtual css::uno::Reference< css::uno::XInterface > SAL_CALL getObject() override; + virtual OUString SAL_CALL getControlSource() override; + virtual void SAL_CALL setControlSource( const OUString& _controlsource ) override; + virtual OUString SAL_CALL getRowSource() override; + virtual void SAL_CALL setRowSource( const OUString& _rowsource ) override; + virtual OUString SAL_CALL getName() override; + virtual void SAL_CALL setName( const OUString& _name ) override; + virtual OUString SAL_CALL getControlTipText() override; + virtual void SAL_CALL setControlTipText( const OUString& ) override; + virtual OUString SAL_CALL getTag() override; + virtual void SAL_CALL setTag( const OUString& aTag ) override; + virtual sal_Int32 SAL_CALL getTabIndex() override; + virtual void SAL_CALL setTabIndex( sal_Int32 nTabIndex ) override; + virtual ::sal_Int32 SAL_CALL getMousePointer() override; + virtual void SAL_CALL setMousePointer( ::sal_Int32 _mousepointer ) override; + //remove resource because ooo.vba.excel.XControl is a wrapper of com.sun.star.drawing.XControlShape + /// @throws css::uno::RuntimeException + void removeResource(); + /// @throws css::uno::RuntimeException + virtual ::sal_Int32 SAL_CALL getForeColor(); + //XHelperInterface + virtual OUString getServiceImplName() override; + virtual css::uno::Sequence<OUString> getServiceNames() override; + //General helper methods for properties (may or may not be relevant for all + //controls) + /// @throws css::uno::RuntimeException + sal_Int32 getBackColor(); + /// @throws css::uno::RuntimeException + void setBackColor( sal_Int32 nBackColor ); + /// @throws css::uno::RuntimeException + bool getAutoSize() const; + /// @throws css::uno::RuntimeException + void setAutoSize( bool bAutoSize ); + /// @throws css::uno::RuntimeException + bool getLocked(); + /// @throws css::uno::RuntimeException + void setLocked( bool bAutoSize ); +}; + + +namespace ScVbaControlFactory +{ + /// @throws css::uno::RuntimeException + css::uno::Reference< ov::msforms::XControl > createShapeControl( + const css::uno::Reference< css::uno::XComponentContext >& xContext, + const css::uno::Reference< css::drawing::XControlShape >& xControlShape, + const css::uno::Reference< css::frame::XModel >& xModel ); + + /// @throws css::uno::RuntimeException + css::uno::Reference< ov::msforms::XControl > createUserformControl( + const css::uno::Reference< css::uno::XComponentContext >& xContext, + const css::uno::Reference< css::awt::XControl >& xControl, + const css::uno::Reference< css::awt::XControl >& xDialog, + const css::uno::Reference< css::frame::XModel >& xModel, + double fOffsetX, double fOffsetY ); +} + +#endif // INCLUDED_VBAHELPER_SOURCE_MSFORMS_VBACONTROL_HXX + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vbahelper/source/msforms/vbacontrols.cxx b/vbahelper/source/msforms/vbacontrols.cxx new file mode 100644 index 000000000..56a0b80ae --- /dev/null +++ b/vbahelper/source/msforms/vbacontrols.cxx @@ -0,0 +1,485 @@ +/* -*- 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/WrappedTargetRuntimeException.hpp> +#include <com/sun/star/lang/XMultiServiceFactory.hpp> + +#include "vbacontrols.hxx" +#include "vbacontrol.hxx" +#include <cppuhelper/exc_hlp.hxx> +#include <cppuhelper/implbase.hxx> +#include <unordered_map> + +using namespace com::sun::star; +using namespace ooo::vba; + + +typedef std::unordered_map< OUString, sal_Int32 > ControlIndexMap; + +namespace { + +class ControlArrayWrapper : public ::cppu::WeakImplHelper< container::XNameAccess, container::XIndexAccess > +{ + uno::Reference< awt::XControlContainer > mxDialog; + uno::Sequence< OUString > msNames; + std::vector< uno::Reference< awt::XControl > > mControls; + ControlIndexMap mIndices; + +private: + void SetArrayElementTo( const uno::Reference< awt::XControl >& xCtrl, sal_Int32 nIndex ) + { + // 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; + } + } +public: + explicit 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( ) override + { + return cppu::UnoType<awt::XControl>::get(); + } + + virtual sal_Bool SAL_CALL hasElements( ) override + { + return ( !mControls.empty() ); + } + + // XNameAccess + virtual uno::Any SAL_CALL getByName( const OUString& aName ) override + { + if ( !hasByName( aName ) ) + throw container::NoSuchElementException(); + return getByIndex( mIndices[ aName ] ); + } + + virtual uno::Sequence< OUString > SAL_CALL getElementNames( ) override + { + return msNames; + } + + virtual sal_Bool SAL_CALL hasByName( const OUString& aName ) override + { + ControlIndexMap::iterator it = mIndices.find( aName ); + return it != mIndices.end(); + } + + // XElementAccess + virtual ::sal_Int32 SAL_CALL getCount( ) override + { + return mControls.size(); + } + + virtual uno::Any SAL_CALL getByIndex( ::sal_Int32 Index ) override + { + 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<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< 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_xContext( xContext), + m_xIndexAccess( xIndexAccess ), + m_xDlg( xDlg ), + m_xModel( xModel ), + mfOffsetX( fOffsetX ), + mfOffsetY( fOffsetY ), + nIndex( 0 ) {} + + virtual sal_Bool SAL_CALL hasMoreElements( ) override + { + return ( nIndex < m_xIndexAccess->getCount() ); + } + + virtual uno::Any SAL_CALL nextElement( ) override + { + 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() +{ + uno::Reference< container::XEnumeration > xEnum( new ControlsEnumWrapper( 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 ) +{ + 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*/ ) +{ + 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 + OUString::number( 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() ) + throw uno::RuntimeException(); + + 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 ); + } + catch (const uno::RuntimeException&) + { + throw; + } + catch (const uno::Exception&) + { + css::uno::Any anyEx = cppu::getCaughtException(); + throw lang::WrappedTargetRuntimeException( "Can not create AXControl!", + uno::Reference< uno::XInterface >(), + anyEx ); + } + + return aResult; +} + +void SAL_CALL ScVbaControls::Remove( const uno::Any& StringKeyOrIndex ) +{ + 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() +{ + return cppu::UnoType<ooo::vba::msforms::XControl>::get(); +} + +VBAHELPER_IMPL_XHELPERINTERFACE( ScVbaControls, "ooo.vba.msforms.Controls" ) +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vbahelper/source/msforms/vbacontrols.hxx b/vbahelper/source/msforms/vbacontrols.hxx new file mode 100644 index 000000000..1e9d95042 --- /dev/null +++ b/vbahelper/source/msforms/vbacontrols.hxx @@ -0,0 +1,63 @@ +/* -*- 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 . + */ +#ifndef INCLUDED_VBAHELPER_SOURCE_MSFORMS_VBACONTROLS_HXX +#define INCLUDED_VBAHELPER_SOURCE_MSFORMS_VBACONTROLS_HXX + +#include <ooo/vba/msforms/XControls.hpp> +#include <com/sun/star/awt/XControl.hpp> + +#include <vbahelper/vbacollectionimpl.hxx> +#include <vbahelper/vbahelper.hxx> + +typedef CollTestImplHelper< ov::msforms::XControls > ControlsImpl_BASE; + +class ScVbaControls : public ControlsImpl_BASE +{ +public: + ScVbaControls( + const css::uno::Reference< ov::XHelperInterface >& xParent, + const css::uno::Reference< css::uno::XComponentContext >& xContext, + const css::uno::Reference< css::awt::XControl >& xDialog, + const css::uno::Reference< css::frame::XModel >& xModel, + double fOffsetX, double fOffsetY ); + // XControls + virtual void SAL_CALL Move( double cx, double cy ) override; + virtual css::uno::Any SAL_CALL Add( const css::uno::Any& Object, const css::uno::Any& StringKey, const css::uno::Any& Before, const css::uno::Any& After ) override; + virtual void SAL_CALL Remove( const css::uno::Any& StringKeyOrIndex ) override; + + // XEnumerationAccess + virtual css::uno::Type SAL_CALL getElementType() override; + virtual css::uno::Reference< css::container::XEnumeration > SAL_CALL createEnumeration() override; + + // ScVbaCollectionBaseImpl + virtual css::uno::Any createCollectionObject( const css::uno::Any& aSource ) override; + + // XHelperInterface + VBAHELPER_DECL_XHELPERINTERFACE + +private: + css::uno::Reference< css::awt::XControl > mxDialog; + css::uno::Reference< css::frame::XModel > mxModel; + double mfOffsetX; + double mfOffsetY; +}; + +#endif // INCLUDED_VBAHELPER_SOURCE_MSFORMS_VBACONTROLS_HXX + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vbahelper/source/msforms/vbaframe.cxx b/vbahelper/source/msforms/vbaframe.cxx new file mode 100644 index 000000000..3af0ffee9 --- /dev/null +++ b/vbahelper/source/msforms/vbaframe.cxx @@ -0,0 +1,99 @@ +/* -*- 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 "vbaframe.hxx" +#include "vbanewfont.hxx" +#include "vbacontrols.hxx" +#include <ooo/vba/msforms/fmBorderStyle.hpp> +#include <ooo/vba/msforms/fmSpecialEffect.hpp> + +using namespace com::sun::star; +using namespace ooo::vba; + +ScVbaFrame::ScVbaFrame( + const uno::Reference< XHelperInterface >& xParent, + const uno::Reference< uno::XComponentContext >& xContext, + const uno::Reference< uno::XInterface >& xControl, + const uno::Reference< frame::XModel >& xModel, + std::unique_ptr<ov::AbstractGeometryAttributes> pGeomHelper, + const css::uno::Reference< css::awt::XControl >& xDialog ) : + FrameImpl_BASE( xParent, xContext, xControl, xModel, std::move(pGeomHelper) ), + mxDialog( xDialog ) +{ +} + +// XFrame attributes + +OUString SAL_CALL ScVbaFrame::getCaption() +{ + OUString Label; + m_xProps->getPropertyValue( "Label" ) >>= Label; + return Label; +} + +void SAL_CALL ScVbaFrame::setCaption( const OUString& _caption ) +{ + m_xProps->setPropertyValue( "Label", uno::makeAny( _caption ) ); +} + +sal_Int32 SAL_CALL ScVbaFrame::getSpecialEffect() +{ + return msforms::fmSpecialEffect::fmSpecialEffectEtched; +} + + +void SAL_CALL ScVbaFrame::setSpecialEffect( sal_Int32 /*nSpecialEffect*/ ) +{ + // #STUB +} + +sal_Int32 SAL_CALL ScVbaFrame::getBorderStyle() +{ + return msforms::fmBorderStyle::fmBorderStyleNone; +} + +void SAL_CALL ScVbaFrame::setBorderStyle( sal_Int32 /*nBorderStyle*/ ) +{ + // #STUB +} + +uno::Reference< msforms::XNewFont > SAL_CALL ScVbaFrame::getFont() +{ + return new VbaNewFont( m_xProps ); +} + +// XFrame methods + +uno::Any SAL_CALL ScVbaFrame::Controls( const uno::Any& rIndex ) +{ + // horizontal anchor of frame children is inside border line (add one unit to compensate border line width) + double fOffsetX = mpGeometryHelper->getOffsetX() + getLeft() + 1.0; + // vertical anchor of frame children is inside border line (add half of text height and one unit to compensate border line width) + double fOffsetY = mpGeometryHelper->getOffsetY() + getTop() + (getFont()->getSize() / 2.0) + 1.0; + + uno::Reference< XCollection > xControls( new ScVbaControls( this, mxContext, mxDialog, m_xModel, fOffsetX, fOffsetY ) ); + if( rIndex.hasValue() ) + return xControls->Item( rIndex, uno::Any() ); + return uno::Any( xControls ); +} + +// XHelperInterface + +VBAHELPER_IMPL_XHELPERINTERFACE( ScVbaFrame, "ooo.vba.msforms.Frame" ) +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vbahelper/source/msforms/vbaframe.hxx b/vbahelper/source/msforms/vbaframe.hxx new file mode 100644 index 000000000..354858a27 --- /dev/null +++ b/vbahelper/source/msforms/vbaframe.hxx @@ -0,0 +1,63 @@ +/* -*- 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 . + */ + +#ifndef INCLUDED_VBAHELPER_SOURCE_MSFORMS_VBAFRAME_HXX +#define INCLUDED_VBAHELPER_SOURCE_MSFORMS_VBAFRAME_HXX + +#include <cppuhelper/implbase.hxx> +#include <ooo/vba/msforms/XFrame.hpp> + +#include "vbacontrol.hxx" +#include <vbahelper/vbahelper.hxx> + +typedef cppu::ImplInheritanceHelper< ScVbaControl, ov::msforms::XFrame > FrameImpl_BASE; + +class ScVbaFrame : public FrameImpl_BASE +{ +public: + ScVbaFrame( + const css::uno::Reference< ov::XHelperInterface >& xParent, + const css::uno::Reference< css::uno::XComponentContext >& xContext, + const css::uno::Reference< css::uno::XInterface >& xControl, + const css::uno::Reference< css::frame::XModel >& xModel, + std::unique_ptr<ov::AbstractGeometryAttributes> pGeomHelper, + const css::uno::Reference< css::awt::XControl >& xDialog ); + + // XFrame attributes + virtual OUString SAL_CALL getCaption() override; + virtual void SAL_CALL setCaption( const OUString& _caption ) override; + + virtual sal_Int32 SAL_CALL getSpecialEffect() override; + virtual void SAL_CALL setSpecialEffect( sal_Int32 nSpecialEffect ) override; + virtual sal_Int32 SAL_CALL getBorderStyle() override; + virtual void SAL_CALL setBorderStyle( sal_Int32 nBorderStyle ) override; + virtual css::uno::Reference< ov::msforms::XNewFont > SAL_CALL getFont() override; + // XFrame methods + css::uno::Any SAL_CALL Controls( const css::uno::Any& rIndex ) override; + //XHelperInterface + virtual OUString getServiceImplName() override; + virtual css::uno::Sequence<OUString> getServiceNames() override; + +private: + css::uno::Reference< css::awt::XControl > mxDialog; +}; + +#endif // INCLUDED_VBAHELPER_SOURCE_MSFORMS_VBAFRAME_HXX + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vbahelper/source/msforms/vbaimage.cxx b/vbahelper/source/msforms/vbaimage.cxx new file mode 100644 index 000000000..827544168 --- /dev/null +++ b/vbahelper/source/msforms/vbaimage.cxx @@ -0,0 +1,56 @@ +/* -*- 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 "vbaimage.hxx" + +using namespace com::sun::star; +using namespace ooo::vba; + + +ScVbaImage::ScVbaImage( const uno::Reference< XHelperInterface >& xParent, const uno::Reference< uno::XComponentContext >& xContext, const uno::Reference< uno::XInterface >& xControl, const uno::Reference< frame::XModel >& xModel, std::unique_ptr<ov::AbstractGeometryAttributes> pGeomHelper ) + : ImageImpl_BASE( xParent, xContext, xControl, xModel, std::move(pGeomHelper) ) +{ +} + +OUString +ScVbaImage::getServiceImplName() +{ + return "ScVbaImage"; +} + +uno::Sequence< OUString > +ScVbaImage::getServiceNames() +{ + static uno::Sequence< OUString > const aServiceNames + { + "ooo.vba.msforms.Image" + }; + return aServiceNames; +} + +sal_Int32 SAL_CALL ScVbaImage::getBackColor() +{ + return ScVbaControl::getBackColor(); +} + +void SAL_CALL ScVbaImage::setBackColor( sal_Int32 nBackColor ) +{ + ScVbaControl::setBackColor( nBackColor ); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vbahelper/source/msforms/vbaimage.hxx b/vbahelper/source/msforms/vbaimage.hxx new file mode 100644 index 000000000..2f7081f52 --- /dev/null +++ b/vbahelper/source/msforms/vbaimage.hxx @@ -0,0 +1,41 @@ +/* -*- 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 . + */ +#ifndef INCLUDED_VBAHELPER_SOURCE_MSFORMS_VBAIMAGE_HXX +#define INCLUDED_VBAHELPER_SOURCE_MSFORMS_VBAIMAGE_HXX +#include <cppuhelper/implbase.hxx> +#include <ooo/vba/msforms/XImage.hpp> + +#include "vbacontrol.hxx" +#include <vbahelper/vbahelper.hxx> + +typedef cppu::ImplInheritanceHelper< ScVbaControl, ov::msforms::XImage > ImageImpl_BASE; + +class ScVbaImage : public ImageImpl_BASE +{ +public: + ScVbaImage( const css::uno::Reference< ov::XHelperInterface >& xParent, const css::uno::Reference< css::uno::XComponentContext >& xContext, const css::uno::Reference< css::uno::XInterface >& xControl, const css::uno::Reference< css::frame::XModel >& xModel, std::unique_ptr<ov::AbstractGeometryAttributes> pGeomHelper ); + virtual sal_Int32 SAL_CALL getBackColor() override; + virtual void SAL_CALL setBackColor( sal_Int32 nBackColor ) override; + //XHelperInterface + virtual OUString getServiceImplName() override; + virtual css::uno::Sequence<OUString> getServiceNames() override; +}; +#endif // INCLUDED_VBAHELPER_SOURCE_MSFORMS_VBAIMAGE_HXX + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vbahelper/source/msforms/vbalabel.cxx b/vbahelper/source/msforms/vbalabel.cxx new file mode 100644 index 000000000..df4ac8be0 --- /dev/null +++ b/vbahelper/source/msforms/vbalabel.cxx @@ -0,0 +1,112 @@ +/* -*- 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 "vbalabel.hxx" +#include "vbanewfont.hxx" + +using namespace com::sun::star; +using namespace ooo::vba; + +ScVbaLabel::ScVbaLabel( const css::uno::Reference< XHelperInterface >& xParent, const uno::Reference< uno::XComponentContext >& xContext, const uno::Reference< uno::XInterface >& xControl, const uno::Reference< frame::XModel >& xModel, std::unique_ptr<ov::AbstractGeometryAttributes> pGeomHelper ) + : LabelImpl_BASE( xParent, xContext, xControl, xModel, std::move(pGeomHelper) ) +{ +} + +// Attributes +OUString SAL_CALL +ScVbaLabel::getCaption() +{ + OUString Label; + m_xProps->getPropertyValue( "Label" ) >>= Label; + return Label; +} + +void SAL_CALL +ScVbaLabel::setCaption( const OUString& _caption ) +{ + m_xProps->setPropertyValue( "Label", uno::makeAny( _caption ) ); +} +uno::Any SAL_CALL +ScVbaLabel::getValue() +{ + return uno::makeAny( getCaption() ); +} + +void SAL_CALL +ScVbaLabel::setValue( const uno::Any& _value ) +{ + OUString sCaption; + _value >>= sCaption; + setCaption( sCaption ); +} + +OUString SAL_CALL +ScVbaLabel::getAccelerator() +{ + // #STUB + return OUString(); +} + +void SAL_CALL +ScVbaLabel::setAccelerator( const OUString& /*_accelerator*/ ) +{ + // #STUB +} + +uno::Reference< msforms::XNewFont > SAL_CALL ScVbaLabel::getFont() +{ + return new VbaNewFont( m_xProps ); +} + +OUString ScVbaLabel::getServiceImplName() +{ + return "ScVbaLabel"; +} + +sal_Int32 SAL_CALL ScVbaLabel::getBackColor() +{ + return ScVbaControl::getBackColor(); +} + +void SAL_CALL ScVbaLabel::setBackColor( sal_Int32 nBackColor ) +{ + ScVbaControl::setBackColor( nBackColor ); +} + +sal_Bool SAL_CALL ScVbaLabel::getAutoSize() +{ + return ScVbaControl::getAutoSize(); +} + +void SAL_CALL ScVbaLabel::setAutoSize( sal_Bool bAutoSize ) +{ + ScVbaControl::setAutoSize( bAutoSize ); +} + +uno::Sequence< OUString > +ScVbaLabel::getServiceNames() +{ + static uno::Sequence< OUString > const aServiceNames + { + "ooo.vba.msforms.Label" + }; + return aServiceNames; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vbahelper/source/msforms/vbalabel.hxx b/vbahelper/source/msforms/vbalabel.hxx new file mode 100644 index 000000000..f7fc98416 --- /dev/null +++ b/vbahelper/source/msforms/vbalabel.hxx @@ -0,0 +1,54 @@ +/* -*- 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 . + */ +#ifndef INCLUDED_VBAHELPER_SOURCE_MSFORMS_VBALABEL_HXX +#define INCLUDED_VBAHELPER_SOURCE_MSFORMS_VBALABEL_HXX +#include <ooo/vba/msforms/XLabel.hpp> +#include <com/sun/star/script/XDefaultProperty.hpp> + +#include "vbacontrol.hxx" +#include <vbahelper/vbahelper.hxx> +#include <cppuhelper/implbase.hxx> + +typedef cppu::ImplInheritanceHelper< ScVbaControl, ov::msforms::XLabel, css::script::XDefaultProperty > LabelImpl_BASE; + +class ScVbaLabel : public LabelImpl_BASE +{ +public: + ScVbaLabel( const css::uno::Reference< ov::XHelperInterface >& xParent, const css::uno::Reference< css::uno::XComponentContext >& xContext, const css::uno::Reference< css::uno::XInterface >& xControl, const css::uno::Reference< css::frame::XModel >& xModel, std::unique_ptr<ov::AbstractGeometryAttributes> pGeomHelper ); + // Attributes + virtual css::uno::Any SAL_CALL getValue() override; + virtual void SAL_CALL setValue( const css::uno::Any& _value ) override; + virtual OUString SAL_CALL getCaption() override; + virtual void SAL_CALL setCaption( const OUString& _caption ) override; + virtual OUString SAL_CALL getAccelerator() override; + virtual void SAL_CALL setAccelerator( const OUString& _accelerator ) override; + virtual css::uno::Reference< ov::msforms::XNewFont > SAL_CALL getFont() override; + virtual sal_Int32 SAL_CALL getBackColor() override; + virtual void SAL_CALL setBackColor( sal_Int32 nBackColor ) override; + virtual sal_Bool SAL_CALL getAutoSize() override; + virtual void SAL_CALL setAutoSize( sal_Bool bAutoSize ) override; + //XHelperInterface + virtual OUString getServiceImplName() override; + virtual css::uno::Sequence<OUString> getServiceNames() override; + // XDefaultProperty + OUString SAL_CALL getDefaultPropertyName( ) override { return "Value"; } +}; +#endif // INCLUDED_VBAHELPER_SOURCE_MSFORMS_VBALABEL_HXX + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vbahelper/source/msforms/vbalistbox.cxx b/vbahelper/source/msforms/vbalistbox.cxx new file mode 100644 index 000000000..f4af24a5b --- /dev/null +++ b/vbahelper/source/msforms/vbalistbox.cxx @@ -0,0 +1,276 @@ +/* -*- 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 "vbalistbox.hxx" +#include "vbanewfont.hxx" +#include <comphelper/sequence.hxx> +#include <ooo/vba/msforms/fmMultiSelect.hpp> + +using namespace com::sun::star; +using namespace ooo::vba; + +ScVbaListBox::ScVbaListBox( const uno::Reference< XHelperInterface >& xParent, const uno::Reference< uno::XComponentContext >& xContext, const uno::Reference< css::uno::XInterface >& xControl, const uno::Reference< frame::XModel >& xModel, std::unique_ptr<ov::AbstractGeometryAttributes> pGeomHelper ) + : ListBoxImpl_BASE(xParent, xContext, xControl, xModel, std::move(pGeomHelper)) + , m_nIndex(0) +{ + mpListHelper.reset( new ListControlHelper( m_xProps ) ); +} + +// Attributes +void SAL_CALL +ScVbaListBox::setListIndex( const uno::Any& _value ) +{ + sal_Int32 nIndex = 0; + _value >>= nIndex; + uno::Reference< XPropValue > xPropVal( Selected( nIndex ), uno::UNO_QUERY_THROW ); + xPropVal->setValue( uno::makeAny( true ) ); +} + +uno::Any SAL_CALL +ScVbaListBox::getListIndex() +{ + uno::Sequence< sal_Int16 > sSelection; + m_xProps->getPropertyValue( "SelectedItems" ) >>= sSelection; + if ( !sSelection.hasElements() ) + return uno::Any( sal_Int32( -1 ) ); + return uno::Any( sSelection[ 0 ] ); +} + +uno::Any SAL_CALL +ScVbaListBox::getValue() +{ + uno::Sequence< sal_Int16 > sSelection; + uno::Sequence< OUString > sItems; + m_xProps->getPropertyValue( "SelectedItems" ) >>= sSelection; + m_xProps->getPropertyValue( "StringItemList" ) >>= sItems; + if( getMultiSelect() ) + throw uno::RuntimeException( "Attribute use invalid." ); + uno::Any aRet; + if ( sSelection.hasElements() ) + aRet <<= sItems[ sSelection[ 0 ] ]; + return aRet; +} + +void SAL_CALL +ScVbaListBox::setValue( const uno::Any& _value ) +{ + if( getMultiSelect() ) + { + throw uno::RuntimeException( "Attribute use invalid." ); + } + OUString sValue = getAnyAsString( _value ); + uno::Sequence< OUString > sList; + m_xProps->getPropertyValue( "StringItemList" ) >>= sList; + sal_Int16 nValue = static_cast<sal_Int16>(comphelper::findValue(sList, sValue)); + if( nValue == -1 ) + throw uno::RuntimeException( "Attribute use invalid." ); + + uno::Sequence< sal_Int16 > nSelectedIndices(1); + uno::Sequence< sal_Int16 > nOldSelectedIndices; + m_xProps->getPropertyValue( "SelectedItems" ) >>= nOldSelectedIndices; + nSelectedIndices[ 0 ] = nValue; + m_xProps->setPropertyValue( "SelectedItems", uno::makeAny( nSelectedIndices ) ); + if ( nSelectedIndices != nOldSelectedIndices ) + fireClickEvent(); +} + +OUString SAL_CALL +ScVbaListBox::getText() +{ + OUString result; + getValue() >>= result; + return result; +} + +void SAL_CALL +ScVbaListBox::setText( const OUString& _text ) +{ + setValue( uno::makeAny( _text ) ); // seems the same +} + +sal_Int32 SAL_CALL +ScVbaListBox::getMultiSelect() +{ + bool bMultiSelect = false; + m_xProps->getPropertyValue( "MultiSelection" ) >>= bMultiSelect; + + return bMultiSelect ? msforms::fmMultiSelect::fmMultiSelectMulti : msforms::fmMultiSelect::fmMultiSelectSingle; +} + +void SAL_CALL +ScVbaListBox::setMultiSelect( sal_Int32 _multiselect ) +{ + bool bBoolVal = false; + switch ( _multiselect ) + { + case msforms::fmMultiSelect::fmMultiSelectMulti: + case msforms::fmMultiSelect::fmMultiSelectExtended: + bBoolVal = true; + break; + case msforms::fmMultiSelect::fmMultiSelectSingle: + bBoolVal = false; + break; + default: + throw lang::IllegalArgumentException(); + break; + } + m_xProps->setPropertyValue( "MultiSelection" , uno::makeAny( bBoolVal ) ); +} + + +css::uno::Any SAL_CALL +ScVbaListBox::Selected( sal_Int32 index ) +{ + uno::Sequence< OUString > sList; + m_xProps->getPropertyValue( "StringItemList" ) >>= sList; + sal_Int16 nLength = static_cast< sal_Int16 >( sList.getLength() ); + // no choice but to do a horror cast as internally + // the indices are but sal_Int16 + sal_Int16 nIndex = static_cast< sal_Int16 >( index ); + if( nIndex < 0 || nIndex >= nLength ) + throw uno::RuntimeException( "Error Number." ); + m_nIndex = nIndex; + return uno::makeAny( uno::Reference< XPropValue > ( new ScVbaPropValue( this ) ) ); +} + +// Methods +void SAL_CALL +ScVbaListBox::AddItem( const uno::Any& pvargItem, const uno::Any& pvargIndex ) +{ + mpListHelper->AddItem( pvargItem, pvargIndex ); +} + +void SAL_CALL +ScVbaListBox::removeItem( const uno::Any& index ) +{ + mpListHelper->removeItem( index ); +} + +void SAL_CALL +ScVbaListBox::Clear( ) +{ + mpListHelper->Clear(); +} + +// this is called when something like the following vba code is used +// to set the selected state of particular entries in the Listbox +// ListBox1.Selected( 3 ) = false +//PropListener +void +ScVbaListBox::setValueEvent( const uno::Any& value ) +{ + bool bValue = false; + if( !(value >>= bValue) ) + throw uno::RuntimeException( "Invalid type. need boolean." ); + uno::Sequence< sal_Int16 > nList; + m_xProps->getPropertyValue( "SelectedItems" ) >>= nList; + sal_Int16 nLength = static_cast<sal_Int16>( nList.getLength() ); + sal_Int16 nIndex = m_nIndex; + for( sal_Int16 i = 0; i < nLength; i++ ) + { + if( nList[i] == nIndex ) + { + if( !bValue ) + { + for( ; i < nLength - 1; i++ ) + { + nList[i] = nList[i + 1]; + } + nList.realloc( nLength - 1 ); + //m_xProps->setPropertyValue( sSourceName, uno::makeAny( nList ) ); + fireClickEvent(); + m_xProps->setPropertyValue( "SelectedItems", uno::makeAny( nList ) ); + } + return; + } + } + if( bValue ) + { + if( getMultiSelect() ) + { + nList.realloc( nLength + 1 ); + nList[nLength] = nIndex; + } + else + { + nList.realloc( 1 ); + nList[0] = nIndex; + } + //m_xProps->setPropertyValue( sSourceName, uno::makeAny( nList ) ); + fireClickEvent(); + m_xProps->setPropertyValue( "SelectedItems", uno::makeAny( nList ) ); + } +} + +// this is called when something like the following vba code is used +// to determine the selected state of particular entries in the Listbox +// msgbox ListBox1.Selected( 3 ) + +css::uno::Any +ScVbaListBox::getValueEvent() +{ + uno::Sequence< sal_Int16 > nList; + m_xProps->getPropertyValue( "SelectedItems" ) >>= nList; + sal_Int32 nIndex = m_nIndex; + bool bRet = std::find(nList.begin(), nList.end(), nIndex) != nList.end(); + + return uno::makeAny( bRet ); +} + +void SAL_CALL +ScVbaListBox::setRowSource( const OUString& _rowsource ) +{ + ScVbaControl::setRowSource( _rowsource ); + mpListHelper->setRowSource( _rowsource ); +} + +sal_Int32 SAL_CALL +ScVbaListBox::getListCount() +{ + return mpListHelper->getListCount(); +} + +uno::Any SAL_CALL +ScVbaListBox::List( const ::uno::Any& pvargIndex, const uno::Any& pvarColumn ) +{ + return mpListHelper->List( pvargIndex, pvarColumn ); +} + +uno::Reference< msforms::XNewFont > SAL_CALL ScVbaListBox::getFont() +{ + return new VbaNewFont( m_xProps ); +} + +OUString +ScVbaListBox::getServiceImplName() +{ + return "ScVbaListBox"; +} + +uno::Sequence< OUString > +ScVbaListBox::getServiceNames() +{ + static uno::Sequence< OUString > const aServiceNames + { + "ooo.vba.msforms.ScVbaListBox" + }; + return aServiceNames; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vbahelper/source/msforms/vbalistbox.hxx b/vbahelper/source/msforms/vbalistbox.hxx new file mode 100644 index 000000000..b87f9e74f --- /dev/null +++ b/vbahelper/source/msforms/vbalistbox.hxx @@ -0,0 +1,81 @@ +/* -*- 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 . + */ +#ifndef INCLUDED_VBAHELPER_SOURCE_MSFORMS_VBALISTBOX_HXX +#define INCLUDED_VBAHELPER_SOURCE_MSFORMS_VBALISTBOX_HXX +#include <memory> +#include <cppuhelper/implbase.hxx> +#include <com/sun/star/uno/XComponentContext.hpp> +#include <com/sun/star/script/XDefaultProperty.hpp> +#include <ooo/vba/msforms/XListBox.hpp> +#include <com/sun/star/beans/PropertyAttribute.hpp> + +#include "vbacontrol.hxx" +#include <vbahelper/vbapropvalue.hxx> +#include "vbalistcontrolhelper.hxx" +#include <vbahelper/vbahelper.hxx> + +typedef cppu::ImplInheritanceHelper<ScVbaControl, ov::msforms::XListBox, css::script::XDefaultProperty > ListBoxImpl_BASE; +class ScVbaListBox : public ListBoxImpl_BASE + ,public PropListener +{ + std::unique_ptr< ListControlHelper > mpListHelper; + + sal_Int16 m_nIndex; + +public: + ScVbaListBox( const css::uno::Reference< ov::XHelperInterface >& xParent, const css::uno::Reference< css::uno::XComponentContext >& xContext, const css::uno::Reference< css::uno::XInterface >& xControl, const css::uno::Reference< css::frame::XModel >& xModel, std::unique_ptr<ov::AbstractGeometryAttributes> pGeomHelper ); + + // Attributes + virtual css::uno::Any SAL_CALL getListIndex() override; + virtual void SAL_CALL setListIndex( const css::uno::Any& _value ) override; + virtual ::sal_Int32 SAL_CALL getListCount() override; + virtual css::uno::Any SAL_CALL getValue() override; + virtual void SAL_CALL setValue( const css::uno::Any& _value ) override; + virtual OUString SAL_CALL getText() override; + virtual void SAL_CALL setText( const OUString& _text ) override; + virtual sal_Int32 SAL_CALL getMultiSelect() override; + virtual void SAL_CALL setMultiSelect( sal_Int32 _multiselect ) override; + virtual css::uno::Reference< ov::msforms::XNewFont > SAL_CALL getFont() override; + + // Methods + virtual css::uno::Any SAL_CALL Selected( ::sal_Int32 index ) override; + virtual void SAL_CALL AddItem( const css::uno::Any& pvargItem, const css::uno::Any& pvargIndex ) override; + virtual void SAL_CALL removeItem( const css::uno::Any& index ) override; + virtual void SAL_CALL Clear( ) override; + virtual css::uno::Any SAL_CALL List( const css::uno::Any& pvargIndex, const css::uno::Any& pvarColumn ) override; + // XControl + virtual void SAL_CALL setRowSource( const OUString& _rowsource ) override; + + // XDefaultProperty + OUString SAL_CALL getDefaultPropertyName( ) override { return "Value"; } + + //XHelperInterface + virtual OUString getServiceImplName() override; + virtual css::uno::Sequence<OUString> getServiceNames() override; + + //PropListener + virtual void setValueEvent( const css::uno::Any& value ) override; + virtual css::uno::Any getValueEvent() override; + + +}; + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vbahelper/source/msforms/vbalistcontrolhelper.cxx b/vbahelper/source/msforms/vbalistcontrolhelper.cxx new file mode 100644 index 000000000..02a500aa2 --- /dev/null +++ b/vbahelper/source/msforms/vbalistcontrolhelper.cxx @@ -0,0 +1,189 @@ +/* -*- 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 "vbalistcontrolhelper.hxx" +#include <vector> +#include <vbahelper/vbapropvalue.hxx> +#include <com/sun/star/beans/XPropertySet.hpp> +#include <comphelper/sequence.hxx> + +using namespace com::sun::star; +using namespace ooo::vba; + +namespace { + +class ListPropListener : public PropListener +{ +private: + uno::Reference< beans::XPropertySet > m_xProps; + uno::Any m_pvargIndex; + uno::Any m_pvarColumn; + +public: + ListPropListener( const uno::Reference< beans::XPropertySet >& xProps, const uno::Any& pvargIndex, const uno::Any& pvarColumn ); + virtual ~ListPropListener() { }; + virtual void setValueEvent( const css::uno::Any& value ) override; + virtual css::uno::Any getValueEvent() override; +}; + +} + +ListPropListener::ListPropListener( const uno::Reference< beans::XPropertySet >& xProps, const uno::Any& pvargIndex, const uno::Any& pvarColumn ) : m_xProps( xProps ), m_pvargIndex( pvargIndex ), m_pvarColumn( pvarColumn ) +{ +} + +void ListPropListener::setValueEvent( const uno::Any& value ) +{ + if( m_pvargIndex.hasValue() || m_pvarColumn.hasValue() ) + throw uno::RuntimeException( "Bad argument" ); + + m_xProps->setPropertyValue( "StringItemList", value ); +} + +uno::Any ListPropListener::getValueEvent() +{ + uno::Sequence< OUString > sList; + m_xProps->getPropertyValue( "StringItemList" ) >>= sList; + sal_Int16 nLength = static_cast< sal_Int16 >( sList.getLength() ); + uno::Any aRet; + if ( m_pvargIndex.hasValue() ) + { + sal_Int16 nIndex = -1; + m_pvargIndex >>= nIndex; + if( nIndex < 0 || nIndex >= nLength ) + throw uno::RuntimeException( "Bad row Index" ); + aRet <<= sList[ nIndex ]; + } + else if ( m_pvarColumn.hasValue() ) // pvarColumn on its own would be bad + throw uno::RuntimeException( "Bad column Index" ); + else // List() ( e.g. no args ) + { + uno::Sequence< uno::Sequence< OUString > > sReturnArray( nLength ); + for ( sal_Int32 i = 0; i < nLength; ++i ) + { + sReturnArray[ i ].realloc( 10 ); + sReturnArray[ i ][ 0 ] = sList[ i ]; + } + aRet <<= sReturnArray; + } + return aRet; +} + +void +ListControlHelper::AddItem( const uno::Any& pvargItem, const uno::Any& pvargIndex ) +{ + if ( pvargItem.hasValue() ) + { + uno::Sequence< OUString > sList; + m_xProps->getPropertyValue( "StringItemList" ) >>= sList; + + sal_Int32 nIndex = sList.getLength(); + + if ( pvargIndex.hasValue() ) + pvargIndex >>= nIndex; + + OUString sString = getAnyAsString( pvargItem ); + + // if no index specified or item is to be appended to end of + // list just realloc the array and set the last item + if ( nIndex == sList.getLength() ) + { + sal_Int32 nOldSize = sList.getLength(); + sList.realloc( nOldSize + 1 ); + sList[ nOldSize ] = sString; + } + else + { + // just copy those elements above the one to be inserted + std::vector< OUString > sVec; + // reserve just the amount we need to copy + sVec.reserve( sList.getLength() - nIndex + 1); + + // insert the new element + sVec.push_back( sString ); + + // point at first element to copy + std::copy(std::next(sList.begin(), nIndex), sList.end(), std::back_inserter(sVec)); + + sList.realloc( sList.getLength() + 1 ); + + // point at first element to be overwritten + std::copy(sVec.begin(), sVec.end(), std::next(sList.begin(), nIndex)); + } + + m_xProps->setPropertyValue( "StringItemList", uno::makeAny( sList ) ); + } +} + +void +ListControlHelper::removeItem( const uno::Any& index ) +{ + sal_Int32 nIndex = 0; + // for int index + if ( index >>= nIndex ) + { + uno::Sequence< OUString > sList; + m_xProps->getPropertyValue( "StringItemList" ) >>= sList; + if( nIndex < 0 || nIndex > ( sList.getLength() - 1 ) ) + throw uno::RuntimeException( "Invalid index" , uno::Reference< uno::XInterface > () ); + if( sList.hasElements() ) + { + if( sList.getLength() == 1 ) + { + Clear(); + return; + } + + comphelper::removeElementAt(sList, nIndex); + } + + m_xProps->setPropertyValue( "StringItemList", uno::makeAny( sList ) ); + } +} + +void +ListControlHelper::Clear( ) +{ + // urk, setValue doesn't seem to work !! + //setValue( uno::makeAny( sal_Int16() ) ); + m_xProps->setPropertyValue( "StringItemList", uno::makeAny( uno::Sequence< OUString >() ) ); +} + +void +ListControlHelper::setRowSource( const OUString& _rowsource ) +{ + if ( _rowsource.isEmpty() ) + Clear(); +} + +sal_Int32 +ListControlHelper::getListCount() +{ + uno::Sequence< OUString > sList; + m_xProps->getPropertyValue( "StringItemList" ) >>= sList; + return sList.getLength(); +} + +uno::Any +ListControlHelper::List( const ::uno::Any& pvargIndex, const uno::Any& pvarColumn ) +{ + return uno::makeAny( uno::Reference< XPropValue > ( new ScVbaPropValue( new ListPropListener( m_xProps, pvargIndex, pvarColumn ) ) ) ); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vbahelper/source/msforms/vbalistcontrolhelper.hxx b/vbahelper/source/msforms/vbalistcontrolhelper.hxx new file mode 100644 index 000000000..dff3e1c33 --- /dev/null +++ b/vbahelper/source/msforms/vbalistcontrolhelper.hxx @@ -0,0 +1,47 @@ +/* -*- 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 . + */ + +#ifndef INCLUDED_VBAHELPER_SOURCE_MSFORMS_VBALISTCONTROLHELPER_HXX +#define INCLUDED_VBAHELPER_SOURCE_MSFORMS_VBALISTCONTROLHELPER_HXX + +#include <vbahelper/vbahelper.hxx> + +class ListControlHelper final +{ + css::uno::Reference< css::beans::XPropertySet > m_xProps; + +public: + explicit ListControlHelper( const css::uno::Reference< css::beans::XPropertySet >& rxControl ) : m_xProps( rxControl ){} + /// @throws css::uno::RuntimeException + void AddItem( const css::uno::Any& pvargItem, const css::uno::Any& pvargIndex ); + /// @throws css::uno::RuntimeException + void removeItem( const css::uno::Any& index ); + /// @throws css::uno::RuntimeException + void setRowSource( const OUString& _rowsource ); + /// @throws css::uno::RuntimeException + ::sal_Int32 getListCount(); + /// @throws css::uno::RuntimeException + css::uno::Any List( const css::uno::Any& pvargIndex, const css::uno::Any& pvarColumn ); + /// @throws css::uno::RuntimeException + void Clear( ); +}; + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vbahelper/source/msforms/vbamultipage.cxx b/vbahelper/source/msforms/vbamultipage.cxx new file mode 100644 index 000000000..a23949ad9 --- /dev/null +++ b/vbahelper/source/msforms/vbamultipage.cxx @@ -0,0 +1,117 @@ +/* -*- 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 "vbamultipage.hxx" +#include <ooo/vba/XCollection.hpp> +#include "vbapages.hxx" +#include <com/sun/star/container/XNameContainer.hpp> +#include <cppuhelper/implbase.hxx> + +using namespace com::sun::star; +using namespace ooo::vba; + +const OUString SVALUE( "MultiPageValue" ); + +namespace { + +class PagesImpl : public cppu::WeakImplHelper< container::XIndexAccess > +{ + sal_Int32 mnPages; +public: + explicit PagesImpl( sal_Int32 nPages ) : mnPages( nPages ) {} + virtual ::sal_Int32 SAL_CALL getCount() override { return mnPages; } + virtual uno::Any SAL_CALL getByIndex( ::sal_Int32 Index ) override + { + if ( Index < 0 || Index > mnPages ) + throw lang::IndexOutOfBoundsException(); + return uno::makeAny( uno::Reference< uno::XInterface >() ); + } + // XElementAccess + virtual uno::Type SAL_CALL getElementType() override + { + // no Pages object yet #FIXME + //return cppu::UnoType<msforms::XPage>::get(); + return cppu::UnoType<uno::XInterface>::get(); + } + virtual sal_Bool SAL_CALL hasElements( ) override + { + return ( mnPages > 0 ); + } +}; + +} + +ScVbaMultiPage::ScVbaMultiPage( + const uno::Reference< ov::XHelperInterface >& xParent, + const uno::Reference< uno::XComponentContext >& xContext, + const uno::Reference< uno::XInterface >& xControl, + const uno::Reference< frame::XModel >& xModel, + std::unique_ptr<ov::AbstractGeometryAttributes> pGeomHelper) : + MultiPageImpl_BASE( xParent, xContext, xControl, xModel, std::move(pGeomHelper) ) +{ +} + +// Attributes +sal_Int32 SAL_CALL +ScVbaMultiPage::getValue() +{ + sal_Int32 nValue = 0; + m_xProps->getPropertyValue( SVALUE ) >>= nValue; + // VBA 0 based tab index + return nValue - 1; +} + +void SAL_CALL +ScVbaMultiPage::setValue( const sal_Int32 _value ) +{ + // Openoffice 1 based tab index + sal_Int32 nVal = _value + 1; + sal_Int32 nOldVal = getValue(); + m_xProps->setPropertyValue( SVALUE, uno::makeAny( nVal ) ); + if ( nVal != nOldVal ) + fireChangeEvent(); +} + +OUString +ScVbaMultiPage::getServiceImplName() +{ + return "ScVbaMultiPage"; +} + +uno::Any SAL_CALL +ScVbaMultiPage::Pages( const uno::Any& index ) +{ + // get the container model + uno::Reference< container::XNameContainer > xContainer( m_xProps, uno::UNO_QUERY_THROW ); + uno::Reference< XCollection > xColl( new ScVbaPages( this, mxContext, new PagesImpl( xContainer->getElementNames().getLength() ) ) ); + if ( !index.hasValue() ) + return uno::makeAny( xColl ); + return xColl->Item( index, uno::Any() ); +} + +uno::Sequence< OUString > +ScVbaMultiPage::getServiceNames() +{ + static uno::Sequence< OUString > const aServiceNames + { + "ooo.vba.msforms.MultiPage" + }; + return aServiceNames; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vbahelper/source/msforms/vbamultipage.hxx b/vbahelper/source/msforms/vbamultipage.hxx new file mode 100644 index 000000000..45c861105 --- /dev/null +++ b/vbahelper/source/msforms/vbamultipage.hxx @@ -0,0 +1,54 @@ +/* -*- 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 . + */ + +#ifndef INCLUDED_VBAHELPER_SOURCE_MSFORMS_VBAMULTIPAGE_HXX +#define INCLUDED_VBAHELPER_SOURCE_MSFORMS_VBAMULTIPAGE_HXX + +#include <cppuhelper/implbase.hxx> +#include <ooo/vba/msforms/XMultiPage.hpp> +#include <com/sun/star/container/XIndexAccess.hpp> + +#include "vbacontrol.hxx" +#include <vbahelper/vbahelper.hxx> + +typedef cppu::ImplInheritanceHelper< ScVbaControl, ov::msforms::XMultiPage > MultiPageImpl_BASE; + +class ScVbaMultiPage : public MultiPageImpl_BASE +{ +public: + ScVbaMultiPage( + const css::uno::Reference< ov::XHelperInterface >& xParent, + const css::uno::Reference< css::uno::XComponentContext >& xContext, + const css::uno::Reference< css::uno::XInterface >& xControl, + const css::uno::Reference< css::frame::XModel >& xModel, + std::unique_ptr<ov::AbstractGeometryAttributes> pGeomHelper); + + // Attributes + virtual sal_Int32 SAL_CALL getValue() override; + virtual void SAL_CALL setValue( sal_Int32 _value ) override; + virtual css::uno::Any SAL_CALL Pages( const css::uno::Any& index ) override; + + //XHelperInterface + virtual OUString getServiceImplName() override; + virtual css::uno::Sequence<OUString> getServiceNames() override; +}; + +#endif // INCLUDED_VBAHELPER_SOURCE_MSFORMS_VBAMULTIPAGE_HXX + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vbahelper/source/msforms/vbanewfont.cxx b/vbahelper/source/msforms/vbanewfont.cxx new file mode 100644 index 000000000..b966d8454 --- /dev/null +++ b/vbahelper/source/msforms/vbanewfont.cxx @@ -0,0 +1,132 @@ +/* -*- 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 <rtl/tencinfo.h> +#include "vbanewfont.hxx" +#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/beans/XPropertySet.hpp> + +using namespace ::com::sun::star; +using namespace ::ooo::vba; + + +VbaNewFont::VbaNewFont( + const uno::Reference< beans::XPropertySet >& rxModelProps ) : + mxProps( rxModelProps, uno::UNO_SET_THROW ) +{ +} + +// XNewFont attributes + +OUString SAL_CALL VbaNewFont::getName() +{ + uno::Any aAny = mxProps->getPropertyValue( "FontName" ); + return aAny.get< OUString >(); +} + +void SAL_CALL VbaNewFont::setName( const OUString& rName ) +{ + mxProps->setPropertyValue( "FontName" , uno::Any( rName ) ); +} + +double SAL_CALL VbaNewFont::getSize() +{ + uno::Any aAny = mxProps->getPropertyValue( "FontHeight" ); + return aAny.get< float >(); +} + +void SAL_CALL VbaNewFont::setSize( double fSize ) +{ + mxProps->setPropertyValue( "FontHeight" , uno::Any( static_cast< float >( fSize ) ) ); +} + +sal_Int16 SAL_CALL VbaNewFont::getCharset() +{ + uno::Any aAny = mxProps->getPropertyValue( "FontCharset" ); + return rtl_getBestWindowsCharsetFromTextEncoding( static_cast< rtl_TextEncoding >( aAny.get< sal_Int16 >() ) ); +} + +void SAL_CALL VbaNewFont::setCharset( sal_Int16 nCharset ) +{ + rtl_TextEncoding eFontEnc = RTL_TEXTENCODING_DONTKNOW; + if( (0 <= nCharset) && (nCharset <= SAL_MAX_UINT8) ) + eFontEnc = rtl_getTextEncodingFromWindowsCharset( static_cast< sal_uInt8 >( nCharset ) ); + if( eFontEnc == RTL_TEXTENCODING_DONTKNOW ) + throw uno::RuntimeException("an unknown or missing encoding"); + mxProps->setPropertyValue( "FontCharset" , uno::Any( static_cast< sal_Int16 >( eFontEnc ) ) ); +} + +sal_Int16 SAL_CALL VbaNewFont::getWeight() +{ + return getBold() ? 700 : 400; +} + +void SAL_CALL VbaNewFont::setWeight( sal_Int16 nWeight ) +{ + setBold( nWeight >= 700 ); +} + +sal_Bool SAL_CALL VbaNewFont::getBold() +{ + uno::Any aAny = mxProps->getPropertyValue( "FontWeight" ); + return aAny.get< float >() > awt::FontWeight::NORMAL; +} + +void SAL_CALL VbaNewFont::setBold( sal_Bool bBold ) +{ + mxProps->setPropertyValue( "FontWeight" , uno::Any( bBold ? awt::FontWeight::BOLD : awt::FontWeight::NORMAL ) ); +} + +sal_Bool SAL_CALL VbaNewFont::getItalic() +{ + uno::Any aAny = mxProps->getPropertyValue( "FontSlant" ); + return aAny.get< awt::FontSlant >() != awt::FontSlant_NONE; +} + +void SAL_CALL VbaNewFont::setItalic( sal_Bool bItalic ) +{ + mxProps->setPropertyValue( "FontSlant" , uno::Any( bItalic ? awt::FontSlant_ITALIC : awt::FontSlant_NONE ) ); +} + +sal_Bool SAL_CALL VbaNewFont::getUnderline() +{ + uno::Any aAny = mxProps->getPropertyValue("FontUnderline" ); + return aAny.get< sal_Int16 >() != awt::FontUnderline::NONE; +} + +void SAL_CALL VbaNewFont::setUnderline( sal_Bool bUnderline ) +{ + mxProps->setPropertyValue("FontUnderline" , uno::Any( bUnderline ? awt::FontUnderline::SINGLE : awt::FontUnderline::NONE ) ); +} + +sal_Bool SAL_CALL VbaNewFont::getStrikethrough() +{ + uno::Any aAny = mxProps->getPropertyValue( "FontStrikeout" ); + return aAny.get< sal_Int16 >() != awt::FontStrikeout::NONE; +} + +void SAL_CALL VbaNewFont::setStrikethrough( sal_Bool bStrikethrough ) +{ + mxProps->setPropertyValue( "FontStrikeout" ,uno::Any( bStrikethrough ? awt::FontStrikeout::SINGLE : awt::FontStrikeout::NONE ) ); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vbahelper/source/msforms/vbanewfont.hxx b/vbahelper/source/msforms/vbanewfont.hxx new file mode 100644 index 000000000..6f00a2724 --- /dev/null +++ b/vbahelper/source/msforms/vbanewfont.hxx @@ -0,0 +1,60 @@ +/* -*- 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 . + */ + +#ifndef INCLUDED_VBAHELPER_SOURCE_MSFORMS_VBANEWFONT_HXX +#define INCLUDED_VBAHELPER_SOURCE_MSFORMS_VBANEWFONT_HXX + +#include <ooo/vba/msforms/XNewFont.hpp> +#include <vbahelper/vbahelper.hxx> +#include <cppuhelper/implbase.hxx> + + +class VbaNewFont : public cppu::WeakImplHelper< ov::msforms::XNewFont > +{ +public: + /// @throws css::uno::RuntimeException + explicit VbaNewFont( + const css::uno::Reference< css::beans::XPropertySet >& rxModelProps ); + + // XNewFont attributes + virtual OUString SAL_CALL getName() override; + virtual void SAL_CALL setName( const OUString& rName ) override; + virtual double SAL_CALL getSize() override; + virtual void SAL_CALL setSize( double fSize ) override; + virtual sal_Int16 SAL_CALL getCharset() override; + virtual void SAL_CALL setCharset( sal_Int16 nCharset ) override; + virtual sal_Int16 SAL_CALL getWeight() override; + virtual void SAL_CALL setWeight( sal_Int16 nWeight ) override; + virtual sal_Bool SAL_CALL getBold() override; + virtual void SAL_CALL setBold( sal_Bool bBold ) override; + virtual sal_Bool SAL_CALL getItalic() override; + virtual void SAL_CALL setItalic( sal_Bool bItalic ) override; + virtual sal_Bool SAL_CALL getUnderline() override; + virtual void SAL_CALL setUnderline( sal_Bool bUnderline ) override; + virtual sal_Bool SAL_CALL getStrikethrough() override; + virtual void SAL_CALL setStrikethrough( sal_Bool bStrikethrough ) override; + +private: + css::uno::Reference< css::beans::XPropertySet > mxProps; +}; + + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vbahelper/source/msforms/vbapages.cxx b/vbahelper/source/msforms/vbapages.cxx new file mode 100644 index 000000000..05e0f25c1 --- /dev/null +++ b/vbahelper/source/msforms/vbapages.cxx @@ -0,0 +1,64 @@ +/* -*- 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 "vbapages.hxx" + +using namespace ::ooo::vba; +using namespace ::com::sun::star; + +ScVbaPages::ScVbaPages( const uno::Reference< XHelperInterface >& xParent, const uno::Reference< uno::XComponentContext >& xContext, const uno::Reference< container::XIndexAccess >& xPages ) : ScVbaPages_BASE( xParent, xContext, xPages ) +{ +} + +uno::Type SAL_CALL +ScVbaPages::getElementType() +{ + // return cppu::UnoType<msforms::XPage>::get(); + return cppu::UnoType<uno::XInterface>::get(); +} + +uno::Any +ScVbaPages::createCollectionObject( const css::uno::Any& aSource ) +{ + return aSource; +} + +OUString +ScVbaPages::getServiceImplName() +{ + return "ScVbaPages"; +} + +uno::Reference< container::XEnumeration > SAL_CALL +ScVbaPages::createEnumeration() +{ + // #STUB + return uno::Reference< container::XEnumeration >(); +} + +uno::Sequence< OUString > +ScVbaPages::getServiceNames() +{ + static uno::Sequence< OUString > const aServiceNames + { + "ooo.vba.msform.Pages" + }; + return aServiceNames; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vbahelper/source/msforms/vbapages.hxx b/vbahelper/source/msforms/vbapages.hxx new file mode 100644 index 000000000..cc42da280 --- /dev/null +++ b/vbahelper/source/msforms/vbapages.hxx @@ -0,0 +1,45 @@ +/* -*- 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 . + */ +#ifndef INCLUDED_VBAHELPER_SOURCE_MSFORMS_VBAPAGES_HXX +#define INCLUDED_VBAHELPER_SOURCE_MSFORMS_VBAPAGES_HXX + +#include <ooo/vba/msforms/XPages.hpp> + +#include <vbahelper/vbacollectionimpl.hxx> +typedef CollTestImplHelper< +ov::msforms::XPages > ScVbaPages_BASE; + +class ScVbaPages : public ScVbaPages_BASE +{ +protected: + virtual OUString getServiceImplName() override; + virtual css::uno::Sequence<OUString> getServiceNames() override; +public: + /// @throws css::lang::IllegalArgumentException + ScVbaPages( const css::uno::Reference< ov::XHelperInterface >& xParent, const css::uno::Reference< css::uno::XComponentContext >& xContext, const css::uno::Reference< css::container::XIndexAccess >& xPages ); + // XEnumerationAccess + virtual css::uno::Type SAL_CALL getElementType() override; + virtual css::uno::Reference< css::container::XEnumeration > SAL_CALL createEnumeration() override; + // ScVbaPages_BASE + virtual css::uno::Any createCollectionObject( const css::uno::Any& aSource ) override; + +}; +#endif // INCLUDED_VBAHELPER_SOURCE_MSFORMS_VBAPAGES_HXX + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vbahelper/source/msforms/vbaprogressbar.cxx b/vbahelper/source/msforms/vbaprogressbar.cxx new file mode 100644 index 000000000..b6c3513ab --- /dev/null +++ b/vbahelper/source/msforms/vbaprogressbar.cxx @@ -0,0 +1,61 @@ +/* -*- 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 "vbaprogressbar.hxx" + +using namespace com::sun::star; +using namespace ooo::vba; + +// uno servicename com.sun.star.awt.UnoControlProgressBarMode +const OUString SVALUE( "ProgressValue" ); + +ScVbaProgressBar::ScVbaProgressBar( const uno::Reference< ov::XHelperInterface >& xParent, const uno::Reference< uno::XComponentContext >& xContext, const uno::Reference< uno::XInterface >& xControl, const uno::Reference< frame::XModel >& xModel, std::unique_ptr<ov::AbstractGeometryAttributes> pGeomHelper ) + : ProgressBarImpl_BASE( xParent, xContext, xControl, xModel, std::move(pGeomHelper) ) +{ +} + +// Attributes +uno::Any SAL_CALL +ScVbaProgressBar::getValue() +{ + return m_xProps->getPropertyValue( SVALUE ); +} + +void SAL_CALL +ScVbaProgressBar::setValue( const uno::Any& _value ) +{ + m_xProps->setPropertyValue( SVALUE, _value ); +} + +OUString +ScVbaProgressBar::getServiceImplName() +{ + return "ScVbaProgressBar"; +} + +uno::Sequence< OUString > +ScVbaProgressBar::getServiceNames() +{ + static uno::Sequence< OUString > const aServiceNames + { + "ooo.vba.msforms.Label" + }; + return aServiceNames; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vbahelper/source/msforms/vbaprogressbar.hxx b/vbahelper/source/msforms/vbaprogressbar.hxx new file mode 100644 index 000000000..8385ce457 --- /dev/null +++ b/vbahelper/source/msforms/vbaprogressbar.hxx @@ -0,0 +1,48 @@ +/* -*- 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 . + */ + +#ifndef INCLUDED_VBAHELPER_SOURCE_MSFORMS_VBAPROGRESSBAR_HXX +#define INCLUDED_VBAHELPER_SOURCE_MSFORMS_VBAPROGRESSBAR_HXX + +#include <ooo/vba/msforms/XProgressBar.hpp> +#include <com/sun/star/script/XDefaultProperty.hpp> + +#include "vbacontrol.hxx" +#include <vbahelper/vbahelper.hxx> +#include <cppuhelper/implbase.hxx> + +typedef cppu::ImplInheritanceHelper< ScVbaControl, ov::msforms::XProgressBar, css::script::XDefaultProperty > ProgressBarImpl_BASE; + +class ScVbaProgressBar : public ProgressBarImpl_BASE +{ +public: + ScVbaProgressBar( const css::uno::Reference< ov::XHelperInterface >& xParent, const css::uno::Reference< css::uno::XComponentContext >& xContext, const css::uno::Reference< css::uno::XInterface >& xControl, const css::uno::Reference< css::frame::XModel >& xModel, std::unique_ptr<ov::AbstractGeometryAttributes> pGeomHelper ); + // Attributes + virtual css::uno::Any SAL_CALL getValue() override; + virtual void SAL_CALL setValue( const css::uno::Any& _value ) override; + //XHelperInterface + virtual OUString getServiceImplName() override; + virtual css::uno::Sequence<OUString> getServiceNames() override; + // XDefaultProperty + OUString SAL_CALL getDefaultPropertyName( ) override { return "Value"; } +}; + +#endif // INCLUDED_VBAHELPER_SOURCE_MSFORMS_VBAPROGRESSBAR_HXX + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vbahelper/source/msforms/vbaradiobutton.cxx b/vbahelper/source/msforms/vbaradiobutton.cxx new file mode 100644 index 000000000..5a00c21e0 --- /dev/null +++ b/vbahelper/source/msforms/vbaradiobutton.cxx @@ -0,0 +1,110 @@ +/* -*- 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 "vbaradiobutton.hxx" +#include "vbanewfont.hxx" + +using namespace com::sun::star; +using namespace ooo::vba; + +ScVbaRadioButton::ScVbaRadioButton( const uno::Reference< XHelperInterface >& xParent, const uno::Reference< uno::XComponentContext >& xContext, const uno::Reference< uno::XInterface >& xControl, const uno::Reference< frame::XModel >& xModel, std::unique_ptr<ov::AbstractGeometryAttributes> pGeomHelper ) + : RadioButtonImpl_BASE( xParent, xContext, xControl, xModel, std::move(pGeomHelper) ) +{ +} + +// Attributes +OUString SAL_CALL +ScVbaRadioButton::getCaption() +{ + OUString Label; + m_xProps->getPropertyValue( "Label" ) >>= Label; + return Label; +} + +void SAL_CALL +ScVbaRadioButton::setCaption( const OUString& _caption ) +{ + m_xProps->setPropertyValue( "Label", uno::makeAny( _caption ) ); +} + +uno::Any SAL_CALL +ScVbaRadioButton::getValue() +{ + sal_Int16 nValue = -1; + m_xProps->getPropertyValue( "State" ) >>= nValue; + if( nValue != 0 ) + nValue = -1; +// return uno::makeAny( nValue ); +// I must be missing something MSO says value should be -1 if selected, 0 if not +// selected + return uno::makeAny( nValue == -1 ); + +} + +void SAL_CALL +ScVbaRadioButton::setValue( const uno::Any& _value ) +{ + sal_Int16 nValue = 0; + sal_Int16 nOldValue = 0; + m_xProps->getPropertyValue( "State" ) >>= nOldValue; + + if( !( _value >>= nValue ) ) + { + bool bValue = false; + _value >>= bValue; + if ( bValue ) + nValue = -1; + } + + if( nValue == -1) + nValue = 1; + m_xProps->setPropertyValue( "State", uno::makeAny( nValue ) ); + if ( nValue != nOldValue ) + { + fireChangeEvent(); + // In Excel, only when the radio button is checked, the click event is fired. + if ( nValue != 0 ) + { + fireClickEvent(); + } + } +} + +uno::Reference< msforms::XNewFont > SAL_CALL ScVbaRadioButton::getFont() +{ + return new VbaNewFont( m_xProps ); +} + +OUString +ScVbaRadioButton::getServiceImplName() +{ + return "ScVbaRadioButton"; +} + +uno::Sequence< OUString > +ScVbaRadioButton::getServiceNames() +{ + static uno::Sequence< OUString > const aServiceNames + { + "ooo.vba.msforms.RadioButton" + }; + return aServiceNames; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vbahelper/source/msforms/vbaradiobutton.hxx b/vbahelper/source/msforms/vbaradiobutton.hxx new file mode 100644 index 000000000..a6f12ae90 --- /dev/null +++ b/vbahelper/source/msforms/vbaradiobutton.hxx @@ -0,0 +1,48 @@ +/* -*- 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 . + */ +#ifndef INCLUDED_VBAHELPER_SOURCE_MSFORMS_VBARADIOBUTTON_HXX +#define INCLUDED_VBAHELPER_SOURCE_MSFORMS_VBARADIOBUTTON_HXX +#include <ooo/vba/msforms/XRadioButton.hpp> +#include <com/sun/star/script/XDefaultProperty.hpp> +#include "vbacontrol.hxx" +#include <vbahelper/vbahelper.hxx> +#include <cppuhelper/implbase.hxx> + +typedef cppu::ImplInheritanceHelper< ScVbaControl, ov::msforms::XRadioButton, css::script::XDefaultProperty > RadioButtonImpl_BASE; + +class ScVbaRadioButton : public RadioButtonImpl_BASE +{ +public: + ScVbaRadioButton( const css::uno::Reference< ov::XHelperInterface >& xParent, const css::uno::Reference< css::uno::XComponentContext >& xContext, const css::uno::Reference< css::uno::XInterface >& xControl, const css::uno::Reference< css::frame::XModel >& xModel, std::unique_ptr<ov::AbstractGeometryAttributes> pGeomHelper ); + // Attributes + virtual OUString SAL_CALL getCaption() override; + virtual void SAL_CALL setCaption( const OUString& _caption ) override; + virtual css::uno::Any SAL_CALL getValue() override; + virtual void SAL_CALL setValue(const css::uno::Any&) override; + virtual css::uno::Reference< ov::msforms::XNewFont > SAL_CALL getFont() override; + //XHelperInterface + virtual OUString getServiceImplName() override; + virtual css::uno::Sequence<OUString> getServiceNames() override; + // XDefaultProperty + OUString SAL_CALL getDefaultPropertyName( ) override { return "Value"; } + +}; +#endif // INCLUDED_VBAHELPER_SOURCE_MSFORMS_VBARADIOBUTTON_HXX + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vbahelper/source/msforms/vbascrollbar.cxx b/vbahelper/source/msforms/vbascrollbar.cxx new file mode 100644 index 000000000..4968c7282 --- /dev/null +++ b/vbahelper/source/msforms/vbascrollbar.cxx @@ -0,0 +1,115 @@ +/* -*- 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 "vbascrollbar.hxx" + +using namespace com::sun::star; +using namespace ooo::vba; + +ScVbaScrollBar::ScVbaScrollBar( const css::uno::Reference< ov::XHelperInterface >& xParent, const uno::Reference< uno::XComponentContext >& xContext, const uno::Reference< uno::XInterface >& xControl, const uno::Reference< frame::XModel >& xModel, std::unique_ptr<AbstractGeometryAttributes> pGeomHelper ) + : ScrollBarImpl_BASE( xParent, xContext, xControl, xModel, std::move(pGeomHelper) ) +{ +} + +// Attributes +uno::Any SAL_CALL +ScVbaScrollBar::getValue() +{ + return m_xProps->getPropertyValue( "ScrollValue" ); +} + +void SAL_CALL +ScVbaScrollBar::setValue( const uno::Any& _value ) +{ + m_xProps->setPropertyValue( "ScrollValue", _value ); +} + +::sal_Int32 SAL_CALL +ScVbaScrollBar::getMax() +{ + sal_Int32 nMax = 0; + m_xProps->getPropertyValue( "ScrollValueMax" ) >>= nMax; + return nMax; +} + +void SAL_CALL +ScVbaScrollBar::setMax( sal_Int32 nVal ) +{ + m_xProps->setPropertyValue( "ScrollValueMax", uno::makeAny( nVal ) ); +} + +::sal_Int32 SAL_CALL +ScVbaScrollBar::getMin() +{ + sal_Int32 nVal = 0; + m_xProps->getPropertyValue( "ScrollValueMin" ) >>= nVal; + return nVal; +} + +void SAL_CALL +ScVbaScrollBar::setMin( sal_Int32 nVal ) +{ + m_xProps->setPropertyValue( "ScrollValueMin", uno::makeAny( nVal ) ); +} + +void SAL_CALL +ScVbaScrollBar::setLargeChange( ::sal_Int32 _largechange ) +{ + m_xProps->setPropertyValue( "BlockIncrement", uno::makeAny( _largechange ) ); +} + +::sal_Int32 SAL_CALL +ScVbaScrollBar::getLargeChange() +{ + sal_Int32 nVal = 0; + m_xProps->getPropertyValue( "BlockIncrement" ) >>= nVal; + return nVal; +} + +::sal_Int32 SAL_CALL +ScVbaScrollBar::getSmallChange() +{ + sal_Int32 nSmallChange = 0; + m_xProps->getPropertyValue( "LineIncrement" ) >>= nSmallChange; + return nSmallChange; +} + +void SAL_CALL +ScVbaScrollBar::setSmallChange( ::sal_Int32 _smallchange ) +{ + m_xProps->setPropertyValue( "LineIncrement", uno::makeAny( _smallchange ) ); +} + +OUString +ScVbaScrollBar::getServiceImplName() +{ + return "ScVbaScrollBar"; +} + +uno::Sequence< OUString > +ScVbaScrollBar::getServiceNames() +{ + static uno::Sequence< OUString > const aServiceNames + { + "ooo.vba.msforms.Frame" + }; + return aServiceNames; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vbahelper/source/msforms/vbascrollbar.hxx b/vbahelper/source/msforms/vbascrollbar.hxx new file mode 100644 index 000000000..e695e36b3 --- /dev/null +++ b/vbahelper/source/msforms/vbascrollbar.hxx @@ -0,0 +1,55 @@ +/* -*- 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 . + */ + +#ifndef INCLUDED_VBAHELPER_SOURCE_MSFORMS_VBASCROLLBAR_HXX +#define INCLUDED_VBAHELPER_SOURCE_MSFORMS_VBASCROLLBAR_HXX + +#include <cppuhelper/implbase.hxx> +#include <ooo/vba/msforms/XScrollBar.hpp> + +#include "vbacontrol.hxx" +#include <vbahelper/vbahelper.hxx> + +typedef cppu::ImplInheritanceHelper< ScVbaControl, ov::msforms::XScrollBar > ScrollBarImpl_BASE; + +class ScVbaScrollBar : public ScrollBarImpl_BASE +{ +public: + ScVbaScrollBar( const css::uno::Reference< ov::XHelperInterface >& xParent, const css::uno::Reference< css::uno::XComponentContext >& xContext, const css::uno::Reference< css::uno::XInterface >& xControl, const css::uno::Reference< css::frame::XModel >& xModel, std::unique_ptr<ov::AbstractGeometryAttributes> pGeomHelper ); + // Attributes + virtual css::uno::Any SAL_CALL getValue() override; + virtual void SAL_CALL setValue( const css::uno::Any& _value ) override; + virtual ::sal_Int32 SAL_CALL getMax() override; + virtual void SAL_CALL setMax( ::sal_Int32 _max ) override; + virtual ::sal_Int32 SAL_CALL getMin() override; + virtual void SAL_CALL setMin( ::sal_Int32 _min ) override; + virtual ::sal_Int32 SAL_CALL getLargeChange() override; + virtual void SAL_CALL setLargeChange( ::sal_Int32 _largechange ) override; + virtual ::sal_Int32 SAL_CALL getSmallChange() override; + virtual void SAL_CALL setSmallChange( ::sal_Int32 _smallchange ) override; + + + //XHelperInterface + virtual OUString getServiceImplName() override; + virtual css::uno::Sequence<OUString> getServiceNames() override; +}; + +#endif // INCLUDED_VBAHELPER_SOURCE_MSFORMS_VBASCROLLBAR_HXX + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vbahelper/source/msforms/vbaspinbutton.cxx b/vbahelper/source/msforms/vbaspinbutton.cxx new file mode 100644 index 000000000..3180f4861 --- /dev/null +++ b/vbahelper/source/msforms/vbaspinbutton.cxx @@ -0,0 +1,87 @@ +/* -*- 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 "vbaspinbutton.hxx" + +using namespace com::sun::star; +using namespace ooo::vba; + +ScVbaSpinButton::ScVbaSpinButton( const css::uno::Reference< ov::XHelperInterface >& xParent, const uno::Reference< uno::XComponentContext >& xContext, const uno::Reference< uno::XInterface >& xControl, const uno::Reference< frame::XModel >& xModel, std::unique_ptr<AbstractGeometryAttributes> pGeomHelper ) + : SpinButtonImpl_BASE( xParent, xContext, xControl, xModel, std::move(pGeomHelper) ) +{ +} + +// Attributes +uno::Any SAL_CALL +ScVbaSpinButton::getValue() +{ + return m_xProps->getPropertyValue( "SpinValue" ); +} + +void SAL_CALL +ScVbaSpinButton::setValue( const uno::Any& _value ) +{ + m_xProps->setPropertyValue( "SpinValue", _value ); +} + +::sal_Int32 SAL_CALL +ScVbaSpinButton::getMax() +{ + sal_Int32 nMax = 0; + m_xProps->getPropertyValue( "SpinValueMax" ) >>= nMax; + return nMax; +} + +void SAL_CALL +ScVbaSpinButton::setMax( sal_Int32 nVal ) +{ + m_xProps->setPropertyValue( "SpinValueMax", uno::makeAny( nVal ) ); +} + +::sal_Int32 SAL_CALL +ScVbaSpinButton::getMin() +{ + sal_Int32 nVal = 0; + m_xProps->getPropertyValue( "SpinValueMin" ) >>= nVal; + return nVal; +} + +void SAL_CALL +ScVbaSpinButton::setMin( sal_Int32 nVal ) +{ + m_xProps->setPropertyValue( "SpinValueMin", uno::makeAny( nVal ) ); +} + +OUString +ScVbaSpinButton::getServiceImplName() +{ + return "ScVbaSpinButton"; +} + +uno::Sequence< OUString > +ScVbaSpinButton::getServiceNames() +{ + static uno::Sequence< OUString > const aServiceNames + { + "ooo.vba.msforms.Frame" + }; + return aServiceNames; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vbahelper/source/msforms/vbaspinbutton.hxx b/vbahelper/source/msforms/vbaspinbutton.hxx new file mode 100644 index 000000000..38f619679 --- /dev/null +++ b/vbahelper/source/msforms/vbaspinbutton.hxx @@ -0,0 +1,47 @@ +/* -*- 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 . + */ +#ifndef INCLUDED_VBAHELPER_SOURCE_MSFORMS_VBASPINBUTTON_HXX +#define INCLUDED_VBAHELPER_SOURCE_MSFORMS_VBASPINBUTTON_HXX +#include <cppuhelper/implbase.hxx> +#include <ooo/vba/msforms/XSpinButton.hpp> + +#include "vbacontrol.hxx" +#include <vbahelper/vbahelper.hxx> + +typedef cppu::ImplInheritanceHelper< ScVbaControl, ov::msforms::XSpinButton > SpinButtonImpl_BASE; + +class ScVbaSpinButton : public SpinButtonImpl_BASE +{ +public: + ScVbaSpinButton( const css::uno::Reference< ov::XHelperInterface >& xParent, const css::uno::Reference< css::uno::XComponentContext >& xContext, const css::uno::Reference< css::uno::XInterface >& xControl, const css::uno::Reference< css::frame::XModel >& xModel, std::unique_ptr<ov::AbstractGeometryAttributes> pGeomHelper ); + // Attributes + virtual css::uno::Any SAL_CALL getValue() override; + virtual void SAL_CALL setValue( const css::uno::Any& _value ) override; + virtual ::sal_Int32 SAL_CALL getMax() override; + virtual void SAL_CALL setMax( ::sal_Int32 _max ) override; + virtual ::sal_Int32 SAL_CALL getMin() override; + virtual void SAL_CALL setMin( ::sal_Int32 _min ) override; + + //XHelperInterface + virtual OUString getServiceImplName() override; + virtual css::uno::Sequence<OUString> getServiceNames() override; +}; +#endif // INCLUDED_VBAHELPER_SOURCE_MSFORMS_VBASPINBUTTON_HXX + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vbahelper/source/msforms/vbasystemaxcontrol.cxx b/vbahelper/source/msforms/vbasystemaxcontrol.cxx new file mode 100644 index 000000000..ea135e270 --- /dev/null +++ b/vbahelper/source/msforms/vbasystemaxcontrol.cxx @@ -0,0 +1,85 @@ +/* -*- 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 "vbasystemaxcontrol.hxx" + +using namespace com::sun::star; +using namespace ooo::vba; + + +VbaSystemAXControl::VbaSystemAXControl( const uno::Reference< ov::XHelperInterface >& xParent, const uno::Reference< uno::XComponentContext >& xContext, const uno::Reference< uno::XInterface >& xControl, const uno::Reference< frame::XModel >& xModel, std::unique_ptr<AbstractGeometryAttributes> pGeomHelper ) +: SystemAXControlImpl_BASE( xParent, xContext, xControl, xModel, std::move(pGeomHelper) ) +, m_xControlInvocation( xControl, uno::UNO_QUERY_THROW ) +{ +} + + +uno::Reference< beans::XIntrospectionAccess > SAL_CALL VbaSystemAXControl::getIntrospection() +{ + return m_xControlInvocation->getIntrospection(); +} + + +uno::Any SAL_CALL VbaSystemAXControl::invoke( const OUString& aFunctionName, const uno::Sequence< uno::Any >& aParams, uno::Sequence< ::sal_Int16 >& aOutParamIndex, uno::Sequence< uno::Any >& aOutParam ) +{ + return m_xControlInvocation->invoke( aFunctionName, aParams, aOutParamIndex, aOutParam ); +} + + +void SAL_CALL VbaSystemAXControl::setValue( const OUString& aPropertyName, const uno::Any& aValue ) +{ + m_xControlInvocation->setValue( aPropertyName, aValue ); +} + + +uno::Any SAL_CALL VbaSystemAXControl::getValue( const OUString& aPropertyName ) +{ + return m_xControlInvocation->getValue( aPropertyName ); +} + + +sal_Bool SAL_CALL VbaSystemAXControl::hasMethod( const OUString& aName ) +{ + return m_xControlInvocation->hasMethod( aName ); +} + + +sal_Bool SAL_CALL VbaSystemAXControl::hasProperty( const OUString& aName ) +{ + return m_xControlInvocation->hasProperty( aName ); +} + + +OUString +VbaSystemAXControl::getServiceImplName() +{ + return "VbaSystemAXControl"; +} + + +uno::Sequence< OUString > +VbaSystemAXControl::getServiceNames() +{ + static uno::Sequence< OUString > const aServiceNames + { + "ooo.vba.msforms.Frame" + }; + return aServiceNames; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vbahelper/source/msforms/vbasystemaxcontrol.hxx b/vbahelper/source/msforms/vbasystemaxcontrol.hxx new file mode 100644 index 000000000..40f575c8b --- /dev/null +++ b/vbahelper/source/msforms/vbasystemaxcontrol.hxx @@ -0,0 +1,52 @@ +/* -*- 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 . + */ +#ifndef INCLUDED_VBAHELPER_SOURCE_MSFORMS_VBASYSTEMAXCONTROL_HXX +#define INCLUDED_VBAHELPER_SOURCE_MSFORMS_VBASYSTEMAXCONTROL_HXX + +#include <cppuhelper/implbase.hxx> +#include <com/sun/star/script/XInvocation.hpp> + +#include "vbacontrol.hxx" +#include <vbahelper/vbahelper.hxx> + +typedef cppu::ImplInheritanceHelper< ScVbaControl, css::script::XInvocation > SystemAXControlImpl_BASE; + +class VbaSystemAXControl : public SystemAXControlImpl_BASE +{ + css::uno::Reference< css::script::XInvocation > m_xControlInvocation; + +public: + VbaSystemAXControl( const css::uno::Reference< ov::XHelperInterface >& xParent, const css::uno::Reference< css::uno::XComponentContext >& xContext, const css::uno::Reference< css::uno::XInterface >& xControl, const css::uno::Reference< css::frame::XModel >& xModel, std::unique_ptr<ov::AbstractGeometryAttributes> pGeomHelper ); + + // XInvocation + virtual css::uno::Reference< css::beans::XIntrospectionAccess > SAL_CALL getIntrospection( ) override; + virtual css::uno::Any SAL_CALL invoke( const OUString& aFunctionName, const css::uno::Sequence< css::uno::Any >& aParams, css::uno::Sequence< ::sal_Int16 >& aOutParamIndex, css::uno::Sequence< css::uno::Any >& aOutParam ) override; + virtual void SAL_CALL setValue( const OUString& aPropertyName, const css::uno::Any& aValue ) override; + virtual css::uno::Any SAL_CALL getValue( const OUString& aPropertyName ) override; + virtual sal_Bool SAL_CALL hasMethod( const OUString& aName ) override; + virtual sal_Bool SAL_CALL hasProperty( const OUString& aName ) override; + + //XHelperInterface + virtual OUString getServiceImplName() override; + virtual css::uno::Sequence<OUString> getServiceNames() override; +}; + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vbahelper/source/msforms/vbatextbox.cxx b/vbahelper/source/msforms/vbatextbox.cxx new file mode 100644 index 000000000..59f736d48 --- /dev/null +++ b/vbahelper/source/msforms/vbatextbox.cxx @@ -0,0 +1,183 @@ +/* -*- 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 "vbatextbox.hxx" +#include "vbanewfont.hxx" +#include <com/sun/star/text/XTextRange.hpp> +#include <ooo/vba/msforms/fmBorderStyle.hpp> +#include <ooo/vba/msforms/fmSpecialEffect.hpp> + +using namespace com::sun::star; +using namespace ooo::vba; + +ScVbaTextBox::ScVbaTextBox( const uno::Reference< ov::XHelperInterface >& xParent, const uno::Reference< uno::XComponentContext >& xContext, const uno::Reference< uno::XInterface >& xControl, const uno::Reference< frame::XModel >& xModel, std::unique_ptr<AbstractGeometryAttributes> pGeomHelper, bool bDialog ) + : TextBoxImpl_BASE( xParent, xContext, xControl, xModel, std::move(pGeomHelper) ), mbDialog( bDialog ) +{ +} + +// Attributes +uno::Any SAL_CALL +ScVbaTextBox::getValue() +{ + return uno::makeAny( getText() ); +} + +void SAL_CALL +ScVbaTextBox::setValue( const uno::Any& _value ) +{ + // booleans are converted to uppercase strings + OUString sVal = extractStringFromAny( _value, true ); + setText( sVal ); +} + +//getString() will cause some info lose. +OUString SAL_CALL +ScVbaTextBox::getText() +{ + uno::Any aValue = m_xProps->getPropertyValue( "Text" ); + OUString sString; + aValue >>= sString; + return sString; +} + +void SAL_CALL +ScVbaTextBox::setText( const OUString& _text ) +{ + OUString oldText( getText() ); + if ( !mbDialog ) + { + uno::Reference< text::XTextRange > xTextRange( m_xProps, uno::UNO_QUERY_THROW ); + xTextRange->setString( _text ); + } + else + m_xProps->setPropertyValue( "Text" , uno::makeAny( _text ) ); + if ( oldText != _text ) + fireChangeEvent(); +} + +sal_Int32 SAL_CALL +ScVbaTextBox::getMaxLength() +{ + uno::Any aValue = m_xProps->getPropertyValue( "MaxTextLen" ); + sal_Int16 nMaxLength = 0; + aValue >>= nMaxLength; + return static_cast<sal_Int32>(nMaxLength); +} + +void SAL_CALL +ScVbaTextBox::setMaxLength( sal_Int32 _maxlength ) +{ + sal_Int16 nTmp( _maxlength ); + uno::Any aValue( nTmp ); + m_xProps->setPropertyValue( "MaxTextLen" , aValue); +} + +sal_Bool SAL_CALL +ScVbaTextBox::getMultiline() +{ + uno::Any aValue = m_xProps->getPropertyValue( "MultiLine" ); + bool bRet = false; + aValue >>= bRet; + return bRet; +} + +void SAL_CALL +ScVbaTextBox::setMultiline( sal_Bool _multiline ) +{ + uno::Any aValue( _multiline ); + m_xProps->setPropertyValue( "MultiLine" , aValue); +} + +sal_Int32 SAL_CALL ScVbaTextBox::getSpecialEffect() +{ + return msforms::fmSpecialEffect::fmSpecialEffectSunken; +} + +void SAL_CALL ScVbaTextBox::setSpecialEffect( sal_Int32 /*nSpecialEffect*/ ) +{ + // #STUB +} + +sal_Int32 SAL_CALL ScVbaTextBox::getBorderStyle() +{ + return msforms::fmBorderStyle::fmBorderStyleNone; +} + +void SAL_CALL ScVbaTextBox::setBorderStyle( sal_Int32 /*nBorderStyle*/ ) +{ + // #STUB +} + +sal_Int32 SAL_CALL ScVbaTextBox::getTextLength() +{ + return getText().getLength(); +} + +uno::Reference< msforms::XNewFont > SAL_CALL ScVbaTextBox::getFont() +{ + return new VbaNewFont( m_xProps ); +} + +sal_Int32 SAL_CALL ScVbaTextBox::getBackColor() +{ + return ScVbaControl::getBackColor(); +} + +void SAL_CALL ScVbaTextBox::setBackColor( sal_Int32 nBackColor ) +{ + ScVbaControl::setBackColor( nBackColor ); +} + +sal_Bool SAL_CALL ScVbaTextBox::getAutoSize() +{ + return ScVbaControl::getAutoSize(); +} + +void SAL_CALL ScVbaTextBox::setAutoSize( sal_Bool bAutoSize ) +{ + ScVbaControl::setAutoSize( bAutoSize ); +} + +sal_Bool SAL_CALL ScVbaTextBox::getLocked() +{ + return ScVbaControl::getLocked(); +} + +void SAL_CALL ScVbaTextBox::setLocked( sal_Bool bLocked ) +{ + ScVbaControl::setLocked( bLocked ); +} + +OUString +ScVbaTextBox::getServiceImplName() +{ + return "ScVbaTextBox"; +} + +uno::Sequence< OUString > +ScVbaTextBox::getServiceNames() +{ + static uno::Sequence< OUString > const aServiceNames + { + "ooo.vba.msforms.TextBox" + }; + return aServiceNames; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vbahelper/source/msforms/vbatextbox.hxx b/vbahelper/source/msforms/vbatextbox.hxx new file mode 100644 index 000000000..9a2b96942 --- /dev/null +++ b/vbahelper/source/msforms/vbatextbox.hxx @@ -0,0 +1,67 @@ +/* -*- 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 . + */ + +#ifndef INCLUDED_VBAHELPER_SOURCE_MSFORMS_VBATEXTBOX_HXX +#define INCLUDED_VBAHELPER_SOURCE_MSFORMS_VBATEXTBOX_HXX + +#include <cppuhelper/implbase.hxx> +#include <ooo/vba/msforms/XTextBox.hpp> +#include <com/sun/star/script/XDefaultProperty.hpp> +#include "vbacontrol.hxx" +#include <vbahelper/vbahelper.hxx> + +typedef cppu::ImplInheritanceHelper< ScVbaControl, ov::msforms::XTextBox, css::script::XDefaultProperty > TextBoxImpl_BASE; + +class ScVbaTextBox : public TextBoxImpl_BASE +{ + bool mbDialog; +public: + ScVbaTextBox( const css::uno::Reference< ov::XHelperInterface >& xParent, const css::uno::Reference< css::uno::XComponentContext >& xContext, const css::uno::Reference< css::uno::XInterface >& xControl, const css::uno::Reference< css::frame::XModel >& xModel, std::unique_ptr<ov::AbstractGeometryAttributes> pGeomHelper, bool bDialog = false ); + // Attributes + virtual css::uno::Any SAL_CALL getValue() override; + virtual void SAL_CALL setValue( const css::uno::Any& _value ) override; + virtual OUString SAL_CALL getText() override; + virtual void SAL_CALL setText( const OUString& _text ) override; + virtual sal_Int32 SAL_CALL getMaxLength() override; + virtual void SAL_CALL setMaxLength( sal_Int32 _maxlength ) override; + virtual sal_Bool SAL_CALL getMultiline() override; + virtual void SAL_CALL setMultiline( sal_Bool _multiline ) override; + virtual sal_Int32 SAL_CALL getSpecialEffect() override; + virtual void SAL_CALL setSpecialEffect( sal_Int32 nSpecialEffect ) override; + virtual sal_Int32 SAL_CALL getBorderStyle() override; + virtual void SAL_CALL setBorderStyle( sal_Int32 nBorderStyle ) override; + virtual sal_Int32 SAL_CALL getTextLength() override; + virtual css::uno::Reference< ov::msforms::XNewFont > SAL_CALL getFont() override; + virtual sal_Int32 SAL_CALL getBackColor() override; + virtual void SAL_CALL setBackColor( sal_Int32 nBackColor ) override; + virtual sal_Bool SAL_CALL getAutoSize() override; + virtual void SAL_CALL setAutoSize( sal_Bool bAutoSize ) override; + virtual sal_Bool SAL_CALL getLocked() override; + virtual void SAL_CALL setLocked( sal_Bool bAutoSize ) override; + + // XDefaultProperty + OUString SAL_CALL getDefaultPropertyName( ) override { return "Value"; } + //XHelperInterface + virtual OUString getServiceImplName() override; + virtual css::uno::Sequence<OUString> getServiceNames() override; +}; + +#endif // INCLUDED_VBAHELPER_SOURCE_MSFORMS_VBATEXTBOX_HXX + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vbahelper/source/msforms/vbatogglebutton.cxx b/vbahelper/source/msforms/vbatogglebutton.cxx new file mode 100644 index 000000000..fbb7c267a --- /dev/null +++ b/vbahelper/source/msforms/vbatogglebutton.cxx @@ -0,0 +1,164 @@ +/* -*- 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 "vbatogglebutton.hxx" +#include "vbanewfont.hxx" +#include <sal/log.hxx> + +using namespace com::sun::star; +using namespace ooo::vba; + +ScVbaToggleButton::ScVbaToggleButton( const css::uno::Reference< ov::XHelperInterface >& xParent, const uno::Reference< uno::XComponentContext >& xContext, const uno::Reference< uno::XInterface >& xControl, const uno::Reference< frame::XModel >& xModel, std::unique_ptr<ov::AbstractGeometryAttributes> pGeomHelper ) + : ToggleButtonImpl_BASE( xParent, xContext, xControl, xModel, std::move(pGeomHelper) ) +{ + SAL_INFO("vbahelper", "ScVbaToggleButton(ctor)"); + m_xProps->setPropertyValue( "Toggle", uno::makeAny( true ) ); +} + +ScVbaToggleButton::~ScVbaToggleButton() +{ + SAL_INFO("vbahelper", "~ScVbaToggleButton(dtor)"); +} + +// Attributes +OUString SAL_CALL +ScVbaToggleButton::getCaption() +{ + OUString Label; + m_xProps->getPropertyValue( "Label" ) >>= Label; + return Label; +} + +void SAL_CALL +ScVbaToggleButton::setCaption( const OUString& _caption ) +{ + m_xProps->setPropertyValue( "Label", uno::makeAny( _caption ) ); +} + +uno::Any SAL_CALL +ScVbaToggleButton::getValue() +{ + sal_Int16 nState = 0; + m_xProps->getPropertyValue( "State" ) >>= nState; + return uno::makeAny( nState ? sal_Int16( -1 ) : sal_Int16( 0 ) ); +} + + +void SAL_CALL +ScVbaToggleButton::setValue( const uno::Any& _value ) +{ + sal_Int16 nState = 0; + if ( ! ( _value >>= nState ) ) + { + bool bState = false; + _value >>= bState; + if ( bState ) + nState = -1; + } + SAL_INFO("vbahelper", "nState - " << nState ); + nState = ( nState == -1 ) ? 1 : 0; + SAL_INFO("vbahelper", "nState - " << nState ); + m_xProps->setPropertyValue( "State", uno::makeAny( nState ) ); +} + +sal_Bool SAL_CALL ScVbaToggleButton::getAutoSize() +{ + return ScVbaControl::getAutoSize(); +} + +void SAL_CALL ScVbaToggleButton::setAutoSize( sal_Bool bAutoSize ) +{ + ScVbaControl::setAutoSize( bAutoSize ); +} + +sal_Bool SAL_CALL ScVbaToggleButton::getCancel() +{ + // #STUB + return false; +} + +void SAL_CALL ScVbaToggleButton::setCancel( sal_Bool /*bCancel*/ ) +{ + // #STUB +} + +sal_Bool SAL_CALL ScVbaToggleButton::getDefault() +{ + // #STUB + return false; +} + +void SAL_CALL ScVbaToggleButton::setDefault( sal_Bool /*bDefault*/ ) +{ + // #STUB +} + +sal_Int32 SAL_CALL ScVbaToggleButton::getBackColor() +{ + return ScVbaControl::getBackColor(); +} + +void SAL_CALL ScVbaToggleButton::setBackColor( sal_Int32 nBackColor ) +{ + ScVbaControl::setBackColor( nBackColor ); +} + +sal_Int32 SAL_CALL ScVbaToggleButton::getForeColor() +{ + // #STUB + return 0; +} + +void SAL_CALL ScVbaToggleButton::setForeColor( sal_Int32 /*nForeColor*/ ) +{ + // #STUB +} + +uno::Reference< msforms::XNewFont > SAL_CALL ScVbaToggleButton::getFont() +{ + return new VbaNewFont( m_xProps ); +} + +sal_Bool SAL_CALL ScVbaToggleButton::getLocked() +{ + return ScVbaControl::getLocked(); +} + +void SAL_CALL ScVbaToggleButton::setLocked( sal_Bool bLocked ) +{ + ScVbaControl::setLocked( bLocked ); +} + +OUString +ScVbaToggleButton::getServiceImplName() +{ + return "ScVbaToggleButton"; +} + +uno::Sequence< OUString > +ScVbaToggleButton::getServiceNames() +{ + static uno::Sequence< OUString > const aServiceNames + { + "ooo.vba.msforms.ToggleButton" + }; + return aServiceNames; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vbahelper/source/msforms/vbatogglebutton.hxx b/vbahelper/source/msforms/vbatogglebutton.hxx new file mode 100644 index 000000000..61be1a672 --- /dev/null +++ b/vbahelper/source/msforms/vbatogglebutton.hxx @@ -0,0 +1,61 @@ +/* -*- 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 . + */ +#ifndef INCLUDED_VBAHELPER_SOURCE_MSFORMS_VBATOGGLEBUTTON_HXX +#define INCLUDED_VBAHELPER_SOURCE_MSFORMS_VBATOGGLEBUTTON_HXX +#include <cppuhelper/implbase.hxx> +#include <ooo/vba/msforms/XToggleButton.hpp> +#include <com/sun/star/script/XDefaultProperty.hpp> + +#include "vbacontrol.hxx" +#include <vbahelper/vbahelper.hxx> + +typedef cppu::ImplInheritanceHelper< ScVbaControl, ov::msforms::XToggleButton, css::script::XDefaultProperty > ToggleButtonImpl_BASE; + +class ScVbaToggleButton : public ToggleButtonImpl_BASE +{ +public: + ScVbaToggleButton( const css::uno::Reference< ov::XHelperInterface >& xParent, const css::uno::Reference< css::uno::XComponentContext >& xContext, const css::uno::Reference< css::uno::XInterface >& xControl, const css::uno::Reference< css::frame::XModel >& xModel, std::unique_ptr<ov::AbstractGeometryAttributes> pGeomHelper ); + virtual ~ScVbaToggleButton() override; + // Attributes + virtual css::uno::Any SAL_CALL getValue() override; + virtual void SAL_CALL setValue( const css::uno::Any& _value ) override; + virtual OUString SAL_CALL getCaption() override; + virtual void SAL_CALL setCaption( const OUString& _caption ) override; + virtual sal_Bool SAL_CALL getAutoSize() override; + virtual void SAL_CALL setAutoSize( sal_Bool bAutoSize ) override; + virtual sal_Bool SAL_CALL getCancel() override; + virtual void SAL_CALL setCancel( sal_Bool bCancel ) override; + virtual sal_Bool SAL_CALL getDefault() override; + virtual void SAL_CALL setDefault( sal_Bool bDefault ) override; + virtual sal_Int32 SAL_CALL getBackColor() override; + virtual void SAL_CALL setBackColor( sal_Int32 nBackColor ) override; + virtual sal_Int32 SAL_CALL getForeColor() override; + virtual void SAL_CALL setForeColor( sal_Int32 nForeColor ) override; + virtual sal_Bool SAL_CALL getLocked() override; + virtual void SAL_CALL setLocked( sal_Bool bAutoSize ) override; + virtual css::uno::Reference< ov::msforms::XNewFont > SAL_CALL getFont() override; + //XHelperInterface + virtual OUString getServiceImplName() override; + virtual css::uno::Sequence<OUString> getServiceNames() override; + // XDefaultProperty + OUString SAL_CALL getDefaultPropertyName( ) override { return "Value"; } +}; +#endif // INCLUDED_VBAHELPER_SOURCE_MSFORMS_VBATOGGLEBUTTON_HXX + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vbahelper/source/msforms/vbauserform.cxx b/vbahelper/source/msforms/vbauserform.cxx new file mode 100644 index 000000000..a89ab604a --- /dev/null +++ b/vbahelper/source/msforms/vbauserform.cxx @@ -0,0 +1,320 @@ +/* -*- 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 <vbahelper/helperdecl.hxx> +#include "service.hxx" +#include "vbauserform.hxx" +#include <com/sun/star/awt/XControl.hpp> +#include <com/sun/star/awt/XControlContainer.hpp> +#include <com/sun/star/awt/XWindow2.hpp> +#include <com/sun/star/awt/PosSize.hpp> +#include <com/sun/star/container/XNameContainer.hpp> +#include <com/sun/star/frame/XController.hpp> +#include <com/sun/star/frame/XModel.hpp> +#include <com/sun/star/script/XDefaultProperty.hpp> +#include "vbacontrols.hxx" +#include <sal/log.hxx> + +using namespace ::ooo::vba; +using namespace ::com::sun::star; + +// some little notes +// XDialog implementation has the following interesting bits +// a Controls property ( which is an array of the container controls ) +// each item in the controls array is a XControl, where the model is +// basically a property bag +// additionally the XDialog instance has itself a model +// this model has a ControlModels ( array of models ) property +// the models in ControlModels can be accessed by name +// also the XDialog is a XControl ( to access the model above + +ScVbaUserForm::ScVbaUserForm( uno::Sequence< uno::Any > const& aArgs, uno::Reference< uno::XComponentContext >const& xContext ) + : ScVbaUserForm_BASE( getXSomethingFromArgs< XHelperInterface >( aArgs, 0 ), xContext, getXSomethingFromArgs< uno::XInterface >( aArgs, 1 ), getXSomethingFromArgs< frame::XModel >( aArgs, 2 ), nullptr ), + mbDispose( true ) +{ + m_xDialog.set( m_xControl, uno::UNO_QUERY_THROW ); + uno::Reference< awt::XControl > xControl( m_xDialog, uno::UNO_QUERY_THROW ); + m_xProps.set( xControl->getModel(), uno::UNO_QUERY_THROW ); + setGeometryHelper( std::make_unique<UserFormGeometryHelper>( xControl, 0.0, 0.0 ) ); + if ( aArgs.getLength() >= 4 ) + aArgs[ 3 ] >>= m_sLibName; +} + +ScVbaUserForm::~ScVbaUserForm() +{ +} + +void SAL_CALL +ScVbaUserForm::Show( ) +{ + SAL_INFO("vbahelper", "ScVbaUserForm::Show( )"); + short aRet = 0; + mbDispose = true; + + if ( m_xDialog.is() ) + { + // try to center dialog on model window + if( m_xModel.is() ) try + { + uno::Reference< frame::XController > xController( m_xModel->getCurrentController(), uno::UNO_SET_THROW ); + uno::Reference< frame::XFrame > xFrame( xController->getFrame(), uno::UNO_SET_THROW ); + uno::Reference< awt::XWindow > xWindow( xFrame->getContainerWindow(), uno::UNO_SET_THROW ); + awt::Rectangle aPosSize = xWindow->getPosSize(); // already in pixel + + uno::Reference< awt::XControl > xControl( m_xDialog, uno::UNO_QUERY_THROW ); + uno::Reference< awt::XWindow > xControlWindow( xControl->getPeer(), uno::UNO_QUERY_THROW ); + xControlWindow->setPosSize(static_cast<sal_Int32>((aPosSize.Width - getWidth()) / 2.0), static_cast<sal_Int32>((aPosSize.Height - getHeight()) / 2.0), 0, 0, awt::PosSize::POS ); + } + catch( uno::Exception& ) + { + } + + aRet = m_xDialog->execute(); + } + SAL_INFO("vbahelper", "ScVbaUserForm::Show() execute returned " << aRet); + if ( mbDispose ) + { + try + { + uno::Reference< lang::XComponent > xComp( m_xDialog, uno::UNO_QUERY_THROW ); + m_xDialog = nullptr; + xComp->dispose(); + mbDispose = false; + } + catch( uno::Exception& ) + { + } + } +} + +OUString SAL_CALL +ScVbaUserForm::getCaption() +{ + OUString sCaption; + m_xProps->getPropertyValue( "Title" ) >>= sCaption; + return sCaption; +} +void +ScVbaUserForm::setCaption( const OUString& _caption ) +{ + m_xProps->setPropertyValue( "Title", uno::makeAny( _caption ) ); +} + +sal_Bool SAL_CALL +ScVbaUserForm::getVisible() +{ + uno::Reference< awt::XControl > xControl( m_xDialog, uno::UNO_QUERY_THROW ); + uno::Reference< awt::XWindow2 > xControlWindow( xControl->getPeer(), uno::UNO_QUERY_THROW ); + return xControlWindow->isVisible(); +} + +void SAL_CALL +ScVbaUserForm::setVisible( sal_Bool bVis ) +{ + if ( bVis ) + Show(); + else + Hide(); +} + +double SAL_CALL ScVbaUserForm::getInnerWidth() +{ + return mpGeometryHelper->getInnerWidth(); +} + +void SAL_CALL ScVbaUserForm::setInnerWidth( double fInnerWidth ) +{ + mpGeometryHelper->setInnerWidth( fInnerWidth ); +} + +double SAL_CALL ScVbaUserForm::getInnerHeight() +{ + return mpGeometryHelper->getInnerHeight(); +} + +void SAL_CALL ScVbaUserForm::setInnerHeight( double fInnerHeight ) +{ + mpGeometryHelper->setInnerHeight( fInnerHeight ); +} + +void SAL_CALL +ScVbaUserForm::Hide( ) +{ + mbDispose = false; // hide not dispose + if ( m_xDialog.is() ) + m_xDialog->endExecute(); +} + +void SAL_CALL +ScVbaUserForm::RePaint( ) +{ + // #STUB + // do nothing +} + +void SAL_CALL +ScVbaUserForm::UnloadObject( ) +{ + mbDispose = true; + if ( m_xDialog.is() ) + m_xDialog->endExecute(); +} + +OUString +ScVbaUserForm::getServiceImplName() +{ + return "ScVbaUserForm"; +} + +uno::Sequence< OUString > +ScVbaUserForm::getServiceNames() +{ + static uno::Sequence< OUString > const aServiceNames + { + "ooo.vba.excel.UserForm" + }; + return aServiceNames; +} + +uno::Reference< beans::XIntrospectionAccess > SAL_CALL +ScVbaUserForm::getIntrospection( ) +{ + return uno::Reference< beans::XIntrospectionAccess >(); +} + +uno::Any SAL_CALL +ScVbaUserForm::invoke( const OUString& /*aFunctionName*/, const uno::Sequence< uno::Any >& /*aParams*/, uno::Sequence< ::sal_Int16 >& /*aOutParamIndex*/, uno::Sequence< uno::Any >& /*aOutParam*/ ) +{ + throw uno::RuntimeException(); // unsupported operation +} + +void SAL_CALL +ScVbaUserForm::setValue( const OUString& aPropertyName, const uno::Any& aValue ) +{ + uno::Any aObject = getValue( aPropertyName ); + + // in case the dialog is already closed the VBA implementation should not throw exceptions + if ( aObject.hasValue() ) + { + // The Object *must* support XDefaultProperty here because getValue will + // only return properties that are Objects ( e.g. controls ) + // e.g. Userform1.aControl = something + // 'aControl' has to support XDefaultProperty to make sense here + uno::Reference< script::XDefaultProperty > xDfltProp( aObject, uno::UNO_QUERY_THROW ); + OUString aDfltPropName = xDfltProp->getDefaultPropertyName(); + uno::Reference< beans::XIntrospectionAccess > xUnoAccess( getIntrospectionAccess( aObject ) ); + uno::Reference< beans::XPropertySet > xPropSet( xUnoAccess->queryAdapter( cppu::UnoType<beans::XPropertySet>::get()), uno::UNO_QUERY_THROW ); + xPropSet->setPropertyValue( aDfltPropName, aValue ); + } +} + +uno::Reference< awt::XControl > +ScVbaUserForm::nestedSearch( const OUString& aPropertyName, uno::Reference< awt::XControlContainer > const & xContainer ) +{ + uno::Reference< awt::XControl > xControl = xContainer->getControl( aPropertyName ); + if ( !xControl.is() ) + { + const uno::Sequence< uno::Reference< awt::XControl > > aControls = xContainer->getControls(); + + for ( const auto& rCtrl : aControls ) + { + uno::Reference< awt::XControlContainer > xC( rCtrl, uno::UNO_QUERY ); + if ( xC.is() ) + { + xControl.set( nestedSearch( aPropertyName, xC ) ); + if ( xControl.is() ) + break; + } + } + } + return xControl; +} + +uno::Any SAL_CALL +ScVbaUserForm::getValue( const OUString& aPropertyName ) +{ + uno::Any aResult; + + // in case the dialog is already closed the VBA implementation should not throw exceptions + if ( m_xDialog.is() ) + { + uno::Reference< awt::XControl > xDialogControl( m_xDialog, uno::UNO_QUERY_THROW ); + uno::Reference< awt::XControlContainer > xContainer( m_xDialog, uno::UNO_QUERY_THROW ); + uno::Reference< awt::XControl > xControl = nestedSearch( aPropertyName, xContainer ); + xContainer->getControl( aPropertyName ); + if ( xControl.is() ) + { + uno::Reference< msforms::XControl > xVBAControl = ScVbaControlFactory::createUserformControl( mxContext, xControl, xDialogControl, m_xModel, mpGeometryHelper->getOffsetX(), mpGeometryHelper->getOffsetY() ); + ScVbaControl* pControl = dynamic_cast< ScVbaControl* >( xVBAControl.get() ); + if (pControl && !m_sLibName.isEmpty()) + pControl->setLibraryAndCodeName( m_sLibName.concat( "." ).concat( getName() ) ); + aResult <<= xVBAControl; + } + } + + return aResult; +} + +sal_Bool SAL_CALL +ScVbaUserForm::hasMethod( const OUString& /*aName*/ ) +{ + return false; +} +uno::Any SAL_CALL +ScVbaUserForm::Controls( const uno::Any& index ) +{ + // if the dialog already closed we should do nothing, but the VBA will call methods of the Controls objects + // thus we have to provide a dummy object in this case + uno::Reference< awt::XControl > xDialogControl( m_xDialog, uno::UNO_QUERY ); + uno::Reference< XCollection > xControls( new ScVbaControls( this, mxContext, xDialogControl, m_xModel, mpGeometryHelper->getOffsetX(), mpGeometryHelper->getOffsetY() ) ); + if ( index.hasValue() ) + return xControls->Item( index, uno::Any() ); + return uno::makeAny( xControls ); +} + +sal_Bool SAL_CALL +ScVbaUserForm::hasProperty( const OUString& aName ) +{ + uno::Reference< awt::XControl > xControl( m_xDialog, uno::UNO_QUERY ); + + SAL_INFO("vbahelper", "ScVbaUserForm::hasProperty(" << aName << ") " << xControl.is() ); + if ( xControl.is() ) + { + uno::Reference< beans::XPropertySet > xDlgProps( xControl->getModel(), uno::UNO_QUERY ); + if ( xDlgProps.is() ) + { + uno::Reference< container::XNameContainer > xAllChildren( xDlgProps->getPropertyValue( "AllDialogChildren" ), uno::UNO_QUERY_THROW ); + bool bRes = xAllChildren->hasByName( aName ); + SAL_INFO("vbahelper", "ScVbaUserForm::hasProperty(" << aName << ") " << xAllChildren.is() << " ---> " << bRes ); + return bRes; + } + } + return false; +} + +namespace userform +{ +namespace sdecl = comphelper::service_decl; +sdecl::vba_service_class_<ScVbaUserForm, sdecl::with_args<true> > const serviceImpl; +sdecl::ServiceDecl const serviceDecl( + serviceImpl, + "ScVbaUserForm", + "ooo.vba.msforms.UserForm" ); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vbahelper/source/msforms/vbauserform.hxx b/vbahelper/source/msforms/vbauserform.hxx new file mode 100644 index 000000000..ded092bc1 --- /dev/null +++ b/vbahelper/source/msforms/vbauserform.hxx @@ -0,0 +1,72 @@ +/* -*- 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 . + */ +#ifndef INCLUDED_VBAHELPER_SOURCE_MSFORMS_VBAUSERFORM_HXX +#define INCLUDED_VBAHELPER_SOURCE_MSFORMS_VBAUSERFORM_HXX + +#include <cppuhelper/implbase.hxx> +#include <ooo/vba/msforms/XUserForm.hpp> +#include <com/sun/star/awt/XDialog.hpp> +#include <com/sun/star/awt/XControlContainer.hpp> + +#include "vbacontrol.hxx" + +//typedef InheritedHelperInterfaceWeakImpl< ov::msforms::XUserForm > ScVbaUserForm_BASE; +typedef cppu::ImplInheritanceHelper< ScVbaControl, ov::msforms::XUserForm > ScVbaUserForm_BASE; + +class ScVbaUserForm : public ScVbaUserForm_BASE +{ +private: + css::uno::Reference< css::awt::XDialog > m_xDialog; + bool mbDispose; + OUString m_sLibName; +protected: +public: + /// @throws css::lang::IllegalArgumentException + /// @throws css::uno::RuntimeException + ScVbaUserForm( css::uno::Sequence< css::uno::Any > const& aArgs, css::uno::Reference< css::uno::XComponentContext >const& xContext ); + virtual ~ScVbaUserForm() override; + static css::uno::Reference< css::awt::XControl > nestedSearch( const OUString& aPropertyName, css::uno::Reference< css::awt::XControlContainer > const & xContainer ); + // XUserForm + virtual void SAL_CALL RePaint( ) override; + virtual void SAL_CALL Show( ) override; + virtual void SAL_CALL setValue( const OUString& aPropertyName, const css::uno::Any& aValue ) override; + virtual css::uno::Any SAL_CALL getValue( const OUString& aPropertyName ) override; + virtual OUString SAL_CALL getCaption() override; + virtual void SAL_CALL setCaption( const OUString& _caption ) override; + virtual double SAL_CALL getInnerWidth() override; + virtual void SAL_CALL setInnerWidth( double fInnerWidth ) override; + virtual double SAL_CALL getInnerHeight() override; + virtual void SAL_CALL setInnerHeight( double fInnerHeight ) override; + virtual void SAL_CALL Hide( ) override; + virtual void SAL_CALL UnloadObject( ) override; + virtual css::uno::Any SAL_CALL Controls( const css::uno::Any& index ) override; + virtual sal_Bool SAL_CALL getVisible() override; + virtual void SAL_CALL setVisible( sal_Bool bVis ) override; + // XIntrospection + virtual css::uno::Reference< css::beans::XIntrospectionAccess > SAL_CALL getIntrospection( ) override; + virtual css::uno::Any SAL_CALL invoke( const OUString& aFunctionName, const css::uno::Sequence< css::uno::Any >& aParams, css::uno::Sequence< ::sal_Int16 >& aOutParamIndex, css::uno::Sequence< css::uno::Any >& aOutParam ) override; + virtual sal_Bool SAL_CALL hasMethod( const OUString& aName ) override; + virtual sal_Bool SAL_CALL hasProperty( const OUString& aName ) override; + //XHelperInterface + virtual OUString getServiceImplName() override; + virtual css::uno::Sequence<OUString> getServiceNames() override; +}; +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |