diff options
Diffstat (limited to 'svtools/source/uno')
-rw-r--r--[-rwxr-xr-x] | svtools/source/uno/svtxgridcontrol.cxx | 1045 | ||||
-rwxr-xr-x | svtools/source/uno/svtxgridcontrol.hxx | 88 | ||||
-rw-r--r-- | svtools/source/uno/treecontrolpeer.cxx | 4 | ||||
-rw-r--r-- | svtools/source/uno/unocontroltablemodel.cxx | 980 | ||||
-rw-r--r-- | svtools/source/uno/unocontroltablemodel.hxx | 240 | ||||
-rwxr-xr-x | svtools/source/uno/unogridcolumnfacade.cxx | 427 | ||||
-rwxr-xr-x | svtools/source/uno/unogridcolumnfacade.hxx | 114 | ||||
-rw-r--r-- | svtools/source/uno/unoiface.cxx | 1 |
8 files changed, 1847 insertions, 1052 deletions
diff --git a/svtools/source/uno/svtxgridcontrol.cxx b/svtools/source/uno/svtxgridcontrol.cxx index f5bc837f60b0..0e826ef6bff3 100755..100644 --- a/svtools/source/uno/svtxgridcontrol.cxx +++ b/svtools/source/uno/svtxgridcontrol.cxx @@ -28,115 +28,193 @@ #include "precompiled_svtools.hxx" #include "svtxgridcontrol.hxx" -#include "accessibletableimp.hxx" #include <com/sun/star/view/SelectionType.hpp> +#include "svtools/table/tablecontrolinterface.hxx" #include "svtools/table/gridtablerenderer.hxx" -#include "svtools/table/defaultinputhandler.hxx" #include "svtools/table/tablecontrol.hxx" #include "unocontroltablemodel.hxx" #include <comphelper/sequence.hxx> #include <rtl/ref.hxx> -#include <tools/debug.hxx> +#include <tools/diagnose_ex.h> #include <toolkit/helper/property.hxx> #include <toolkit/helper/vclunohelper.hxx> #include <comphelper/processfactory.hxx> #include <com/sun/star/awt/grid/XGridColumn.hpp> -#include <com/sun/star/accessibility/AccessibleTableModelChange.hpp> -#include <com/sun/star/accessibility/AccessibleTableModelChangeType.hpp> -#include <com/sun/star/accessibility/AccessibleEventId.hpp> #include <com/sun/star/awt/XControl.hpp> #include <com/sun/star/awt/grid/GridInvalidDataException.hpp> #include <com/sun/star/awt/grid/GridInvalidModelException.hpp> #include <com/sun/star/util/Color.hpp> #include <com/sun/star/awt/FontDescriptor.hpp> -using ::rtl::OUString; using namespace ::svt::table; using namespace ::com::sun::star::uno; using namespace ::com::sun::star::awt::grid; using namespace ::com::sun::star::view; -using namespace ::toolkit; +using namespace ::com::sun::star::style; +using namespace ::com::sun::star::container; using namespace ::com::sun::star::accessibility; -using namespace ::com::sun::star::accessibility::AccessibleEventId; -using namespace ::com::sun::star::accessibility::AccessibleTableModelChangeType; -using ::com::sun::star::accessibility::AccessibleTableModelChange; SVTXGridControl::SVTXGridControl() - :m_pTableModel (new UnoControlTableModel()), - m_xDataModel(0), - m_xColumnModel(0), - m_bHasColumnHeaders(false), - m_bHasRowHeaders(false), - m_bVScroll(false), - m_bHScroll(false), - m_bUpdate(false), - m_nSelectedRowCount(0), - m_aSelectionListeners( *this ) + :m_pTableModel( new UnoControlTableModel() ) + ,m_bHasColumnHeaders( false ) + ,m_bHasRowHeaders( false ) + ,m_bTableModelInitCompleted( false ) + ,m_nSelectedRowCount( 0 ) + ,m_aSelectionListeners( *this ) { } -//-------------------------------------------------------------------- +// --------------------------------------------------------------------------------------------------------------------- SVTXGridControl::~SVTXGridControl() { } -::com::sun::star::uno::Any SVTXGridControl::queryInterface( const ::com::sun::star::uno::Type & rType ) throw(::com::sun::star::uno::RuntimeException) +// --------------------------------------------------------------------------------------------------------------------- +void SVTXGridControl::SetWindow( Window* pWindow ) { - ::com::sun::star::uno::Any aRet = ::cppu::queryInterface( rType, - SAL_STATIC_CAST( ::com::sun::star::awt::grid::XGridControl*, this ), - SAL_STATIC_CAST( ::com::sun::star::awt::grid::XGridDataListener*, this ), - SAL_STATIC_CAST( ::com::sun::star::awt::grid::XGridColumnListener*, this ), - SAL_STATIC_CAST( ::com::sun::star::lang::XTypeProvider*, this ) ); - return (aRet.hasValue() ? aRet : VCLXWindow::queryInterface( rType )); + SVTXGridControl_Base::SetWindow( pWindow ); + impl_checkTableModelInit(); } -// ::com::sun::star::lang::XTypeProvider -IMPL_XTYPEPROVIDER_START( SVTXGridControl ) - getCppuType( ( ::com::sun::star::uno::Reference< ::com::sun::star::awt::grid::XGridControl>* ) NULL ), - getCppuType( ( ::com::sun::star::uno::Reference< ::com::sun::star::awt::grid::XGridDataModel>* ) NULL ), - getCppuType( ( ::com::sun::star::uno::Reference< ::com::sun::star::awt::XMouseListener>* ) NULL ), - VCLXWindow::getTypes() -IMPL_XTYPEPROVIDER_END +// --------------------------------------------------------------------------------------------------------------------- +sal_Int32 SAL_CALL SVTXGridControl::getRowAtPoint(::sal_Int32 x, ::sal_Int32 y) throw (::com::sun::star::uno::RuntimeException) +{ + ::vos::OGuard aGuard( GetMutex() ); + + TableControl* pTable = dynamic_cast< TableControl* >( GetWindow() ); + ENSURE_OR_RETURN( pTable != NULL, "SVTXGridControl::getRowAtPoint: no control (anymore)!", -1 ); + + TableCell const tableCell = pTable->getTableControlInterface().hitTest( Point( x, y ) ); + return ( tableCell.nRow >= 0 ) ? tableCell.nRow : -1; +} -sal_Int32 SAL_CALL SVTXGridControl::getItemIndexAtPoint(::sal_Int32 x, ::sal_Int32 y) throw (::com::sun::star::uno::RuntimeException) +// --------------------------------------------------------------------------------------------------------------------- +sal_Int32 SAL_CALL SVTXGridControl::getColumnAtPoint(::sal_Int32 x, ::sal_Int32 y) throw (::com::sun::star::uno::RuntimeException) { - TableControl* pTable = (TableControl*)GetWindow(); - return pTable->GetCurrentRow( Point(x,y) ); + ::vos::OGuard aGuard( GetMutex() ); + + TableControl* pTable = dynamic_cast< TableControl* >( GetWindow() ); + ENSURE_OR_RETURN( pTable != NULL, "SVTXGridControl::getColumnAtPoint: no control (anymore)!", -1 ); + + TableCell const tableCell = pTable->getTableControlInterface().hitTest( Point( x, y ) ); + return ( tableCell.nColumn >= 0 ) ? tableCell.nColumn : -1; } -void SAL_CALL SVTXGridControl::setToolTip(const ::com::sun::star::uno::Sequence< ::rtl::OUString >& text, const com::sun::star::uno::Sequence< sal_Int32 >& columns) throw (::com::sun::star::uno::RuntimeException) +// --------------------------------------------------------------------------------------------------------------------- +sal_Int32 SAL_CALL SVTXGridControl::getCurrentColumn( ) throw (RuntimeException) { - TableControl* pTable = (TableControl*)GetWindow(); - pTable->setTooltip(text, columns); + ::vos::OGuard aGuard( GetMutex() ); + + TableControl* pTable = dynamic_cast< TableControl* >( GetWindow() ); + ENSURE_OR_RETURN( pTable != NULL, "SVTXGridControl::getCurrentColumn: no control (anymore)!", -1 ); + + sal_Int32 const nColumn = pTable->GetCurrentColumn(); + return ( nColumn >= 0 ) ? nColumn : -1; } +// --------------------------------------------------------------------------------------------------------------------- +sal_Int32 SAL_CALL SVTXGridControl::getCurrentRow( ) throw (RuntimeException) +{ + ::vos::OGuard aGuard( GetMutex() ); + + TableControl* pTable = dynamic_cast< TableControl* >( GetWindow() ); + ENSURE_OR_RETURN( pTable != NULL, "SVTXGridControl::getCurrentRow: no control (anymore)!", -1 ); + + sal_Int32 const nRow = pTable->GetCurrentRow(); + return ( nRow >= 0 ) ? nRow : -1; +} + +// --------------------------------------------------------------------------------------------------------------------- void SAL_CALL SVTXGridControl::addSelectionListener(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::grid::XGridSelectionListener > & listener) throw (::com::sun::star::uno::RuntimeException) { m_aSelectionListeners.addInterface(listener); } +// --------------------------------------------------------------------------------------------------------------------- void SAL_CALL SVTXGridControl::removeSelectionListener(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::grid::XGridSelectionListener > & listener) throw (::com::sun::star::uno::RuntimeException) { m_aSelectionListeners.removeInterface(listener); } +// --------------------------------------------------------------------------------------------------------------------- void SVTXGridControl::setProperty( const ::rtl::OUString& PropertyName, const Any& aValue) throw(RuntimeException) { ::vos::OGuard aGuard( GetMutex() ); - TableControl* pTable = (TableControl*)GetWindow(); + TableControl* pTable = dynamic_cast< TableControl* >( GetWindow() ); + ENSURE_OR_RETURN_VOID( pTable != NULL, "SVTXGridControl::setProperty: no control (anymore)!" ); + switch( GetPropertyId( PropertyName ) ) { + case BASEPROPERTY_ROW_HEADER_WIDTH: + { + sal_Int32 rowHeaderWidth( -1 ); + aValue >>= rowHeaderWidth; + ENSURE_OR_BREAK( rowHeaderWidth > 0, "SVTXGridControl::setProperty: illegal row header width!" ); + m_pTableModel->setRowHeaderWidth( rowHeaderWidth ); + // TODO: the model should broadcast this change itself, and the table should invalidate itself as needed + pTable->Invalidate(); + } + break; + + case BASEPROPERTY_COLUMN_HEADER_HEIGHT: + { + sal_Int32 columnHeaderHeight = 0; + if ( !aValue.hasValue() ) + { + columnHeaderHeight = pTable->PixelToLogic( Size( 0, pTable->GetTextHeight() + 3 ), MAP_APPFONT ).Height(); + } + else + { + aValue >>= columnHeaderHeight; + } + ENSURE_OR_BREAK( columnHeaderHeight > 0, "SVTXGridControl::setProperty: illegal column header height!" ); + m_pTableModel->setColumnHeaderHeight( columnHeaderHeight ); + // TODO: the model should broadcast this change itself, and the table should invalidate itself as needed + pTable->Invalidate(); + } + break; + + case BASEPROPERTY_USE_GRID_LINES: + { + GridTableRenderer* pGridRenderer = dynamic_cast< GridTableRenderer* >( + m_pTableModel->getRenderer().get() ); + ENSURE_OR_BREAK( pGridRenderer != NULL, "SVTXGridControl::setProperty(UseGridLines): invalid renderer!" ); + sal_Bool bUseGridLines = sal_False; + OSL_VERIFY( aValue >>= bUseGridLines ); + pGridRenderer->useGridLines( bUseGridLines ); + pTable->Invalidate(); + } + break; + + case BASEPROPERTY_ROW_HEIGHT: + { + sal_Int32 rowHeight = 0; + if ( !aValue.hasValue() ) + { + rowHeight = pTable->PixelToLogic( Size( 0, pTable->GetTextHeight() + 3 ), MAP_APPFONT ).Height(); + } + else + { + aValue >>= rowHeight; + } + m_pTableModel->setRowHeight( rowHeight ); + ENSURE_OR_BREAK( rowHeight > 0, "SVTXGridControl::setProperty: illegal row height!" ); + // TODO: the model should broadcast this change itself, and the table should invalidate itself as needed + pTable->Invalidate(); + } + break; + case BASEPROPERTY_BACKGROUNDCOLOR: { // let the base class handle this for the TableControl VCLXWindow::setProperty( PropertyName, aValue ); // and forward to the grid control's data window if ( pTable->IsBackground() ) - pTable->getDataWindow()->SetBackground( pTable->GetBackground() ); + pTable->getDataWindow().SetBackground( pTable->GetBackground() ); else - pTable->getDataWindow()->SetBackground(); + pTable->getDataWindow().SetBackground(); } break; @@ -151,7 +229,6 @@ void SVTXGridControl::setProperty( const ::rtl::OUString& PropertyName, const An case SelectionType_SINGLE: eSelMode = SINGLE_SELECTION; break; case SelectionType_RANGE: eSelMode = RANGE_SELECTION; break; case SelectionType_MULTI: eSelMode = MULTIPLE_SELECTION; break; - // case SelectionType_NONE: default: eSelMode = NO_SELECTION; break; } if( pTable->getSelEngine()->GetSelectionMode() != eSelMode ) @@ -163,19 +240,16 @@ void SVTXGridControl::setProperty( const ::rtl::OUString& PropertyName, const An { sal_Bool bHScroll = true; if( aValue >>= bHScroll ) - { - m_bHScroll = bHScroll; - m_pTableModel->setHorizontalScrollbarVisibility(bHScroll); - } + m_pTableModel->setHorizontalScrollbarVisibility( bHScroll ? ScrollbarShowAlways : ScrollbarShowSmart ); break; } + case BASEPROPERTY_VSCROLL: { sal_Bool bVScroll = true; if( aValue >>= bVScroll ) { - m_bVScroll = bVScroll; - m_pTableModel->setVerticalScrollbarVisibility(bVScroll); + m_pTableModel->setVerticalScrollbarVisibility( bVScroll ? ScrollbarShowAlways : ScrollbarShowSmart ); } break; } @@ -189,64 +263,42 @@ void SVTXGridControl::setProperty( const ::rtl::OUString& PropertyName, const An } break; } - case BASEPROPERTY_GRID_HEADER_BACKGROUND: - { - sal_Int32 colorHeader = 0xFFFFFF; - if( aValue >>= colorHeader ) - { - m_pTableModel->setHeaderBackgroundColor(colorHeader); - } + + case BASEPROPERTY_GRID_ROW_BACKGROUND_COLORS: + m_pTableModel->setRowBackgroundColors( aValue ); + pTable->Invalidate(); break; - } + case BASEPROPERTY_GRID_LINE_COLOR: - { - sal_Int32 colorLine = 0xFFFFFF; - if( aValue >>= colorLine ) - { - m_pTableModel->setLineColor(colorLine); - } + m_pTableModel->setLineColor( aValue ); + pTable->Invalidate(); break; - } - case BASEPROPERTY_GRID_EVEN_ROW_BACKGROUND: - { - sal_Int32 colorEvenRow = 0xFFFFFF; - if( aValue >>= colorEvenRow ) - { - m_pTableModel->setEvenRowBackgroundColor(colorEvenRow); - } + + case BASEPROPERTY_GRID_HEADER_BACKGROUND: + m_pTableModel->setHeaderBackgroundColor( aValue ); + pTable->Invalidate(); break; - } - case BASEPROPERTY_GRID_ROW_BACKGROUND: - { - sal_Int32 colorBackground = 0xFFFFFF; - if( aValue >>= colorBackground ) - { - m_pTableModel->setOddRowBackgroundColor(colorBackground); - } + + case BASEPROPERTY_GRID_HEADER_TEXT_COLOR: + m_pTableModel->setHeaderTextColor( aValue ); + pTable->Invalidate(); break; - } + case BASEPROPERTY_TEXTCOLOR: - { - sal_Int32 colorText = 0x000000; - if( aValue >>= colorText ) - { - m_pTableModel->setTextColor(colorText); - } + m_pTableModel->setTextColor( aValue ); + pTable->Invalidate(); break; - } + + case BASEPROPERTY_TEXTLINECOLOR: + m_pTableModel->setTextLineColor( aValue ); + pTable->Invalidate(); + break; + case BASEPROPERTY_VERTICALALIGN: { - com::sun::star::style::VerticalAlignment vAlign(com::sun::star::style::VerticalAlignment(0)); - if( aValue >>= vAlign ) - { - switch( vAlign ) - { - case com::sun::star::style::VerticalAlignment_TOP: m_pTableModel->setVerticalAlign(com::sun::star::style::VerticalAlignment(0)); break; - case com::sun::star::style::VerticalAlignment_MIDDLE: m_pTableModel->setVerticalAlign(com::sun::star::style::VerticalAlignment(1)); break; - case com::sun::star::style::VerticalAlignment_BOTTOM: m_pTableModel->setVerticalAlign(com::sun::star::style::VerticalAlignment(2)); break; - default: m_pTableModel->setVerticalAlign(com::sun::star::style::VerticalAlignment(0)); break; - } - } + VerticalAlignment eAlign( VerticalAlignment_TOP ); + if ( aValue >>= eAlign ) + m_pTableModel->setVerticalAlign( eAlign ); break; } @@ -261,97 +313,31 @@ void SVTXGridControl::setProperty( const ::rtl::OUString& PropertyName, const An } case BASEPROPERTY_GRID_DATAMODEL: { - { - m_xDataModel = Reference< XGridDataModel >( aValue, UNO_QUERY ); - if(m_xDataModel != NULL) - { - Sequence<Sequence< Any > > cellData = m_xDataModel->getData(); - if(cellData.getLength()!= 0) - { - for (int i = 0; i < cellData.getLength(); i++) - { - std::vector< Any > newRow; - Sequence< Any > rawRowData = cellData[i]; - //check whether the data row vector length matches with the column count - if(m_xColumnModel->getColumnCount() == 0) - { - for ( ::svt::table::ColPos col = 0; col < rawRowData.getLength(); ++col ) - { - UnoControlTableColumn* tableColumn = new UnoControlTableColumn(); - m_pTableModel->getColumnModel().push_back((PColumnModel)tableColumn); - } - m_xColumnModel->setDefaultColumns(rawRowData.getLength()); - } - else - if((unsigned int)rawRowData.getLength()!=(unsigned)m_pTableModel->getColumnCount()) - throw GridInvalidDataException(rtl::OUString::createFromAscii("The column count doesn't match with the length of row data"), m_xDataModel); - - for ( int k = 0; k < rawRowData.getLength(); k++) - { - newRow.push_back(rawRowData[k]); - } - m_pTableModel->getCellContent().push_back(newRow); - } - - Sequence< ::rtl::OUString > rowHeaders = m_xDataModel->getRowHeaders(); - std::vector< rtl::OUString > newRow( - comphelper::sequenceToContainer< std::vector<rtl::OUString > >(rowHeaders)); - m_pTableModel->setRowCount(m_xDataModel->getRowCount()); - m_pTableModel->setRowHeaderName(newRow); - } - } - else - throw GridInvalidDataException(rtl::OUString::createFromAscii("The data model isn't set!"), m_xDataModel); - sal_Int32 fontHeight = pTable->PixelToLogic( Size( 0, pTable->GetTextHeight()+3 ), MAP_APPFONT ).Height(); - if(m_xDataModel->getRowHeight() == 0) - { - m_pTableModel->setRowHeight(fontHeight); - m_xDataModel->setRowHeight(fontHeight); - } - else - m_pTableModel->setRowHeight(m_xDataModel->getRowHeight()); - m_pTableModel->setRowHeaderWidth(m_xDataModel->getRowHeaderWidth()); - } - break; + Reference< XGridDataModel > const xDataModel( aValue, UNO_QUERY ); + if ( !xDataModel.is() ) + throw GridInvalidDataException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Invalid data model." ) ), *this ); + + m_pTableModel->setDataModel( xDataModel ); + impl_checkTableModelInit(); } + break; + case BASEPROPERTY_GRID_COLUMNMODEL: { - m_xColumnModel = Reference< XGridColumnModel >( aValue, UNO_QUERY ); - if(m_xColumnModel != NULL) - { - if(m_xColumnModel->getColumnCount() != 0) - { - Sequence<Reference< XGridColumn > > columns = m_xColumnModel->getColumns(); - std::vector<Reference< XGridColumn > > aNewColumns( - comphelper::sequenceToContainer<std::vector<Reference< XGridColumn > > >(columns)); - sal_Int32 fontHeight = pTable->PixelToLogic( Size( 0, pTable->GetTextHeight()+3 ), MAP_APPFONT ).Height(); - if(m_xColumnModel->getColumnHeaderHeight() == 0) - { - m_pTableModel->setColumnHeaderHeight(fontHeight); - m_xColumnModel->setColumnHeaderHeight(fontHeight); - } - else - m_pTableModel->setColumnHeaderHeight(m_xColumnModel->getColumnHeaderHeight()); - for ( ::svt::table::ColPos col = 0; col < m_xColumnModel->getColumnCount(); ++col ) - { - UnoControlTableColumn* tableColumn = new UnoControlTableColumn(aNewColumns[col]); - Reference< XGridColumn > xGridColumn = m_xColumnModel->getColumn(col); - m_pTableModel->getColumnModel().push_back((PColumnModel)tableColumn); - tableColumn->setHorizontalAlign(xGridColumn->getHorizontalAlign()); - tableColumn->setWidth(xGridColumn->getColumnWidth()); - if(xGridColumn->getPreferredWidth() != 0) - tableColumn->setPreferredWidth(xGridColumn->getPreferredWidth()); - if(xGridColumn->getMaxWidth() != 0) - tableColumn->setMaxWidth(xGridColumn->getMaxWidth()); - if(xGridColumn->getMinWidth() != 0) - tableColumn->setMinWidth(xGridColumn->getMinWidth()); - tableColumn->setResizable(xGridColumn->getResizeable()); - } - } - } - else - throw GridInvalidModelException(rtl::OUString::createFromAscii("The column model isn't set!"), m_xColumnModel); + // obtain new col model + Reference< XGridColumnModel > const xColumnModel( aValue, UNO_QUERY ); + if ( !xColumnModel.is() ) + throw GridInvalidModelException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Invalid column model." ) ), *this ); + + // remove all old columns + m_pTableModel->removeAllColumns(); + + // announce to the TableModel + m_pTableModel->setColumnModel( xColumnModel ); + impl_checkTableModelInit(); + // add new columns + impl_updateColumnsFromModel_nothrow(); break; } default: @@ -360,489 +346,354 @@ void SVTXGridControl::setProperty( const ::rtl::OUString& PropertyName, const An } } + +void SVTXGridControl::impl_checkTableModelInit() +{ + if ( !m_bTableModelInitCompleted && m_pTableModel->hasColumnModel() && m_pTableModel->hasDataModel() ) + { + TableControl* pTable = dynamic_cast< TableControl* >( GetWindow() ); + if ( pTable ) + { + pTable->SetModel( PTableModel( m_pTableModel ) ); + + m_bTableModelInitCompleted = true; + + // ensure default columns exist, if they have not previously been added + Reference< XGridDataModel > const xDataModel( m_pTableModel->getDataModel(), UNO_QUERY_THROW ); + Reference< XGridColumnModel > const xColumnModel( m_pTableModel->getColumnModel(), UNO_QUERY_THROW ); + + sal_Int32 const nDataColumnCount = xDataModel->getColumnCount(); + if ( ( nDataColumnCount > 0 ) && ( xColumnModel->getColumnCount() == 0 ) ) + xColumnModel->setDefaultColumns( nDataColumnCount ); + // this will trigger notifications, which in turn will let us update our m_pTableModel + } + } +} + +namespace +{ + void lcl_convertColor( ::boost::optional< ::Color > const & i_color, Any & o_colorValue ) + { + if ( !i_color ) + o_colorValue.clear(); + else + o_colorValue <<= i_color->GetColor(); + } +} + Any SVTXGridControl::getProperty( const ::rtl::OUString& PropertyName ) throw(RuntimeException) { ::vos::OGuard aGuard( GetMutex() ); + TableControl* pTable = dynamic_cast< TableControl* >( GetWindow() ); + ENSURE_OR_RETURN( pTable != NULL, "SVTXGridControl::getProperty: no control (anymore)!", Any() ); + + Any aPropertyValue; + const sal_uInt16 nPropId = GetPropertyId( PropertyName ); - TableControl* pTable = (TableControl*)GetWindow(); - if(pTable) + switch(nPropId) + { + case BASEPROPERTY_GRID_SELECTIONMODE: { - switch(nPropId) + SelectionType eSelectionType; + + SelectionMode eSelMode = pTable->getSelEngine()->GetSelectionMode(); + switch( eSelMode ) { - case BASEPROPERTY_GRID_SELECTIONMODE: + case SINGLE_SELECTION: eSelectionType = SelectionType_SINGLE; break; + case RANGE_SELECTION: eSelectionType = SelectionType_RANGE; break; + case MULTIPLE_SELECTION:eSelectionType = SelectionType_MULTI; break; + default: eSelectionType = SelectionType_NONE; break; + } + aPropertyValue <<= eSelectionType; + break; + } + + case BASEPROPERTY_GRID_SHOWROWHEADER: + aPropertyValue <<= sal_Bool( m_pTableModel->hasRowHeaders() ); + break; + + case BASEPROPERTY_GRID_SHOWCOLUMNHEADER: + aPropertyValue <<= sal_Bool( m_pTableModel->hasColumnHeaders() ); + break; + + case BASEPROPERTY_GRID_DATAMODEL: + aPropertyValue <<= m_pTableModel->getDataModel(); + break; + + case BASEPROPERTY_GRID_COLUMNMODEL: + aPropertyValue <<= m_pTableModel->getColumnModel(); + break; + + case BASEPROPERTY_HSCROLL: { - SelectionType eSelectionType; + sal_Bool const bHasScrollbar = ( m_pTableModel->getHorizontalScrollbarVisibility() != ScrollbarShowNever ); + aPropertyValue <<= bHasScrollbar; + break; + } - SelectionMode eSelMode = pTable->getSelEngine()->GetSelectionMode(); - switch( eSelMode ) - { - case SINGLE_SELECTION: eSelectionType = SelectionType_SINGLE; break; - case RANGE_SELECTION: eSelectionType = SelectionType_RANGE; break; - case MULTIPLE_SELECTION:eSelectionType = SelectionType_MULTI; break; -// case NO_SELECTION: - default: eSelectionType = SelectionType_NONE; break; - } - return Any( eSelectionType ); + case BASEPROPERTY_VSCROLL: + { + sal_Bool const bHasScrollbar = ( m_pTableModel->getVerticalScrollbarVisibility() != ScrollbarShowNever ); + aPropertyValue <<= bHasScrollbar; + break; } - case BASEPROPERTY_GRID_SHOWROWHEADER: + + case BASEPROPERTY_USE_GRID_LINES: + { + GridTableRenderer* pGridRenderer = dynamic_cast< GridTableRenderer* >( + m_pTableModel->getRenderer().get() ); + ENSURE_OR_BREAK( pGridRenderer != NULL, "SVTXGridControl::getProperty(UseGridLines): invalid renderer!" ); + aPropertyValue <<= pGridRenderer->useGridLines(); + } + break; + + case BASEPROPERTY_GRID_ROW_BACKGROUND_COLORS: + { + ::boost::optional< ::std::vector< ::Color > > aColors( m_pTableModel->getRowBackgroundColors() ); + if ( !aColors ) + aPropertyValue.clear(); + else + { + Sequence< ::com::sun::star::util::Color > aAPIColors( aColors->size() ); + for ( size_t i=0; i<aColors->size(); ++i ) { - return Any ((sal_Bool) m_pTableModel->hasRowHeaders()); + aAPIColors[i] = aColors->at(i).GetColor(); } - case BASEPROPERTY_GRID_SHOWCOLUMNHEADER: - return Any ((sal_Bool) m_pTableModel->hasColumnHeaders()); - case BASEPROPERTY_GRID_DATAMODEL: - return Any ( m_xDataModel ); - case BASEPROPERTY_GRID_COLUMNMODEL: - return Any ( m_xColumnModel); - case BASEPROPERTY_HSCROLL: - return Any ( m_bHScroll); - case BASEPROPERTY_VSCROLL: - return Any ( m_bVScroll); + aPropertyValue <<= aAPIColors; } } - return VCLXWindow::getProperty( PropertyName ); + break; + + case BASEPROPERTY_GRID_LINE_COLOR: + lcl_convertColor( m_pTableModel->getLineColor(), aPropertyValue ); + break; + + case BASEPROPERTY_GRID_HEADER_BACKGROUND: + lcl_convertColor( m_pTableModel->getHeaderBackgroundColor(), aPropertyValue ); + break; + + case BASEPROPERTY_GRID_HEADER_TEXT_COLOR: + lcl_convertColor( m_pTableModel->getHeaderTextColor(), aPropertyValue ); + break; + + case BASEPROPERTY_TEXTCOLOR: + lcl_convertColor( m_pTableModel->getTextColor(), aPropertyValue ); + break; + + case BASEPROPERTY_TEXTLINECOLOR: + lcl_convertColor( m_pTableModel->getTextLineColor(), aPropertyValue ); + break; + + default: + aPropertyValue = VCLXWindow::getProperty( PropertyName ); + break; + } + + return aPropertyValue; } void SVTXGridControl::ImplGetPropertyIds( std::list< sal_uInt16 > &rIds ) { PushPropertyIds( rIds, - BASEPROPERTY_GRID_SHOWROWHEADER, - BASEPROPERTY_GRID_SHOWCOLUMNHEADER, - BASEPROPERTY_GRID_DATAMODEL, - BASEPROPERTY_GRID_COLUMNMODEL, - BASEPROPERTY_GRID_SELECTIONMODE, - BASEPROPERTY_GRID_EVEN_ROW_BACKGROUND, - BASEPROPERTY_GRID_HEADER_BACKGROUND, - BASEPROPERTY_GRID_LINE_COLOR, - BASEPROPERTY_GRID_ROW_BACKGROUND, - 0); + BASEPROPERTY_GRID_SHOWROWHEADER, + BASEPROPERTY_GRID_SHOWCOLUMNHEADER, + BASEPROPERTY_GRID_DATAMODEL, + BASEPROPERTY_GRID_COLUMNMODEL, + BASEPROPERTY_GRID_SELECTIONMODE, + BASEPROPERTY_GRID_HEADER_BACKGROUND, + BASEPROPERTY_GRID_HEADER_TEXT_COLOR, + BASEPROPERTY_GRID_LINE_COLOR, + BASEPROPERTY_GRID_ROW_BACKGROUND_COLORS, + 0 + ); VCLXWindow::ImplGetPropertyIds( rIds, true ); } -void SAL_CALL SVTXGridControl::setVisible( sal_Bool bVisible ) throw(::com::sun::star::uno::RuntimeException) + +//---------------------------------------------------------------------------------------------------------------------- +void SAL_CALL SVTXGridControl::rowsInserted( const GridDataEvent& i_event ) throw (RuntimeException) { ::vos::OGuard aGuard( GetMutex() ); - TableControl* pTable = (TableControl*)GetWindow(); - if ( pTable ) - { - pTable->SetModel(PTableModel(m_pTableModel)); - pTable->Show( bVisible ); - } + m_pTableModel->notifyRowsInserted( i_event ); } -void SAL_CALL SVTXGridControl::setFocus() throw(::com::sun::star::uno::RuntimeException) + +//---------------------------------------------------------------------------------------------------------------------- +void SAL_CALL//---------------------------------------------------------------------------------------------------------------------- + SVTXGridControl::rowsRemoved( const GridDataEvent& i_event ) throw (RuntimeException) { ::vos::OGuard aGuard( GetMutex() ); - if ( GetWindow()) - GetWindow()->GrabFocus(); + m_pTableModel->notifyRowsRemoved( i_event ); } -void SAL_CALL SVTXGridControl::rowAdded(const ::com::sun::star::awt::grid::GridDataEvent& Event ) throw (::com::sun::star::uno::RuntimeException) + +//---------------------------------------------------------------------------------------------------------------------- +void SAL_CALL SVTXGridControl::dataChanged( const GridDataEvent& i_event ) throw (RuntimeException) { ::vos::OGuard aGuard( GetMutex() ); - std::vector< Any > newRow; - Sequence< Any > rawRowData = Event.rowData; - int colCount = m_xColumnModel->getColumnCount(); - if(colCount == 0) - { - Reference<XGridColumnListener> listener(*this,UNO_QUERY_THROW); - m_xColumnModel->setDefaultColumns(rawRowData.getLength()); - for ( ::svt::table::ColPos col = 0; col < rawRowData.getLength(); ++col ) - { - UnoControlTableColumn* tableColumn = new UnoControlTableColumn(); - m_pTableModel->getColumnModel().push_back((PColumnModel)tableColumn); - m_xColumnModel->getColumn(col)->addColumnListener(listener); - } + m_pTableModel->notifyDataChanged( i_event ); - } - else if((unsigned int)rawRowData.getLength()!=(unsigned)colCount) - throw GridInvalidDataException(rtl::OUString::createFromAscii("The column count doesn't match with the length of row data"), m_xDataModel); - - for ( int k = 0; k < rawRowData.getLength(); k++) - newRow.push_back(rawRowData[k]); - m_pTableModel->getCellContent().push_back(newRow); - if(m_pTableModel->hasRowHeaders()) - m_pTableModel->getRowHeaderName().push_back(Event.headerName); - m_pTableModel->setRowCount(m_pTableModel->getCellContent().size()); - TableControl* pTable = (TableControl*)GetWindow(); - pTable->InvalidateDataWindow(m_pTableModel->getCellContent().size()-1, 0, false); - if(pTable->isAccessibleAlive()) - { - pTable->commitGridControlEvent(TABLE_MODEL_CHANGED, - makeAny( AccessibleTableModelChange(INSERT, m_pTableModel->getRowCount()-1, m_pTableModel->getRowCount(), 0, m_pTableModel->getColumnCount())), - Any()); - pTable->commitGridControlEvent(CHILD, - makeAny( pTable->m_pAccessTable->m_pAccessible->getTableHeader(TCTYPE_ROWHEADERBAR)), - Any()); - for (sal_Int32 i = 0 ; i <= m_pTableModel->getColumnCount() ; ++i) - { - pTable->commitGridControlEvent( - CHILD, - makeAny( pTable->m_pAccessTable->m_pAccessible->getTable() ), - Any()); - } - } + // if the data model is sortable, a dataChanged event is also fired in case the sort order changed. + // So, just in case, invalidate the column header area, too. + TableControl* pTable = dynamic_cast< TableControl* >( GetWindow() ); + ENSURE_OR_RETURN_VOID( pTable, "SVTXGridControl::dataChanged: no control (anymore)!" ); + pTable->getTableControlInterface().invalidate( TableAreaColumnHeaders ); } -void SAL_CALL SVTXGridControl::rowRemoved(const ::com::sun::star::awt::grid::GridDataEvent& Event ) throw (::com::sun::star::uno::RuntimeException) +//---------------------------------------------------------------------------------------------------------------------- +void SAL_CALL SVTXGridControl::rowHeadingChanged( const GridDataEvent& i_event ) throw (RuntimeException) { ::vos::OGuard aGuard( GetMutex() ); + OSL_UNUSED( i_event ); - TableControl* pTable = (TableControl*)GetWindow(); - if(Event.index == -1) - { - if(!isSelectionEmpty()) - deselectAllRows(); - if(m_pTableModel->hasRowHeaders()) - m_pTableModel->getRowHeaderName().clear(); - pTable->clearSelection(); - m_pTableModel->getCellContent().clear(); - if(pTable->isAccessibleAlive()) - { - pTable->commitGridControlEvent(TABLE_MODEL_CHANGED, - makeAny( AccessibleTableModelChange(DELETE, 0, m_pTableModel->getColumnCount(), 0, m_pTableModel->getColumnCount())), - Any()); - } - } - else if(Event.index >= 0 && Event.index < m_pTableModel->getRowCount()) - { - if(isSelectedIndex(Event.index)) - { - Sequence<sal_Int32> selected(1); - selected[0]=Event.index; - deselectRows(selected); - } - if(m_pTableModel->hasRowHeaders()) - m_pTableModel->getRowHeaderName().erase(m_pTableModel->getRowHeaderName().begin()+Event.index); - std::vector<std::vector<Any> >::iterator rowPos =m_pTableModel->getCellContent().begin() + Event.index; - m_pTableModel->getCellContent().erase( rowPos ); - } - m_pTableModel->setRowCount(m_pTableModel->getCellContent().size()); - pTable->InvalidateDataWindow(Event.index, Event.index, true); - if(pTable->isAccessibleAlive()) - { - pTable->commitGridControlEvent(TABLE_MODEL_CHANGED, - makeAny( AccessibleTableModelChange(DELETE, Event.index, Event.index+1, 0, m_pTableModel->getColumnCount())), - Any()); - } + TableControl* pTable = dynamic_cast< TableControl* >( GetWindow() ); + ENSURE_OR_RETURN_VOID( pTable, "SVTXGridControl::rowHeadingChanged: no control (anymore)!" ); + + // TODO: we could do better than this - invalidate the header area only + pTable->getTableControlInterface().invalidate( TableAreaRowHeaders ); } -void SAL_CALL SVTXGridControl::columnChanged(const ::com::sun::star::awt::grid::GridColumnEvent& Event ) throw (::com::sun::star::uno::RuntimeException) +//---------------------------------------------------------------------------------------------------------------------- +void SAL_CALL SVTXGridControl::elementInserted( const ContainerEvent& i_event ) throw (RuntimeException) { ::vos::OGuard aGuard( GetMutex() ); - TableControl* pTable = (TableControl*)GetWindow(); - if(Event.valueName == rtl::OUString::createFromAscii("ColumnResize")) - { - bool resizable = m_pTableModel->getColumnModel()[Event.index]->isResizable(); - Event.newValue>>=resizable; - m_pTableModel->getColumnModel()[Event.index]->setResizable(resizable); - } - else if(Event.valueName == rtl::OUString::createFromAscii("ColWidth")) - { - sal_Int32 colWidth = m_pTableModel->getColumnModel()[Event.index]->getWidth(); - Event.newValue>>=colWidth; - m_pTableModel->getColumnModel()[Event.index]->setWidth(colWidth); - } - else if(Event.valueName == rtl::OUString::createFromAscii("MaxWidth")) - { - sal_Int32 maxWidth = m_pTableModel->getColumnModel()[Event.index]->getMaxWidth(); - Event.newValue>>=maxWidth; - m_pTableModel->getColumnModel()[Event.index]->setMaxWidth(maxWidth); - } - else if(Event.valueName == rtl::OUString::createFromAscii("MinWidth")) - { - sal_Int32 minWidth = m_pTableModel->getColumnModel()[Event.index]->getMinWidth(); - Event.newValue>>=minWidth; - m_pTableModel->getColumnModel()[Event.index]->setMinWidth(minWidth); - } - else if(Event.valueName == rtl::OUString::createFromAscii("PrefWidth")) - { - sal_Int32 prefWidth = m_pTableModel->getColumnModel()[Event.index]->getPreferredWidth(); - Event.newValue>>=prefWidth; - m_pTableModel->getColumnModel()[Event.index]->setPreferredWidth(prefWidth); - } - else if(Event.valueName == rtl::OUString::createFromAscii("HAlign")) - { - ::com::sun::star::style::HorizontalAlignment hAlign = m_pTableModel->getColumnModel()[Event.index]->getHorizontalAlign(); - Event.newValue>>=hAlign; - m_pTableModel->getColumnModel()[Event.index]->setHorizontalAlign(hAlign); - } - else if(Event.valueName == rtl::OUString::createFromAscii("UpdateWidth")) - { - if(m_pTableModel->getColumnModel()[Event.index]->getPreferredWidth() != 0) - m_xColumnModel->getColumn(Event.index)->updateColumn(rtl::OUString::createFromAscii("PrefWidth"), m_pTableModel->getColumnModel()[Event.index]->getPreferredWidth()); - m_xColumnModel->getColumn(Event.index)->updateColumn(rtl::OUString::createFromAscii("ColWidth"), m_pTableModel->getColumnModel()[Event.index]->getWidth()); - } - pTable->Invalidate(); + Reference< XGridColumn > const xGridColumn( i_event.Element, UNO_QUERY_THROW ); + + sal_Int32 nIndex( m_pTableModel->getColumnCount() ); + OSL_VERIFY( i_event.Accessor >>= nIndex ); + m_pTableModel->insertColumn( nIndex, xGridColumn ); } -void SAL_CALL SVTXGridControl::dataChanged(const ::com::sun::star::awt::grid::GridDataEvent& Event ) throw (::com::sun::star::uno::RuntimeException) + +//---------------------------------------------------------------------------------------------------------------------- +void SAL_CALL SVTXGridControl::elementRemoved( const ContainerEvent& i_event ) throw (RuntimeException) { ::vos::OGuard aGuard( GetMutex() ); - TableControl* pTable = (TableControl*)GetWindow(); - if(Event.valueName == rtl::OUString::createFromAscii("RowHeight")) - { - sal_Int32 rowHeight = m_pTableModel->getRowHeight(); - Event.newValue>>=rowHeight; - m_pTableModel->setRowHeight(rowHeight); - pTable->Invalidate(); - } - else if(Event.valueName == rtl::OUString::createFromAscii("RowHeaderWidth")) - { - sal_Int32 rowHeaderWidth = m_pTableModel->getRowHeaderWidth(); - Event.newValue>>=rowHeaderWidth; - m_pTableModel->setRowHeaderWidth(rowHeaderWidth); - pTable->Invalidate(); - } - else if(Event.valueName == rtl::OUString::createFromAscii("RowHeaders")) - { - Sequence< rtl::OUString > headers(0); - Event.newValue>>=headers; - std::vector< rtl::OUString > headerNames( comphelper::sequenceToContainer <std::vector< rtl::OUString > >(headers) ); - m_pTableModel->setRowHeaderName(headerNames); - pTable->Invalidate(); - } - else if(Event.valueName == rtl::OUString::createFromAscii("CellUpdated")) - { - std::vector< std::vector< Any > >& rowContent = m_pTableModel->getCellContent(); - sal_Int32 col = -1; - Event.oldValue>>=col; - rowContent[Event.index][col] = Event.newValue; - pTable->InvalidateDataWindow(Event.index, Event.index, false); - } - else if(Event.valueName == rtl::OUString::createFromAscii("RowUpdated")) - { - std::vector<std::vector< Any > >& rowContent = m_pTableModel->getCellContent(); - Sequence< sal_Int32 > cols(0); - Sequence< Any > values(0); - Event.oldValue>>=cols; - Event.newValue>>=values; - for(int i = 0; i< cols.getLength(); i++) - { - if(cols[i]>=0 && cols[i]<m_pTableModel->getColumnCount()) - rowContent[Event.index][cols[i]]=values[i]; - else - break; - } - pTable->InvalidateDataWindow(Event.index, Event.index, false); - } + sal_Int32 nIndex( -1 ); + OSL_VERIFY( i_event.Accessor >>= nIndex ); + m_pTableModel->removeColumn( nIndex ); } -void SAL_CALL SVTXGridControl::disposing( const ::com::sun::star::lang::EventObject& Source ) throw(::com::sun::star::uno::RuntimeException) +//---------------------------------------------------------------------------------------------------------------------- +void SAL_CALL SVTXGridControl::elementReplaced( const ContainerEvent& i_event ) throw (RuntimeException) { - VCLXWindow::disposing( Source ); + OSL_ENSURE( false, "SVTXGridControl::elementReplaced: not implemented!" ); + // at the moment, the XGridColumnModel API does not allow replacing columns + OSL_UNUSED( i_event ); + // TODO: replace the respective column in our table model } -::sal_Int32 SAL_CALL SVTXGridControl::getMinSelectionIndex() throw (::com::sun::star::uno::RuntimeException) -{ - TableControl* pTable = (TableControl*)GetWindow(); - std::vector<RowPos>& selectedRows = pTable->GetSelectedRows(); - if(selectedRows.empty()) - return -1; - else - { - std::vector<RowPos>::iterator itStart = selectedRows.begin(); - std::vector<RowPos>::iterator itEnd = selectedRows.end(); - return *(std::min_element(itStart, itEnd)); - } -} -::sal_Int32 SAL_CALL SVTXGridControl::getMaxSelectionIndex() throw (::com::sun::star::uno::RuntimeException) +//---------------------------------------------------------------------------------------------------------------------- +void SAL_CALL SVTXGridControl::disposing( const ::com::sun::star::lang::EventObject& Source ) throw(::com::sun::star::uno::RuntimeException) { - TableControl* pTable = (TableControl*)GetWindow(); - std::vector<RowPos>& selectedRows = pTable->GetSelectedRows(); - if(selectedRows.empty()) - return -1; - else - { - std::vector<RowPos>::iterator itStart = selectedRows.begin(); - std::vector<RowPos>::iterator itEnd = selectedRows.end(); - return *(std::max_element(itStart, itEnd)); - } + VCLXWindow::disposing( Source ); } -void SAL_CALL SVTXGridControl::selectRows(const ::com::sun::star::uno::Sequence< ::sal_Int32 >& rangeOfRows) throw (::com::sun::star::uno::RuntimeException) +//---------------------------------------------------------------------------------------------------------------------- +void SAL_CALL SVTXGridControl::selectRow( ::sal_Int32 i_rowIndex ) throw (::com::sun::star::uno::RuntimeException) { - TableControl* pTable = (TableControl*)GetWindow(); - SelectionMode eSelMode = pTable->getSelEngine()->GetSelectionMode(); - if(eSelMode != NO_SELECTION) - { - sal_Int32 start = rangeOfRows[0]; - int seqSize = rangeOfRows.getLength(); - sal_Int32 end = rangeOfRows[seqSize-1]; - if((start >= 0 && start < m_pTableModel->getRowCount()) && (end >= 0 && end < m_pTableModel->getRowCount())) - { - std::vector<RowPos>& selectedRows = pTable->GetSelectedRows(); - if(eSelMode == SINGLE_SELECTION) - { - if(!selectedRows.empty()) - selectedRows.clear(); - if(rangeOfRows.getLength() == 1) - selectedRows.push_back(start); - else - return; - } - else - { - for(int i=0;i<seqSize;i++) - { - if(!isSelectedIndex(rangeOfRows[i])) - selectedRows.push_back(rangeOfRows[i]); - } - } - pTable->selectionChanged(true); - pTable->InvalidateDataWindow(start, end, false); - SetSynthesizingVCLEvent( sal_True ); - pTable->Select(); - SetSynthesizingVCLEvent( sal_False ); - } - } + ::vos::OGuard aGuard( GetMutex() ); + + TableControl* pTable = dynamic_cast< TableControl* >( GetWindow() ); + ENSURE_OR_RETURN_VOID( pTable, "SVTXGridControl::selectRow: no control (anymore)!" ); + + pTable->SelectRow( i_rowIndex, true ); } +//---------------------------------------------------------------------------------------------------------------------- void SAL_CALL SVTXGridControl::selectAllRows() throw (::com::sun::star::uno::RuntimeException) { - TableControl* pTable = (TableControl*)GetWindow(); - SelectionMode eSelMode = pTable->getSelEngine()->GetSelectionMode(); - if(eSelMode != NO_SELECTION) - { - std::vector<RowPos>& selectedRows = pTable->GetSelectedRows(); - if(!selectedRows.empty()) - selectedRows.clear(); - for(int i=0;i<m_pTableModel->getRowCount();i++) - selectedRows.push_back(i); - pTable->Invalidate(); - SetSynthesizingVCLEvent( sal_True ); - pTable->Select(); - SetSynthesizingVCLEvent( sal_False ); - } + ::vos::OGuard aGuard( GetMutex() ); + + TableControl* pTable = dynamic_cast< TableControl* >( GetWindow() ); + ENSURE_OR_RETURN_VOID( pTable, "SVTXGridControl::selectAllRows: no control (anymore)!" ); + + pTable->SelectAllRows( true ); } -void SAL_CALL SVTXGridControl::deselectRows(const ::com::sun::star::uno::Sequence< ::sal_Int32 >& rangeOfRows) throw (::com::sun::star::uno::RuntimeException) +//---------------------------------------------------------------------------------------------------------------------- +void SAL_CALL SVTXGridControl::deselectRow( ::sal_Int32 i_rowIndex ) throw (::com::sun::star::uno::RuntimeException) { - TableControl* pTable = (TableControl*)GetWindow(); - std::vector<RowPos>& selectedRows = pTable->GetSelectedRows(); - std::vector<RowPos>::iterator itStart = selectedRows.begin(); - std::vector<RowPos>::iterator itEnd = selectedRows.end(); - for(int i = 0; i < rangeOfRows.getLength(); i++ ) - { - std::vector<RowPos>::iterator iter = std::find(itStart, itEnd, rangeOfRows[i]); - selectedRows.erase(iter); - } - pTable->selectionChanged(true); - pTable->Invalidate(); - SetSynthesizingVCLEvent( sal_True ); - pTable->Select(); - SetSynthesizingVCLEvent( sal_False ); + ::vos::OGuard aGuard( GetMutex() ); + + TableControl* pTable = dynamic_cast< TableControl* >( GetWindow() ); + ENSURE_OR_RETURN_VOID( pTable, "SVTXGridControl::deselectRow: no control (anymore)!" ); + + pTable->SelectRow( i_rowIndex, false ); } +//---------------------------------------------------------------------------------------------------------------------- void SAL_CALL SVTXGridControl::deselectAllRows() throw (::com::sun::star::uno::RuntimeException) { - TableControl* pTable = (TableControl*)GetWindow(); - std::vector<RowPos>& selectedRows = pTable->GetSelectedRows(); - if(!selectedRows.empty()) - selectedRows.clear(); - pTable->Invalidate(); - SetSynthesizingVCLEvent( sal_True ); - pTable->Select(); - SetSynthesizingVCLEvent( sal_False ); + ::vos::OGuard aGuard( GetMutex() ); + + TableControl* pTable = dynamic_cast< TableControl* >( GetWindow() ); + ENSURE_OR_RETURN_VOID( pTable, "SVTXGridControl::deselectAllRows: no control (anymore)!" ); + + pTable->SelectAllRows( false ); } +//---------------------------------------------------------------------------------------------------------------------- ::com::sun::star::uno::Sequence< ::sal_Int32 > SAL_CALL SVTXGridControl::getSelection() throw (::com::sun::star::uno::RuntimeException) { - TableControl* pTable = (TableControl*)GetWindow(); - std::vector<RowPos>& selectedRows = pTable->GetSelectedRows(); - Sequence<sal_Int32> selectedRowsToSequence(comphelper::containerToSequence(selectedRows)); - return selectedRowsToSequence; -} + ::vos::OGuard aGuard( GetMutex() ); -::sal_Bool SAL_CALL SVTXGridControl::isCellEditable() throw (::com::sun::star::uno::RuntimeException) -{ - return sal_False; + TableControl* pTable = dynamic_cast< TableControl* >( GetWindow() ); + ENSURE_OR_RETURN( pTable, "SVTXGridControl::getSelection: no control (anymore)!", Sequence< sal_Int32 >() ); + + sal_Int32 selectionCount = pTable->GetSelectedRowCount(); + Sequence< sal_Int32 > selectedRows( selectionCount ); + for ( sal_Int32 i=0; i<selectionCount; ++i ) + selectedRows[i] = pTable->GetSelectedRowIndex(i); + return selectedRows; } +//---------------------------------------------------------------------------------------------------------------------- ::sal_Bool SAL_CALL SVTXGridControl::isSelectionEmpty() throw (::com::sun::star::uno::RuntimeException) { - TableControl* pTable = (TableControl*)GetWindow(); - std::vector<RowPos>& selectedRows = pTable->GetSelectedRows(); - if(selectedRows.empty()) - return sal_True; - else - return sal_False; -} + ::vos::OGuard aGuard( GetMutex() ); -::sal_Bool SAL_CALL SVTXGridControl::isSelectedIndex(::sal_Int32 index) throw (::com::sun::star::uno::RuntimeException) -{ - TableControl* pTable = (TableControl*)GetWindow(); - std::vector<RowPos>& selectedRows = pTable->GetSelectedRows(); - return std::find(selectedRows.begin(),selectedRows.end(), index) != selectedRows.end(); -} + TableControl* pTable = dynamic_cast< TableControl* >( GetWindow() ); + ENSURE_OR_RETURN( pTable, "SVTXGridControl::getSelection: no control (anymore)!", sal_True ); -void SAL_CALL SVTXGridControl::selectRow(::sal_Int32 index) throw (::com::sun::star::uno::RuntimeException) -{ - if(index<0 || index>=m_pTableModel->getRowCount()) - return; - TableControl* pTable = (TableControl*)GetWindow(); - SelectionMode eSelMode = pTable->getSelEngine()->GetSelectionMode(); - if(eSelMode != NO_SELECTION) - { - std::vector<RowPos>& selectedRows = pTable->GetSelectedRows(); - if(eSelMode == MULTIPLE_SELECTION) - { - if(!isSelectedIndex(index)) - selectedRows.push_back(index); - else - return; - } - else if(eSelMode == SINGLE_SELECTION) - { - if(!selectedRows.empty()) - { - if(!isSelectedIndex(index)) - deselectRows(getSelection()); - else - return; - } - selectedRows.push_back(index); - } - pTable->selectionChanged(true); - pTable->InvalidateDataWindow(index, index, false); - SetSynthesizingVCLEvent( sal_True ); - pTable->Select(); - SetSynthesizingVCLEvent( sal_False ); - } + return pTable->GetSelectedRowCount() > 0; } -void SAL_CALL SVTXGridControl::selectColumn(::sal_Int32 x) throw (::com::sun::star::uno::RuntimeException) +//---------------------------------------------------------------------------------------------------------------------- +::sal_Bool SAL_CALL SVTXGridControl::isSelectedIndex( ::sal_Int32 index ) throw (::com::sun::star::uno::RuntimeException) { - (void)x; + ::vos::OGuard aGuard( GetMutex() ); + + TableControl* pTable = dynamic_cast< TableControl* >( GetWindow() ); + ENSURE_OR_RETURN( pTable, "SVTXGridControl::isSelectedIndex: no control (anymore)!", sal_False ); + + return pTable->IsRowSelected( index ); } + +//---------------------------------------------------------------------------------------------------------------------- void SVTXGridControl::dispose() throw(::com::sun::star::uno::RuntimeException) { - ::vos::OGuard aGuard( GetMutex() ); - ::com::sun::star::lang::EventObject aObj; aObj.Source = (::cppu::OWeakObject*)this; m_aSelectionListeners.disposeAndClear( aObj ); VCLXWindow::dispose(); } +//---------------------------------------------------------------------------------------------------------------------- void SVTXGridControl::ProcessWindowEvent( const VclWindowEvent& rVclWindowEvent ) { - ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindow > xKeepAlive( this ); + ::vos::OGuard aGuard( GetMutex() ); + ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindow > xKeepAlive( this ); switch ( rVclWindowEvent.GetId() ) { case VCLEVENT_TABLEROW_SELECT: { - TableControl* pTable = (TableControl*)GetWindow(); - - if( pTable ) - { - if ( m_aSelectionListeners.getLength() ) - { - ImplCallItemListeners(); - } - } + TableControl* pTable = dynamic_cast< TableControl* >( GetWindow() ); + ENSURE_OR_BREAK( pTable, "SVTXGridControl::ProcessWindowEvent: no control (anymore)!" ); + if ( m_aSelectionListeners.getLength() ) + ImplCallItemListeners(); } break; @@ -852,28 +703,30 @@ void SVTXGridControl::ProcessWindowEvent( const VclWindowEvent& rVclWindowEvent } } +//---------------------------------------------------------------------------------------------------------------------- void SVTXGridControl::ImplCallItemListeners() { - TableControl* pTable = (TableControl*) GetWindow(); - if ( pTable && m_aSelectionListeners.getLength() ) + TableControl* pTable = dynamic_cast< TableControl* >( GetWindow() ); + ENSURE_OR_RETURN_VOID( pTable, "SVTXGridControl::ImplCallItemListeners: no control (anymore)!" ); + + if ( m_aSelectionListeners.getLength() ) { - ::std::vector<sal_Int32> selRows = pTable->GetSelectedRows(); + sal_Int32 const actSelRowCount = pTable->GetSelectedRowCount(); ::com::sun::star::awt::grid::GridSelectionEvent aEvent; aEvent.Source = (::cppu::OWeakObject*)this; aEvent.Column = 0; - sal_Int32 actSelRowCount = selRows.size(); sal_Int32 diff = actSelRowCount - m_nSelectedRowCount; //row added to selection if(diff >= 1) { aEvent.Action = com::sun::star::awt::grid::SelectionEventType(0); - aEvent.Row = selRows[actSelRowCount-1]; + aEvent.Row = pTable->GetSelectedRowIndex( actSelRowCount - 1 ); aEvent.Range = diff; } //selected row changed else if(diff == 0 && actSelRowCount != 0) { - aEvent.Row = selRows[actSelRowCount-1]; + aEvent.Row = pTable->GetSelectedRowIndex( actSelRowCount - 1 ); aEvent.Action = com::sun::star::awt::grid::SelectionEventType(2); aEvent.Range = 0; } @@ -882,7 +735,7 @@ void SVTXGridControl::ImplCallItemListeners() //selection changed: multiple row deselected, only 1 row is selected if(actSelRowCount == 1) { - aEvent.Row = selRows[actSelRowCount-1]; + aEvent.Row = pTable->GetSelectedRowIndex( actSelRowCount - 1 ); aEvent.Action = com::sun::star::awt::grid::SelectionEventType(2); } //row is deselected @@ -897,3 +750,31 @@ void SVTXGridControl::ImplCallItemListeners() m_aSelectionListeners.selectionChanged( aEvent ); } } + +//---------------------------------------------------------------------------------------------------------------------- +void SVTXGridControl::impl_updateColumnsFromModel_nothrow() +{ + Reference< XGridColumnModel > const xColumnModel( m_pTableModel->getColumnModel() ); + ENSURE_OR_RETURN_VOID( xColumnModel.is(), "no model!" ); + TableControl* pTable = dynamic_cast< TableControl* >( GetWindow() ); + ENSURE_OR_RETURN_VOID( pTable != NULL, "no table!" ); + + try + { + const Sequence< Reference< XGridColumn > > columns = xColumnModel->getColumns(); + for ( const Reference< XGridColumn >* colRef = columns.getConstArray(); + colRef != columns.getConstArray() + columns.getLength(); + ++colRef + ) + { + ENSURE_OR_CONTINUE( colRef->is(), "illegal column!" ); + + m_pTableModel->appendColumn( *colRef ); + } + } + catch( const Exception& ) + { + DBG_UNHANDLED_EXCEPTION(); + } +} + diff --git a/svtools/source/uno/svtxgridcontrol.hxx b/svtools/source/uno/svtxgridcontrol.hxx index b15507e4614f..525327b3c760 100755 --- a/svtools/source/uno/svtxgridcontrol.hxx +++ b/svtools/source/uno/svtxgridcontrol.hxx @@ -32,86 +32,88 @@ #include <svtools/table/tablecontrol.hxx> #include <com/sun/star/awt/grid/XGridControl.hpp> #include <com/sun/star/awt/grid/XGridDataListener.hpp> -#include <com/sun/star/awt/grid/XGridColumnListener.hpp> #include <com/sun/star/awt/grid/GridDataEvent.hpp> #include <com/sun/star/awt/grid/GridColumnEvent.hpp> #include <com/sun/star/awt/grid/XGridColumnModel.hpp> #include <com/sun/star/awt/grid/XGridDataModel.hpp> #include <com/sun/star/awt/grid/XGridSelectionListener.hpp> +#include <com/sun/star/container/XContainerListener.hpp> #include <toolkit/awt/vclxwindow.hxx> #include <toolkit/awt/vclxwindows.hxx> #include <cppuhelper/typeprovider.hxx> -#include <cppuhelper/implbase3.hxx> +#include <cppuhelper/implbase4.hxx> #include <toolkit/helper/listenermultiplexer.hxx> using namespace ::svt::table; -class SVTXGridControl : public ::cppu::ImplInheritanceHelper3< VCLXWindow, ::com::sun::star::awt::grid::XGridControl, - ::com::sun::star::awt::grid::XGridDataListener, ::com::sun::star::awt::grid::XGridColumnListener> +typedef ::cppu::ImplInheritanceHelper3 < VCLXWindow + , ::com::sun::star::awt::grid::XGridControl + , ::com::sun::star::awt::grid::XGridDataListener + , ::com::sun::star::container::XContainerListener + > SVTXGridControl_Base; +class SVTXGridControl : public SVTXGridControl_Base { private: - ::boost::shared_ptr< UnoControlTableModel > m_pTableModel; - ::com::sun::star::uno::Reference< ::com::sun::star::awt::grid::XGridDataModel >m_xDataModel; - ::com::sun::star::uno::Reference< ::com::sun::star::awt::grid::XGridColumnModel >m_xColumnModel; - bool m_bHasColumnHeaders; - bool m_bHasRowHeaders; - bool m_bVScroll; - bool m_bHScroll; - bool m_bUpdate; - sal_Int32 m_nSelectedRowCount; - SelectionListenerMultiplexer m_aSelectionListeners; + ::boost::shared_ptr< UnoControlTableModel > m_pTableModel; + bool m_bHasColumnHeaders; + bool m_bHasRowHeaders; + bool m_bTableModelInitCompleted; + sal_Int32 m_nSelectedRowCount; + SelectionListenerMultiplexer m_aSelectionListeners; protected: virtual void ProcessWindowEvent( const VclWindowEvent& rVclWindowEvent ); void ImplCallItemListeners(); public: - SVTXGridControl(); + SVTXGridControl(); ~SVTXGridControl(); - //XGridDataListener overridables - virtual void SAL_CALL rowAdded(const ::com::sun::star::awt::grid::GridDataEvent& Event) throw (::com::sun::star::uno::RuntimeException); - virtual void SAL_CALL rowRemoved(const ::com::sun::star::awt::grid::GridDataEvent & Event) throw (::com::sun::star::uno::RuntimeException); - virtual void SAL_CALL dataChanged(const ::com::sun::star::awt::grid::GridDataEvent & Event) throw (::com::sun::star::uno::RuntimeException); - //XGridColumnListener overridables - virtual void SAL_CALL columnChanged(const ::com::sun::star::awt::grid::GridColumnEvent & Event) throw (::com::sun::star::uno::RuntimeException); + // XGridDataListener + virtual void SAL_CALL rowsInserted( const ::com::sun::star::awt::grid::GridDataEvent& Event ) throw (::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL rowsRemoved( const ::com::sun::star::awt::grid::GridDataEvent& Event ) throw (::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL dataChanged( const ::com::sun::star::awt::grid::GridDataEvent& Event ) throw (::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL rowHeadingChanged( const ::com::sun::star::awt::grid::GridDataEvent& Event ) throw (::com::sun::star::uno::RuntimeException); - virtual void SAL_CALL disposing( const ::com::sun::star::lang::EventObject& Source ) throw(::com::sun::star::uno::RuntimeException); - - ::com::sun::star::uno::Any SAL_CALL queryInterface( const ::com::sun::star::uno::Type & rType ) throw(::com::sun::star::uno::RuntimeException); - void SAL_CALL acquire() throw() { VCLXWindow::acquire(); } - void SAL_CALL release() throw() { VCLXWindow::release(); } + // XContainerListener + virtual void SAL_CALL elementInserted( const ::com::sun::star::container::ContainerEvent& Event ) throw (::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL elementRemoved( const ::com::sun::star::container::ContainerEvent& Event ) throw (::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL elementReplaced( const ::com::sun::star::container::ContainerEvent& Event ) throw (::com::sun::star::uno::RuntimeException); - // ::com::sun::star::lang::XTypeProvider - ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL getTypes() throw(::com::sun::star::uno::RuntimeException); - ::com::sun::star::uno::Sequence< sal_Int8 > SAL_CALL getImplementationId() throw(::com::sun::star::uno::RuntimeException); + // XEventListener + virtual void SAL_CALL disposing( const ::com::sun::star::lang::EventObject& Source ) throw(::com::sun::star::uno::RuntimeException); - //::com::sun::star::awt::grid::XGridControl - virtual ::sal_Int32 SAL_CALL getMinSelectionIndex() throw (::com::sun::star::uno::RuntimeException); - virtual ::sal_Int32 SAL_CALL getMaxSelectionIndex() throw (::com::sun::star::uno::RuntimeException); - virtual void SAL_CALL selectRows(const ::com::sun::star::uno::Sequence< ::sal_Int32 >& rangeOfRows) throw (::com::sun::star::uno::RuntimeException); + // XGridSelection + virtual void SAL_CALL selectRow( ::sal_Int32 i_rowIndex ) throw (::com::sun::star::uno::RuntimeException); virtual void SAL_CALL selectAllRows() throw (::com::sun::star::uno::RuntimeException); - virtual void SAL_CALL deselectRows(const ::com::sun::star::uno::Sequence< ::sal_Int32 >& rangeOfRows) throw (::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL deselectRow( ::sal_Int32 i_rowIndex ) throw (::com::sun::star::uno::RuntimeException); virtual void SAL_CALL deselectAllRows() throw (::com::sun::star::uno::RuntimeException); virtual ::com::sun::star::uno::Sequence< ::sal_Int32 > SAL_CALL getSelection() throw (::com::sun::star::uno::RuntimeException); - virtual ::sal_Bool SAL_CALL isCellEditable() throw (::com::sun::star::uno::RuntimeException); virtual ::sal_Bool SAL_CALL isSelectionEmpty() throw (::com::sun::star::uno::RuntimeException); virtual ::sal_Bool SAL_CALL isSelectedIndex(::sal_Int32 index) throw (::com::sun::star::uno::RuntimeException); - virtual void SAL_CALL selectRow(::sal_Int32 y) throw (::com::sun::star::uno::RuntimeException); - virtual void SAL_CALL selectColumn(::sal_Int32 x) throw (::com::sun::star::uno::RuntimeException); virtual void SAL_CALL addSelectionListener(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::grid::XGridSelectionListener > & listener) throw (::com::sun::star::uno::RuntimeException); virtual void SAL_CALL removeSelectionListener(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::grid::XGridSelectionListener > & listener) throw (::com::sun::star::uno::RuntimeException); - virtual ::sal_Int32 SAL_CALL getItemIndexAtPoint(::sal_Int32 x, ::sal_Int32 y) throw (::com::sun::star::uno::RuntimeException); - virtual void SAL_CALL setToolTip(const ::com::sun::star::uno::Sequence< ::rtl::OUString >& text, const ::com::sun::star::uno::Sequence< sal_Int32 >& columns) throw (::com::sun::star::uno::RuntimeException); + + // XGridControl + virtual ::sal_Int32 SAL_CALL getRowAtPoint(::sal_Int32 x, ::sal_Int32 y) throw (::com::sun::star::uno::RuntimeException); + virtual ::sal_Int32 SAL_CALL getColumnAtPoint(::sal_Int32 x, ::sal_Int32 y) throw (::com::sun::star::uno::RuntimeException); + virtual ::sal_Int32 SAL_CALL getCurrentColumn( ) throw (::com::sun::star::uno::RuntimeException); + virtual ::sal_Int32 SAL_CALL getCurrentRow( ) throw (::com::sun::star::uno::RuntimeException); void SAL_CALL setProperty( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Any& Value ) throw(::com::sun::star::uno::RuntimeException); ::com::sun::star::uno::Any SAL_CALL getProperty( const ::rtl::OUString& PropertyName ) throw(::com::sun::star::uno::RuntimeException); static void ImplGetPropertyIds( std::list< sal_uInt16 > &aIds ); - void SAL_CALL setVisible(sal_Bool bVisible) throw(::com::sun::star::uno::RuntimeException); - void SAL_CALL setFocus() throw(::com::sun::star::uno::RuntimeException); // ::com::sun::star::lang::XComponent void SAL_CALL dispose( ) throw(::com::sun::star::uno::RuntimeException); - }; - #endif // _SVT_GRIDCONTROL_HXX_ + +protected: + // VCLXWindow + virtual void SetWindow( Window* pWindow ); + +private: + void impl_updateColumnsFromModel_nothrow(); + void impl_checkTableModelInit(); +}; +#endif // _SVT_GRIDCONTROL_HXX_ diff --git a/svtools/source/uno/treecontrolpeer.cxx b/svtools/source/uno/treecontrolpeer.cxx index d6809635e5e5..c36368023a22 100644 --- a/svtools/source/uno/treecontrolpeer.cxx +++ b/svtools/source/uno/treecontrolpeer.cxx @@ -1360,7 +1360,7 @@ void TreeControlPeer::setProperty( const ::rtl::OUString& PropertyName, const An case BASEPROPERTY_TREE_DATAMODEL: onChangeDataModel( rTree, Reference< XTreeDataModel >( aValue, UNO_QUERY ) ); break; - case BASEPROPERTY_TREE_ROWHEIGHT: + case BASEPROPERTY_ROW_HEIGHT: { sal_Int32 nHeight = 0; if( aValue >>= nHeight ) @@ -1445,7 +1445,7 @@ Any TreeControlPeer::getProperty( const ::rtl::OUString& PropertyName ) throw(Ru } return Any( eSelectionType ); } - case BASEPROPERTY_TREE_ROWHEIGHT: + case BASEPROPERTY_ROW_HEIGHT: return Any( (sal_Int32)rTree.GetEntryHeight() ); case BASEPROPERTY_TREE_DATAMODEL: return Any( mxDataModel ); diff --git a/svtools/source/uno/unocontroltablemodel.cxx b/svtools/source/uno/unocontroltablemodel.cxx index d239ee3c740d..933363115810 100644 --- a/svtools/source/uno/unocontroltablemodel.cxx +++ b/svtools/source/uno/unocontroltablemodel.cxx @@ -28,486 +28,866 @@ #include "precompiled_svtools.hxx" #include "unocontroltablemodel.hxx" -#include <com/sun/star/view/SelectionType.hpp> -#include "svtools/table/gridtablerenderer.hxx" +#include "unogridcolumnfacade.hxx" + #include "svtools/table/defaultinputhandler.hxx" +#include "svtools/table/gridtablerenderer.hxx" #include "svtools/table/tablecontrol.hxx" -#include <comphelper/sequence.hxx> -#include <rtl/ref.hxx> -#include <tools/debug.hxx> -#include <toolkit/helper/property.hxx> -#include <comphelper/processfactory.hxx> + +/** === begin UNO includes === **/ #include <com/sun/star/awt/grid/XGridColumn.hpp> +#include <com/sun/star/view/SelectionType.hpp> +#include <com/sun/star/awt/grid/XGridColumnListener.hpp> +#include <com/sun/star/awt/grid/XSortableGridData.hpp> +/** === end UNO includes === **/ -using ::rtl::OUString; -using namespace ::svt::table; -using namespace ::com::sun::star::uno; +#include <comphelper/stlunosequence.hxx> +#include <cppuhelper/weakref.hxx> +#include <tools/debug.hxx> +#include <tools/diagnose_ex.h> +#include <vcl/svapp.hxx> +#include <vos/mutex.hxx> + +// ..................................................................................................................... +namespace svt { namespace table +{ +// ..................................................................................................................... + + /** === begin UNO using === **/ + using ::com::sun::star::uno::Reference; + using ::com::sun::star::uno::RuntimeException; + using ::com::sun::star::uno::Sequence; + using ::com::sun::star::uno::UNO_QUERY_THROW; + using ::com::sun::star::uno::UNO_QUERY; + using ::com::sun::star::awt::grid::XGridColumn; + using ::com::sun::star::uno::XInterface; + using ::com::sun::star::uno::Exception; + using ::com::sun::star::awt::grid::XGridColumnListener; + using ::com::sun::star::lang::EventObject; + using ::com::sun::star::awt::grid::GridColumnEvent; + using ::com::sun::star::awt::grid::XGridDataModel; + using ::com::sun::star::awt::grid::XGridColumnModel; + using ::com::sun::star::uno::Any; + using ::com::sun::star::style::HorizontalAlignment_LEFT; + using ::com::sun::star::style::HorizontalAlignment; + using ::com::sun::star::style::VerticalAlignment_TOP; + using ::com::sun::star::style::VerticalAlignment; + using ::com::sun::star::uno::WeakReference; + using ::com::sun::star::awt::grid::GridDataEvent; + using ::com::sun::star::awt::grid::XSortableGridData; + using ::com::sun::star::beans::Pair; + /** === end UNO using === **/ + + //================================================================================================================== + //= UnoControlTableModel_Impl + //================================================================================================================== + typedef ::std::vector< PTableModelListener > ModellListeners; + typedef ::std::vector< PColumnModel > ColumnModels; + struct UnoControlTableModel_Impl + { + ColumnModels aColumns; + bool bHasColumnHeaders; + bool bHasRowHeaders; + ScrollbarVisibility eVScrollMode; + ScrollbarVisibility eHScrollMode; + PTableRenderer pRenderer; + PTableInputHandler pInputHandler; + TableMetrics nRowHeight; + TableMetrics nColumnHeaderHeight; + TableMetrics nRowHeaderWidth; + ::boost::optional< ::Color > m_aGridLineColor; + ::boost::optional< ::Color > m_aHeaderBackgroundColor; + ::boost::optional< ::Color > m_aHeaderTextColor; + ::boost::optional< ::Color > m_aTextColor; + ::boost::optional< ::Color > m_aTextLineColor; + ::boost::optional< ::std::vector< ::Color > > m_aRowColors; + VerticalAlignment m_eVerticalAlign; + ModellListeners m_aListeners; + WeakReference< XGridDataModel > m_aDataModel; + WeakReference< XGridColumnModel > m_aColumnModel; + UnoControlTableModel_Impl() + :aColumns ( ) + ,bHasColumnHeaders ( true ) + ,bHasRowHeaders ( false ) + ,eVScrollMode ( ScrollbarShowNever ) + ,eHScrollMode ( ScrollbarShowNever ) + ,pRenderer ( ) + ,pInputHandler ( ) + ,nRowHeight ( 10 ) + ,nColumnHeaderHeight ( 10 ) + ,nRowHeaderWidth ( 10 ) + ,m_aGridLineColor ( ) + ,m_aHeaderBackgroundColor ( ) + ,m_aHeaderTextColor ( ) + ,m_aTextColor ( ) + ,m_aTextLineColor ( ) + ,m_aRowColors ( ) + ,m_eVerticalAlign ( VerticalAlignment_TOP ) + { + } + }; - //-------------------------------------------------------------------- - UnoControlTableColumn::UnoControlTableColumn(Reference<XGridColumn> m_xGridColumn) - :m_nID( 0 ) - ,m_sName() - ,m_bIsResizable( true ) - ,m_nWidth( 4 ) - ,m_nMinWidth( 0 ) - ,m_nMaxWidth( 0 ) - ,m_nPrefWidth ( 0 ) - ,m_xHorizontalAlign(com::sun::star::style::HorizontalAlignment(0)) - { - m_sName = m_xGridColumn->getTitle(); - } - //-------------------------------------------------------------------- - UnoControlTableColumn::UnoControlTableColumn() - :m_nID( 0 ) - ,m_sName() - ,m_bIsResizable( true ) - ,m_nWidth( 4 ) - ,m_nMinWidth( 0 ) - ,m_nMaxWidth( 0 ) - ,m_nPrefWidth ( 0 ) - ,m_xHorizontalAlign(com::sun::star::style::HorizontalAlignment(0)) + //================================================================================================================== + //= UnoControlTableModel + //================================================================================================================== +#ifdef DBG_UTIL + const char* UnoControlTableModel_checkInvariants( const void* _pInstance ) { + return static_cast< const UnoControlTableModel* >( _pInstance )->checkInvariants(); } - //-------------------------------------------------------------------- - ColumnID UnoControlTableColumn::getID() const + //------------------------------------------------------------------------------------------------------------------ + const char* UnoControlTableModel::checkInvariants() const { - return m_nID; - } + Reference< XGridDataModel > const xDataModel( m_pImpl->m_aDataModel ); + if ( !xDataModel.is() ) + return "data model anymore"; - //-------------------------------------------------------------------- - bool UnoControlTableColumn::setID( const ColumnID _nID ) - { - m_nID = _nID; - return true; - } + // TODO: more? - //-------------------------------------------------------------------- - String UnoControlTableColumn::getName() const - { - return m_sName; + return NULL; } +#endif - //-------------------------------------------------------------------- - void UnoControlTableColumn::setName( const String& _rName ) +#define DBG_CHECK_ME() \ + DBG_TESTSOLARMUTEX(); \ + DBG_CHKTHIS( UnoControlTableModel, UnoControlTableModel_checkInvariants ) + + //------------------------------------------------------------------------------------------------------------------ + DBG_NAME( UnoControlTableModel ) + UnoControlTableModel::UnoControlTableModel() + :m_pImpl( new UnoControlTableModel_Impl ) { - m_sName = _rName; + DBG_CTOR( UnoControlTableModel, UnoControlTableModel_checkInvariants ); + m_pImpl->bHasColumnHeaders = true; + m_pImpl->bHasRowHeaders = false; + m_pImpl->pRenderer.reset( new GridTableRenderer( *this ) ); + m_pImpl->pInputHandler.reset( new DefaultInputHandler ); } - //-------------------------------------------------------------------- - bool UnoControlTableColumn::isResizable() const + + //------------------------------------------------------------------------------------------------------------------ + UnoControlTableModel::~UnoControlTableModel() { - return m_bIsResizable; + DBG_DTOR( UnoControlTableModel, UnoControlTableModel_checkInvariants ); + DELETEZ( m_pImpl ); } - //-------------------------------------------------------------------- - void UnoControlTableColumn::setResizable( bool _bResizable ) + //------------------------------------------------------------------------------------------------------------------ + TableSize UnoControlTableModel::getColumnCount() const { - m_bIsResizable = _bResizable; + DBG_CHECK_ME(); + return (TableSize)m_pImpl->aColumns.size(); } - //-------------------------------------------------------------------- - TableMetrics UnoControlTableColumn::getWidth() const + //------------------------------------------------------------------------------------------------------------------ + TableSize UnoControlTableModel::getRowCount() const { - return m_nWidth; + DBG_CHECK_ME(); + + TableSize nRowCount = 0; + try + { + Reference< XGridDataModel > const xDataModel( m_pImpl->m_aDataModel ); + ENSURE_OR_THROW( xDataModel.is(), "no data model anymore!" ); + nRowCount = xDataModel->getRowCount(); + } + catch( const Exception& ) + { + DBG_UNHANDLED_EXCEPTION(); + } + return nRowCount; } - //-------------------------------------------------------------------- - void UnoControlTableColumn::setWidth( TableMetrics _nWidth ) + //------------------------------------------------------------------------------------------------------------------ + bool UnoControlTableModel::hasColumnHeaders() const { - m_nWidth = _nWidth; + DBG_CHECK_ME(); + return m_pImpl->bHasColumnHeaders; } - //-------------------------------------------------------------------- - TableMetrics UnoControlTableColumn::getMinWidth() const + //------------------------------------------------------------------------------------------------------------------ + bool UnoControlTableModel::hasRowHeaders() const { - return m_nMinWidth; + DBG_CHECK_ME(); + return m_pImpl->bHasRowHeaders; } - //-------------------------------------------------------------------- - void UnoControlTableColumn::setMinWidth( TableMetrics _nMinWidth ) + //------------------------------------------------------------------------------------------------------------------ + void UnoControlTableModel::setRowHeaders(bool _bRowHeaders) { - m_nMinWidth = _nMinWidth; + DBG_CHECK_ME(); + if ( m_pImpl->bHasRowHeaders == _bRowHeaders ) + return; + + m_pImpl->bHasRowHeaders = _bRowHeaders; + impl_notifyTableMetricsChanged(); } - //-------------------------------------------------------------------- - TableMetrics UnoControlTableColumn::getMaxWidth() const + //------------------------------------------------------------------------------------------------------------------ + void UnoControlTableModel::setColumnHeaders(bool _bColumnHeaders) { - return m_nMaxWidth; + DBG_CHECK_ME(); + if ( m_pImpl->bHasColumnHeaders == _bColumnHeaders ) + return; + + m_pImpl->bHasColumnHeaders = _bColumnHeaders; + impl_notifyTableMetricsChanged(); } - //-------------------------------------------------------------------- - void UnoControlTableColumn::setMaxWidth( TableMetrics _nMaxWidth ) + //------------------------------------------------------------------------------------------------------------------ + bool UnoControlTableModel::isCellEditable( ColPos col, RowPos row ) const { - m_nMaxWidth = _nMaxWidth; + DBG_CHECK_ME(); + (void)col; + (void)row; + return false; } - //-------------------------------------------------------------------- - TableMetrics UnoControlTableColumn::getPreferredWidth() const + + //------------------------------------------------------------------------------------------------------------------ + PColumnModel UnoControlTableModel::getColumnModel( ColPos column ) { - return m_nPrefWidth; + DBG_CHECK_ME(); + ENSURE_OR_RETURN( ( column >= 0 ) && ( column < getColumnCount() ), + "DefaultTableModel::getColumnModel: invalid index!", PColumnModel() ); + return m_pImpl->aColumns[ column ]; } - //-------------------------------------------------------------------- - void UnoControlTableColumn::setPreferredWidth( TableMetrics _nPrefWidth ) + //------------------------------------------------------------------------------------------------------------------ + void UnoControlTableModel::appendColumn( Reference< XGridColumn > const & i_column ) { - m_nPrefWidth = _nPrefWidth; + DBG_CHECK_ME(); + insertColumn( m_pImpl->aColumns.size(), i_column ); } - //-------------------------------------------------------------------- - ::com::sun::star::style::HorizontalAlignment UnoControlTableColumn::getHorizontalAlign() + + //------------------------------------------------------------------------------------------------------------------ + void UnoControlTableModel::insertColumn( ColPos const i_position, Reference< XGridColumn > const & i_column ) { - return m_xHorizontalAlign; + DBG_CHECK_ME(); + ENSURE_OR_RETURN_VOID( ( i_position >= 0 ) && ( size_t( i_position ) <= m_pImpl->aColumns.size() ), + "UnoControlTableModel::insertColumn: illegal position!" ); + + const PColumnModel pColumn( new UnoGridColumnFacade( *this, i_column ) ); + m_pImpl->aColumns.insert( m_pImpl->aColumns.begin() + i_position, pColumn ); + + // notify listeners + ModellListeners aListeners( m_pImpl->m_aListeners ); + for ( ModellListeners::const_iterator loop = aListeners.begin(); + loop != aListeners.end(); + ++loop + ) + { + (*loop)->columnInserted( i_position ); + } } - //-------------------------------------------------------------------- - void UnoControlTableColumn::setHorizontalAlign( com::sun::star::style::HorizontalAlignment _align ) + //------------------------------------------------------------------------------------------------------------------ + void UnoControlTableModel::removeColumn( ColPos const i_position ) { - m_xHorizontalAlign = _align; + DBG_CHECK_ME(); + ENSURE_OR_RETURN_VOID( ( i_position >= 0 ) && ( size_t( i_position ) <= m_pImpl->aColumns.size() ), + "UnoControlTableModel::removeColumn: illegal position!" ); + + // remove the column + ColumnModels::iterator pos = m_pImpl->aColumns.begin() + i_position; + const PColumnModel pColumn = *pos; + m_pImpl->aColumns.erase( pos ); + + // notify listeners + ModellListeners aListeners( m_pImpl->m_aListeners ); + for ( ModellListeners::const_iterator loop = aListeners.begin(); + loop != aListeners.end(); + ++loop + ) + { + (*loop)->columnRemoved( i_position ); + } + + // dispose the column + UnoGridColumnFacade* pColumnImpl = dynamic_cast< UnoGridColumnFacade* >( pColumn.get() ); + OSL_ENSURE( pColumnImpl != NULL, "UnoControlTableModel::removeColumn: illegal column implementation!" ); + if ( pColumnImpl ) + pColumnImpl->dispose(); } - //==================================================================== - //= DefaultTableModel_Impl - //==================================================================== - struct UnoControlTableModel_Impl + //------------------------------------------------------------------------------------------------------------------ + void UnoControlTableModel::removeAllColumns() { - ::std::vector< PColumnModel > aColumns; - TableSize nRowCount; - bool bHasColumnHeaders; - bool bHasRowHeaders; - bool bVScroll; - bool bHScroll; - PTableRenderer pRenderer; - PTableInputHandler pInputHandler; - TableMetrics nRowHeight; - TableMetrics nColumnHeaderHeight; - TableMetrics nRowHeaderWidth; - std::vector<rtl::OUString> aRowHeadersTitle; - std::vector<std::vector< Any > > aCellContent; - ::com::sun::star::util::Color m_xLineColor; - ::com::sun::star::util::Color m_xHeaderColor; - ::com::sun::star::util::Color m_xTextColor; - ::com::sun::star::util::Color m_xRowColor1; - ::com::sun::star::util::Color m_xRowColor2; - ::com::sun::star::style::VerticalAlignment m_xVerticalAlign; + DBG_CHECK_ME(); + if ( m_pImpl->aColumns.empty() ) + return; - UnoControlTableModel_Impl() - :aColumns ( ) - ,nRowCount ( 0 ) - ,bHasColumnHeaders ( false ) - ,bHasRowHeaders ( false ) - ,bVScroll ( false ) - ,bHScroll ( false ) - ,pRenderer ( ) - ,pInputHandler ( ) - ,nRowHeight ( 0 ) - ,nColumnHeaderHeight( 0 ) - ,nRowHeaderWidth ( 10 ) - ,aRowHeadersTitle ( ) - ,aCellContent ( ) - ,m_xLineColor ( 0xFFFFFF ) - ,m_xHeaderColor ( 0xFFFFFF ) - ,m_xTextColor ( 0 )//black as default - ,m_xRowColor1 ( 0xFFFFFF ) - ,m_xRowColor2 ( 0xFFFFFF ) - ,m_xVerticalAlign (com::sun::star::style::VerticalAlignment(0)) + // dispose the column instances + for ( ColumnModels::const_iterator col = m_pImpl->aColumns.begin(); + col != m_pImpl->aColumns.end(); + ++col + ) { + UnoGridColumnFacade* pColumn = dynamic_cast< UnoGridColumnFacade* >( col->get() ); + ENSURE_OR_CONTINUE( pColumn != NULL, "UnoControlTableModel::removeAllColumns: illegal column implementation!" ); + pColumn->dispose(); } - }; + m_pImpl->aColumns.clear(); + + // notify listeners + ModellListeners aListeners( m_pImpl->m_aListeners ); + for ( ModellListeners::const_iterator loop = aListeners.begin(); + loop != aListeners.end(); + ++loop + ) + { + (*loop)->allColumnsRemoved(); + } + } - //==================================================================== - //= UnoControlTableModel - //==================================================================== - //-------------------------------------------------------------------- - UnoControlTableModel::UnoControlTableModel() - :m_pImpl( new UnoControlTableModel_Impl ) + //------------------------------------------------------------------------------------------------------------------ + void UnoControlTableModel::impl_notifyTableMetricsChanged() const { - m_pImpl->bHasColumnHeaders = false; - m_pImpl->bHasRowHeaders = false; - m_pImpl->pRenderer.reset( new GridTableRenderer( *this ) ); - m_pImpl->pInputHandler.reset( new DefaultInputHandler ); + ModellListeners aListeners( m_pImpl->m_aListeners ); + for ( ModellListeners::const_iterator loop = aListeners.begin(); + loop != aListeners.end(); + ++loop + ) + { + (*loop)->tableMetricsChanged(); + } } - //-------------------------------------------------------------------- - UnoControlTableModel::~UnoControlTableModel() + //------------------------------------------------------------------------------------------------------------------ + PTableRenderer UnoControlTableModel::getRenderer() const { - DELETEZ( m_pImpl ); + DBG_CHECK_ME(); + return m_pImpl->pRenderer; } - //-------------------------------------------------------------------- - TableSize UnoControlTableModel::getColumnCount() const + //------------------------------------------------------------------------------------------------------------------ + PTableInputHandler UnoControlTableModel::getInputHandler() const { - return (TableSize)m_pImpl->aColumns.size(); + DBG_CHECK_ME(); + return m_pImpl->pInputHandler; } - //-------------------------------------------------------------------- - TableSize UnoControlTableModel::getRowCount() const + //------------------------------------------------------------------------------------------------------------------ + TableMetrics UnoControlTableModel::getRowHeight() const { - return m_pImpl->nRowCount; + DBG_CHECK_ME(); + return m_pImpl->nRowHeight; } - //-------------------------------------------------------------------- - bool UnoControlTableModel::hasColumnHeaders() const + //------------------------------------------------------------------------------------------------------------------ + void UnoControlTableModel::setRowHeight(TableMetrics _nRowHeight) { - return m_pImpl->bHasColumnHeaders; + DBG_CHECK_ME(); + if ( m_pImpl->nRowHeight == _nRowHeight ) + return; + + m_pImpl->nRowHeight = _nRowHeight; + impl_notifyTableMetricsChanged(); } - //-------------------------------------------------------------------- - bool UnoControlTableModel::hasRowHeaders() const + //------------------------------------------------------------------------------------------------------------------ + TableMetrics UnoControlTableModel::getColumnHeaderHeight() const { - return m_pImpl->bHasRowHeaders; + DBG_CHECK_ME(); + DBG_ASSERT( hasColumnHeaders(), "DefaultTableModel::getColumnHeaderHeight: invalid call!" ); + return m_pImpl->nColumnHeaderHeight; } - //-------------------------------------------------------------------- - void UnoControlTableModel::setRowHeaders(bool _bRowHeaders) + //------------------------------------------------------------------------------------------------------------------ + TableMetrics UnoControlTableModel::getRowHeaderWidth() const { - m_pImpl->bHasRowHeaders = _bRowHeaders; + DBG_CHECK_ME(); + DBG_ASSERT( hasRowHeaders(), "DefaultTableModel::getRowHeaderWidth: invalid call!" ); + return m_pImpl->nRowHeaderWidth; } - //-------------------------------------------------------------------- - void UnoControlTableModel::setColumnHeaders(bool _bColumnHeaders) + //------------------------------------------------------------------------------------------------------------------ + void UnoControlTableModel::setColumnHeaderHeight(TableMetrics _nHeight) { - m_pImpl->bHasColumnHeaders = _bColumnHeaders; + DBG_CHECK_ME(); + if ( m_pImpl->nColumnHeaderHeight == _nHeight ) + return; + + m_pImpl->nColumnHeaderHeight = _nHeight; + impl_notifyTableMetricsChanged(); } - void UnoControlTableModel::setColumnCount(TableSize _nColCount) + //------------------------------------------------------------------------------------------------------------------ + void UnoControlTableModel::setRowHeaderWidth(TableMetrics _nWidth) { - m_pImpl->aColumns.resize( _nColCount); + DBG_CHECK_ME(); + if ( m_pImpl->nRowHeaderWidth == _nWidth ) + return; + + m_pImpl->nRowHeaderWidth = _nWidth; + impl_notifyTableMetricsChanged(); } - //-------------------------------------------------------------------- - void UnoControlTableModel::setRowCount(TableSize _nRowCount) + + //------------------------------------------------------------------------------------------------------------------ + ScrollbarVisibility UnoControlTableModel::getVerticalScrollbarVisibility() const { - m_pImpl->nRowCount = _nRowCount; + DBG_CHECK_ME(); + return m_pImpl->eVScrollMode; } - //-------------------------------------------------------------------- - bool UnoControlTableModel::isCellEditable( ColPos col, RowPos row ) const + + //------------------------------------------------------------------------------------------------------------------ + ScrollbarVisibility UnoControlTableModel::getHorizontalScrollbarVisibility() const { - (void)col; - (void)row; - return false; + DBG_CHECK_ME(); + return m_pImpl->eHScrollMode; } - //-------------------------------------------------------------------- - void UnoControlTableModel::addTableModelListener( const PTableModelListener& listener ) + //------------------------------------------------------------------------------------------------------------------ + void UnoControlTableModel::addTableModelListener( const PTableModelListener& i_listener ) { - (void) listener; - // TODO - DBG_ERROR( "DefaultTableModel::addTableModelListener: not yet implemented!" ); + DBG_CHECK_ME(); + ENSURE_OR_RETURN_VOID( !!i_listener, "illegal NULL listener" ); + m_pImpl->m_aListeners.push_back( i_listener ); } - //-------------------------------------------------------------------- - void UnoControlTableModel::removeTableModelListener( const PTableModelListener& listener ) + //------------------------------------------------------------------------------------------------------------------ + void UnoControlTableModel::removeTableModelListener( const PTableModelListener& i_listener ) { - (void)listener; - // TODO - DBG_ERROR( "DefaultTableModel::removeTableModelListener: not yet implemented!" ); + DBG_CHECK_ME(); + for ( ModellListeners::iterator lookup = m_pImpl->m_aListeners.begin(); + lookup != m_pImpl->m_aListeners.end(); + ++lookup + ) + { + if ( *lookup == i_listener ) + { + m_pImpl->m_aListeners.erase( lookup ); + return; + } + } + OSL_ENSURE( false, "UnoControlTableModel::removeTableModelListener: listener is not registered - sure you're doing the right thing here?" ); } - //-------------------------------------------------------------------- - PColumnModel UnoControlTableModel::getColumnModel( ColPos column ) + //------------------------------------------------------------------------------------------------------------------ + void UnoControlTableModel::setVerticalScrollbarVisibility( ScrollbarVisibility const i_visibility ) const { - DBG_ASSERT( ( column >= 0 ) && ( column < getColumnCount() ), - "DefaultTableModel::getColumnModel: invalid index!" ); - return m_pImpl->aColumns[ column ]; + DBG_CHECK_ME(); + m_pImpl->eVScrollMode = i_visibility; } - //-------------------------------------------------------------------- - std::vector<PColumnModel>& UnoControlTableModel::getColumnModel() + //------------------------------------------------------------------------------------------------------------------ + void UnoControlTableModel::setHorizontalScrollbarVisibility( ScrollbarVisibility const i_visibility ) const { - return m_pImpl->aColumns; + DBG_CHECK_ME(); + m_pImpl->eHScrollMode = i_visibility; } - //-------------------------------------------------------------------- - PColumnModel UnoControlTableModel::getColumnModelByID( ColumnID id ) + + //------------------------------------------------------------------------------------------------------------------ + void UnoControlTableModel::setDataModel( Reference< XGridDataModel > const & i_gridDataModel ) { - (void)id; - // TODO - DBG_ERROR( "DefaultTableModel::getColumnModelByID: not yet implemented!" ); - return PColumnModel(); + DBG_CHECK_ME(); + m_pImpl->m_aDataModel = i_gridDataModel; + // TODO: register as listener, so we're notified of row/data changes, and can multiplex them to our + // own listeners } - //-------------------------------------------------------------------- - PTableRenderer UnoControlTableModel::getRenderer() const + //------------------------------------------------------------------------------------------------------------------ + Reference< XGridDataModel > UnoControlTableModel::getDataModel() const { - return m_pImpl->pRenderer; + Reference< XGridDataModel > const xDataModel( m_pImpl->m_aDataModel ); + return xDataModel; } - //-------------------------------------------------------------------- - PTableInputHandler UnoControlTableModel::getInputHandler() const + //------------------------------------------------------------------------------------------------------------------ + bool UnoControlTableModel::hasDataModel() const { - return m_pImpl->pInputHandler; + return getDataModel().is(); } - //-------------------------------------------------------------------- - TableMetrics UnoControlTableModel::getRowHeight() const + //------------------------------------------------------------------------------------------------------------------ + void UnoControlTableModel::setColumnModel( Reference< XGridColumnModel > const & i_gridColumnModel ) { - return m_pImpl->nRowHeight; + DBG_CHECK_ME(); + m_pImpl->m_aColumnModel = i_gridColumnModel; } - //-------------------------------------------------------------------- - void UnoControlTableModel::setRowHeight(TableMetrics _nRowHeight) + + //------------------------------------------------------------------------------------------------------------------ + Reference< XGridColumnModel > UnoControlTableModel::getColumnModel() const { - m_pImpl->nRowHeight = _nRowHeight; + Reference< XGridColumnModel > const xColumnModel( m_pImpl->m_aColumnModel ); + return xColumnModel; } - //-------------------------------------------------------------------- - TableMetrics UnoControlTableModel::getColumnHeaderHeight() const + //------------------------------------------------------------------------------------------------------------------ + bool UnoControlTableModel::hasColumnModel() const { - DBG_ASSERT( hasColumnHeaders(), "DefaultTableModel::getColumnHeaderHeight: invalid call!" ); - return m_pImpl->nColumnHeaderHeight; + return getColumnModel().is(); } - //-------------------------------------------------------------------- - TableMetrics UnoControlTableModel::getRowHeaderWidth() const + //------------------------------------------------------------------------------------------------------------------ + void UnoControlTableModel::getCellContent( ColPos const i_col, RowPos const i_row, Any& o_cellContent ) { - DBG_ASSERT( hasRowHeaders(), "DefaultTableModel::getRowHeaderWidth: invalid call!" ); - return m_pImpl->nRowHeaderWidth; + DBG_CHECK_ME(); + + o_cellContent.clear(); + try + { + Reference< XGridDataModel > const xDataModel( m_pImpl->m_aDataModel ); + ENSURE_OR_RETURN_VOID( xDataModel.is(), "UnoControlTableModel::getCellContent: no data model anymore!" ); + + PColumnModel const pColumn = getColumnModel( i_col ); + UnoGridColumnFacade* pColumnImpl = dynamic_cast< UnoGridColumnFacade* >( pColumn.get() ); + ENSURE_OR_RETURN_VOID( pColumnImpl != NULL, "UnoControlTableModel::getCellContent: no (valid) column at this position!" ); + sal_Int32 const nDataColumnIndex = pColumnImpl->getDataColumnIndex() >= 0 ? pColumnImpl->getDataColumnIndex() : i_col; + + if ( nDataColumnIndex >= xDataModel->getColumnCount() ) + { + // this is allowed, in case the column model has been dynamically extended, but the data model does + // not (yet?) know about it. + // So, handle it gracefully. + #if OSL_DEBUG_LEVEL > 0 + { + Reference< XGridColumnModel > const xColumnModel( m_pImpl->m_aColumnModel ); + OSL_ENSURE( xColumnModel.is() && i_col < xColumnModel->getColumnCount(), + "UnoControlTableModel::getCellContent: request a column's value which the ColumnModel doesn't know about!" ); + } + #endif + } + else + { + o_cellContent = xDataModel->getCellData( nDataColumnIndex, i_row ); + } + } + catch( const Exception& ) + { + DBG_UNHANDLED_EXCEPTION(); + } } - //-------------------------------------------------------------------- - void UnoControlTableModel::setColumnHeaderHeight(TableMetrics _nHeight) + + //------------------------------------------------------------------------------------------------------------------ + void UnoControlTableModel::getCellToolTip( ColPos const i_col, RowPos const i_row, Any& o_cellToolTip ) { - m_pImpl->nColumnHeaderHeight = _nHeight; + DBG_CHECK_ME(); + try + { + Reference< XGridDataModel > const xDataModel( m_pImpl->m_aDataModel ); + ENSURE_OR_THROW( xDataModel.is(), "no data model anymore!" ); + + o_cellToolTip = xDataModel->getCellToolTip( i_col, i_row ); + } + catch( const Exception& ) + { + DBG_UNHANDLED_EXCEPTION(); + } } - //-------------------------------------------------------------------- - void UnoControlTableModel::setRowHeaderWidth(TableMetrics _nWidth) + //------------------------------------------------------------------------------------------------------------------ + Any UnoControlTableModel::getRowHeading( RowPos const i_rowPos ) const { - m_pImpl->nRowHeaderWidth = _nWidth; + DBG_CHECK_ME(); + + Any aRowHeading; + + Reference< XGridDataModel > const xDataModel( m_pImpl->m_aDataModel ); + ENSURE_OR_RETURN( xDataModel.is(), "UnoControlTableModel::getRowHeading: no data model anymore!", aRowHeading ); + + try + { + aRowHeading = xDataModel->getRowHeading( i_rowPos ); + } + catch( const Exception& ) + { + DBG_UNHANDLED_EXCEPTION(); + } + return aRowHeading; } - //-------------------------------------------------------------------- - void UnoControlTableModel::SetTitleHeight( TableMetrics _nHeight ) + //------------------------------------------------------------------------------------------------------------------ + namespace { - DBG_ASSERT( _nHeight > 0, "DefaultTableModel::SetTitleHeight: invalid height value!" ); - m_pImpl->nColumnHeaderHeight = _nHeight; - // TODO: notification + void lcl_setColor( Any const & i_color, ::boost::optional< ::Color > & o_convertedColor ) + { + if ( !i_color.hasValue() ) + o_convertedColor.reset(); + else + { + sal_Int32 nColor = COL_TRANSPARENT; + if ( i_color >>= nColor ) + { + o_convertedColor.reset( ::Color( nColor ) ); + } + else + { + OSL_ENSURE( false, "lcl_setColor: could not extract color value!" ); + } + } + } } - //-------------------------------------------------------------------- - void UnoControlTableModel::SetHandleWidth( TableMetrics _nWidth ) + //------------------------------------------------------------------------------------------------------------------ + ::boost::optional< ::Color > UnoControlTableModel::getLineColor() const { - DBG_ASSERT( _nWidth > 0, "DefaultTableModel::SetHandleWidth: invalid width value!" ); - m_pImpl->nRowHeaderWidth = _nWidth; - // TODO: notification + DBG_CHECK_ME(); + return m_pImpl->m_aGridLineColor; } - //-------------------------------------------------------------------- - ScrollbarVisibility UnoControlTableModel::getVerticalScrollbarVisibility(int overAllHeight, int actHeight) const + //------------------------------------------------------------------------------------------------------------------ + void UnoControlTableModel::setLineColor( Any const & i_color ) { - if(overAllHeight>=actHeight && !m_pImpl->bVScroll) - return ScrollbarShowNever; - else - return ScrollbarShowAlways; + DBG_CHECK_ME(); + lcl_setColor( i_color, m_pImpl->m_aGridLineColor ); } - //-------------------------------------------------------------------- - ScrollbarVisibility UnoControlTableModel::getHorizontalScrollbarVisibility(int overAllWidth, int actWidth) const + //------------------------------------------------------------------------------------------------------------------ + ::boost::optional< ::Color > UnoControlTableModel::getHeaderBackgroundColor() const { - if(overAllWidth>=actWidth && !m_pImpl->bHScroll) - return ScrollbarShowNever; - else - return ScrollbarShowAlways; + DBG_CHECK_ME(); + return m_pImpl->m_aHeaderBackgroundColor; } - //-------------------------------------------------------------------- - void UnoControlTableModel::setVerticalScrollbarVisibility(bool _bVScroll) const + + //------------------------------------------------------------------------------------------------------------------ + void UnoControlTableModel::setHeaderBackgroundColor( Any const & i_color ) { - m_pImpl->bVScroll = _bVScroll; + DBG_CHECK_ME(); + lcl_setColor( i_color, m_pImpl->m_aHeaderBackgroundColor ); } - //-------------------------------------------------------------------- - void UnoControlTableModel::setHorizontalScrollbarVisibility(bool _bHScroll) const + //------------------------------------------------------------------------------------------------------------------ + ::boost::optional< ::Color > UnoControlTableModel::getHeaderTextColor() const { - m_pImpl->bHScroll = _bHScroll; + DBG_CHECK_ME(); + return m_pImpl->m_aHeaderTextColor; } - //-------------------------------------------------------------------- - bool UnoControlTableModel::hasVerticalScrollbar() + + //------------------------------------------------------------------------------------------------------------------ + void UnoControlTableModel::setHeaderTextColor( Any const & i_color ) { - return m_pImpl->bVScroll; + DBG_CHECK_ME(); + lcl_setColor( i_color, m_pImpl->m_aHeaderTextColor ); } - //-------------------------------------------------------------------- - bool UnoControlTableModel::hasHorizontalScrollbar() + + //------------------------------------------------------------------------------------------------------------------ + ::boost::optional< ::Color > UnoControlTableModel::getTextColor() const { - return m_pImpl->bHScroll; + DBG_CHECK_ME(); + return m_pImpl->m_aTextColor; } - //-------------------------------------------------------------------- - void UnoControlTableModel::setCellContent(const std::vector<std::vector< Any > >& cellContent) + + //------------------------------------------------------------------------------------------------------------------ + void UnoControlTableModel::setTextColor( Any const & i_color ) { - m_pImpl->aCellContent = cellContent; + DBG_CHECK_ME(); + lcl_setColor( i_color, m_pImpl->m_aTextColor ); } - std::vector<std::vector< Any > >& UnoControlTableModel::getCellContent() + //------------------------------------------------------------------------------------------------------------------ + ::boost::optional< ::Color > UnoControlTableModel::getTextLineColor() const { - return m_pImpl->aCellContent; + DBG_CHECK_ME(); + return m_pImpl->m_aTextColor; } - //-------------------------------------------------------------------- - void UnoControlTableModel::setRowHeaderName(const std::vector<rtl::OUString>& cellColumnContent) + + //------------------------------------------------------------------------------------------------------------------ + void UnoControlTableModel::setTextLineColor( Any const & i_color ) { - m_pImpl->aRowHeadersTitle = cellColumnContent; + DBG_CHECK_ME(); + lcl_setColor( i_color, m_pImpl->m_aTextLineColor ); } - std::vector<rtl::OUString>& UnoControlTableModel::getRowHeaderName() + //------------------------------------------------------------------------------------------------------------------ + ::boost::optional< ::std::vector< ::Color > > UnoControlTableModel::getRowBackgroundColors() const { - return m_pImpl->aRowHeadersTitle; + DBG_CHECK_ME(); + return m_pImpl->m_aRowColors; } - //-------------------------------------------------------------------- - ::com::sun::star::util::Color UnoControlTableModel::getLineColor() + + //------------------------------------------------------------------------------------------------------------------ + void UnoControlTableModel::setRowBackgroundColors( ::com::sun::star::uno::Any const & i_APIValue ) { - return m_pImpl->m_xLineColor; + DBG_CHECK_ME(); + Sequence< ::com::sun::star::util::Color > aAPIColors; + if ( !( i_APIValue >>= aAPIColors ) ) + m_pImpl->m_aRowColors.reset(); + else + { + ::std::vector< ::Color > aColors( aAPIColors.getLength() ); + for ( sal_Int32 i=0; i<aAPIColors.getLength(); ++i ) + { + aColors[i] = ::Color( aAPIColors[i] ); + } + m_pImpl->m_aRowColors.reset( aColors ); + } } - //-------------------------------------------------------------------- - void UnoControlTableModel::setLineColor( ::com::sun::star::util::Color _rColor ) + //------------------------------------------------------------------------------------------------------------------ + VerticalAlignment UnoControlTableModel::getVerticalAlign() const { - m_pImpl->m_xLineColor = _rColor; + DBG_CHECK_ME(); + return m_pImpl->m_eVerticalAlign; } - //-------------------------------------------------------------------- - ::com::sun::star::util::Color UnoControlTableModel::getHeaderBackgroundColor() + + //------------------------------------------------------------------------------------------------------------------ + void UnoControlTableModel::setVerticalAlign( VerticalAlignment _xAlign ) { - return m_pImpl->m_xHeaderColor; + DBG_CHECK_ME(); + m_pImpl->m_eVerticalAlign = _xAlign; } - //-------------------------------------------------------------------- - void UnoControlTableModel::setHeaderBackgroundColor( ::com::sun::star::util::Color _rColor ) + //------------------------------------------------------------------------------------------------------------------ + ColPos UnoControlTableModel::getColumnPos( UnoGridColumnFacade const & i_column ) const { - m_pImpl->m_xHeaderColor = _rColor; + DBG_CHECK_ME(); + for ( ColumnModels::const_iterator col = m_pImpl->aColumns.begin(); + col != m_pImpl->aColumns.end(); + ++col + ) + { + if ( &i_column == col->get() ) + return col - m_pImpl->aColumns.begin(); + } + OSL_ENSURE( false, "UnoControlTableModel::getColumnPos: column not found!" ); + return COL_INVALID; } - //-------------------------------------------------------------------- - ::com::sun::star::util::Color UnoControlTableModel::getTextColor() + + //------------------------------------------------------------------------------------------------------------------ + ITableDataSort* UnoControlTableModel::getSortAdapter() { - return m_pImpl->m_xTextColor; + DBG_CHECK_ME(); + + Reference< XSortableGridData > const xSortAccess( getDataModel(), UNO_QUERY ); + if ( xSortAccess.is() ) + return this; + return NULL; } - //-------------------------------------------------------------------- - void UnoControlTableModel::setTextColor( ::com::sun::star::util::Color _rColor ) + //------------------------------------------------------------------------------------------------------------------ + void UnoControlTableModel::sortByColumn( ColPos const i_column, ColumnSortDirection const i_sortDirection ) { - m_pImpl->m_xTextColor = _rColor; + DBG_CHECK_ME(); + + try + { + Reference< XSortableGridData > const xSortAccess( getDataModel(), UNO_QUERY_THROW ); + xSortAccess->sortByColumn( i_column, i_sortDirection == ColumnSortAscending ); + } + catch( const Exception& ) + { + DBG_UNHANDLED_EXCEPTION(); + } } - //-------------------------------------------------------------------- - ::com::sun::star::util::Color UnoControlTableModel::getOddRowBackgroundColor() + + //------------------------------------------------------------------------------------------------------------------ + ColumnSort UnoControlTableModel::getCurrentSortOrder() const { - return m_pImpl->m_xRowColor1; + DBG_CHECK_ME(); + + ColumnSort currentSort; + try + { + Reference< XSortableGridData > const xSortAccess( getDataModel(), UNO_QUERY_THROW ); + Pair< ::sal_Int32, ::sal_Bool > const aCurrentSortOrder( xSortAccess->getCurrentSortOrder() ); + currentSort.nColumnPos = aCurrentSortOrder.First; + currentSort.eSortDirection = aCurrentSortOrder.Second ? ColumnSortAscending : ColumnSortDescending; + } + catch( const Exception& ) + { + DBG_UNHANDLED_EXCEPTION(); + } + return currentSort; } //-------------------------------------------------------------------- - void UnoControlTableModel::setOddRowBackgroundColor( ::com::sun::star::util::Color _rColor ) + void UnoControlTableModel::notifyColumnChange( ColPos const i_columnPos, ColumnAttributeGroup const i_attributeGroup ) const { - m_pImpl->m_xRowColor1 = _rColor; + DBG_CHECK_ME(); + ENSURE_OR_RETURN_VOID( ( i_columnPos >= 0 ) && ( i_columnPos < getColumnCount() ), + "UnoControlTableModel::notifyColumnChange: invalid column index!" ); + + ModellListeners aListeners( m_pImpl->m_aListeners ); + for ( ModellListeners::const_iterator loop = aListeners.begin(); + loop != aListeners.end(); + ++loop + ) + { + (*loop)->columnChanged( i_columnPos, i_attributeGroup ); + } } - //-------------------------------------------------------------------- - ::com::sun::star::util::Color UnoControlTableModel::getEvenRowBackgroundColor() + + //------------------------------------------------------------------------------------------------------------------ + void UnoControlTableModel::notifyRowsInserted( GridDataEvent const & i_event ) const { - return m_pImpl->m_xRowColor2; + // check sanity of the event + ENSURE_OR_RETURN_VOID( i_event.FirstRow >= 0, "UnoControlTableModel::notifyRowsInserted: invalid first row!" ); + ENSURE_OR_RETURN_VOID( i_event.LastRow >= i_event.FirstRow, "UnoControlTableModel::notifyRowsInserted: invalid row indexes!" ); + + // check own sanity + Reference< XGridColumnModel > const xColumnModel( m_pImpl->m_aColumnModel ); + ENSURE_OR_RETURN_VOID( xColumnModel.is(), "UnoControlTableModel::notifyRowsInserted: no column model anymore!" ); + + Reference< XGridDataModel > const xDataModel( m_pImpl->m_aDataModel ); + ENSURE_OR_RETURN_VOID( xDataModel.is(), "UnoControlTableModel::notifyRowsInserted: no data model anymore!" ); + + // implicitly add columns to the column model + // TODO: is this really a good idea? + sal_Int32 const dataColumnCount = xDataModel->getColumnCount(); + OSL_ENSURE( dataColumnCount > 0, "UnoControlTableModel::notifyRowsInserted: no columns at all?" ); + + sal_Int32 const modelColumnCount = xColumnModel->getColumnCount(); + if ( ( modelColumnCount == 0 ) && ( dataColumnCount > 0 ) ) + { + // TODO: shouldn't we clear the mutexes guard for this call? + xColumnModel->setDefaultColumns( dataColumnCount ); + } + + // multiplex the event to our own listeners + ModellListeners aListeners( m_pImpl->m_aListeners ); + for ( ModellListeners::const_iterator loop = aListeners.begin(); + loop != aListeners.end(); + ++loop + ) + { + (*loop)->rowsInserted( i_event.FirstRow, i_event.LastRow ); + } } - //-------------------------------------------------------------------- - void UnoControlTableModel::setEvenRowBackgroundColor( ::com::sun::star::util::Color _rColor ) + //------------------------------------------------------------------------------------------------------------------ + void UnoControlTableModel::notifyRowsRemoved( GridDataEvent const & i_event ) const { - m_pImpl->m_xRowColor2 = _rColor; + ModellListeners aListeners( m_pImpl->m_aListeners ); + for ( ModellListeners::const_iterator loop = aListeners.begin(); + loop != aListeners.end(); + ++loop + ) + { + (*loop)->rowsRemoved( i_event.FirstRow, i_event.LastRow ); + } } - //-------------------------------------------------------------------- - ::com::sun::star::style::VerticalAlignment UnoControlTableModel::getVerticalAlign() + + //------------------------------------------------------------------------------------------------------------------ + void UnoControlTableModel::notifyDataChanged( ::com::sun::star::awt::grid::GridDataEvent const & i_event ) const { - return m_pImpl->m_xVerticalAlign; + ColPos const firstCol = i_event.FirstColumn == -1 ? 0 : i_event.FirstColumn; + ColPos const lastCol = i_event.FirstColumn == -1 ? getColumnCount() - 1 : i_event.LastColumn; + RowPos const firstRow = i_event.FirstRow == -1 ? 0 : i_event.FirstRow; + RowPos const lastRow = i_event.FirstRow == -1 ? getRowCount() - 1 : i_event.LastRow; + + ModellListeners aListeners( m_pImpl->m_aListeners ); + for ( ModellListeners::const_iterator loop = aListeners.begin(); + loop != aListeners.end(); + ++loop + ) + { + (*loop)->cellsUpdated( firstCol, lastCol, firstRow, lastRow ); + } } - //-------------------------------------------------------------------- - void UnoControlTableModel::setVerticalAlign( com::sun::star::style::VerticalAlignment _xAlign ) + //------------------------------------------------------------------------------------------------------------------ + void UnoControlTableModel::notifyAllDataChanged() const { - m_pImpl->m_xVerticalAlign = _xAlign; + ModellListeners aListeners( m_pImpl->m_aListeners ); + for ( ModellListeners::const_iterator loop = aListeners.begin(); + loop != aListeners.end(); + ++loop + ) + { + (*loop)->cellsUpdated( 0, getColumnCount() - 1, 0, getRowCount() - 1 ); + } } +// ..................................................................................................................... +} } // svt::table +// ..................................................................................................................... diff --git a/svtools/source/uno/unocontroltablemodel.hxx b/svtools/source/uno/unocontroltablemodel.hxx index c00642448f79..537c3d9a5249 100644 --- a/svtools/source/uno/unocontroltablemodel.hxx +++ b/svtools/source/uno/unocontroltablemodel.hxx @@ -28,67 +28,37 @@ #ifndef _UNOCONTROL_TABLEMODEL_HXX_ #define _UNOCONTROL_TABLEMODEL_HXX_ -#include <svtools/table/tablemodel.hxx> -#include <svtools/table/tablecontrol.hxx> +#include "svtools/table/tablemodel.hxx" +#include "svtools/table/tablecontrol.hxx" + +/** === begin UNO includes === **/ #include <com/sun/star/awt/grid/XGridControl.hpp> -#include <com/sun/star/awt/grid/XGridDataListener.hpp> #include <com/sun/star/awt/grid/GridDataEvent.hpp> #include <com/sun/star/awt/grid/XGridColumnModel.hpp> #include <com/sun/star/awt/grid/XGridDataModel.hpp> #include <com/sun/star/awt/grid/XGridSelectionListener.hpp> -#include <toolkit/awt/vclxwindow.hxx> -#include <toolkit/awt/vclxwindows.hxx> -#include <cppuhelper/typeprovider.hxx> -#include <cppuhelper/implbase2.hxx> #include <com/sun/star/awt/grid/XGridColumn.hpp> #include <com/sun/star/util/Color.hpp> #include <com/sun/star/style/VerticalAlignment.hpp> -#include <com/sun/star/style/HorizontalAlignment.hpp> +/** === end UNO includes === **/ +#include <cppuhelper/implbase2.hxx> +#include <rtl/ref.hxx> -using namespace ::svt::table; -using namespace ::com::sun::star::uno; -using namespace ::com::sun::star::awt::grid; +#include <boost/noncopyable.hpp> -class UnoControlTableColumn : public IColumnModel -{ - private: - ColumnID m_nID; - String m_sName; - bool m_bIsResizable; - TableMetrics m_nWidth; - TableMetrics m_nMinWidth; - TableMetrics m_nMaxWidth; - TableMetrics m_nPrefWidth; - ::com::sun::star::style::HorizontalAlignment m_xHorizontalAlign; - - public: - UnoControlTableColumn(Reference<XGridColumn>); - UnoControlTableColumn(); - - // IColumnModel overridables - virtual ColumnID getID() const; - virtual bool setID( const ColumnID _nID ); - virtual String getName() const; - virtual void setName( const String& _rName ); - virtual bool isResizable() const; - virtual void setResizable( bool _bResizable ); - virtual TableMetrics getWidth() const; - virtual void setWidth( TableMetrics _nWidth ); - virtual TableMetrics getMinWidth() const; - virtual void setMinWidth( TableMetrics _nMinWidth ); - virtual TableMetrics getMaxWidth() const; - virtual void setMaxWidth( TableMetrics _nMaxWidth ); - virtual TableMetrics getPreferredWidth() const; - virtual void setPreferredWidth( TableMetrics _nPrefWidth ); - virtual ::com::sun::star::style::HorizontalAlignment getHorizontalAlign(); - virtual void setHorizontalAlign(::com::sun::star::style::HorizontalAlignment _xAlign); -}; - -struct UnoControlTableModel_Impl; - -class UnoControlTableModel : public ITableModel +// ..................................................................................................................... +namespace svt { namespace table { +// ..................................................................................................................... + + //================================================================================================================== + //= UnoControlTableModel + //================================================================================================================== + class UnoGridColumnFacade; + struct UnoControlTableModel_Impl; + class UnoControlTableModel : public ITableModel, public ITableDataSort + { private: UnoControlTableModel_Impl* m_pImpl; @@ -96,82 +66,102 @@ class UnoControlTableModel : public ITableModel UnoControlTableModel(); ~UnoControlTableModel(); - /// returns the current row height, in 1/100 millimeters - inline TableMetrics GetRowHeight() const { return getRowHeight(); } - /// sets a new row height. - void setRowHeight( TableMetrics _nHeight ); - /// sets a new row header width. - void setRowHeaderWidth( TableMetrics _nWidth ); - /// sets a new column header height. - void setColumnHeaderHeight( TableMetrics _nHeight ); - - /// returns the height of the title row (containing the column headers) - inline TableMetrics GetTitleHeight() const { return getColumnHeaderHeight(); } - /// sets a new height for the title row (containing the column headers) - void SetTitleHeight( TableMetrics _nHeight ); - - /// returns the width of the handle column (containing the row headers) - inline TableMetrics GetHandleWidth() const { return getRowHeaderWidth(); } - /// sets a new width for the handle column (containing the row headers) - void SetHandleWidth( TableMetrics _nWidth ); - - /// sets the width of a column - inline void SetColumnWidth( ColPos _nColumn, TableMetrics _nWidth100thMM ); - /// retrieves the width of a column, in 1/100th millimeters - inline TableMetrics GetColumnWidth( ColPos _nColumn ); - public: // ITableModel overridables - virtual TableSize getColumnCount() const; - virtual TableSize getRowCount() const; - virtual void setColumnCount(TableSize _nColCount); - virtual void setRowCount(TableSize _nRowCount); - virtual bool hasColumnHeaders() const; - virtual bool hasRowHeaders() const; - virtual void setRowHeaders(bool _bRowHeaders); - virtual void setColumnHeaders(bool _bColumnHeaders); - virtual bool isCellEditable( ColPos col, RowPos row ) const; - virtual void addTableModelListener( const PTableModelListener& listener ); - virtual void removeTableModelListener( const PTableModelListener& listener ); - virtual PColumnModel getColumnModel( ColPos column ); - virtual std::vector<PColumnModel>& getColumnModel(); - virtual PColumnModel getColumnModelByID( ColumnID id ); - virtual PTableRenderer getRenderer() const; - virtual PTableInputHandler getInputHandler() const; - virtual TableMetrics getRowHeight() const; - virtual TableMetrics getColumnHeaderHeight() const; - virtual TableMetrics getRowHeaderWidth() const; - virtual ScrollbarVisibility getVerticalScrollbarVisibility(int overAllHeight, int actHeight) const; - virtual ScrollbarVisibility getHorizontalScrollbarVisibility(int overAllWidth, int actWidth) const; - virtual void setVerticalScrollbarVisibility(bool _bVScroll) const; - virtual void setHorizontalScrollbarVisibility(bool _bHScroll) const; - virtual void setCellContent(const std::vector<std::vector< Any > >& cellContent); - virtual std::vector<std::vector< Any > >& getCellContent(); - virtual void setRowHeaderName(const std::vector<rtl::OUString>& cellColumnContent); - virtual std::vector<rtl::OUString>& getRowHeaderName(); - virtual ::com::sun::star::util::Color getLineColor(); - virtual void setLineColor(::com::sun::star::util::Color _rColor); - virtual ::com::sun::star::util::Color getHeaderBackgroundColor(); - virtual void setHeaderBackgroundColor(::com::sun::star::util::Color _rColor); - virtual ::com::sun::star::util::Color getTextColor(); - virtual void setTextColor(::com::sun::star::util::Color _rColor); - virtual ::com::sun::star::util::Color getOddRowBackgroundColor(); - virtual void setOddRowBackgroundColor(::com::sun::star::util::Color _rColor); - virtual ::com::sun::star::util::Color getEvenRowBackgroundColor(); - virtual void setEvenRowBackgroundColor(::com::sun::star::util::Color _rColor); - virtual ::com::sun::star::style::VerticalAlignment getVerticalAlign(); - virtual void setVerticalAlign(::com::sun::star::style::VerticalAlignment _rAlign); - virtual bool hasVerticalScrollbar(); - virtual bool hasHorizontalScrollbar(); -}; - -inline void UnoControlTableModel::SetColumnWidth( ColPos _nColumn, TableMetrics _nWidth100thMM ) -{ - getColumnModel( _nColumn )->setWidth( _nWidth100thMM ); -} + virtual TableSize getColumnCount() const; + virtual TableSize getRowCount() const; + virtual bool hasColumnHeaders() const; + virtual bool hasRowHeaders() const; + virtual bool isCellEditable( ColPos col, RowPos row ) const; + virtual PColumnModel getColumnModel( ColPos column ); + virtual PTableRenderer getRenderer() const; + virtual PTableInputHandler getInputHandler() const; + virtual TableMetrics getRowHeight() const; + virtual TableMetrics getColumnHeaderHeight() const; + virtual TableMetrics getRowHeaderWidth() const; + virtual ScrollbarVisibility getVerticalScrollbarVisibility() const; + virtual ScrollbarVisibility getHorizontalScrollbarVisibility() const; + virtual void addTableModelListener( const PTableModelListener& i_listener ); + virtual void removeTableModelListener( const PTableModelListener& i_listener ); + virtual void getCellContent( ColPos const i_col, RowPos const i_row, ::com::sun::star::uno::Any& o_cellContent ); + virtual void getCellToolTip( ColPos const i_col, RowPos const i_row, ::com::sun::star::uno::Any & o_cellToolTip ); + virtual ::com::sun::star::uno::Any getRowHeading( RowPos const i_rowPos ) const; + virtual ::boost::optional< ::Color > getLineColor() const; + virtual ::boost::optional< ::Color > getHeaderBackgroundColor() const; + virtual ::boost::optional< ::Color > getHeaderTextColor() const; + virtual ::boost::optional< ::Color > getTextColor() const; + virtual ::boost::optional< ::Color > getTextLineColor() const; + virtual ::boost::optional< ::std::vector< ::Color > > + getRowBackgroundColors() const; + virtual ::com::sun::star::style::VerticalAlignment + getVerticalAlign() const; + virtual ITableDataSort* getSortAdapter(); + + // ITableDataSort overridables + virtual void sortByColumn( ColPos const i_column, ColumnSortDirection const i_sortDirection ); + virtual ColumnSort getCurrentSortOrder() const; + + // column write access + void appendColumn( ::com::sun::star::uno::Reference< ::com::sun::star::awt::grid::XGridColumn > const & i_column ); + void insertColumn( ColPos const i_position, ::com::sun::star::uno::Reference< ::com::sun::star::awt::grid::XGridColumn > const & i_column ); + void removeColumn( ColPos const i_position ); + void removeAllColumns(); + + // other operations + void setVerticalScrollbarVisibility( ScrollbarVisibility const i_visibility ) const; + void setHorizontalScrollbarVisibility( ScrollbarVisibility const i_visibility ) const; + + void setDataModel( ::com::sun::star::uno::Reference< ::com::sun::star::awt::grid::XGridDataModel > const & i_gridDataModel ); + bool hasDataModel() const; + ::com::sun::star::uno::Reference< ::com::sun::star::awt::grid::XGridDataModel > + getDataModel() const; + void setColumnModel( ::com::sun::star::uno::Reference< ::com::sun::star::awt::grid::XGridColumnModel > const & i_gridColumnModel ); + bool hasColumnModel() const; + ::com::sun::star::uno::Reference< ::com::sun::star::awt::grid::XGridColumnModel > + getColumnModel() const; + + void setRowHeaders(bool _bRowHeaders); + void setColumnHeaders(bool _bColumnHeaders); + + void setRowHeight( TableMetrics _nHeight ); + void setRowHeaderWidth( TableMetrics _nWidth ); + void setColumnHeaderHeight( TableMetrics _nHeight ); + + void setLineColor( ::com::sun::star::uno::Any const & i_color ); + void setHeaderBackgroundColor( ::com::sun::star::uno::Any const & i_color ); + void setHeaderTextColor( ::com::sun::star::uno::Any const & i_color ); + void setTextColor( ::com::sun::star::uno::Any const & i_color ); + void setTextLineColor( ::com::sun::star::uno::Any const & i_color ); + void setRowBackgroundColors( ::com::sun::star::uno::Any const & i_APIValue ); + + void setVerticalAlign(::com::sun::star::style::VerticalAlignment _rAlign); + + // multiplexing of XGridDataListener events + void notifyRowsInserted( ::com::sun::star::awt::grid::GridDataEvent const & i_event ) const; + void notifyRowsRemoved( ::com::sun::star::awt::grid::GridDataEvent const & i_event ) const; + void notifyDataChanged( ::com::sun::star::awt::grid::GridDataEvent const & i_event ) const; + + /// retrieves the index of a column within the model + ColPos getColumnPos( UnoGridColumnFacade const & i_column ) const; + + /// notifies a change in a column belonging to the model + void notifyColumnChange( ColPos const i_columnPos, ColumnAttributeGroup const i_attributeGroup ) const; + + /** notifies a change in all data represented by the model. To be used if you cannot specified the changed data + in more detail. + */ + void notifyAllDataChanged() const; + +#ifdef DBG_UTIL + const char* checkInvariants() const; +#endif -inline TableMetrics UnoControlTableModel::GetColumnWidth( ColPos _nColumn ) -{ - return getColumnModel( _nColumn )->getWidth(); -} - #endif // _UNOCONTROL_TABLEMODEL_HXX_ + private: + void impl_notifyTableMetricsChanged() const; + }; + +// ..................................................................................................................... +} } // svt::table +// ..................................................................................................................... + +#endif // _UNOCONTROL_TABLEMODEL_HXX_ diff --git a/svtools/source/uno/unogridcolumnfacade.cxx b/svtools/source/uno/unogridcolumnfacade.cxx new file mode 100755 index 000000000000..d2f5e7b565fd --- /dev/null +++ b/svtools/source/uno/unogridcolumnfacade.cxx @@ -0,0 +1,427 @@ +/************************************************************************* + * + * 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_svtools.hxx" + +#include "unogridcolumnfacade.hxx" +#include "unocontroltablemodel.hxx" + +#include "svtools/table/defaultinputhandler.hxx" +#include "svtools/table/gridtablerenderer.hxx" +#include "svtools/table/tablecontrol.hxx" + +/** === begin UNO includes === **/ +#include <com/sun/star/awt/grid/XGridColumn.hpp> +#include <com/sun/star/view/SelectionType.hpp> +#include <com/sun/star/awt/grid/XGridColumnListener.hpp> +/** === end UNO includes === **/ + +#include <comphelper/stlunosequence.hxx> +#include <tools/debug.hxx> +#include <tools/diagnose_ex.h> +#include <vcl/svapp.hxx> +#include <vos/mutex.hxx> + +// ..................................................................................................................... +namespace svt { namespace table +{ +// ..................................................................................................................... + + /** === begin UNO using === **/ + using ::com::sun::star::uno::Reference; + using ::com::sun::star::uno::RuntimeException; + using ::com::sun::star::uno::Sequence; + using ::com::sun::star::uno::UNO_QUERY_THROW; + using ::com::sun::star::uno::UNO_QUERY; + using ::com::sun::star::awt::grid::XGridColumn; + using ::com::sun::star::uno::XInterface; + using ::com::sun::star::uno::Exception; + using ::com::sun::star::awt::grid::XGridColumnListener; + using ::com::sun::star::lang::EventObject; + using ::com::sun::star::awt::grid::GridColumnEvent; + using ::com::sun::star::uno::Any; + using ::com::sun::star::style::HorizontalAlignment_LEFT; + using ::com::sun::star::style::HorizontalAlignment; + /** === end UNO using === **/ + + //------------------------------------------------------------------------------------------------------------------ + namespace + { + template< class ATTRIBUTE_TYPE > + void lcl_set( Reference< XGridColumn > const & i_column, void ( SAL_CALL XGridColumn::*i_setter )( ATTRIBUTE_TYPE ), + ATTRIBUTE_TYPE i_value ) + { + try + { + (i_column.get()->*i_setter) ( i_value ); + } + catch( const Exception& ) + { + DBG_UNHANDLED_EXCEPTION(); + } + } + + template< class ATTRIBUTE_TYPE > + ATTRIBUTE_TYPE lcl_get( Reference< XGridColumn > const & i_column, ATTRIBUTE_TYPE ( SAL_CALL XGridColumn::*i_getter )() ) + { + ATTRIBUTE_TYPE value = ATTRIBUTE_TYPE(); + try + { + value = (i_column.get()->*i_getter)(); + } + catch( const Exception& ) + { + DBG_UNHANDLED_EXCEPTION(); + } + return value; + } + } + + //================================================================================================================== + //= ColumnChangeMultiplexer + //================================================================================================================== + typedef ::cppu::WeakImplHelper1 < XGridColumnListener + > ColumnChangeMultiplexer_Base; + class ColumnChangeMultiplexer :public ColumnChangeMultiplexer_Base + ,public ::boost::noncopyable + { + public: + ColumnChangeMultiplexer( UnoGridColumnFacade& i_colImpl ); + + void dispose(); + + protected: + ~ColumnChangeMultiplexer(); + + // XGridColumnListener + virtual void SAL_CALL columnChanged( const GridColumnEvent& i_event ) throw (RuntimeException); + + // XEventListener + virtual void SAL_CALL disposing( const EventObject& i_event ) throw (RuntimeException); + + private: + UnoGridColumnFacade* m_pColumnImplementation; + }; + + //------------------------------------------------------------------------------------------------------------------ + ColumnChangeMultiplexer::ColumnChangeMultiplexer( UnoGridColumnFacade& i_colImpl ) + :m_pColumnImplementation( &i_colImpl ) + { + } + + //------------------------------------------------------------------------------------------------------------------ + ColumnChangeMultiplexer::~ColumnChangeMultiplexer() + { + } + + //------------------------------------------------------------------------------------------------------------------ + void ColumnChangeMultiplexer::dispose() + { + DBG_TESTSOLARMUTEX(); + m_pColumnImplementation = NULL; + } + + //------------------------------------------------------------------------------------------------------------------ + void SAL_CALL ColumnChangeMultiplexer::columnChanged( const GridColumnEvent& i_event ) throw (RuntimeException) + { + if ( i_event.AttributeName.equalsAscii( "DataColumnIndex" ) ) + { + ::vos::OGuard aSolarGuard( Application::GetSolarMutex() ); + if ( m_pColumnImplementation != NULL ) + m_pColumnImplementation->dataColumnIndexChanged(); + return; + } + + ColumnAttributeGroup nChangedAttributes( COL_ATTRS_NONE ); + + if ( i_event.AttributeName.equalsAscii( "HorizontalAlign" ) ) + nChangedAttributes |= COL_ATTRS_APPEARANCE; + + if ( i_event.AttributeName.equalsAscii( "ColumnWidth" ) + || i_event.AttributeName.equalsAscii( "MaxWidth" ) + || i_event.AttributeName.equalsAscii( "MinWidth" ) + || i_event.AttributeName.equalsAscii( "PreferredWidth" ) + || i_event.AttributeName.equalsAscii( "Resizeable" ) + || i_event.AttributeName.equalsAscii( "Flexibility" ) + ) + nChangedAttributes |= COL_ATTRS_WIDTH; + + OSL_ENSURE( nChangedAttributes != COL_ATTRS_NONE, + "ColumnChangeMultiplexer::columnChanged: unknown column attributed changed!" ); + + ::vos::OGuard aSolarGuard( Application::GetSolarMutex() ); + if ( m_pColumnImplementation != NULL ) + m_pColumnImplementation->columnChanged( nChangedAttributes ); + } + + //------------------------------------------------------------------------------------------------------------------ + void SAL_CALL ColumnChangeMultiplexer::disposing( const EventObject& i_event ) throw (RuntimeException) + { + OSL_UNUSED( i_event ); + } + + //================================================================================================================== + //= UnoGridColumnFacade + //================================================================================================================== + //------------------------------------------------------------------------------------------------------------------ + UnoGridColumnFacade::UnoGridColumnFacade( UnoControlTableModel const & i_owner, Reference< XGridColumn > const & i_gridColumn ) + :m_pOwner( &i_owner ) + ,m_nDataColumnIndex( -1 ) + ,m_xGridColumn( i_gridColumn, UNO_QUERY_THROW ) + ,m_pChangeMultiplexer( new ColumnChangeMultiplexer( *this ) ) + { + m_xGridColumn->addGridColumnListener( m_pChangeMultiplexer.get() ); + impl_updateDataColumnIndex_nothrow(); + } + + //------------------------------------------------------------------------------------------------------------------ + UnoGridColumnFacade::~UnoGridColumnFacade() + { + } + + //------------------------------------------------------------------------------------------------------------------ + void UnoGridColumnFacade::dispose() + { + DBG_TESTSOLARMUTEX(); + ENSURE_OR_RETURN_VOID( m_pOwner != NULL, "UnoGridColumnFacade::dispose: already disposed!" ); + + m_xGridColumn->removeGridColumnListener( m_pChangeMultiplexer.get() ); + m_pChangeMultiplexer->dispose(); + m_pChangeMultiplexer.clear(); + m_xGridColumn.clear(); + m_pOwner = NULL; + } + + //------------------------------------------------------------------------------------------------------------------ + void UnoGridColumnFacade::impl_updateDataColumnIndex_nothrow() + { + m_nDataColumnIndex = -1; + ENSURE_OR_RETURN_VOID( m_xGridColumn.is(), "UnoGridColumnFacade: already disposed!" ); + try + { + m_nDataColumnIndex = m_xGridColumn->getDataColumnIndex(); + } + catch( const Exception& ) + { + DBG_UNHANDLED_EXCEPTION(); + } + } + + //------------------------------------------------------------------------------------------------------------------ + void UnoGridColumnFacade::dataColumnIndexChanged() + { + DBG_TESTSOLARMUTEX(); + impl_updateDataColumnIndex_nothrow(); + if ( m_pOwner != NULL ) + m_pOwner->notifyAllDataChanged(); + } + + //------------------------------------------------------------------------------------------------------------------ + void UnoGridColumnFacade::columnChanged( ColumnAttributeGroup const i_attributeGroup ) + { + DBG_TESTSOLARMUTEX(); + if ( m_pOwner != NULL ) + m_pOwner->notifyColumnChange( m_pOwner->getColumnPos( *this ), i_attributeGroup ); + } + + //------------------------------------------------------------------------------------------------------------------ + Any UnoGridColumnFacade::getID() const + { + Any aID; + ENSURE_OR_RETURN( m_xGridColumn.is(), "UnoGridColumnFacade: already disposed!", aID ); + try + { + aID = m_xGridColumn->getIdentifier(); + } + catch( const Exception& ) + { + DBG_UNHANDLED_EXCEPTION(); + } + return aID; + } + + //------------------------------------------------------------------------------------------------------------------ + void UnoGridColumnFacade::setID( const Any& i_ID ) + { + ENSURE_OR_RETURN_VOID( m_xGridColumn.is(), "UnoGridColumnFacade: already disposed!" ); + try + { + m_xGridColumn->setIdentifier( i_ID ); + } + catch( const Exception& ) + { + DBG_UNHANDLED_EXCEPTION(); + } + } + + //------------------------------------------------------------------------------------------------------------------ + String UnoGridColumnFacade::getName() const + { + ::rtl::OUString sName; + ENSURE_OR_RETURN( m_xGridColumn.is(), "UnoGridColumnFacade: already disposed!", sName ); + try + { + sName = m_xGridColumn->getTitle(); + } + catch( const Exception& ) + { + DBG_UNHANDLED_EXCEPTION(); + } + return sName; + } + + //------------------------------------------------------------------------------------------------------------------ + void UnoGridColumnFacade::setName( const String& _rName ) + { + ENSURE_OR_RETURN_VOID( m_xGridColumn.is(), "UnoGridColumnFacade: already disposed!" ); + try + { + m_xGridColumn->setTitle( _rName ); + } + catch( const Exception& ) + { + DBG_UNHANDLED_EXCEPTION(); + } + } + + //------------------------------------------------------------------------------------------------------------------ + String UnoGridColumnFacade::getHelpText() const + { + ::rtl::OUString sHelpText; + ENSURE_OR_RETURN( m_xGridColumn.is(), "UnoGridColumnFacade: already disposed!", sHelpText ); + try + { + sHelpText = m_xGridColumn->getHelpText(); + } + catch( const Exception& ) + { + DBG_UNHANDLED_EXCEPTION(); + } + return sHelpText; + } + + //------------------------------------------------------------------------------------------------------------------ + void UnoGridColumnFacade::setHelpText( const String& i_helpText ) + { + ENSURE_OR_RETURN_VOID( m_xGridColumn.is(), "UnoGridColumnFacade: already disposed!" ); + try + { + m_xGridColumn->setHelpText( i_helpText ); + } + catch( const Exception& ) + { + DBG_UNHANDLED_EXCEPTION(); + } + } + + //------------------------------------------------------------------------------------------------------------------ + bool UnoGridColumnFacade::isResizable() const + { + ENSURE_OR_RETURN( m_xGridColumn.is(), "UnoGridColumnFacade: already disposed!", false ); + return lcl_get( m_xGridColumn, &XGridColumn::getResizeable ); + } + + //------------------------------------------------------------------------------------------------------------------ + void UnoGridColumnFacade::setResizable( bool i_resizable ) + { + ENSURE_OR_RETURN_VOID( m_xGridColumn.is(), "UnoGridColumnFacade: already disposed!" ); + lcl_set( m_xGridColumn, &XGridColumn::setResizeable, sal_Bool( i_resizable ) ); + } + + //------------------------------------------------------------------------------------------------------------------ + sal_Int32 UnoGridColumnFacade::getFlexibility() const + { + ENSURE_OR_RETURN( m_xGridColumn.is(), "UnoGridColumnFacade: already disposed!", 1 ); + return lcl_get( m_xGridColumn, &XGridColumn::getFlexibility ); + } + + //------------------------------------------------------------------------------------------------------------------ + void UnoGridColumnFacade::setFlexibility( sal_Int32 const i_flexibility ) + { + ENSURE_OR_RETURN_VOID( m_xGridColumn.is(), "UnoGridColumnFacade: already disposed!" ); + lcl_set( m_xGridColumn, &XGridColumn::setFlexibility, i_flexibility ); + } + + //------------------------------------------------------------------------------------------------------------------ + TableMetrics UnoGridColumnFacade::getWidth() const + { + ENSURE_OR_RETURN( m_xGridColumn.is(), "UnoGridColumnFacade: already disposed!", 0 ); + return lcl_get( m_xGridColumn, &XGridColumn::getColumnWidth ); + } + + //------------------------------------------------------------------------------------------------------------------ + void UnoGridColumnFacade::setWidth( TableMetrics _nWidth ) + { + ENSURE_OR_RETURN_VOID( m_xGridColumn.is(), "UnoGridColumnFacade: already disposed!" ); + lcl_set( m_xGridColumn, &XGridColumn::setColumnWidth, _nWidth ); + } + + //------------------------------------------------------------------------------------------------------------------ + TableMetrics UnoGridColumnFacade::getMinWidth() const + { + ENSURE_OR_RETURN( m_xGridColumn.is(), "UnoGridColumnFacade: already disposed!", 0 ); + return lcl_get( m_xGridColumn, &XGridColumn::getMinWidth ); + } + + //------------------------------------------------------------------------------------------------------------------ + void UnoGridColumnFacade::setMinWidth( TableMetrics _nMinWidth ) + { + ENSURE_OR_RETURN_VOID( m_xGridColumn.is(), "UnoGridColumnFacade: already disposed!" ); + lcl_set( m_xGridColumn, &XGridColumn::setMinWidth, _nMinWidth ); + } + + //------------------------------------------------------------------------------------------------------------------ + TableMetrics UnoGridColumnFacade::getMaxWidth() const + { + ENSURE_OR_RETURN( m_xGridColumn.is(), "UnoGridColumnFacade: already disposed!", 0 ); + return lcl_get( m_xGridColumn, &XGridColumn::getMaxWidth ); + } + + //------------------------------------------------------------------------------------------------------------------ + void UnoGridColumnFacade::setMaxWidth( TableMetrics _nMaxWidth ) + { + ENSURE_OR_RETURN_VOID( m_xGridColumn.is(), "UnoGridColumnFacade: already disposed!" ); + lcl_set( m_xGridColumn, &XGridColumn::setMinWidth, _nMaxWidth ); + } + + //------------------------------------------------------------------------------------------------------------------ + ::com::sun::star::style::HorizontalAlignment UnoGridColumnFacade::getHorizontalAlign() + { + ENSURE_OR_RETURN( m_xGridColumn.is(), "UnoGridColumnFacade: already disposed!", HorizontalAlignment_LEFT ); + return lcl_get( m_xGridColumn, &XGridColumn::getHorizontalAlign ); + } + + //------------------------------------------------------------------------------------------------------------------ + void UnoGridColumnFacade::setHorizontalAlign( com::sun::star::style::HorizontalAlignment _align ) + { + ENSURE_OR_RETURN_VOID( m_xGridColumn.is(), "UnoGridColumnFacade: already disposed!" ); + lcl_set( m_xGridColumn, &XGridColumn::setHorizontalAlign, _align ); + } + +// ..................................................................................................................... +} } // svt::table +// ..................................................................................................................... diff --git a/svtools/source/uno/unogridcolumnfacade.hxx b/svtools/source/uno/unogridcolumnfacade.hxx new file mode 100755 index 000000000000..7499621ba8af --- /dev/null +++ b/svtools/source/uno/unogridcolumnfacade.hxx @@ -0,0 +1,114 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef SVTOOLS_GRIDCOLUMNFACADE_HXX +#define SVTOOLS_GRIDCOLUMNFACADE_HXX + +#include "svtools/table/tablemodel.hxx" +#include "svtools/table/tablecontrol.hxx" + +/** === begin UNO includes === **/ +#include <com/sun/star/awt/grid/XGridColumn.hpp> +#include <com/sun/star/style/VerticalAlignment.hpp> +#include <com/sun/star/style/HorizontalAlignment.hpp> +/** === end UNO includes === **/ + +#include <cppuhelper/implbase2.hxx> +#include <rtl/ref.hxx> + +#include <boost/noncopyable.hpp> + +// ..................................................................................................................... +namespace svt { namespace table +{ +// ..................................................................................................................... + + //================================================================================================================== + //= UnoGridColumnFacade + //================================================================================================================== + class ColumnChangeMultiplexer; + class UnoControlTableModel; + class UnoGridColumnFacade :public IColumnModel + ,public ::boost::noncopyable + { + public: + UnoGridColumnFacade( + UnoControlTableModel const & i_owner, + ::com::sun::star::uno::Reference< ::com::sun::star::awt::grid::XGridColumn > const & i_gridColumn + ); + ~UnoGridColumnFacade(); + + // IColumnModel overridables + virtual ::com::sun::star::uno::Any + getID() const; + virtual void setID( const ::com::sun::star::uno::Any& i_ID ); + virtual String getName() const; + virtual void setName( const String& _rName ); + virtual String getHelpText() const; + virtual void setHelpText( const String& i_helpText ); + virtual bool isResizable() const; + virtual void setResizable( bool _bResizable ); + virtual sal_Int32 getFlexibility() const; + virtual void setFlexibility( sal_Int32 const i_flexibility ); + virtual TableMetrics getWidth() const; + virtual void setWidth( TableMetrics _nWidth ); + virtual TableMetrics getMinWidth() const; + virtual void setMinWidth( TableMetrics _nMinWidth ); + virtual TableMetrics getMaxWidth() const; + virtual void setMaxWidth( TableMetrics _nMaxWidth ); + virtual ::com::sun::star::style::HorizontalAlignment getHorizontalAlign(); + virtual void setHorizontalAlign(::com::sun::star::style::HorizontalAlignment _xAlign); + + /** disposes the column wrapper + + Note that the XGridColumn which is wrapped by the instance is <strong>not</strong> disposed, as we + do not own it. + */ + void dispose(); + + sal_Int32 + getDataColumnIndex() const { return m_nDataColumnIndex; } + + // callbacks for the XGridColumnListener + void columnChanged( ColumnAttributeGroup const i_attributeGroup ); + void dataColumnIndexChanged(); + + private: + void impl_updateDataColumnIndex_nothrow(); + + private: + UnoControlTableModel const * m_pOwner; + sal_Int32 m_nDataColumnIndex; + ::com::sun::star::uno::Reference< ::com::sun::star::awt::grid::XGridColumn > m_xGridColumn; + ::rtl::Reference< ColumnChangeMultiplexer > m_pChangeMultiplexer; + }; + +// ..................................................................................................................... +} } // svt::table +// ..................................................................................................................... + +#endif // SVTOOLS_GRIDCOLUMNFACADE_HXX diff --git a/svtools/source/uno/unoiface.cxx b/svtools/source/uno/unoiface.cxx index a60a210e8fa7..18af2c696a8c 100644 --- a/svtools/source/uno/unoiface.cxx +++ b/svtools/source/uno/unoiface.cxx @@ -80,6 +80,7 @@ SAL_DLLPUBLIC_EXPORT Window* CreateWindow( VCLXWindow** ppNewComp, const ::com:: if ( pParent ) { pWindow = new MultiLineEdit( pParent, nWinBits|WB_IGNORETAB); + static_cast< MultiLineEdit* >( pWindow )->DisableSelectionOnFocus(); *ppNewComp = new VCLXMultiLineEdit; } else |