21#include <com/sun/star/i18n/Collator.hpp>
22#include <com/sun/star/i18n/XCollator.hpp>
23#include <com/sun/star/lang/IllegalArgumentException.hpp>
24#include <com/sun/star/lang/IndexOutOfBoundsException.hpp>
25#include <com/sun/star/lang/XInitialization.hpp>
26#include <com/sun/star/lang/XServiceInfo.hpp>
27#include <com/sun/star/lang/NotInitializedException.hpp>
28#include <com/sun/star/ucb/AlreadyInitializedException.hpp>
29#include <com/sun/star/uno/XComponentContext.hpp>
30#include <com/sun/star/awt/grid/XGridDataListener.hpp>
31#include <com/sun/star/awt/grid/XSortableMutableGridDataModel.hpp>
45using namespace css::awt;
46using namespace css::awt::grid;
47using namespace css::i18n;
48using namespace css::lang;
49using namespace css::ucb;
50using namespace css::uno;
54class SortableGridDataModel;
57typedef ::cppu::WeakComponentImplHelper < css::awt::grid::XSortableMutableGridDataModel
58 , css::lang::XServiceInfo
59 , css::lang::XInitialization
60 > SortableGridDataModel_Base;
62 > SortableGridDataModel_PrivateBase;
64 ,
public SortableGridDataModel_Base
65 ,
public SortableGridDataModel_PrivateBase
68 explicit SortableGridDataModel(
const css::uno::Reference< css::uno::XComponentContext > & rxContext );
69 SortableGridDataModel( SortableGridDataModel
const & i_copySource );
71 bool isInitialized()
const {
return m_isInitialized; }
74 virtual ~SortableGridDataModel()
override;
78 virtual void SAL_CALL sortByColumn( ::sal_Int32 ColumnIndex,
sal_Bool SortAscending )
override;
79 virtual void SAL_CALL removeColumnSort( )
override;
80 virtual css::beans::Pair< ::sal_Int32, sal_Bool > SAL_CALL getCurrentSortOrder( )
override;
83 virtual void SAL_CALL addRow(
const css::uno::Any& Heading,
const css::uno::Sequence< css::uno::Any >& Data )
override;
84 virtual void SAL_CALL addRows(
const css::uno::Sequence< css::uno::Any >& Headings,
const css::uno::Sequence< css::uno::Sequence< css::uno::Any > >& Data )
override;
85 virtual void SAL_CALL insertRow( ::sal_Int32 i_index,
const css::uno::Any& i_heading,
const css::uno::Sequence< css::uno::Any >& Data )
override;
86 virtual void SAL_CALL insertRows( ::sal_Int32 i_index,
const css::uno::Sequence< css::uno::Any>& Headings,
const css::uno::Sequence< css::uno::Sequence< css::uno::Any > >& Data )
override;
87 virtual void SAL_CALL removeRow( ::sal_Int32 RowIndex )
override;
88 virtual void SAL_CALL removeAllRows( )
override;
89 virtual void SAL_CALL updateCellData( ::sal_Int32 ColumnIndex, ::sal_Int32 RowIndex,
const css::uno::Any& Value )
override;
90 virtual void SAL_CALL updateRowData(
const css::uno::Sequence< ::sal_Int32 >& ColumnIndexes, ::sal_Int32 RowIndex,
const css::uno::Sequence< css::uno::Any >& Values )
override;
91 virtual void SAL_CALL updateRowHeading( ::sal_Int32 RowIndex,
const css::uno::Any& Heading )
override;
92 virtual void SAL_CALL updateCellToolTip( ::sal_Int32 ColumnIndex, ::sal_Int32 RowIndex,
const css::uno::Any& Value )
override;
93 virtual void SAL_CALL updateRowToolTip( ::sal_Int32 RowIndex,
const css::uno::Any& Value )
override;
94 virtual void SAL_CALL addGridDataListener(
const css::uno::Reference< css::awt::grid::XGridDataListener >& Listener )
override;
95 virtual void SAL_CALL removeGridDataListener(
const css::uno::Reference< css::awt::grid::XGridDataListener >& Listener )
override;
98 virtual ::sal_Int32 SAL_CALL getRowCount()
override;
99 virtual ::sal_Int32 SAL_CALL getColumnCount()
override;
100 virtual css::uno::Any SAL_CALL getCellData( ::sal_Int32
Column, ::sal_Int32 RowIndex )
override;
101 virtual css::uno::Any SAL_CALL getCellToolTip( ::sal_Int32
Column, ::sal_Int32 RowIndex )
override;
102 virtual css::uno::Any SAL_CALL getRowHeading( ::sal_Int32 RowIndex )
override;
103 virtual css::uno::Sequence< css::uno::Any > SAL_CALL getRowData( ::sal_Int32 RowIndex )
override;
106 virtual void SAL_CALL disposing()
override;
109 virtual css::uno::Reference< css::util::XCloneable > SAL_CALL createClone( )
override;
117 virtual void SAL_CALL initialize(
const css::uno::Sequence< css::uno::Any >& aArguments )
override;
120 virtual void SAL_CALL rowsInserted(
const css::awt::grid::GridDataEvent& Event )
override;
121 virtual void SAL_CALL rowsRemoved(
const css::awt::grid::GridDataEvent& Event )
override;
122 virtual void SAL_CALL dataChanged(
const css::awt::grid::GridDataEvent& Event )
override;
123 virtual void SAL_CALL rowHeadingChanged(
const css::awt::grid::GridDataEvent& Event )
override;
126 virtual void SAL_CALL disposing(
const css::lang::EventObject& i_event )
override;
129 virtual css::uno::Any SAL_CALL
queryInterface(
const css::uno::Type& aType )
override;
130 virtual void SAL_CALL acquire( ) noexcept final override;
131 virtual
void SAL_CALL release( ) noexcept override;
134 virtual css::
uno::Sequence< css::
uno::
Type > SAL_CALL getTypes( ) override;
135 virtual css::
uno::Sequence< ::
sal_Int8 > SAL_CALL getImplementationId( ) override;
142 ::sal_Int32 impl_getPrivateRowIndex_throw( ::sal_Int32 const i_publicRowIndex ) const;
146 ::sal_Int32 impl_getPublicRowIndex_nothrow( ::sal_Int32 const i_privateRowIndex ) const;
148 bool impl_isSorted_nothrow()
const
150 return m_currentSortColumn >= 0;
158 bool impl_reIndex_nothrow( ::sal_Int32
const i_columnIndex,
bool const i_sortAscending );
163 css::awt::grid::GridDataEvent
164 impl_createPublicEvent( css::awt::grid::GridDataEvent
const & i_originalEvent )
const;
169 void ( SAL_CALL css::awt::grid::XGridDataListener::*i_listenerMethod )(
const css::awt::grid::GridDataEvent & ),
170 css::awt::grid::GridDataEvent
const & i_publicEvent,
171 MethodGuard& i_instanceLock
181 void impl_rebuildIndexesAndNotify( MethodGuard& i_instanceLock );
185 void impl_removeColumnSort( MethodGuard& i_instanceLock );
189 void impl_removeColumnSort_noBroadcast();
192 css::uno::Reference< css::uno::XComponentContext >
m_xContext;
193 bool m_isInitialized;
194 css::uno::Reference< css::awt::grid::XMutableGridDataModel > m_delegator;
195 css::uno::Reference< css::i18n::XCollator > m_collator;
196 ::sal_Int32 m_currentSortColumn;
198 ::std::vector< ::sal_Int32 > m_publicToPrivateRowIndex;
199 ::std::vector< ::sal_Int32 > m_privateToPublicRowIndex;
206 :
comphelper::ComponentGuard( i_component, i_broadcastHelper )
208 if ( !i_component.isInitialized() )
209 throw css::lang::NotInitializedException( OUString(), i_component );
213template<
class STLCONTAINER >
214void lcl_clear( STLCONTAINER& i_container )
216 STLCONTAINER().swap(i_container);
219 SortableGridDataModel::SortableGridDataModel( Reference< XComponentContext >
const & rxContext )
220 :SortableGridDataModel_Base(
m_aMutex )
221 ,SortableGridDataModel_PrivateBase()
223 ,m_isInitialized( false )
226 ,m_currentSortColumn( -1 )
228 ,m_publicToPrivateRowIndex()
229 ,m_privateToPublicRowIndex()
234 SortableGridDataModel::SortableGridDataModel( SortableGridDataModel
const & i_copySource )
236 ,SortableGridDataModel_Base(
m_aMutex )
237 ,SortableGridDataModel_PrivateBase()
239 ,m_isInitialized( true )
241 ,m_collator( i_copySource.m_collator )
242 ,m_currentSortColumn( i_copySource.m_currentSortColumn )
244 ,m_publicToPrivateRowIndex( i_copySource.m_publicToPrivateRowIndex )
245 ,m_privateToPublicRowIndex( i_copySource.m_privateToPublicRowIndex )
248 "not expected to be called for a disposed copy source!" );
249 m_delegator.set( i_copySource.m_delegator->createClone(), UNO_QUERY_THROW );
253 SortableGridDataModel::~SortableGridDataModel()
255 if ( !rBHelper.bDisposed )
263 Any SAL_CALL SortableGridDataModel::queryInterface(
const Type& aType )
265 Any aReturn( SortableGridDataModel_Base::queryInterface( aType ) );
266 if ( !aReturn.hasValue() )
267 aReturn = SortableGridDataModel_PrivateBase::queryInterface( aType );
272 void SAL_CALL SortableGridDataModel::acquire( ) noexcept
274 SortableGridDataModel_Base::acquire();
278 void SAL_CALL SortableGridDataModel::release( ) noexcept
280 SortableGridDataModel_Base::release();
284 Sequence< Type > SAL_CALL SortableGridDataModel::getTypes( )
286 return SortableGridDataModel_Base::getTypes();
291 Sequence< ::sal_Int8 > SAL_CALL SortableGridDataModel::getImplementationId( )
293 return css::uno::Sequence<sal_Int8>();
296 Reference< XCollator > lcl_loadDefaultCollator_throw(
const Reference<XComponentContext> & rxContext )
298 Reference< XCollator >
const xCollator = Collator::create( rxContext );
303 void SAL_CALL SortableGridDataModel::initialize(
const Sequence< Any >& i_arguments )
307 if ( m_delegator.is() )
308 throw AlreadyInitializedException( OUString(), *
this );
310 Reference< XMutableGridDataModel > xDelegator;
311 Reference< XCollator > xCollator;
312 switch ( i_arguments.getLength() )
315 xDelegator.set( i_arguments[0], UNO_QUERY );
316 xCollator = lcl_loadDefaultCollator_throw( m_xContext );
320 xDelegator.set( i_arguments[0], UNO_QUERY );
321 xCollator.set( i_arguments[1], UNO_QUERY );
322 if ( !xCollator.is() )
323 throw IllegalArgumentException( OUString(), *
this, 2 );
326 if ( !xDelegator.is() )
327 throw IllegalArgumentException( OUString(), *
this, 1 );
329 m_delegator = xDelegator;
330 m_collator = xCollator;
332 m_delegator->addGridDataListener(
this );
334 m_isInitialized =
true;
338 GridDataEvent SortableGridDataModel::impl_createPublicEvent( GridDataEvent
const & i_originalEvent )
const
340 GridDataEvent
aEvent( i_originalEvent );
341 aEvent.Source = *
const_cast< SortableGridDataModel*
>( this );
342 aEvent.FirstRow = impl_getPublicRowIndex_nothrow(
aEvent.FirstRow );
343 aEvent.LastRow = impl_getPublicRowIndex_nothrow(
aEvent.LastRow );
348 void SortableGridDataModel::impl_broadcast(
void ( SAL_CALL XGridDataListener::*i_listenerMethod )(
const GridDataEvent & ),
349 GridDataEvent
const & i_publicEvent, MethodGuard& i_instanceLock )
352 if ( pListeners ==
nullptr )
355 i_instanceLock.clear();
356 pListeners->
notifyEach( i_listenerMethod, i_publicEvent );
360 void SAL_CALL SortableGridDataModel::rowsInserted(
const GridDataEvent& i_event )
362 MethodGuard aGuard( *
this, rBHelper );
364 if ( impl_isSorted_nothrow() )
368 impl_removeColumnSort( aGuard );
372 GridDataEvent
const aEvent( impl_createPublicEvent( i_event ) );
373 impl_broadcast( &XGridDataListener::rowsInserted, aEvent, aGuard );
376 void lcl_decrementValuesGreaterThan( ::std::vector< ::sal_Int32 > & io_indexMap, sal_Int32
const i_threshold )
378 for (
auto& rIndex : io_indexMap )
380 if ( rIndex >= i_threshold )
385 void SortableGridDataModel::impl_rebuildIndexesAndNotify( MethodGuard& i_instanceLock )
387 OSL_PRECOND( impl_isSorted_nothrow(),
"SortableGridDataModel::impl_rebuildIndexesAndNotify: illegal call!" );
390 lcl_clear( m_publicToPrivateRowIndex );
391 lcl_clear( m_privateToPublicRowIndex );
396 impl_removeColumnSort( i_instanceLock );
401 GridDataEvent
const aRemovalEvent( *
this, -1, -1, -1, -1 );
402 impl_broadcast( &XGridDataListener::rowsRemoved, aRemovalEvent, i_instanceLock );
403 i_instanceLock.reset();
406 GridDataEvent
const aAdditionEvent( *
this, -1, -1, 0, m_delegator->getRowCount() - 1 );
407 impl_broadcast( &XGridDataListener::rowsInserted, aAdditionEvent, i_instanceLock );
411 void SAL_CALL SortableGridDataModel::rowsRemoved(
const GridDataEvent& i_event )
413 MethodGuard aGuard( *
this, rBHelper );
416 if ( !impl_isSorted_nothrow() )
418 GridDataEvent
const aEvent( impl_createPublicEvent( i_event ) );
419 impl_broadcast( &XGridDataListener::rowsRemoved, aEvent, aGuard );
424 if ( i_event.FirstRow < 0 )
426 lcl_clear( m_publicToPrivateRowIndex );
427 lcl_clear( m_privateToPublicRowIndex );
428 GridDataEvent
aEvent( i_event );
430 impl_broadcast( &XGridDataListener::rowsRemoved, aEvent, aGuard );
434 bool needReIndex =
false;
435 if ( i_event.FirstRow != i_event.LastRow )
437 OSL_ENSURE(
false,
"SortableGridDataModel::rowsRemoved: missing implementation - removal of multiple rows!" );
442 OSL_ENSURE(
false,
"SortableGridDataModel::rowsRemoved: inconsistent/wrong data!" );
448 impl_rebuildIndexesAndNotify( aGuard );
453 GridDataEvent
const aEvent( impl_createPublicEvent( i_event ) );
456 sal_Int32
const privateIndex = i_event.FirstRow;
457 sal_Int32
const publicIndex =
aEvent.FirstRow;
459 m_publicToPrivateRowIndex.erase( m_publicToPrivateRowIndex.begin() + publicIndex );
460 m_privateToPublicRowIndex.erase( m_privateToPublicRowIndex.begin() + privateIndex );
463 lcl_decrementValuesGreaterThan( m_publicToPrivateRowIndex, privateIndex );
464 lcl_decrementValuesGreaterThan( m_privateToPublicRowIndex, publicIndex );
467 impl_broadcast( &XGridDataListener::rowsRemoved, aEvent, aGuard );
471 void SAL_CALL SortableGridDataModel::dataChanged(
const GridDataEvent& i_event )
473 MethodGuard aGuard( *
this, rBHelper );
475 GridDataEvent
const aEvent( impl_createPublicEvent( i_event ) );
476 impl_broadcast( &XGridDataListener::dataChanged, aEvent, aGuard );
480 void SAL_CALL SortableGridDataModel::rowHeadingChanged(
const GridDataEvent& i_event )
482 MethodGuard aGuard( *
this, rBHelper );
484 GridDataEvent
const aEvent( impl_createPublicEvent( i_event ) );
485 impl_broadcast( &XGridDataListener::rowHeadingChanged, aEvent, aGuard );
489 void SAL_CALL SortableGridDataModel::disposing(
const EventObject& )
493 class CellDataLessComparison
496 CellDataLessComparison(
497 ::std::vector< Any >
const & i_data,
499 bool const i_sortAscending
502 ,m_predicate( i_predicate )
507 bool operator()( sal_Int32
const i_lhs, sal_Int32
const i_rhs )
const
509 Any const & lhs = m_data[ i_lhs ];
510 Any const & rhs = m_data[ i_rhs ];
512 if ( !lhs.hasValue() )
514 if ( !rhs.hasValue() )
519 return m_predicate.isLess( lhs, rhs );
521 return m_predicate.isLess( rhs, lhs );
525 ::std::vector< Any >
const & m_data;
530 bool SortableGridDataModel::impl_reIndex_nothrow( ::sal_Int32
const i_columnIndex,
bool const i_sortAscending )
532 ::sal_Int32
const rowCount( getRowCount() );
533 ::std::vector< ::sal_Int32 > aPublicToPrivate( rowCount );
538 ::std::vector< Any > aColumnData( rowCount );
540 for ( ::sal_Int32 rowIndex = 0; rowIndex < rowCount; ++rowIndex )
542 aColumnData[ rowIndex ] = m_delegator->getCellData( i_columnIndex, rowIndex );
543 aPublicToPrivate[ rowIndex ] = rowIndex;
546 if ( ( dataType.getTypeClass() == TypeClass_VOID ) && aColumnData[ rowIndex ].hasValue() )
547 dataType = aColumnData[ rowIndex ].getValueType();
551 ::std::unique_ptr< ::comphelper::IKeyPredicateLess >
const pPredicate( ::comphelper::getStandardLessPredicate( dataType, m_collator ) );
553 pPredicate,
"SortableGridDataModel::impl_reIndex_nothrow: no sortable data found!");
556 CellDataLessComparison
const aComparator( aColumnData, *pPredicate, i_sortAscending );
557 ::std::sort( aPublicToPrivate.begin(), aPublicToPrivate.end(), aComparator );
559 catch(
const Exception& )
566 ::std::vector< sal_Int32 > aPrivateToPublic( aPublicToPrivate.size() );
567 for (
size_t i=0;
i<aPublicToPrivate.size(); ++
i )
568 aPrivateToPublic[ aPublicToPrivate[i] ] = i;
570 m_publicToPrivateRowIndex.swap( aPublicToPrivate );
571 m_privateToPublicRowIndex.swap( aPrivateToPublic );
577 void SAL_CALL SortableGridDataModel::sortByColumn( ::sal_Int32 i_columnIndex,
sal_Bool i_sortAscending )
579 MethodGuard aGuard( *
this, rBHelper );
581 if ( ( i_columnIndex < 0 ) || ( i_columnIndex >= getColumnCount() ) )
582 throw IndexOutOfBoundsException( OUString(), *
this );
584 if ( !impl_reIndex_nothrow( i_columnIndex, i_sortAscending ) )
587 m_currentSortColumn = i_columnIndex;
591 &XGridDataListener::dataChanged,
592 GridDataEvent( *
this, -1, -1, -1, -1 ),
598 void SortableGridDataModel::impl_removeColumnSort_noBroadcast()
600 lcl_clear( m_publicToPrivateRowIndex );
601 lcl_clear( m_privateToPublicRowIndex );
603 m_currentSortColumn = -1;
608 void SortableGridDataModel::impl_removeColumnSort( MethodGuard& i_instanceLock )
610 impl_removeColumnSort_noBroadcast();
612 &XGridDataListener::dataChanged,
613 GridDataEvent( *
this, -1, -1, -1, -1 ),
619 void SAL_CALL SortableGridDataModel::removeColumnSort( )
621 MethodGuard aGuard( *
this, rBHelper );
622 impl_removeColumnSort( aGuard );
626 css::beans::Pair< ::sal_Int32, sal_Bool > SAL_CALL SortableGridDataModel::getCurrentSortOrder( )
628 MethodGuard aGuard( *
this, rBHelper );
630 return css::beans::Pair< ::sal_Int32, sal_Bool >( m_currentSortColumn,
m_sortAscending );
634 void SAL_CALL SortableGridDataModel::addRow(
const Any& i_heading,
const Sequence< Any >& i_data )
636 MethodGuard aGuard( *
this, rBHelper );
638 Reference< XMutableGridDataModel >
const delegator( m_delegator );
640 delegator->addRow( i_heading, i_data );
644 void SAL_CALL SortableGridDataModel::addRows(
const Sequence< Any >& i_headings,
const Sequence< Sequence< Any > >& i_data )
646 MethodGuard aGuard( *
this, rBHelper );
648 Reference< XMutableGridDataModel >
const delegator( m_delegator );
650 delegator->addRows( i_headings, i_data );
654 void SAL_CALL SortableGridDataModel::insertRow( ::sal_Int32 i_index,
const Any& i_heading,
const Sequence< Any >& i_data )
656 MethodGuard aGuard( *
this, rBHelper );
658 ::sal_Int32
const rowIndex = i_index == getRowCount() ? i_index : impl_getPrivateRowIndex_throw( i_index );
661 Reference< XMutableGridDataModel >
const delegator( m_delegator );
663 delegator->insertRow( rowIndex, i_heading, i_data );
667 void SAL_CALL SortableGridDataModel::insertRows( ::sal_Int32 i_index,
const Sequence< Any>& i_headings,
const Sequence< Sequence< Any > >& i_data )
669 MethodGuard aGuard( *
this, rBHelper );
671 ::sal_Int32
const rowIndex = i_index == getRowCount() ? i_index : impl_getPrivateRowIndex_throw( i_index );
674 Reference< XMutableGridDataModel >
const delegator( m_delegator );
676 delegator->insertRows( rowIndex, i_headings, i_data );
680 void SAL_CALL SortableGridDataModel::removeRow( ::sal_Int32 i_rowIndex )
682 MethodGuard aGuard( *
this, rBHelper );
684 ::sal_Int32
const rowIndex = impl_getPrivateRowIndex_throw( i_rowIndex );
686 Reference< XMutableGridDataModel >
const delegator( m_delegator );
688 delegator->removeRow( rowIndex );
692 void SAL_CALL SortableGridDataModel::removeAllRows( )
694 MethodGuard aGuard( *
this, rBHelper );
696 Reference< XMutableGridDataModel >
const delegator( m_delegator );
698 delegator->removeAllRows();
702 void SAL_CALL SortableGridDataModel::updateCellData( ::sal_Int32 i_columnIndex, ::sal_Int32 i_rowIndex,
const Any& i_value )
704 MethodGuard aGuard( *
this, rBHelper );
706 ::sal_Int32
const rowIndex = impl_getPrivateRowIndex_throw( i_rowIndex );
708 Reference< XMutableGridDataModel >
const delegator( m_delegator );
710 delegator->updateCellData( i_columnIndex, rowIndex, i_value );
714 void SAL_CALL SortableGridDataModel::updateRowData(
const Sequence< ::sal_Int32 >& i_columnIndexes, ::sal_Int32 i_rowIndex,
const Sequence< Any >& i_values )
716 MethodGuard aGuard( *
this, rBHelper );
718 ::sal_Int32
const rowIndex = impl_getPrivateRowIndex_throw( i_rowIndex );
720 Reference< XMutableGridDataModel >
const delegator( m_delegator );
722 delegator->updateRowData( i_columnIndexes, rowIndex, i_values );
726 void SAL_CALL SortableGridDataModel::updateRowHeading( ::sal_Int32 i_rowIndex,
const Any& i_heading )
728 MethodGuard aGuard( *
this, rBHelper );
730 ::sal_Int32
const rowIndex = impl_getPrivateRowIndex_throw( i_rowIndex );
732 Reference< XMutableGridDataModel >
const delegator( m_delegator );
734 delegator->updateRowHeading( rowIndex, i_heading );
738 void SAL_CALL SortableGridDataModel::updateCellToolTip( ::sal_Int32 i_columnIndex, ::sal_Int32 i_rowIndex,
const Any& i_value )
740 MethodGuard aGuard( *
this, rBHelper );
742 ::sal_Int32
const rowIndex = impl_getPrivateRowIndex_throw( i_rowIndex );
744 Reference< XMutableGridDataModel >
const delegator( m_delegator );
746 delegator->updateCellToolTip( i_columnIndex, rowIndex, i_value );
750 void SAL_CALL SortableGridDataModel::updateRowToolTip( ::sal_Int32 i_rowIndex,
const Any& i_value )
752 MethodGuard aGuard( *
this, rBHelper );
754 ::sal_Int32
const rowIndex = impl_getPrivateRowIndex_throw( i_rowIndex );
756 Reference< XMutableGridDataModel >
const delegator( m_delegator );
758 delegator->updateRowToolTip( rowIndex, i_value );
762 void SAL_CALL SortableGridDataModel::addGridDataListener(
const Reference< XGridDataListener >& i_listener )
768 void SAL_CALL SortableGridDataModel::removeGridDataListener(
const Reference< XGridDataListener >& i_listener )
774 ::sal_Int32 SAL_CALL SortableGridDataModel::getRowCount()
776 MethodGuard aGuard( *
this, rBHelper );
778 Reference< XMutableGridDataModel >
const delegator( m_delegator );
780 return delegator->getRowCount();
784 ::sal_Int32 SAL_CALL SortableGridDataModel::getColumnCount()
786 MethodGuard aGuard( *
this, rBHelper );
788 Reference< XMutableGridDataModel >
const delegator( m_delegator );
790 return delegator->getColumnCount();
794 Any SAL_CALL SortableGridDataModel::getCellData( ::sal_Int32 i_columnIndex, ::sal_Int32 i_rowIndex )
796 MethodGuard aGuard( *
this, rBHelper );
798 ::sal_Int32
const rowIndex = impl_getPrivateRowIndex_throw( i_rowIndex );
800 Reference< XMutableGridDataModel >
const delegator( m_delegator );
802 return delegator->getCellData( i_columnIndex, rowIndex );
806 Any SAL_CALL SortableGridDataModel::getCellToolTip( ::sal_Int32 i_columnIndex, ::sal_Int32 i_rowIndex )
808 MethodGuard aGuard( *
this, rBHelper );
810 ::sal_Int32
const rowIndex = impl_getPrivateRowIndex_throw( i_rowIndex );
812 Reference< XMutableGridDataModel >
const delegator( m_delegator );
814 return delegator->getCellToolTip( i_columnIndex, rowIndex );
818 Any SAL_CALL SortableGridDataModel::getRowHeading( ::sal_Int32 i_rowIndex )
820 MethodGuard aGuard( *
this, rBHelper );
822 ::sal_Int32
const rowIndex = impl_getPrivateRowIndex_throw( i_rowIndex );
824 Reference< XMutableGridDataModel >
const delegator( m_delegator );
826 return delegator->getRowHeading( rowIndex );
830 Sequence< Any > SAL_CALL SortableGridDataModel::getRowData( ::sal_Int32 i_rowIndex )
832 MethodGuard aGuard( *
this, rBHelper );
834 ::sal_Int32
const rowIndex = impl_getPrivateRowIndex_throw( i_rowIndex );
836 Reference< XMutableGridDataModel >
const delegator( m_delegator );
838 return delegator->getRowData( rowIndex );
842 void SAL_CALL SortableGridDataModel::disposing()
844 m_currentSortColumn = -1;
846 Reference< XComponent >
const delegatorComponent( m_delegator );
847 m_delegator->removeGridDataListener(
this );
849 delegatorComponent->dispose();
851 Reference< XComponent >
const collatorComponent( m_collator, UNO_QUERY );
853 if ( collatorComponent.is() )
854 collatorComponent->dispose();
856 lcl_clear( m_publicToPrivateRowIndex );
857 lcl_clear( m_privateToPublicRowIndex );
861 Reference< css::util::XCloneable > SAL_CALL SortableGridDataModel::createClone( )
863 MethodGuard aGuard( *
this, rBHelper );
865 return new SortableGridDataModel( *
this );
869 OUString SAL_CALL SortableGridDataModel::getImplementationName( )
871 return "org.openoffice.comp.toolkit.SortableGridDataModel";
874 sal_Bool SAL_CALL SortableGridDataModel::supportsService(
const OUString& i_serviceName )
879 Sequence< OUString > SAL_CALL SortableGridDataModel::getSupportedServiceNames( )
881 return {
"com.sun.star.awt.grid.SortableGridDataModel" };
885 ::sal_Int32 SortableGridDataModel::impl_getPrivateRowIndex_throw( ::sal_Int32
const i_publicRowIndex )
const
887 if ( ( i_publicRowIndex < 0 ) || ( i_publicRowIndex >= m_delegator->getRowCount() ) )
888 throw IndexOutOfBoundsException( OUString(), *
const_cast< SortableGridDataModel*
>(
this ) );
890 if ( !impl_isSorted_nothrow() )
892 return i_publicRowIndex;
895 "SortableGridDataModel::impl_getPrivateRowIndex_throw: inconsistency!", i_publicRowIndex );
899 return m_publicToPrivateRowIndex[ i_publicRowIndex ];
903 ::sal_Int32 SortableGridDataModel::impl_getPublicRowIndex_nothrow( ::sal_Int32
const i_privateRowIndex )
const
905 if ( !impl_isSorted_nothrow() )
907 return i_privateRowIndex;
909 if ( i_privateRowIndex < 0 )
910 return i_privateRowIndex;
913 "SortableGridDataModel::impl_getPublicRowIndex_nothrow: invalid index!", i_privateRowIndex );
915 return m_privateToPublicRowIndex[ i_privateRowIndex ];
920extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface *
922 css::uno::XComponentContext *context,
923 css::uno::Sequence<css::uno::Any>
const &)
925 return cppu::acquire(
new SortableGridDataModel(context));
Reference< XComponentContext > m_xContext
static const AllSettings & GetSettings()
void notifyEach(void(SAL_CALL ListenerT::*NotificationMethod)(const EventT &), const EventT &Event)
#define ENSURE_OR_RETURN_FALSE(c, m)
#define ENSURE_OR_THROW(c, m)
#define ENSURE_OR_RETURN(c, m, r)
#define DBG_UNHANDLED_EXCEPTION(...)
const LanguageTag & getLocale()
css::uno::Sequence< OUString > getSupportedServiceNames()
OUString getImplementationName()
css::uno::Any SAL_CALL queryInterface(const css::uno::Type &rType, Interface1 *p1)
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)
SAL_DLLPUBLIC_EXPORT css::uno::XInterface * org_openoffice_comp_toolkit_SortableGridDataModel_get_implementation(css::uno::XComponentContext *context, css::uno::Sequence< css::uno::Any > const &)