]> git.saurik.com Git - wxWidgets.git/blobdiff - src/generic/grid.cpp
Fixed typo
[wxWidgets.git] / src / generic / grid.cpp
index fd543009782ba2987b4aa210d6b842e9ff6bbf2b..21fed2866edfd29c189328e75d8002a9999563cd 100644 (file)
@@ -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,76 +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;    
-
-    // TODO: do we need this or should the top edit control be an add-on ?
-    //
-    m_topEditCtrl    = (wxWindow *) NULL;
-}
-
 
 bool wxGrid::CreateGrid( int numRows, int numCols )
 {
@@ -983,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 ?
     //
@@ -998,8 +1037,14 @@ void wxGrid::Init()
     m_colLabelVertAlign  = wxTOP;
 
     m_defaultColWidth  = WXGRID_DEFAULT_COL_WIDTH;
-    m_defaultRowHeight = m_gridWin->GetCharHeight() + 8;
-    
+    m_defaultRowHeight = m_gridWin->GetCharHeight();
+
+#if defined(__WXMOTIF__) || defined(__WXGTK__)  // see also text ctrl sizing in ShowCellEditControl()
+    m_defaultRowHeight += 8;
+#else
+    m_defaultRowHeight += 4;
+#endif
+
     m_rowHeights.Alloc( m_numRows );
     m_rowBottoms.Alloc( m_numRows );
     int rowBottom = 0;
@@ -1027,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;
@@ -1036,7 +1081,6 @@ void wxGrid::Init()
     m_colResizeCursor = wxCursor( wxCURSOR_SIZEWE );
 
     m_currentCellCoords = wxGridNoCellCoords;
-    m_currentCellHighlighted = FALSE;
 
     m_selectedTopLeft = wxGridNoCellCoords;
     m_selectedBottomRight = wxGridNoCellCoords;
@@ -1055,7 +1099,7 @@ void wxGrid::Init()
                                          "",
                                          wxPoint(1,1),
                                          wxSize(1,1)
-#ifdef __WXMSW__
+#if defined(__WXMSW__)
                                          , wxTE_MULTILINE | wxTE_NO_VSCROLL
 #endif
                                          );
@@ -1063,10 +1107,6 @@ void wxGrid::Init()
     m_cellEditCtrl->Show( FALSE );
     m_cellEditCtrlEnabled = TRUE;
     m_editCtrlType = wxGRID_TEXTCTRL;
-    
-    // TODO: do we need this or should the top edit control be an add-on ?
-    //    
-    m_topEditCtrlEnabled = FALSE;    
 }
 
 
@@ -1079,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 );
     }
 }
@@ -1113,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];
@@ -1137,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];
@@ -1177,7 +1217,7 @@ bool wxGrid::Redimension( wxGridTableMessage& msg )
                     m_rowBottoms[i] = h;
                 }
             }
-                
+
             CalcDimensions();
         }
         return TRUE;
@@ -1195,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];
@@ -1219,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];
@@ -1249,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 );
@@ -1310,10 +1350,10 @@ void wxGrid::CalcRowLabelsExposed( wxRegion& reg )
 
             rowTop = m_rowBottoms[row] - m_rowHeights[row];
             if ( rowTop > bottom ) break;
-            
+
             m_rowLabelsExposed.Add( row );
         }
-        
+
         iter++ ;
     }
 }
@@ -1356,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++ ;
     }
 }
@@ -1411,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++ ;
     }
 }
@@ -1436,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;
@@ -1450,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 );
@@ -1479,7 +1519,7 @@ void wxGrid::ProcessRowLabelMouseEvent( wxMouseEvent& event )
 
     m_isDragging = FALSE;
 
-    
+
     // ------------ Left button pressed
     //
     if ( event.LeftDown() )
@@ -1491,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;
@@ -1516,8 +1557,8 @@ void wxGrid::ProcessRowLabelMouseEvent( wxMouseEvent& event )
             SendEvent(  EVT_GRID_LABEL_LEFT_DCLICK, row, -1, event );
         }
     }
-    
+
+
     // ------------ Left button released
     //
     else if ( event.LeftUp() )
@@ -1525,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
@@ -1533,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 );
@@ -1541,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
@@ -1572,8 +1613,8 @@ void wxGrid::ProcessRowLabelMouseEvent( wxMouseEvent& event )
             // no default action at the moment
         }
     }
-    
-    
+
+
     // ------------ Right double click
     //
     else if ( event.RightDClick() )
@@ -1584,8 +1625,8 @@ void wxGrid::ProcessRowLabelMouseEvent( wxMouseEvent& event )
             // no default action at the moment
         }
     }
-    
-    
+
+
     // ------------ No buttons down and mouse moving
     //
     else if ( event.Moving() )
@@ -1616,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;
@@ -1630,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 );
@@ -1659,7 +1700,7 @@ void wxGrid::ProcessColLabelMouseEvent( wxMouseEvent& event )
 
     m_isDragging = FALSE;
 
-    
+
     // ------------ Left button pressed
     //
     if ( event.LeftDown() )
@@ -1671,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;
@@ -1696,8 +1738,8 @@ void wxGrid::ProcessColLabelMouseEvent( wxMouseEvent& event )
             SendEvent(  EVT_GRID_LABEL_LEFT_DCLICK, -1, col, event );
         }
     }
-    
-    
+
+
     // ------------ Left button released
     //
     else if ( event.LeftUp() )
@@ -1705,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
@@ -1713,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 );
@@ -1721,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
@@ -1740,9 +1782,9 @@ void wxGrid::ProcessColLabelMouseEvent( wxMouseEvent& event )
         }
 
         m_dragLastPos  = -1;
-    }    
-    
-    
+    }
+
+
     // ------------ Right button down
     //
     else if ( event.RightDown() )
@@ -1753,8 +1795,8 @@ void wxGrid::ProcessColLabelMouseEvent( wxMouseEvent& event )
             // no default action at the moment
         }
     }
-    
-    
+
+
     // ------------ Right double click
     //
     else if ( event.RightDClick() )
@@ -1765,8 +1807,8 @@ void wxGrid::ProcessColLabelMouseEvent( wxMouseEvent& event )
             // no default action at the moment
         }
     }
-    
-    
+
+
     // ------------ No buttons down and mouse moving
     //
     else if ( event.Moving() )
@@ -1833,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() )
@@ -1851,8 +1896,7 @@ void wxGrid::ProcessGridCellMouseEvent( wxMouseEvent& event )
                 }
                 else
                 {
-                    if ( !IsInSelection( coords ) )
-                        SelectBlock( m_currentCellCoords, coords );
+                    SelectBlock( m_currentCellCoords, coords );
                 }
             }
         }
@@ -1862,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
+            }
+        }
     }
 }
 
@@ -1970,7 +2029,7 @@ void wxGrid::ClearGrid()
     {
         m_table->Clear();
         SetEditControlValue();
-        if ( !GetBatchCount() ) Refresh();
+        if ( !GetBatchCount() ) m_gridWin->Refresh();
     }
 }
 
@@ -2378,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:
@@ -2444,7 +2520,6 @@ void wxGrid::SetCurrentCell( const wxGridCellCoords& coords )
 
     if ( m_currentCellCoords != wxGridNoCellCoords )
     {
-        // HideCurrentCellHighlight( dc );
         HideCellEditControl();
         SaveEditControlValue();
     }
@@ -2453,7 +2528,6 @@ void wxGrid::SetCurrentCell( const wxGridCellCoords& coords )
 
     SetEditControlValue();
     ShowCellEditControl();
-    // ShowCurrentCellHighlight( dc );
 
     if ( IsSelection() )
     {
@@ -2511,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] );
@@ -2526,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 );
 
@@ -2543,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],
@@ -2564,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();
 
@@ -2594,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();
 
@@ -2622,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 );
 }
 
@@ -2634,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;
@@ -2651,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 )
@@ -2684,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)
     //
@@ -2711,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)
     //
@@ -2765,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 );
 }
 
 
@@ -2909,44 +2983,38 @@ void wxGrid::EnableEditing( bool edit )
     if ( edit != m_editable )
     {
         m_editable = edit;
-        if ( !m_editable ) HideCellEditControl();
-        m_cellEditCtrlEnabled = m_editable;
-        if ( m_editable ) ShowCellEditControl();
+
+        // TODO: extend this for other edit control types
+        //
+        if ( m_editCtrlType == wxGRID_TEXTCTRL )
+        {
+            ((wxTextCtrl *)m_cellEditCtrl)->SetEditable( m_editable );
+        }
     }
 }
 
 
+#if 0  // disabled for the moment - the cell control is always active
 void wxGrid::EnableCellEditControl( bool enable )
 {
     if ( m_cellEditCtrl &&
          enable != m_cellEditCtrlEnabled )
     {
         m_cellEditCtrlEnabled = enable;
-        
+
         if ( m_cellEditCtrlEnabled )
         {
             SetEditControlValue();
             ShowCellEditControl();
-            // ShowCurrentCellHighlight( dc );
         }
         else
         {
-            // HideCurrentCellHighlight( dc );
             HideCellEditControl();
             SaveEditControlValue();
         }
     }
 }
-
-
-// TODO: not implemented at the moment
-// Do we want it ?
-//
-void wxGrid::EnableTopEditControl( bool enable )
-{
-    // TODO: do we want this here or should the top edit
-    // control be an add-on class ?
-}
+#endif
 
 
 void wxGrid::ShowCellEditControl()
@@ -2968,13 +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 );
-        
-            rect.SetLeft( wxMax(0, left) );
-            rect.SetTop( wxMax(0, top) );
-            
+
+            // Make the edit control large enough to allow for internal margins
+            // TODO: remove this if the text ctrl sizing is improved esp. for unix
+            //
+            int extra;
+#if defined(__WXMOTIF__)
+            if ( m_currentCellCoords.GetRow() == 0  ||
+                 m_currentCellCoords.GetCol() == 0 )
+            {
+                extra = 2;
+            }
+            else
+            {
+                extra = 4;
+            }
+#else
+            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 );
 
@@ -3025,34 +3132,6 @@ void wxGrid::SetEditControlValue( const wxString& value )
         else
             s = value;
 
-        // TODO: no top edit control implemented at the moment...
-        // Do we want it in this class ?
-        //
-        if ( IsTopEditControlEnabled() )
-        {
-            switch ( m_editCtrlType )
-            {
-                case wxGRID_TEXTCTRL:
-                    ((wxGridTextCtrl *)m_topEditCtrl)->SetStartValue(s);
-                    break;
-
-                case wxGRID_CHECKBOX:
-                    // TODO: implement this
-                    //
-                    break;
-
-                case wxGRID_CHOICE:
-                    // TODO: implement this
-                    //
-                    break;
-
-                case wxGRID_COMBOBOX:
-                    // TODO: implement this
-                    //
-                    break;
-            }
-        }
-
         if ( IsCellEditControlEnabled() )
         {
             switch ( m_editCtrlType )
@@ -3091,10 +3170,6 @@ void wxGrid::SaveEditControlValue()
         {
             ctrl = m_cellEditCtrl;
         }
-        else if ( IsTopEditControlEnabled() )
-        {
-            ctrl = m_topEditCtrl;
-        }
         else
         {
             return;
@@ -3138,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 );
+    }
 }
 
 
@@ -3243,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 ?
@@ -3278,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 )
@@ -3286,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();
@@ -3311,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 )
@@ -3328,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();
         }
@@ -3352,7 +3444,7 @@ bool wxGrid::MoveCursorUp()
     {
         MakeCellVisible( m_currentCellCoords.GetRow() - 1,
                         m_currentCellCoords.GetCol() );
-        
+
         SetCurrentCell( m_currentCellCoords.GetRow() - 1,
                         m_currentCellCoords.GetCol() );
 
@@ -3372,7 +3464,7 @@ bool wxGrid::MoveCursorDown()
     {
         MakeCellVisible( m_currentCellCoords.GetRow() + 1,
                         m_currentCellCoords.GetCol() );
-        
+
         SetCurrentCell( m_currentCellCoords.GetRow() + 1,
                         m_currentCellCoords.GetCol() );
 
@@ -3390,7 +3482,7 @@ bool wxGrid::MoveCursorLeft()
     {
         MakeCellVisible( m_currentCellCoords.GetRow(),
                         m_currentCellCoords.GetCol() - 1 );
-        
+
         SetCurrentCell( m_currentCellCoords.GetRow(),
                         m_currentCellCoords.GetCol() - 1 );
 
@@ -3408,7 +3500,7 @@ bool wxGrid::MoveCursorRight()
     {
         MakeCellVisible( m_currentCellCoords.GetRow(),
                         m_currentCellCoords.GetCol() + 1 );
-        
+
         SetCurrentCell( m_currentCellCoords.GetRow(),
                         m_currentCellCoords.GetCol() + 1 );
 
@@ -3422,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;
     }
 
@@ -3452,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;
     }
 
@@ -3812,7 +3904,7 @@ void wxGrid::SetRowLabelAlignment( int horiz, int vert )
     {
         m_rowLabelWin->Refresh();
         m_colLabelWin->Refresh();
-    }        
+    }
 }
 
 void wxGrid::SetColLabelAlignment( int horiz, int vert )
@@ -3831,7 +3923,7 @@ void wxGrid::SetColLabelAlignment( int horiz, int vert )
     {
         m_rowLabelWin->Refresh();
         m_colLabelWin->Refresh();
-    }        
+    }
 }
 
 void wxGrid::SetRowLabelValue( int row, const wxString& s )
@@ -3867,7 +3959,7 @@ void wxGrid::SetGridLineColour( const wxColour& colour )
     if ( m_gridLineColour != colour )
     {
         m_gridLineColour = colour;
-        
+
         wxClientDC dc( m_gridWin );
         PrepareDC( dc );
         DrawAllGridLines( dc );
@@ -3952,14 +4044,6 @@ wxColour wxGrid::GetCellTextColour( int WXUNUSED(row), int WXUNUSED(col) )
 }
 
 
-wxColour wxGrid::GetCellHighlightColour()
-{
-    // TODO: replace this temp test code
-    //
-    return wxColour( 0, 0, 0 );
-}
-
-
 wxFont wxGrid::GetDefaultCellFont()
 {
     return m_defaultCellFont;
@@ -4009,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
         //
@@ -4055,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 );
@@ -4067,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
         //
@@ -4104,12 +4188,6 @@ void wxGrid::SetCellTextColour( int WXUNUSED(row), int WXUNUSED(col), const wxCo
     //
 }
 
-void wxGrid::SetCellHighlightColour( const wxColour& )
-{
-    // TODO: everything !!!
-    //
-}
-
 void wxGrid::SetDefaultCellFont( const wxFont& )
 {
     // TODO: everything !!!
@@ -4151,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 )
         {
@@ -4172,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 )
@@ -4196,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();
@@ -4216,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 )
@@ -4240,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();
@@ -4260,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 )
     {
@@ -4275,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
@@ -4313,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
 //