X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/043d16b2256f509cf8aa7bd8d7b05c84bb117084..4bd87101b398ea89795bae4012bbb03866b7e0f5:/src/generic/grid.cpp diff --git a/src/generic/grid.cpp b/src/generic/grid.cpp index 992e3925da..1fd565857e 100644 --- a/src/generic/grid.cpp +++ b/src/generic/grid.cpp @@ -3090,7 +3090,6 @@ wxGrid::~wxGrid() void wxGrid::Create() { m_created = FALSE; // set to TRUE by CreateGrid - m_displayed = TRUE; // FALSE; // set to TRUE by OnPaint m_table = (wxGridTableBase *) NULL; m_ownTable = FALSE; @@ -3191,7 +3190,7 @@ bool wxGrid::SetTable( wxGridTableBase *table, bool takeOwnership, // View at runtime. Is there anything in the implmentation that would // prevent this? - // At least, you now have to copy with m_selection + // At least, you now have to cope with m_selection wxFAIL_MSG( wxT("wxGrid::CreateGrid or wxGrid::SetTable called more than once") ); return FALSE; } @@ -4324,7 +4323,14 @@ void wxGrid::ProcessGridCellMouseEvent( wxMouseEvent& event ) ClearSelection(); if ( event.ShiftDown() ) { - SelectBlock( m_currentCellCoords, coords ); + m_selection->SelectBlock( m_currentCellCoords.GetRow(), + m_currentCellCoords.GetCol(), + coords.GetRow(), + coords.GetCol(), + event.ControlDown(), + event.ShiftDown(), + event.AltDown(), + event.MetaDown() ); } else if ( XToEdgeOfCol(x) < 0 && YToEdgeOfRow(y) < 0 ) @@ -4358,7 +4364,11 @@ void wxGrid::ProcessGridCellMouseEvent( wxMouseEvent& event ) else { m_selection->ToggleCellSelection( coords.GetRow(), - coords.GetCol() ); + coords.GetCol(), + event.ControlDown(), + event.ShiftDown(), + event.AltDown(), + event.MetaDown() ); m_selectingTopLeft = wxGridNoCellCoords; m_selectingBottomRight = wxGridNoCellCoords; SetCurrentCell( coords ); @@ -4394,16 +4404,21 @@ void wxGrid::ProcessGridCellMouseEvent( wxMouseEvent& event ) if ( m_selectingTopLeft != wxGridNoCellCoords && m_selectingBottomRight != wxGridNoCellCoords ) { - m_selection->SelectBlock( m_selectingTopLeft.GetRow(), - m_selectingTopLeft.GetCol(), - m_selectingBottomRight.GetRow(), - m_selectingBottomRight.GetCol() ); if (m_winCapture) { m_winCapture->ReleaseMouse(); m_winCapture = NULL; } - SendEvent( wxEVT_GRID_RANGE_SELECT, -1, -1, event ); + m_selection->SelectBlock( m_selectingTopLeft.GetRow(), + m_selectingTopLeft.GetCol(), + m_selectingBottomRight.GetRow(), + m_selectingBottomRight.GetCol(), + event.ControlDown(), + event.ShiftDown(), + event.AltDown(), + event.MetaDown() ); + m_selectingTopLeft = wxGridNoCellCoords; + m_selectingBottomRight = wxGridNoCellCoords; } // Show the edit control, if it has been hidden for @@ -4897,11 +4912,13 @@ bool wxGrid::SendEvent( const wxEventType type, } else if ( type == wxEVT_GRID_RANGE_SELECT ) { + // Right now, it should _never_ end up here! wxGridRangeSelectEvent gridEvt( GetId(), type, this, m_selectingTopLeft, m_selectingBottomRight, + TRUE, mouseEv.ControlDown(), mouseEv.ShiftDown(), mouseEv.AltDown(), @@ -4915,6 +4932,7 @@ bool wxGrid::SendEvent( const wxEventType type, type, this, row, col, + FALSE, mouseEv.GetX(), mouseEv.GetY(), mouseEv.ControlDown(), mouseEv.ShiftDown(), @@ -4958,15 +4976,6 @@ bool wxGrid::SendEvent( const wxEventType type, void wxGrid::OnPaint( wxPaintEvent& WXUNUSED(event) ) { wxPaintDC dc( this ); - - if ( m_currentCellCoords == wxGridNoCellCoords && - m_numRows && m_numCols ) - { - m_currentCellCoords.Set(0, 0); - ShowCellEditControl(); - } - - m_displayed = TRUE; } @@ -5001,56 +5010,67 @@ void wxGrid::OnKeyDown( wxKeyEvent& event ) if ( !parent->GetEventHandler()->ProcessEvent( keyEvt ) ) { - // TODO: Should also support Shift-cursor keys for - // extending the selection. Maybe add a flag to - // MoveCursorXXX() and MoveCursorXXXBlock() and - // just send event.ShiftDown(). - // try local handlers // + if ( !event.ShiftDown() && + m_selectingKeyboard != wxGridNoCellCoords ) + { + m_selection->SelectBlock( m_selectingTopLeft.GetRow(), + m_selectingTopLeft.GetCol(), + m_selectingBottomRight.GetRow(), + m_selectingBottomRight.GetCol(), + event.ControlDown(), + event.ShiftDown(), + event.AltDown(), + event.MetaDown() ); + m_selectingTopLeft = wxGridNoCellCoords; + m_selectingBottomRight = wxGridNoCellCoords; + m_selectingKeyboard = wxGridNoCellCoords; + } + switch ( event.KeyCode() ) { case WXK_UP: if ( event.ControlDown() ) { - MoveCursorUpBlock(); + MoveCursorUpBlock( event.ShiftDown() ); } else { - MoveCursorUp(); + MoveCursorUp( event.ShiftDown() ); } break; case WXK_DOWN: if ( event.ControlDown() ) { - MoveCursorDownBlock(); + MoveCursorDownBlock( event.ShiftDown() ); } else { - MoveCursorDown(); + MoveCursorDown( event.ShiftDown() ); } break; case WXK_LEFT: if ( event.ControlDown() ) { - MoveCursorLeftBlock(); + MoveCursorLeftBlock( event.ShiftDown() ); } else { - MoveCursorLeft(); + MoveCursorLeft( event.ShiftDown() ); } break; case WXK_RIGHT: if ( event.ControlDown() ) { - MoveCursorRightBlock(); + MoveCursorRightBlock( event.ShiftDown() ); } else { - MoveCursorRight(); + MoveCursorRight( event.ShiftDown() ); } break; @@ -5061,15 +5081,19 @@ void wxGrid::OnKeyDown( wxKeyEvent& event ) } else { - MoveCursorDown(); + MoveCursorDown( event.ShiftDown() ); } break; + case WXK_ESCAPE: + m_selection->ClearSelection(); + break; + case WXK_TAB: if (event.ShiftDown()) - MoveCursorLeft(); + MoveCursorLeft( FALSE ); else - MoveCursorRight(); + MoveCursorRight( FALSE ); break; case WXK_HOME: @@ -5104,21 +5128,37 @@ void wxGrid::OnKeyDown( wxKeyEvent& event ) MovePageDown(); break; +#if 1 case WXK_SPACE: if ( !IsEditable() ) { - MoveCursorRight(); + MoveCursorRight( FALSE ); break; } // Otherwise fall through to default +#else + case WXK_SPACE: + m_selection->ToggleCellSelection( m_currentCellCoords.GetRow(), + m_currentCellCoords.GetCol(), + event.ControlDown(), + event.ShiftDown(), + event.AltDown(), + event.MetaDown() ); + break; +#endif default: // alphanumeric keys or F2 (special key just for this) enable // the cell edit control + // On just Shift/Control I get values for event.KeyCode() + // that are outside the range where isalnum's behaviour is + // well defined, so do an additional sanity check. if ( !(event.AltDown() || event.MetaDown() || event.ControlDown()) && - (isalnum(event.KeyCode()) || event.KeyCode() == WXK_F2) && + ((isalnum(event.KeyCode()) && + (event.KeyCode() < 256 && event.KeyCode() >= 0)) || + event.KeyCode() == WXK_F2) && !IsCellEditControlEnabled() && CanEnableCellControl() ) { @@ -5144,21 +5184,13 @@ void wxGrid::OnKeyDown( wxKeyEvent& event ) m_inOnKeyDown = FALSE; } - void wxGrid::OnEraseBackground(wxEraseEvent&) { } void wxGrid::SetCurrentCell( const wxGridCellCoords& coords ) { - if ( SendEvent( wxEVT_GRID_SELECT_CELL, coords.GetRow(), coords.GetCol() ) ) - { - // the event has been intercepted - do nothing - return; - } - - if ( m_displayed && - m_currentCellCoords != wxGridNoCellCoords ) + if ( m_currentCellCoords != wxGridNoCellCoords ) { HideCellEditControl(); DisableCellEditControl(); @@ -5174,14 +5206,13 @@ void wxGrid::SetCurrentCell( const wxGridCellCoords& coords ) m_currentCellCoords = coords; - if ( m_displayed ) - { - wxClientDC dc(m_gridWin); - PrepareDC(dc); + wxClientDC dc(m_gridWin); + PrepareDC(dc); + + wxGridCellAttr* attr = GetCellAttr(coords); + DrawCellHighlight(dc, attr); + attr->DecRef(); - wxGridCellAttr* attr = GetCellAttr(coords); - DrawCellHighlight(dc, attr); - attr->DecRef(); #if 0 // SN: For my extended selection code, automatic // deselection is definitely not a good idea. @@ -5192,7 +5223,6 @@ void wxGrid::SetCurrentCell( const wxGridCellCoords& coords ) if ( !GetBatchCount() ) m_gridWin->Refresh( FALSE, &r ); } #endif - } } @@ -5395,6 +5425,15 @@ void wxGrid::DrawCellBorder( wxDC& dc, const wxGridCellCoords& coords ) void wxGrid::DrawHighlight(wxDC& dc) { + // This if block was previously in wxGrid::OnPaint but that doesn't + // seem to get called under wxGTK - MB + // + if ( m_currentCellCoords == wxGridNoCellCoords && + m_numRows && m_numCols ) + { + m_currentCellCoords.Set(0, 0); + } + if ( IsCellEditControlEnabled() ) { // don't show highlight when the edit control is shown @@ -6117,17 +6156,23 @@ void wxGrid::MakeCellVisible( int row, int col ) // ------ Grid cursor movement functions // -bool wxGrid::MoveCursorUp() +bool wxGrid::MoveCursorUp( bool expandSelection ) { if ( m_currentCellCoords != wxGridNoCellCoords && m_currentCellCoords.GetRow() > 0 ) { MakeCellVisible( m_currentCellCoords.GetRow() - 1, - m_currentCellCoords.GetCol() ); - - SetCurrentCell( m_currentCellCoords.GetRow() - 1, - m_currentCellCoords.GetCol() ); - + m_currentCellCoords.GetCol() ); + if ( expandSelection ) + { + if ( m_selectingKeyboard == wxGridNoCellCoords ) + m_selectingKeyboard = m_currentCellCoords; + m_selectingKeyboard.SetRow( m_selectingKeyboard.GetRow() - 1 ); + SelectBlock( m_currentCellCoords, m_selectingKeyboard ); + } + else + SetCurrentCell( m_currentCellCoords.GetRow() - 1, + m_currentCellCoords.GetCol() ); return TRUE; } @@ -6135,19 +6180,23 @@ bool wxGrid::MoveCursorUp() } -bool wxGrid::MoveCursorDown() +bool wxGrid::MoveCursorDown( bool expandSelection ) { - // TODO: allow for scrolling - // if ( m_currentCellCoords != wxGridNoCellCoords && m_currentCellCoords.GetRow() < m_numRows-1 ) { MakeCellVisible( m_currentCellCoords.GetRow() + 1, - m_currentCellCoords.GetCol() ); - - SetCurrentCell( m_currentCellCoords.GetRow() + 1, - m_currentCellCoords.GetCol() ); - + m_currentCellCoords.GetCol() ); + if ( expandSelection ) + { + if ( m_selectingKeyboard == wxGridNoCellCoords ) + m_selectingKeyboard = m_currentCellCoords; + m_selectingKeyboard.SetRow( m_selectingKeyboard.GetRow() + 1 ); + SelectBlock( m_currentCellCoords, m_selectingKeyboard ); + } + else + SetCurrentCell( m_currentCellCoords.GetRow() + 1, + m_currentCellCoords.GetCol() ); return TRUE; } @@ -6155,17 +6204,23 @@ bool wxGrid::MoveCursorDown() } -bool wxGrid::MoveCursorLeft() +bool wxGrid::MoveCursorLeft( bool expandSelection ) { if ( m_currentCellCoords != wxGridNoCellCoords && m_currentCellCoords.GetCol() > 0 ) { MakeCellVisible( m_currentCellCoords.GetRow(), - m_currentCellCoords.GetCol() - 1 ); - - SetCurrentCell( m_currentCellCoords.GetRow(), - m_currentCellCoords.GetCol() - 1 ); - + m_currentCellCoords.GetCol() - 1 ); + if ( expandSelection ) + { + if ( m_selectingKeyboard == wxGridNoCellCoords ) + m_selectingKeyboard = m_currentCellCoords; + m_selectingKeyboard.SetCol( m_selectingKeyboard.GetCol() - 1 ); + SelectBlock( m_currentCellCoords, m_selectingKeyboard ); + } + else + SetCurrentCell( m_currentCellCoords.GetRow(), + m_currentCellCoords.GetCol() - 1 ); return TRUE; } @@ -6173,7 +6228,7 @@ bool wxGrid::MoveCursorLeft() } -bool wxGrid::MoveCursorRight() +bool wxGrid::MoveCursorRight( bool expandSelection ) { if ( m_currentCellCoords != wxGridNoCellCoords && m_currentCellCoords.GetCol() < m_numCols - 1 ) @@ -6181,9 +6236,16 @@ bool wxGrid::MoveCursorRight() MakeCellVisible( m_currentCellCoords.GetRow(), m_currentCellCoords.GetCol() + 1 ); - SetCurrentCell( m_currentCellCoords.GetRow(), - m_currentCellCoords.GetCol() + 1 ); - + if ( expandSelection ) + { + if ( m_selectingKeyboard == wxGridNoCellCoords ) + m_selectingKeyboard = m_currentCellCoords; + m_selectingKeyboard.SetCol( m_selectingKeyboard.GetCol() + 1 ); + SelectBlock( m_currentCellCoords, m_selectingKeyboard ); + } + else + SetCurrentCell( m_currentCellCoords.GetRow(), + m_currentCellCoords.GetCol() + 1 ); return TRUE; } @@ -6251,7 +6313,7 @@ bool wxGrid::MovePageDown() return FALSE; } -bool wxGrid::MoveCursorUpBlock() +bool wxGrid::MoveCursorUpBlock( bool expandSelection ) { if ( m_table && m_currentCellCoords != wxGridNoCellCoords && @@ -6298,7 +6360,13 @@ bool wxGrid::MoveCursorUpBlock() } MakeCellVisible( row, col ); - SetCurrentCell( row, col ); + if ( expandSelection ) + { + m_selectingKeyboard = wxGridCellCoords( row, col ); + SelectBlock( m_currentCellCoords, m_selectingKeyboard ); + } + else + SetCurrentCell( row, col ); return TRUE; } @@ -6306,7 +6374,7 @@ bool wxGrid::MoveCursorUpBlock() return FALSE; } -bool wxGrid::MoveCursorDownBlock() +bool wxGrid::MoveCursorDownBlock( bool expandSelection ) { if ( m_table && m_currentCellCoords != wxGridNoCellCoords && @@ -6353,7 +6421,13 @@ bool wxGrid::MoveCursorDownBlock() } MakeCellVisible( row, col ); - SetCurrentCell( row, col ); + if ( expandSelection ) + { + m_selectingKeyboard = wxGridCellCoords( row, col ); + SelectBlock( m_currentCellCoords, m_selectingKeyboard ); + } + else + SetCurrentCell( row, col ); return TRUE; } @@ -6361,7 +6435,7 @@ bool wxGrid::MoveCursorDownBlock() return FALSE; } -bool wxGrid::MoveCursorLeftBlock() +bool wxGrid::MoveCursorLeftBlock( bool expandSelection ) { if ( m_table && m_currentCellCoords != wxGridNoCellCoords && @@ -6408,7 +6482,13 @@ bool wxGrid::MoveCursorLeftBlock() } MakeCellVisible( row, col ); - SetCurrentCell( row, col ); + if ( expandSelection ) + { + m_selectingKeyboard = wxGridCellCoords( row, col ); + SelectBlock( m_currentCellCoords, m_selectingKeyboard ); + } + else + SetCurrentCell( row, col ); return TRUE; } @@ -6416,7 +6496,7 @@ bool wxGrid::MoveCursorLeftBlock() return FALSE; } -bool wxGrid::MoveCursorRightBlock() +bool wxGrid::MoveCursorRightBlock( bool expandSelection ) { if ( m_table && m_currentCellCoords != wxGridNoCellCoords && @@ -6463,7 +6543,13 @@ bool wxGrid::MoveCursorRightBlock() } MakeCellVisible( row, col ); - SetCurrentCell( row, col ); + if ( expandSelection ) + { + m_selectingKeyboard = wxGridCellCoords( row, col ); + SelectBlock( m_currentCellCoords, m_selectingKeyboard ); + } + else + SetCurrentCell( row, col ); return TRUE; } @@ -7454,14 +7540,6 @@ void wxGrid::SelectRow( int row, bool addToSelected ) m_selection->ClearSelection(); m_selection->SelectRow( row ); - - wxGridRangeSelectEvent gridEvt( GetId(), - wxEVT_GRID_RANGE_SELECT, - this, - wxGridCellCoords( row, 0 ), - wxGridCellCoords( row, m_numCols - 1 ) ); - - GetEventHandler()->ProcessEvent(gridEvt); } @@ -7471,14 +7549,6 @@ void wxGrid::SelectCol( int col, bool addToSelected ) m_selection->ClearSelection(); m_selection->SelectCol( col ); - - wxGridRangeSelectEvent gridEvt( GetId(), - wxEVT_GRID_RANGE_SELECT, - this, - wxGridCellCoords( 0, col ), - wxGridCellCoords( m_numRows - 1, col ) ); - - GetEventHandler()->ProcessEvent(gridEvt); } @@ -7601,19 +7671,8 @@ void wxGrid::SelectBlock( int topRow, int leftCol, int bottomRow, int rightCol ) m_gridWin->Refresh( FALSE, &(rect[i]) ); } - // only generate an event if the block is not being selected by - // dragging the mouse (in which case the event will be generated in - // the mouse event handler) - if ( !m_isDragging ) - { - wxGridRangeSelectEvent gridEvt( GetId(), - wxEVT_GRID_RANGE_SELECT, - this, - m_selectingTopLeft, - m_selectingBottomRight ); - - GetEventHandler()->ProcessEvent(gridEvt); - } + // never generate an event as it will be generated from + // wxGridSelection::SelectBlock! } void wxGrid::SelectAll() @@ -7700,7 +7759,7 @@ wxRect wxGrid::BlockToDeviceRect( const wxGridCellCoords &topLeft, IMPLEMENT_DYNAMIC_CLASS( wxGridEvent, wxEvent ) wxGridEvent::wxGridEvent( int id, wxEventType type, wxObject* obj, - int row, int col, int x, int y, + int row, int col, int x, int y, bool sel, bool control, bool shift, bool alt, bool meta ) : wxNotifyEvent( type, id ) { @@ -7708,6 +7767,7 @@ wxGridEvent::wxGridEvent( int id, wxEventType type, wxObject* obj, m_col = col; m_x = x; m_y = y; + m_selecting = sel; m_control = control; m_shift = shift; m_alt = alt; @@ -7741,11 +7801,13 @@ IMPLEMENT_DYNAMIC_CLASS( wxGridRangeSelectEvent, wxEvent ) wxGridRangeSelectEvent::wxGridRangeSelectEvent(int id, wxEventType type, wxObject* obj, const wxGridCellCoords& topLeft, const wxGridCellCoords& bottomRight, - bool control, bool shift, bool alt, bool meta ) + bool sel, bool control, + bool shift, bool alt, bool meta ) : wxNotifyEvent( type, id ) { m_topLeft = topLeft; m_bottomRight = bottomRight; + m_selecting = sel; m_control = control; m_shift = shift; m_alt = alt;