]> git.saurik.com Git - wxWidgets.git/commitdiff
1. EVT_GRID_XXX constants renamed to wxEVT_GRID_XXX
authorVadim Zeitlin <vadim@wxwidgets.org>
Thu, 17 Feb 2000 10:12:48 +0000 (10:12 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Thu, 17 Feb 2000 10:12:48 +0000 (10:12 +0000)
2. EVT_GRID_EDITOR_SHOWN/HIDDEN added
3. Alt-X now work in the grid (instead of being eaten in StartingKey)
4. added CanEnableCellControl() and use it before calling EnableEC

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@6106 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/generic/grid.h
samples/newgrid/griddemo.cpp
samples/newgrid/griddemo.h
src/generic/grid.cpp

index e85004520436645b40a8c4ddcbba9c8f286bbf4c..5de89b4fc552f2e54d0aa7fd448517ab8868bf57 100644 (file)
@@ -185,6 +185,8 @@ public:
     virtual void StartingKey(wxKeyEvent& event);
     virtual void HandleReturn(wxKeyEvent& event);
 
+protected:
+    wxTextCtrl *Text() const { return (wxTextCtrl *)m_control; }
 
 private:
     wxString m_startValue;
@@ -675,9 +677,12 @@ public:
     bool IsEditable() { return m_editable; }
     void EnableEditing( bool edit );
 
-    void     EnableCellEditControl( bool enable );
+    void EnableCellEditControl( bool enable = TRUE );
+    void DisableCellEditControl() { EnableCellEditControl(FALSE); }
+    bool CanEnableCellControl() const;
+    bool IsCellEditControlEnabled() const;
 
-    bool     IsCellEditControlEnabled();
+    bool IsCurrentCellReadOnly() const;
 
     void ShowCellEditControl();
     void HideCellEditControl();
@@ -1198,8 +1203,8 @@ protected:
     wxCursor m_rowResizeCursor;
     wxCursor m_colResizeCursor;
 
-    bool       m_editable;  // applies to whole grid
-    bool       m_cellEditCtrlEnabled;
+    bool       m_editable;              // applies to whole grid
+    bool       m_cellEditCtrlEnabled;   // is in-place edit currently shown?
 
 
     void Create();
@@ -1209,13 +1214,14 @@ protected:
     bool Redimension( wxGridTableMessage& );
 
 
-    bool SendEvent( const wxEventType,
-                    int row, int col,
-                    wxMouseEvent& );
-
-    bool SendEvent( const wxEventType,
-                    int row, int col );
-
+    bool SendEvent( const wxEventType, int row, int col, wxMouseEvent& );
+    bool SendEvent( const wxEventType, int row, int col );
+    bool SendEvent( const wxEventType type)
+    {
+        return SendEvent(type,
+                         m_currentCellCoords.GetRow(),
+                         m_currentCellCoords.GetCol());
+    }
 
     void OnPaint( wxPaintEvent& );
     void OnSize( wxSizeEvent& );
@@ -1280,7 +1286,6 @@ protected:
     DECLARE_DYNAMIC_CLASS(wxGridEvent)
 };
 
-
 class WXDLLEXPORT wxGridSizeEvent : public wxNotifyEvent
 {
 public:
@@ -1356,50 +1361,54 @@ protected:
     DECLARE_DYNAMIC_CLASS(wxGridRangeSelectEvent)
 };
 
-
-const wxEventType EVT_GRID_CELL_LEFT_CLICK    = wxEVT_FIRST + 1580;
-const wxEventType EVT_GRID_CELL_RIGHT_CLICK   = wxEVT_FIRST + 1581;
-const wxEventType EVT_GRID_CELL_LEFT_DCLICK   = wxEVT_FIRST + 1582;
-const wxEventType EVT_GRID_CELL_RIGHT_DCLICK  = wxEVT_FIRST + 1583;
-const wxEventType EVT_GRID_LABEL_LEFT_CLICK   = wxEVT_FIRST + 1584;
-const wxEventType EVT_GRID_LABEL_RIGHT_CLICK  = wxEVT_FIRST + 1585;
-const wxEventType EVT_GRID_LABEL_LEFT_DCLICK  = wxEVT_FIRST + 1586;
-const wxEventType EVT_GRID_LABEL_RIGHT_DCLICK = wxEVT_FIRST + 1587;
-const wxEventType EVT_GRID_ROW_SIZE           = wxEVT_FIRST + 1588;
-const wxEventType EVT_GRID_COL_SIZE           = wxEVT_FIRST + 1589;
-const wxEventType EVT_GRID_RANGE_SELECT       = wxEVT_FIRST + 1590;
-const wxEventType EVT_GRID_CELL_CHANGE        = wxEVT_FIRST + 1591;
-const wxEventType EVT_GRID_SELECT_CELL        = wxEVT_FIRST + 1592;
+// TODO move to wx/event.h
+const wxEventType wxEVT_GRID_CELL_LEFT_CLICK    = wxEVT_FIRST + 1580;
+const wxEventType wxEVT_GRID_CELL_RIGHT_CLICK   = wxEVT_FIRST + 1581;
+const wxEventType wxEVT_GRID_CELL_LEFT_DCLICK   = wxEVT_FIRST + 1582;
+const wxEventType wxEVT_GRID_CELL_RIGHT_DCLICK  = wxEVT_FIRST + 1583;
+const wxEventType wxEVT_GRID_LABEL_LEFT_CLICK   = wxEVT_FIRST + 1584;
+const wxEventType wxEVT_GRID_LABEL_RIGHT_CLICK  = wxEVT_FIRST + 1585;
+const wxEventType wxEVT_GRID_LABEL_LEFT_DCLICK  = wxEVT_FIRST + 1586;
+const wxEventType wxEVT_GRID_LABEL_RIGHT_DCLICK = wxEVT_FIRST + 1587;
+const wxEventType wxEVT_GRID_ROW_SIZE           = wxEVT_FIRST + 1588;
+const wxEventType wxEVT_GRID_COL_SIZE           = wxEVT_FIRST + 1589;
+const wxEventType wxEVT_GRID_RANGE_SELECT       = wxEVT_FIRST + 1590;
+const wxEventType wxEVT_GRID_CELL_CHANGE        = wxEVT_FIRST + 1591;
+const wxEventType wxEVT_GRID_SELECT_CELL        = wxEVT_FIRST + 1592;
+const wxEventType wxEVT_GRID_EDITOR_SHOWN       = wxEVT_FIRST + 1593;
+const wxEventType wxEVT_GRID_EDITOR_HIDDEN      = wxEVT_FIRST + 1594;
 
 
 typedef void (wxEvtHandler::*wxGridEventFunction)(wxGridEvent&);
 typedef void (wxEvtHandler::*wxGridSizeEventFunction)(wxGridSizeEvent&);
 typedef void (wxEvtHandler::*wxGridRangeSelectEventFunction)(wxGridRangeSelectEvent&);
 
-#define EVT_GRID_CELL_LEFT_CLICK(fn)     { EVT_GRID_CELL_LEFT_CLICK,    -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL },
-#define EVT_GRID_CELL_RIGHT_CLICK(fn)    { EVT_GRID_CELL_RIGHT_CLICK,   -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL },
-#define EVT_GRID_CELL_LEFT_DCLICK(fn)    { EVT_GRID_CELL_LEFT_DCLICK,   -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL },
-#define EVT_GRID_CELL_RIGHT_DCLICK(fn)   { EVT_GRID_CELL_RIGHT_DCLICK,  -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL },
-#define EVT_GRID_LABEL_LEFT_CLICK(fn)    { EVT_GRID_LABEL_LEFT_CLICK,   -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL },
-#define EVT_GRID_LABEL_RIGHT_CLICK(fn)   { EVT_GRID_LABEL_RIGHT_CLICK,  -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL },
-#define EVT_GRID_LABEL_LEFT_DCLICK(fn)   { EVT_GRID_LABEL_LEFT_DCLICK,  -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL },
-#define EVT_GRID_LABEL_RIGHT_DCLICK(fn)  { EVT_GRID_LABEL_RIGHT_DCLICK, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL },
-#define EVT_GRID_ROW_SIZE(fn)            { EVT_GRID_ROW_SIZE,           -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridSizeEventFunction) &fn, NULL },
-#define EVT_GRID_COL_SIZE(fn)            { EVT_GRID_COL_SIZE,           -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridSizeEventFunction) &fn, NULL },
-#define EVT_GRID_RANGE_SELECT(fn)        { EVT_GRID_RANGE_SELECT,       -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridRangeSelectEventFunction) &fn, NULL },
-#define EVT_GRID_CELL_CHANGE(fn)         { EVT_GRID_CELL_CHANGE,        -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL },
-#define EVT_GRID_SELECT_CELL(fn)         { EVT_GRID_SELECT_CELL,        -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL },
+#define EVT_GRID_CELL_LEFT_CLICK(fn)     { wxEVT_GRID_CELL_LEFT_CLICK,    -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL },
+#define EVT_GRID_CELL_RIGHT_CLICK(fn)    { wxEVT_GRID_CELL_RIGHT_CLICK,   -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL },
+#define EVT_GRID_CELL_LEFT_DCLICK(fn)    { wxEVT_GRID_CELL_LEFT_DCLICK,   -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL },
+#define EVT_GRID_CELL_RIGHT_DCLICK(fn)   { wxEVT_GRID_CELL_RIGHT_DCLICK,  -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL },
+#define EVT_GRID_LABEL_LEFT_CLICK(fn)    { wxEVT_GRID_LABEL_LEFT_CLICK,   -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL },
+#define EVT_GRID_LABEL_RIGHT_CLICK(fn)   { wxEVT_GRID_LABEL_RIGHT_CLICK,  -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL },
+#define EVT_GRID_LABEL_LEFT_DCLICK(fn)   { wxEVT_GRID_LABEL_LEFT_DCLICK,  -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL },
+#define EVT_GRID_LABEL_RIGHT_DCLICK(fn)  { wxEVT_GRID_LABEL_RIGHT_DCLICK, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL },
+#define EVT_GRID_ROW_SIZE(fn)            { wxEVT_GRID_ROW_SIZE,           -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridSizeEventFunction) &fn, NULL },
+#define EVT_GRID_COL_SIZE(fn)            { wxEVT_GRID_COL_SIZE,           -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridSizeEventFunction) &fn, NULL },
+#define EVT_GRID_RANGE_SELECT(fn)        { wxEVT_GRID_RANGE_SELECT,       -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridRangeSelectEventFunction) &fn, NULL },
+#define EVT_GRID_CELL_CHANGE(fn)         { wxEVT_GRID_CELL_CHANGE,        -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL },
+#define EVT_GRID_SELECT_CELL(fn)         { wxEVT_GRID_SELECT_CELL,        -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL },
+#define EVT_GRID_EDITOR_SHOWN(fn)        { wxEVT_GRID_EDITOR_SHOWN,       -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL },
+#define EVT_GRID_EDITOR_HIDDEN(fn)       { wxEVT_GRID_EDITOR_HIDDEN,      -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL },
 
 
 #if 0  // TODO: implement these ?  others ?
 
-const wxEventType EVT_GRID_CREATE_CELL      = wxEVT_FIRST + 1576;
-const wxEventType EVT_GRID_CHANGE_LABELS    = wxEVT_FIRST + 1577;
-const wxEventType EVT_GRID_CHANGE_SEL_LABEL = wxEVT_FIRST + 1578;
+const wxEventType wxEVT_GRID_CREATE_CELL      = wxEVT_FIRST + 1576;
+const wxEventType wxEVT_GRID_CHANGE_LABELS    = wxEVT_FIRST + 1577;
+const wxEventType wxEVT_GRID_CHANGE_SEL_LABEL = wxEVT_FIRST + 1578;
 
-#define EVT_GRID_CREATE_CELL(fn)      { EVT_GRID_CREATE_CELL,      -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL },
-#define EVT_GRID_CHANGE_LABELS(fn)    { EVT_GRID_CHANGE_LABELS,    -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL },
-#define EVT_GRID_CHANGE_SEL_LABEL(fn) { EVT_GRID_CHANGE_SEL_LABEL, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL },
+#define EVT_GRID_CREATE_CELL(fn)      { wxEVT_GRID_CREATE_CELL,      -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL },
+#define EVT_GRID_CHANGE_LABELS(fn)    { wxEVT_GRID_CHANGE_LABELS,    -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL },
+#define EVT_GRID_CHANGE_SEL_LABEL(fn) { wxEVT_GRID_CHANGE_SEL_LABEL, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL },
 
 #endif
 
index ed6bc2480a0ee258b697cc4e8112d18068591eb5..e3f424b438a241d5c4449bfdfa580f3f8cb183b8 100644 (file)
@@ -95,6 +95,9 @@ BEGIN_EVENT_TABLE( GridFrame, wxFrame )
     EVT_GRID_SELECT_CELL( GridFrame::OnSelectCell )
     EVT_GRID_RANGE_SELECT( GridFrame::OnRangeSelected )
     EVT_GRID_CELL_CHANGE( GridFrame::OnCellValueChanged )
+
+    EVT_GRID_EDITOR_SHOWN( GridFrame::OnEditorShown )
+    EVT_GRID_EDITOR_HIDDEN( GridFrame::OnEditorHidden )
 END_EVENT_TABLE()
 
 
@@ -574,6 +577,19 @@ void GridFrame::OnCellValueChanged( wxGridEvent& ev )
     ev.Skip();
 }
 
+void GridFrame::OnEditorShown( wxGridEvent& ev )
+{
+    wxLogMessage( "Cell editor shown." );
+
+    ev.Skip();
+}
+
+void GridFrame::OnEditorHidden( wxGridEvent& ev )
+{
+    wxLogMessage( "Cell editor hidden." );
+
+    ev.Skip();
+}
 
 void GridFrame::About(  wxCommandEvent& WXUNUSED(ev) )
 {
index 25aee5965daaf47012a8d37e5fded94aa3d6cccd..fe66d9e1fa7da24ee2335d63142dd64554317bdd 100644 (file)
@@ -62,6 +62,9 @@ class GridFrame : public wxFrame
     void OnRangeSelected( wxGridRangeSelectEvent& );
     void OnCellValueChanged( wxGridEvent& );
 
+    void OnEditorShown(wxGridEvent&);
+    void OnEditorHidden(wxGridEvent&);
+
 public:
     GridFrame();
     ~GridFrame();
index 9201252056a8beb305886638f21940faff83ec97..d1bddb2e7674793443668d08ae1693e923b169d0 100644 (file)
@@ -274,7 +274,6 @@ static const size_t GRID_SCROLL_LINE = 10;
 // implementation
 // ============================================================================
 
-
 // ----------------------------------------------------------------------------
 // wxGridCellEditor
 // ----------------------------------------------------------------------------
@@ -370,9 +369,16 @@ void wxGridCellEditor::HandleReturn(wxKeyEvent& event)
 
 void wxGridCellEditor::StartingKey(wxKeyEvent& event)
 {
-}
+    wxASSERT_MSG(m_control,
+                 wxT("The wxGridCellEditor must be Created first!"));
 
+    // pass the event to the control
+    m_control->GetEventHandler()->ProcessEvent(event);
+}
 
+// ----------------------------------------------------------------------------
+// wxGridCellTextEditor
+// ----------------------------------------------------------------------------
 
 wxGridCellTextEditor::wxGridCellTextEditor()
 {
@@ -400,9 +406,9 @@ void wxGridCellTextEditor::BeginEdit(int row, int col, wxGrid* grid)
                  wxT("The wxGridCellEditor must be Created first!"));
 
     m_startValue = grid->GetTable()->GetValue(row, col);
-    ((wxTextCtrl*)m_control)->SetValue(m_startValue);
-    ((wxTextCtrl*)m_control)->SetInsertionPointEnd();
-    ((wxTextCtrl*)m_control)->SetFocus();
+    Text()->SetValue(m_startValue);
+    Text()->SetInsertionPointEnd();
+    Text()->SetFocus();
 }
 
 
@@ -414,7 +420,7 @@ bool wxGridCellTextEditor::EndEdit(int row, int col, bool saveValue,
                  wxT("The wxGridCellEditor must be Created first!"));
 
     bool changed = FALSE;
-    wxString value = ((wxTextCtrl*)m_control)->GetValue();
+    wxString value = Text()->GetValue();
     if (value != m_startValue)
         changed = TRUE;
 
@@ -422,7 +428,7 @@ bool wxGridCellTextEditor::EndEdit(int row, int col, bool saveValue,
         grid->GetTable()->SetValue(row, col, value);
 
     m_startValue = wxEmptyString;
-    ((wxTextCtrl*)m_control)->SetValue(m_startValue);
+    Text()->SetValue(m_startValue);
 
     return changed;
 }
@@ -433,35 +439,43 @@ void wxGridCellTextEditor::Reset()
     wxASSERT_MSG(m_control,
                  wxT("The wxGridCellEditor must be Created first!"));
 
-    ((wxTextCtrl*)m_control)->SetValue(m_startValue);
-    ((wxTextCtrl*)m_control)->SetInsertionPointEnd();
+    Text()->SetValue(m_startValue);
+    Text()->SetInsertionPointEnd();
 }
 
-
 void wxGridCellTextEditor::StartingKey(wxKeyEvent& event)
 {
-    wxASSERT_MSG(m_control,
-                 wxT("The wxGridCellEditor must be Created first!"));
+    if ( !event.AltDown() && !event.MetaDown() && !event.ControlDown() )
+    {
+        // insert the key in the control
+        long keycode = event.KeyCode();
+        if ( isprint(keycode) )
+        {
+            // FIXME this is not going to work for non letters...
+            if ( !event.ShiftDown() )
+            {
+                keycode = tolower(keycode);
+            }
+
+            Text()->AppendText((wxChar)keycode);
+
+            return;
+        }
 
-    int code = event.KeyCode();
-    if (code >= 32 && code < 255) {
-        wxString st((char)code);
-        if (! event.ShiftDown())
-            st.LowerCase();
-        ((wxTextCtrl*)m_control)->AppendText(st);
     }
-}
 
+    event.Skip();
+}
 
 void wxGridCellTextEditor::HandleReturn(wxKeyEvent& event)
 {
 #if defined(__WXMOTIF__) || defined(__WXGTK__)
     // wxMotif needs a little extra help...
-    int pos = ((wxTextCtrl*)m_control)->GetInsertionPoint();
-    wxString s( ((wxTextCtrl*)m_control)->GetValue() );
+    int pos = Text()->GetInsertionPoint();
+    wxString s( Text()->GetValue() );
     s = s.Left(pos) + "\n" + s.Mid(pos);
-    ((wxTextCtrl*)m_control)->SetValue(s);
-    ((wxTextCtrl*)m_control)->SetInsertionPoint( pos );
+    Text()->SetValue(s);
+    Text()->SetInsertionPoint( pos );
 #else
     // the other ports can handle a Return key press
     //
@@ -476,7 +490,7 @@ void wxGridCellEditorEvtHandler::OnKeyDown(wxKeyEvent& event)
     {
         case WXK_ESCAPE:
             m_editor->Reset();
-            m_grid->EnableCellEditControl(FALSE);
+            m_grid->DisableCellEditControl();
             break;
 
         case WXK_TAB:
@@ -2476,7 +2490,7 @@ void wxGrid::ProcessRowLabelMouseEvent( wxMouseEvent& event )
         {
             row = YToRow(y);
             if ( row >= 0  &&
-                 !SendEvent( EVT_GRID_LABEL_LEFT_CLICK, row, -1, event ) )
+                 !SendEvent( wxEVT_GRID_LABEL_LEFT_CLICK, row, -1, event ) )
             {
                 SelectRow( row, event.ShiftDown() );
                 ChangeCursorMode(WXGRID_CURSOR_SELECT_ROW, m_rowLabelWin);
@@ -2498,7 +2512,7 @@ void wxGrid::ProcessRowLabelMouseEvent( wxMouseEvent& event )
         if ( YToEdgeOfRow(y) < 0 )
         {
             row = YToRow(y);
-            SendEvent(  EVT_GRID_LABEL_LEFT_DCLICK, row, -1, event );
+            SendEvent( wxEVT_GRID_LABEL_LEFT_DCLICK, row, -1, event );
         }
     }
 
@@ -2514,7 +2528,7 @@ void wxGrid::ProcessRowLabelMouseEvent( wxMouseEvent& event )
             // Note: we are ending the event *after* doing
             // default processing in this case
             //
-            SendEvent( EVT_GRID_ROW_SIZE, m_dragRowOrCol, -1, event );
+            SendEvent( wxEVT_GRID_ROW_SIZE, m_dragRowOrCol, -1, event );
         }
 
         ChangeCursorMode(WXGRID_CURSOR_SELECT_CELL, m_rowLabelWin);
@@ -2527,7 +2541,7 @@ void wxGrid::ProcessRowLabelMouseEvent( wxMouseEvent& event )
     else if ( event.RightDown() )
     {
         row = YToRow(y);
-        if ( !SendEvent( EVT_GRID_LABEL_RIGHT_CLICK, row, -1, event ) )
+        if ( !SendEvent( wxEVT_GRID_LABEL_RIGHT_CLICK, row, -1, event ) )
         {
             // no default action at the moment
         }
@@ -2539,7 +2553,7 @@ void wxGrid::ProcessRowLabelMouseEvent( wxMouseEvent& event )
     else if ( event.RightDClick() )
     {
         row = YToRow(y);
-        if ( !SendEvent( EVT_GRID_LABEL_RIGHT_DCLICK, row, -1, event ) )
+        if ( !SendEvent( wxEVT_GRID_LABEL_RIGHT_DCLICK, row, -1, event ) )
         {
             // no default action at the moment
         }
@@ -2642,7 +2656,7 @@ void wxGrid::ProcessColLabelMouseEvent( wxMouseEvent& event )
         {
             col = XToCol(x);
             if ( col >= 0  &&
-                 !SendEvent( EVT_GRID_LABEL_LEFT_CLICK, -1, col, event ) )
+                 !SendEvent( wxEVT_GRID_LABEL_LEFT_CLICK, -1, col, event ) )
             {
                 SelectCol( col, event.ShiftDown() );
                 ChangeCursorMode(WXGRID_CURSOR_SELECT_COL, m_colLabelWin);
@@ -2664,7 +2678,7 @@ void wxGrid::ProcessColLabelMouseEvent( wxMouseEvent& event )
         if ( XToEdgeOfCol(x) < 0 )
         {
             col = XToCol(x);
-            SendEvent(  EVT_GRID_LABEL_LEFT_DCLICK, -1, col, event );
+            SendEvent( wxEVT_GRID_LABEL_LEFT_DCLICK, -1, col, event );
         }
     }
 
@@ -2680,7 +2694,7 @@ void wxGrid::ProcessColLabelMouseEvent( wxMouseEvent& event )
             // Note: we are ending the event *after* doing
             // default processing in this case
             //
-            SendEvent( EVT_GRID_COL_SIZE, -1, m_dragRowOrCol, event );
+            SendEvent( wxEVT_GRID_COL_SIZE, -1, m_dragRowOrCol, event );
         }
 
         ChangeCursorMode(WXGRID_CURSOR_SELECT_CELL, m_colLabelWin);
@@ -2693,7 +2707,7 @@ void wxGrid::ProcessColLabelMouseEvent( wxMouseEvent& event )
     else if ( event.RightDown() )
     {
         col = XToCol(x);
-        if ( !SendEvent( EVT_GRID_LABEL_RIGHT_CLICK, -1, col, event ) )
+        if ( !SendEvent( wxEVT_GRID_LABEL_RIGHT_CLICK, -1, col, event ) )
         {
             // no default action at the moment
         }
@@ -2705,7 +2719,7 @@ void wxGrid::ProcessColLabelMouseEvent( wxMouseEvent& event )
     else if ( event.RightDClick() )
     {
         col = XToCol(x);
-        if ( !SendEvent( EVT_GRID_LABEL_RIGHT_DCLICK, -1, col, event ) )
+        if ( !SendEvent( wxEVT_GRID_LABEL_RIGHT_DCLICK, -1, col, event ) )
         {
             // no default action at the moment
         }
@@ -2740,7 +2754,7 @@ void wxGrid::ProcessCornerLabelMouseEvent( wxMouseEvent& event )
         // indicate corner label by having both row and
         // col args == -1
         //
-        if ( !SendEvent( EVT_GRID_LABEL_LEFT_CLICK, -1, -1, event ) )
+        if ( !SendEvent( wxEVT_GRID_LABEL_LEFT_CLICK, -1, -1, event ) )
         {
             SelectAll();
         }
@@ -2748,12 +2762,12 @@ void wxGrid::ProcessCornerLabelMouseEvent( wxMouseEvent& event )
 
     else if ( event.LeftDClick() )
     {
-        SendEvent( EVT_GRID_LABEL_LEFT_DCLICK, -1, -1, event );
+        SendEvent( wxEVT_GRID_LABEL_LEFT_DCLICK, -1, -1, event );
     }
 
     else if ( event.RightDown() )
     {
-        if ( !SendEvent( EVT_GRID_LABEL_RIGHT_CLICK, -1, -1, event ) )
+        if ( !SendEvent( wxEVT_GRID_LABEL_RIGHT_CLICK, -1, -1, event ) )
         {
             // no default action at the moment
         }
@@ -2761,7 +2775,7 @@ void wxGrid::ProcessCornerLabelMouseEvent( wxMouseEvent& event )
 
     else if ( event.RightDClick() )
     {
-        if ( !SendEvent( EVT_GRID_LABEL_RIGHT_DCLICK, -1, -1, event ) )
+        if ( !SendEvent( wxEVT_GRID_LABEL_RIGHT_DCLICK, -1, -1, event ) )
         {
             // no default action at the moment
         }
@@ -2953,7 +2967,7 @@ void wxGrid::ProcessGridCellMouseEvent( wxMouseEvent& event )
         //
         if ( event.LeftDown() )
         {
-            EnableCellEditControl( FALSE );
+            DisableCellEditControl();
             if ( event.ShiftDown() )
             {
                 SelectBlock( m_currentCellCoords, coords );
@@ -2961,7 +2975,7 @@ void wxGrid::ProcessGridCellMouseEvent( wxMouseEvent& event )
             else if ( XToEdgeOfCol(x) < 0  &&
                       YToEdgeOfRow(y) < 0 )
             {
-                if ( !SendEvent( EVT_GRID_CELL_LEFT_CLICK,
+                if ( !SendEvent( wxEVT_GRID_CELL_LEFT_CLICK,
                                  coords.GetRow(),
                                  coords.GetCol(),
                                  event ) )
@@ -2970,14 +2984,15 @@ void wxGrid::ProcessGridCellMouseEvent( wxMouseEvent& event )
 
                     // if this is the second click on this cell then start
                     // the edit control
-                    if (m_waitForSlowClick && coords == m_currentCellCoords) {
-                        EnableCellEditControl(TRUE);
-                        // VZ: this is done by the call above, so why do it
-                        //     again? please remove this line if it's ok
-                        //ShowCellEditControl();
+                    if ( m_waitForSlowClick &&
+                         (coords == m_currentCellCoords) &&
+                         CanEnableCellControl())
+                    {
+                        EnableCellEditControl();
                         m_waitForSlowClick = FALSE;
                     }
-                    else {
+                    else
+                    {
                         SetCurrentCell( coords );
                         m_waitForSlowClick = TRUE;
                     }
@@ -2990,10 +3005,10 @@ void wxGrid::ProcessGridCellMouseEvent( wxMouseEvent& event )
         //
         else if ( event.LeftDClick() )
         {
-            EnableCellEditControl( FALSE );
+            DisableCellEditControl();
             if ( XToEdgeOfCol(x) < 0  &&  YToEdgeOfRow(y) < 0 )
             {
-                SendEvent( EVT_GRID_CELL_LEFT_DCLICK,
+                SendEvent( wxEVT_GRID_CELL_LEFT_DCLICK,
                            coords.GetRow(),
                            coords.GetCol(),
                            event );
@@ -3013,7 +3028,7 @@ void wxGrid::ProcessGridCellMouseEvent( wxMouseEvent& event )
                         m_winCapture->ReleaseMouse();
                         m_winCapture = NULL;
                     }
-                    SendEvent( EVT_GRID_RANGE_SELECT, -1, -1, event );
+                    SendEvent( wxEVT_GRID_RANGE_SELECT, -1, -1, event );
                 }
 
                 // Show the edit control, if it has been hidden for
@@ -3028,7 +3043,7 @@ void wxGrid::ProcessGridCellMouseEvent( wxMouseEvent& event )
                 // Note: we are ending the event *after* doing
                 // default processing in this case
                 //
-                SendEvent( EVT_GRID_ROW_SIZE, m_dragRowOrCol, -1, event );
+                SendEvent( wxEVT_GRID_ROW_SIZE, m_dragRowOrCol, -1, event );
             }
             else if ( m_cursorMode == WXGRID_CURSOR_RESIZE_COL )
             {
@@ -3038,7 +3053,7 @@ void wxGrid::ProcessGridCellMouseEvent( wxMouseEvent& event )
                 // Note: we are ending the event *after* doing
                 // default processing in this case
                 //
-                SendEvent( EVT_GRID_COL_SIZE, -1, m_dragRowOrCol, event );
+                SendEvent( wxEVT_GRID_COL_SIZE, -1, m_dragRowOrCol, event );
             }
 
             m_dragLastPos = -1;
@@ -3049,8 +3064,8 @@ void wxGrid::ProcessGridCellMouseEvent( wxMouseEvent& event )
         //
         else if ( event.RightDown() )
         {
-            EnableCellEditControl( FALSE );
-            if ( !SendEvent( EVT_GRID_CELL_RIGHT_CLICK,
+            DisableCellEditControl();
+            if ( !SendEvent( wxEVT_GRID_CELL_RIGHT_CLICK,
                              coords.GetRow(),
                              coords.GetCol(),
                              event ) )
@@ -3064,8 +3079,8 @@ void wxGrid::ProcessGridCellMouseEvent( wxMouseEvent& event )
         //
         else if ( event.RightDClick() )
         {
-            EnableCellEditControl( FALSE );
-            if ( !SendEvent( EVT_GRID_CELL_RIGHT_DCLICK,
+            DisableCellEditControl();
+            if ( !SendEvent( wxEVT_GRID_CELL_RIGHT_DCLICK,
                              coords.GetRow(),
                              coords.GetCol(),
                              event ) )
@@ -3259,7 +3274,7 @@ bool wxGrid::InsertRows( int pos, int numRows, bool WXUNUSED(updateLabels) )
     if ( m_table )
     {
         if (IsCellEditControlEnabled())
-            EnableCellEditControl(FALSE);
+            DisableCellEditControl();
 
         bool ok = m_table->InsertRows( pos, numRows );
 
@@ -3346,7 +3361,7 @@ bool wxGrid::DeleteRows( int pos, int numRows, bool WXUNUSED(updateLabels) )
     if ( m_table )
     {
         if (IsCellEditControlEnabled())
-            EnableCellEditControl(FALSE);
+            DisableCellEditControl();
 
         if (m_table->DeleteRows( pos, numRows ))
         {
@@ -3376,7 +3391,7 @@ bool wxGrid::InsertCols( int pos, int numCols, bool WXUNUSED(updateLabels) )
     if ( m_table )
     {
         if (IsCellEditControlEnabled())
-            EnableCellEditControl(FALSE);
+            DisableCellEditControl();
 
         bool ok = m_table->InsertCols( pos, numCols );
 
@@ -3454,7 +3469,7 @@ bool wxGrid::DeleteCols( int pos, int numCols, bool WXUNUSED(updateLabels) )
     if ( m_table )
     {
         if (IsCellEditControlEnabled())
-            EnableCellEditControl(FALSE);
+            DisableCellEditControl();
 
         if ( m_table->DeleteCols( pos, numCols ) )
         {
@@ -3482,8 +3497,7 @@ bool wxGrid::SendEvent( const wxEventType type,
                         int row, int col,
                         wxMouseEvent& mouseEv )
 {
-    if ( type == EVT_GRID_ROW_SIZE ||
-         type == EVT_GRID_COL_SIZE )
+    if ( type == wxEVT_GRID_ROW_SIZE || type == wxEVT_GRID_COL_SIZE )
     {
         int rowOrCol = (row == -1 ? col : row);
 
@@ -3499,7 +3513,7 @@ bool wxGrid::SendEvent( const wxEventType type,
 
         return GetEventHandler()->ProcessEvent(gridEvt);
     }
-    else if ( type == EVT_GRID_RANGE_SELECT )
+    else if ( type == wxEVT_GRID_RANGE_SELECT )
     {
         wxGridRangeSelectEvent gridEvt( GetId(),
                                         type,
@@ -3536,8 +3550,7 @@ bool wxGrid::SendEvent( const wxEventType type,
 bool wxGrid::SendEvent( const wxEventType type,
                         int row, int col )
 {
-    if ( type == EVT_GRID_ROW_SIZE ||
-         type == EVT_GRID_COL_SIZE )
+    if ( type == wxEVT_GRID_ROW_SIZE || type == wxEVT_GRID_COL_SIZE )
     {
         int rowOrCol = (row == -1 ? col : row);
 
@@ -3729,9 +3742,9 @@ void wxGrid::OnKeyDown( wxKeyEvent& event )
             default:
                 // now try the cell edit control
                 //
-                if ( !IsCellEditControlEnabled() )
-                    EnableCellEditControl( TRUE );
-                if (IsCellEditControlEnabled()) {
+                if ( !IsCellEditControlEnabled() && CanEnableCellControl() )
+                {
+                    EnableCellEditControl();
                     wxGridCellAttr* attr = GetCellAttr(m_currentCellCoords);
                     attr->GetEditor()->StartingKey(event);
                     attr->DecRef();
@@ -3752,7 +3765,7 @@ void wxGrid::OnEraseBackground(wxEraseEvent&)
 
 void wxGrid::SetCurrentCell( const wxGridCellCoords& coords )
 {
-    if ( SendEvent( EVT_GRID_SELECT_CELL, coords.GetRow(), coords.GetCol() ) )
+    if ( SendEvent( wxEVT_GRID_SELECT_CELL, coords.GetRow(), coords.GetCol() ) )
     {
         // the event has been intercepted - do nothing
         return;
@@ -3763,7 +3776,7 @@ void wxGrid::SetCurrentCell( const wxGridCellCoords& coords )
     {
         HideCellEditControl();
         SaveEditControlValue();
-        EnableCellEditControl(FALSE);
+        DisableCellEditControl();
 
         // Clear the old current cell highlight
         wxRect r = BlockToDeviceRect(m_currentCellCoords, m_currentCellCoords);
@@ -4255,6 +4268,9 @@ void wxGrid::EnableEditing( bool edit )
     {
         m_editable = edit;
 
+        // FIXME IMHO this won't disable the edit control if edit == FALSE
+        //       because of the check in the beginning of
+        //       EnableCellEditControl() just below (VZ)
         EnableCellEditControl(m_editable);
     }
 }
@@ -4270,9 +4286,18 @@ void wxGrid::EnableCellEditControl( bool enable )
 
     if ( enable != m_cellEditCtrlEnabled )
     {
+        // TODO allow the app to Veto() this event?
+        SendEvent(enable ? wxEVT_GRID_EDITOR_SHOWN : wxEVT_GRID_EDITOR_HIDDEN);
+
         if ( enable )
         {
+            // this should be checked by the caller!
+            wxASSERT_MSG( CanEnableCellControl(),
+                          _T("can't enable editing for this cell!") );
+
+            // do it before ShowCellEditControl()
             m_cellEditCtrlEnabled = enable;
+
             SetEditControlValue();
             ShowCellEditControl();
         }
@@ -4280,28 +4305,33 @@ void wxGrid::EnableCellEditControl( bool enable )
         {
             HideCellEditControl();
             SaveEditControlValue();
+
+            // do it after HideCellEditControl()
             m_cellEditCtrlEnabled = enable;
         }
     }
 }
 
-
-bool wxGrid::IsCellEditControlEnabled()
+bool wxGrid::IsCurrentCellReadOnly() const
 {
-    bool enabled;
+    // const_cast
+    wxGridCellAttr* attr = ((wxGrid *)this)->GetCellAttr(m_currentCellCoords);
+    bool readonly = attr->IsReadOnly();
+    attr->DecRef();
 
-    if ( m_cellEditCtrlEnabled )
-    {
-        wxGridCellAttr* attr = GetCellAttr(m_currentCellCoords);
-        enabled = !attr->IsReadOnly();
-        attr->DecRef();
-    }
-    else
-    {
-        enabled = FALSE;
-    }
+    return readonly;
+}
 
-    return enabled;
+bool wxGrid::CanEnableCellControl() const
+{
+    return m_editable && !IsCurrentCellReadOnly();
+}
+
+bool wxGrid::IsCellEditControlEnabled() const
+{
+    // the cell edit control might be disable for all cells or just for the
+    // current one if it's read only
+    return m_cellEditCtrlEnabled ? !IsCurrentCellReadOnly() : FALSE;
 }
 
 void wxGrid::ShowCellEditControl()
@@ -4423,7 +4453,7 @@ void wxGrid::SaveEditControlValue()
 
         if (changed)
         {
-            SendEvent( EVT_GRID_CELL_CHANGE,
+            SendEvent( wxEVT_GRID_CELL_CHANGE,
                        m_currentCellCoords.GetRow(),
                        m_currentCellCoords.GetCol() );
         }
@@ -5797,7 +5827,7 @@ void wxGrid::SelectRow( int row, bool addToSelected )
     }
 
     wxGridRangeSelectEvent gridEvt( GetId(),
-                                    EVT_GRID_RANGE_SELECT,
+                                    wxEVT_GRID_RANGE_SELECT,
                                     this,
                                     m_selectedTopLeft,
                                     m_selectedBottomRight );
@@ -5875,7 +5905,7 @@ void wxGrid::SelectCol( int col, bool addToSelected )
     }
 
     wxGridRangeSelectEvent gridEvt( GetId(),
-                                    EVT_GRID_RANGE_SELECT,
+                                    wxEVT_GRID_RANGE_SELECT,
                                     this,
                                     m_selectedTopLeft,
                                     m_selectedBottomRight );
@@ -6005,7 +6035,7 @@ void wxGrid::SelectBlock( int topRow, int leftCol, int bottomRow, int rightCol )
     if ( !m_isDragging )
     {
         wxGridRangeSelectEvent gridEvt( GetId(),
-                                        EVT_GRID_RANGE_SELECT,
+                                        wxEVT_GRID_RANGE_SELECT,
                                         this,
                                         m_selectedTopLeft,
                                         m_selectedBottomRight );