1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
|
/*************************************************************************
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* Copyright 2009 by Sun Microsystems, Inc.
*
* 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_INC_TABLE_TABLECONTROL_HXX
#define SVTOOLS_INC_TABLE_TABLECONTROL_HXX
#include <svtools/table/tablemodel.hxx>
#include <vcl/ctrl.hxx>
#include <vcl/seleng.hxx>
#include <svtools/table/tabledatawindow.hxx>
#include <svtools/accessibletable.hxx>
#include "svtaccessiblefactory.hxx"
#include <com/sun/star/util/Color.hpp>
//........................................................................
namespace svt { namespace table
{
//........................................................................
class TableControl_Impl;
class TableDataWindow;
class AccessibleTableControl_Impl;
//====================================================================
//= TableControl
//====================================================================
/** 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).
The control supports accessibility, this is encapsulated in IAccessibleTable
// TODO: scrolling?
*/
class TableControl : public Control, public IAccessibleTable
{
private:
DECL_DLLPRIVATE_LINK( ImplSelectHdl, void* );
TableControl_Impl* m_pImpl;
::com::sun::star::uno::Sequence< sal_Int32 >& m_nCols;
::com::sun::star::uno::Sequence< ::rtl::OUString >& m_aText;
Link m_aSelectHdl;
bool m_bSelectionChanged;
public:
::std::auto_ptr< AccessibleTableControl_Impl > m_pAccessTable;
TableControl( Window* _pParent, WinBits _nStyle );
~TableControl();
/// sets a new table model
void SetModel( PTableModel _pModel );
/// retrieves the current table model
PTableModel GetModel() const;
/// returns the top row, i.e. the first visible row
RowPos GetTopRow() const;
/// sets a new top row. The top row is the first visible row in the control
void SetTopRow( RowPos _nRow );
/** 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.
*/
sal_Int32 GetCurrentRow() const;
/** returns the row, which contains the input point*/
ColPos GetCurrentRow (const Point& rPoint);
/** 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.
*/
sal_Int32 GetCurrentColumn() const;
/** activates the cell at the given position
@return
<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
<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
<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 );
}
virtual void Resize();
virtual void Select();
void SetSelectHdl( const Link& rLink ) { m_aSelectHdl = rLink; }
const Link& GetSelectHdl() const { return m_aSelectHdl; }
/**invalidates the table if table has been changed e.g. new row added
*/
void InvalidateDataWindow(RowPos _nRowStart, RowPos _nRowEnd, bool _bRemoved);
/**gets the vector, which contains the selected rows
*/
std::vector<sal_Int32>& GetSelectedRows();
/**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
*/
SelectionEngine* getSelEngine();
TableDataWindow* getDataWindow();
// Window overridables
virtual void GetFocus();
virtual void LoseFocus();
virtual void KeyInput( const KeyEvent& rKEvt );
//virtual long Notify(NotifyEvent& rNEvt);
/** Creates and returns the accessible object of the whole BrowseBox. */
virtual XACC CreateAccessible();
virtual XACC CreateAccessibleControl( sal_Int32 _nIndex );
virtual ::rtl::OUString GetAccessibleObjectName(AccessibleTableControlObjType eObjType, sal_Int32 _nRow, sal_Int32 _nCol) const;
virtual sal_Bool GoToCell( sal_Int32 _nColumnPos, sal_Int32 _nRow );
virtual ::rtl::OUString GetAccessibleObjectDescription(AccessibleTableControlObjType eObjType, sal_Int32 _nPosition = -1) const;
virtual void FillAccessibleStateSet(
::utl::AccessibleStateSetHelper& rStateSet,
AccessibleTableControlObjType eObjType ) const;
//// Window
virtual Rectangle GetWindowExtentsRelative( Window *pRelativeWindow );
virtual void GrabFocus();
virtual XACC GetAccessible( BOOL bCreate = TRUE );
virtual Window* GetAccessibleParentWindow() const;
virtual Window* GetWindowInstance();
virtual sal_Int32 GetAccessibleControlCount() const;
virtual sal_Bool ConvertPointToControlIndex( sal_Int32& _rnIndex, const Point& _rPoint );
virtual long GetRowCount() const;
virtual long GetColumnCount() const;
virtual sal_Bool HasRowHeader() const;
virtual sal_Int32 GetSelectedRowCount() const;
virtual bool IsRowSelected( long _nRow ) const;
virtual sal_Bool ConvertPointToCellAddress( sal_Int32& _rnRow, sal_Int32& _rnColPos, const Point& _rPoint );
virtual Rectangle calcHeaderRect( sal_Bool _bIsColumnBar, BOOL _bOnScreen = TRUE );
virtual Rectangle calcTableRect( BOOL _bOnScreen = TRUE );
virtual Rectangle GetFieldCharacterBounds(sal_Int32 _nRow,sal_Int32 _nColumnPos,sal_Int32 nIndex);
virtual sal_Int32 GetFieldIndexAtPoint(sal_Int32 _nRow,sal_Int32 _nColumnPos,const Point& _rPoint);
virtual void FillAccessibleStateSetForCell( ::utl::AccessibleStateSetHelper& _rStateSet, sal_Int32 _nRow, sal_uInt16 _nColumnPos ) const;
virtual ::rtl::OUString GetRowDescription( sal_Int32 _nRow ) const;
virtual ::rtl::OUString GetRowName(sal_Int32 _nIndex) const;
virtual ::rtl::OUString GetColumnDescription( sal_uInt16 _nColumnPos ) const;
virtual ::rtl::OUString GetColumnName( sal_Int32 _nIndex ) const;
virtual ::com::sun::star::uno::Any GetCellContent( sal_Int32 _nRowPos, sal_Int32 _nColPos) const;
virtual sal_Bool HasRowHeader();
virtual sal_Bool HasColHeader();
virtual sal_Bool isAccessibleAlive( ) const;
virtual void commitGridControlEvent( sal_Int16 _nEventId, const com::sun::star::uno::Any& _rNewValue, const com::sun::star::uno::Any& _rOldValue );
virtual void RemoveSelectedRow(RowPos _nRowPos);
virtual ::rtl::OUString GetAccessibleCellText(sal_Int32 _nRowPos, sal_Int32 _nColPos);
::com::sun::star::uno::Sequence< sal_Int32 >& getColumnsForTooltip();
::com::sun::star::uno::Sequence< ::rtl::OUString >& getTextForTooltip();
void setTooltip(const ::com::sun::star::uno::Sequence< ::rtl::OUString >& aText, const ::com::sun::star::uno::Sequence< sal_Int32 >& nCols);
void selectionChanged(bool _bChanged);
protected:
/// retrieves the XAccessible implementation associated with the GridControl instance
::svt::IAccessibleFactory& getAccessibleFactory();
private:
TableControl(); // never implemented
TableControl( const TableControl& ); // never implemented
TableControl& operator=( const TableControl& ); // never implemented
};
class AccessibleTableControl_Impl
{
public:
AccessibleFactoryAccess m_aFactoryAccess;
IAccessibleTableControl* m_pAccessible;
public:
AccessibleTableControl_Impl() : m_pAccessible(NULL)
{
}
/// @see AccessibleTableControl::getTableRowHeader
::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible >
getAccessibleTableHeader( AccessibleTableControlObjType _eObjType );
/// @see AccessibleTableControl::getTable
::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible >
getAccessibleTable( );
};
//........................................................................
} } // namespace svt::table
//........................................................................
#endif // SVTOOLS_INC_TABLE_TABLECONTROL_HXX
|