/************************************************************** * * 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 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "vbalineformat.hxx" #include "vbafillformat.hxx" #include "vbapictureformat.hxx" #include using namespace ::ooo::vba; using namespace ::com::sun::star; using namespace ::vos; ScVbaShape::ScVbaShape( const uno::Reference< XHelperInterface >& xParent, const uno::Reference< uno::XComponentContext >& xContext, const uno::Reference< drawing::XShape >& xShape, const uno::Reference< drawing::XShapes >& xShapes, const uno::Reference< frame::XModel >& xModel, sal_Int32 nType ) throw( lang::IllegalArgumentException ) : ScVbaShape_BASE( xParent, xContext ), m_xShape( xShape ), m_xShapes( xShapes ), m_nType( nType ), m_xModel( xModel ) { m_xPropertySet.set( m_xShape, uno::UNO_QUERY_THROW ); m_pShapeHelper.reset( new ShapeHelper( m_xShape ) ); addListeners(); } ScVbaShape::ScVbaShape( const uno::Reference< uno::XComponentContext >& xContext, const uno::Reference< drawing::XShape >& xShape, const uno::Reference< frame::XModel >& xModel ) throw( lang::IllegalArgumentException ) : ScVbaShape_BASE( uno::Reference< XHelperInterface >(), xContext ), m_xShape( xShape ), m_xModel( xModel ) { // add listener addListeners(); } ScVbaShape::~ScVbaShape() { // dtor must never ever throw /*try { removeShapeListener(); removeShapesListener(); } catch( uno::Exception& ) { }*/ } void SAL_CALL ScVbaShape::disposing( const lang::EventObject& rEventObject ) throw( uno::RuntimeException ) { try { uno::Reference< drawing::XShapes > xShapes( rEventObject.Source, uno::UNO_QUERY ); uno::Reference< drawing::XShape > xShape( rEventObject.Source, uno::UNO_QUERY ); if ( xShapes.is() ) removeShapesListener(); if ( xShape.is() ) removeShapeListener(); } catch( uno::Exception& ) { } } void ScVbaShape::addListeners() { uno::Reference< lang::XComponent > xComponent( m_xShape, uno::UNO_QUERY ); if ( xComponent.is() ) xComponent->addEventListener( this ); xComponent.set( m_xShapes, uno::UNO_QUERY ); if ( xComponent.is() ) xComponent->addEventListener( this ); } void ScVbaShape::removeShapeListener() throw( uno::RuntimeException ) { if( m_xShape.is() ) { uno::Reference< lang::XComponent > xComponent( m_xShape, uno::UNO_QUERY_THROW ); xComponent->removeEventListener( this ); } m_xShape = NULL; m_xPropertySet = NULL; } void ScVbaShape::removeShapesListener() throw( uno::RuntimeException ) { if( m_xShapes.is() ) { uno::Reference< lang::XComponent > xComponent( m_xShapes, uno::UNO_QUERY_THROW ); xComponent->removeEventListener( this ); } m_xShapes = NULL; } sal_Int32 ScVbaShape::getType( const css::uno::Reference< drawing::XShape > xShape ) throw (uno::RuntimeException) { rtl::OUString sShapeType; uno::Reference< drawing::XShapeDescriptor > xShapeDescriptor( xShape, uno::UNO_QUERY_THROW ); sShapeType = xShapeDescriptor->getShapeType(); OSL_TRACE("ScVbaShape::getType: %s", rtl::OUStringToOString( sShapeType, RTL_TEXTENCODING_UTF8 ).getStr() ); // office::MsoShapeType::msoDiagram to "com.sun.star.drawing.GroupShape" if( sShapeType.equals( rtl::OUString::createFromAscii( "com.sun.star.drawing.GroupShape" ) ) ) return office::MsoShapeType::msoGroup; else if( sShapeType.equals( rtl::OUString::createFromAscii( "com.sun.star.drawing.GraphicObjectShape" ) ) ) return office::MsoShapeType::msoPicture; else if( sShapeType.equals( rtl::OUString::createFromAscii( "com.sun.star.drawing.ControlShape" ) ) || sShapeType.equals( rtl::OUString::createFromAscii( "FrameShape" ) ) ) return office::MsoShapeType::msoOLEControlObject; // OOo don't support office::MsoShapeType::msoComment as a Shape. else if( sShapeType.equals( rtl::OUString::createFromAscii( "com.sun.star.drawing.OLE2Shape" ) ) ) return office::MsoShapeType::msoChart; // Art characters office::MsoShapeType::msoTextEffect, in OOo corresponding to "com.sun.star.drawing.CustomShape" else if( sShapeType.equals( rtl::OUString::createFromAscii( "com.sun.star.drawing.ConnectorShape" ) ) ) { enum drawing::ConnectorType connectorType; uno::Reference< beans::XPropertySet > xPropertySet( xShape, uno::UNO_QUERY_THROW ); xPropertySet->getPropertyValue( rtl::OUString::createFromAscii("EdgeKind")) >>= connectorType; if( connectorType == drawing::ConnectorType_CURVE ) return office::MsoShapeType::msoFreeform; else if( connectorType == drawing::ConnectorType_LINE ) return office::MsoShapeType::msoLine; else return office::MsoShapeType::msoAutoShape; } else if( sShapeType.equals( rtl::OUString::createFromAscii( "com.sun.star.drawing.LineShape" ) ) ) return office::MsoShapeType::msoLine; else if( sShapeType.equals( rtl::OUString::createFromAscii( "com.sun.star.drawing.CustomShape" ) ) || sShapeType.equals( rtl::OUString::createFromAscii( "com.sun.star.drawing.RectangleShape") ) ) return office::MsoShapeType::msoAutoShape; else if( sShapeType.equals( rtl::OUString::createFromAscii( "com.sun.star.drawing.TextShape" ) ) ) return office::MsoShapeType::msoTextBox; else throw uno::RuntimeException( rtl::OUString::createFromAscii( "the shape type do not be supported: " ) + sShapeType, uno::Reference< uno::XInterface >() ); } // Attributes rtl::OUString SAL_CALL ScVbaShape::getName() throw (uno::RuntimeException) { rtl::OUString sName; uno::Reference< container::XNamed > xNamed( m_xShape, uno::UNO_QUERY_THROW ); sName = xNamed->getName(); return sName; } void SAL_CALL ScVbaShape::setName( const rtl::OUString& _name ) throw (uno::RuntimeException) { uno::Reference< container::XNamed > xNamed( m_xShape, uno::UNO_QUERY_THROW ); xNamed->setName( _name ); } double SAL_CALL ScVbaShape::getHeight() throw (uno::RuntimeException) { return m_pShapeHelper->getHeight(); } void SAL_CALL ScVbaShape::setHeight( double _height ) throw (uno::RuntimeException) { m_pShapeHelper->setHeight( _height ); } double SAL_CALL ScVbaShape::getWidth() throw (uno::RuntimeException) { return m_pShapeHelper->getWidth(); } void SAL_CALL ScVbaShape::setWidth( double _width ) throw (uno::RuntimeException) { m_pShapeHelper->setWidth( _width ); } double SAL_CALL ScVbaShape::getLeft() throw (uno::RuntimeException) { return m_pShapeHelper->getLeft(); } void SAL_CALL ScVbaShape::setLeft( double _left ) throw (uno::RuntimeException) { m_pShapeHelper->setLeft( _left ); } double SAL_CALL ScVbaShape::getTop() throw (uno::RuntimeException) { return m_pShapeHelper->getTop(); } void SAL_CALL ScVbaShape::setTop( double _top ) throw (uno::RuntimeException) { return m_pShapeHelper->setTop( _top ); } sal_Bool SAL_CALL ScVbaShape::getVisible() throw (uno::RuntimeException) { //UNO Shapes are always visible return sal_True; } void SAL_CALL ScVbaShape::setVisible( sal_Bool /*_visible*/ ) throw (uno::RuntimeException) { //UNO Shapes are always visible } sal_Int32 SAL_CALL ScVbaShape::getZOrderPosition() throw (uno::RuntimeException) { sal_Int32 nZOrderPosition = 0; uno::Any aZOrderPosition = m_xPropertySet->getPropertyValue( rtl::OUString::createFromAscii( "ZOrder" ) ); aZOrderPosition >>= nZOrderPosition; return nZOrderPosition + 1; } sal_Int32 SAL_CALL ScVbaShape::getType() throw (uno::RuntimeException) { return m_nType; } double SAL_CALL ScVbaShape::getRotation() throw (uno::RuntimeException) { double dRotation = 0; sal_Int32 nRotation = 0; m_xPropertySet->getPropertyValue( rtl::OUString::createFromAscii( "RotateAngle" ) ) >>= nRotation; dRotation = static_cast< double >( nRotation /100 ); return dRotation; } void SAL_CALL ScVbaShape::setRotation( double _rotation ) throw (uno::RuntimeException) { sal_Int32 nRotation = static_cast < sal_Int32 > ( _rotation * 100 ); m_xPropertySet->setPropertyValue( rtl::OUString::createFromAscii( "RotateAngle" ), uno::makeAny( nRotation ) ); } uno::Reference< msforms::XLineFormat > SAL_CALL ScVbaShape::getLine() throw (uno::RuntimeException) { // TODO should ongly return line return uno::Reference< msforms::XLineFormat >( new ScVbaLineFormat( this, mxContext, m_xShape ) ); } uno::Reference< msforms::XFillFormat > SAL_CALL ScVbaShape::getFill() throw (uno::RuntimeException) { return uno::Reference< msforms::XFillFormat >( new ScVbaFillFormat( this, mxContext, m_xShape ) ); } uno::Reference< msforms::XPictureFormat > SAL_CALL ScVbaShape::getPictureFormat() throw (uno::RuntimeException) { return uno::Reference< msforms::XPictureFormat >( new ScVbaPictureFormat( this, mxContext, m_xShape ) ); } // Methods uno::Any SAL_CALL ScVbaShape::TextFrame() throw (uno::RuntimeException) { uno::Reference< lang::XServiceInfo > xServiceInfo( m_xModel, uno::UNO_QUERY_THROW ); if( xServiceInfo->supportsService( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.sheet.SpreadsheetDocument" ) ) ) ) { uno::Reference< lang::XMultiServiceFactory > xSF( comphelper::getProcessServiceFactory(), uno::UNO_QUERY_THROW ); uno::Sequence< uno::Any > aArgs(2); aArgs[0] = uno::makeAny( getParent() ); aArgs[1] <<= m_xShape; uno::Reference< uno::XInterface > xTextFrame( xSF->createInstanceWithArguments( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("ooo.vba.excel.TextFrame") ) , aArgs ) , uno::UNO_QUERY_THROW ); return uno::makeAny( xTextFrame ); } return uno::makeAny( uno::Reference< msforms::XTextFrame >( new VbaTextFrame( this, mxContext, m_xShape ) ) ); } void SAL_CALL ScVbaShape::Delete() throw (uno::RuntimeException) { OGuard aGuard( Application::GetSolarMutex() ); m_xShapes->remove( m_xShape ); } void SAL_CALL ScVbaShape::ZOrder( sal_Int32 ZOrderCmd ) throw (uno::RuntimeException) { sal_Int32 nOrderPositon; uno::Any aOrderPostion = m_xPropertySet->getPropertyValue( rtl::OUString::createFromAscii( "ZOrder" ) ); aOrderPostion >>= nOrderPositon; switch( ZOrderCmd ) { case office::MsoZOrderCmd::msoBringToFront: m_xPropertySet->setPropertyValue( rtl::OUString::createFromAscii( "ZOrder" ), uno::makeAny( SAL_MAX_INT32 ) ); break; case office::MsoZOrderCmd::msoSendToBack: m_xPropertySet->setPropertyValue( rtl::OUString::createFromAscii( "ZOrder" ), uno::makeAny( (sal_Int32)0 ) ); break; case office::MsoZOrderCmd::msoBringForward: nOrderPositon += 1; m_xPropertySet->setPropertyValue( rtl::OUString::createFromAscii( "ZOrder" ), uno::makeAny( nOrderPositon ) ); break; case office::MsoZOrderCmd::msoSendBackward: if( nOrderPositon > 0 ) { nOrderPositon -= 1; m_xPropertySet->setPropertyValue( rtl::OUString::createFromAscii( "ZOrder" ), uno::makeAny( nOrderPositon ) ); } break; // below two commands use with Writer for text and image object. case office::MsoZOrderCmd::msoBringInFrontOfText: case office::MsoZOrderCmd::msoSendBehindText: throw uno::RuntimeException( rtl::OUString::createFromAscii( "This ZOrderCmd is not implemented, it is use with writer." ), uno::Reference< uno::XInterface >() ); default: throw uno::RuntimeException( rtl::OUString::createFromAscii( "Invalid Parameter." ), uno::Reference< uno::XInterface >() ); } } void SAL_CALL ScVbaShape::IncrementRotation( double Increment ) throw (uno::RuntimeException) { double nCurrentRotation = getRotation(); nCurrentRotation += Increment; setRotation(nCurrentRotation); } void SAL_CALL ScVbaShape::IncrementLeft( double Increment ) throw (uno::RuntimeException) { double nCurrentLeft = getLeft(); nCurrentLeft += Increment; setLeft(nCurrentLeft); } void SAL_CALL ScVbaShape::IncrementTop( double Increment ) throw (uno::RuntimeException) { double nCurrentTop = getTop(); nCurrentTop += Increment; setTop(nCurrentTop); } void SAL_CALL ScVbaShape::ScaleHeight( double Factor, sal_Bool /*RelativeToOriginalSize*/, sal_Int32 Scale ) throw (uno::RuntimeException) { double nHeight = getHeight(); double nNewHeight = nHeight * Factor; if( Scale == office::MsoScaleFrom::msoScaleFromTopLeft ) { setHeight(nNewHeight); } else if( Scale == office::MsoScaleFrom::msoScaleFromBottomRight ) { double nDeltaHeight = nNewHeight - nHeight; double nNewTop = getTop() - nDeltaHeight; setTop(nNewTop); setHeight(nNewHeight); } else if( Scale == office::MsoScaleFrom::msoScaleFromMiddle ) { double nDeltaHeight = (nNewHeight - nHeight) / 2; double nNewTop = getTop() - nDeltaHeight; setTop(nNewTop); setHeight(nNewHeight); } else { throw uno::RuntimeException( rtl::OUString::createFromAscii( "ScaleHeight.Scale wrong value is given." ) , uno::Reference< uno::XInterface >() ); } } void SAL_CALL ScVbaShape::ScaleWidth( double Factor, sal_Bool /*RelativeToOriginalSize*/, sal_Int32 Scale ) throw (uno::RuntimeException) { double nWidth = getWidth(); double nNewWidth = nWidth * Factor; if( Scale == office::MsoScaleFrom::msoScaleFromTopLeft ) { setWidth(nNewWidth); } else if( Scale == office::MsoScaleFrom::msoScaleFromBottomRight ) { double nDeltaWidth = nNewWidth - nWidth; double nNewLeft = getLeft() - nDeltaWidth; setLeft(nNewLeft); setWidth(nNewWidth); } else if( Scale == office::MsoScaleFrom::msoScaleFromMiddle ) { double nDeltaWidth = (nNewWidth - nWidth) / 2; double nNewLeft = getLeft() - nDeltaWidth; setLeft(nNewLeft); setWidth(nNewWidth); } else { throw uno::RuntimeException( rtl::OUString::createFromAscii( "ScaleHeight.Scale wrong value is given." ) , uno::Reference< uno::XInterface >() ); } } void SAL_CALL ScVbaShape::Select( const uno::Any& /*Replace*/ ) throw ( uno::RuntimeException ) { uno::Reference< view::XSelectionSupplier > xSelectSupp( m_xModel->getCurrentController(), uno::UNO_QUERY_THROW ); xSelectSupp->select( uno::makeAny( m_xShape ) ); } // This method should not be part of Shape, what we reall need to do is... // dynamically create the appropriate objects e.g. TextBox, Oval, Picture etc. // ( e.g. the ones that really do have ShapeRange as an attribute ) uno::Any SAL_CALL ScVbaShape::ShapeRange( const uno::Any& index ) throw ( uno::RuntimeException ) { // perhaps we should store a reference to the Shapes Collection // in this class // but anyway this method should not even be in this class // #TODO not sure what the parent of the Shapes collection should be XNamedObjectCollectionHelper< drawing::XShape >::XNamedVec aVec; aVec.push_back( m_xShape ); uno::Reference< container::XIndexAccess > xIndexAccess( new XNamedObjectCollectionHelper< drawing::XShape >( aVec ) ); uno::Reference< container::XChild > xChild( m_xShape, uno::UNO_QUERY_THROW ); // #FIXME for want of a better parent, setting this uno::Reference< msforms::XShapeRange > xShapeRange( new ScVbaShapeRange( mxParent, mxContext, xIndexAccess, uno::Reference< drawing::XDrawPage >( xChild->getParent(), uno::UNO_QUERY_THROW ), m_xModel ) ); if ( index.hasValue() ) return xShapeRange->Item( index, uno::Any() ); return uno::makeAny( xShapeRange ); } sal_Bool SAL_CALL ScVbaShape::getLockAspectRatio() throw (uno::RuntimeException) { // FIXME: return sal_False; } void SAL_CALL ScVbaShape::setLockAspectRatio( sal_Bool /*_lockaspectratio*/ ) throw (uno::RuntimeException) { // FIXME: } sal_Bool SAL_CALL ScVbaShape::getLockAnchor() throw (uno::RuntimeException) { // FIXME: return sal_True; } void SAL_CALL ScVbaShape::setLockAnchor( sal_Bool /*_lockanchor*/ ) throw (uno::RuntimeException) { // FIXME: } sal_Int32 SAL_CALL ScVbaShape::getRelativeHorizontalPosition() throw (uno::RuntimeException) { sal_Int32 nRelativeHorizontalPosition = word::WdRelativeHorizontalPosition::wdRelativeHorizontalPositionMargin; text::TextContentAnchorType eType = text::TextContentAnchorType_AT_PARAGRAPH; m_xPropertySet->getPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("AnchorType") ) ) >>= eType; switch( eType ) { case text::TextContentAnchorType_AT_PARAGRAPH: { nRelativeHorizontalPosition = word::WdRelativeHorizontalPosition::wdRelativeHorizontalPositionColumn; break; } case text::TextContentAnchorType_AT_PAGE: { nRelativeHorizontalPosition = word::WdRelativeHorizontalPosition::wdRelativeHorizontalPositionPage; break; } case text::TextContentAnchorType_AT_CHARACTER: { nRelativeHorizontalPosition = word::WdRelativeHorizontalPosition::wdRelativeHorizontalPositionCharacter; break; } case text::TextContentAnchorType_AT_FRAME: case text::TextContentAnchorType_AS_CHARACTER: { nRelativeHorizontalPosition = word::WdRelativeHorizontalPosition::wdRelativeHorizontalPositionMargin; break; } default: { nRelativeHorizontalPosition = word::WdRelativeHorizontalPosition::wdRelativeHorizontalPositionMargin; } } return nRelativeHorizontalPosition; } void SAL_CALL ScVbaShape::setRelativeHorizontalPosition( ::sal_Int32 _relativehorizontalposition ) throw (uno::RuntimeException) { text::TextContentAnchorType eType = text::TextContentAnchorType_AT_PARAGRAPH; switch( _relativehorizontalposition ) { case word::WdRelativeHorizontalPosition::wdRelativeHorizontalPositionCharacter: { eType = text::TextContentAnchorType_AT_CHARACTER; break; } case word::WdRelativeHorizontalPosition::wdRelativeHorizontalPositionColumn: case word::WdRelativeHorizontalPosition::wdRelativeHorizontalPositionMargin: { eType = text::TextContentAnchorType_AT_PARAGRAPH; break; } case word::WdRelativeHorizontalPosition::wdRelativeHorizontalPositionPage: { eType = text::TextContentAnchorType_AT_PAGE; break; } default: { DebugHelper::exception(SbERR_BAD_ARGUMENT, rtl::OUString()); } } m_xPropertySet->setPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("AnchorType") ), uno::makeAny( eType ) ); } sal_Int32 SAL_CALL ScVbaShape::getRelativeVerticalPosition() throw (uno::RuntimeException) { sal_Int32 nRelativeVerticalPosition = word::WdRelativeVerticalPosition::wdRelativeVerticalPositionMargin; text::TextContentAnchorType eType = text::TextContentAnchorType_AT_PARAGRAPH; m_xPropertySet->getPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("AnchorType") ) ) >>= eType; switch( eType ) { case text::TextContentAnchorType_AT_PARAGRAPH: { nRelativeVerticalPosition = word::WdRelativeVerticalPosition::wdRelativeVerticalPositionParagraph; break; } case text::TextContentAnchorType_AT_PAGE: { nRelativeVerticalPosition = word::WdRelativeVerticalPosition::wdRelativeVerticalPositionPage; break; } case text::TextContentAnchorType_AT_CHARACTER: { nRelativeVerticalPosition = word::WdRelativeVerticalPosition::wdRelativeVerticalPositionLine; break; } case text::TextContentAnchorType_AT_FRAME: case text::TextContentAnchorType_AS_CHARACTER: { nRelativeVerticalPosition = word::WdRelativeVerticalPosition::wdRelativeVerticalPositionMargin; break; } default: { nRelativeVerticalPosition = word::WdRelativeVerticalPosition::wdRelativeVerticalPositionMargin; } } return nRelativeVerticalPosition; } void SAL_CALL ScVbaShape::setRelativeVerticalPosition( ::sal_Int32 _relativeverticalposition ) throw (uno::RuntimeException) { text::TextContentAnchorType eType = text::TextContentAnchorType_AT_PARAGRAPH; switch( _relativeverticalposition ) { case word::WdRelativeVerticalPosition::wdRelativeVerticalPositionLine: { eType = text::TextContentAnchorType_AT_CHARACTER; break; } case word::WdRelativeVerticalPosition::wdRelativeVerticalPositionParagraph: case word::WdRelativeVerticalPosition::wdRelativeVerticalPositionMargin: { eType = text::TextContentAnchorType_AT_PARAGRAPH; break; } case word::WdRelativeVerticalPosition::wdRelativeVerticalPositionPage: { eType = text::TextContentAnchorType_AT_PAGE; break; } default: { DebugHelper::exception(SbERR_BAD_ARGUMENT, rtl::OUString()); } } m_xPropertySet->setPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("AnchorType") ), uno::makeAny( eType ) ); } uno::Any SAL_CALL ScVbaShape::WrapFormat() throw (uno::RuntimeException) { uno::Reference< lang::XServiceInfo > xServiceInfo( m_xModel, uno::UNO_QUERY_THROW ); if( xServiceInfo->supportsService( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.text.TextDocument" ) ) ) ) { uno::Reference< lang::XMultiServiceFactory > xSF( comphelper::getProcessServiceFactory(), uno::UNO_QUERY_THROW ); uno::Sequence< uno::Any > aArgs(2); aArgs[0] = uno::makeAny( getParent() ); aArgs[1] <<= m_xShape; uno::Reference< uno::XInterface > xWrapFormat( xSF->createInstanceWithArguments( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("ooo.vba.word.WrapFormat") ) , aArgs ) , uno::UNO_QUERY_THROW ); return uno::makeAny( xWrapFormat ); } throw uno::RuntimeException( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("Not implemented") ), uno::Reference< uno::XInterface >() ); } rtl::OUString& ScVbaShape::getServiceImplName() { static rtl::OUString sImplName( RTL_CONSTASCII_USTRINGPARAM("ScVbaShape") ); return sImplName; } uno::Sequence< rtl::OUString > ScVbaShape::getServiceNames() { static uno::Sequence< rtl::OUString > aServiceNames; if ( aServiceNames.getLength() == 0 ) { aServiceNames.realloc( 1 ); aServiceNames[ 0 ] = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("ooo.vba.msform.Shape" ) ); } return aServiceNames; }