diff options
Diffstat (limited to 'vbahelper/source/vbahelper/vbacommandbarcontrol.cxx')
-rw-r--r-- | vbahelper/source/vbahelper/vbacommandbarcontrol.cxx | 255 |
1 files changed, 255 insertions, 0 deletions
diff --git a/vbahelper/source/vbahelper/vbacommandbarcontrol.cxx b/vbahelper/source/vbahelper/vbacommandbarcontrol.cxx new file mode 100644 index 000000000..d7220f071 --- /dev/null +++ b/vbahelper/source/vbahelper/vbacommandbarcontrol.cxx @@ -0,0 +1,255 @@ +/* -*- 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 "vbacommandbarcontrol.hxx" +#include "vbacommandbarcontrols.hxx" +#include <vbahelper/vbahelper.hxx> +#include <filter/msfilter/msvbahelper.hxx> +#include <sal/log.hxx> + +using namespace com::sun::star; +using namespace ooo::vba; + +ScVbaCommandBarControl::ScVbaCommandBarControl( const css::uno::Reference< ov::XHelperInterface >& xParent, const css::uno::Reference< css::uno::XComponentContext >& xContext, const css::uno::Reference< css::container::XIndexAccess >& xSettings, const VbaCommandBarHelperRef& pHelper, const css::uno::Reference< css::container::XIndexAccess >& xBarSettings, const OUString& sResourceUrl ) : CommandBarControl_BASE( xParent, xContext ), pCBarHelper( pHelper ), m_sResourceUrl( sResourceUrl ), m_xCurrentSettings( xSettings ), m_xBarSettings( xBarSettings ), m_nPosition( 0 ) +{ +} + +void ScVbaCommandBarControl::ApplyChange() +{ + uno::Reference< container::XIndexContainer > xIndexContainer( m_xCurrentSettings, uno::UNO_QUERY_THROW ); + xIndexContainer->replaceByIndex( m_nPosition, uno::makeAny( m_aPropertyValues ) ); + pCBarHelper->ApplyTempChange( m_sResourceUrl, m_xBarSettings ); +} + +OUString SAL_CALL +ScVbaCommandBarControl::getCaption() +{ + // "Label" always empty + OUString sCaption; + getPropertyValue( m_aPropertyValues, "Label" ) >>= sCaption; + return sCaption; +} + +void SAL_CALL +ScVbaCommandBarControl::setCaption( const OUString& _caption ) +{ + OUString sCaption = _caption.replace('&','~'); + setPropertyValue( m_aPropertyValues, "Label" , uno::makeAny( sCaption ) ); + ApplyChange(); +} + +OUString SAL_CALL +ScVbaCommandBarControl::getOnAction() +{ + OUString sCommandURL; + getPropertyValue( m_aPropertyValues, "CommandURL" ) >>= sCommandURL; + return sCommandURL; +} + +void SAL_CALL +ScVbaCommandBarControl::setOnAction( const OUString& _onaction ) +{ + // get the current model + uno::Reference< frame::XModel > xModel( pCBarHelper->getModel() ); + MacroResolvedInfo aResolvedMacro = ooo::vba::resolveVBAMacro( getSfxObjShell( xModel ), _onaction, true ); + if ( aResolvedMacro.mbFound ) + { + OUString aCommandURL = ooo::vba::makeMacroURL( aResolvedMacro.msResolvedMacro ); + SAL_INFO("vbahelper", "ScVbaCommandBarControl::setOnAction: " << aCommandURL); + setPropertyValue( m_aPropertyValues, "CommandURL" , uno::makeAny( aCommandURL ) ); + ApplyChange(); + } +} + +sal_Bool SAL_CALL +ScVbaCommandBarControl::getVisible() +{ + bool bVisible = true; + uno::Any aValue = getPropertyValue( m_aPropertyValues, ITEM_DESCRIPTOR_ISVISIBLE ); + if( aValue.hasValue() ) + aValue >>= bVisible; + return bVisible; +} +void SAL_CALL +ScVbaCommandBarControl::setVisible( sal_Bool _visible ) +{ + uno::Any aValue = getPropertyValue( m_aPropertyValues, ITEM_DESCRIPTOR_ISVISIBLE ); + if( aValue.hasValue() ) + { + setPropertyValue( m_aPropertyValues, ITEM_DESCRIPTOR_ISVISIBLE , uno::makeAny( _visible ) ); + ApplyChange(); + } +} + +sal_Bool SAL_CALL +ScVbaCommandBarControl::getEnabled() +{ + bool bEnabled = true; + + uno::Any aValue = getPropertyValue( m_aPropertyValues, ITEM_DESCRIPTOR_ENABLED ); + if( aValue.hasValue() ) + { + aValue >>= bEnabled; + } + else + { + // emulated with Visible + bEnabled = getVisible(); + } + return bEnabled; +} + +void SAL_CALL +ScVbaCommandBarControl::setEnabled( sal_Bool _enabled ) +{ + uno::Any aValue = getPropertyValue( m_aPropertyValues, ITEM_DESCRIPTOR_ENABLED ); + if( aValue.hasValue() ) + { + setPropertyValue( m_aPropertyValues, ITEM_DESCRIPTOR_ENABLED , uno::makeAny( _enabled ) ); + ApplyChange(); + } + else + { + // emulated with Visible + setVisible( _enabled ); + } +} + +sal_Bool SAL_CALL +ScVbaCommandBarControl::getBeginGroup() +{ + // TODO: need to check if the item before this item is of type 'separator' + //#STUB + return false; +} + +void SAL_CALL +ScVbaCommandBarControl::setBeginGroup( sal_Bool _begin ) +{ + if( getBeginGroup() != _begin ) + { + // TODO: need to insert or remove an item of type 'separator' before this item + } +} + +void SAL_CALL +ScVbaCommandBarControl::Delete( ) +{ + if( m_xCurrentSettings.is() ) + { + uno::Reference< container::XIndexContainer > xIndexContainer( m_xCurrentSettings, uno::UNO_QUERY_THROW ); + xIndexContainer->removeByIndex( m_nPosition ); + + pCBarHelper->ApplyTempChange( m_sResourceUrl, m_xBarSettings ); + } +} + +uno::Any SAL_CALL +ScVbaCommandBarControl::Controls( const uno::Any& aIndex ) +{ + // only Popup Menu has controls + uno::Reference< container::XIndexAccess > xSubMenu; + getPropertyValue( m_aPropertyValues, ITEM_DESCRIPTOR_CONTAINER ) >>= xSubMenu; + if( !xSubMenu.is() ) + throw uno::RuntimeException(); + + uno::Reference< XCommandBarControls > xCommandBarControls( new ScVbaCommandBarControls( this, mxContext, xSubMenu, pCBarHelper, m_xBarSettings, m_sResourceUrl ) ); + if( aIndex.hasValue() ) + { + return xCommandBarControls->Item( aIndex, uno::Any() ); + } + return uno::makeAny( xCommandBarControls ); +} + +OUString +ScVbaCommandBarControl::getServiceImplName() +{ + return "ScVbaCommandBarControl"; +} + +uno::Sequence<OUString> +ScVbaCommandBarControl::getServiceNames() +{ + static uno::Sequence< OUString > const aServiceNames + { + "ooo.vba.CommandBarControl" + }; + return aServiceNames; +} + +// ScVbaCommandBarPopup +ScVbaCommandBarPopup::ScVbaCommandBarPopup( const css::uno::Reference< ov::XHelperInterface >& xParent, + const css::uno::Reference< css::uno::XComponentContext >& xContext, + const css::uno::Reference< css::container::XIndexAccess >& xSettings, + const VbaCommandBarHelperRef& pHelper, + const css::uno::Reference< css::container::XIndexAccess >& xBarSettings, + const OUString& sResourceUrl, + sal_Int32 nPosition ) + : CommandBarPopup_BASE( xParent, xContext, xSettings, pHelper, xBarSettings, sResourceUrl ) +{ + m_nPosition = nPosition; + m_xCurrentSettings->getByIndex( m_nPosition ) >>= m_aPropertyValues; +} + +OUString +ScVbaCommandBarPopup::getServiceImplName() +{ + return "ScVbaCommandBarPopup"; +} + +uno::Sequence<OUString> +ScVbaCommandBarPopup::getServiceNames() +{ + static uno::Sequence< OUString > const aServiceNames + { + "ooo.vba.CommandBarPopup" + }; + return aServiceNames; +} + +// ScVbaCommandBarButton +ScVbaCommandBarButton::ScVbaCommandBarButton( const css::uno::Reference< ov::XHelperInterface >& xParent, + const css::uno::Reference< css::uno::XComponentContext >& xContext, + const css::uno::Reference< css::container::XIndexAccess >& xSettings, + const VbaCommandBarHelperRef& pHelper, + const css::uno::Reference< css::container::XIndexAccess >& xBarSettings, + const OUString& sResourceUrl, + sal_Int32 nPosition ) + : CommandBarButton_BASE( xParent, xContext, xSettings, pHelper, xBarSettings, sResourceUrl ) +{ + m_nPosition = nPosition; + m_xCurrentSettings->getByIndex( m_nPosition ) >>= m_aPropertyValues; +} + +OUString +ScVbaCommandBarButton::getServiceImplName() +{ + return "ScVbaCommandBarButton"; +} + +uno::Sequence<OUString> +ScVbaCommandBarButton::getServiceNames() +{ + static uno::Sequence< OUString > const aServiceNames + { + "ooo.vba.CommandBarButton" + }; + return aServiceNames; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |