X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1f1ce2884112334339fe8b0799eb95dca3f59d60..8a9a9d58d97bed55487a5bcae8c592d57ffd021c:/src/generic/grid.cpp diff --git a/src/generic/grid.cpp b/src/generic/grid.cpp index 51552e348c..21fed2866e 100644 --- a/src/generic/grid.cpp +++ b/src/generic/grid.cpp @@ -36,7 +36,6 @@ #include "wx/generic/grid.h" - ////////////////////////////////////////////////////////////////////// wxGridCellCoords wxGridNoCellCoords( -1, -1 ); @@ -47,6 +46,9 @@ wxRect wxGridNoCellRect( -1, -1, -1, -1 ); WX_DEFINE_OBJARRAY(wxGridCellCoordsArray) +// scroll line size +// TODO: fixed so far - make configurable later (and also different for x/y) +static const size_t GRID_SCROLL_LINE = 10; ////////////////////////////////////////////////////////////////////// // @@ -139,7 +141,7 @@ wxString wxGridTableBase::GetColLabelValue( int col ) unsigned int i, n; for ( n = 1; ; n++ ) { - s += ('A' + (char)( col%26 )); + s += (_T('A') + (wxChar)( col%26 )); col = col/26 - 1; if ( col < 0 ) break; } @@ -606,7 +608,7 @@ void wxGridTextCtrl::OnKeyDown( wxKeyEvent& event ) case WXK_RIGHT: case WXK_PRIOR: case WXK_NEXT: - case WXK_RETURN: + case WXK_SPACE: if ( m_isCellControl ) { // send the event to the parent grid, skipping the @@ -623,6 +625,28 @@ void wxGridTextCtrl::OnKeyDown( wxKeyEvent& event ) } break; + case WXK_RETURN: + if ( m_isCellControl ) + { + if ( !m_grid->ProcessEvent( event ) ) + { +#if defined(__WXMOTIF__) || defined(__WXGTK__) + // wxMotif needs a little extra help... + // + int pos = GetInsertionPoint(); + wxString s( GetValue() ); + s = s.Left(pos) + "\n" + s.Mid(pos); + SetValue(s); + SetInsertionPoint( pos ); +#else + // the other ports can handle a Return key press + // + event.Skip(); +#endif + } + } + break; + case WXK_HOME: case WXK_END: if ( m_isCellControl ) @@ -649,7 +673,7 @@ void wxGridTextCtrl::OnKeyDown( wxKeyEvent& event ) void wxGridTextCtrl::SetStartValue( const wxString& s ) { startValue = s; - wxTextCtrl::SetValue( s.c_str() ); + wxTextCtrl::SetValue(s); } @@ -664,8 +688,8 @@ BEGIN_EVENT_TABLE( wxGridRowLabelWindow, wxWindow ) EVT_KEY_DOWN( wxGridRowLabelWindow::OnKeyDown ) END_EVENT_TABLE() -wxGridRowLabelWindow::wxGridRowLabelWindow( wxGrid *parent, - wxWindowID id, +wxGridRowLabelWindow::wxGridRowLabelWindow( wxGrid *parent, + wxWindowID id, const wxPoint &pos, const wxSize &size ) : wxWindow( parent, id, pos, size ) { @@ -681,11 +705,11 @@ void wxGridRowLabelWindow::OnPaint( wxPaintEvent &event ) // set the y coord - MB // // m_owner->PrepareDC( dc ); - + wxCoord x, y; m_owner->CalcUnscrolledPosition( 0, 0, &x, &y ); dc.SetDeviceOrigin( 0, -y ); - + m_owner->CalcRowLabelsExposed( GetUpdateRegion() ); m_owner->DrawRowLabels( dc ); } @@ -717,8 +741,8 @@ BEGIN_EVENT_TABLE( wxGridColLabelWindow, wxWindow ) EVT_KEY_DOWN( wxGridColLabelWindow::OnKeyDown ) END_EVENT_TABLE() -wxGridColLabelWindow::wxGridColLabelWindow( wxGrid *parent, - wxWindowID id, +wxGridColLabelWindow::wxGridColLabelWindow( wxGrid *parent, + wxWindowID id, const wxPoint &pos, const wxSize &size ) : wxWindow( parent, id, pos, size ) { @@ -734,13 +758,13 @@ void wxGridColLabelWindow::OnPaint( wxPaintEvent &event ) // set the x coord - MB // // m_owner->PrepareDC( dc ); - + wxCoord x, y; m_owner->CalcUnscrolledPosition( 0, 0, &x, &y ); dc.SetDeviceOrigin( -x, 0 ); - m_owner->CalcColLabelsExposed( GetUpdateRegion() ); - m_owner->DrawColLabels( dc ); + m_owner->CalcColLabelsExposed( GetUpdateRegion() ); + m_owner->DrawColLabels( dc ); } @@ -766,17 +790,35 @@ IMPLEMENT_DYNAMIC_CLASS( wxGridCornerLabelWindow, wxWindow ) BEGIN_EVENT_TABLE( wxGridCornerLabelWindow, wxWindow ) EVT_MOUSE_EVENTS( wxGridCornerLabelWindow::OnMouseEvent ) + EVT_PAINT( wxGridCornerLabelWindow::OnPaint) EVT_KEY_DOWN( wxGridCornerLabelWindow::OnKeyDown ) END_EVENT_TABLE() -wxGridCornerLabelWindow::wxGridCornerLabelWindow( wxGrid *parent, - wxWindowID id, +wxGridCornerLabelWindow::wxGridCornerLabelWindow( wxGrid *parent, + wxWindowID id, const wxPoint &pos, const wxSize &size ) - : wxWindow( parent, id, pos, size, wxRAISED_BORDER ) + : wxWindow( parent, id, pos, size ) { m_owner = parent; } +void wxGridCornerLabelWindow::OnPaint( wxPaintEvent& WXUNUSED(event) ) +{ + wxPaintDC dc(this); + + int client_height = 0; + int client_width = 0; + GetClientSize( &client_width, &client_height ); + + dc.SetPen( *wxBLACK_PEN ); + dc.DrawLine( client_width-1, client_height-1, client_width-1, 0 ); + dc.DrawLine( client_width-1, client_height-1, 0, client_height-1 ); + + dc.SetPen( *wxWHITE_PEN ); + dc.DrawLine( 0, 0, client_width, 0 ); + dc.DrawLine( 0, 0, 0, client_height ); +} + void wxGridCornerLabelWindow::OnMouseEvent( wxMouseEvent& event ) { @@ -800,13 +842,12 @@ IMPLEMENT_DYNAMIC_CLASS( wxGridWindow, wxPanel ) BEGIN_EVENT_TABLE( wxGridWindow, wxPanel ) EVT_PAINT( wxGridWindow::OnPaint ) - EVT_SCROLLWIN( wxGridWindow::ScrollWindow ) EVT_MOUSE_EVENTS( wxGridWindow::OnMouseEvent ) EVT_KEY_DOWN( wxGridWindow::OnKeyDown ) END_EVENT_TABLE() -wxGridWindow::wxGridWindow( wxGrid *parent, - wxGridRowLabelWindow *rowLblWin, +wxGridWindow::wxGridWindow( wxGrid *parent, + wxGridRowLabelWindow *rowLblWin, wxGridColLabelWindow *colLblWin, wxWindowID id, const wxPoint &pos, const wxSize &size ) : wxPanel( parent, id, pos, size, wxSUNKEN_BORDER, "grid window" ) @@ -814,7 +855,7 @@ wxGridWindow::wxGridWindow( wxGrid *parent, m_owner = parent; m_rowLabelWin = rowLblWin; m_colLabelWin = colLblWin; - + SetBackgroundColour( "WHITE" ); } @@ -877,72 +918,66 @@ wxGrid::wxGrid( wxWindow *parent, : wxScrolledWindow( parent, id, pos, size, style, name ) { Create(); +} + +wxGrid::~wxGrid() +{ + delete m_table; +} + + +// +// ----- internal init and update functions +// + +void wxGrid::Create() +{ int colLblH = WXGRID_DEFAULT_COL_LABEL_HEIGHT; int rowLblW = WXGRID_DEFAULT_ROW_LABEL_WIDTH; - m_rowLabelWin = new wxGridRowLabelWindow( this, - -1, - wxDefaultPosition, + m_rowLabelWin = new wxGridRowLabelWindow( this, + -1, + wxDefaultPosition, wxSize(rowLblW,-1) ); m_colLabelWin = new wxGridColLabelWindow( this, -1, wxDefaultPosition, wxSize(-1, colLblH ) ); - + m_cornerLabelWin = new wxGridCornerLabelWindow( this, -1, wxDefaultPosition, wxSize(rowLblW, colLblH ) ); - - m_gridWin = new wxGridWindow( this, - m_rowLabelWin, - m_colLabelWin, - -1, - wxDefaultPosition, + + m_gridWin = new wxGridWindow( this, + m_rowLabelWin, + m_colLabelWin, + -1, + wxDefaultPosition, wxDefaultSize ); SetTargetWindow( m_gridWin ); - + m_mainSizer = new wxBoxSizer( wxVERTICAL ); - + m_topSizer = new wxBoxSizer( wxHORIZONTAL ); m_topSizer->Add( m_cornerLabelWin, 0 ); m_topSizer->Add( m_colLabelWin, 1 ); - + m_mainSizer->Add( m_topSizer, 0, wxEXPAND ); - + m_middleSizer = new wxBoxSizer( wxHORIZONTAL ); m_middleSizer->Add( m_rowLabelWin, 0, wxEXPAND ); m_middleSizer->Add( m_gridWin, 1, wxEXPAND ); - + m_mainSizer->Add( m_middleSizer, 1, wxEXPAND ); SetAutoLayout( TRUE ); SetSizer( m_mainSizer ); } -wxGrid::~wxGrid() -{ - delete m_table; -} - - -// -// ----- internal init and update functions -// - -void wxGrid::Create() -{ - m_table = (wxGridTableBase *) NULL; - m_gridWin = (wxGridWindow *) NULL; - m_rowLabelWin = (wxGridRowLabelWindow *) NULL; - m_colLabelWin = (wxGridColLabelWindow *) NULL; - m_cornerLabelWin = (wxGridCornerLabelWindow *) NULL; - m_cellEditCtrl = (wxWindow *) NULL; -} - bool wxGrid::CreateGrid( int numRows, int numCols ) { @@ -979,8 +1014,16 @@ void wxGrid::Init() m_rowLabelWidth = WXGRID_DEFAULT_ROW_LABEL_WIDTH; m_colLabelHeight = WXGRID_DEFAULT_COL_LABEL_HEIGHT; - m_labelBackgroundColour = m_rowLabelWin->GetBackgroundColour(); - m_labelTextColour = wxColour( "BLACK" ); + if ( m_rowLabelWin ) + { + m_labelBackgroundColour = m_rowLabelWin->GetBackgroundColour(); + } + else + { + m_labelBackgroundColour = wxColour( _T("WHITE") ); + } + + m_labelTextColour = wxColour( _T("BLACK") ); // TODO: something better than this ? // @@ -996,7 +1039,7 @@ void wxGrid::Init() m_defaultColWidth = WXGRID_DEFAULT_COL_WIDTH; m_defaultRowHeight = m_gridWin->GetCharHeight(); -#if defined (__WXMOTIF__) // see also text ctrl sizing in ShowCellEditControl() +#if defined(__WXMOTIF__) || defined(__WXGTK__) // see also text ctrl sizing in ShowCellEditControl() m_defaultRowHeight += 8; #else m_defaultRowHeight += 4; @@ -1029,7 +1072,7 @@ void wxGrid::Init() m_gridLineColour = wxColour( 128, 128, 255 ); m_gridLinesEnabled = TRUE; - m_cursorMode = WXGRID_CURSOR_DEFAULT; + m_cursorMode = WXGRID_CURSOR_SELECT_CELL; m_dragLastPos = -1; m_dragRowOrCol = -1; m_isDragging = FALSE; @@ -1056,7 +1099,7 @@ void wxGrid::Init() "", wxPoint(1,1), wxSize(1,1) -#ifdef __WXMSW__ +#if defined(__WXMSW__) , wxTE_MULTILINE | wxTE_NO_VSCROLL #endif ); @@ -1076,13 +1119,13 @@ void wxGrid::CalcDimensions() { int right = m_colRights[ m_numCols-1 ] + 20; int bottom = m_rowBottoms[ m_numRows-1 ] + 20; - + // TODO: restore the scroll position that we had before sizing // int x, y; GetViewStart( &x, &y ); - SetScrollbars( 10, 10, - right/10, bottom/10, + SetScrollbars( GRID_SCROLL_LINE, GRID_SCROLL_LINE, + right/GRID_SCROLL_LINE, bottom/GRID_SCROLL_LINE, x, y ); } } @@ -1110,7 +1153,7 @@ bool wxGrid::Redimension( wxGridTableMessage& msg ) int bottom = 0; if ( pos > 0 ) bottom = m_rowBottoms[pos-1]; - + for ( i = pos; i < m_numRows; i++ ) { bottom += m_rowHeights[i]; @@ -1134,7 +1177,7 @@ bool wxGrid::Redimension( wxGridTableMessage& msg ) int bottom = 0; if ( oldNumRows > 0 ) bottom = m_rowBottoms[oldNumRows-1]; - + for ( i = oldNumRows; i < m_numRows; i++ ) { bottom += m_rowHeights[i]; @@ -1174,7 +1217,7 @@ bool wxGrid::Redimension( wxGridTableMessage& msg ) m_rowBottoms[i] = h; } } - + CalcDimensions(); } return TRUE; @@ -1192,7 +1235,7 @@ bool wxGrid::Redimension( wxGridTableMessage& msg ) int right = 0; if ( pos > 0 ) right = m_colRights[pos-1]; - + for ( i = pos; i < m_numCols; i++ ) { right += m_colWidths[i]; @@ -1216,7 +1259,7 @@ bool wxGrid::Redimension( wxGridTableMessage& msg ) int right = 0; if ( oldNumCols > 0 ) right = m_colRights[oldNumCols-1]; - + for ( i = oldNumCols; i < m_numCols; i++ ) { right += m_colWidths[i]; @@ -1246,7 +1289,7 @@ bool wxGrid::Redimension( wxGridTableMessage& msg ) #endif m_currentCellCoords = wxGridNoCellCoords; } - else + else { if ( m_currentCellCoords.GetCol() >= m_numCols ) m_currentCellCoords.Set( 0, 0 ); @@ -1307,10 +1350,10 @@ void wxGrid::CalcRowLabelsExposed( wxRegion& reg ) rowTop = m_rowBottoms[row] - m_rowHeights[row]; if ( rowTop > bottom ) break; - + m_rowLabelsExposed.Add( row ); } - + iter++ ; } } @@ -1353,13 +1396,13 @@ void wxGrid::CalcColLabelsExposed( wxRegion& reg ) for ( col = 0; col < m_numCols; col++ ) { if ( m_colRights[col] < left ) continue; - + colLeft = m_colRights[col] - m_colWidths[col]; if ( colLeft > right ) break; m_colLabelsExposed.Add( col ); } - + iter++ ; } } @@ -1408,21 +1451,21 @@ void wxGrid::CalcCellsExposed( wxRegion& reg ) rowTop = m_rowBottoms[row] - m_rowHeights[row]; if ( rowTop > bottom ) break; - + m_rowsExposed.Add( row ); for ( col = 0; col < m_numCols; col++ ) { if ( m_colRights[col] < left ) continue; - + colLeft = m_colRights[col] - m_colWidths[col]; if ( colLeft > right ) break; - + if ( m_colsExposed.Index( col ) == wxNOT_FOUND ) m_colsExposed.Add( col ); m_cellsExposed.Add( wxGridCellCoords( row, col ) ); } } - + iter++ ; } } @@ -1433,7 +1476,7 @@ void wxGrid::ProcessRowLabelMouseEvent( wxMouseEvent& event ) int x, y, row; wxPoint pos( event.GetPosition() ); CalcUnscrolledPosition( pos.x, pos.y, &x, &y ); - + if ( event.Dragging() ) { m_isDragging = TRUE; @@ -1447,10 +1490,10 @@ void wxGrid::ProcessRowLabelMouseEvent( wxMouseEvent& event ) int cw, ch, left, dummy; m_gridWin->GetClientSize( &cw, &ch ); CalcUnscrolledPosition( 0, 0, &left, &dummy ); - + wxClientDC dc( m_gridWin ); PrepareDC( dc ); - dc.SetLogicalFunction(wxXOR); + dc.SetLogicalFunction(wxINVERT); if ( m_dragLastPos >= 0 ) { dc.DrawLine( left, m_dragLastPos, left+cw, m_dragLastPos ); @@ -1476,7 +1519,7 @@ void wxGrid::ProcessRowLabelMouseEvent( wxMouseEvent& event ) m_isDragging = FALSE; - + // ------------ Left button pressed // if ( event.LeftDown() ) @@ -1488,7 +1531,8 @@ void wxGrid::ProcessRowLabelMouseEvent( wxMouseEvent& event ) if ( YToEdgeOfRow(y) < 0 ) { row = YToRow(y); - if ( !SendEvent( EVT_GRID_LABEL_LEFT_CLICK, row, -1, event ) ) + if ( row >= 0 && + !SendEvent( EVT_GRID_LABEL_LEFT_CLICK, row, -1, event ) ) { SelectRow( row, event.ShiftDown() ); m_cursorMode = WXGRID_CURSOR_SELECT_ROW; @@ -1513,8 +1557,8 @@ void wxGrid::ProcessRowLabelMouseEvent( wxMouseEvent& event ) SendEvent( EVT_GRID_LABEL_LEFT_DCLICK, row, -1, event ); } } - - + + // ------------ Left button released // else if ( event.LeftUp() ) @@ -1522,7 +1566,7 @@ void wxGrid::ProcessRowLabelMouseEvent( wxMouseEvent& event ) if ( m_cursorMode == WXGRID_CURSOR_RESIZE_ROW ) { m_rowLabelWin->ReleaseMouse(); - + if ( m_dragLastPos >= 0 ) { // erase the last line and resize the row @@ -1530,7 +1574,7 @@ void wxGrid::ProcessRowLabelMouseEvent( wxMouseEvent& event ) int cw, ch, left, dummy; m_gridWin->GetClientSize( &cw, &ch ); CalcUnscrolledPosition( 0, 0, &left, &dummy ); - + wxClientDC dc( m_gridWin ); PrepareDC( dc ); dc.SetLogicalFunction( wxINVERT ); @@ -1538,14 +1582,14 @@ void wxGrid::ProcessRowLabelMouseEvent( wxMouseEvent& event ) HideCellEditControl(); int rowTop = m_rowBottoms[m_dragRowOrCol] - m_rowHeights[m_dragRowOrCol]; - SetRowSize( m_dragRowOrCol, wxMax( y - rowTop, WXGRID_MIN_ROW_HEIGHT ) ); + SetRowSize( m_dragRowOrCol, wxMax( y - rowTop, WXGRID_MIN_ROW_HEIGHT ) ); if ( !GetBatchCount() ) { // TODO: optimize this m_rowLabelWin->Refresh(); m_gridWin->Refresh(); } - + ShowCellEditControl(); // Note: we are ending the event *after* doing @@ -1569,8 +1613,8 @@ void wxGrid::ProcessRowLabelMouseEvent( wxMouseEvent& event ) // no default action at the moment } } - - + + // ------------ Right double click // else if ( event.RightDClick() ) @@ -1581,8 +1625,8 @@ void wxGrid::ProcessRowLabelMouseEvent( wxMouseEvent& event ) // no default action at the moment } } - - + + // ------------ No buttons down and mouse moving // else if ( event.Moving() ) @@ -1613,7 +1657,7 @@ void wxGrid::ProcessColLabelMouseEvent( wxMouseEvent& event ) int x, y, col; wxPoint pos( event.GetPosition() ); CalcUnscrolledPosition( pos.x, pos.y, &x, &y ); - + if ( event.Dragging() ) { m_isDragging = TRUE; @@ -1627,10 +1671,10 @@ void wxGrid::ProcessColLabelMouseEvent( wxMouseEvent& event ) int cw, ch, dummy, top; m_gridWin->GetClientSize( &cw, &ch ); CalcUnscrolledPosition( 0, 0, &dummy, &top ); - + wxClientDC dc( m_gridWin ); PrepareDC( dc ); - dc.SetLogicalFunction(wxXOR); + dc.SetLogicalFunction(wxINVERT); if ( m_dragLastPos >= 0 ) { dc.DrawLine( m_dragLastPos, top, m_dragLastPos, top+ch ); @@ -1656,7 +1700,7 @@ void wxGrid::ProcessColLabelMouseEvent( wxMouseEvent& event ) m_isDragging = FALSE; - + // ------------ Left button pressed // if ( event.LeftDown() ) @@ -1668,7 +1712,8 @@ void wxGrid::ProcessColLabelMouseEvent( wxMouseEvent& event ) if ( XToEdgeOfCol(x) < 0 ) { col = XToCol(x); - if ( !SendEvent( EVT_GRID_LABEL_LEFT_CLICK, -1, col, event ) ) + if ( col >= 0 && + !SendEvent( EVT_GRID_LABEL_LEFT_CLICK, -1, col, event ) ) { SelectCol( col, event.ShiftDown() ); m_cursorMode = WXGRID_CURSOR_SELECT_COL; @@ -1693,8 +1738,8 @@ void wxGrid::ProcessColLabelMouseEvent( wxMouseEvent& event ) SendEvent( EVT_GRID_LABEL_LEFT_DCLICK, -1, col, event ); } } - - + + // ------------ Left button released // else if ( event.LeftUp() ) @@ -1702,7 +1747,7 @@ void wxGrid::ProcessColLabelMouseEvent( wxMouseEvent& event ) if ( m_cursorMode == WXGRID_CURSOR_RESIZE_COL ) { m_colLabelWin->ReleaseMouse(); - + if ( m_dragLastPos >= 0 ) { // erase the last line and resize the col @@ -1710,7 +1755,7 @@ void wxGrid::ProcessColLabelMouseEvent( wxMouseEvent& event ) int cw, ch, dummy, top; m_gridWin->GetClientSize( &cw, &ch ); CalcUnscrolledPosition( 0, 0, &dummy, &top ); - + wxClientDC dc( m_gridWin ); PrepareDC( dc ); dc.SetLogicalFunction( wxINVERT ); @@ -1718,15 +1763,15 @@ void wxGrid::ProcessColLabelMouseEvent( wxMouseEvent& event ) HideCellEditControl(); int colLeft = m_colRights[m_dragRowOrCol] - m_colWidths[m_dragRowOrCol]; - SetColSize( m_dragRowOrCol, wxMax( x - colLeft, WXGRID_MIN_COL_WIDTH ) ); - + SetColSize( m_dragRowOrCol, wxMax( x - colLeft, WXGRID_MIN_COL_WIDTH ) ); + if ( !GetBatchCount() ) { // TODO: optimize this m_colLabelWin->Refresh(); m_gridWin->Refresh(); } - + ShowCellEditControl(); // Note: we are ending the event *after* doing @@ -1737,9 +1782,9 @@ void wxGrid::ProcessColLabelMouseEvent( wxMouseEvent& event ) } m_dragLastPos = -1; - } - - + } + + // ------------ Right button down // else if ( event.RightDown() ) @@ -1750,8 +1795,8 @@ void wxGrid::ProcessColLabelMouseEvent( wxMouseEvent& event ) // no default action at the moment } } - - + + // ------------ Right double click // else if ( event.RightDClick() ) @@ -1762,8 +1807,8 @@ void wxGrid::ProcessColLabelMouseEvent( wxMouseEvent& event ) // no default action at the moment } } - - + + // ------------ No buttons down and mouse moving // else if ( event.Moving() ) @@ -1830,16 +1875,19 @@ void wxGrid::ProcessGridCellMouseEvent( wxMouseEvent& event ) int x, y; wxPoint pos( event.GetPosition() ); CalcUnscrolledPosition( pos.x, pos.y, &x, &y ); - + wxGridCellCoords coords; XYToCell( x, y, coords ); - + if ( event.Dragging() ) { m_isDragging = TRUE; - if ( m_cursorMode == WXGRID_CURSOR_SELECT_CELL ) { + // Hide the edit control, so it + // won't interfer with drag-shrinking. + if ( IsCellEditControlEnabled() ) + HideCellEditControl(); if ( coords != wxGridNoCellCoords ) { if ( !IsSelection() ) @@ -1848,8 +1896,7 @@ void wxGrid::ProcessGridCellMouseEvent( wxMouseEvent& event ) } else { - if ( !IsInSelection( coords ) ) - SelectBlock( m_currentCellCoords, coords ); + SelectBlock( m_currentCellCoords, coords ); } } } @@ -1859,71 +1906,86 @@ void wxGrid::ProcessGridCellMouseEvent( wxMouseEvent& event ) m_isDragging = FALSE; - if ( event.LeftDown() ) + if ( coords != wxGridNoCellCoords ) { - if ( !SendEvent( EVT_GRID_CELL_LEFT_CLICK, - coords.GetRow(), - coords.GetCol(), - event ) ) + if ( event.LeftDown() ) { - MakeCellVisible( coords ); - SetCurrentCell( coords ); + if ( event.ShiftDown() ) + { + SelectBlock( m_currentCellCoords, coords ); + } + else + { + if ( !SendEvent( EVT_GRID_CELL_LEFT_CLICK, + coords.GetRow(), + coords.GetCol(), + event ) ) + { + MakeCellVisible( coords ); + SetCurrentCell( coords ); + } + } } - } - // ------------ Left double click - // - else if ( event.LeftDClick() ) - { - SendEvent( EVT_GRID_CELL_LEFT_DCLICK, - coords.GetRow(), - coords.GetCol(), - event ); - } + // ------------ Left double click + // + else if ( event.LeftDClick() ) + { + SendEvent( EVT_GRID_CELL_LEFT_DCLICK, + coords.GetRow(), + coords.GetCol(), + event ); + } - // ------------ Left button released - // - else if ( event.LeftUp() ) - { - if ( m_cursorMode == WXGRID_CURSOR_SELECT_CELL ) + // ------------ Left button released + // + else if ( event.LeftUp() ) { - if ( IsSelection() ) + if ( m_cursorMode == WXGRID_CURSOR_SELECT_CELL ) { - SendEvent( EVT_GRID_RANGE_SELECT, -1, -1, event ); + if ( IsSelection() ) + { + SendEvent( EVT_GRID_RANGE_SELECT, -1, -1, event ); + } } - } - m_dragLastPos = -1; - } + // Show the edit control, if it has + // been hidden for drag-shrinking. + if ( IsCellEditControlEnabled() ) + ShowCellEditControl(); + m_dragLastPos = -1; + } - // ------------ Right button down - // - else if ( event.RightDown() ) - { - if ( !SendEvent( EVT_GRID_CELL_RIGHT_CLICK, - coords.GetRow(), - coords.GetCol(), - event ) ) + + // ------------ Right button down + // + else if ( event.RightDown() ) { - // no default action at the moment - } - } + if ( !SendEvent( EVT_GRID_CELL_RIGHT_CLICK, + coords.GetRow(), + coords.GetCol(), + event ) ) + { + // no default action at the moment + } + } - - // ------------ Right double click - // - else if ( event.RightDClick() ) - { - if ( !SendEvent( EVT_GRID_CELL_RIGHT_DCLICK, - coords.GetRow(), - coords.GetCol(), - event ) ) + + // ------------ Right double click + // + else if ( event.RightDClick() ) { - // no default action at the moment - } + if ( !SendEvent( EVT_GRID_CELL_RIGHT_DCLICK, + coords.GetRow(), + coords.GetCol(), + event ) ) + { + // no default action at the moment + } + } } } @@ -2375,9 +2437,26 @@ void wxGrid::OnKeyDown( wxKeyEvent& event ) MoveCursorRight(); } break; + + case WXK_SPACE: + if ( !IsEditable() ) + { + MoveCursorRight(); + } + else + { + event.Skip(); + } case WXK_RETURN: - MoveCursorDown(); + if ( event.ControlDown() ) + { + event.Skip(); // to let the edit control have the return + } + else + { + MoveCursorDown(); + } break; case WXK_HOME: @@ -2506,10 +2585,10 @@ bool wxGrid::SetModelValues() void wxGrid::DrawGridCellArea( wxDC& dc ) { if ( !m_numRows || !m_numCols ) return; - + size_t i; size_t numCells = m_cellsExposed.GetCount(); - + for ( i = 0; i < numCells; i++ ) { DrawCell( dc, m_cellsExposed[i] ); @@ -2521,7 +2600,7 @@ void wxGrid::DrawCell( wxDC& dc, const wxGridCellCoords& coords ) { if ( m_colWidths[coords.GetCol()] <=0 || m_rowHeights[coords.GetRow()] <= 0 ) return; - + if ( m_gridLinesEnabled ) DrawCellBorder( dc, coords ); @@ -2538,11 +2617,11 @@ void wxGrid::DrawCellBorder( wxDC& dc, const wxGridCellCoords& coords ) { if ( m_colWidths[coords.GetCol()] <=0 || m_rowHeights[coords.GetRow()] <= 0 ) return; - + dc.SetPen( wxPen(GetGridLineColour(), 1, wxSOLID) ); int row = coords.GetRow(); int col = coords.GetCol(); - + // right hand border // dc.DrawLine( m_colRights[col], m_rowBottoms[row] - m_rowHeights[row], @@ -2559,7 +2638,7 @@ void wxGrid::DrawCellBackground( wxDC& dc, const wxGridCellCoords& coords ) { if ( m_colWidths[coords.GetCol()] <=0 || m_rowHeights[coords.GetRow()] <= 0 ) return; - + int row = coords.GetRow(); int col = coords.GetCol(); @@ -2589,7 +2668,7 @@ void wxGrid::DrawCellValue( wxDC& dc, const wxGridCellCoords& coords ) { if ( m_colWidths[coords.GetCol()] <=0 || m_rowHeights[coords.GetRow()] <= 0 ) return; - + int row = coords.GetRow(); int col = coords.GetCol(); @@ -2617,7 +2696,7 @@ void wxGrid::DrawCellValue( wxDC& dc, const wxGridCellCoords& coords ) rect.SetY( m_rowBottoms[row] - m_rowHeights[row] + 2 ); rect.SetWidth( m_colWidths[col] - 4 ); rect.SetHeight( m_rowHeights[row] - 4 ); - + DrawTextRectangle( dc, GetCellValue( row, col ), rect, hAlign, vAlign ); } @@ -2629,8 +2708,8 @@ void wxGrid::DrawCellValue( wxDC& dc, const wxGridCellCoords& coords ) // void wxGrid::DrawAllGridLines( wxDC& dc ) { - if ( !m_gridLinesEnabled || - !m_numRows || + if ( !m_gridLinesEnabled || + !m_numRows || !m_numCols ) return; int cw, ch; @@ -2646,7 +2725,7 @@ void wxGrid::DrawAllGridLines( wxDC& dc ) // horizontal grid lines // - int i; + int i; for ( i = 0; i <= m_numRows; i++ ) { if ( m_rowBottoms[i] > bottom ) @@ -2679,21 +2758,21 @@ void wxGrid::DrawAllGridLines( wxDC& dc ) void wxGrid::DrawRowLabels( wxDC& dc ) { if ( !m_numRows || !m_numCols ) return; - + size_t i; size_t numLabels = m_rowLabelsExposed.GetCount(); - + for ( i = 0; i < numLabels; i++ ) { DrawRowLabel( dc, m_rowLabelsExposed[i] ); - } + } } void wxGrid::DrawRowLabel( wxDC& dc, int row ) { if ( m_rowHeights[row] <= 0 ) return; - + // draw the label's horizontal border (the vertical border is // provided by the cell area window margin) // @@ -2706,41 +2785,41 @@ void wxGrid::DrawRowLabel( wxDC& dc, int row ) dc.DrawLine( 0, m_rowBottoms[row]+2, m_rowLabelWidth, m_rowBottoms[row]+2 ); - + dc.SetBackgroundMode( wxTRANSPARENT ); dc.SetTextForeground( GetLabelTextColour() ); dc.SetFont( GetLabelFont() ); int hAlign, vAlign; GetRowLabelAlignment( &hAlign, &vAlign ); - + wxRect rect; rect.SetX( 2 ); rect.SetY( m_rowBottoms[row] - m_rowHeights[row] + 2 ); rect.SetWidth( m_rowLabelWidth - 4 ); rect.SetHeight( m_rowHeights[row] - 4 ); - DrawTextRectangle( dc, GetRowLabelValue( row ), rect, hAlign, vAlign ); + DrawTextRectangle( dc, GetRowLabelValue( row ), rect, hAlign, vAlign ); } void wxGrid::DrawColLabels( wxDC& dc ) { if ( !m_numRows || !m_numCols ) return; - + size_t i; size_t numLabels = m_colLabelsExposed.GetCount(); - + for ( i = 0; i < numLabels; i++ ) { DrawColLabel( dc, m_colLabelsExposed[i] ); - } + } } void wxGrid::DrawColLabel( wxDC& dc, int col ) { if ( m_colWidths[col] <= 0 ) return; - + // draw the label's vertical border (the horizontal border is // provided by the cell area window margin) // @@ -2760,13 +2839,13 @@ void wxGrid::DrawColLabel( wxDC& dc, int col ) int hAlign, vAlign; GetColLabelAlignment( &hAlign, &vAlign ); - + wxRect rect; rect.SetX( m_colRights[col] - m_colWidths[col] + 2 ); rect.SetY( 2 ); rect.SetWidth( m_colWidths[col] - 4 ); rect.SetHeight( m_colLabelHeight - 4 ); - DrawTextRectangle( dc, GetColLabelValue( col ), rect, hAlign, vAlign ); + DrawTextRectangle( dc, GetColLabelValue( col ), rect, hAlign, vAlign ); } @@ -2922,7 +3001,7 @@ void wxGrid::EnableCellEditControl( bool enable ) enable != m_cellEditCtrlEnabled ) { m_cellEditCtrlEnabled = enable; - + if ( m_cellEditCtrlEnabled ) { SetEditControlValue(); @@ -2957,25 +3036,52 @@ void wxGrid::ShowCellEditControl() int left, top, right, bottom; CalcScrolledPosition( rect.GetLeft(), rect.GetTop(), &left, &top ); CalcScrolledPosition( rect.GetRight(), rect.GetBottom(), &right, &bottom ); - + int cw, ch; m_gridWin->GetClientSize( &cw, &ch ); // Make the edit control large enough to allow for internal margins // TODO: remove this if the text ctrl sizing is improved esp. for unix // -#if defined (__WXMOTIF__) - rect.SetLeft( wxMax(0, left-4) ); - rect.SetTop( wxMax(0, top-4) ); - rect.SetRight( rect.GetRight() + 8 ); - rect.SetBottom( rect.GetBottom() + 8 ); + int extra; +#if defined(__WXMOTIF__) + if ( m_currentCellCoords.GetRow() == 0 || + m_currentCellCoords.GetCol() == 0 ) + { + extra = 2; + } + else + { + extra = 4; + } #else - rect.SetLeft( wxMax(0, left-2) ); - rect.SetTop( wxMax(0, top-2) ); - rect.SetRight( rect.GetRight() + 4 ); - rect.SetBottom( rect.GetBottom() + 4 ); + if ( m_currentCellCoords.GetRow() == 0 || + m_currentCellCoords.GetCol() == 0 ) + { + extra = 1; + } + else + { + extra = 2; + } +#endif + +#if defined(__WXGTK__) + int top_diff = 0; + int left_diff = 0; + if (left != 0) left_diff++; + if (top != 0) top_diff++; + rect.SetLeft( left + left_diff ); + rect.SetTop( top + top_diff ); + rect.SetRight( rect.GetRight() - left_diff ); + rect.SetBottom( rect.GetBottom() - top_diff ); +#else + rect.SetLeft( wxMax(0, left - extra) ); + rect.SetTop( wxMax(0, top - extra) ); + rect.SetRight( rect.GetRight() + 2*extra ); + rect.SetBottom( rect.GetBottom() + 2*extra ); #endif - + m_cellEditCtrl->SetSize( rect ); m_cellEditCtrl->Show( TRUE ); @@ -3107,16 +3213,25 @@ void wxGrid::SaveEditControlValue() // -// ------ Grid location functions -// Note that all of these functions work with the logical coordinates of +// ------ Grid location functions +// Note that all of these functions work with the logical coordinates of // grid cells and labels so you will need to convert from device // coordinates for mouse events etc. // void wxGrid::XYToCell( int x, int y, wxGridCellCoords& coords ) { - coords.SetRow( YToRow(y) ); - coords.SetCol( XToCol(x) ); + int row = YToRow(y); + int col = XToCol(x); + + if ( row == -1 || col == -1 ) + { + coords = wxGridNoCellCoords; + } + else + { + coords.Set( row, col ); + } } @@ -3212,18 +3327,18 @@ bool wxGrid::IsVisible( int row, int col, bool wholeCellVisible ) // get the cell rectangle in logical coords // wxRect r( CellToRect( row, col ) ); - + // convert to device coords // int left, top, right, bottom; CalcScrolledPosition( r.GetLeft(), r.GetTop(), &left, &top ); CalcScrolledPosition( r.GetRight(), r.GetBottom(), &right, &bottom ); - + // check against the client area of the grid window // int cw, ch; m_gridWin->GetClientSize( &cw, &ch ); - + if ( wholeCellVisible ) { // is the cell wholly visible ? @@ -3247,7 +3362,7 @@ bool wxGrid::IsVisible( int row, int col, bool wholeCellVisible ) void wxGrid::MakeCellVisible( int row, int col ) { int i; - int xpos = -1, ypos = -1; + int xpos = -1, ypos = -1; if ( row >= 0 && row < m_numRows && col >= 0 && col < m_numCols ) @@ -3255,16 +3370,16 @@ void wxGrid::MakeCellVisible( int row, int col ) // get the cell rectangle in logical coords // wxRect r( CellToRect( row, col ) ); - + // convert to device coords // int left, top, right, bottom; CalcScrolledPosition( r.GetLeft(), r.GetTop(), &left, &top ); CalcScrolledPosition( r.GetRight(), r.GetBottom(), &right, &bottom ); - + int cw, ch; m_gridWin->GetClientSize( &cw, &ch ); - + if ( top < 0 ) { ypos = r.GetTop(); @@ -3280,6 +3395,11 @@ void wxGrid::MakeCellVisible( int row, int col ) h += m_rowHeights[i]; ypos -= m_rowHeights[i]; } + + // we divide it later by GRID_SCROLL_LINE, make sure that we don't + // have rounding errors (this is important, because if we do, we + // might not scroll at all and some cells won't be redrawn) + ypos += GRID_SCROLL_LINE / 2; } if ( left < 0 ) @@ -3297,12 +3417,15 @@ void wxGrid::MakeCellVisible( int row, int col ) w += m_colWidths[i]; xpos -= m_colWidths[i]; } + + // see comment for ypos above + xpos += GRID_SCROLL_LINE / 2; } if ( xpos != -1 || ypos != -1 ) { - if ( xpos != -1 ) xpos = xpos/10; - if ( ypos != -1 ) ypos = ypos/10; + if ( xpos != -1 ) xpos /= GRID_SCROLL_LINE; + if ( ypos != -1 ) ypos /= GRID_SCROLL_LINE; Scroll( xpos, ypos ); AdjustScrollbars(); } @@ -3321,7 +3444,7 @@ bool wxGrid::MoveCursorUp() { MakeCellVisible( m_currentCellCoords.GetRow() - 1, m_currentCellCoords.GetCol() ); - + SetCurrentCell( m_currentCellCoords.GetRow() - 1, m_currentCellCoords.GetCol() ); @@ -3341,7 +3464,7 @@ bool wxGrid::MoveCursorDown() { MakeCellVisible( m_currentCellCoords.GetRow() + 1, m_currentCellCoords.GetCol() ); - + SetCurrentCell( m_currentCellCoords.GetRow() + 1, m_currentCellCoords.GetCol() ); @@ -3359,7 +3482,7 @@ bool wxGrid::MoveCursorLeft() { MakeCellVisible( m_currentCellCoords.GetRow(), m_currentCellCoords.GetCol() - 1 ); - + SetCurrentCell( m_currentCellCoords.GetRow(), m_currentCellCoords.GetCol() - 1 ); @@ -3377,7 +3500,7 @@ bool wxGrid::MoveCursorRight() { MakeCellVisible( m_currentCellCoords.GetRow(), m_currentCellCoords.GetCol() + 1 ); - + SetCurrentCell( m_currentCellCoords.GetRow(), m_currentCellCoords.GetCol() + 1 ); @@ -3391,27 +3514,27 @@ bool wxGrid::MoveCursorRight() bool wxGrid::MovePageUp() { if ( m_currentCellCoords == wxGridNoCellCoords ) return FALSE; - + int row = m_currentCellCoords.GetRow(); if ( row > 0 ) { int cw, ch; m_gridWin->GetClientSize( &cw, &ch ); - + int y = m_rowBottoms[ row ] - m_rowHeights[ row ]; int newRow = YToRow( y - ch + 1 ); if ( newRow == -1 ) { newRow = 0; } - else if ( newRow == row ) + else if ( newRow == row ) { newRow = row - 1; } MakeCellVisible( newRow, m_currentCellCoords.GetCol() ); SetCurrentCell( newRow, m_currentCellCoords.GetCol() ); - + return TRUE; } @@ -3421,27 +3544,27 @@ bool wxGrid::MovePageUp() bool wxGrid::MovePageDown() { if ( m_currentCellCoords == wxGridNoCellCoords ) return FALSE; - + int row = m_currentCellCoords.GetRow(); if ( row < m_numRows ) { int cw, ch; m_gridWin->GetClientSize( &cw, &ch ); - + int y = m_rowBottoms[ row ] - m_rowHeights[ row ]; int newRow = YToRow( y + ch ); if ( newRow == -1 ) { newRow = m_numRows - 1; } - else if ( newRow == row ) + else if ( newRow == row ) { newRow = row + 1; } MakeCellVisible( newRow, m_currentCellCoords.GetCol() ); SetCurrentCell( newRow, m_currentCellCoords.GetCol() ); - + return TRUE; } @@ -3781,7 +3904,7 @@ void wxGrid::SetRowLabelAlignment( int horiz, int vert ) { m_rowLabelWin->Refresh(); m_colLabelWin->Refresh(); - } + } } void wxGrid::SetColLabelAlignment( int horiz, int vert ) @@ -3800,7 +3923,7 @@ void wxGrid::SetColLabelAlignment( int horiz, int vert ) { m_rowLabelWin->Refresh(); m_colLabelWin->Refresh(); - } + } } void wxGrid::SetRowLabelValue( int row, const wxString& s ) @@ -3836,7 +3959,7 @@ void wxGrid::SetGridLineColour( const wxColour& colour ) if ( m_gridLineColour != colour ) { m_gridLineColour = colour; - + wxClientDC dc( m_gridWin ); PrepareDC( dc ); DrawAllGridLines( dc ); @@ -3970,19 +4093,19 @@ void wxGrid::SetDefaultRowSize( int height, bool resizeExistingRows ) void wxGrid::SetRowSize( int row, int height ) { int i; - + if ( row >= 0 && row < m_numRows ) { int h = wxMax( 0, height ); int diff = h - m_rowHeights[row]; - + m_rowHeights[row] = h; for ( i = row; i < m_numRows; i++ ) { m_rowBottoms[i] += diff; } CalcDimensions(); - + // Note: we are ending the event *after* doing // default processing in this case // @@ -4016,7 +4139,7 @@ void wxGrid::SetDefaultColSize( int width, bool resizeExistingCols ) void wxGrid::SetColSize( int col, int width ) { int i; - + if ( col >= 0 && col < m_numCols ) { int w = wxMax( 0, width ); @@ -4028,7 +4151,7 @@ void wxGrid::SetColSize( int col, int width ) m_colRights[i] += diff; } CalcDimensions(); - + // Note: we are ending the event *after* doing // default processing in this case // @@ -4106,9 +4229,9 @@ void wxGrid::SetCellValue( int row, int col, const wxString& s ) PrepareDC( dc ); DrawCell( dc, wxGridCellCoords(row, col) ); } - + #if 0 // TODO: edit in place - + if ( m_currentCellCoords.GetRow() == row && m_currentCellCoords.GetCol() == col ) { @@ -4127,7 +4250,7 @@ void wxGrid::SetCellValue( int row, int col, const wxString& s ) void wxGrid::SelectRow( int row, bool addToSelected ) { wxRect r; - + if ( IsSelection() && addToSelected ) { if ( m_selectedTopLeft.GetRow() > row ) @@ -4151,7 +4274,7 @@ void wxGrid::SelectRow( int row, bool addToSelected ) r = SelectionToDeviceRect(); ClearSelection(); if ( r != wxGridNoCellRect ) m_gridWin->Refresh( TRUE, &r ); - + m_selectedTopLeft.Set( row, 0 ); m_selectedBottomRight.Set( row, m_numCols-1 ); r = SelectionToDeviceRect(); @@ -4171,7 +4294,7 @@ void wxGrid::SelectRow( int row, bool addToSelected ) void wxGrid::SelectCol( int col, bool addToSelected ) { wxRect r; - + if ( IsSelection() && addToSelected ) { if ( m_selectedTopLeft.GetCol() > col ) @@ -4195,7 +4318,7 @@ void wxGrid::SelectCol( int col, bool addToSelected ) r = SelectionToDeviceRect(); ClearSelection(); if ( r != wxGridNoCellRect ) m_gridWin->Refresh( TRUE, &r ); - + m_selectedTopLeft.Set( 0, col ); m_selectedBottomRight.Set( m_numRows-1, col ); r = SelectionToDeviceRect(); @@ -4215,6 +4338,8 @@ void wxGrid::SelectCol( int col, bool addToSelected ) void wxGrid::SelectBlock( int topRow, int leftCol, int bottomRow, int rightCol ) { int temp; + bool changed = false; + wxGridCellCoords updateTopLeft, updateBottomRight; if ( topRow > bottomRow ) { @@ -4230,12 +4355,47 @@ void wxGrid::SelectBlock( int topRow, int leftCol, int bottomRow, int rightCol ) rightCol = temp; } - m_selectedTopLeft.Set( topRow, leftCol ); - m_selectedBottomRight.Set( bottomRow, rightCol ); - - wxRect r; - r = SelectionToDeviceRect(); - m_gridWin->Refresh( TRUE, &r ); + updateTopLeft = m_selectedTopLeft; + if (m_selectedTopLeft != wxGridCellCoords( topRow, leftCol ) ) + { + m_selectedTopLeft = wxGridCellCoords( topRow, leftCol ); + if (updateTopLeft == wxGridNoCellCoords) + { + updateTopLeft = m_selectedTopLeft; + } + else + { + if(updateTopLeft.GetRow() > topRow) + updateTopLeft.SetRow(topRow); + if (updateTopLeft.GetCol() > leftCol) + updateTopLeft.SetCol(leftCol); + } + changed = true; + } + + updateBottomRight = m_selectedBottomRight; + if (m_selectedBottomRight != wxGridCellCoords( bottomRow, rightCol ) ) + { + m_selectedBottomRight = wxGridCellCoords( bottomRow, rightCol ); + if (updateBottomRight == wxGridNoCellCoords) + { + updateBottomRight = m_selectedBottomRight; + } + else + { + if (updateBottomRight.GetRow() < bottomRow) + updateBottomRight.SetRow(bottomRow); + if (updateBottomRight.GetCol() < rightCol) + updateBottomRight.SetCol(rightCol); + } + changed = true; + } + + if (changed) + { + wxRect r( BlockToDeviceRect( updateTopLeft, updateBottomRight ) ); + m_gridWin->Refresh( TRUE, &r ); + } // only generate an event if the block is not being selected by // dragging the mouse (in which case the event will be generated in @@ -4268,59 +4428,54 @@ void wxGrid::ClearSelection() } -// This function returns the rectangle that encloses the selected cells +// This function returns the rectangle that encloses the given block // in device coords clipped to the client size of the grid window. // -wxRect wxGrid::SelectionToDeviceRect() +wxRect wxGrid::BlockToDeviceRect( const wxGridCellCoords &topLeft, + const wxGridCellCoords &bottomRight ) { - wxRect rect; + wxRect rect( wxGridNoCellRect ); wxRect cellRect; - if ( IsSelection() ) + cellRect = CellToRect( topLeft ); + if ( cellRect != wxGridNoCellRect ) { - cellRect = CellToRect( m_selectedTopLeft ); - if ( cellRect != wxGridNoCellRect ) - { - rect = cellRect; - } - else - { - rect = wxRect( 0, 0, 0, 0 ); - } - - cellRect = CellToRect( m_selectedBottomRight ); - if ( cellRect != wxGridNoCellRect ) - { - rect += cellRect; - } - else - { - return wxGridNoCellRect; - } + rect = cellRect; + } + else + { + rect = wxRect( 0, 0, 0, 0 ); + } - // convert to scrolled coords - // - int left, top, right, bottom; - CalcScrolledPosition( rect.GetLeft(), rect.GetTop(), &left, &top ); - CalcScrolledPosition( rect.GetRight(), rect.GetBottom(), &right, &bottom ); - - int cw, ch; - m_gridWin->GetClientSize( &cw, &ch ); - - rect.SetLeft( wxMax(0, left) ); - rect.SetTop( wxMax(0, top) ); - rect.SetRight( wxMin(cw, right) ); - rect.SetBottom( wxMin(ch, bottom) ); + cellRect = CellToRect( bottomRight ); + if ( cellRect != wxGridNoCellRect ) + { + rect += cellRect; } else { return wxGridNoCellRect; } + // convert to scrolled coords + // + int left, top, right, bottom; + CalcScrolledPosition( rect.GetLeft(), rect.GetTop(), &left, &top ); + CalcScrolledPosition( rect.GetRight(), rect.GetBottom(), &right, &bottom ); + + int cw, ch; + m_gridWin->GetClientSize( &cw, &ch ); + + rect.SetLeft( wxMax(0, left) ); + rect.SetTop( wxMax(0, top) ); + rect.SetRight( wxMin(cw, right) ); + rect.SetBottom( wxMin(ch, bottom) ); + return rect; } + // // ------ Grid event classes //