1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 * This file incorporates work covered by the following license notice:
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
20 #include "unocontroltablemodel.hxx"
21 #include "unogridcolumnfacade.hxx"
23 #include "svtools/table/defaultinputhandler.hxx"
24 #include "svtools/table/gridtablerenderer.hxx"
25 #include "svtools/table/tablecontrol.hxx"
27 #include <com/sun/star/awt/grid/XGridColumn.hpp>
28 #include <com/sun/star/view/SelectionType.hpp>
29 #include <com/sun/star/awt/grid/XGridColumnListener.hpp>
30 #include <com/sun/star/awt/grid/XSortableGridData.hpp>
32 #include <comphelper/stlunosequence.hxx>
33 #include <cppuhelper/weakref.hxx>
34 #include <tools/debug.hxx>
35 #include <tools/diagnose_ex.h>
36 #include <vcl/svapp.hxx>
37 #include <osl/mutex.hxx>
39 // .....................................................................................................................
40 namespace svt
{ namespace table
42 // .....................................................................................................................
44 using ::com::sun::star::uno::Reference
;
45 using ::com::sun::star::uno::RuntimeException
;
46 using ::com::sun::star::uno::Sequence
;
47 using ::com::sun::star::uno::UNO_QUERY_THROW
;
48 using ::com::sun::star::uno::UNO_QUERY
;
49 using ::com::sun::star::awt::grid::XGridColumn
;
50 using ::com::sun::star::uno::XInterface
;
51 using ::com::sun::star::uno::Exception
;
52 using ::com::sun::star::awt::grid::XGridColumnListener
;
53 using ::com::sun::star::lang::EventObject
;
54 using ::com::sun::star::awt::grid::GridColumnEvent
;
55 using ::com::sun::star::awt::grid::XGridDataModel
;
56 using ::com::sun::star::awt::grid::XGridColumnModel
;
57 using ::com::sun::star::uno::Any
;
58 using ::com::sun::star::style::HorizontalAlignment_LEFT
;
59 using ::com::sun::star::style::HorizontalAlignment
;
60 using ::com::sun::star::style::VerticalAlignment_TOP
;
61 using ::com::sun::star::style::VerticalAlignment
;
62 using ::com::sun::star::uno::WeakReference
;
63 using ::com::sun::star::awt::grid::GridDataEvent
;
64 using ::com::sun::star::awt::grid::XSortableGridData
;
65 using ::com::sun::star::beans::Pair
;
67 //==================================================================================================================
68 //= UnoControlTableModel_Impl
69 //==================================================================================================================
70 typedef ::std::vector
< PTableModelListener
> ModellListeners
;
71 typedef ::std::vector
< PColumnModel
> ColumnModels
;
72 struct UnoControlTableModel_Impl
74 ColumnModels aColumns
;
75 bool bHasColumnHeaders
;
77 ScrollbarVisibility eVScrollMode
;
78 ScrollbarVisibility eHScrollMode
;
79 PTableRenderer pRenderer
;
80 PTableInputHandler pInputHandler
;
81 TableMetrics nRowHeight
;
82 TableMetrics nColumnHeaderHeight
;
83 TableMetrics nRowHeaderWidth
;
84 ::boost::optional
< ::Color
> m_aGridLineColor
;
85 ::boost::optional
< ::Color
> m_aHeaderBackgroundColor
;
86 ::boost::optional
< ::Color
> m_aHeaderTextColor
;
87 ::boost::optional
< ::Color
> m_aActiveSelectionBackColor
;
88 ::boost::optional
< ::Color
> m_aInactiveSelectionBackColor
;
89 ::boost::optional
< ::Color
> m_aActiveSelectionTextColor
;
90 ::boost::optional
< ::Color
> m_aInactiveSelectionTextColor
;
91 ::boost::optional
< ::Color
> m_aTextColor
;
92 ::boost::optional
< ::Color
> m_aTextLineColor
;
93 ::boost::optional
< ::std::vector
< ::Color
> > m_aRowColors
;
94 VerticalAlignment m_eVerticalAlign
;
95 ModellListeners m_aListeners
;
96 WeakReference
< XGridDataModel
> m_aDataModel
;
97 WeakReference
< XGridColumnModel
> m_aColumnModel
;
99 UnoControlTableModel_Impl()
101 ,bHasColumnHeaders ( true )
102 ,bHasRowHeaders ( false )
103 ,eVScrollMode ( ScrollbarShowNever
)
104 ,eHScrollMode ( ScrollbarShowNever
)
108 ,nColumnHeaderHeight ( 10 )
109 ,nRowHeaderWidth ( 10 )
110 ,m_aGridLineColor ( )
111 ,m_aHeaderBackgroundColor ( )
112 ,m_aHeaderTextColor ( )
113 ,m_aActiveSelectionBackColor ( )
114 ,m_aInactiveSelectionBackColor ( )
115 ,m_aActiveSelectionTextColor ( )
116 ,m_aInactiveSelectionTextColor ( )
118 ,m_aTextLineColor ( )
120 ,m_eVerticalAlign ( VerticalAlignment_TOP
)
125 //==================================================================================================================
126 //= UnoControlTableModel
127 //==================================================================================================================
129 const char* UnoControlTableModel_checkInvariants( const void* _pInstance
)
131 return static_cast< const UnoControlTableModel
* >( _pInstance
)->checkInvariants();
134 //------------------------------------------------------------------------------------------------------------------
135 const char* UnoControlTableModel::checkInvariants() const
137 Reference
< XGridDataModel
> const xDataModel( m_pImpl
->m_aDataModel
);
138 if ( !xDataModel
.is() )
139 return "data model anymore";
147 #define DBG_CHECK_ME() \
148 DBG_TESTSOLARMUTEX(); \
149 DBG_CHKTHIS( UnoControlTableModel, UnoControlTableModel_checkInvariants )
151 //------------------------------------------------------------------------------------------------------------------
152 DBG_NAME( UnoControlTableModel
)
153 UnoControlTableModel::UnoControlTableModel()
154 :m_pImpl( new UnoControlTableModel_Impl
)
156 DBG_CTOR( UnoControlTableModel
, UnoControlTableModel_checkInvariants
);
157 m_pImpl
->bHasColumnHeaders
= true;
158 m_pImpl
->bHasRowHeaders
= false;
159 m_pImpl
->pRenderer
.reset( new GridTableRenderer( *this ) );
160 m_pImpl
->pInputHandler
.reset( new DefaultInputHandler
);
163 //------------------------------------------------------------------------------------------------------------------
164 UnoControlTableModel::~UnoControlTableModel()
166 DBG_DTOR( UnoControlTableModel
, UnoControlTableModel_checkInvariants
);
170 //------------------------------------------------------------------------------------------------------------------
171 TableSize
UnoControlTableModel::getColumnCount() const
174 return (TableSize
)m_pImpl
->aColumns
.size();
177 //------------------------------------------------------------------------------------------------------------------
178 TableSize
UnoControlTableModel::getRowCount() const
182 TableSize nRowCount
= 0;
185 Reference
< XGridDataModel
> const xDataModel( m_pImpl
->m_aDataModel
);
186 ENSURE_OR_THROW( xDataModel
.is(), "no data model anymore!" );
187 nRowCount
= xDataModel
->getRowCount();
189 catch( const Exception
& )
191 DBG_UNHANDLED_EXCEPTION();
196 //------------------------------------------------------------------------------------------------------------------
197 bool UnoControlTableModel::hasColumnHeaders() const
200 return m_pImpl
->bHasColumnHeaders
;
203 //------------------------------------------------------------------------------------------------------------------
204 bool UnoControlTableModel::hasRowHeaders() const
207 return m_pImpl
->bHasRowHeaders
;
210 //------------------------------------------------------------------------------------------------------------------
211 void UnoControlTableModel::setRowHeaders(bool _bRowHeaders
)
214 if ( m_pImpl
->bHasRowHeaders
== _bRowHeaders
)
217 m_pImpl
->bHasRowHeaders
= _bRowHeaders
;
218 impl_notifyTableMetricsChanged();
221 //------------------------------------------------------------------------------------------------------------------
222 void UnoControlTableModel::setColumnHeaders(bool _bColumnHeaders
)
225 if ( m_pImpl
->bHasColumnHeaders
== _bColumnHeaders
)
228 m_pImpl
->bHasColumnHeaders
= _bColumnHeaders
;
229 impl_notifyTableMetricsChanged();
232 //------------------------------------------------------------------------------------------------------------------
233 bool UnoControlTableModel::isCellEditable( ColPos col
, RowPos row
) const
241 //------------------------------------------------------------------------------------------------------------------
242 PColumnModel
UnoControlTableModel::getColumnModel( ColPos column
)
245 ENSURE_OR_RETURN( ( column
>= 0 ) && ( column
< getColumnCount() ),
246 "DefaultTableModel::getColumnModel: invalid index!", PColumnModel() );
247 return m_pImpl
->aColumns
[ column
];
250 //------------------------------------------------------------------------------------------------------------------
251 void UnoControlTableModel::appendColumn( Reference
< XGridColumn
> const & i_column
)
254 insertColumn( m_pImpl
->aColumns
.size(), i_column
);
257 //------------------------------------------------------------------------------------------------------------------
258 void UnoControlTableModel::insertColumn( ColPos
const i_position
, Reference
< XGridColumn
> const & i_column
)
261 ENSURE_OR_RETURN_VOID( ( i_position
>= 0 ) && ( size_t( i_position
) <= m_pImpl
->aColumns
.size() ),
262 "UnoControlTableModel::insertColumn: illegal position!" );
264 const PColumnModel
pColumn( new UnoGridColumnFacade( *this, i_column
) );
265 m_pImpl
->aColumns
.insert( m_pImpl
->aColumns
.begin() + i_position
, pColumn
);
268 ModellListeners
aListeners( m_pImpl
->m_aListeners
);
269 for ( ModellListeners::const_iterator loop
= aListeners
.begin();
270 loop
!= aListeners
.end();
274 (*loop
)->columnInserted( i_position
);
278 //------------------------------------------------------------------------------------------------------------------
279 void UnoControlTableModel::removeColumn( ColPos
const i_position
)
282 ENSURE_OR_RETURN_VOID( ( i_position
>= 0 ) && ( size_t( i_position
) <= m_pImpl
->aColumns
.size() ),
283 "UnoControlTableModel::removeColumn: illegal position!" );
286 ColumnModels::iterator pos
= m_pImpl
->aColumns
.begin() + i_position
;
287 const PColumnModel pColumn
= *pos
;
288 m_pImpl
->aColumns
.erase( pos
);
291 ModellListeners
aListeners( m_pImpl
->m_aListeners
);
292 for ( ModellListeners::const_iterator loop
= aListeners
.begin();
293 loop
!= aListeners
.end();
297 (*loop
)->columnRemoved( i_position
);
300 // dispose the column
301 UnoGridColumnFacade
* pColumnImpl
= dynamic_cast< UnoGridColumnFacade
* >( pColumn
.get() );
302 OSL_ENSURE( pColumnImpl
!= NULL
, "UnoControlTableModel::removeColumn: illegal column implementation!" );
304 pColumnImpl
->dispose();
307 //------------------------------------------------------------------------------------------------------------------
308 void UnoControlTableModel::removeAllColumns()
311 if ( m_pImpl
->aColumns
.empty() )
314 // dispose the column instances
315 for ( ColumnModels::const_iterator col
= m_pImpl
->aColumns
.begin();
316 col
!= m_pImpl
->aColumns
.end();
320 UnoGridColumnFacade
* pColumn
= dynamic_cast< UnoGridColumnFacade
* >( col
->get() );
323 SAL_WARN( "svtools.uno", "UnoControlTableModel::removeAllColumns: illegal column implementation!" );
329 m_pImpl
->aColumns
.clear();
332 ModellListeners
aListeners( m_pImpl
->m_aListeners
);
333 for ( ModellListeners::const_iterator loop
= aListeners
.begin();
334 loop
!= aListeners
.end();
338 (*loop
)->allColumnsRemoved();
342 //------------------------------------------------------------------------------------------------------------------
343 void UnoControlTableModel::impl_notifyTableMetricsChanged() const
345 ModellListeners
aListeners( m_pImpl
->m_aListeners
);
346 for ( ModellListeners::const_iterator loop
= aListeners
.begin();
347 loop
!= aListeners
.end();
351 (*loop
)->tableMetricsChanged();
355 //------------------------------------------------------------------------------------------------------------------
356 PTableRenderer
UnoControlTableModel::getRenderer() const
359 return m_pImpl
->pRenderer
;
362 //------------------------------------------------------------------------------------------------------------------
363 PTableInputHandler
UnoControlTableModel::getInputHandler() const
366 return m_pImpl
->pInputHandler
;
369 //------------------------------------------------------------------------------------------------------------------
370 TableMetrics
UnoControlTableModel::getRowHeight() const
373 return m_pImpl
->nRowHeight
;
376 //------------------------------------------------------------------------------------------------------------------
377 void UnoControlTableModel::setRowHeight(TableMetrics _nRowHeight
)
380 if ( m_pImpl
->nRowHeight
== _nRowHeight
)
383 m_pImpl
->nRowHeight
= _nRowHeight
;
384 impl_notifyTableMetricsChanged();
387 //------------------------------------------------------------------------------------------------------------------
388 TableMetrics
UnoControlTableModel::getColumnHeaderHeight() const
391 DBG_ASSERT( hasColumnHeaders(), "DefaultTableModel::getColumnHeaderHeight: invalid call!" );
392 return m_pImpl
->nColumnHeaderHeight
;
395 //------------------------------------------------------------------------------------------------------------------
396 TableMetrics
UnoControlTableModel::getRowHeaderWidth() const
399 DBG_ASSERT( hasRowHeaders(), "DefaultTableModel::getRowHeaderWidth: invalid call!" );
400 return m_pImpl
->nRowHeaderWidth
;
402 //------------------------------------------------------------------------------------------------------------------
403 void UnoControlTableModel::setColumnHeaderHeight(TableMetrics _nHeight
)
406 if ( m_pImpl
->nColumnHeaderHeight
== _nHeight
)
409 m_pImpl
->nColumnHeaderHeight
= _nHeight
;
410 impl_notifyTableMetricsChanged();
413 //------------------------------------------------------------------------------------------------------------------
414 void UnoControlTableModel::setRowHeaderWidth(TableMetrics _nWidth
)
417 if ( m_pImpl
->nRowHeaderWidth
== _nWidth
)
420 m_pImpl
->nRowHeaderWidth
= _nWidth
;
421 impl_notifyTableMetricsChanged();
424 //------------------------------------------------------------------------------------------------------------------
425 ScrollbarVisibility
UnoControlTableModel::getVerticalScrollbarVisibility() const
428 return m_pImpl
->eVScrollMode
;
431 //------------------------------------------------------------------------------------------------------------------
432 ScrollbarVisibility
UnoControlTableModel::getHorizontalScrollbarVisibility() const
435 return m_pImpl
->eHScrollMode
;
438 //------------------------------------------------------------------------------------------------------------------
439 void UnoControlTableModel::addTableModelListener( const PTableModelListener
& i_listener
)
442 ENSURE_OR_RETURN_VOID( !!i_listener
, "illegal NULL listener" );
443 m_pImpl
->m_aListeners
.push_back( i_listener
);
446 //------------------------------------------------------------------------------------------------------------------
447 void UnoControlTableModel::removeTableModelListener( const PTableModelListener
& i_listener
)
450 for ( ModellListeners::iterator lookup
= m_pImpl
->m_aListeners
.begin();
451 lookup
!= m_pImpl
->m_aListeners
.end();
455 if ( *lookup
== i_listener
)
457 m_pImpl
->m_aListeners
.erase( lookup
);
461 OSL_ENSURE( false, "UnoControlTableModel::removeTableModelListener: listener is not registered - sure you're doing the right thing here?" );
464 //------------------------------------------------------------------------------------------------------------------
465 void UnoControlTableModel::setVerticalScrollbarVisibility( ScrollbarVisibility
const i_visibility
) const
468 m_pImpl
->eVScrollMode
= i_visibility
;
471 //------------------------------------------------------------------------------------------------------------------
472 void UnoControlTableModel::setHorizontalScrollbarVisibility( ScrollbarVisibility
const i_visibility
) const
475 m_pImpl
->eHScrollMode
= i_visibility
;
478 //------------------------------------------------------------------------------------------------------------------
479 void UnoControlTableModel::setDataModel( Reference
< XGridDataModel
> const & i_gridDataModel
)
482 m_pImpl
->m_aDataModel
= i_gridDataModel
;
483 // TODO: register as listener, so we're notified of row/data changes, and can multiplex them to our
487 //------------------------------------------------------------------------------------------------------------------
488 Reference
< XGridDataModel
> UnoControlTableModel::getDataModel() const
490 Reference
< XGridDataModel
> const xDataModel( m_pImpl
->m_aDataModel
);
494 //------------------------------------------------------------------------------------------------------------------
495 bool UnoControlTableModel::hasDataModel() const
497 return getDataModel().is();
500 //------------------------------------------------------------------------------------------------------------------
501 void UnoControlTableModel::setColumnModel( Reference
< XGridColumnModel
> const & i_gridColumnModel
)
504 m_pImpl
->m_aColumnModel
= i_gridColumnModel
;
507 //------------------------------------------------------------------------------------------------------------------
508 Reference
< XGridColumnModel
> UnoControlTableModel::getColumnModel() const
510 Reference
< XGridColumnModel
> const xColumnModel( m_pImpl
->m_aColumnModel
);
514 //------------------------------------------------------------------------------------------------------------------
515 bool UnoControlTableModel::hasColumnModel() const
517 return getColumnModel().is();
520 //------------------------------------------------------------------------------------------------------------------
521 void UnoControlTableModel::getCellContent( ColPos
const i_col
, RowPos
const i_row
, Any
& o_cellContent
)
525 o_cellContent
.clear();
528 Reference
< XGridDataModel
> const xDataModel( m_pImpl
->m_aDataModel
);
529 ENSURE_OR_RETURN_VOID( xDataModel
.is(), "UnoControlTableModel::getCellContent: no data model anymore!" );
531 PColumnModel
const pColumn
= getColumnModel( i_col
);
532 UnoGridColumnFacade
* pColumnImpl
= dynamic_cast< UnoGridColumnFacade
* >( pColumn
.get() );
533 ENSURE_OR_RETURN_VOID( pColumnImpl
!= NULL
, "UnoControlTableModel::getCellContent: no (valid) column at this position!" );
534 sal_Int32
const nDataColumnIndex
= pColumnImpl
->getDataColumnIndex() >= 0 ? pColumnImpl
->getDataColumnIndex() : i_col
;
536 if ( nDataColumnIndex
>= xDataModel
->getColumnCount() )
538 // this is allowed, in case the column model has been dynamically extended, but the data model does
539 // not (yet?) know about it.
540 // So, handle it gracefully.
541 #if OSL_DEBUG_LEVEL > 0
543 Reference
< XGridColumnModel
> const xColumnModel( m_pImpl
->m_aColumnModel
);
544 OSL_ENSURE( xColumnModel
.is() && i_col
< xColumnModel
->getColumnCount(),
545 "UnoControlTableModel::getCellContent: request a column's value which the ColumnModel doesn't know about!" );
551 o_cellContent
= xDataModel
->getCellData( nDataColumnIndex
, i_row
);
554 catch( const Exception
& )
556 DBG_UNHANDLED_EXCEPTION();
560 //------------------------------------------------------------------------------------------------------------------
561 void UnoControlTableModel::getCellToolTip( ColPos
const i_col
, RowPos
const i_row
, Any
& o_cellToolTip
)
566 Reference
< XGridDataModel
> const xDataModel( m_pImpl
->m_aDataModel
);
567 ENSURE_OR_THROW( xDataModel
.is(), "no data model anymore!" );
569 o_cellToolTip
= xDataModel
->getCellToolTip( i_col
, i_row
);
571 catch( const Exception
& )
573 DBG_UNHANDLED_EXCEPTION();
577 //------------------------------------------------------------------------------------------------------------------
578 Any
UnoControlTableModel::getRowHeading( RowPos
const i_rowPos
) const
584 Reference
< XGridDataModel
> const xDataModel( m_pImpl
->m_aDataModel
);
585 ENSURE_OR_RETURN( xDataModel
.is(), "UnoControlTableModel::getRowHeading: no data model anymore!", aRowHeading
);
589 aRowHeading
= xDataModel
->getRowHeading( i_rowPos
);
591 catch( const Exception
& )
593 DBG_UNHANDLED_EXCEPTION();
598 //------------------------------------------------------------------------------------------------------------------
601 void lcl_setColor( Any
const & i_color
, ::boost::optional
< ::Color
> & o_convertedColor
)
603 if ( !i_color
.hasValue() )
604 o_convertedColor
.reset();
607 sal_Int32 nColor
= COL_TRANSPARENT
;
608 if ( i_color
>>= nColor
)
610 o_convertedColor
.reset( ::Color( nColor
) );
614 OSL_ENSURE( false, "lcl_setColor: could not extract color value!" );
620 //------------------------------------------------------------------------------------------------------------------
621 ::boost::optional
< ::Color
> UnoControlTableModel::getLineColor() const
624 return m_pImpl
->m_aGridLineColor
;
627 //------------------------------------------------------------------------------------------------------------------
628 void UnoControlTableModel::setLineColor( Any
const & i_color
)
631 lcl_setColor( i_color
, m_pImpl
->m_aGridLineColor
);
634 //------------------------------------------------------------------------------------------------------------------
635 ::boost::optional
< ::Color
> UnoControlTableModel::getHeaderBackgroundColor() const
638 return m_pImpl
->m_aHeaderBackgroundColor
;
641 //------------------------------------------------------------------------------------------------------------------
642 void UnoControlTableModel::setHeaderBackgroundColor( Any
const & i_color
)
645 lcl_setColor( i_color
, m_pImpl
->m_aHeaderBackgroundColor
);
648 //------------------------------------------------------------------------------------------------------------------
649 ::boost::optional
< ::Color
> UnoControlTableModel::getHeaderTextColor() const
652 return m_pImpl
->m_aHeaderTextColor
;
655 //------------------------------------------------------------------------------------------------------------------
656 ::boost::optional
< ::Color
> UnoControlTableModel::getActiveSelectionBackColor() const
659 return m_pImpl
->m_aActiveSelectionBackColor
;
662 //------------------------------------------------------------------------------------------------------------------
663 ::boost::optional
< ::Color
> UnoControlTableModel::getInactiveSelectionBackColor() const
666 return m_pImpl
->m_aInactiveSelectionBackColor
;
669 //------------------------------------------------------------------------------------------------------------------
670 ::boost::optional
< ::Color
> UnoControlTableModel::getActiveSelectionTextColor() const
673 return m_pImpl
->m_aActiveSelectionTextColor
;
676 //------------------------------------------------------------------------------------------------------------------
677 ::boost::optional
< ::Color
> UnoControlTableModel::getInactiveSelectionTextColor() const
680 return m_pImpl
->m_aInactiveSelectionTextColor
;
683 //------------------------------------------------------------------------------------------------------------------
684 void UnoControlTableModel::setHeaderTextColor( Any
const & i_color
)
687 lcl_setColor( i_color
, m_pImpl
->m_aHeaderTextColor
);
690 //------------------------------------------------------------------------------------------------------------------
691 void UnoControlTableModel::setActiveSelectionBackColor( Any
const & i_color
)
694 lcl_setColor( i_color
, m_pImpl
->m_aActiveSelectionBackColor
);
697 //------------------------------------------------------------------------------------------------------------------
698 void UnoControlTableModel::setInactiveSelectionBackColor( Any
const & i_color
)
701 lcl_setColor( i_color
, m_pImpl
->m_aInactiveSelectionBackColor
);
704 //------------------------------------------------------------------------------------------------------------------
705 void UnoControlTableModel::setActiveSelectionTextColor( Any
const & i_color
)
708 lcl_setColor( i_color
, m_pImpl
->m_aActiveSelectionTextColor
);
711 //------------------------------------------------------------------------------------------------------------------
712 void UnoControlTableModel::setInactiveSelectionTextColor( Any
const & i_color
)
715 lcl_setColor( i_color
, m_pImpl
->m_aInactiveSelectionTextColor
);
718 //------------------------------------------------------------------------------------------------------------------
719 ::boost::optional
< ::Color
> UnoControlTableModel::getTextColor() const
722 return m_pImpl
->m_aTextColor
;
725 //------------------------------------------------------------------------------------------------------------------
726 void UnoControlTableModel::setTextColor( Any
const & i_color
)
729 lcl_setColor( i_color
, m_pImpl
->m_aTextColor
);
732 //------------------------------------------------------------------------------------------------------------------
733 ::boost::optional
< ::Color
> UnoControlTableModel::getTextLineColor() const
736 return m_pImpl
->m_aTextColor
;
739 //------------------------------------------------------------------------------------------------------------------
740 void UnoControlTableModel::setTextLineColor( Any
const & i_color
)
743 lcl_setColor( i_color
, m_pImpl
->m_aTextLineColor
);
746 //------------------------------------------------------------------------------------------------------------------
747 ::boost::optional
< ::std::vector
< ::Color
> > UnoControlTableModel::getRowBackgroundColors() const
750 return m_pImpl
->m_aRowColors
;
753 //------------------------------------------------------------------------------------------------------------------
754 void UnoControlTableModel::setRowBackgroundColors( ::com::sun::star::uno::Any
const & i_APIValue
)
757 Sequence
< ::com::sun::star::util::Color
> aAPIColors
;
758 if ( !( i_APIValue
>>= aAPIColors
) )
759 m_pImpl
->m_aRowColors
.reset();
762 ::std::vector
< ::Color
> aColors( aAPIColors
.getLength() );
763 for ( sal_Int32 i
=0; i
<aAPIColors
.getLength(); ++i
)
765 aColors
[i
] = ::Color( aAPIColors
[i
] );
767 m_pImpl
->m_aRowColors
.reset( aColors
);
771 //------------------------------------------------------------------------------------------------------------------
772 VerticalAlignment
UnoControlTableModel::getVerticalAlign() const
775 return m_pImpl
->m_eVerticalAlign
;
778 //------------------------------------------------------------------------------------------------------------------
779 void UnoControlTableModel::setVerticalAlign( VerticalAlignment _xAlign
)
782 m_pImpl
->m_eVerticalAlign
= _xAlign
;
785 //------------------------------------------------------------------------------------------------------------------
786 ColPos
UnoControlTableModel::getColumnPos( UnoGridColumnFacade
const & i_column
) const
789 for ( ColumnModels::const_iterator col
= m_pImpl
->aColumns
.begin();
790 col
!= m_pImpl
->aColumns
.end();
794 if ( &i_column
== col
->get() )
795 return col
- m_pImpl
->aColumns
.begin();
797 OSL_ENSURE( false, "UnoControlTableModel::getColumnPos: column not found!" );
801 //------------------------------------------------------------------------------------------------------------------
802 ITableDataSort
* UnoControlTableModel::getSortAdapter()
806 Reference
< XSortableGridData
> const xSortAccess( getDataModel(), UNO_QUERY
);
807 if ( xSortAccess
.is() )
812 //------------------------------------------------------------------------------------------------------------------
813 void UnoControlTableModel::sortByColumn( ColPos
const i_column
, ColumnSortDirection
const i_sortDirection
)
819 Reference
< XSortableGridData
> const xSortAccess( getDataModel(), UNO_QUERY_THROW
);
820 xSortAccess
->sortByColumn( i_column
, i_sortDirection
== ColumnSortAscending
);
822 catch( const Exception
& )
824 DBG_UNHANDLED_EXCEPTION();
828 //------------------------------------------------------------------------------------------------------------------
829 ColumnSort
UnoControlTableModel::getCurrentSortOrder() const
833 ColumnSort currentSort
;
836 Reference
< XSortableGridData
> const xSortAccess( getDataModel(), UNO_QUERY_THROW
);
837 Pair
< ::sal_Int32
, ::sal_Bool
> const aCurrentSortOrder( xSortAccess
->getCurrentSortOrder() );
838 currentSort
.nColumnPos
= aCurrentSortOrder
.First
;
839 currentSort
.eSortDirection
= aCurrentSortOrder
.Second
? ColumnSortAscending
: ColumnSortDescending
;
841 catch( const Exception
& )
843 DBG_UNHANDLED_EXCEPTION();
848 //--------------------------------------------------------------------
849 void UnoControlTableModel::notifyColumnChange( ColPos
const i_columnPos
, ColumnAttributeGroup
const i_attributeGroup
) const
852 ENSURE_OR_RETURN_VOID( ( i_columnPos
>= 0 ) && ( i_columnPos
< getColumnCount() ),
853 "UnoControlTableModel::notifyColumnChange: invalid column index!" );
855 ModellListeners
aListeners( m_pImpl
->m_aListeners
);
856 for ( ModellListeners::const_iterator loop
= aListeners
.begin();
857 loop
!= aListeners
.end();
861 (*loop
)->columnChanged( i_columnPos
, i_attributeGroup
);
865 //------------------------------------------------------------------------------------------------------------------
866 void UnoControlTableModel::notifyRowsInserted( GridDataEvent
const & i_event
) const
868 // check sanity of the event
869 ENSURE_OR_RETURN_VOID( i_event
.FirstRow
>= 0, "UnoControlTableModel::notifyRowsInserted: invalid first row!" );
870 ENSURE_OR_RETURN_VOID( i_event
.LastRow
>= i_event
.FirstRow
, "UnoControlTableModel::notifyRowsInserted: invalid row indexes!" );
873 Reference
< XGridColumnModel
> const xColumnModel( m_pImpl
->m_aColumnModel
);
874 ENSURE_OR_RETURN_VOID( xColumnModel
.is(), "UnoControlTableModel::notifyRowsInserted: no column model anymore!" );
876 Reference
< XGridDataModel
> const xDataModel( m_pImpl
->m_aDataModel
);
877 ENSURE_OR_RETURN_VOID( xDataModel
.is(), "UnoControlTableModel::notifyRowsInserted: no data model anymore!" );
879 // implicitly add columns to the column model
880 // TODO: is this really a good idea?
881 sal_Int32
const dataColumnCount
= xDataModel
->getColumnCount();
882 OSL_ENSURE( dataColumnCount
> 0, "UnoControlTableModel::notifyRowsInserted: no columns at all?" );
884 sal_Int32
const modelColumnCount
= xColumnModel
->getColumnCount();
885 if ( ( modelColumnCount
== 0 ) && ( dataColumnCount
> 0 ) )
887 // TODO: shouldn't we clear the mutexes guard for this call?
888 xColumnModel
->setDefaultColumns( dataColumnCount
);
891 // multiplex the event to our own listeners
892 ModellListeners
aListeners( m_pImpl
->m_aListeners
);
893 for ( ModellListeners::const_iterator loop
= aListeners
.begin();
894 loop
!= aListeners
.end();
898 (*loop
)->rowsInserted( i_event
.FirstRow
, i_event
.LastRow
);
902 //------------------------------------------------------------------------------------------------------------------
903 void UnoControlTableModel::notifyRowsRemoved( GridDataEvent
const & i_event
) const
905 ModellListeners
aListeners( m_pImpl
->m_aListeners
);
906 for ( ModellListeners::const_iterator loop
= aListeners
.begin();
907 loop
!= aListeners
.end();
911 (*loop
)->rowsRemoved( i_event
.FirstRow
, i_event
.LastRow
);
915 //------------------------------------------------------------------------------------------------------------------
916 void UnoControlTableModel::notifyDataChanged( ::com::sun::star::awt::grid::GridDataEvent
const & i_event
) const
918 ColPos
const firstCol
= i_event
.FirstColumn
== -1 ? 0 : i_event
.FirstColumn
;
919 ColPos
const lastCol
= i_event
.FirstColumn
== -1 ? getColumnCount() - 1 : i_event
.LastColumn
;
920 RowPos
const firstRow
= i_event
.FirstRow
== -1 ? 0 : i_event
.FirstRow
;
921 RowPos
const lastRow
= i_event
.FirstRow
== -1 ? getRowCount() - 1 : i_event
.LastRow
;
923 ModellListeners
aListeners( m_pImpl
->m_aListeners
);
924 for ( ModellListeners::const_iterator loop
= aListeners
.begin();
925 loop
!= aListeners
.end();
929 (*loop
)->cellsUpdated( firstCol
, lastCol
, firstRow
, lastRow
);
933 //------------------------------------------------------------------------------------------------------------------
934 void UnoControlTableModel::notifyAllDataChanged() const
936 ModellListeners
aListeners( m_pImpl
->m_aListeners
);
937 for ( ModellListeners::const_iterator loop
= aListeners
.begin();
938 loop
!= aListeners
.end();
942 (*loop
)->cellsUpdated( 0, getColumnCount() - 1, 0, getRowCount() - 1 );
946 // .....................................................................................................................
948 // .....................................................................................................................
949 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */