diff options
Diffstat (limited to 'svx/source/table/tabledesign.cxx')
-rw-r--r-- | svx/source/table/tabledesign.cxx | 808 |
1 files changed, 808 insertions, 0 deletions
diff --git a/svx/source/table/tabledesign.cxx b/svx/source/table/tabledesign.cxx new file mode 100644 index 000000000000..e952425e5c30 --- /dev/null +++ b/svx/source/table/tabledesign.cxx @@ -0,0 +1,808 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_svx.hxx" + +#include <com/sun/star/style/XStyle.hpp> +#include <com/sun/star/lang/XServiceInfo.hpp> +#include <com/sun/star/lang/XComponent.hpp> +#include <com/sun/star/lang/XSingleServiceFactory.hpp> +#include <com/sun/star/container/XIndexAccess.hpp> +#include <com/sun/star/container/XNameContainer.hpp> +#include <com/sun/star/beans/XPropertySet.hpp> +#include <com/sun/star/util/XModifyBroadcaster.hpp> +#include <com/sun/star/util/XModifyListener.hpp> +#include <comphelper/serviceinfohelper.hxx> + +#include <osl/mutex.hxx> +#include <vos/mutex.hxx> +#include <vcl/svapp.hxx> + +#include <cppuhelper/basemutex.hxx> +#include <cppuhelper/compbase6.hxx> +#include <cppuhelper/implbase7.hxx> +#include <cppuhelper/interfacecontainer.h> + +#include "svx/unoprov.hxx" +#include "svx/sdr/table/tabledesign.hxx" +#include "svx/dialmgr.hxx" +#include "svx/dialogs.hrc" + +#include "celltypes.hxx" + +#include <vector> +#include <map> + +#include <boost/bind.hpp> + +// ----------------------------------------------------------------------------- + +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::style; +using namespace ::com::sun::star::lang; +using namespace ::com::sun::star::beans; +using namespace ::com::sun::star::util; +using namespace ::com::sun::star::container; + +using ::rtl::OUString; +using ::vos::OGuard; +using ::osl::MutexGuard; +using ::osl::ClearableMutexGuard; +using ::cppu::OInterfaceContainerHelper; + +namespace sdr { namespace table { + +typedef std::map< OUString, sal_Int32 > CellStyleNameMap; + +typedef ::cppu::WeakComponentImplHelper6< XStyle, XNameReplace, XServiceInfo, XIndexAccess, XModifyBroadcaster, XModifyListener > TableDesignStyleBase; + +class TableDesignStyle : private ::cppu::BaseMutex, public TableDesignStyleBase +{ +public: + TableDesignStyle(); + + // XServiceInfo + virtual OUString SAL_CALL getImplementationName() throw(RuntimeException); + virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) throw(RuntimeException); + virtual Sequence< OUString > SAL_CALL getSupportedServiceNames() throw(RuntimeException); + + // XStyle + virtual ::sal_Bool SAL_CALL isUserDefined() throw (RuntimeException); + virtual ::sal_Bool SAL_CALL isInUse() throw (RuntimeException); + virtual OUString SAL_CALL getParentStyle() throw (RuntimeException); + virtual void SAL_CALL setParentStyle( const OUString& aParentStyle ) throw (NoSuchElementException, RuntimeException); + + // XNamed + virtual OUString SAL_CALL getName() throw (RuntimeException); + virtual void SAL_CALL setName( const OUString& aName ) throw (RuntimeException); + + // XNameAccess + virtual Any SAL_CALL getByName( const OUString& aName ) throw(NoSuchElementException, WrappedTargetException, RuntimeException); + virtual Sequence< OUString > SAL_CALL getElementNames() throw(RuntimeException); + virtual sal_Bool SAL_CALL hasByName( const OUString& aName ) throw(RuntimeException); + + // XElementAccess + virtual ::com::sun::star::uno::Type SAL_CALL getElementType() throw(RuntimeException); + virtual sal_Bool SAL_CALL hasElements() throw(RuntimeException); + + // XIndexAccess + virtual sal_Int32 SAL_CALL getCount() throw(RuntimeException) ; + virtual Any SAL_CALL getByIndex( sal_Int32 Index ) throw(IndexOutOfBoundsException, WrappedTargetException, RuntimeException); + + // XNameReplace + virtual void SAL_CALL replaceByName( const OUString& aName, const Any& aElement ) throw(IllegalArgumentException, NoSuchElementException, WrappedTargetException, RuntimeException); + + // XModifyBroadcaster + virtual void SAL_CALL addModifyListener( const Reference< XModifyListener >& aListener ) throw (RuntimeException); + virtual void SAL_CALL removeModifyListener( const Reference< XModifyListener >& aListener ) throw (RuntimeException); + + // XModifyListener + virtual void SAL_CALL modified( const ::com::sun::star::lang::EventObject& aEvent ) throw (::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL disposing( const ::com::sun::star::lang::EventObject& Source ) throw (::com::sun::star::uno::RuntimeException); + + void notifyModifyListener(); + + // this function is called upon disposing the component + virtual void SAL_CALL disposing(); + + static const CellStyleNameMap& getCellStyleNameMap(); + + OUString msName; + Reference< XStyle > maCellStyles[style_count]; +}; + +typedef std::vector< Reference< XStyle > > TableDesignStyleVector; + +class TableDesignFamily : public ::cppu::WeakImplHelper7< XNameContainer, XNamed, XIndexAccess, XSingleServiceFactory, XServiceInfo, XComponent, XPropertySet > +{ +public: + // XServiceInfo + virtual OUString SAL_CALL getImplementationName() throw(RuntimeException); + virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) throw(RuntimeException); + virtual Sequence< OUString > SAL_CALL getSupportedServiceNames() throw(RuntimeException); + + // XNamed + virtual OUString SAL_CALL getName( ) throw (RuntimeException); + virtual void SAL_CALL setName( const OUString& aName ) throw (RuntimeException); + + // XNameAccess + virtual Any SAL_CALL getByName( const OUString& aName ) throw(NoSuchElementException, WrappedTargetException, RuntimeException); + virtual Sequence< OUString > SAL_CALL getElementNames() throw(RuntimeException); + virtual sal_Bool SAL_CALL hasByName( const OUString& aName ) throw(RuntimeException); + + // XElementAccess + virtual Type SAL_CALL getElementType() throw(RuntimeException); + virtual sal_Bool SAL_CALL hasElements() throw(RuntimeException); + + // XIndexAccess + virtual sal_Int32 SAL_CALL getCount() throw(RuntimeException) ; + virtual Any SAL_CALL getByIndex( sal_Int32 Index ) throw(IndexOutOfBoundsException, WrappedTargetException, RuntimeException); + + // XNameContainer + virtual void SAL_CALL insertByName( const OUString& aName, const Any& aElement ) throw(IllegalArgumentException, ElementExistException, WrappedTargetException, RuntimeException); + virtual void SAL_CALL removeByName( const OUString& Name ) throw(NoSuchElementException, WrappedTargetException, RuntimeException); + + // XNameReplace + virtual void SAL_CALL replaceByName( const OUString& aName, const Any& aElement ) throw(IllegalArgumentException, NoSuchElementException, WrappedTargetException, RuntimeException); + + // XSingleServiceFactory + virtual Reference< XInterface > SAL_CALL createInstance( ) throw(Exception, RuntimeException); + virtual Reference< XInterface > SAL_CALL createInstanceWithArguments( const Sequence< Any >& aArguments ) throw(Exception, RuntimeException); + + // XComponent + virtual void SAL_CALL dispose( ) throw (RuntimeException); + virtual void SAL_CALL addEventListener( const Reference< XEventListener >& xListener ) throw (RuntimeException); + virtual void SAL_CALL removeEventListener( const Reference< XEventListener >& aListener ) throw (RuntimeException); + + // XPropertySet + virtual Reference<XPropertySetInfo> SAL_CALL getPropertySetInfo() throw (RuntimeException); + virtual void SAL_CALL setPropertyValue( const OUString& aPropertyName, const Any& aValue ) throw (UnknownPropertyException, PropertyVetoException, IllegalArgumentException, WrappedTargetException, RuntimeException); + virtual Any SAL_CALL getPropertyValue( const OUString& PropertyName ) throw (UnknownPropertyException, WrappedTargetException, RuntimeException); + virtual void SAL_CALL addPropertyChangeListener( const OUString& aPropertyName, const Reference<XPropertyChangeListener>& xListener ) throw (UnknownPropertyException, WrappedTargetException, RuntimeException); + virtual void SAL_CALL removePropertyChangeListener( const OUString& aPropertyName, const Reference<XPropertyChangeListener>& aListener ) throw (UnknownPropertyException, WrappedTargetException, RuntimeException); + virtual void SAL_CALL addVetoableChangeListener(const OUString& PropertyName, const Reference<XVetoableChangeListener>& aListener ) throw (UnknownPropertyException, WrappedTargetException, RuntimeException); + virtual void SAL_CALL removeVetoableChangeListener(const OUString& PropertyName,const Reference<XVetoableChangeListener>&aListener ) throw (UnknownPropertyException, WrappedTargetException, RuntimeException); + + TableDesignStyleVector maDesigns; +}; + +//------------------------------------------------------------------------ +// TableDesignStyle +//------------------------------------------------------------------------ + +TableDesignStyle::TableDesignStyle() +: TableDesignStyleBase(m_aMutex) +{ +} + +const CellStyleNameMap& TableDesignStyle::getCellStyleNameMap() +{ + static CellStyleNameMap aMap; + if( aMap.empty() ) + { + CellStyleNameMap aNewMap; + aNewMap[ OUString( RTL_CONSTASCII_USTRINGPARAM( "first-row" ) ) ] = first_row_style; + aNewMap[ OUString( RTL_CONSTASCII_USTRINGPARAM( "last-row" ) ) ] = last_row_style; + aNewMap[ OUString( RTL_CONSTASCII_USTRINGPARAM( "first-column" ) ) ] = first_column_style; + aNewMap[ OUString( RTL_CONSTASCII_USTRINGPARAM( "last-column" ) ) ] = last_column_style; + aNewMap[ OUString( RTL_CONSTASCII_USTRINGPARAM( "body" ) ) ] = body_style; + aNewMap[ OUString( RTL_CONSTASCII_USTRINGPARAM( "even-rows" ) ) ] = even_rows_style; + aNewMap[ OUString( RTL_CONSTASCII_USTRINGPARAM( "odd-rows" ) ) ] = odd_rows_style; + aNewMap[ OUString( RTL_CONSTASCII_USTRINGPARAM( "even-columns" ) ) ] = even_columns_style; + aNewMap[ OUString( RTL_CONSTASCII_USTRINGPARAM( "odd-columns" ) ) ] = odd_columns_style; + aNewMap[ OUString( RTL_CONSTASCII_USTRINGPARAM( "background" ) ) ] = background_style; + aMap.swap( aNewMap ); + } + + return aMap; +} + +// ---------------------------------------------------------- +// XServiceInfo +// ---------------------------------------------------------- + +OUString SAL_CALL TableDesignStyle::getImplementationName() throw(RuntimeException) +{ + return OUString( RTL_CONSTASCII_USTRINGPARAM("TableDesignStyle") ); +} + +// ---------------------------------------------------------- + +sal_Bool SAL_CALL TableDesignStyle::supportsService( const OUString& ServiceName ) throw(RuntimeException) +{ + return comphelper::ServiceInfoHelper::supportsService( ServiceName, getSupportedServiceNames() ); +} + +// ---------------------------------------------------------- + +Sequence< OUString > SAL_CALL TableDesignStyle::getSupportedServiceNames() throw(RuntimeException) +{ + OUString aServiceName( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.style.Style") ); + Sequence< OUString > aSeq( &aServiceName, 1 ); + return aSeq; +} + +// ---------------------------------------------------------- +// XStyle +// ---------------------------------------------------------- + +sal_Bool SAL_CALL TableDesignStyle::isUserDefined() throw (RuntimeException) +{ + return sal_False; +} + +// ---------------------------------------------------------- + +sal_Bool SAL_CALL TableDesignStyle::isInUse() throw (RuntimeException) +{ + ClearableMutexGuard aGuard( rBHelper.rMutex ); + OInterfaceContainerHelper * pContainer = rBHelper.getContainer( XModifyListener::static_type() ); + if( pContainer ) + { + Sequence< Reference< XInterface > > aListener( pContainer->getElements() ); + aGuard.clear(); + + sal_Int32 nIndex = aListener.getLength(); + while( --nIndex >= 0 ) + { + TableDesignUser* pUser = dynamic_cast< TableDesignUser* >( aListener[nIndex].get() ); + if( pUser && pUser->isInUse() ) + return sal_True; + } + } + return sal_False; +} + +// ---------------------------------------------------------- + +OUString SAL_CALL TableDesignStyle::getParentStyle() throw (RuntimeException) +{ + return OUString(); +} + +// ---------------------------------------------------------- + +void SAL_CALL TableDesignStyle::setParentStyle( const OUString& ) throw (NoSuchElementException, RuntimeException) +{ +} + +// ---------------------------------------------------------- +// XNamed +// ---------------------------------------------------------- + +OUString SAL_CALL TableDesignStyle::getName() throw (RuntimeException) +{ + return msName; +} + +// ---------------------------------------------------------- + +void SAL_CALL TableDesignStyle::setName( const OUString& rName ) throw (RuntimeException) +{ + msName = rName; +} + +// ---------------------------------------------------------- +// XNameAccess +// ---------------------------------------------------------- + +Any SAL_CALL TableDesignStyle::getByName( const OUString& rName ) throw(NoSuchElementException, WrappedTargetException, RuntimeException) +{ + OGuard aGuard( Application::GetSolarMutex() ); + + const CellStyleNameMap& rMap = getCellStyleNameMap(); + + CellStyleNameMap::const_iterator iter = rMap.find( rName ); + if( iter == rMap.end() ) + throw NoSuchElementException(); + + return Any( maCellStyles[(*iter).second] ); +} + +// ---------------------------------------------------------- + +Sequence< OUString > SAL_CALL TableDesignStyle::getElementNames() throw(RuntimeException) +{ + OGuard aGuard( Application::GetSolarMutex() ); + + const CellStyleNameMap& rMap = getCellStyleNameMap(); + Sequence< OUString > aRet( rMap.size() ); + OUString* pName = aRet.getArray(); + + CellStyleNameMap::const_iterator iter = rMap.begin(); + while( iter != rMap.end() ) + *pName++ = (*iter++).first; + + return aRet; +} + +// ---------------------------------------------------------- + +sal_Bool SAL_CALL TableDesignStyle::hasByName( const OUString& rName ) throw(RuntimeException) +{ + OGuard aGuard( Application::GetSolarMutex() ); + + const CellStyleNameMap& rMap = getCellStyleNameMap(); + + CellStyleNameMap::const_iterator iter = rMap.find( rName ); + return ( iter != rMap.end() ) ? sal_True : sal_False; +} + +// ---------------------------------------------------------- +// XElementAccess +// ---------------------------------------------------------- + +Type SAL_CALL TableDesignStyle::getElementType() throw(RuntimeException) +{ + return XStyle::static_type(); +} + +// ---------------------------------------------------------- + +sal_Bool SAL_CALL TableDesignStyle::hasElements() throw(RuntimeException) +{ + return sal_True; +} + +// ---------------------------------------------------------- +// XIndexAccess +// ---------------------------------------------------------- + +sal_Int32 SAL_CALL TableDesignStyle::getCount() throw(RuntimeException) +{ + return style_count; +} + +// ---------------------------------------------------------- + +Any SAL_CALL TableDesignStyle::getByIndex( sal_Int32 Index ) throw(IndexOutOfBoundsException, WrappedTargetException, RuntimeException) +{ + OGuard aGuard( Application::GetSolarMutex() ); + + if( (Index < 0) || (Index >= style_count) ) + throw IndexOutOfBoundsException(); + + return Any( maCellStyles[Index] ); +} + +// ---------------------------------------------------------- +// XNameReplace +// ---------------------------------------------------------- + +void SAL_CALL TableDesignStyle::replaceByName( const OUString& rName, const Any& aElement ) throw(IllegalArgumentException, NoSuchElementException, WrappedTargetException, RuntimeException) +{ + OGuard aGuard( Application::GetSolarMutex() ); + + const CellStyleNameMap& rMap = getCellStyleNameMap(); + CellStyleNameMap::const_iterator iter = rMap.find( rName ); + if( iter == rMap.end() ) + throw NoSuchElementException(); + + + Reference< XStyle > xNewStyle; + if( !(aElement >>= xNewStyle) ) + throw IllegalArgumentException(); + + const sal_Int32 nIndex = (*iter).second; + + Reference< XStyle > xOldStyle( maCellStyles[nIndex] ); + + if( xNewStyle != xOldStyle ) + { + Reference< XModifyListener > xListener( this ); + + // end listening to old style, if possible + Reference< XModifyBroadcaster > xOldBroadcaster( xOldStyle, UNO_QUERY ); + if( xOldBroadcaster.is() ) + xOldBroadcaster->removeModifyListener( xListener ); + + // start listening to new style, if possible + Reference< XModifyBroadcaster > xNewBroadcaster( xNewStyle, UNO_QUERY ); + if( xNewBroadcaster.is() ) + xNewBroadcaster->addModifyListener( xListener ); + + maCellStyles[nIndex] = xNewStyle; + } +} + +// ---------------------------------------------------------- +// XComponent +// ---------------------------------------------------------- + +void SAL_CALL TableDesignStyle::disposing() +{ + for( sal_Int32 nIndex = 0; nIndex < style_count; nIndex++ ) + maCellStyles[nIndex].clear(); +} + +//------------------------------------------------------------------------ +// XModifyBroadcaster +//------------------------------------------------------------------------ + +void SAL_CALL TableDesignStyle::addModifyListener( const Reference< XModifyListener >& xListener ) throw (RuntimeException) +{ + ClearableMutexGuard aGuard( rBHelper.rMutex ); + if (rBHelper.bDisposed || rBHelper.bInDispose) + { + aGuard.clear(); + EventObject aEvt( static_cast< OWeakObject * >( this ) ); + xListener->disposing( aEvt ); + } + else + { + rBHelper.addListener( XModifyListener::static_type(), xListener ); + } +} + +//------------------------------------------------------------------------ + +void SAL_CALL TableDesignStyle::removeModifyListener( const Reference< XModifyListener >& xListener ) throw (RuntimeException) +{ + rBHelper.removeListener( XModifyListener::static_type(), xListener ); +} + +//------------------------------------------------------------------------ + +void TableDesignStyle::notifyModifyListener() +{ + MutexGuard aGuard( rBHelper.rMutex ); + + OInterfaceContainerHelper * pContainer = rBHelper.getContainer( XModifyListener::static_type() ); + if( pContainer ) + { + EventObject aEvt( static_cast< OWeakObject * >( this ) ); + pContainer->forEach<XModifyListener>( boost::bind( &XModifyListener::modified, _1, boost::cref( aEvt ) ) ); + } +} + +//------------------------------------------------------------------------ +// XModifyListener +//------------------------------------------------------------------------ + +// if we get a modify hint from a style, notify all registered XModifyListener +void SAL_CALL TableDesignStyle::modified( const ::com::sun::star::lang::EventObject& ) throw (::com::sun::star::uno::RuntimeException) +{ + notifyModifyListener(); +} + +//------------------------------------------------------------------------ + +void SAL_CALL TableDesignStyle::disposing( const ::com::sun::star::lang::EventObject& ) throw (::com::sun::star::uno::RuntimeException) +{ +} + +//------------------------------------------------------------------------ +// TableStyle +//------------------------------------------------------------------------ + +// ---------------------------------------------------------- +// XServiceInfo +// ---------------------------------------------------------- + +OUString SAL_CALL TableDesignFamily::getImplementationName() throw(RuntimeException) +{ + return OUString( RTL_CONSTASCII_USTRINGPARAM("TableDesignFamily") ); +} + +// ---------------------------------------------------------- + +sal_Bool SAL_CALL TableDesignFamily::supportsService( const OUString& ServiceName ) throw(RuntimeException) +{ + return comphelper::ServiceInfoHelper::supportsService( ServiceName, getSupportedServiceNames() ); +} + +// ---------------------------------------------------------- + +Sequence< OUString > SAL_CALL TableDesignFamily::getSupportedServiceNames() throw(RuntimeException) +{ + OUString aServiceName( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.style.StyleFamily") ); + Sequence< OUString > aSeq( &aServiceName, 1 ); + return aSeq; +} + +// ---------------------------------------------------------- +// XNamed +// ---------------------------------------------------------- + +OUString SAL_CALL TableDesignFamily::getName() throw (RuntimeException) +{ + return OUString( RTL_CONSTASCII_USTRINGPARAM( "table" ) ); +} + +// ---------------------------------------------------------- + +void SAL_CALL TableDesignFamily::setName( const OUString& ) throw (RuntimeException) +{ +} + +// ---------------------------------------------------------- +// XNameAccess +// ---------------------------------------------------------- + +Any SAL_CALL TableDesignFamily::getByName( const OUString& rName ) throw(NoSuchElementException, WrappedTargetException, RuntimeException) +{ + OGuard aGuard( Application::GetSolarMutex() ); + + for( TableDesignStyleVector::iterator iter( maDesigns.begin() ); iter != maDesigns.end(); iter++ ) + { + if( (*iter)->getName() == rName ) + return Any( (*iter) ); + } + + throw NoSuchElementException(); +} + +// ---------------------------------------------------------- + +Sequence< OUString > SAL_CALL TableDesignFamily::getElementNames() throw(RuntimeException) +{ + OGuard aGuard( Application::GetSolarMutex() ); + + Sequence< OUString > aRet( maDesigns.size() ); + OUString* pNames = aRet.getArray(); + + for( TableDesignStyleVector::iterator iter( maDesigns.begin() ); iter != maDesigns.end(); iter++ ) + *pNames++ = (*iter)->getName(); + + return aRet; +} + +// ---------------------------------------------------------- + +sal_Bool SAL_CALL TableDesignFamily::hasByName( const OUString& aName ) throw(RuntimeException) +{ + OGuard aGuard( Application::GetSolarMutex() ); + + for( TableDesignStyleVector::iterator iter( maDesigns.begin() ); iter != maDesigns.end(); iter++ ) + if( (*iter)->getName() == aName ) + return sal_True; + + return sal_False; +} + +// ---------------------------------------------------------- +// XElementAccess +// ---------------------------------------------------------- + +Type SAL_CALL TableDesignFamily::getElementType() throw(RuntimeException) +{ + return XStyle::static_type(); +} + +// ---------------------------------------------------------- + +sal_Bool SAL_CALL TableDesignFamily::hasElements() throw(RuntimeException) +{ + OGuard aGuard( Application::GetSolarMutex() ); + + return maDesigns.empty() ? sal_False : sal_True; +} + +// ---------------------------------------------------------- +// XIndexAccess +// ---------------------------------------------------------- + +sal_Int32 SAL_CALL TableDesignFamily::getCount() throw(RuntimeException) +{ + OGuard aGuard( Application::GetSolarMutex() ); + + return sal::static_int_cast< sal_Int32 >( maDesigns.size() ); +} + +// ---------------------------------------------------------- + +Any SAL_CALL TableDesignFamily::getByIndex( sal_Int32 Index ) throw(IndexOutOfBoundsException, WrappedTargetException, RuntimeException) +{ + OGuard aGuard( Application::GetSolarMutex() ); + + if( (Index >= 0) && (Index < sal::static_int_cast< sal_Int32 >( maDesigns.size() ) ) ) + return Any( maDesigns[Index] ); + + throw IndexOutOfBoundsException(); +} + +// ---------------------------------------------------------- +// XNameContainer +// ---------------------------------------------------------- + +void SAL_CALL TableDesignFamily::insertByName( const OUString& rName, const Any& rElement ) throw(IllegalArgumentException, ElementExistException, WrappedTargetException, RuntimeException) +{ + OGuard aGuard( Application::GetSolarMutex() ); + + Reference< XStyle > xStyle( rElement, UNO_QUERY ); + if( !xStyle.is() ) + throw IllegalArgumentException(); + + xStyle->setName( rName ); + for( TableDesignStyleVector::iterator iter( maDesigns.begin() ); iter != maDesigns.end(); iter++ ) + if( (*iter)->getName() == rName ) + throw ElementExistException(); + + maDesigns.push_back( xStyle ); +} + +// ---------------------------------------------------------- + +void SAL_CALL TableDesignFamily::removeByName( const OUString& rName ) throw(NoSuchElementException, WrappedTargetException, RuntimeException) +{ + OGuard aGuard( Application::GetSolarMutex() ); + + for( TableDesignStyleVector::iterator iter( maDesigns.begin() ); iter != maDesigns.end(); iter++ ) + { + if( (*iter)->getName() == rName ) + { + maDesigns.erase( iter ); + return; + } + } + + + throw NoSuchElementException(); +} + +// ---------------------------------------------------------- +// XNameReplace +// ---------------------------------------------------------- + +void SAL_CALL TableDesignFamily::replaceByName( const OUString& rName, const Any& aElement ) throw(IllegalArgumentException, NoSuchElementException, WrappedTargetException, RuntimeException) +{ + OGuard aGuard( Application::GetSolarMutex() ); + + Reference< XStyle > xStyle( aElement, UNO_QUERY ); + if( !xStyle.is() ) + throw IllegalArgumentException(); + + for( TableDesignStyleVector::iterator iter( maDesigns.begin() ); iter != maDesigns.end(); iter++ ) + { + if( (*iter)->getName() == rName ) + { + (*iter) = xStyle; + xStyle->setName( rName ); + return; + } + } + + throw NoSuchElementException(); +} + +// ---------------------------------------------------------- +// XSingleServiceFactory +// ---------------------------------------------------------- + +Reference< XInterface > SAL_CALL TableDesignFamily::createInstance() throw(Exception, RuntimeException) +{ + OGuard aGuard( Application::GetSolarMutex() ); + + return Reference< XInterface >( static_cast< XStyle* >( new TableDesignStyle ) ); +} + +// ---------------------------------------------------------- + +Reference< XInterface > SAL_CALL TableDesignFamily::createInstanceWithArguments( const Sequence< Any >& ) throw(Exception, RuntimeException) +{ + return createInstance(); +} + +// ---------------------------------------------------------- +// XComponent +// ---------------------------------------------------------- + +void SAL_CALL TableDesignFamily::dispose( ) throw (RuntimeException) +{ + TableDesignStyleVector aDesigns; + aDesigns.swap( maDesigns ); + + for( TableDesignStyleVector::iterator iter( aDesigns.begin() ); iter != aDesigns.end(); iter++ ) + { + Reference< XComponent > xComp( (*iter), UNO_QUERY ); + if( xComp.is() ) + xComp->dispose(); + } +} + +// ---------------------------------------------------------- + +void SAL_CALL TableDesignFamily::addEventListener( const Reference< XEventListener >& ) throw (RuntimeException) +{ +} + +// ---------------------------------------------------------- + +void SAL_CALL TableDesignFamily::removeEventListener( const Reference< XEventListener >& ) throw (RuntimeException) +{ +} + +// ---------------------------------------------------------- +// XPropertySet +// ---------------------------------------------------------- + +Reference<XPropertySetInfo> TableDesignFamily::getPropertySetInfo() throw (RuntimeException) +{ + OSL_ENSURE( 0, "###unexpected!" ); + return Reference<XPropertySetInfo>(); +} + +// ---------------------------------------------------------- + +void TableDesignFamily::setPropertyValue( const OUString& , const Any& ) throw (UnknownPropertyException, PropertyVetoException, IllegalArgumentException, WrappedTargetException, RuntimeException) +{ + OSL_ENSURE( 0, "###unexpected!" ); +} + +// ---------------------------------------------------------- + +Any TableDesignFamily::getPropertyValue( const OUString& PropertyName ) throw (UnknownPropertyException, WrappedTargetException, RuntimeException) +{ + if (PropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("DisplayName") )) + { + OUString sDisplayName( SVX_RESSTR( RID_SVXSTR_STYLEFAMILY_TABLEDESIGN ) ); + return Any( sDisplayName ); + } + else + { + throw UnknownPropertyException( OUString( RTL_CONSTASCII_USTRINGPARAM("unknown property: ") ) + PropertyName, static_cast<OWeakObject *>(this) ); + } +} + +// ---------------------------------------------------------- + +void TableDesignFamily::addPropertyChangeListener( const OUString& , const Reference<XPropertyChangeListener>& ) throw (UnknownPropertyException, WrappedTargetException, RuntimeException) +{ + OSL_ENSURE( 0, "###unexpected!" ); +} + +// ---------------------------------------------------------- + +void TableDesignFamily::removePropertyChangeListener( const OUString& , const Reference<XPropertyChangeListener>& ) throw (UnknownPropertyException, WrappedTargetException, RuntimeException) +{ + OSL_ENSURE( 0, "###unexpected!" ); +} + +// ---------------------------------------------------------- + +void TableDesignFamily::addVetoableChangeListener( const OUString& , const Reference<XVetoableChangeListener>& ) throw (UnknownPropertyException, WrappedTargetException, RuntimeException) +{ + OSL_ENSURE( 0, "###unexpected!" ); +} + +// ---------------------------------------------------------- + +void TableDesignFamily::removeVetoableChangeListener( const OUString& , const Reference<XVetoableChangeListener>& ) throw (UnknownPropertyException, WrappedTargetException, RuntimeException) +{ + OSL_ENSURE( 0, "###unexpected!" ); +} + +// -------------------------------------------------------------------- + + +SVX_DLLPUBLIC Reference< XNameAccess > CreateTableDesignFamily() +{ + return new TableDesignFamily(); +} + +} } |