diff --git a/solenv/clang-format/excludelist b/solenv/clang-format/excludelist index 62afa419ae9b..c9abfc381512 100644 --- a/solenv/clang-format/excludelist +++ b/solenv/clang-format/excludelist @@ -13260,7 +13260,6 @@ toolkit/inc/controls/table/AccessibleGridControlTable.hxx toolkit/inc/controls/table/AccessibleGridControlTableBase.hxx toolkit/inc/controls/table/defaultinputhandler.hxx toolkit/inc/controls/table/gridtablerenderer.hxx -toolkit/inc/controls/table/tablecontrol.hxx toolkit/inc/controls/table/tablecontrolinterface.hxx toolkit/inc/controls/table/tablemodel.hxx toolkit/inc/controls/table/tablerenderer.hxx @@ -13330,7 +13329,6 @@ toolkit/source/controls/table/cellvalueconversion.hxx toolkit/source/controls/table/defaultinputhandler.cxx toolkit/source/controls/table/gridtablerenderer.cxx toolkit/source/controls/table/mousefunction.cxx -toolkit/source/controls/table/tablecontrol.cxx toolkit/source/controls/table/tablecontrol_impl.cxx toolkit/source/controls/table/tablecontrol_impl.hxx toolkit/source/controls/table/tabledatawindow.cxx diff --git a/toolkit/inc/controls/table/tablecontrol.hxx b/toolkit/inc/controls/table/tablecontrol.hxx index b6d3b77b3046..3f6270784a9b 100644 --- a/toolkit/inc/controls/table/tablecontrol.hxx +++ b/toolkit/inc/controls/table/tablecontrol.hxx @@ -29,147 +29,142 @@ enum class AccessibleTableControlObjType { - GRIDCONTROL, /// The GridControl itself. - TABLE, /// The data table. - ROWHEADERBAR, /// The row header bar. - COLUMNHEADERBAR, /// The horizontal column header bar. - TABLECELL, /// A cell of the data table. - ROWHEADERCELL, /// A cell of the row header bar. - COLUMNHEADERCELL, /// A cell of the column header bar. + GRIDCONTROL, /// The GridControl itself. + TABLE, /// The data table. + ROWHEADERBAR, /// The row header bar. + COLUMNHEADERBAR, /// The horizontal column header bar. + TABLECELL, /// A cell of the data table. + ROWHEADERCELL, /// A cell of the row header bar. + COLUMNHEADERCELL, /// A cell of the column header bar. }; namespace svt::table { - class TableControl_Impl; +class TableControl_Impl; - //= TableControl +//= TableControl - /** a basic control which manages table-like data, i.e. a number of cells - organized in m rows and n columns. +/** a basic control which manages table-like data, i.e. a number of cells + organized in m rows and n 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. + 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). + 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 current (or active - cell). + The control supports the concept of a current (or active + cell). +*/ +class TableControl final : public Control +{ +private: + std::shared_ptr m_pImpl; + +public: + TableControl(vcl::Window* _pParent, WinBits _nStyle); + virtual ~TableControl() override; + virtual void dispose() override; + + /// sets a new table model + void SetModel(const PTableModel& _pModel); + /// 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. */ - class TableControl final : public Control - { - private: - std::shared_ptr m_pImpl; + sal_Int32 GetCurrentRow() const; + /** retrieves the current column - public: - TableControl( vcl::Window* _pParent, WinBits _nStyle ); - virtual ~TableControl() override; - virtual void dispose() override; + The current col is the one which contains the active cell. - /// sets a new table model - void SetModel( const PTableModel& _pModel ); - /// retrieves the current table model - PTableModel GetModel() const; + @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; - /** 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. + /** activates the cell at the given position */ - sal_Int32 GetCurrentRow() const; + void GoTo(ColPos _nColumnPos, RowPos _nRow); - /** retrieves the current column + virtual void Resize() override; + void Select(); - 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 - */ - void GoTo( ColPos _nColumnPos, RowPos _nRow); - - virtual void Resize() override; - void Select(); - - /**after removing a row, updates the vector which contains the selected rows + /**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(); - vcl::Window& getDataWindow(); + SelectionEngine* getSelEngine(); + vcl::Window& getDataWindow(); - // Window overridables - virtual void GetFocus() override; - virtual void LoseFocus() override; - virtual void KeyInput( const KeyEvent& rKEvt ) override; - virtual void StateChanged( StateChangedType i_nStateChange ) override; + // Window overridables + virtual void GetFocus() override; + virtual void LoseFocus() override; + virtual void KeyInput(const KeyEvent& rKEvt) override; + virtual void StateChanged(StateChangedType i_nStateChange) override; - /** Creates and returns the accessible object of the whole GridControl. */ - virtual rtl::Reference CreateAccessible() override; - OUString GetAccessibleObjectName(AccessibleTableControlObjType eObjType, - sal_Int32 _nRow, sal_Int32 _nCol) const; - void GoToCell(sal_Int32 _nColumnPos, sal_Int32 _nRow); - OUString - GetAccessibleObjectDescription(AccessibleTableControlObjType eObjType) const; - void FillAccessibleStateSet(sal_Int64& rStateSet, - AccessibleTableControlObjType eObjType) const; + /** Creates and returns the accessible object of the whole GridControl. */ + virtual rtl::Reference CreateAccessible() override; + OUString GetAccessibleObjectName(AccessibleTableControlObjType eObjType, sal_Int32 _nRow, + sal_Int32 _nCol) const; + void GoToCell(sal_Int32 _nColumnPos, sal_Int32 _nRow); + OUString GetAccessibleObjectDescription(AccessibleTableControlObjType eObjType) const; + void FillAccessibleStateSet(sal_Int64& rStateSet, AccessibleTableControlObjType eObjType) const; - // 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. - void commitCellEvent(sal_Int16 const i_eventID, const css::uno::Any& i_newValue, const css::uno::Any& i_oldValue); - void commitTableEvent(sal_Int16 const i_eventID, const css::uno::Any& i_newValue, const css::uno::Any& i_oldValue); + // 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. + void commitCellEvent(sal_Int16 const i_eventID, const css::uno::Any& i_newValue, + const css::uno::Any& i_oldValue); + void commitTableEvent(sal_Int16 const i_eventID, const css::uno::Any& i_newValue, + const css::uno::Any& i_oldValue); - sal_Int32 GetAccessibleControlCount() const; - sal_Int32 GetRowCount() const; - sal_Int32 GetColumnCount() const; - bool ConvertPointToCellAddress(sal_Int32& _rnRow, sal_Int32& _rnColPos, - const Point& _rPoint); - tools::Rectangle calcHeaderRect(bool _bIsColumnBar); - tools::Rectangle calcHeaderCellRect(bool _bIsColumnBar, sal_Int32 nPos); - tools::Rectangle calcTableRect(); - tools::Rectangle calcCellRect(sal_Int32 _nRowPos, sal_Int32 _nColPos); - void FillAccessibleStateSetForCell(sal_Int64& _rStateSet, sal_Int32 _nRow, - sal_uInt16 _nColumnPos) const; - OUString GetRowName(sal_Int32 _nIndex) const; - OUString GetColumnName(sal_Int32 _nIndex) const; - bool HasRowHeader(); - bool HasColHeader(); - OUString GetAccessibleCellText(sal_Int32 _nRowPos, sal_Int32 _nColPos) const; + sal_Int32 GetAccessibleControlCount() const; + sal_Int32 GetRowCount() const; + sal_Int32 GetColumnCount() const; + bool ConvertPointToCellAddress(sal_Int32& _rnRow, sal_Int32& _rnColPos, const Point& _rPoint); + tools::Rectangle calcHeaderRect(bool _bIsColumnBar); + tools::Rectangle calcHeaderCellRect(bool _bIsColumnBar, sal_Int32 nPos); + tools::Rectangle calcTableRect(); + tools::Rectangle calcCellRect(sal_Int32 _nRowPos, sal_Int32 _nColPos); + void FillAccessibleStateSetForCell(sal_Int64& _rStateSet, sal_Int32 _nRow, + sal_uInt16 _nColumnPos) const; + OUString GetRowName(sal_Int32 _nIndex) const; + OUString GetColumnName(sal_Int32 _nIndex) const; + bool HasRowHeader(); + bool HasColHeader(); + OUString GetAccessibleCellText(sal_Int32 _nRowPos, sal_Int32 _nColPos) const; - sal_Int32 GetSelectedRowCount() const; - sal_Int32 GetSelectedRowIndex(sal_Int32 const i_selectionIndex) const; - bool IsRowSelected(sal_Int32 const i_rowIndex) const; - void SelectRow(sal_Int32 const i_rowIndex, bool const i_select); - void SelectAllRows(bool const i_select); + sal_Int32 GetSelectedRowCount() const; + sal_Int32 GetSelectedRowIndex(sal_Int32 const i_selectionIndex) const; + bool IsRowSelected(sal_Int32 const i_rowIndex) const; + void SelectRow(sal_Int32 const i_rowIndex, bool const i_select); + void SelectAllRows(bool const i_select); - TableCell hitTest(const Point& rPoint) const; - void invalidate(const TableArea aArea); + TableCell hitTest(const Point& rPoint) const; + void invalidate(const TableArea aArea); - private: - DECL_LINK( ImplSelectHdl, LinkParamNone*, void ); - - private: - TableControl( const TableControl& ) = delete; - TableControl& operator=( const TableControl& ) = delete; - }; +private: + DECL_LINK(ImplSelectHdl, LinkParamNone*, void); +private: + TableControl(const TableControl&) = delete; + TableControl& operator=(const TableControl&) = delete; +}; } // namespace svt::table - - /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/toolkit/source/controls/table/tablecontrol.cxx b/toolkit/source/controls/table/tablecontrol.cxx index 4cdedc030fc7..af48df1f3815 100644 --- a/toolkit/source/controls/table/tablecontrol.cxx +++ b/toolkit/source/controls/table/tablecontrol.cxx @@ -36,578 +36,486 @@ using namespace ::com::sun::star::accessibility; namespace svt::table { +namespace AccessibleEventId = ::com::sun::star::accessibility::AccessibleEventId; +//= TableControl - namespace AccessibleEventId = ::com::sun::star::accessibility::AccessibleEventId; +TableControl::TableControl(vcl::Window* _pParent, WinBits _nStyle) + : Control(_pParent, _nStyle) + , m_pImpl(std::make_shared(*this)) +{ + TableDataWindow& rDataWindow = m_pImpl->getDataWindow(); + rDataWindow.SetSelectHdl(LINK(this, TableControl, ImplSelectHdl)); + // by default, use the background as determined by the style settings + const Color aWindowColor(GetSettings().GetStyleSettings().GetFieldColor()); + SetBackground(Wallpaper(aWindowColor)); + GetOutDev()->SetFillColor(aWindowColor); - //= TableControl + SetCompoundControl(true); +} +TableControl::~TableControl() { disposeOnce(); } - TableControl::TableControl( vcl::Window* _pParent, WinBits _nStyle ) - :Control( _pParent, _nStyle ) - ,m_pImpl( std::make_shared( *this ) ) +void TableControl::dispose() +{ + CallEventListeners(VclEventId::ObjectDying); + + m_pImpl->setModel(PTableModel()); + m_pImpl->disposeAccessible(); + m_pImpl.reset(); + Control::dispose(); +} + +void TableControl::GetFocus() +{ + if (m_pImpl) + m_pImpl->showCursor(); + + Control::GetFocus(); +} + +void TableControl::LoseFocus() +{ + if (m_pImpl) + m_pImpl->hideCursor(); + + Control::LoseFocus(); +} + +void TableControl::KeyInput(const KeyEvent& rKEvt) +{ + bool bHandled = false; + if (m_pImpl) { - TableDataWindow& rDataWindow = m_pImpl->getDataWindow(); - rDataWindow.SetSelectHdl( LINK( this, TableControl, ImplSelectHdl ) ); + const vcl::KeyCode& rKeyCode = rKEvt.GetKeyCode(); + sal_uInt16 nKeyCode = rKeyCode.GetCode(); - // by default, use the background as determined by the style settings - const Color aWindowColor( GetSettings().GetStyleSettings().GetFieldColor() ); - SetBackground( Wallpaper( aWindowColor ) ); - GetOutDev()->SetFillColor( aWindowColor ); - - SetCompoundControl( true ); - } - - - TableControl::~TableControl() - { - disposeOnce(); - } - - void TableControl::dispose() - { - CallEventListeners( VclEventId::ObjectDying ); - - m_pImpl->setModel( PTableModel() ); - m_pImpl->disposeAccessible(); - m_pImpl.reset(); - Control::dispose(); - } - - - void TableControl::GetFocus() - { - if (m_pImpl) - m_pImpl->showCursor(); - - Control::GetFocus(); - } - - - void TableControl::LoseFocus() - { - if (m_pImpl) - m_pImpl->hideCursor(); - - Control::LoseFocus(); - } - - - void TableControl::KeyInput( const KeyEvent& rKEvt ) - { - bool bHandled = false; - if (m_pImpl) + struct ActionMapEntry { - const vcl::KeyCode& rKeyCode = rKEvt.GetKeyCode(); - sal_uInt16 nKeyCode = rKeyCode.GetCode(); - - struct ActionMapEntry + sal_uInt16 nKeyCode; + sal_uInt16 nKeyModifier; + TableControlAction eAction; + } static const aKnownActions[] + = { { KEY_DOWN, 0, TableControlAction::cursorDown }, + { KEY_UP, 0, TableControlAction::cursorUp }, + { KEY_LEFT, 0, TableControlAction::cursorLeft }, + { KEY_RIGHT, 0, TableControlAction::cursorRight }, + { KEY_HOME, 0, TableControlAction::cursorToLineStart }, + { KEY_END, 0, TableControlAction::cursorToLineEnd }, + { KEY_PAGEUP, 0, TableControlAction::cursorPageUp }, + { KEY_PAGEDOWN, 0, TableControlAction::cursorPageDown }, + { KEY_PAGEUP, KEY_MOD1, TableControlAction::cursorToFirstLine }, + { KEY_PAGEDOWN, KEY_MOD1, TableControlAction::cursorToLastLine }, + { KEY_HOME, KEY_MOD1, TableControlAction::cursorTopLeft }, + { KEY_END, KEY_MOD1, TableControlAction::cursorBottomRight }, + { KEY_SPACE, KEY_MOD1, TableControlAction::cursorSelectRow }, + { KEY_UP, KEY_SHIFT, TableControlAction::cursorSelectRowUp }, + { KEY_DOWN, KEY_SHIFT, TableControlAction::cursorSelectRowDown }, + { KEY_END, KEY_SHIFT, TableControlAction::cursorSelectRowAreaBottom }, + { KEY_HOME, KEY_SHIFT, TableControlAction::cursorSelectRowAreaTop } }; + for (const ActionMapEntry& rAction : aKnownActions) + { + if ((rAction.nKeyCode == nKeyCode) && (rAction.nKeyModifier == rKeyCode.GetModifier())) { - sal_uInt16 nKeyCode; - sal_uInt16 nKeyModifier; - TableControlAction eAction; - } - static const aKnownActions[] = { - { KEY_DOWN, 0, TableControlAction::cursorDown }, - { KEY_UP, 0, TableControlAction::cursorUp }, - { KEY_LEFT, 0, TableControlAction::cursorLeft }, - { KEY_RIGHT, 0, TableControlAction::cursorRight }, - { KEY_HOME, 0, TableControlAction::cursorToLineStart }, - { KEY_END, 0, TableControlAction::cursorToLineEnd }, - { KEY_PAGEUP, 0, TableControlAction::cursorPageUp }, - { KEY_PAGEDOWN, 0, TableControlAction::cursorPageDown }, - { KEY_PAGEUP, KEY_MOD1, TableControlAction::cursorToFirstLine }, - { KEY_PAGEDOWN, KEY_MOD1, TableControlAction::cursorToLastLine }, - { KEY_HOME, KEY_MOD1, TableControlAction::cursorTopLeft }, - { KEY_END, KEY_MOD1, TableControlAction::cursorBottomRight }, - { KEY_SPACE, KEY_MOD1, TableControlAction::cursorSelectRow }, - { KEY_UP, KEY_SHIFT, TableControlAction::cursorSelectRowUp }, - { KEY_DOWN, KEY_SHIFT, TableControlAction::cursorSelectRowDown }, - { KEY_END, KEY_SHIFT, TableControlAction::cursorSelectRowAreaBottom }, - { KEY_HOME, KEY_SHIFT, TableControlAction::cursorSelectRowAreaTop } - }; - for (const ActionMapEntry& rAction : aKnownActions) - { - if ((rAction.nKeyCode == nKeyCode) && (rAction.nKeyModifier == rKeyCode.GetModifier())) - { - bHandled = m_pImpl->dispatchAction(rAction.eAction); - break; - } + bHandled = m_pImpl->dispatchAction(rAction.eAction); + break; } } - - if (!bHandled) - Control::KeyInput( rKEvt ); - else - { - m_pImpl->commitCellEvent( AccessibleEventId::STATE_CHANGED, - Any( AccessibleStateType::FOCUSED ), - Any() - ); - // Huh? What the heck? Why do we unconditionally notify a STATE_CHANGE/FOCUSED after each and every - // (handled) key stroke? - - m_pImpl->commitTableEvent( AccessibleEventId::ACTIVE_DESCENDANT_CHANGED, - Any(), - Any() - ); - // ditto: Why do we notify this unconditionally? We should find the right place to notify the - // ACTIVE_DESCENDANT_CHANGED event. - // Also, we should check if STATE_CHANGED/FOCUSED is really necessary: finally, the children are - // transient, aren't they? - } } - - void TableControl::StateChanged( StateChangedType i_nStateChange ) + if (!bHandled) + Control::KeyInput(rKEvt); + else { - Control::StateChanged( i_nStateChange ); + m_pImpl->commitCellEvent(AccessibleEventId::STATE_CHANGED, + Any(AccessibleStateType::FOCUSED), Any()); + // Huh? What the heck? Why do we unconditionally notify a STATE_CHANGE/FOCUSED after each and every + // (handled) key stroke? - // forward certain settings to the data window - switch ( i_nStateChange ) - { + m_pImpl->commitTableEvent(AccessibleEventId::ACTIVE_DESCENDANT_CHANGED, Any(), Any()); + // ditto: Why do we notify this unconditionally? We should find the right place to notify the + // ACTIVE_DESCENDANT_CHANGED event. + // Also, we should check if STATE_CHANGED/FOCUSED is really necessary: finally, the children are + // transient, aren't they? + } +} + +void TableControl::StateChanged(StateChangedType i_nStateChange) +{ + Control::StateChanged(i_nStateChange); + + // forward certain settings to the data window + switch (i_nStateChange) + { case StateChangedType::ControlFocus: m_pImpl->invalidateSelectedRows(); break; case StateChangedType::ControlBackground: - if ( IsControlBackground() ) - getDataWindow().SetControlBackground( GetControlBackground() ); + if (IsControlBackground()) + getDataWindow().SetControlBackground(GetControlBackground()); else getDataWindow().SetControlBackground(); break; case StateChangedType::ControlForeground: - if ( IsControlForeground() ) - getDataWindow().SetControlForeground( GetControlForeground() ); + if (IsControlForeground()) + getDataWindow().SetControlForeground(GetControlForeground()); else getDataWindow().SetControlForeground(); break; case StateChangedType::ControlFont: - if ( IsControlFont() ) - getDataWindow().SetControlFont( GetControlFont() ); + if (IsControlFont()) + getDataWindow().SetControlFont(GetControlFont()); else getDataWindow().SetControlFont(); break; default:; - } + } +} + +void TableControl::Resize() +{ + Control::Resize(); + m_pImpl->onResize(); +} + +void TableControl::SetModel(const PTableModel& _pModel) { m_pImpl->setModel(_pModel); } + +PTableModel TableControl::GetModel() const { return m_pImpl->getModel(); } + +sal_Int32 TableControl::GetCurrentRow() const { return m_pImpl->getCurrentRow(); } + +sal_Int32 TableControl::GetCurrentColumn() const { return m_pImpl->getCurrentColumn(); } + +void TableControl::GoTo(ColPos _nColumn, RowPos _nRow) { m_pImpl->goTo(_nColumn, _nRow); } + +void TableControl::GoToCell(sal_Int32 _nColPos, sal_Int32 _nRowPos) +{ + m_pImpl->goTo(_nColPos, _nRowPos); +} + +sal_Int32 TableControl::GetSelectedRowCount() const +{ + return sal_Int32(m_pImpl->getSelectedRowCount()); +} + +sal_Int32 TableControl::GetSelectedRowIndex(sal_Int32 const i_selectionIndex) const +{ + return m_pImpl->getSelectedRowIndex(i_selectionIndex); +} + +bool TableControl::IsRowSelected(sal_Int32 const i_rowIndex) const +{ + return m_pImpl->isRowSelected(i_rowIndex); +} + +void TableControl::SelectRow(sal_Int32 const i_rowIndex, bool const i_select) +{ + ENSURE_OR_RETURN_VOID((i_rowIndex >= 0) && (i_rowIndex < m_pImpl->getModel()->getRowCount()), + "TableControl::SelectRow: invalid row index!"); + + if (i_select) + { + if (!m_pImpl->markRowAsSelected(i_rowIndex)) + // nothing to do + return; + } + else + { + m_pImpl->markRowAsDeselected(i_rowIndex); } + m_pImpl->invalidateRowRange(i_rowIndex, i_rowIndex); + Select(); +} - void TableControl::Resize() +void TableControl::SelectAllRows(bool const i_select) +{ + if (i_select) { - Control::Resize(); - m_pImpl->onResize(); + if (!m_pImpl->markAllRowsAsSelected()) + // nothing to do + return; + } + else + { + if (!m_pImpl->markAllRowsAsDeselected()) + // nothing to do + return; } + Invalidate(); + // TODO: can't we do better than this, and invalidate only the rows which changed? + Select(); +} - void TableControl::SetModel( const PTableModel& _pModel ) +SelectionEngine* TableControl::getSelEngine() { return m_pImpl->getSelEngine(); } + +vcl::Window& TableControl::getDataWindow() { return m_pImpl->getDataWindow(); } + +rtl::Reference TableControl::CreateAccessible() +{ + rtl::Reference pParent = GetAccessibleParent(); + return m_pImpl->getAccessible(pParent); +} + +OUString TableControl::GetAccessibleObjectName(AccessibleTableControlObjType eObjType, + sal_Int32 _nRow, sal_Int32 _nCol) const +{ + OUString aRetText; + //Window* pWin; + switch (eObjType) { - m_pImpl->setModel( _pModel ); + case AccessibleTableControlObjType::GRIDCONTROL: + aRetText = "Grid control"; + break; + case AccessibleTableControlObjType::TABLE: + aRetText = "Grid control"; + break; + case AccessibleTableControlObjType::ROWHEADERBAR: + aRetText = "RowHeaderBar"; + break; + case AccessibleTableControlObjType::COLUMNHEADERBAR: + aRetText = "ColumnHeaderBar"; + break; + case AccessibleTableControlObjType::TABLECELL: + //the name of the cell consists of column name and row name if defined + //if the name is equal to cell content, it'll be read twice + if (GetModel()->hasColumnHeaders()) + { + aRetText = GetColumnName(_nCol) + " , "; + } + if (GetModel()->hasRowHeaders()) + { + aRetText += GetRowName(_nRow) + " , "; + } + //aRetText = GetAccessibleCellText(_nRow, _nCol); + break; + case AccessibleTableControlObjType::ROWHEADERCELL: + aRetText = GetRowName(_nRow); + break; + case AccessibleTableControlObjType::COLUMNHEADERCELL: + aRetText = GetColumnName(_nCol); + break; + default: + OSL_FAIL("GridControl::GetAccessibleName: invalid enum!"); } + return aRetText; +} - - PTableModel TableControl::GetModel() const +OUString TableControl::GetAccessibleObjectDescription(AccessibleTableControlObjType eObjType) const +{ + OUString aRetText; + switch (eObjType) { - return m_pImpl->getModel(); + case AccessibleTableControlObjType::GRIDCONTROL: + aRetText = "Grid control description"; + break; + case AccessibleTableControlObjType::TABLE: + aRetText = "TABLE description"; + break; + case AccessibleTableControlObjType::ROWHEADERBAR: + aRetText = "ROWHEADERBAR description"; + break; + case AccessibleTableControlObjType::COLUMNHEADERBAR: + aRetText = "COLUMNHEADERBAR description"; + break; + case AccessibleTableControlObjType::TABLECELL: + // the description of the cell consists of column name and row name if defined + // if the name is equal to cell content, it'll be read twice + if (GetModel()->hasColumnHeaders()) + { + aRetText = GetColumnName(GetCurrentColumn()) + " , "; + } + if (GetModel()->hasRowHeaders()) + { + aRetText += GetRowName(GetCurrentRow()); + } + break; + case AccessibleTableControlObjType::ROWHEADERCELL: + aRetText = "ROWHEADERCELL description"; + break; + case AccessibleTableControlObjType::COLUMNHEADERCELL: + aRetText = "COLUMNHEADERCELL description"; + break; } + return aRetText; +} +OUString TableControl::GetRowName(sal_Int32 _nIndex) const +{ + OUString sRowName; + GetModel()->getRowHeading(_nIndex) >>= sRowName; + return sRowName; +} - sal_Int32 TableControl::GetCurrentRow() const +OUString TableControl::GetColumnName(sal_Int32 _nIndex) const +{ + return GetModel()->getColumnModel(_nIndex)->getName(); +} + +OUString TableControl::GetAccessibleCellText(sal_Int32 _nRowPos, sal_Int32 _nColPos) const +{ + return m_pImpl->getCellContentAsString(_nRowPos, _nColPos); +} + +void TableControl::FillAccessibleStateSet(sal_Int64& rStateSet, + AccessibleTableControlObjType eObjType) const +{ + switch (eObjType) { - return m_pImpl->getCurrentRow(); - } + case AccessibleTableControlObjType::GRIDCONTROL: + case AccessibleTableControlObjType::TABLE: + rStateSet |= AccessibleStateType::FOCUSABLE; - sal_Int32 TableControl::GetCurrentColumn() const - { - return m_pImpl->getCurrentColumn(); - } + if (m_pImpl->getSelEngine()->GetSelectionMode() == SelectionMode::Multiple) + rStateSet |= AccessibleStateType::MULTI_SELECTABLE; + if (HasChildPathFocus()) + rStateSet |= AccessibleStateType::FOCUSED; - void TableControl::GoTo( ColPos _nColumn, RowPos _nRow ) - { - m_pImpl->goTo( _nColumn, _nRow ); - } + if (IsActive()) + rStateSet |= AccessibleStateType::ACTIVE; + if (m_pImpl->getDataWindow().IsEnabled()) + { + rStateSet |= AccessibleStateType::ENABLED; + rStateSet |= AccessibleStateType::SENSITIVE; + } - void TableControl::GoToCell(sal_Int32 _nColPos, sal_Int32 _nRowPos) - { - m_pImpl->goTo( _nColPos, _nRowPos ); - } - - - sal_Int32 TableControl::GetSelectedRowCount() const - { - return sal_Int32( m_pImpl->getSelectedRowCount() ); - } - - - sal_Int32 TableControl::GetSelectedRowIndex( sal_Int32 const i_selectionIndex ) const - { - return m_pImpl->getSelectedRowIndex( i_selectionIndex ); - } - - - bool TableControl::IsRowSelected( sal_Int32 const i_rowIndex ) const - { - return m_pImpl->isRowSelected( i_rowIndex ); - } - - - void TableControl::SelectRow( sal_Int32 const i_rowIndex, bool const i_select ) - { - ENSURE_OR_RETURN_VOID( ( i_rowIndex >= 0 ) && ( i_rowIndex < m_pImpl->getModel()->getRowCount() ), - "TableControl::SelectRow: invalid row index!" ); - - if ( i_select ) - { - if ( !m_pImpl->markRowAsSelected( i_rowIndex ) ) - // nothing to do - return; - } - else - { - m_pImpl->markRowAsDeselected( i_rowIndex ); - } - - m_pImpl->invalidateRowRange( i_rowIndex, i_rowIndex ); - Select(); - } - - - void TableControl::SelectAllRows( bool const i_select ) - { - if ( i_select ) - { - if ( !m_pImpl->markAllRowsAsSelected() ) - // nothing to do - return; - } - else - { - if ( !m_pImpl->markAllRowsAsDeselected() ) - // nothing to do - return; - } - - - Invalidate(); - // TODO: can't we do better than this, and invalidate only the rows which changed? - Select(); - } - - SelectionEngine* TableControl::getSelEngine() - { - return m_pImpl->getSelEngine(); - } - - - vcl::Window& TableControl::getDataWindow() - { - return m_pImpl->getDataWindow(); - } - - - rtl::Reference TableControl::CreateAccessible() - { - rtl::Reference pParent = GetAccessibleParent(); - return m_pImpl->getAccessible(pParent); - } - - OUString TableControl::GetAccessibleObjectName( AccessibleTableControlObjType eObjType, sal_Int32 _nRow, sal_Int32 _nCol) const - { - OUString aRetText; - //Window* pWin; - switch( eObjType ) - { - case AccessibleTableControlObjType::GRIDCONTROL: - aRetText = "Grid control"; - break; - case AccessibleTableControlObjType::TABLE: - aRetText = "Grid control"; - break; - case AccessibleTableControlObjType::ROWHEADERBAR: - aRetText = "RowHeaderBar"; - break; - case AccessibleTableControlObjType::COLUMNHEADERBAR: - aRetText = "ColumnHeaderBar"; - break; - case AccessibleTableControlObjType::TABLECELL: - //the name of the cell consists of column name and row name if defined - //if the name is equal to cell content, it'll be read twice - if(GetModel()->hasColumnHeaders()) - { - aRetText = GetColumnName(_nCol) + " , "; - } - if(GetModel()->hasRowHeaders()) - { - aRetText += GetRowName(_nRow) + " , "; - } - //aRetText = GetAccessibleCellText(_nRow, _nCol); - break; - case AccessibleTableControlObjType::ROWHEADERCELL: - aRetText = GetRowName(_nRow); - break; - case AccessibleTableControlObjType::COLUMNHEADERCELL: - aRetText = GetColumnName(_nCol); - break; - default: - OSL_FAIL("GridControl::GetAccessibleName: invalid enum!"); - } - return aRetText; - } - - - OUString TableControl::GetAccessibleObjectDescription( AccessibleTableControlObjType eObjType ) const - { - OUString aRetText; - switch( eObjType ) - { - case AccessibleTableControlObjType::GRIDCONTROL: - aRetText = "Grid control description"; - break; - case AccessibleTableControlObjType::TABLE: - aRetText = "TABLE description"; - break; - case AccessibleTableControlObjType::ROWHEADERBAR: - aRetText = "ROWHEADERBAR description"; - break; - case AccessibleTableControlObjType::COLUMNHEADERBAR: - aRetText = "COLUMNHEADERBAR description"; - break; - case AccessibleTableControlObjType::TABLECELL: - // the description of the cell consists of column name and row name if defined - // if the name is equal to cell content, it'll be read twice - if ( GetModel()->hasColumnHeaders() ) - { - aRetText = GetColumnName( GetCurrentColumn() ) + " , "; - } - if ( GetModel()->hasRowHeaders() ) - { - aRetText += GetRowName( GetCurrentRow() ); - } - break; - case AccessibleTableControlObjType::ROWHEADERCELL: - aRetText = "ROWHEADERCELL description"; - break; - case AccessibleTableControlObjType::COLUMNHEADERCELL: - aRetText = "COLUMNHEADERCELL description"; - break; - } - return aRetText; - } - - - OUString TableControl::GetRowName( sal_Int32 _nIndex) const - { - OUString sRowName; - GetModel()->getRowHeading( _nIndex ) >>= sRowName; - return sRowName; - } - - - OUString TableControl::GetColumnName( sal_Int32 _nIndex) const - { - return GetModel()->getColumnModel(_nIndex)->getName(); - } - - - OUString TableControl::GetAccessibleCellText( sal_Int32 _nRowPos, sal_Int32 _nColPos) const - { - return m_pImpl->getCellContentAsString( _nRowPos, _nColPos ); - } - - - void TableControl::FillAccessibleStateSet( - sal_Int64& rStateSet, - AccessibleTableControlObjType eObjType ) const - { - switch( eObjType ) - { - case AccessibleTableControlObjType::GRIDCONTROL: - case AccessibleTableControlObjType::TABLE: - - rStateSet |= AccessibleStateType::FOCUSABLE; - - if ( m_pImpl->getSelEngine()->GetSelectionMode() == SelectionMode::Multiple ) - rStateSet |= AccessibleStateType::MULTI_SELECTABLE; - - if ( HasChildPathFocus() ) - rStateSet |= AccessibleStateType::FOCUSED; - - if ( IsActive() ) - rStateSet |= AccessibleStateType::ACTIVE; - - if ( m_pImpl->getDataWindow().IsEnabled() ) - { - rStateSet |= AccessibleStateType::ENABLED; - rStateSet |= AccessibleStateType::SENSITIVE; - } - - if ( IsReallyVisible() ) - rStateSet |= AccessibleStateType::VISIBLE; - - if ( eObjType == AccessibleTableControlObjType::TABLE ) - rStateSet |= AccessibleStateType::MANAGES_DESCENDANTS; - break; - - case AccessibleTableControlObjType::COLUMNHEADERBAR: - case AccessibleTableControlObjType::ROWHEADERBAR: + if (IsReallyVisible()) rStateSet |= AccessibleStateType::VISIBLE; + + if (eObjType == AccessibleTableControlObjType::TABLE) rStateSet |= AccessibleStateType::MANAGES_DESCENDANTS; - break; + break; - case AccessibleTableControlObjType::TABLECELL: - { - rStateSet |= AccessibleStateType::FOCUSABLE; - if ( HasChildPathFocus() ) - rStateSet |= AccessibleStateType::FOCUSED; - rStateSet |= AccessibleStateType::ACTIVE; - rStateSet |= AccessibleStateType::TRANSIENT; - rStateSet |= AccessibleStateType::SELECTABLE; - rStateSet |= AccessibleStateType::VISIBLE; - rStateSet |= AccessibleStateType::SHOWING; - if ( IsRowSelected( GetCurrentRow() ) ) - // Hmm? Wouldn't we expect the affected row to be a parameter to this function? - rStateSet |= AccessibleStateType::SELECTED; - } - break; + case AccessibleTableControlObjType::COLUMNHEADERBAR: + case AccessibleTableControlObjType::ROWHEADERBAR: + rStateSet |= AccessibleStateType::VISIBLE; + rStateSet |= AccessibleStateType::MANAGES_DESCENDANTS; + break; - case AccessibleTableControlObjType::ROWHEADERCELL: - rStateSet |= AccessibleStateType::VISIBLE; - rStateSet |= AccessibleStateType::TRANSIENT; - break; - - case AccessibleTableControlObjType::COLUMNHEADERCELL: - rStateSet |= AccessibleStateType::VISIBLE; - break; + case AccessibleTableControlObjType::TABLECELL: + { + rStateSet |= AccessibleStateType::FOCUSABLE; + if (HasChildPathFocus()) + rStateSet |= AccessibleStateType::FOCUSED; + rStateSet |= AccessibleStateType::ACTIVE; + rStateSet |= AccessibleStateType::TRANSIENT; + rStateSet |= AccessibleStateType::SELECTABLE; + rStateSet |= AccessibleStateType::VISIBLE; + rStateSet |= AccessibleStateType::SHOWING; + if (IsRowSelected(GetCurrentRow())) + // Hmm? Wouldn't we expect the affected row to be a parameter to this function? + rStateSet |= AccessibleStateType::SELECTED; } + break; + + case AccessibleTableControlObjType::ROWHEADERCELL: + rStateSet |= AccessibleStateType::VISIBLE; + rStateSet |= AccessibleStateType::TRANSIENT; + break; + + case AccessibleTableControlObjType::COLUMNHEADERCELL: + rStateSet |= AccessibleStateType::VISIBLE; + break; } +} - void TableControl::commitCellEvent(sal_Int16 const i_eventID, const Any& i_newValue, const Any& i_oldValue) - { - m_pImpl->commitCellEvent( i_eventID, i_newValue, i_oldValue ); - } +void TableControl::commitCellEvent(sal_Int16 const i_eventID, const Any& i_newValue, + const Any& i_oldValue) +{ + m_pImpl->commitCellEvent(i_eventID, i_newValue, i_oldValue); +} - void TableControl::commitTableEvent(sal_Int16 const i_eventID, const Any& i_newValue, const Any& i_oldValue) - { - m_pImpl->commitTableEvent( i_eventID, i_newValue, i_oldValue ); - } +void TableControl::commitTableEvent(sal_Int16 const i_eventID, const Any& i_newValue, + const Any& i_oldValue) +{ + m_pImpl->commitTableEvent(i_eventID, i_newValue, i_oldValue); +} - bool TableControl::HasRowHeader() - { - return GetModel()->hasRowHeaders(); - } +bool TableControl::HasRowHeader() { return GetModel()->hasRowHeaders(); } +bool TableControl::HasColHeader() { return GetModel()->hasColumnHeaders(); } - bool TableControl::HasColHeader() - { - return GetModel()->hasColumnHeaders(); - } +sal_Int32 TableControl::GetAccessibleControlCount() const +{ + // TC_TABLE is always defined, no matter whether empty or not + sal_Int32 count = 1; + if (GetModel()->hasRowHeaders()) + ++count; + if (GetModel()->hasColumnHeaders()) + ++count; + return count; +} +sal_Int32 TableControl::GetRowCount() const { return GetModel()->getRowCount(); } - sal_Int32 TableControl::GetAccessibleControlCount() const - { - // TC_TABLE is always defined, no matter whether empty or not - sal_Int32 count = 1; - if ( GetModel()->hasRowHeaders() ) - ++count; - if ( GetModel()->hasColumnHeaders() ) - ++count; - return count; - } +sal_Int32 TableControl::GetColumnCount() const { return GetModel()->getColumnCount(); } - sal_Int32 TableControl::GetRowCount() const - { - return GetModel()->getRowCount(); - } +bool TableControl::ConvertPointToCellAddress(sal_Int32& _rnRow, sal_Int32& _rnColPos, + const Point& _rPoint) +{ + _rnRow = m_pImpl->getRowAtPoint(_rPoint); + _rnColPos = m_pImpl->getColAtPoint(_rPoint); + return _rnRow >= 0; +} +void TableControl::FillAccessibleStateSetForCell(sal_Int64& _rStateSet, sal_Int32 _nRow, + sal_uInt16) const +{ + if (IsRowSelected(_nRow)) + _rStateSet |= AccessibleStateType::SELECTED; + if (HasChildPathFocus()) + _rStateSet |= AccessibleStateType::FOCUSED; + else // only transient when column is not focused + _rStateSet |= AccessibleStateType::TRANSIENT; - sal_Int32 TableControl::GetColumnCount() const - { - return GetModel()->getColumnCount(); - } + _rStateSet |= AccessibleStateType::VISIBLE; + _rStateSet |= AccessibleStateType::SHOWING; + _rStateSet |= AccessibleStateType::ENABLED; + _rStateSet |= AccessibleStateType::SENSITIVE; + _rStateSet |= AccessibleStateType::ACTIVE; +} +tools::Rectangle TableControl::calcHeaderRect(bool _bIsColumnBar) +{ + return m_pImpl->calcHeaderRect(_bIsColumnBar); +} - bool TableControl::ConvertPointToCellAddress( sal_Int32& _rnRow, sal_Int32& _rnColPos, const Point& _rPoint ) - { - _rnRow = m_pImpl->getRowAtPoint( _rPoint ); - _rnColPos = m_pImpl->getColAtPoint( _rPoint ); - return _rnRow >= 0; - } +tools::Rectangle TableControl::calcHeaderCellRect(bool _bIsColumnBar, sal_Int32 nPos) +{ + return m_pImpl->calcHeaderCellRect(_bIsColumnBar, nPos); +} +tools::Rectangle TableControl::calcTableRect() { return m_pImpl->calcTableRect(); } - void TableControl::FillAccessibleStateSetForCell( sal_Int64& _rStateSet, sal_Int32 _nRow, sal_uInt16 ) const - { - if ( IsRowSelected( _nRow ) ) - _rStateSet |= AccessibleStateType::SELECTED; - if ( HasChildPathFocus() ) - _rStateSet |= AccessibleStateType::FOCUSED; - else // only transient when column is not focused - _rStateSet |= AccessibleStateType::TRANSIENT; +tools::Rectangle TableControl::calcCellRect(sal_Int32 _nRowPos, sal_Int32 _nColPos) +{ + return m_pImpl->calcCellRect(_nRowPos, _nColPos); +} - _rStateSet |= AccessibleStateType::VISIBLE; - _rStateSet |= AccessibleStateType::SHOWING; - _rStateSet |= AccessibleStateType::ENABLED; - _rStateSet |= AccessibleStateType::SENSITIVE; - _rStateSet |= AccessibleStateType::ACTIVE; - } +IMPL_LINK_NOARG(TableControl, ImplSelectHdl, LinkParamNone*, void) { Select(); } +void TableControl::Select() +{ + ImplCallEventListenersAndHandler(VclEventId::TableRowSelect, nullptr); + m_pImpl->commitAccessibleEvent(AccessibleEventId::SELECTION_CHANGED); - tools::Rectangle TableControl::calcHeaderRect(bool _bIsColumnBar ) - { - return m_pImpl->calcHeaderRect(_bIsColumnBar); - } + m_pImpl->commitTableEvent(AccessibleEventId::ACTIVE_DESCENDANT_CHANGED, Any(), Any()); + // TODO: why do we notify this when the *selection* changed? Shouldn't we find a better place for this, + // actually, when the active descendant, i.e. the current cell, *really* changed? +} +TableCell TableControl::hitTest(const Point& rPoint) const { return m_pImpl->hitTest(rPoint); } - tools::Rectangle TableControl::calcHeaderCellRect( bool _bIsColumnBar, sal_Int32 nPos ) - { - return m_pImpl->calcHeaderCellRect( _bIsColumnBar, nPos ); - } - - - tools::Rectangle TableControl::calcTableRect() - { - return m_pImpl->calcTableRect(); - } - - - tools::Rectangle TableControl::calcCellRect( sal_Int32 _nRowPos, sal_Int32 _nColPos ) - { - return m_pImpl->calcCellRect( _nRowPos, _nColPos ); - } - - - IMPL_LINK_NOARG(TableControl, ImplSelectHdl, LinkParamNone*, void) - { - Select(); - } - - - void TableControl::Select() - { - ImplCallEventListenersAndHandler( VclEventId::TableRowSelect, nullptr ); - m_pImpl->commitAccessibleEvent( AccessibleEventId::SELECTION_CHANGED ); - - m_pImpl->commitTableEvent( AccessibleEventId::ACTIVE_DESCENDANT_CHANGED, Any(), Any() ); - // TODO: why do we notify this when the *selection* changed? Shouldn't we find a better place for this, - // actually, when the active descendant, i.e. the current cell, *really* changed? - } - - TableCell TableControl::hitTest(const Point& rPoint) const - { - return m_pImpl->hitTest(rPoint); - } - - void TableControl::invalidate(const TableArea aArea) - { - return m_pImpl->invalidate(aArea); - } +void TableControl::invalidate(const TableArea aArea) { return m_pImpl->invalidate(aArea); } } // namespace svt::table - /* vim:set shiftwidth=4 softtabstop=4 expandtab: */