23#include <com/sun/star/awt/grid/XGridColumnModel.hpp>
24#include <com/sun/star/awt/grid/XGridColumn.hpp>
25#include <com/sun/star/lang/IndexOutOfBoundsException.hpp>
26#include <com/sun/star/lang/XServiceInfo.hpp>
27#include <com/sun/star/uno/XComponentContext.hpp>
42using namespace css::awt;
43using namespace css::awt::grid;
44using namespace css::container;
45using namespace css::lang;
46using namespace css::uno;
52 , css::lang::XServiceInfo
53 > DefaultGridColumnModel_Base;
55class DefaultGridColumnModel :
public DefaultGridColumnModel_Base
58 DefaultGridColumnModel();
59 DefaultGridColumnModel( DefaultGridColumnModel
const & i_copySource );
62 virtual ::sal_Int32 SAL_CALL getColumnCount()
override;
63 virtual css::uno::Reference< css::awt::grid::XGridColumn > SAL_CALL createColumn( )
override;
64 virtual ::sal_Int32 SAL_CALL addColumn(
const css::uno::Reference< css::awt::grid::XGridColumn > & column)
override;
65 virtual void SAL_CALL removeColumn( ::sal_Int32 i_columnIndex )
override;
66 virtual css::uno::Sequence< css::uno::Reference< css::awt::grid::XGridColumn > > SAL_CALL getColumns()
override;
67 virtual css::uno::Reference< css::awt::grid::XGridColumn > SAL_CALL
getColumn(::sal_Int32 index)
override;
68 virtual void SAL_CALL setDefaultColumns(sal_Int32 rowElements)
override;
76 virtual void SAL_CALL addContainerListener(
const css::uno::Reference< css::container::XContainerListener >& xListener )
override;
77 virtual void SAL_CALL removeContainerListener(
const css::uno::Reference< css::container::XContainerListener >& xListener )
override;
80 virtual css::uno::Reference< css::util::XCloneable > SAL_CALL createClone( )
override;
83 virtual void disposing( std::unique_lock<std::mutex>& )
override;
86 typedef ::std::vector< rtl::Reference< GridColumn > >
Columns;
92 DefaultGridColumnModel::DefaultGridColumnModel()
96 DefaultGridColumnModel::DefaultGridColumnModel( DefaultGridColumnModel
const & i_copySource )
99 aColumns.reserve( i_copySource.m_aColumns.size() );
102 for ( Columns::const_iterator col = i_copySource.m_aColumns.begin();
103 col != i_copySource.m_aColumns.end();
109 xClone->setIndex( col - i_copySource.m_aColumns.begin() );
111 aColumns.push_back( xClone );
114 catch(
const Exception& )
118 if ( aColumns.size() == i_copySource.m_aColumns.size() )
119 m_aColumns.swap( aColumns );
122 ::sal_Int32 SAL_CALL DefaultGridColumnModel::getColumnCount()
124 return m_aColumns.size();
128 Reference< XGridColumn > SAL_CALL DefaultGridColumnModel::createColumn( )
130 std::unique_lock aGuard(m_aMutex);
131 throwIfDisposed(aGuard);
136 ::sal_Int32 SAL_CALL DefaultGridColumnModel::addColumn(
const Reference< XGridColumn > & i_column )
138 std::unique_lock aGuard(m_aMutex);
139 throwIfDisposed(aGuard);
142 if ( pGridColumn ==
nullptr )
143 throw css::lang::IllegalArgumentException(
"invalid column implementation", *
this, 1 );
145 m_aColumns.push_back( pGridColumn );
146 sal_Int32
index = m_aColumns.size() - 1;
153 aEvent.Element <<= i_column;
161 void SAL_CALL DefaultGridColumnModel::removeColumn( ::sal_Int32 i_columnIndex )
163 std::unique_lock aGuard(m_aMutex);
164 throwIfDisposed(aGuard);
166 if ( ( i_columnIndex < 0 ) || (
o3tl::make_unsigned( i_columnIndex ) >= m_aColumns.size() ) )
167 throw css::lang::IndexOutOfBoundsException( OUString(), *
this );
169 Columns::iterator
const pos = m_aColumns.begin() + i_columnIndex;
170 Reference< XGridColumn >
const xColumn( *pos );
171 m_aColumns.erase( pos );
174 sal_Int32 columnIndex( i_columnIndex );
175 for ( Columns::iterator updatePos = m_aColumns.begin() + columnIndex;
176 updatePos != m_aColumns.end();
177 ++updatePos, ++columnIndex
181 pColumnImpl->
setIndex( columnIndex );
187 aEvent.Accessor <<= i_columnIndex;
199 catch(
const Exception& )
206 Sequence< Reference< XGridColumn > > SAL_CALL DefaultGridColumnModel::getColumns()
208 std::unique_lock aGuard(m_aMutex);
209 throwIfDisposed(aGuard);
210 return ::comphelper::containerToSequence<Reference<XGridColumn>>( m_aColumns );
214 Reference< XGridColumn > SAL_CALL DefaultGridColumnModel::getColumn(::sal_Int32 index)
216 std::unique_lock aGuard(m_aMutex);
217 throwIfDisposed(aGuard);
220 return m_aColumns[
index];
222 throw css::lang::IndexOutOfBoundsException();
226 void SAL_CALL DefaultGridColumnModel::setDefaultColumns(sal_Int32 rowElements)
228 ::std::vector< ContainerEvent > aRemovedColumns;
229 ::std::vector< ContainerEvent > aInsertedColumns;
231 std::unique_lock aGuard(m_aMutex);
232 throwIfDisposed(aGuard);
235 while ( !m_aColumns.empty() )
237 const size_t lastColIndex = m_aColumns.size() - 1;
241 aEvent.Accessor <<= sal_Int32( lastColIndex );
242 aEvent.Element <<= Reference<XGridColumn>(m_aColumns[ lastColIndex ]);
243 aRemovedColumns.push_back( aEvent );
245 m_aColumns.erase( m_aColumns.begin() + lastColIndex );
249 for ( sal_Int32 i=0;
i<rowElements; ++
i )
252 OUString colTitle =
"Column " + OUString::number( i + 1 );
253 pGridColumn->setTitle( colTitle );
254 pGridColumn->setColumnWidth( 80 );
255 pGridColumn->setFlexibility( 1 );
256 pGridColumn->setResizeable(
true );
257 pGridColumn->setDataColumnIndex( i );
262 aEvent.Element <<= Reference<XGridColumn>(pGridColumn);
263 aInsertedColumns.push_back( aEvent );
265 m_aColumns.push_back( pGridColumn );
266 pGridColumn->setIndex( i );
270 for (
const auto& rEvent : aRemovedColumns)
276 for (
const auto& rEvent : aInsertedColumns)
284 for (
const auto& rEvent : aRemovedColumns)
288 const Reference< XComponent > xColComp( rEvent.Element, UNO_QUERY_THROW );
291 catch(
const Exception& )
299 OUString SAL_CALL DefaultGridColumnModel::getImplementationName( )
301 return "stardiv.Toolkit.DefaultGridColumnModel";
304 sal_Bool SAL_CALL DefaultGridColumnModel::supportsService(
const OUString& i_serviceName )
309 Sequence< OUString > SAL_CALL DefaultGridColumnModel::getSupportedServiceNames( )
311 return {
"com.sun.star.awt.grid.DefaultGridColumnModel" };
315 void SAL_CALL DefaultGridColumnModel::addContainerListener(
const Reference< XContainerListener >& i_listener )
317 std::unique_lock aGuard(m_aMutex);
318 if ( i_listener.is() )
319 m_aContainerListeners.addInterface( aGuard, i_listener );
323 void SAL_CALL DefaultGridColumnModel::removeContainerListener(
const Reference< XContainerListener >& i_listener )
325 std::unique_lock aGuard(m_aMutex);
326 if ( i_listener.is() )
327 m_aContainerListeners.removeInterface( aGuard, i_listener );
331 void DefaultGridColumnModel::disposing( std::unique_lock<std::mutex>& rGuard )
333 DefaultGridColumnModel_Base::disposing(rGuard);
335 EventObject
aEvent( *
this );
336 m_aContainerListeners.disposeAndClear( rGuard, aEvent );
339 while ( !m_aColumns.empty() )
343 m_aColumns[ 0 ]->dispose();
345 catch(
const Exception& )
350 m_aColumns.erase( m_aColumns.begin() );
357 Reference< css::util::XCloneable > SAL_CALL DefaultGridColumnModel::createClone( )
359 std::unique_lock aGuard(m_aMutex);
360 throwIfDisposed(aGuard);
361 return new DefaultGridColumnModel( *
this );
366extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface *
368 css::uno::XComponentContext *,
369 css::uno::Sequence<css::uno::Any>
const &)
371 return cppu::acquire(
new DefaultGridColumnModel());
SAL_DLLPUBLIC_EXPORT css::uno::XInterface * stardiv_Toolkit_DefaultGridColumnModel_get_implementation(css::uno::XComponentContext *, css::uno::Sequence< css::uno::Any > const &)
#define DBG_UNHANDLED_EXCEPTION(...)
void SAL_CALL elementRemoved(const css::container::ContainerEvent &Event) override
DECL_LISTENERMULTIPLEXER_END void SAL_CALL elementInserted(const css::container::ContainerEvent &Event) override
B2DTuple getColumn(const B2DHomMatrix &rMatrix, sal_uInt16 nCol)
css::uno::Sequence< OUString > getSupportedServiceNames()
OUString getImplementationName()
bool CPPUHELPER_DLLPUBLIC supportsService(css::lang::XServiceInfo *implementation, rtl::OUString const &name)
constexpr std::enable_if_t< std::is_signed_v< T >, std::make_unsigned_t< T > > make_unsigned(T value)