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