]> git.saurik.com Git - wxWidgets.git/blobdiff - src/generic/gridg.cpp
Implementation of wxFopen, wxFreopen, wxStrftime
[wxWidgets.git] / src / generic / gridg.cpp
index 84b4b4546f361ca115c3778449564b78787f9344..e1a020e44d95ab36235c0a6b773afede45aca943 100644 (file)
@@ -2,40 +2,48 @@
 // Name:        gridg.cpp
 // Purpose:     wxGenericGrid
 // Author:      Julian Smart
-// Modified by:
+// Modified by: Michael Bedward
+//                Added edit in place facility, 20 Apr 1999
+//                Added cursor key control, 29 Jun 1999
+//              Gerhard Gruber
+//                Added keyboard navigation, client data, other fixes
 // Created:     04/01/98
 // RCS-ID:      $Id$
 // Copyright:   (c) Julian Smart and Markus Holzem
-// Licence:    wxWindows license
+// Licence:     wxWindows license
 /////////////////////////////////////////////////////////////////////////////
 
 #ifdef __GNUG__
-#pragma implementation "gridg.h"
-#pragma interface
+    #pragma implementation "gridg.h"
+    #pragma interface
 #endif
 
 // For compilers that support precompilation, includes "wx/wx.h".
 #include "wx/wxprec.h"
 
 #ifdef __BORLANDC__
-#pragma hdrstop
+    #pragma hdrstop
 #endif
 
 #ifndef WX_PRECOMP
-#include "wx/wx.h"
+    #include "wx/utils.h"
+    #include "wx/dcclient.h"
+    #include "wx/dcmemory.h"
+    #include "wx/textctrl.h"
+    #include "wx/settings.h"
 #endif
 
 #include <string.h>
 
 #include "wx/string.h"
+
 #include "wx/generic/gridg.h"
-#include "wx/settings.h"
 
 // Set to zero to use no double-buffering
 #ifdef __WXMSW__
-#define wxUSE_DOUBLE_BUFFERING 1
+    #define wxUSE_DOUBLE_BUFFERING 1
 #else
-#define wxUSE_DOUBLE_BUFFERING 0
+    #define wxUSE_DOUBLE_BUFFERING 0
 #endif
 
 #define wxGRID_DRAG_NONE       0
@@ -51,6 +59,9 @@ BEGIN_EVENT_TABLE(wxGenericGrid, wxPanel)
     EVT_ERASE_BACKGROUND(wxGenericGrid::OnEraseBackground)
     EVT_MOUSE_EVENTS(wxGenericGrid::OnMouseEvent)
     EVT_TEXT(wxGRID_TEXT_CTRL, wxGenericGrid::OnText)
+    EVT_TEXT(wxGRID_EDIT_IN_PLACE_TEXT_CTRL, wxGenericGrid::OnTextInPlace)
+    EVT_TEXT_ENTER(wxGRID_TEXT_CTRL, wxGenericGrid::OnTextEnter)
+    EVT_TEXT_ENTER(wxGRID_EDIT_IN_PLACE_TEXT_CTRL, wxGenericGrid::OnTextInPlaceEnter)
     EVT_COMMAND_SCROLL(wxGRID_HSCROLL, wxGenericGrid::OnGridScroll)
     EVT_COMMAND_SCROLL(wxGRID_VSCROLL, wxGenericGrid::OnGridScroll)
 
@@ -68,10 +79,10 @@ BEGIN_EVENT_TABLE(wxGenericGrid, wxPanel)
 END_EVENT_TABLE()
 
 
-
-
-wxGenericGrid::wxGenericGrid(void)
+wxGenericGrid::wxGenericGrid()
 {
+  m_viewWidth = 0;
+  m_viewHeight = 0;
   m_batchCount = 0;
   m_hScrollBar = (wxScrollBar *) NULL;
   m_vScrollBar = (wxScrollBar *) NULL;
@@ -86,9 +97,13 @@ wxGenericGrid::wxGenericGrid(void)
   m_textItem = (wxTextCtrl *) NULL;
   m_currentRectVisible = FALSE;
   m_editable = TRUE;
+
+  m_editInPlace = FALSE;
+  m_inOnTextInPlace = FALSE;
+
 #if defined(__WIN95__)
   m_scrollWidth = wxSystemSettings::GetSystemMetric(wxSYS_VSCROLL_X);
-#elseif defined(__WXGTK__)
+#elif defined(__WXGTK__)
   m_scrollWidth = wxSystemSettings::GetSystemMetric(wxSYS_VSCROLL_X);
 #else
   m_scrollWidth = 16;
@@ -126,9 +141,15 @@ wxGenericGrid::wxGenericGrid(void)
   m_textItem = (wxTextCtrl *) NULL;
 }
 
-bool wxGenericGrid::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size,
- long style, const wxString& name)
+bool wxGenericGrid::Create(wxWindow *parent,
+                           wxWindowID id,
+                           const wxPoint& pos,
+                           const wxSize& size,
+                           long style,
+                           const wxString& name)
 {
+  m_viewWidth = 0;
+  m_viewHeight = 0;
   m_batchCount = 0;
   m_editingPanel = (wxPanel *) NULL;
   m_hScrollBar = (wxScrollBar *) NULL;
@@ -144,9 +165,11 @@ bool wxGenericGrid::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos,
   m_textItem = (wxTextCtrl *) NULL;
   m_currentRectVisible = FALSE;
   m_editable = TRUE;
+  m_editInPlace = FALSE;
+  m_inOnTextInPlace = FALSE;
 #if defined(__WIN95__)
   m_scrollWidth = wxSystemSettings::GetSystemMetric(wxSYS_VSCROLL_X);
-#elseif defined(__WXGTK__)
+#elif defined(__WXGTK__)
   m_scrollWidth = wxSystemSettings::GetSystemMetric(wxSYS_VSCROLL_X);
 #else
   m_scrollWidth = 16;
@@ -206,8 +229,9 @@ bool wxGenericGrid::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos,
   m_editingPanel = new wxPanel(this);
 
   m_textItem = new wxTextCtrl(m_editingPanel, wxGRID_TEXT_CTRL, "",
-     wxPoint(m_editControlPosition.x, m_editControlPosition.y), wxSize(m_editControlPosition.width, -1),
-     0);
+                              wxPoint(m_editControlPosition.x, m_editControlPosition.y),
+                              wxSize(m_editControlPosition.width, -1),
+                              wxTE_PROCESS_ENTER);
   m_textItem->Show(TRUE);
   m_textItem->SetFocus();
   int controlW, controlH;
@@ -222,15 +246,25 @@ bool wxGenericGrid::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos,
   m_hScrollBar = new wxScrollBar(this, wxGRID_HSCROLL, wxPoint(0, 0), wxSize(20, 100), wxHORIZONTAL);
   m_vScrollBar = new wxScrollBar(this, wxGRID_VSCROLL, wxPoint(0, 0), wxSize(100, 20), wxVERTICAL);
 
+//  SetSize(pos.x, pos.y, size.x, size.y);
+
+  m_inPlaceTextItem = new wxTextCtrl( (wxPanel*)this, wxGRID_EDIT_IN_PLACE_TEXT_CTRL, "",
+                                      wxPoint( m_currentRect.x-2, m_currentRect.y-2 ),
+                                      wxSize( m_currentRect.width+4, m_currentRect.height+4 ),
+                                      wxNO_BORDER | wxTE_PROCESS_ENTER );
+  m_inPlaceTextItem->Show(m_editInPlace);
+  if ( m_editInPlace )
+    m_inPlaceTextItem->SetFocus();
+
   return TRUE;
 }
 
-wxGenericGrid::~wxGenericGrid(void)
+wxGenericGrid::~wxGenericGrid()
 {
   ClearGrid();
 }
 
-void wxGenericGrid::ClearGrid(void)
+void wxGenericGrid::ClearGrid()
 {
   int i,j;
   if (m_gridCells)
@@ -359,7 +393,7 @@ bool wxGenericGrid::CreateGrid(int nRows, int nCols, wxString **cellValues, shor
 }
 
 // Need to determine various dimensions
-void wxGenericGrid::UpdateDimensions(void)
+void wxGenericGrid::UpdateDimensions()
 {
   int canvasWidth, canvasHeight;
   GetSize(&canvasWidth, &canvasHeight);
@@ -512,7 +546,7 @@ void wxGenericGrid::PaintGrid(wxDC& dc)
 
     /* Hilight present cell */
     SetCurrentRect(m_wCursorRow, m_wCursorColumn);
-    if (m_currentRectVisible)
+    if (m_currentRectVisible && !(m_editable && m_editInPlace))
       HighlightCell(& dc);
 
     dc.DestroyClippingRegion();
@@ -783,8 +817,8 @@ void wxGenericGrid::DrawColumnLabel(wxDC *dc, wxRect *rect, int col)
     rect2.height -= 4;
     dc->SetTextForeground(GetLabelTextColour());
     dc->SetFont(GetLabelTextFont());
-       if ( !cell->GetTextValue().IsNull() )
-       DrawTextRect(dc, cell->GetTextValue(), &rect2, GetLabelAlignment(wxHORIZONTAL));
+        if ( !cell->GetTextValue().IsNull() )
+            DrawTextRect(dc, cell->GetTextValue(), &rect2, GetLabelAlignment(wxHORIZONTAL));
   }
 }
 
@@ -836,8 +870,8 @@ void wxGenericGrid::DrawRowLabel(wxDC *dc, wxRect *rect, int row)
     rect2.height -= 4;
     dc->SetTextForeground(GetLabelTextColour());
     dc->SetFont(GetLabelTextFont());
-       if ( !cell->GetTextValue().IsNull() )
-       DrawTextRect(dc, cell->GetTextValue(), &rect2, GetLabelAlignment(wxVERTICAL));
+        if ( !cell->GetTextValue().IsNull() )
+            DrawTextRect(dc, cell->GetTextValue(), &rect2, GetLabelAlignment(wxVERTICAL));
   }
 }
 
@@ -914,13 +948,13 @@ void wxGenericGrid::DrawCellValue(wxDC *dc, wxRect *rect, int row, int col)
       dc->SetTextForeground(cell->GetTextColour());
       dc->SetFont(cell->GetFont());
 
-         if ( !cell->GetTextValue().IsNull() )
-       DrawTextRect(dc, cell->GetTextValue(), &rect2, cell->GetAlignment());
+          if ( !cell->GetTextValue().IsNull() )
+              DrawTextRect(dc, cell->GetTextValue(), &rect2, cell->GetAlignment());
     }
   }
 }
 
-void wxGenericGrid::AdjustScrollbars(void)
+void wxGenericGrid::AdjustScrollbars()
 {
   int cw, ch;
   GetClientSize(&cw, &ch);
@@ -945,56 +979,53 @@ void wxGenericGrid::AdjustScrollbars(void)
   int noHorizSteps = 0;
   int noVertSteps = 0;
 
-  if (m_totalGridWidth + vertScrollBarWidth <= cw)
-    noHorizSteps = 0;
-  else
+  if (m_totalGridWidth + vertScrollBarWidth > cw)
   {
-    noHorizSteps = 0;
     int widthCount = 0;
 
     int i;
-       int nx = 0;
+    int nx = 0;
     for (i = m_scrollPosX ; i < m_totalCols; i++)
     {
       widthCount += m_colWidths[i];
-         // A partial bit doesn't count, we still have to scroll to see the
-         // rest of it
+      // A partial bit doesn't count, we still have to scroll to see the
+      // rest of it
       if (widthCount + m_leftOfSheet + m_verticalLabelWidth > (cw-vertScrollBarWidth))
         break;
-         else
-           nx ++;
-
+      else
+           nx ++;
     }
 
     noHorizSteps += nx;
   }
-  if (m_totalGridHeight + horizScrollBarHeight <= ch)
-    noVertSteps = 0;
-  else
+  m_viewWidth = noHorizSteps;
+
+  if (m_totalGridHeight + horizScrollBarHeight > ch)
   {
-    noVertSteps = 0;
     int heightCount = 0;
 
     int i;
-       int ny = 0;
+    int ny = 0;
     for (i = m_scrollPosY ; i < m_totalRows; i++)
     {
       heightCount += m_rowHeights[i];
-         // A partial bit doesn't count, we still have to scroll to see the
-         // rest of it
+      // A partial bit doesn't count, we still have to scroll to see the
+      // rest of it
       if (heightCount + m_topOfSheet + m_horizontalLabelHeight > (ch-horizScrollBarHeight))
         break;
-         else
-           ny ++;
+      else
+        ny ++;
     }
 
     noVertSteps += ny;
   }
 
+  m_viewHeight = noVertSteps;
+
   if (m_totalGridWidth + vertScrollBarWidth <= cw)
   {
-       if ( m_hScrollBar )
-       m_hScrollBar->Show(FALSE);
+    if ( m_hScrollBar )
+        m_hScrollBar->Show(FALSE);
     SetScrollPosX(0);
   }
   else
@@ -1024,7 +1055,7 @@ void wxGenericGrid::AdjustScrollbars(void)
   if (m_hScrollBar && !m_hScrollBar->IsShown())
     horizScrollBarHeight = 0;
 
-  if (m_hScrollBar)
+  if (m_hScrollBar && m_hScrollBar->IsShown())
   {
     int nCols = GetCols();
     m_hScrollBar->SetScrollbar(m_hScrollBar->GetThumbPosition(), wxMax(noHorizSteps, 1), (noHorizSteps == 0) ? 1 : nCols, wxMax(noHorizSteps, 1));
@@ -1038,7 +1069,7 @@ void wxGenericGrid::AdjustScrollbars(void)
 
   }
 
-  if (m_vScrollBar)
+  if (m_vScrollBar && m_vScrollBar->IsShown())
   {
     int nRows = GetRows();
 
@@ -1051,7 +1082,7 @@ void wxGenericGrid::AdjustScrollbars(void)
 void wxGenericGrid::OnSize(wxSizeEvent& WXUNUSED(event) )
 {
   if (!m_vScrollBar || !m_hScrollBar)
-         return;
+          return;
 
   AdjustScrollbars();
 
@@ -1333,7 +1364,7 @@ void wxGenericGrid::OnMouseEvent(wxMouseEvent& ev)
         SetCursor(*wxSTANDARD_CURSOR);
         int cw, ch;
         GetClientSize(&cw, &ch);
-               wxSizeEvent evt;
+                wxSizeEvent evt;
         OnSize(evt);
         break;
       }
@@ -1395,42 +1426,97 @@ void wxGenericGrid::OnSelectCellImplementation(wxDC *dc, int row, int col)
   SetGridClippingRegion(dc);
 
   // Remove the highlight from the old cell
-  if (m_currentRectVisible)
-     HighlightCell(dc);
+  if ( m_currentRectVisible && !(m_editable && m_editInPlace) )
+    {
+      HighlightCell(dc);
+    }
+
 
   // Highlight the new cell and copy its content to the edit control
   SetCurrentRect(m_wCursorRow, m_wCursorColumn);
   wxGridCell *cell = GetCell(m_wCursorRow, m_wCursorColumn);
   if (cell)
   {
-       if ( cell->GetTextValue().IsNull() )
-               m_textItem->SetValue("");
-       else
-       m_textItem->SetValue(cell->GetTextValue());
+        if ( cell->GetTextValue().IsNull() )
+                m_textItem->SetValue("");
+        else
+            m_textItem->SetValue(cell->GetTextValue());
   }
 
   SetGridClippingRegion(dc);
 
-  // 1) Why isn't this needed for Windows??
-  // Probably because of the SetValue?? JS.
-  // 2) Arrrrrgh. This isn't needed anywhere, 
-  // of course. One hour of debugging... RR.
-#ifndef __WXMSW__
-//  HighlightCell(dc);
+
+  if ( m_editable && m_editInPlace )
+    {
+      int x, y, width, height;
+      if ( m_currentRect.x <= 0 )
+        {
+          x = 0;
+          width = m_currentRect.width + 2;
+        }
+      else
+        {
+          x = m_currentRect.x - 2;
+          width = m_currentRect.width + 4;
+        }
+
+      if ( m_currentRect.y <= 0 )
+        {
+          y = 0;
+          height = m_currentRect.height + 2;
+        }
+      else
+        {
+          y = m_currentRect.y - 2;
+          height = m_currentRect.height + 4;
+        }
+
+      m_inPlaceTextItem->SetSize( x, y, width, height );
+
+      if ( cell )
+        {
+          if ( cell->GetTextValue().IsNull() )
+            {
+              m_inPlaceTextItem->SetValue( "" );
+            }
+          else
+            {
+              m_inPlaceTextItem->SetFont( cell->GetFont() );
+              m_inPlaceTextItem->SetValue( cell->GetTextValue() );
+            }
+        }
+
+      m_inPlaceTextItem->Show(TRUE);
+      m_inPlaceTextItem->SetFocus();
+    }
+  else
+    {
+      // 1) Why isn't this needed for Windows??
+      // Probably because of the SetValue?? JS.
+      // 2) Arrrrrgh. This isn't needed anywhere,
+      // of course. One hour of debugging... RR.
+      //
+      // 3) It *is* needed for Motif - michael
+      //
+#ifdef __WXMOTIF__
+      if ( !(m_editable && m_editInPlace) )
+          HighlightCell(dc);
 #endif
+    }
+
   dc->DestroyClippingRegion();
 
-  //OnSelectCell(row, col);
+  OnSelectCell(row, col);
   wxGridEvent g_evt2(GetId(), wxEVT_GRID_SELECT_CELL, this, row, col);
   GetEventHandler()->ProcessEvent(g_evt2);
 }
 
-wxGridCell *wxGenericGrid::OnCreateCell(void)
+wxGridCell *wxGenericGrid::OnCreateCell()
 {
   return new wxGridCell(this);
 }
 
-void wxGenericGrid::OnChangeLabels(void)
+void wxGenericGrid::OnChangeLabels()
 {
   char buf[100];
   int i;
@@ -1456,7 +1542,7 @@ void wxGenericGrid::OnChangeLabels(void)
   }
 }
 
-void wxGenericGrid::OnChangeSelectionLabel(void)
+void wxGenericGrid::OnChangeSelectionLabel()
 {
   if (!GetEditable())
     return;
@@ -1479,27 +1565,27 @@ void wxGenericGrid::HighlightCell(wxDC *dc)
   dc->DrawLine( m_currentRect.x + 1,
                 m_currentRect.y + 1,
                 m_currentRect.x + m_currentRect.width - 1,
-               m_currentRect.y + 1);
+                m_currentRect.y + 1);
   // Right
   dc->DrawLine( m_currentRect.x + m_currentRect.width - 1,
                 m_currentRect.y + 1,
                 m_currentRect.x + m_currentRect.width - 1,
-               m_currentRect.y +m_currentRect.height - 1 );
+                m_currentRect.y +m_currentRect.height - 1 );
   // Bottom
   dc->DrawLine( m_currentRect.x + m_currentRect.width - 1,
                 m_currentRect.y + m_currentRect.height - 1,
                 m_currentRect.x + 1,
-               m_currentRect.y + m_currentRect.height - 1);
+                m_currentRect.y + m_currentRect.height - 1);
   // Left
   dc->DrawLine( m_currentRect.x + 1,
                 m_currentRect.y + m_currentRect.height - 1,
-               m_currentRect.x + 1,
-               m_currentRect.y + 1);
+                m_currentRect.x + 1,
+                m_currentRect.y + 1);
 
   dc->SetLogicalFunction(wxCOPY);
 }
 
-void wxGenericGrid::DrawCellText(void)
+void wxGenericGrid::DrawCellText()
 {
   if (!m_currentRectVisible)
     return;
@@ -1508,8 +1594,6 @@ void wxGenericGrid::DrawCellText(void)
   if (!cell)
     return;
 
-  static char szEdit[300];
-
   wxClientDC dc(this);
   dc.BeginDrawing();
 
@@ -1518,7 +1602,7 @@ void wxGenericGrid::DrawCellText(void)
   dc.SetBackgroundMode(wxTRANSPARENT);
   dc.SetBrush(cell->GetBackgroundBrush());
 
-  strcpy(szEdit, m_textItem->GetValue());
+  wxString editValue = m_textItem->GetValue();
 
   wxRect rect;
   rect = m_currentRect;
@@ -1527,8 +1611,9 @@ void wxGenericGrid::DrawCellText(void)
   rect.width -= 5;
   rect.height -= 4;
 
+  // FIXME: what's this string of spaces supposed to represent?
   DrawTextRect(& dc, "                                    ", &rect, wxLEFT);
-  DrawTextRect(& dc, szEdit, &rect, cell->GetAlignment());
+  DrawTextRect(& dc, editValue, &rect, cell->GetAlignment());
 
   dc.DestroyClippingRegion();
 
@@ -1959,6 +2044,12 @@ void wxGenericGrid::SetEditable(bool edit)
       m_textItem->Show(TRUE);
       m_textItem->SetFocus();
     }
+
+    if (m_inPlaceTextItem)
+      {
+        m_inPlaceTextItem->Show(TRUE);
+        m_inPlaceTextItem->SetFocus();
+      }
   }
   else
   {
@@ -1968,6 +2059,11 @@ void wxGenericGrid::SetEditable(bool edit)
       m_textItem->Show(FALSE);
       m_editingPanel->Show(FALSE);
     }
+
+    if ( m_inPlaceTextItem )
+      {
+        m_inPlaceTextItem->Show(FALSE);
+      }
   }
   UpdateDimensions();
   SetCurrentRect(GetCursorRow(), GetCursorColumn());
@@ -1987,6 +2083,47 @@ void wxGenericGrid::SetEditable(bool edit)
 */
 }
 
+
+void wxGenericGrid::SetEditInPlace(bool edit)
+{
+  if ( m_editInPlace != edit )
+    {
+      m_editInPlace = edit;
+
+      if ( m_editInPlace )  // switched on
+        {
+          if ( m_currentRectVisible && m_editable )
+            {
+              m_inPlaceTextItem->SetSize( m_currentRect.x-2, m_currentRect.y-2,
+                                          m_currentRect.width+4, m_currentRect.height+4 );
+
+              wxGridCell *cell = GetCell(m_wCursorRow, m_wCursorColumn);
+
+              if ( cell )
+                {
+                  if ( cell->GetTextValue().IsNull() )
+                    {
+                      m_inPlaceTextItem->SetValue( "" );
+                    }
+                  else
+                    {
+                      m_inPlaceTextItem->SetFont( cell->GetFont() );
+                      m_inPlaceTextItem->SetValue( cell->GetTextValue() );
+                    }
+                }
+
+              m_inPlaceTextItem->Show( TRUE );
+              m_inPlaceTextItem->SetFocus();
+            }
+        }
+      else  // switched off
+        {
+          m_inPlaceTextItem->Show( FALSE );
+        }
+    }
+}
+
+
 void wxGenericGrid::SetCellAlignment(int flag, int row, int col)
 {
   wxGridCell *cell = GetCell(row, col);
@@ -2387,7 +2524,7 @@ void wxGenericGrid::SetGridCursor(int row, int col)
 
   SetGridClippingRegion(& dc);
 
-  if (m_currentRectVisible)
+  if (m_currentRectVisible && !(m_editable && m_editInPlace) )
     HighlightCell(& dc);
 
   m_wCursorRow = row;
@@ -2398,16 +2535,16 @@ void wxGenericGrid::SetGridCursor(int row, int col)
 
   SetCurrentRect(row, col, cw, ch);
 
-  if (m_currentRectVisible)
+  if (m_currentRectVisible && !(m_editable && m_editInPlace) )
     HighlightCell(& dc);
 
   dc.DestroyClippingRegion();
   dc.EndDrawing();
 }
 
-/*
- * Grid cell
- */
+// ----------------------------------------------------------------------------
+// Grid cell
+// ----------------------------------------------------------------------------
 
 wxGridCell::wxGridCell(wxGenericGrid *window)
 {
@@ -2434,9 +2571,11 @@ wxGridCell::wxGridCell(wxGenericGrid *window)
     alignment = window->GetCellAlignment();
   else
     alignment = wxLEFT;
+
+  cellData = (void *)NULL;
 }
 
-wxGridCell::~wxGridCell(void)
+wxGridCell::~wxGridCell()
 {
 }
 
@@ -2448,28 +2587,94 @@ void wxGridCell::SetBackgroundColour(const wxColour& colour)
 
 void wxGenericGrid::OnText(wxCommandEvent& WXUNUSED(ev) )
 {
-  wxGenericGrid *grid = this;
-  wxGridCell *cell = grid->GetCell(grid->GetCursorRow(), grid->GetCursorColumn());
-  if (cell && grid->CurrentCellVisible())
-  {
-    cell->SetTextValue(grid->GetTextItem()->GetValue());
-    wxClientDC dc(grid);
+  // michael - added this conditional to prevent change to
+  // grid cell text when edit control is hidden but still has
+  // focus
+  //
+  if ( m_editable )
+    {
+      wxGenericGrid *grid = this;
+      wxGridCell *cell = grid->GetCell(grid->GetCursorRow(), grid->GetCursorColumn());
+      if (cell && grid->CurrentCellVisible())
+        {
+          cell->SetTextValue(grid->GetTextItem()->GetValue());
+          if ( m_editInPlace && !m_inOnTextInPlace )
+            {
+              m_inPlaceTextItem->SetValue( grid->GetTextItem()->GetValue() );
+            }
 
-    dc.BeginDrawing();
-    grid->SetGridClippingRegion(& dc);
-    grid->DrawCellBackground(& dc, &grid->GetCurrentRect(), grid->GetCursorRow(), grid->GetCursorColumn());
-    grid->DrawCellValue(& dc, &grid->GetCurrentRect(), grid->GetCursorRow(), grid->GetCursorColumn());
-    grid->HighlightCell(& dc);
-    dc.DestroyClippingRegion();
-    dc.EndDrawing();
+          wxClientDC dc(grid);
 
-    //grid->OnCellChange(grid->GetCursorRow(), grid->GetCursorColumn());
-    wxGridEvent g_evt(GetId(), wxEVT_GRID_CELL_CHANGE, grid,
-                      grid->GetCursorRow(), grid->GetCursorColumn());
-    GetEventHandler()->ProcessEvent(g_evt);
+          dc.BeginDrawing();
+          grid->SetGridClippingRegion(& dc);
+          grid->DrawCellBackground(& dc, &grid->GetCurrentRect(), grid->GetCursorRow(), grid->GetCursorColumn());
+          grid->DrawCellValue(& dc, &grid->GetCurrentRect(), grid->GetCursorRow(), grid->GetCursorColumn());
+          if ( !(m_editable && m_editInPlace ) ) grid->HighlightCell(& dc);
+          dc.DestroyClippingRegion();
+          dc.EndDrawing();
 
-//    grid->DrawCellText();
-  }
+          //grid->OnCellChange(grid->GetCursorRow(), grid->GetCursorColumn());
+          wxGridEvent g_evt(GetId(), wxEVT_GRID_CELL_CHANGE, grid,
+                            grid->GetCursorRow(), grid->GetCursorColumn());
+          GetEventHandler()->ProcessEvent(g_evt);
+
+          //    grid->DrawCellText();
+        }
+    }
+}
+
+void wxGenericGrid::OnTextEnter(wxCommandEvent& WXUNUSED(ev) )
+{
+  // move the cursor down the current row (if possible)
+  // when the enter key has been pressed
+  //
+  if ( m_editable )
+    {
+      if ( GetCursorRow() < GetRows()-1 )
+        {
+          wxClientDC dc( this );
+          dc.BeginDrawing();
+          OnSelectCellImplementation(& dc,
+                                     GetCursorRow()+1,
+                                     GetCursorColumn() );
+          dc.EndDrawing();
+        }
+    }
+}
+
+void wxGenericGrid::OnTextInPlace(wxCommandEvent& ev )
+{
+  if ( m_editable )
+    {
+      wxGenericGrid *grid = this;
+      wxGridCell *cell = grid->GetCell(grid->GetCursorRow(), grid->GetCursorColumn());
+      if (cell && grid->CurrentCellVisible())
+        {
+          m_inOnTextInPlace = TRUE;
+          grid->GetTextItem()->SetValue( m_inPlaceTextItem->GetValue() );
+          OnText( ev );
+          m_inOnTextInPlace = FALSE;
+        }
+    }
+}
+
+void wxGenericGrid::OnTextInPlaceEnter(wxCommandEvent& WXUNUSED(ev) )
+{
+  // move the cursor down the current row (if possible)
+  // when the enter key has been pressed
+  //
+  if ( m_editable )
+    {
+      if ( GetCursorRow() < GetRows()-1 )
+        {
+          wxClientDC dc( this );
+          dc.BeginDrawing();
+          OnSelectCellImplementation(& dc,
+                                     GetCursorRow()+1,
+                                     GetCursorColumn() );
+          dc.EndDrawing();
+        }
+    }
 }
 
 void wxGenericGrid::OnGridScroll(wxScrollEvent& ev)
@@ -2477,7 +2682,9 @@ void wxGenericGrid::OnGridScroll(wxScrollEvent& ev)
   static bool inScroll = FALSE;
 
   if ( inScroll )
-       return;
+        return;
+
+  if ( m_editInPlace ) m_inPlaceTextItem->Show(FALSE);
 
   inScroll = TRUE;
   wxGenericGrid *win = this;
@@ -2505,6 +2712,15 @@ void wxGenericGrid::OnGridScroll(wxScrollEvent& ev)
   AdjustScrollbars();
 
   if (change) win->Refresh(FALSE);
+
+  if ( m_editInPlace && m_currentRectVisible )
+    {
+      m_inPlaceTextItem->SetSize( m_currentRect.x-2, m_currentRect.y-2,
+                                  m_currentRect.width+4, m_currentRect.height+4 );
+      m_inPlaceTextItem->Show( TRUE );
+      m_inPlaceTextItem->SetFocus();
+    }
+
   inScroll = FALSE;
 
 }
@@ -2559,4 +2775,25 @@ void wxGenericGrid::_OnLabelRightClick(wxGridEvent& ev)
     OnLabelRightClick(ev.m_row, ev.m_col, ev.m_x, ev.m_y, ev.m_control, ev.m_shift);
 }
 
+void *wxGenericGrid::SetCellData(void *data, int row, int col)
+{
+    void *rc = NULL;
+
+    wxGridCell *cell = GetCell(row, col);
+    if ( cell )
+        rc = cell->SetCellData(data);
+
+    return rc;
+}
+
+void *wxGenericGrid::GetCellData(int row, int col)
+{
+    void *rc = NULL;
+
+    wxGridCell *cell = GetCell(row, col);
+    if ( cell )
+        rc = cell->GetCellData();
+
+    return rc;
+}