Make TAB behaviour in wxGrid more configurable.
Allow making TAB/Shift-TAB wrap to the next/previous row or going to the next/previous control when the cursor is at the end/beginning of the current row easily. Also add wxEVT_GRID_TABBING event to allow customizing TAB behaviour even further. Update the sample to show the different possible standard behaviours and a stupid example of a custom one (it would be probably more useful to implement something a tad more realistic, e.g. tabbing to the next non-empty cell). Closes #14711. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@72672 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
		| @@ -567,6 +567,7 @@ All (GUI): | |||||||
| - Add support for wxALWAYS_SHOW_SB style to wxScrolled<> (Catalin Raceanu). | - Add support for wxALWAYS_SHOW_SB style to wxScrolled<> (Catalin Raceanu). | ||||||
| - Add wxTreeCtrl::EnableBellOnNoMatch() (Jonathan Dagresta). | - Add wxTreeCtrl::EnableBellOnNoMatch() (Jonathan Dagresta). | ||||||
| - Implement incremental search in wxGenericListCtrl (Jonathan Dagresta). | - Implement incremental search in wxGenericListCtrl (Jonathan Dagresta). | ||||||
|  | - Make TAB behaviour in wxGrid more flexible (Fulvio Senore). | ||||||
|  |  | ||||||
| wxGTK: | wxGTK: | ||||||
|  |  | ||||||
|   | |||||||
| @@ -918,6 +918,15 @@ public: | |||||||
|         wxGridSelectRowsOrColumns = wxGridSelectRows | wxGridSelectColumns |         wxGridSelectRowsOrColumns = wxGridSelectRows | wxGridSelectColumns | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
|  |     // Different behaviour of the TAB key when the end (or the beginning, for | ||||||
|  |     // Shift-TAB) of the current row is reached: | ||||||
|  |     enum TabBehaviour | ||||||
|  |     { | ||||||
|  |         Tab_Stop,   // Do nothing, this is default. | ||||||
|  |         Tab_Wrap,   // Move to the next (or previous) row. | ||||||
|  |         Tab_Leave   // Move to the next (or previous) control. | ||||||
|  |     }; | ||||||
|  |  | ||||||
|     // creation and destruction |     // creation and destruction | ||||||
|     // ------------------------ |     // ------------------------ | ||||||
|  |  | ||||||
| @@ -1172,6 +1181,8 @@ public: | |||||||
|     bool MoveCursorLeftBlock( bool expandSelection ); |     bool MoveCursorLeftBlock( bool expandSelection ); | ||||||
|     bool MoveCursorRightBlock( bool expandSelection ); |     bool MoveCursorRightBlock( bool expandSelection ); | ||||||
|  |  | ||||||
|  |     void SetTabBehaviour(TabBehaviour behaviour) { m_tabBehaviour = behaviour; } | ||||||
|  |  | ||||||
|  |  | ||||||
|     // ------ label and gridline formatting |     // ------ label and gridline formatting | ||||||
|     // |     // | ||||||
| @@ -2074,6 +2085,8 @@ protected: | |||||||
|     bool       m_editable;              // applies to whole grid |     bool       m_editable;              // applies to whole grid | ||||||
|     bool       m_cellEditCtrlEnabled;   // is in-place edit currently shown? |     bool       m_cellEditCtrlEnabled;   // is in-place edit currently shown? | ||||||
|  |  | ||||||
|  |     TabBehaviour m_tabBehaviour;        // determines how the TAB key behaves | ||||||
|  |  | ||||||
|     void Init();        // common part of all ctors |     void Init();        // common part of all ctors | ||||||
|     void Create(); |     void Create(); | ||||||
|     void CreateColumnWindow(); |     void CreateColumnWindow(); | ||||||
| @@ -2241,6 +2254,8 @@ private: | |||||||
|     void DoEndDragResizeCol(const wxMouseEvent& event); |     void DoEndDragResizeCol(const wxMouseEvent& event); | ||||||
|     void DoEndMoveCol(int pos); |     void DoEndMoveCol(int pos); | ||||||
|  |  | ||||||
|  |     // process a TAB keypress | ||||||
|  |     void DoGridProcessTab(wxKeyboardState& kbdState); | ||||||
|  |  | ||||||
|     // common implementations of methods defined for both rows and columns |     // common implementations of methods defined for both rows and columns | ||||||
|     void DeselectLine(int line, const wxGridOperations& oper); |     void DeselectLine(int line, const wxGridOperations& oper); | ||||||
| @@ -2598,6 +2613,7 @@ wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_GRID_EDITOR_CREATED, wxGridEdit | |||||||
| wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_GRID_CELL_BEGIN_DRAG, wxGridEvent ); | wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_GRID_CELL_BEGIN_DRAG, wxGridEvent ); | ||||||
| wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_GRID_COL_MOVE, wxGridEvent ); | wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_GRID_COL_MOVE, wxGridEvent ); | ||||||
| wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_GRID_COL_SORT, wxGridEvent ); | wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_GRID_COL_SORT, wxGridEvent ); | ||||||
|  | wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_GRID_TABBING, wxGridEvent ); | ||||||
|  |  | ||||||
| typedef void (wxEvtHandler::*wxGridEventFunction)(wxGridEvent&); | typedef void (wxEvtHandler::*wxGridEventFunction)(wxGridEvent&); | ||||||
| typedef void (wxEvtHandler::*wxGridSizeEventFunction)(wxGridSizeEvent&); | typedef void (wxEvtHandler::*wxGridSizeEventFunction)(wxGridSizeEvent&); | ||||||
| @@ -2648,6 +2664,7 @@ typedef void (wxEvtHandler::*wxGridEditorCreatedEventFunction)(wxGridEditorCreat | |||||||
| #define EVT_GRID_CMD_EDITOR_HIDDEN(id, fn)       wx__DECLARE_GRIDEVT(EDITOR_HIDDEN, id, fn) | #define EVT_GRID_CMD_EDITOR_HIDDEN(id, fn)       wx__DECLARE_GRIDEVT(EDITOR_HIDDEN, id, fn) | ||||||
| #define EVT_GRID_CMD_EDITOR_CREATED(id, fn)      wx__DECLARE_GRIDEDITOREVT(EDITOR_CREATED, id, fn) | #define EVT_GRID_CMD_EDITOR_CREATED(id, fn)      wx__DECLARE_GRIDEDITOREVT(EDITOR_CREATED, id, fn) | ||||||
| #define EVT_GRID_CMD_CELL_BEGIN_DRAG(id, fn)     wx__DECLARE_GRIDEVT(CELL_BEGIN_DRAG, id, fn) | #define EVT_GRID_CMD_CELL_BEGIN_DRAG(id, fn)     wx__DECLARE_GRIDEVT(CELL_BEGIN_DRAG, id, fn) | ||||||
|  | #define EVT_GRID_CMD_TABBING(id, fn)             wx__DECLARE_GRIDEVT(TABBING, id, fn) | ||||||
|  |  | ||||||
| // same as above but for any id (exists mainly for backwards compatibility but | // same as above but for any id (exists mainly for backwards compatibility but | ||||||
| // then it's also true that you rarely have multiple grid in the same window) | // then it's also true that you rarely have multiple grid in the same window) | ||||||
| @@ -2671,6 +2688,7 @@ typedef void (wxEvtHandler::*wxGridEditorCreatedEventFunction)(wxGridEditorCreat | |||||||
| #define EVT_GRID_EDITOR_HIDDEN(fn)       EVT_GRID_CMD_EDITOR_HIDDEN(wxID_ANY, fn) | #define EVT_GRID_EDITOR_HIDDEN(fn)       EVT_GRID_CMD_EDITOR_HIDDEN(wxID_ANY, fn) | ||||||
| #define EVT_GRID_EDITOR_CREATED(fn)      EVT_GRID_CMD_EDITOR_CREATED(wxID_ANY, fn) | #define EVT_GRID_EDITOR_CREATED(fn)      EVT_GRID_CMD_EDITOR_CREATED(wxID_ANY, fn) | ||||||
| #define EVT_GRID_CELL_BEGIN_DRAG(fn)     EVT_GRID_CMD_CELL_BEGIN_DRAG(wxID_ANY, fn) | #define EVT_GRID_CELL_BEGIN_DRAG(fn)     EVT_GRID_CMD_CELL_BEGIN_DRAG(wxID_ANY, fn) | ||||||
|  | #define EVT_GRID_TABBING(fn)             EVT_GRID_CMD_TABBING(wxID_ANY, fn) | ||||||
|  |  | ||||||
| // we used to have a single wxEVT_GRID_CELL_CHANGE event but it was split into | // we used to have a single wxEVT_GRID_CELL_CHANGE event but it was split into | ||||||
| // wxEVT_GRID_CELL_CHANGING and CHANGED ones in wx 2.9.0, however the CHANGED | // wxEVT_GRID_CELL_CHANGING and CHANGED ones in wx 2.9.0, however the CHANGED | ||||||
|   | |||||||
| @@ -1894,6 +1894,29 @@ public: | |||||||
|                               wxGRID_DRAW_BOX_RECT |                               wxGRID_DRAW_BOX_RECT | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |         Constants defining different support built-in TAB handling behaviours. | ||||||
|  |  | ||||||
|  |         The elements of this enum determine what happens when TAB is pressed | ||||||
|  |         when the cursor is in the rightmost column (or Shift-TAB is pressed | ||||||
|  |         when the cursor is in the leftmost one). | ||||||
|  |  | ||||||
|  |         @see SetTabBehaviour(), @c wxEVT_GRID_TABBING | ||||||
|  |  | ||||||
|  |         @since 2.9.5 | ||||||
|  |      */ | ||||||
|  |     enum TabBehaviour | ||||||
|  |     { | ||||||
|  |         /// Do nothing, this is default. | ||||||
|  |         Tab_Stop, | ||||||
|  |  | ||||||
|  |         /// Move to the beginning of the next (or the end of the previous) row. | ||||||
|  |         Tab_Wrap, | ||||||
|  |  | ||||||
|  |         /// Move to the next (or the previous) control after the grid. | ||||||
|  |         Tab_Leave | ||||||
|  |     }; | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|         @name Constructors and Initialization |         @name Constructors and Initialization | ||||||
|      */ |      */ | ||||||
| @@ -3469,6 +3492,25 @@ public: | |||||||
|     */ |     */ | ||||||
|     void SetGridCursor(const wxGridCellCoords& coords); |     void SetGridCursor(const wxGridCellCoords& coords); | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |         Set the grid's behaviour when the user presses the TAB key. | ||||||
|  |  | ||||||
|  |         Pressing the TAB key moves the grid cursor right in the current row, if | ||||||
|  |         there is a cell at the right and, similarly, Shift-TAB moves the cursor | ||||||
|  |         to the left in the current row if it's not in the first column. | ||||||
|  |  | ||||||
|  |         What happens if the cursor can't be moved because it it's already at | ||||||
|  |         the beginning or end of the row can be configured using this function, | ||||||
|  |         see wxGrid::TabBehaviour documentation for the detailed description. | ||||||
|  |  | ||||||
|  |         IF none of the standard behaviours is appropriate, you can always | ||||||
|  |         handle @c wxEVT_GRID_TABBING event directly to implement a custom | ||||||
|  |         TAB-handling logic. | ||||||
|  |  | ||||||
|  |         @since 2.9.5 | ||||||
|  |     */ | ||||||
|  |     void SetTabBehaviour(TabBehaviour behaviour); | ||||||
|  |  | ||||||
|     //@} |     //@} | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -4462,6 +4504,12 @@ public: | |||||||
|         and updates the column to indicate the new sort order and refreshes |         and updates the column to indicate the new sort order and refreshes | ||||||
|         itself. |         itself. | ||||||
|         This event macro corresponds to @c wxEVT_GRID_COL_SORT event type. |         This event macro corresponds to @c wxEVT_GRID_COL_SORT event type. | ||||||
|  |     @event{EVT_GRID_TABBING(func)} | ||||||
|  |         This event is generated when the user presses TAB or Shift-TAB in the | ||||||
|  |         grid. It can be used to customize the simple default TAB handling | ||||||
|  |         logic, e.g. to go to the next non-empty cell instead of just the next | ||||||
|  |         cell. See also wxGrid::SetTabBehaviour(). This event is new since | ||||||
|  |         wxWidgets 2.9.5. | ||||||
|     @endEventTable |     @endEventTable | ||||||
|  |  | ||||||
|     @library{wxadv} |     @library{wxadv} | ||||||
|   | |||||||
| @@ -160,6 +160,8 @@ BEGIN_EVENT_TABLE( GridFrame, wxFrame ) | |||||||
|     EVT_MENU( ID_COLNATIVEHEADER, GridFrame::SetNativeColHeader ) |     EVT_MENU( ID_COLNATIVEHEADER, GridFrame::SetNativeColHeader ) | ||||||
|     EVT_MENU( ID_COLDEFAULTHEADER, GridFrame::SetDefaultColHeader ) |     EVT_MENU( ID_COLDEFAULTHEADER, GridFrame::SetDefaultColHeader ) | ||||||
|     EVT_MENU( ID_COLCUSTOMHEADER, GridFrame::SetCustomColHeader ) |     EVT_MENU( ID_COLCUSTOMHEADER, GridFrame::SetCustomColHeader ) | ||||||
|  |     EVT_MENU_RANGE( ID_TAB_STOP, ID_TAB_LEAVE, GridFrame::SetTabBehaviour ) | ||||||
|  |     EVT_MENU( ID_TAB_CUSTOM, GridFrame::SetTabCustomHandler ) | ||||||
|     EVT_MENU( ID_TOGGLEGRIDLINES, GridFrame::ToggleGridLines ) |     EVT_MENU( ID_TOGGLEGRIDLINES, GridFrame::ToggleGridLines ) | ||||||
|     EVT_MENU( ID_AUTOSIZECOLS, GridFrame::AutoSizeCols ) |     EVT_MENU( ID_AUTOSIZECOLS, GridFrame::AutoSizeCols ) | ||||||
|     EVT_MENU( ID_CELLOVERFLOW, GridFrame::CellOverflow ) |     EVT_MENU( ID_CELLOVERFLOW, GridFrame::CellOverflow ) | ||||||
| @@ -320,6 +322,12 @@ GridFrame::GridFrame() | |||||||
|     colHeaderMenu->AppendRadioItem( ID_COLNATIVEHEADER, wxT("&Native") ); |     colHeaderMenu->AppendRadioItem( ID_COLNATIVEHEADER, wxT("&Native") ); | ||||||
|     colHeaderMenu->AppendRadioItem( ID_COLCUSTOMHEADER, wxT("&Custom") ); |     colHeaderMenu->AppendRadioItem( ID_COLCUSTOMHEADER, wxT("&Custom") ); | ||||||
|  |  | ||||||
|  |     wxMenu *tabBehaviourMenu = new wxMenu; | ||||||
|  |     tabBehaviourMenu->AppendRadioItem(ID_TAB_STOP, "&Stop at the boundary"); | ||||||
|  |     tabBehaviourMenu->AppendRadioItem(ID_TAB_WRAP, "&Wrap at the boundary"); | ||||||
|  |     tabBehaviourMenu->AppendRadioItem(ID_TAB_LEAVE, "&Leave the grid"); | ||||||
|  |     tabBehaviourMenu->AppendRadioItem(ID_TAB_CUSTOM, "&Custom tab handler"); | ||||||
|  |     viewMenu->AppendSubMenu(tabBehaviourMenu, "&Tab behaviour"); | ||||||
|  |  | ||||||
|     wxMenu *colMenu = new wxMenu; |     wxMenu *colMenu = new wxMenu; | ||||||
|     colMenu->Append( ID_SETLABELCOLOUR, wxT("Set &label colour...") ); |     colMenu->Append( ID_SETLABELCOLOUR, wxT("Set &label colour...") ); | ||||||
| @@ -661,6 +669,42 @@ void GridFrame::SetDefaultColHeader( wxCommandEvent& WXUNUSED(ev) ) | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void GridFrame::OnGridCustomTab(wxGridEvent& event) | ||||||
|  | { | ||||||
|  |     // just for testing, make the cursor move up and down instead of the usual | ||||||
|  |     // left and right | ||||||
|  |     if ( event.ShiftDown() ) | ||||||
|  |     { | ||||||
|  |         if ( grid->GetGridCursorRow() > 0 ) | ||||||
|  |             grid->MoveCursorUp( false ); | ||||||
|  |     } | ||||||
|  |     else | ||||||
|  |     { | ||||||
|  |         if ( grid->GetGridCursorRow() < grid->GetNumberRows() - 1 ) | ||||||
|  |             grid->MoveCursorDown( false ); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void GridFrame::SetTabBehaviour(wxCommandEvent& event) | ||||||
|  | { | ||||||
|  |     // To make any built-in behaviour work, we need to disable the custom TAB | ||||||
|  |     // handler, otherwise it would be overriding them. | ||||||
|  |     grid->Disconnect(wxEVT_GRID_TABBING, | ||||||
|  |                      wxGridEventHandler(GridFrame::OnGridCustomTab)); | ||||||
|  |  | ||||||
|  |     grid->SetTabBehaviour( | ||||||
|  |             static_cast<wxGrid::TabBehaviour>(event.GetId() - ID_TAB_STOP) | ||||||
|  |         ); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void GridFrame::SetTabCustomHandler(wxCommandEvent&) | ||||||
|  | { | ||||||
|  |     grid->Connect(wxEVT_GRID_TABBING, | ||||||
|  |                   wxGridEventHandler(GridFrame::OnGridCustomTab), | ||||||
|  |                   NULL, this); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
| void GridFrame::ToggleGridLines( wxCommandEvent& WXUNUSED(ev) ) | void GridFrame::ToggleGridLines( wxCommandEvent& WXUNUSED(ev) ) | ||||||
| { | { | ||||||
|     grid->EnableGridLines( |     grid->EnableGridLines( | ||||||
|   | |||||||
| @@ -42,6 +42,8 @@ class GridFrame : public wxFrame | |||||||
|     void SetNativeColHeader ( wxCommandEvent& ); |     void SetNativeColHeader ( wxCommandEvent& ); | ||||||
|     void SetCustomColHeader( wxCommandEvent& ); |     void SetCustomColHeader( wxCommandEvent& ); | ||||||
|     void SetDefaultColHeader( wxCommandEvent& ); |     void SetDefaultColHeader( wxCommandEvent& ); | ||||||
|  |     void SetTabBehaviour( wxCommandEvent& ); | ||||||
|  |     void SetTabCustomHandler( wxCommandEvent& ); | ||||||
|     void ToggleGridLines( wxCommandEvent& ); |     void ToggleGridLines( wxCommandEvent& ); | ||||||
|     void AutoSizeCols( wxCommandEvent& ); |     void AutoSizeCols( wxCommandEvent& ); | ||||||
|     void CellOverflow( wxCommandEvent& ); |     void CellOverflow( wxCommandEvent& ); | ||||||
| @@ -102,6 +104,8 @@ class GridFrame : public wxFrame | |||||||
|     void OnSetHighlightWidth(wxCommandEvent&); |     void OnSetHighlightWidth(wxCommandEvent&); | ||||||
|     void OnSetROHighlightWidth(wxCommandEvent&); |     void OnSetROHighlightWidth(wxCommandEvent&); | ||||||
|  |  | ||||||
|  |     void OnGridCustomTab(wxGridEvent& event); | ||||||
|  |  | ||||||
| public: | public: | ||||||
|     GridFrame(); |     GridFrame(); | ||||||
|     ~GridFrame(); |     ~GridFrame(); | ||||||
| @@ -140,6 +144,10 @@ public: | |||||||
|         ID_COLDEFAULTHEADER, |         ID_COLDEFAULTHEADER, | ||||||
|         ID_COLNATIVEHEADER, |         ID_COLNATIVEHEADER, | ||||||
|         ID_COLCUSTOMHEADER, |         ID_COLCUSTOMHEADER, | ||||||
|  |         ID_TAB_STOP, | ||||||
|  |         ID_TAB_WRAP, | ||||||
|  |         ID_TAB_LEAVE, | ||||||
|  |         ID_TAB_CUSTOM, | ||||||
|         ID_GRIDLINECOLOUR, |         ID_GRIDLINECOLOUR, | ||||||
|         ID_INSERTROW, |         ID_INSERTROW, | ||||||
|         ID_INSERTCOL, |         ID_INSERTCOL, | ||||||
|   | |||||||
| @@ -155,6 +155,7 @@ wxDEFINE_EVENT( wxEVT_GRID_SELECT_CELL, wxGridEvent ); | |||||||
| wxDEFINE_EVENT( wxEVT_GRID_EDITOR_SHOWN, wxGridEvent ); | wxDEFINE_EVENT( wxEVT_GRID_EDITOR_SHOWN, wxGridEvent ); | ||||||
| wxDEFINE_EVENT( wxEVT_GRID_EDITOR_HIDDEN, wxGridEvent ); | wxDEFINE_EVENT( wxEVT_GRID_EDITOR_HIDDEN, wxGridEvent ); | ||||||
| wxDEFINE_EVENT( wxEVT_GRID_EDITOR_CREATED, wxGridEditorCreatedEvent ); | wxDEFINE_EVENT( wxEVT_GRID_EDITOR_CREATED, wxGridEditorCreatedEvent ); | ||||||
|  | wxDEFINE_EVENT( wxEVT_GRID_TABBING, wxGridEvent ); | ||||||
|  |  | ||||||
| // ---------------------------------------------------------------------------- | // ---------------------------------------------------------------------------- | ||||||
| // private helpers | // private helpers | ||||||
| @@ -2514,6 +2515,8 @@ void wxGrid::Init() | |||||||
|     // now anyhow, so just set the parameters directly |     // now anyhow, so just set the parameters directly | ||||||
|     m_xScrollPixelsPerLine = GRID_SCROLL_LINE_X; |     m_xScrollPixelsPerLine = GRID_SCROLL_LINE_X; | ||||||
|     m_yScrollPixelsPerLine = GRID_SCROLL_LINE_Y; |     m_yScrollPixelsPerLine = GRID_SCROLL_LINE_Y; | ||||||
|  |  | ||||||
|  |     m_tabBehaviour = Tab_Stop; | ||||||
| } | } | ||||||
|  |  | ||||||
| // ---------------------------------------------------------------------------- | // ---------------------------------------------------------------------------- | ||||||
| @@ -4933,30 +4936,18 @@ void wxGrid::OnKeyDown( wxKeyEvent& event ) | |||||||
|                 break; |                 break; | ||||||
|  |  | ||||||
|             case WXK_TAB: |             case WXK_TAB: | ||||||
|                 if (event.ShiftDown()) |  | ||||||
|                 { |                 { | ||||||
|                     if ( GetGridCursorCol() > 0 ) |                     // send an event to the grid's parents for custom handling | ||||||
|  |                     wxGridEvent gridEvt(GetId(), wxEVT_GRID_TABBING, this, | ||||||
|  |                                         GetGridCursorRow(), GetGridCursorCol(), | ||||||
|  |                                         -1, -1, false, event); | ||||||
|  |                     if ( ProcessWindowEvent(gridEvt) ) | ||||||
|                     { |                     { | ||||||
|                         MoveCursorLeft( false ); |                         // the event has been handled so no need for more processing | ||||||
|                     } |                         break; | ||||||
|                     else |  | ||||||
|                     { |  | ||||||
|                         // at left of grid |  | ||||||
|                         DisableCellEditControl(); |  | ||||||
|                     } |  | ||||||
|                 } |  | ||||||
|                 else |  | ||||||
|                 { |  | ||||||
|                     if ( GetGridCursorCol() < GetNumberCols() - 1 ) |  | ||||||
|                     { |  | ||||||
|                         MoveCursorRight( false ); |  | ||||||
|                     } |  | ||||||
|                     else |  | ||||||
|                     { |  | ||||||
|                         // at right of grid |  | ||||||
|                         DisableCellEditControl(); |  | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|  |                 DoGridProcessTab( event ); | ||||||
|                 break; |                 break; | ||||||
|  |  | ||||||
|             case WXK_HOME: |             case WXK_HOME: | ||||||
| @@ -5088,6 +5079,69 @@ void wxGrid::OnEraseBackground(wxEraseEvent&) | |||||||
| { | { | ||||||
| } | } | ||||||
|  |  | ||||||
|  | void wxGrid::DoGridProcessTab(wxKeyboardState& kbdState) | ||||||
|  | { | ||||||
|  |     const bool isForwardTab = !kbdState.ShiftDown(); | ||||||
|  |  | ||||||
|  |     // TAB processing only changes when we are at the borders of the grid, so | ||||||
|  |     // let's first handle the common behaviour when we are not at the border. | ||||||
|  |     if ( isForwardTab ) | ||||||
|  |     { | ||||||
|  |         if ( GetGridCursorCol() < GetNumberCols() - 1 ) | ||||||
|  |         { | ||||||
|  |             MoveCursorRight( false ); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     else // going back | ||||||
|  |     { | ||||||
|  |         if ( GetGridCursorCol() ) | ||||||
|  |         { | ||||||
|  |             MoveCursorLeft( false ); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     // We only get here if the cursor is at the border of the grid, apply the | ||||||
|  |     // configured behaviour. | ||||||
|  |     switch ( m_tabBehaviour ) | ||||||
|  |     { | ||||||
|  |         case Tab_Stop: | ||||||
|  |             // Nothing special to do, we remain at the current cell. | ||||||
|  |             break; | ||||||
|  |  | ||||||
|  |         case Tab_Wrap: | ||||||
|  |             // Go to the beginning of the next or the end of the previous row. | ||||||
|  |             if ( isForwardTab ) | ||||||
|  |             { | ||||||
|  |                 if ( GetGridCursorRow() < GetNumberRows() - 1 ) | ||||||
|  |                 { | ||||||
|  |                     GoToCell( GetGridCursorRow() + 1, 0 ); | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |             else | ||||||
|  |             { | ||||||
|  |                 if ( GetGridCursorRow() > 0 ) | ||||||
|  |                 { | ||||||
|  |                     GoToCell( GetGridCursorRow() - 1, GetNumberCols() - 1 ); | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |             break; | ||||||
|  |  | ||||||
|  |         case Tab_Leave: | ||||||
|  |             if ( Navigate( isForwardTab ? wxNavigationKeyEvent::IsForward | ||||||
|  |                                         : wxNavigationKeyEvent::IsBackward ) ) | ||||||
|  |                 return; | ||||||
|  |             break; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     // If we remain in this cell, stop editing it if we were doing so. | ||||||
|  |     DisableCellEditControl(); | ||||||
|  | } | ||||||
|  |  | ||||||
| bool wxGrid::SetCurrentCell( const wxGridCellCoords& coords ) | bool wxGrid::SetCurrentCell( const wxGridCellCoords& coords ) | ||||||
| { | { | ||||||
|     if ( SendEvent(wxEVT_GRID_SELECT_CELL, coords) == -1 ) |     if ( SendEvent(wxEVT_GRID_SELECT_CELL, coords) == -1 ) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user