1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski #ifndef SVTOOLS_TABLECONTROL_IMPL_HXX
25*b1cdbd2cSJim Jagielski #define SVTOOLS_TABLECONTROL_IMPL_HXX
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include "svtools/table/tablemodel.hxx"
28*b1cdbd2cSJim Jagielski #include "svtools/table/tablecontrolinterface.hxx"
29*b1cdbd2cSJim Jagielski 
30*b1cdbd2cSJim Jagielski #include "svtaccessiblefactory.hxx"
31*b1cdbd2cSJim Jagielski 
32*b1cdbd2cSJim Jagielski #include <vcl/seleng.hxx>
33*b1cdbd2cSJim Jagielski 
34*b1cdbd2cSJim Jagielski #include <vector>
35*b1cdbd2cSJim Jagielski 
36*b1cdbd2cSJim Jagielski #include <boost/scoped_ptr.hpp>
37*b1cdbd2cSJim Jagielski 
38*b1cdbd2cSJim Jagielski class ScrollBar;
39*b1cdbd2cSJim Jagielski class ScrollBarBox;
40*b1cdbd2cSJim Jagielski 
41*b1cdbd2cSJim Jagielski //........................................................................
42*b1cdbd2cSJim Jagielski namespace svt { namespace table
43*b1cdbd2cSJim Jagielski {
44*b1cdbd2cSJim Jagielski //........................................................................
45*b1cdbd2cSJim Jagielski 
46*b1cdbd2cSJim Jagielski     struct MutableColumnMetrics : protected ColumnMetrics
47*b1cdbd2cSJim Jagielski     {
MutableColumnMetricssvt::table::MutableColumnMetrics48*b1cdbd2cSJim Jagielski         MutableColumnMetrics()
49*b1cdbd2cSJim Jagielski             :ColumnMetrics()
50*b1cdbd2cSJim Jagielski         {
51*b1cdbd2cSJim Jagielski         }
52*b1cdbd2cSJim Jagielski 
MutableColumnMetricssvt::table::MutableColumnMetrics53*b1cdbd2cSJim Jagielski         MutableColumnMetrics( long const i_startPixel, long const i_endPixel )
54*b1cdbd2cSJim Jagielski             :ColumnMetrics( i_startPixel, i_endPixel )
55*b1cdbd2cSJim Jagielski         {
56*b1cdbd2cSJim Jagielski         }
57*b1cdbd2cSJim Jagielski 
getStartsvt::table::MutableColumnMetrics58*b1cdbd2cSJim Jagielski         long getStart() const { return nStartPixel; }
getEndsvt::table::MutableColumnMetrics59*b1cdbd2cSJim Jagielski         long getEnd() const { return nEndPixel; }
60*b1cdbd2cSJim Jagielski 
setEndsvt::table::MutableColumnMetrics61*b1cdbd2cSJim Jagielski         void setEnd( long const i_end ) { nEndPixel = i_end; }
movesvt::table::MutableColumnMetrics62*b1cdbd2cSJim Jagielski         void move( long const i_offset ) { nStartPixel += i_offset; nEndPixel += i_offset; }
63*b1cdbd2cSJim Jagielski 
getWidthsvt::table::MutableColumnMetrics64*b1cdbd2cSJim Jagielski         long getWidth() const { return nEndPixel - nStartPixel; }
65*b1cdbd2cSJim Jagielski 
operator ()svt::table::MutableColumnMetrics66*b1cdbd2cSJim Jagielski         ColumnMetrics const & operator()() { return *this; }
67*b1cdbd2cSJim Jagielski     };
68*b1cdbd2cSJim Jagielski 
69*b1cdbd2cSJim Jagielski     struct ColumnInfoPositionLess
70*b1cdbd2cSJim Jagielski     {
operator ()svt::table::ColumnInfoPositionLess71*b1cdbd2cSJim Jagielski         bool operator()( MutableColumnMetrics const& i_colInfo, long const i_position )
72*b1cdbd2cSJim Jagielski         {
73*b1cdbd2cSJim Jagielski             return i_colInfo.getEnd() < i_position;
74*b1cdbd2cSJim Jagielski         }
operator ()svt::table::ColumnInfoPositionLess75*b1cdbd2cSJim Jagielski         bool operator()( long const i_position, MutableColumnMetrics const& i_colInfo )
76*b1cdbd2cSJim Jagielski         {
77*b1cdbd2cSJim Jagielski             return i_position < i_colInfo.getStart();
78*b1cdbd2cSJim Jagielski         }
79*b1cdbd2cSJim Jagielski     };
80*b1cdbd2cSJim Jagielski 
81*b1cdbd2cSJim Jagielski     typedef ::std::vector< MutableColumnMetrics >    ColumnPositions;
82*b1cdbd2cSJim Jagielski 
83*b1cdbd2cSJim Jagielski     class TableControl;
84*b1cdbd2cSJim Jagielski     class TableDataWindow;
85*b1cdbd2cSJim Jagielski     class TableFunctionSet;
86*b1cdbd2cSJim Jagielski 
87*b1cdbd2cSJim Jagielski     //====================================================================
88*b1cdbd2cSJim Jagielski 	//= TableControl_Impl
89*b1cdbd2cSJim Jagielski 	//====================================================================
90*b1cdbd2cSJim Jagielski     class TableControl_Impl :public ITableControl
91*b1cdbd2cSJim Jagielski                             ,public ITableModelListener
92*b1cdbd2cSJim Jagielski     {
93*b1cdbd2cSJim Jagielski         friend class TableGeometry;
94*b1cdbd2cSJim Jagielski         friend class TableRowGeometry;
95*b1cdbd2cSJim Jagielski         friend class TableColumnGeometry;
96*b1cdbd2cSJim Jagielski         friend class SuspendInvariants;
97*b1cdbd2cSJim Jagielski 
98*b1cdbd2cSJim Jagielski     private:
99*b1cdbd2cSJim Jagielski         /// the control whose impl-instance we implemnt
100*b1cdbd2cSJim Jagielski         TableControl&       	m_rAntiImpl;
101*b1cdbd2cSJim Jagielski         /// the model of the table control
102*b1cdbd2cSJim Jagielski         PTableModel         	m_pModel;
103*b1cdbd2cSJim Jagielski         /// the input handler to use, usually the input handler as provided by ->m_pModel
104*b1cdbd2cSJim Jagielski         PTableInputHandler  	m_pInputHandler;
105*b1cdbd2cSJim Jagielski         /// info about the widths of our columns
106*b1cdbd2cSJim Jagielski         ColumnPositions         m_aColumnWidths;
107*b1cdbd2cSJim Jagielski 
108*b1cdbd2cSJim Jagielski         /// the height of a single row in the table, measured in pixels
109*b1cdbd2cSJim Jagielski         long                	m_nRowHeightPixel;
110*b1cdbd2cSJim Jagielski         /// the height of the column header row in the table, measured in pixels
111*b1cdbd2cSJim Jagielski         long                	m_nColHeaderHeightPixel;
112*b1cdbd2cSJim Jagielski         /// the width of the row header column in the table, measured in pixels
113*b1cdbd2cSJim Jagielski         long                	m_nRowHeaderWidthPixel;
114*b1cdbd2cSJim Jagielski 
115*b1cdbd2cSJim Jagielski         /// the number of columns in the table control. Cached model value.
116*b1cdbd2cSJim Jagielski         TableSize           	m_nColumnCount;
117*b1cdbd2cSJim Jagielski 
118*b1cdbd2cSJim Jagielski         /// the number of rows in the table control. Cached model value.
119*b1cdbd2cSJim Jagielski         TableSize           	m_nRowCount;
120*b1cdbd2cSJim Jagielski 
121*b1cdbd2cSJim Jagielski         /// denotes whether or not the columns fitted into the available width, last time we checked
122*b1cdbd2cSJim Jagielski         long                    m_bColumnsFit;
123*b1cdbd2cSJim Jagielski 
124*b1cdbd2cSJim Jagielski         ColPos              	m_nCurColumn;
125*b1cdbd2cSJim Jagielski         RowPos              	m_nCurRow;
126*b1cdbd2cSJim Jagielski         ColPos              	m_nLeftColumn;
127*b1cdbd2cSJim Jagielski         RowPos              	m_nTopRow;
128*b1cdbd2cSJim Jagielski 
129*b1cdbd2cSJim Jagielski         sal_Int32           	m_nCursorHidden;
130*b1cdbd2cSJim Jagielski 
131*b1cdbd2cSJim Jagielski         /** the window to contain all data content, including header bars
132*b1cdbd2cSJim Jagielski 
133*b1cdbd2cSJim Jagielski             The window's upper left corner is at position (0,0), relative to the
134*b1cdbd2cSJim Jagielski             table control, which is the direct parent of the data window.
135*b1cdbd2cSJim Jagielski         */
136*b1cdbd2cSJim Jagielski         ::boost::scoped_ptr< TableDataWindow >
137*b1cdbd2cSJim Jagielski                                 m_pDataWindow;
138*b1cdbd2cSJim Jagielski         /// the vertical scrollbar, if any
139*b1cdbd2cSJim Jagielski         ScrollBar*          	m_pVScroll;
140*b1cdbd2cSJim Jagielski         /// the horizontal scrollbar, if any
141*b1cdbd2cSJim Jagielski         ScrollBar*              m_pHScroll;
142*b1cdbd2cSJim Jagielski         ScrollBarBox*       	m_pScrollCorner;
143*b1cdbd2cSJim Jagielski 	    //selection engine - for determining selection range, e.g. single, multiple
144*b1cdbd2cSJim Jagielski 	    SelectionEngine*    	m_pSelEngine;
145*b1cdbd2cSJim Jagielski 	    //vector which contains the selected rows
146*b1cdbd2cSJim Jagielski 	    std::vector<RowPos> 	m_aSelectedRows;
147*b1cdbd2cSJim Jagielski 	    //part of selection engine
148*b1cdbd2cSJim Jagielski 	    TableFunctionSet*   	m_pTableFunctionSet;
149*b1cdbd2cSJim Jagielski 	    //part of selection engine
150*b1cdbd2cSJim Jagielski 	    RowPos		    	    m_nAnchor;
151*b1cdbd2cSJim Jagielski         bool                    m_bUpdatingColWidths;
152*b1cdbd2cSJim Jagielski 
153*b1cdbd2cSJim Jagielski     	Link                    m_aSelectHdl;
154*b1cdbd2cSJim Jagielski 
155*b1cdbd2cSJim Jagielski 	    AccessibleFactoryAccess     m_aFactoryAccess;
156*b1cdbd2cSJim Jagielski 	    IAccessibleTableControl*    m_pAccessibleTable;
157*b1cdbd2cSJim Jagielski 
158*b1cdbd2cSJim Jagielski #if DBG_UTIL
159*b1cdbd2cSJim Jagielski     #define INV_SCROLL_POSITION     1
160*b1cdbd2cSJim Jagielski         /** represents a bitmask of invariants to check
161*b1cdbd2cSJim Jagielski 
162*b1cdbd2cSJim Jagielski             Actually, impl_checkInvariants checks more invariants than denoted in this
163*b1cdbd2cSJim Jagielski             bit mask, but only those present here can be disabled temporarily.
164*b1cdbd2cSJim Jagielski         */
165*b1cdbd2cSJim Jagielski         sal_Int32           m_nRequiredInvariants;
166*b1cdbd2cSJim Jagielski #endif
167*b1cdbd2cSJim Jagielski 
168*b1cdbd2cSJim Jagielski     public:
169*b1cdbd2cSJim Jagielski         void        setModel( PTableModel _pModel );
170*b1cdbd2cSJim Jagielski 
getInputHandler() const171*b1cdbd2cSJim Jagielski         inline  const PTableInputHandler&   getInputHandler() const { return m_pInputHandler; }
172*b1cdbd2cSJim Jagielski 
getCurRow() const173*b1cdbd2cSJim Jagielski 		inline	RowPos  getCurRow() const           { return m_nCurRow; }
setCurRow(RowPos i_curRow)174*b1cdbd2cSJim Jagielski 		inline	void	setCurRow( RowPos i_curRow ){ m_nCurRow = i_curRow; }
175*b1cdbd2cSJim Jagielski 
getAnchor() const176*b1cdbd2cSJim Jagielski         RowPos  getAnchor() const { return m_nAnchor; }
setAnchor(RowPos const i_anchor)177*b1cdbd2cSJim Jagielski         void    setAnchor( RowPos const i_anchor ) { m_nAnchor = i_anchor; }
178*b1cdbd2cSJim Jagielski 
getTopRow() const179*b1cdbd2cSJim Jagielski         inline  RowPos  getTopRow() const       { return m_nTopRow; }
getLeftColumn() const180*b1cdbd2cSJim Jagielski         inline  ColPos  getLeftColumn() const { return m_nLeftColumn; }
181*b1cdbd2cSJim Jagielski 
getAntiImpl() const182*b1cdbd2cSJim Jagielski         inline  const TableControl&   getAntiImpl() const { return m_rAntiImpl; }
getAntiImpl()183*b1cdbd2cSJim Jagielski         inline        TableControl&   getAntiImpl()       { return m_rAntiImpl; }
184*b1cdbd2cSJim Jagielski 
185*b1cdbd2cSJim Jagielski     public:
186*b1cdbd2cSJim Jagielski         TableControl_Impl( TableControl& _rAntiImpl );
187*b1cdbd2cSJim Jagielski         ~TableControl_Impl();
188*b1cdbd2cSJim Jagielski 
189*b1cdbd2cSJim Jagielski #if DBG_UTIL
190*b1cdbd2cSJim Jagielski         const sal_Char* impl_checkInvariants() const;
191*b1cdbd2cSJim Jagielski #endif
192*b1cdbd2cSJim Jagielski         /** to be called when the anti-impl instance has been resized
193*b1cdbd2cSJim Jagielski         */
194*b1cdbd2cSJim Jagielski         void    onResize();
195*b1cdbd2cSJim Jagielski 
196*b1cdbd2cSJim Jagielski         /** paints the table control content which intersects with the given rectangle
197*b1cdbd2cSJim Jagielski         */
198*b1cdbd2cSJim Jagielski         void    doPaintContent( const Rectangle& _rUpdateRect );
199*b1cdbd2cSJim Jagielski 
200*b1cdbd2cSJim Jagielski         /** moves the cursor to the cell with the given coordinates
201*b1cdbd2cSJim Jagielski 
202*b1cdbd2cSJim Jagielski             To ease the caller's code, the coordinates must not necessarily denote a
203*b1cdbd2cSJim Jagielski             valid position. If they don't, <FALSE/> will be returned.
204*b1cdbd2cSJim Jagielski         */
205*b1cdbd2cSJim Jagielski         bool    goTo( ColPos _nColumn, RowPos _nRow );
206*b1cdbd2cSJim Jagielski 
207*b1cdbd2cSJim Jagielski         /** ensures that the given coordinate is visible
208*b1cdbd2cSJim Jagielski             @param _nColumn
209*b1cdbd2cSJim Jagielski                 the column position which should be visible. Must be non-negative, and smaller
210*b1cdbd2cSJim Jagielski                 than the column count.
211*b1cdbd2cSJim Jagielski             @param _nRow
212*b1cdbd2cSJim Jagielski                 the row position which should be visibleMust be non-negative, and smaller
213*b1cdbd2cSJim Jagielski                 than the row count.
214*b1cdbd2cSJim Jagielski             @param _bAcceptPartialVisibility
215*b1cdbd2cSJim Jagielski                 <TRUE/> if it's okay that the given cooordinate is only partially visible
216*b1cdbd2cSJim Jagielski         */
217*b1cdbd2cSJim Jagielski         void    ensureVisible( ColPos _nColumn, RowPos _nRow, bool _bAcceptPartialVisibility );
218*b1cdbd2cSJim Jagielski 
219*b1cdbd2cSJim Jagielski         /** retrieves the content of the given cell, converted to a string
220*b1cdbd2cSJim Jagielski         */
221*b1cdbd2cSJim Jagielski         ::rtl::OUString getCellContentAsString( RowPos const i_row, ColPos const i_col );
222*b1cdbd2cSJim Jagielski 
223*b1cdbd2cSJim Jagielski         /** returns the position of the current row in the selection vector */
224*b1cdbd2cSJim Jagielski 	    int	getRowSelectedNumber(const ::std::vector<RowPos>& selectedRows, RowPos current);
225*b1cdbd2cSJim Jagielski 
226*b1cdbd2cSJim Jagielski         /** ??? */
227*b1cdbd2cSJim Jagielski 	    void    invalidateSelectedRegion( RowPos _nPrevRow, RowPos _nCurRow );
228*b1cdbd2cSJim Jagielski 
229*b1cdbd2cSJim Jagielski         /** invalidates the part of the data window which is covered by the given rows
230*b1cdbd2cSJim Jagielski             @param i_firstRow
231*b1cdbd2cSJim Jagielski                 the index of the first row to include in the invalidation
232*b1cdbd2cSJim Jagielski             @param i_lastRow
233*b1cdbd2cSJim Jagielski                 the index of the last row to include in the invalidation, or ROW_INVALID if the invalidation
234*b1cdbd2cSJim Jagielski                 should happen down to the bottom of the data window.
235*b1cdbd2cSJim Jagielski         */
236*b1cdbd2cSJim Jagielski         void    invalidateRowRange( RowPos const i_firstRow, RowPos const i_lastRow );
237*b1cdbd2cSJim Jagielski 
238*b1cdbd2cSJim Jagielski         /** invalidates the part of the data window which is covered by the given row
239*b1cdbd2cSJim Jagielski         */
invalidateRow(RowPos const i_row)240*b1cdbd2cSJim Jagielski         void    invalidateRow( RowPos const i_row ) { invalidateRowRange( i_row, i_row ); }
241*b1cdbd2cSJim Jagielski 
242*b1cdbd2cSJim Jagielski         /** invalidates all selected rows
243*b1cdbd2cSJim Jagielski         */
244*b1cdbd2cSJim Jagielski         void    invalidateSelectedRows();
245*b1cdbd2cSJim Jagielski 
246*b1cdbd2cSJim Jagielski 	    void    checkCursorPosition();
247*b1cdbd2cSJim Jagielski 
hasRowSelection() const248*b1cdbd2cSJim Jagielski         bool    hasRowSelection() const { return !m_aSelectedRows.empty(); }
getSelectedRowCount() const249*b1cdbd2cSJim Jagielski         size_t  getSelectedRowCount() const { return m_aSelectedRows.size(); }
250*b1cdbd2cSJim Jagielski         RowPos  getSelectedRowIndex( size_t const i_selectionIndex ) const;
251*b1cdbd2cSJim Jagielski 
252*b1cdbd2cSJim Jagielski         /** removes the given row index from m_aSelectedRows
253*b1cdbd2cSJim Jagielski 
254*b1cdbd2cSJim Jagielski             @return
255*b1cdbd2cSJim Jagielski                 <TRUE/> if and only if the row was previously marked as selected
256*b1cdbd2cSJim Jagielski         */
257*b1cdbd2cSJim Jagielski         bool        markRowAsDeselected( RowPos const i_rowIndex );
258*b1cdbd2cSJim Jagielski 
259*b1cdbd2cSJim Jagielski         /** marks the given row as selectged, by putting it into m_aSelectedRows
260*b1cdbd2cSJim Jagielski             @return
261*b1cdbd2cSJim Jagielski                 <TRUE/> if and only if the row was previously <em>not</em> marked as selected
262*b1cdbd2cSJim Jagielski         */
263*b1cdbd2cSJim Jagielski         bool        markRowAsSelected( RowPos const i_rowIndex );
264*b1cdbd2cSJim Jagielski 
265*b1cdbd2cSJim Jagielski         /** marks all rows as deselected
266*b1cdbd2cSJim Jagielski             @return
267*b1cdbd2cSJim Jagielski                 <TRUE/> if and only if the selection actually changed by this operation
268*b1cdbd2cSJim Jagielski         */
269*b1cdbd2cSJim Jagielski         bool        markAllRowsAsDeselected();
270*b1cdbd2cSJim Jagielski 
271*b1cdbd2cSJim Jagielski         /** marks all rows as selected
272*b1cdbd2cSJim Jagielski             @return
273*b1cdbd2cSJim Jagielski                 <FALSE/> if and only if all rows were selected already.
274*b1cdbd2cSJim Jagielski         */
275*b1cdbd2cSJim Jagielski         bool        markAllRowsAsSelected();
276*b1cdbd2cSJim Jagielski 
setSelectHandler(Link const & i_selectHandler)277*b1cdbd2cSJim Jagielski         void        setSelectHandler( Link const & i_selectHandler ) { m_aSelectHdl = i_selectHandler; }
getSelectHandler() const278*b1cdbd2cSJim Jagielski         Link const& getSelectHandler() const { return m_aSelectHdl; }
279*b1cdbd2cSJim Jagielski 
280*b1cdbd2cSJim Jagielski         void commitAccessibleEvent( sal_Int16 const i_eventID, const com::sun::star::uno::Any& i_newValue, const com::sun::star::uno::Any& i_oldValue );
281*b1cdbd2cSJim Jagielski         void commitCellEvent( sal_Int16 const i_eventID, const com::sun::star::uno::Any& i_newValue, const com::sun::star::uno::Any& i_oldValue );
282*b1cdbd2cSJim Jagielski         void commitTableEvent( sal_Int16 const i_eventID, const com::sun::star::uno::Any& i_newValue, const com::sun::star::uno::Any& i_oldValue );
283*b1cdbd2cSJim Jagielski 
284*b1cdbd2cSJim Jagielski         // ITableControl
285*b1cdbd2cSJim Jagielski         virtual void                hideCursor();
286*b1cdbd2cSJim Jagielski         virtual void                showCursor();
287*b1cdbd2cSJim Jagielski         virtual bool                dispatchAction( TableControlAction _eAction );
288*b1cdbd2cSJim Jagielski 	    virtual SelectionEngine*    getSelEngine();
289*b1cdbd2cSJim Jagielski         virtual PTableModel         getModel() const;
290*b1cdbd2cSJim Jagielski         virtual ColPos              getCurrentColumn() const;
291*b1cdbd2cSJim Jagielski         virtual RowPos              getCurrentRow() const;
292*b1cdbd2cSJim Jagielski         virtual bool                activateCell( ColPos const i_col, RowPos const i_row );
293*b1cdbd2cSJim Jagielski         virtual ::Size              getTableSizePixel() const;
294*b1cdbd2cSJim Jagielski         virtual void                setPointer( Pointer const & i_pointer );
295*b1cdbd2cSJim Jagielski         virtual void                captureMouse();
296*b1cdbd2cSJim Jagielski         virtual void                releaseMouse();
297*b1cdbd2cSJim Jagielski         virtual void                invalidate( TableArea const i_what );
298*b1cdbd2cSJim Jagielski         virtual long                pixelWidthToAppFont( long const i_pixels ) const;
299*b1cdbd2cSJim Jagielski         virtual void                hideTracking();
300*b1cdbd2cSJim Jagielski         virtual void                showTracking( Rectangle const & i_location, sal_uInt16 const i_flags );
301*b1cdbd2cSJim Jagielski 	    virtual RowPos	            getRowAtPoint( const Point& rPoint ) const;
302*b1cdbd2cSJim Jagielski         virtual ColPos              getColAtPoint( const Point& rPoint ) const;
303*b1cdbd2cSJim Jagielski         virtual TableCell           hitTest( const Point& rPoint ) const;
304*b1cdbd2cSJim Jagielski         virtual ColumnMetrics       getColumnMetrics( ColPos const i_column ) const;
305*b1cdbd2cSJim Jagielski 	    virtual bool                isRowSelected( RowPos i_row ) const;
306*b1cdbd2cSJim Jagielski 
307*b1cdbd2cSJim Jagielski 
308*b1cdbd2cSJim Jagielski         long                        appFontWidthToPixel( long const i_appFontUnits ) const;
309*b1cdbd2cSJim Jagielski 
getDataWindow()310*b1cdbd2cSJim Jagielski         TableDataWindow&        getDataWindow()       { return *m_pDataWindow; }
getDataWindow() const311*b1cdbd2cSJim Jagielski         const TableDataWindow&  getDataWindow() const { return *m_pDataWindow; }
312*b1cdbd2cSJim Jagielski 	    ScrollBar* getHorzScrollbar();
313*b1cdbd2cSJim Jagielski 	    ScrollBar* getVertScrollbar();
314*b1cdbd2cSJim Jagielski 
315*b1cdbd2cSJim Jagielski 	    Rectangle calcHeaderRect( bool bColHeader );
316*b1cdbd2cSJim Jagielski         Rectangle calcHeaderCellRect( bool bColHeader, sal_Int32 nPos );
317*b1cdbd2cSJim Jagielski 	    Rectangle calcTableRect();
318*b1cdbd2cSJim Jagielski         Rectangle calcCellRect( sal_Int32 nRow, sal_Int32 nCol );
319*b1cdbd2cSJim Jagielski 
320*b1cdbd2cSJim Jagielski         // A11Y
321*b1cdbd2cSJim Jagielski         ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible >
322*b1cdbd2cSJim Jagielski                         getAccessible( Window& i_parentWindow );
323*b1cdbd2cSJim Jagielski         void            disposeAccessible();
324*b1cdbd2cSJim Jagielski 
isAccessibleAlive() const325*b1cdbd2cSJim Jagielski         inline bool     isAccessibleAlive() const { return impl_isAccessibleAlive(); }
326*b1cdbd2cSJim Jagielski 
327*b1cdbd2cSJim Jagielski         // ITableModelListener
328*b1cdbd2cSJim Jagielski         virtual void    rowsInserted( RowPos first, RowPos last );
329*b1cdbd2cSJim Jagielski         virtual void    rowsRemoved( RowPos first, RowPos last );
330*b1cdbd2cSJim Jagielski         virtual void    columnInserted( ColPos const i_colIndex );
331*b1cdbd2cSJim Jagielski         virtual void    columnRemoved( ColPos const i_colIndex );
332*b1cdbd2cSJim Jagielski         virtual void    allColumnsRemoved();
333*b1cdbd2cSJim Jagielski         virtual void    cellsUpdated( ColPos const i_firstCol, ColPos i_lastCol, RowPos const i_firstRow, RowPos const i_lastRow );
334*b1cdbd2cSJim Jagielski         virtual void    columnChanged( ColPos const i_column, ColumnAttributeGroup const i_attributeGroup );
335*b1cdbd2cSJim Jagielski         virtual void    tableMetricsChanged();
336*b1cdbd2cSJim Jagielski 
337*b1cdbd2cSJim Jagielski     private:
338*b1cdbd2cSJim Jagielski         bool            impl_isAccessibleAlive() const;
339*b1cdbd2cSJim Jagielski         void            impl_commitAccessibleEvent(
340*b1cdbd2cSJim Jagielski                             sal_Int16 const i_eventID,
341*b1cdbd2cSJim Jagielski                             ::com::sun::star::uno::Any const & i_newValue,
342*b1cdbd2cSJim Jagielski                             ::com::sun::star::uno::Any const & i_oldValue
343*b1cdbd2cSJim Jagielski                         );
344*b1cdbd2cSJim Jagielski 
345*b1cdbd2cSJim Jagielski         /** toggles the cursor visibility
346*b1cdbd2cSJim Jagielski 
347*b1cdbd2cSJim Jagielski             The method is not bound to the classes public invariants, as it's used in
348*b1cdbd2cSJim Jagielski             situations where the they must not necessarily be fullfilled.
349*b1cdbd2cSJim Jagielski         */
350*b1cdbd2cSJim Jagielski         void        impl_ni_doSwitchCursor( bool _bOn );
351*b1cdbd2cSJim Jagielski 
352*b1cdbd2cSJim Jagielski         /** returns the number of visible rows.
353*b1cdbd2cSJim Jagielski 
354*b1cdbd2cSJim Jagielski             @param _bAcceptPartialRow
355*b1cdbd2cSJim Jagielski                 specifies whether a possible only partially visible last row is
356*b1cdbd2cSJim Jagielski                 counted, too.
357*b1cdbd2cSJim Jagielski         */
358*b1cdbd2cSJim Jagielski         TableSize   impl_getVisibleRows( bool _bAcceptPartialRow ) const;
359*b1cdbd2cSJim Jagielski 
360*b1cdbd2cSJim Jagielski         /** returns the number of visible columns
361*b1cdbd2cSJim Jagielski 
362*b1cdbd2cSJim Jagielski             The value may change with different horizontal scroll positions, as
363*b1cdbd2cSJim Jagielski             different columns have different widths. For instance, if your control is
364*b1cdbd2cSJim Jagielski             100 pixels wide, and has three columns of width 50, 50, 100, respectively,
365*b1cdbd2cSJim Jagielski             then this method will return either "2" or "1", depending on which column
366*b1cdbd2cSJim Jagielski             is the first visible one.
367*b1cdbd2cSJim Jagielski 
368*b1cdbd2cSJim Jagielski             @param _bAcceptPartialRow
369*b1cdbd2cSJim Jagielski                 specifies whether a possible only partially visible last row is
370*b1cdbd2cSJim Jagielski                 counted, too.
371*b1cdbd2cSJim Jagielski         */
372*b1cdbd2cSJim Jagielski         TableSize   impl_getVisibleColumns( bool _bAcceptPartialCol ) const;
373*b1cdbd2cSJim Jagielski 
374*b1cdbd2cSJim Jagielski         /** determines the rectangle occupied by the given cell
375*b1cdbd2cSJim Jagielski         */
376*b1cdbd2cSJim Jagielski         void        impl_getCellRect( ColPos _nColumn, RowPos _nRow, Rectangle& _rCellRect ) const;
377*b1cdbd2cSJim Jagielski 
378*b1cdbd2cSJim Jagielski         /** updates all cached model values
379*b1cdbd2cSJim Jagielski 
380*b1cdbd2cSJim Jagielski             The method is not bound to the classes public invariants, as it's used in
381*b1cdbd2cSJim Jagielski             situations where the they must not necessarily be fullfilled.
382*b1cdbd2cSJim Jagielski         */
383*b1cdbd2cSJim Jagielski         void        impl_ni_updateCachedModelValues();
384*b1cdbd2cSJim Jagielski 
385*b1cdbd2cSJim Jagielski         /** updates the cached table metrics (row height etc.)
386*b1cdbd2cSJim Jagielski         */
387*b1cdbd2cSJim Jagielski         void        impl_ni_updateCachedTableMetrics();
388*b1cdbd2cSJim Jagielski 
389*b1cdbd2cSJim Jagielski         /** does a relayout of the table control
390*b1cdbd2cSJim Jagielski 
391*b1cdbd2cSJim Jagielski             Column widths, and consequently the availability of the vertical and horizontal scrollbar, are updated
392*b1cdbd2cSJim Jagielski             with a call to this method.
393*b1cdbd2cSJim Jagielski 
394*b1cdbd2cSJim Jagielski             @param i_assumeInflexibleColumnsUpToIncluding
395*b1cdbd2cSJim Jagielski                 the index of a column up to which all columns should be considered as inflexible, or
396*b1cdbd2cSJim Jagielski                 <code>COL_INVALID</code>.
397*b1cdbd2cSJim Jagielski         */
398*b1cdbd2cSJim Jagielski         void        impl_ni_relayout( ColPos const i_assumeInflexibleColumnsUpToIncluding = COL_INVALID );
399*b1cdbd2cSJim Jagielski 
400*b1cdbd2cSJim Jagielski         /** calculates the new width of our columns, taking into account their min and max widths, and their relative
401*b1cdbd2cSJim Jagielski             flexibility.
402*b1cdbd2cSJim Jagielski 
403*b1cdbd2cSJim Jagielski             @param i_assumeInflexibleColumnsUpToIncluding
404*b1cdbd2cSJim Jagielski                 the index of a column up to which all columns should be considered as inflexible, or
405*b1cdbd2cSJim Jagielski                 <code>COL_INVALID</code>.
406*b1cdbd2cSJim Jagielski 
407*b1cdbd2cSJim Jagielski             @param i_assumeVerticalScrollbar
408*b1cdbd2cSJim Jagielski                 controls whether or not we should assume the presence of a vertical scrollbar. If <true/>, and
409*b1cdbd2cSJim Jagielski                 if the model has a VerticalScrollbarVisibility != ScrollbarShowNever, the method will leave
410*b1cdbd2cSJim Jagielski                 space for a vertical scrollbar.
411*b1cdbd2cSJim Jagielski 
412*b1cdbd2cSJim Jagielski             @return
413*b1cdbd2cSJim Jagielski                 the overall width of the grid, which is available for columns
414*b1cdbd2cSJim Jagielski         */
415*b1cdbd2cSJim Jagielski         long        impl_ni_calculateColumnWidths(
416*b1cdbd2cSJim Jagielski                         ColPos const i_assumeInflexibleColumnsUpToIncluding,
417*b1cdbd2cSJim Jagielski                         bool const i_assumeVerticalScrollbar,
418*b1cdbd2cSJim Jagielski                         ::std::vector< long >& o_newColWidthsPixel
419*b1cdbd2cSJim Jagielski                     ) const;
420*b1cdbd2cSJim Jagielski 
421*b1cdbd2cSJim Jagielski         /** positions all child windows, e.g. the both scrollbars, the corner window, and the data window
422*b1cdbd2cSJim Jagielski         */
423*b1cdbd2cSJim Jagielski         void        impl_ni_positionChildWindows(
424*b1cdbd2cSJim Jagielski                         Rectangle const & i_dataCellPlayground,
425*b1cdbd2cSJim Jagielski                         bool const i_verticalScrollbar,
426*b1cdbd2cSJim Jagielski                         bool const i_horizontalScrollbar
427*b1cdbd2cSJim Jagielski                     );
428*b1cdbd2cSJim Jagielski 
429*b1cdbd2cSJim Jagielski         /** scrolls the view by the given number of rows
430*b1cdbd2cSJim Jagielski 
431*b1cdbd2cSJim Jagielski             The method is not bound to the classes public invariants, as it's used in
432*b1cdbd2cSJim Jagielski             situations where the they must not necessarily be fullfilled.
433*b1cdbd2cSJim Jagielski 
434*b1cdbd2cSJim Jagielski             @return
435*b1cdbd2cSJim Jagielski                 the number of rows by which the viewport was scrolled. This may differ
436*b1cdbd2cSJim Jagielski                 from the given numbers to scroll in case the begin or the end of the
437*b1cdbd2cSJim Jagielski                 row range were reached.
438*b1cdbd2cSJim Jagielski         */
439*b1cdbd2cSJim Jagielski         TableSize   impl_ni_ScrollRows( TableSize _nRowDelta );
440*b1cdbd2cSJim Jagielski 
441*b1cdbd2cSJim Jagielski         /** equivalent to impl_ni_ScrollRows, but checks the instances invariants beforehand (in a non-product build only)
442*b1cdbd2cSJim Jagielski         */
443*b1cdbd2cSJim Jagielski         TableSize   impl_scrollRows( TableSize const i_rowDelta );
444*b1cdbd2cSJim Jagielski 
445*b1cdbd2cSJim Jagielski         /** scrolls the view by the given number of columns
446*b1cdbd2cSJim Jagielski 
447*b1cdbd2cSJim Jagielski             The method is not bound to the classes public invariants, as it's used in
448*b1cdbd2cSJim Jagielski             situations where the they must not necessarily be fullfilled.
449*b1cdbd2cSJim Jagielski 
450*b1cdbd2cSJim Jagielski             @return
451*b1cdbd2cSJim Jagielski                 the number of columns by which the viewport was scrolled. This may differ
452*b1cdbd2cSJim Jagielski                 from the given numbers to scroll in case the begin or the end of the
453*b1cdbd2cSJim Jagielski                 column range were reached.
454*b1cdbd2cSJim Jagielski         */
455*b1cdbd2cSJim Jagielski         TableSize   impl_ni_ScrollColumns( TableSize _nColumnDelta );
456*b1cdbd2cSJim Jagielski 
457*b1cdbd2cSJim Jagielski         /** equivalent to impl_ni_ScrollColumns, but checks the instances invariants beforehand (in a non-product build only)
458*b1cdbd2cSJim Jagielski         */
459*b1cdbd2cSJim Jagielski         TableSize   impl_scrollColumns( TableSize const i_columnDelta );
460*b1cdbd2cSJim Jagielski 
461*b1cdbd2cSJim Jagielski         /** retrieves the area occupied by the totality of (at least partially) visible cells
462*b1cdbd2cSJim Jagielski 
463*b1cdbd2cSJim Jagielski             The returned area includes row and column headers. Also, it takes into
464*b1cdbd2cSJim Jagielski             account the the fact that there might be less columns than would normally
465*b1cdbd2cSJim Jagielski             find room in the control.
466*b1cdbd2cSJim Jagielski 
467*b1cdbd2cSJim Jagielski             As a result of respecting the partial visibility of rows and columns,
468*b1cdbd2cSJim Jagielski             the returned area might be larger than the data window's output size.
469*b1cdbd2cSJim Jagielski         */
470*b1cdbd2cSJim Jagielski         Rectangle   impl_getAllVisibleCellsArea() const;
471*b1cdbd2cSJim Jagielski 
472*b1cdbd2cSJim Jagielski         /** retrieves the area occupied by all (at least partially) visible data cells.
473*b1cdbd2cSJim Jagielski 
474*b1cdbd2cSJim Jagielski             Effectively, the returned area is the same as returned by ->impl_getAllVisibleCellsArea,
475*b1cdbd2cSJim Jagielski             minus the row and column header areas.
476*b1cdbd2cSJim Jagielski         */
477*b1cdbd2cSJim Jagielski         Rectangle   impl_getAllVisibleDataCellArea() const;
478*b1cdbd2cSJim Jagielski 
479*b1cdbd2cSJim Jagielski         /** retrieves the column which covers the given ordinate
480*b1cdbd2cSJim Jagielski         */
481*b1cdbd2cSJim Jagielski         ColPos      impl_getColumnForOrdinate( long const i_ordinate ) const;
482*b1cdbd2cSJim Jagielski 
483*b1cdbd2cSJim Jagielski         /** retrieves the row which covers the given abscissa
484*b1cdbd2cSJim Jagielski         */
485*b1cdbd2cSJim Jagielski         RowPos      impl_getRowForAbscissa( long const i_abscissa ) const;
486*b1cdbd2cSJim Jagielski 
487*b1cdbd2cSJim Jagielski         /// invalidates the window area occupied by the given column
488*b1cdbd2cSJim Jagielski         void        impl_invalidateColumn( ColPos const i_column );
489*b1cdbd2cSJim Jagielski 
490*b1cdbd2cSJim Jagielski         DECL_LINK( OnScroll, ScrollBar* );
491*b1cdbd2cSJim Jagielski         DECL_LINK( OnUpdateScrollbars, void* );
492*b1cdbd2cSJim Jagielski     };
493*b1cdbd2cSJim Jagielski 
494*b1cdbd2cSJim Jagielski 	//see seleng.hxx, seleng.cxx, FunctionSet overridables, part of selection engine
495*b1cdbd2cSJim Jagielski 	class TableFunctionSet : public FunctionSet
496*b1cdbd2cSJim Jagielski 	{
497*b1cdbd2cSJim Jagielski 	private:
498*b1cdbd2cSJim Jagielski 		TableControl_Impl*  m_pTableControl;
499*b1cdbd2cSJim Jagielski 		RowPos              m_nCurrentRow;
500*b1cdbd2cSJim Jagielski 
501*b1cdbd2cSJim Jagielski 	public:
502*b1cdbd2cSJim Jagielski 		TableFunctionSet(TableControl_Impl* _pTableControl);
503*b1cdbd2cSJim Jagielski 		virtual ~TableFunctionSet();
504*b1cdbd2cSJim Jagielski 
505*b1cdbd2cSJim Jagielski 	   virtual void BeginDrag();
506*b1cdbd2cSJim Jagielski 	   virtual void CreateAnchor();
507*b1cdbd2cSJim Jagielski 	   virtual void DestroyAnchor();
508*b1cdbd2cSJim Jagielski 	   virtual sal_Bool SetCursorAtPoint(const Point& rPoint, sal_Bool bDontSelectAtCursor);
509*b1cdbd2cSJim Jagielski 	   virtual sal_Bool IsSelectionAtPoint( const Point& rPoint );
510*b1cdbd2cSJim Jagielski 	   virtual void DeselectAtPoint( const Point& rPoint );
511*b1cdbd2cSJim Jagielski 	   virtual void DeselectAll();
512*b1cdbd2cSJim Jagielski 	};
513*b1cdbd2cSJim Jagielski 
514*b1cdbd2cSJim Jagielski 
515*b1cdbd2cSJim Jagielski //........................................................................
516*b1cdbd2cSJim Jagielski } } // namespace svt::table
517*b1cdbd2cSJim Jagielski //........................................................................
518*b1cdbd2cSJim Jagielski 
519*b1cdbd2cSJim Jagielski #endif // SVTOOLS_TABLECONTROL_IMPL_HXX
520