2010-10-14 08:27:31 +02:00
|
|
|
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
2012-11-15 17:28:16 +00:00
|
|
|
/*
|
|
|
|
* This file is part of the LibreOffice project.
|
2010-02-12 15:01:35 +01:00
|
|
|
*
|
2012-11-15 17:28:16 +00:00
|
|
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
2010-02-12 15:01:35 +01:00
|
|
|
*
|
2012-11-15 17:28:16 +00:00
|
|
|
* This file incorporates work covered by the following license notice:
|
2010-02-12 15:01:35 +01:00
|
|
|
*
|
2012-11-15 17:28:16 +00:00
|
|
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
|
|
|
* contributor license agreements. See the NOTICE file distributed
|
|
|
|
* with this work for additional information regarding copyright
|
|
|
|
* ownership. The ASF licenses this file to you under the Apache
|
|
|
|
* License, Version 2.0 (the "License"); you may not use this file
|
|
|
|
* except in compliance with the License. You may obtain a copy of
|
|
|
|
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
|
|
|
|
*/
|
2009-08-26 13:11:27 +00:00
|
|
|
|
2014-05-15 12:06:32 +02:00
|
|
|
#ifndef INCLUDED_SVTOOLS_INC_TABLE_TABLECONTROL_HXX
|
|
|
|
#define INCLUDED_SVTOOLS_INC_TABLE_TABLECONTROL_HXX
|
2009-08-26 13:11:27 +00:00
|
|
|
|
2013-11-09 15:40:46 -06:00
|
|
|
#include <svtools/svtdllapi.h>
|
|
|
|
#include <svtools/table/tablemodel.hxx>
|
|
|
|
#include <svtools/accessibletable.hxx>
|
|
|
|
#include <svtools/accessiblefactory.hxx>
|
2011-01-14 09:50:02 +01:00
|
|
|
|
2009-08-26 13:11:27 +00:00
|
|
|
#include <vcl/ctrl.hxx>
|
|
|
|
#include <vcl/seleng.hxx>
|
2010-12-17 13:38:24 +01:00
|
|
|
|
2015-02-18 15:44:37 +00:00
|
|
|
#include <memory>
|
2009-08-26 13:11:27 +00:00
|
|
|
|
|
|
|
namespace svt { namespace table
|
|
|
|
{
|
2014-02-25 19:06:16 +01:00
|
|
|
|
2009-08-26 13:11:27 +00:00
|
|
|
|
|
|
|
class TableControl_Impl;
|
2009-10-30 12:37:25 +00:00
|
|
|
|
2014-02-25 19:06:16 +01:00
|
|
|
|
2009-08-26 13:11:27 +00:00
|
|
|
//= TableControl
|
2014-02-25 19:06:16 +01:00
|
|
|
|
2009-08-26 13:11:27 +00:00
|
|
|
/** a basic control which manages table-like data, i.e. a number of cells
|
|
|
|
organized in <code>m</code> rows and <code>n</code> columns.
|
|
|
|
|
|
|
|
The control itself does not do any assumptions about the concrete data
|
|
|
|
it displays, this is encapsulated in an instance supporting the
|
|
|
|
->ITableModel interface.
|
|
|
|
|
|
|
|
Also, the control does not do any assumptions about how the model's
|
|
|
|
content is rendered. This is the responsibility of a component
|
|
|
|
supporting the ->ITableRenderer interface (the renderer is obtained from
|
|
|
|
the model).
|
|
|
|
|
|
|
|
The control supports the concept of a <em>current</em> (or <em>active</em>
|
|
|
|
cell).
|
2009-11-02 09:15:45 +00:00
|
|
|
The control supports accessibility, this is encapsulated in IAccessibleTable
|
2009-08-26 13:11:27 +00:00
|
|
|
*/
|
2010-04-09 14:15:44 +02:00
|
|
|
class SVT_DLLPUBLIC TableControl : public Control, public IAccessibleTable
|
2009-08-26 13:11:27 +00:00
|
|
|
{
|
|
|
|
private:
|
2015-02-18 15:44:37 +00:00
|
|
|
std::shared_ptr<TableControl_Impl> m_pImpl;
|
2010-04-16 16:55:27 +02:00
|
|
|
|
2009-08-26 13:11:27 +00:00
|
|
|
|
|
|
|
public:
|
2014-09-23 11:20:40 +02:00
|
|
|
TableControl( vcl::Window* _pParent, WinBits _nStyle );
|
2014-04-01 19:18:35 +02:00
|
|
|
virtual ~TableControl();
|
2015-01-12 15:16:05 +02:00
|
|
|
virtual void dispose() SAL_OVERRIDE;
|
2009-08-26 13:11:27 +00:00
|
|
|
|
|
|
|
/// sets a new table model
|
gridsort: reworked the notification system for inserted/removed rows
In this course, more code which was in SVTXGridControl was moved to the places it belongs to, effectively
meaning that the TableControl has better chances than before to be used outside an SVTXGridControl (though
we're not there, yet).
Also, the selection-related methods in TableControl/_Impl got some refactoring love, so the implementation
details are hidden in the Impl class now, instead of being exposed to an exploited by the TableControl.
And while we were there ... The XGridSelection does not provide a |selectColumn| anymore (there was no
preparation whatsoever for column selection, anywhere, thus it was a complete dummy.)
Also, its de/selectRows methods have been removed: They have questionable use, and make implementation
rather difficult, compared with multiple calls to de/selectRow.
2011-01-13 14:08:36 +01:00
|
|
|
void SetModel( PTableModel _pModel );
|
2009-08-26 13:11:27 +00:00
|
|
|
/// retrieves the current table model
|
|
|
|
PTableModel GetModel() const;
|
|
|
|
|
|
|
|
/** retrieves the current row
|
|
|
|
|
|
|
|
The current row is the one which contains the active cell.
|
|
|
|
|
|
|
|
@return
|
|
|
|
the row index of the active cell, or ->ROW_INVALID
|
|
|
|
if there is no active cell, e.g. because the table does
|
|
|
|
not contain any rows or columns.
|
|
|
|
*/
|
2014-03-26 16:37:00 +01:00
|
|
|
sal_Int32 GetCurrentRow() const SAL_OVERRIDE;
|
2009-08-26 13:11:27 +00:00
|
|
|
|
2011-01-11 13:26:40 +01:00
|
|
|
ITableControl&
|
2011-01-11 10:58:26 +01:00
|
|
|
getTableControlInterface();
|
2009-08-26 13:11:27 +00:00
|
|
|
|
|
|
|
/** retrieves the current column
|
|
|
|
|
|
|
|
The current col is the one which contains the active cell.
|
|
|
|
|
|
|
|
@return
|
|
|
|
the column index of the active cell, or ->COL_INVALID
|
|
|
|
if there is no active cell, e.g. because the table does
|
|
|
|
not contain any rows or columns.
|
|
|
|
*/
|
2014-03-26 16:37:00 +01:00
|
|
|
sal_Int32 GetCurrentColumn() const SAL_OVERRIDE;
|
2009-08-26 13:11:27 +00:00
|
|
|
|
2012-09-03 19:05:27 -05:00
|
|
|
/** activates the cell at the given position
|
|
|
|
|
|
|
|
@return
|
|
|
|
<sal_True/> if the move was successful, <FALSE/> otherwise. Usual
|
|
|
|
failure conditions include some other instance vetoing the move,
|
|
|
|
or impossibility to execute the move at all (for instance because
|
|
|
|
of invalid coordinates).
|
|
|
|
*/
|
|
|
|
bool GoTo( ColPos _nColumnPos, RowPos _nRow);
|
|
|
|
|
|
|
|
/** moves the active cell to the given column, by keeping the active row
|
|
|
|
|
|
|
|
@return
|
|
|
|
<sal_True/> if the move was successful, <FALSE/> otherwise. Usual
|
|
|
|
failure conditions include some other instance vetoing the move,
|
|
|
|
or impossibility to execute the move at all (for instance because
|
|
|
|
of invalid coordinates).
|
|
|
|
*/
|
|
|
|
inline bool GoToColumn( ColPos _nColumn )
|
|
|
|
{
|
|
|
|
return GoTo( _nColumn, GetCurrentRow() );
|
|
|
|
}
|
|
|
|
|
|
|
|
/** moves the active cell to the given row, by keeping the active column
|
|
|
|
|
|
|
|
@return
|
|
|
|
<sal_True/> if the move was successful, <FALSE/> otherwise. Usual
|
|
|
|
failure conditions include some other instance vetoing the move,
|
|
|
|
or impossibility to execute the move at all (for instance because
|
|
|
|
of invalid coordinates).
|
|
|
|
*/
|
|
|
|
bool GoToRow( RowPos _nRow )
|
|
|
|
{
|
|
|
|
return GoTo( GetCurrentColumn(), _nRow );
|
|
|
|
}
|
|
|
|
|
2014-03-26 16:37:00 +01:00
|
|
|
SVT_DLLPRIVATE virtual void Resize() SAL_OVERRIDE;
|
2015-01-20 12:38:10 +02:00
|
|
|
void Select();
|
2010-12-17 13:38:24 +01:00
|
|
|
|
|
|
|
/**after removing a row, updates the vector which contains the selected rows
|
|
|
|
if the row, which should be removed, is selected, it will be erased from the vector
|
|
|
|
*/
|
2011-01-14 11:44:35 +01:00
|
|
|
SelectionEngine* getSelEngine();
|
2014-09-23 11:20:40 +02:00
|
|
|
vcl::Window& getDataWindow();
|
2009-10-30 12:37:25 +00:00
|
|
|
|
2009-08-26 13:11:27 +00:00
|
|
|
// Window overridables
|
2014-03-26 16:37:00 +01:00
|
|
|
virtual void GetFocus() SAL_OVERRIDE;
|
|
|
|
virtual void LoseFocus() SAL_OVERRIDE;
|
|
|
|
virtual void KeyInput( const KeyEvent& rKEvt ) SAL_OVERRIDE;
|
|
|
|
virtual void StateChanged( StateChangedType i_nStateChange ) SAL_OVERRIDE;
|
2010-03-23 15:28:55 +01:00
|
|
|
|
2010-12-17 13:38:24 +01:00
|
|
|
/** Creates and returns the accessible object of the whole GridControl. */
|
2014-03-26 16:37:00 +01:00
|
|
|
SVT_DLLPRIVATE virtual css::uno::Reference< css::accessibility::XAccessible > CreateAccessible() SAL_OVERRIDE;
|
|
|
|
SVT_DLLPRIVATE virtual css::uno::Reference< css::accessibility::XAccessible > CreateAccessibleControl( sal_Int32 _nIndex ) SAL_OVERRIDE;
|
|
|
|
SVT_DLLPRIVATE virtual OUString GetAccessibleObjectName(AccessibleTableControlObjType eObjType, sal_Int32 _nRow, sal_Int32 _nCol) const SAL_OVERRIDE;
|
|
|
|
SVT_DLLPRIVATE virtual bool GoToCell( sal_Int32 _nColumnPos, sal_Int32 _nRow ) SAL_OVERRIDE;
|
|
|
|
SVT_DLLPRIVATE virtual OUString GetAccessibleObjectDescription(AccessibleTableControlObjType eObjType, sal_Int32 _nPosition = -1) const SAL_OVERRIDE;
|
|
|
|
SVT_DLLPRIVATE virtual void FillAccessibleStateSet( ::utl::AccessibleStateSetHelper& rStateSet, AccessibleTableControlObjType eObjType ) const SAL_OVERRIDE;
|
2012-08-31 00:46:39 -05:00
|
|
|
|
|
|
|
// temporary methods
|
|
|
|
// Those do not really belong into the public API - they're intended for firing A11Y-related events. However,
|
|
|
|
// firing those events should be an implementation internal to the TableControl resp. TableControl_Impl,
|
|
|
|
// instead of something triggered externally.
|
2013-04-02 00:21:17 +02:00
|
|
|
void commitCellEventIfAccessibleAlive( sal_Int16 const i_eventID, const css::uno::Any& i_newValue, const css::uno::Any& i_oldValue );
|
|
|
|
void commitTableEventIfAccessibleAlive( sal_Int16 const i_eventID, const css::uno::Any& i_newValue, const css::uno::Any& i_oldValue );
|
2011-01-11 10:58:26 +01:00
|
|
|
|
2014-02-25 19:06:16 +01:00
|
|
|
|
2011-01-11 13:26:40 +01:00
|
|
|
// IAccessibleTable
|
2014-09-23 11:20:40 +02:00
|
|
|
virtual Rectangle GetWindowExtentsRelative( vcl::Window *pRelativeWindow ) const SAL_OVERRIDE;
|
2014-03-26 16:37:00 +01:00
|
|
|
virtual void GrabFocus() SAL_OVERRIDE;
|
|
|
|
virtual css::uno::Reference< css::accessibility::XAccessible > GetAccessible( bool bCreate = true ) SAL_OVERRIDE;
|
2014-09-23 11:20:40 +02:00
|
|
|
virtual vcl::Window* GetAccessibleParentWindow() const SAL_OVERRIDE;
|
|
|
|
virtual vcl::Window* GetWindowInstance() SAL_OVERRIDE;
|
2014-03-26 16:37:00 +01:00
|
|
|
virtual sal_Int32 GetAccessibleControlCount() const SAL_OVERRIDE;
|
|
|
|
virtual bool ConvertPointToControlIndex( sal_Int32& _rnIndex, const Point& _rPoint ) SAL_OVERRIDE;
|
|
|
|
virtual long GetRowCount() const SAL_OVERRIDE;
|
|
|
|
virtual long GetColumnCount() const SAL_OVERRIDE;
|
|
|
|
virtual bool HasRowHeader() const SAL_OVERRIDE;
|
|
|
|
virtual bool ConvertPointToCellAddress( sal_Int32& _rnRow, sal_Int32& _rnColPos, const Point& _rPoint ) SAL_OVERRIDE;
|
|
|
|
virtual Rectangle calcHeaderRect( bool _bIsColumnBar, bool _bOnScreen = true ) SAL_OVERRIDE;
|
|
|
|
virtual Rectangle calcHeaderCellRect( bool _bIsColumnBar, sal_Int32 nPos) SAL_OVERRIDE;
|
|
|
|
virtual Rectangle calcTableRect( bool _bOnScreen = true ) SAL_OVERRIDE;
|
|
|
|
virtual Rectangle calcCellRect( sal_Int32 _nRowPos, sal_Int32 _nColPos ) SAL_OVERRIDE;
|
|
|
|
virtual Rectangle GetFieldCharacterBounds(sal_Int32 _nRow,sal_Int32 _nColumnPos,sal_Int32 nIndex) SAL_OVERRIDE;
|
|
|
|
virtual sal_Int32 GetFieldIndexAtPoint(sal_Int32 _nRow,sal_Int32 _nColumnPos,const Point& _rPoint) SAL_OVERRIDE;
|
|
|
|
virtual void FillAccessibleStateSetForCell( ::utl::AccessibleStateSetHelper& _rStateSet, sal_Int32 _nRow, sal_uInt16 _nColumnPos ) const SAL_OVERRIDE;
|
|
|
|
virtual OUString GetRowDescription( sal_Int32 _nRow ) const SAL_OVERRIDE;
|
|
|
|
virtual OUString GetRowName(sal_Int32 _nIndex) const SAL_OVERRIDE;
|
|
|
|
virtual OUString GetColumnDescription( sal_uInt16 _nColumnPos ) const SAL_OVERRIDE;
|
|
|
|
virtual OUString GetColumnName( sal_Int32 _nIndex ) const SAL_OVERRIDE;
|
|
|
|
virtual css::uno::Any GetCellContent( sal_Int32 _nRowPos, sal_Int32 _nColPos) const SAL_OVERRIDE;
|
|
|
|
virtual bool HasRowHeader() SAL_OVERRIDE;
|
|
|
|
virtual bool HasColHeader() SAL_OVERRIDE;
|
|
|
|
virtual OUString GetAccessibleCellText(sal_Int32 _nRowPos, sal_Int32 _nColPos) const SAL_OVERRIDE;
|
|
|
|
|
|
|
|
virtual sal_Int32 GetSelectedRowCount() const SAL_OVERRIDE;
|
|
|
|
virtual sal_Int32 GetSelectedRowIndex( sal_Int32 const i_selectionIndex ) const SAL_OVERRIDE;
|
|
|
|
virtual bool IsRowSelected( sal_Int32 const i_rowIndex ) const SAL_OVERRIDE;
|
|
|
|
virtual void SelectRow( sal_Int32 const i_rowIndex, bool const i_select ) SAL_OVERRIDE;
|
|
|
|
virtual void SelectAllRows( bool const i_select ) SAL_OVERRIDE;
|
2014-02-25 19:06:16 +01:00
|
|
|
|
gridsort: reworked the notification system for inserted/removed rows
In this course, more code which was in SVTXGridControl was moved to the places it belongs to, effectively
meaning that the TableControl has better chances than before to be used outside an SVTXGridControl (though
we're not there, yet).
Also, the selection-related methods in TableControl/_Impl got some refactoring love, so the implementation
details are hidden in the Impl class now, instead of being exposed to an exploited by the TableControl.
And while we were there ... The XGridSelection does not provide a |selectColumn| anymore (there was no
preparation whatsoever for column selection, anywhere, thus it was a complete dummy.)
Also, its de/selectRows methods have been removed: They have questionable use, and make implementation
rather difficult, compared with multiple calls to de/selectRow.
2011-01-13 14:08:36 +01:00
|
|
|
|
2011-01-13 15:07:42 +01:00
|
|
|
private:
|
|
|
|
DECL_DLLPRIVATE_LINK( ImplSelectHdl, void* );
|
2009-10-30 12:37:25 +00:00
|
|
|
|
2009-08-26 13:11:27 +00:00
|
|
|
private:
|
2015-02-07 12:30:52 +01:00
|
|
|
TableControl( const TableControl& ) SAL_DELETED_FUNCTION;
|
|
|
|
TableControl& operator=( const TableControl& ) SAL_DELETED_FUNCTION;
|
2009-08-26 13:11:27 +00:00
|
|
|
};
|
|
|
|
|
2014-02-25 19:06:16 +01:00
|
|
|
|
2009-08-26 13:11:27 +00:00
|
|
|
} } // namespace svt::table
|
2014-02-25 19:06:16 +01:00
|
|
|
|
2009-08-26 13:11:27 +00:00
|
|
|
|
2014-05-15 12:06:32 +02:00
|
|
|
#endif // INCLUDED_SVTOOLS_INC_TABLE_TABLECONTROL_HXX
|
2010-10-14 08:27:31 +02:00
|
|
|
|
|
|
|
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|