]> git.saurik.com Git - wxWidgets.git/blobdiff - src/generic/grid.cpp
Use wxMBConvUTF8 when G_FILENAME_ENCODING is UTF-8, and set
[wxWidgets.git] / src / generic / grid.cpp
index 9d0e0a9f69b26d8f37dda68b35109852ddc1570e..439b9bbb1221de153b147902c2b0d147eb8cb42d 100644 (file)
@@ -47,6 +47,7 @@
 #include "wx/textfile.h"
 #include "wx/spinctrl.h"
 #include "wx/tokenzr.h"
 #include "wx/textfile.h"
 #include "wx/spinctrl.h"
 #include "wx/tokenzr.h"
+#include "wx/renderer.h"
 
 #include "wx/grid.h"
 #include "wx/generic/gridsel.h"
 
 #include "wx/grid.h"
 #include "wx/generic/gridsel.h"
@@ -142,6 +143,7 @@ private:
     void OnMouseWheel( wxMouseEvent& event );
     void OnKeyDown( wxKeyEvent& event );
     void OnKeyUp( wxKeyEvent& );
     void OnMouseWheel( wxMouseEvent& event );
     void OnKeyDown( wxKeyEvent& event );
     void OnKeyUp( wxKeyEvent& );
+    void OnChar( wxKeyEvent& );
 
     DECLARE_DYNAMIC_CLASS(wxGridRowLabelWindow)
     DECLARE_EVENT_TABLE()
 
     DECLARE_DYNAMIC_CLASS(wxGridRowLabelWindow)
     DECLARE_EVENT_TABLE()
@@ -164,6 +166,7 @@ private:
     void OnMouseWheel( wxMouseEvent& event );
     void OnKeyDown( wxKeyEvent& event );
     void OnKeyUp( wxKeyEvent& );
     void OnMouseWheel( wxMouseEvent& event );
     void OnKeyDown( wxKeyEvent& event );
     void OnKeyUp( wxKeyEvent& );
+    void OnChar( wxKeyEvent& );
 
     DECLARE_DYNAMIC_CLASS(wxGridColLabelWindow)
     DECLARE_EVENT_TABLE()
 
     DECLARE_DYNAMIC_CLASS(wxGridColLabelWindow)
     DECLARE_EVENT_TABLE()
@@ -185,6 +188,7 @@ private:
     void OnMouseWheel( wxMouseEvent& event );
     void OnKeyDown( wxKeyEvent& event );
     void OnKeyUp( wxKeyEvent& );
     void OnMouseWheel( wxMouseEvent& event );
     void OnKeyDown( wxKeyEvent& event );
     void OnKeyUp( wxKeyEvent& );
+    void OnChar( wxKeyEvent& );
     void OnPaint( wxPaintEvent& event );
 
     DECLARE_DYNAMIC_CLASS(wxGridCornerLabelWindow)
     void OnPaint( wxPaintEvent& event );
 
     DECLARE_DYNAMIC_CLASS(wxGridCornerLabelWindow)
@@ -222,6 +226,7 @@ private:
     void OnMouseEvent( wxMouseEvent& event );
     void OnKeyDown( wxKeyEvent& );
     void OnKeyUp( wxKeyEvent& );
     void OnMouseEvent( wxMouseEvent& event );
     void OnKeyDown( wxKeyEvent& );
     void OnKeyUp( wxKeyEvent& );
+    void OnChar( wxKeyEvent& );
     void OnEraseBackground( wxEraseEvent& );
     void OnFocus( wxFocusEvent& );
 
     void OnEraseBackground( wxEraseEvent& );
     void OnFocus( wxFocusEvent& );
 
@@ -502,7 +507,7 @@ void wxGridCellEditor::Show(bool show, wxGridCellAttr *attr)
             m_colBgOld = m_control->GetBackgroundColour();
             m_control->SetBackgroundColour(attr->GetBackgroundColour());
 
             m_colBgOld = m_control->GetBackgroundColour();
             m_control->SetBackgroundColour(attr->GetBackgroundColour());
 
-           // Workaround for GTK+1 font setting problem on some platforms
+// Workaround for GTK+1 font setting problem on some platforms
 #if !defined(__WXGTK__) || defined(__WXGTK20__)
             m_fontOld = m_control->GetFont();
             m_control->SetFont(attr->GetFont());
 #if !defined(__WXGTK__) || defined(__WXGTK20__)
             m_fontOld = m_control->GetFont();
             m_control->SetFont(attr->GetFont());
@@ -525,7 +530,7 @@ void wxGridCellEditor::Show(bool show, wxGridCellAttr *attr)
             m_control->SetBackgroundColour(m_colBgOld);
             m_colBgOld = wxNullColour;
         }
             m_control->SetBackgroundColour(m_colBgOld);
             m_colBgOld = wxNullColour;
         }
-       // Workaround for GTK+1 font setting problem on some platforms
+// Workaround for GTK+1 font setting problem on some platforms
 #if !defined(__WXGTK__) || defined(__WXGTK20__)
         if ( m_fontOld.Ok() )
         {
 #if !defined(__WXGTK__) || defined(__WXGTK20__)
         if ( m_fontOld.Ok() )
         {
@@ -550,8 +555,40 @@ void wxGridCellEditor::HandleReturn(wxKeyEvent& event)
 
 bool wxGridCellEditor::IsAcceptedKey(wxKeyEvent& event)
 {
 
 bool wxGridCellEditor::IsAcceptedKey(wxKeyEvent& event)
 {
-    // accept the simple key presses, not anything with Ctrl/Alt/Meta
-    return !(event.ControlDown() || event.AltDown());
+    bool ctrl = event.ControlDown();
+    bool alt  = event.AltDown();
+#ifdef __WXMAC__
+    // On the Mac the Alt key is more like shift and is used for entry of
+    // valid characters, so check for Ctrl and Meta instead.
+    alt = event.MetaDown();
+#endif
+
+    // Assume it's not a valid char if ctrl or alt is down, but if both are
+    // down then it may be because of an AltGr key combination, so let them
+    // through in that case.
+    if ((ctrl || alt) && !(ctrl && alt))
+        return false;
+    
+#if wxUSE_UNICODE
+    int key = event.GetUnicodeKey();
+    bool keyOk = true;
+
+    // if the unicode key code is not really a unicode character (it may
+    // be a function key or etc., the platforms appear to always give us a
+    // small value in this case) then fallback to the ascii key code but
+    // don't do anything for function keys or etc.
+    if (key <= 127)
+    {
+        key = event.GetKeyCode();
+        keyOk = (key <= 127);
+    }
+    return keyOk;
+#else // !wxUSE_UNICODE
+    int key = event.GetKeyCode();
+    if (key <= 255) 
+        return true;
+    return false;
+#endif // wxUSE_UNICODE/!wxUSE_UNICODE
 }
 
 void wxGridCellEditor::StartingKey(wxKeyEvent& event)
 }
 
 void wxGridCellEditor::StartingKey(wxKeyEvent& event)
@@ -699,48 +736,46 @@ void wxGridCellTextEditor::DoReset(const wxString& startValue)
 
 bool wxGridCellTextEditor::IsAcceptedKey(wxKeyEvent& event)
 {
 
 bool wxGridCellTextEditor::IsAcceptedKey(wxKeyEvent& event)
 {
-    if ( wxGridCellEditor::IsAcceptedKey(event) )
-    {
-        int keycode = event.GetKeyCode();
-        switch ( keycode )
-        {
-            case WXK_NUMPAD0:
-            case WXK_NUMPAD1:
-            case WXK_NUMPAD2:
-            case WXK_NUMPAD3:
-            case WXK_NUMPAD4:
-            case WXK_NUMPAD5:
-            case WXK_NUMPAD6:
-            case WXK_NUMPAD7:
-            case WXK_NUMPAD8:
-            case WXK_NUMPAD9:
-            case WXK_MULTIPLY:
-            case WXK_NUMPAD_MULTIPLY:
-            case WXK_ADD:
-            case WXK_NUMPAD_ADD:
-            case WXK_SUBTRACT:
-            case WXK_NUMPAD_SUBTRACT:
-            case WXK_DECIMAL:
-            case WXK_NUMPAD_DECIMAL:
-            case WXK_DIVIDE:
-            case WXK_NUMPAD_DIVIDE:
-                return true;
-
-            default:
-                // accept 8 bit chars too if isprint() agrees
-                if ( (keycode < 255) && (wxIsprint(keycode)) )
-                    return true;
-        }
-    }
-
-    return false;
+    return wxGridCellEditor::IsAcceptedKey(event);
 }
 
 void wxGridCellTextEditor::StartingKey(wxKeyEvent& event)
 {
 }
 
 void wxGridCellTextEditor::StartingKey(wxKeyEvent& event)
 {
-    if ( !Text()->EmulateKeyPress(event) )
+    // Since this is now happening in the EVT_CHAR event EmulateKeyPress is no
+    // longer an appropriate way to get the character into the text control.
+    // Do it ourselves instead.  We know that if we get this far that we have
+    // a valid character, so not a whole lot of testing needs to be done.
+
+    wxTextCtrl* tc = Text();
+    wxChar ch;
+    long pos;
+    
+#if wxUSE_UNICODE
+    ch = event.GetUnicodeKey();
+    if (ch <= 127)
+        ch = (wxChar)event.GetKeyCode();
+#else
+    ch = (wxChar)event.GetKeyCode();
+#endif
+    switch (ch)
     {
     {
-        event.Skip();
+        case WXK_DELETE:
+            // delete the character at the cursor
+            pos = tc->GetInsertionPoint();
+            if (pos < tc->GetLastPosition())
+                tc->Remove(pos, pos+1);
+            break;
+
+        case WXK_BACK:
+            // delete the character before the cursor
+            pos = tc->GetInsertionPoint();
+            if (pos > 0)
+                tc->Remove(pos-1, pos);
+            break;
+
+        default:
+            tc->WriteText(ch);
+            break;
     }
 }
 
     }
 }
 
@@ -802,6 +837,7 @@ void wxGridCellNumberEditor::Create(wxWindow* parent,
                                     wxWindowID id,
                                     wxEvtHandler* evtHandler)
 {
                                     wxWindowID id,
                                     wxEvtHandler* evtHandler)
 {
+#if wxUSE_SPINCTRL
     if ( HasRange() )
     {
         // create a spin ctrl
     if ( HasRange() )
     {
         // create a spin ctrl
@@ -813,6 +849,7 @@ void wxGridCellNumberEditor::Create(wxWindow* parent,
         wxGridCellEditor::Create(parent, id, evtHandler);
     }
     else
         wxGridCellEditor::Create(parent, id, evtHandler);
     }
     else
+#endif
     {
         // just a text control
         wxGridCellTextEditor::Create(parent, id, evtHandler);
     {
         // just a text control
         wxGridCellTextEditor::Create(parent, id, evtHandler);
@@ -835,19 +872,21 @@ void wxGridCellNumberEditor::BeginEdit(int row, int col, wxGrid* grid)
     {
         m_valueOld = 0;
         wxString sValue = table->GetValue(row, col);
     {
         m_valueOld = 0;
         wxString sValue = table->GetValue(row, col);
-        if (! sValue.ToLong(&m_valueOld) && ! sValue.IsEmpty())
+        if (! sValue.ToLong(&m_valueOld) && ! sValue.empty())
         {
             wxFAIL_MSG( _T("this cell doesn't have numeric value") );
             return;
         }
     }
 
         {
             wxFAIL_MSG( _T("this cell doesn't have numeric value") );
             return;
         }
     }
 
+#if wxUSE_SPINCTRL
     if ( HasRange() )
     {
         Spin()->SetValue((int)m_valueOld);
         Spin()->SetFocus();
     }
     else
     if ( HasRange() )
     {
         Spin()->SetValue((int)m_valueOld);
         Spin()->SetFocus();
     }
     else
+#endif
     {
         DoBeginEdit(GetString());
     }
     {
         DoBeginEdit(GetString());
     }
@@ -860,6 +899,7 @@ bool wxGridCellNumberEditor::EndEdit(int row, int col,
     long value = 0;
     wxString text;
 
     long value = 0;
     wxString text;
 
+#if wxUSE_SPINCTRL
     if ( HasRange() )
     {
         value = Spin()->GetValue();
     if ( HasRange() )
     {
         value = Spin()->GetValue();
@@ -868,9 +908,10 @@ bool wxGridCellNumberEditor::EndEdit(int row, int col,
             text = wxString::Format(wxT("%ld"), value);
     }
     else
             text = wxString::Format(wxT("%ld"), value);
     }
     else
+#endif
     {
         text = Text()->GetValue();
     {
         text = Text()->GetValue();
-        changed = (text.IsEmpty() || text.ToLong(&value)) && (value != m_valueOld);
+        changed = (text.empty() || text.ToLong(&value)) && (value != m_valueOld);
     }
 
     if ( changed )
     }
 
     if ( changed )
@@ -886,11 +927,13 @@ bool wxGridCellNumberEditor::EndEdit(int row, int col,
 
 void wxGridCellNumberEditor::Reset()
 {
 
 void wxGridCellNumberEditor::Reset()
 {
+#if wxUSE_SPINCTRL
     if ( HasRange() )
     {
         Spin()->SetValue((int)m_valueOld);
     }
     else
     if ( HasRange() )
     {
         Spin()->SetValue((int)m_valueOld);
     }
     else
+#endif
     {
         DoReset(GetString());
     }
     {
         DoReset(GetString());
     }
@@ -901,29 +944,10 @@ bool wxGridCellNumberEditor::IsAcceptedKey(wxKeyEvent& event)
     if ( wxGridCellEditor::IsAcceptedKey(event) )
     {
         int keycode = event.GetKeyCode();
     if ( wxGridCellEditor::IsAcceptedKey(event) )
     {
         int keycode = event.GetKeyCode();
-        switch ( keycode )
+        if ( (keycode < 128) &&
+             (wxIsdigit(keycode) || keycode == '+' || keycode == '-'))
         {
         {
-            case WXK_NUMPAD0:
-            case WXK_NUMPAD1:
-            case WXK_NUMPAD2:
-            case WXK_NUMPAD3:
-            case WXK_NUMPAD4:
-            case WXK_NUMPAD5:
-            case WXK_NUMPAD6:
-            case WXK_NUMPAD7:
-            case WXK_NUMPAD8:
-            case WXK_NUMPAD9:
-            case WXK_ADD:
-            case WXK_NUMPAD_ADD:
-            case WXK_SUBTRACT:
-            case WXK_NUMPAD_SUBTRACT:
-            case WXK_UP:
-            case WXK_DOWN:
-                return true;
-
-            default:
-                if ( (keycode < 128) && wxIsdigit(keycode) )
-                    return true;
+            return true;
         }
     }
 
         }
     }
 
@@ -935,21 +959,7 @@ void wxGridCellNumberEditor::StartingKey(wxKeyEvent& event)
     if ( !HasRange() )
     {
         int keycode = event.GetKeyCode();
     if ( !HasRange() )
     {
         int keycode = event.GetKeyCode();
-        if ( wxIsdigit(keycode) || keycode == '+' || keycode == '-'
-            || keycode ==  WXK_NUMPAD0
-            || keycode ==  WXK_NUMPAD1
-            || keycode ==  WXK_NUMPAD2
-            || keycode ==  WXK_NUMPAD3
-            || keycode ==  WXK_NUMPAD4
-            || keycode ==  WXK_NUMPAD5
-            || keycode ==  WXK_NUMPAD6
-            || keycode ==  WXK_NUMPAD7
-            || keycode ==  WXK_NUMPAD8
-            || keycode ==  WXK_NUMPAD9
-            || keycode ==  WXK_ADD
-            || keycode ==  WXK_NUMPAD_ADD
-            || keycode ==  WXK_SUBTRACT
-            || keycode ==  WXK_NUMPAD_SUBTRACT)
+        if ( wxIsdigit(keycode) || keycode == '+' || keycode == '-')
         {
             wxGridCellTextEditor::StartingKey(event);
 
         {
             wxGridCellTextEditor::StartingKey(event);
 
@@ -992,18 +1002,21 @@ void wxGridCellNumberEditor::SetParameters(const wxString& params)
 // return the value in the spin control if it is there (the text control otherwise)
 wxString wxGridCellNumberEditor::GetValue() const
 {
 // return the value in the spin control if it is there (the text control otherwise)
 wxString wxGridCellNumberEditor::GetValue() const
 {
-  wxString s;
+    wxString s;
 
 
-  if( HasRange() )
-  {
-    long value = Spin()->GetValue();
-    s.Printf(wxT("%ld"), value);
-  }
-  else
-  {
-    s = Text()->GetValue();
-  }
-  return s;
+#if wxUSE_SPINCTRL
+    if( HasRange() )
+    {
+        long value = Spin()->GetValue();
+        s.Printf(wxT("%ld"), value);
+    }
+    else
+#endif
+    {
+        s = Text()->GetValue();
+    }
+
+    return s;
 }
 
 // ----------------------------------------------------------------------------
 }
 
 // ----------------------------------------------------------------------------
@@ -1039,7 +1052,7 @@ void wxGridCellFloatEditor::BeginEdit(int row, int col, wxGrid* grid)
     {
         m_valueOld = 0.0;
         wxString sValue = table->GetValue(row, col);
     {
         m_valueOld = 0.0;
         wxString sValue = table->GetValue(row, col);
-        if (! sValue.ToDouble(&m_valueOld) && ! sValue.IsEmpty())
+        if (! sValue.ToDouble(&m_valueOld) && ! sValue.empty())
         {
             wxFAIL_MSG( _T("this cell doesn't have float value") );
             return;
         {
             wxFAIL_MSG( _T("this cell doesn't have float value") );
             return;
@@ -1055,7 +1068,7 @@ bool wxGridCellFloatEditor::EndEdit(int row, int col,
     double value = 0.0;
     wxString text(Text()->GetValue());
 
     double value = 0.0;
     wxString text(Text()->GetValue());
 
-    if ( (text.IsEmpty() || text.ToDouble(&value)) && (value != m_valueOld) )
+    if ( (text.empty() || text.ToDouble(&value)) && (value != m_valueOld) )
     {
         if (grid->GetTable()->CanSetValueAs(row, col, wxGRID_VALUE_FLOAT))
             grid->GetTable()->SetValueAsDouble(row, col, value);
     {
         if (grid->GetTable()->CanSetValueAs(row, col, wxGRID_VALUE_FLOAT))
             grid->GetTable()->SetValueAsDouble(row, col, value);
@@ -1080,23 +1093,9 @@ void wxGridCellFloatEditor::StartingKey(wxKeyEvent& event)
     tmpbuf[1] = '\0';
     wxString strbuf(tmpbuf, *wxConvCurrent);
     bool is_decimal_point = ( strbuf ==
     tmpbuf[1] = '\0';
     wxString strbuf(tmpbuf, *wxConvCurrent);
     bool is_decimal_point = ( strbuf ==
-      wxLocale::GetInfo(wxLOCALE_DECIMAL_POINT, wxLOCALE_CAT_NUMBER) );
-        if ( wxIsdigit(keycode) || keycode == '+' || keycode == '-'
-            || is_decimal_point
-            || keycode ==  WXK_NUMPAD0
-            || keycode ==  WXK_NUMPAD1
-            || keycode ==  WXK_NUMPAD2
-            || keycode ==  WXK_NUMPAD3
-            || keycode ==  WXK_NUMPAD4
-            || keycode ==  WXK_NUMPAD5
-            || keycode ==  WXK_NUMPAD6
-            || keycode ==  WXK_NUMPAD7
-            || keycode ==  WXK_NUMPAD8
-            || keycode ==  WXK_NUMPAD9
-            || keycode ==  WXK_ADD
-            || keycode ==  WXK_NUMPAD_ADD
-            || keycode ==  WXK_SUBTRACT
-            || keycode ==  WXK_NUMPAD_SUBTRACT)
+       wxLocale::GetInfo(wxLOCALE_DECIMAL_POINT, wxLOCALE_CAT_NUMBER) );
+    if ( wxIsdigit(keycode) || keycode == '+' || keycode == '-'
+         || is_decimal_point )
     {
         wxGridCellTextEditor::StartingKey(event);
 
     {
         wxGridCellTextEditor::StartingKey(event);
 
@@ -1161,42 +1160,19 @@ bool wxGridCellFloatEditor::IsAcceptedKey(wxKeyEvent& event)
     if ( wxGridCellEditor::IsAcceptedKey(event) )
     {
         int keycode = event.GetKeyCode();
     if ( wxGridCellEditor::IsAcceptedKey(event) )
     {
         int keycode = event.GetKeyCode();
-        switch ( keycode )
-        {
-            case WXK_NUMPAD0:
-            case WXK_NUMPAD1:
-            case WXK_NUMPAD2:
-            case WXK_NUMPAD3:
-            case WXK_NUMPAD4:
-            case WXK_NUMPAD5:
-            case WXK_NUMPAD6:
-            case WXK_NUMPAD7:
-            case WXK_NUMPAD8:
-            case WXK_NUMPAD9:
-            case WXK_ADD:
-            case WXK_NUMPAD_ADD:
-            case WXK_SUBTRACT:
-            case WXK_NUMPAD_SUBTRACT:
-            case WXK_DECIMAL:
-            case WXK_NUMPAD_DECIMAL:
-                return true;
-
-            default:
-            {
-               // additionally accept 'e' as in '1e+6', also '-', '+', and '.'
-                char tmpbuf[2];
-                tmpbuf[0] = (char) keycode;
-                tmpbuf[1] = '\0';
-                wxString strbuf(tmpbuf, *wxConvCurrent);
-                bool is_decimal_point = 
-                    ( strbuf == wxLocale::GetInfo(wxLOCALE_DECIMAL_POINT,
-                                                  wxLOCALE_CAT_NUMBER) );
-                if ( (keycode < 128) &&
-                     (wxIsdigit(keycode) || tolower(keycode) == 'e' ||
-                      is_decimal_point || keycode == '+' || keycode == '-') )
-                    return true;
-            }
-        }
+        printf("%d\n", keycode);
+        // accept digits, 'e' as in '1e+6', also '-', '+', and '.'
+        char tmpbuf[2];
+        tmpbuf[0] = (char) keycode;
+        tmpbuf[1] = '\0';
+        wxString strbuf(tmpbuf, *wxConvCurrent);
+        bool is_decimal_point =
+            ( strbuf == wxLocale::GetInfo(wxLOCALE_DECIMAL_POINT,
+                                          wxLOCALE_CAT_NUMBER) );
+        if ( (keycode < 128) && 
+             (wxIsdigit(keycode) || tolower(keycode) == 'e' ||
+              is_decimal_point || keycode == '+' || keycode == '-') )
+            return true;
     }
 
     return false;
     }
 
     return false;
@@ -1359,12 +1335,6 @@ bool wxGridCellBoolEditor::IsAcceptedKey(wxKeyEvent& event)
         int keycode = event.GetKeyCode();
         switch ( keycode )
         {
         int keycode = event.GetKeyCode();
         switch ( keycode )
         {
-            case WXK_MULTIPLY:
-            case WXK_NUMPAD_MULTIPLY:
-            case WXK_ADD:
-            case WXK_NUMPAD_ADD:
-            case WXK_SUBTRACT:
-            case WXK_NUMPAD_SUBTRACT:
             case WXK_SPACE:
             case '+':
             case '-':
             case WXK_SPACE:
             case '+':
             case '-':
@@ -1375,6 +1345,26 @@ bool wxGridCellBoolEditor::IsAcceptedKey(wxKeyEvent& event)
     return false;
 }
 
     return false;
 }
 
+void wxGridCellBoolEditor::StartingKey(wxKeyEvent& event)
+{
+    int keycode = event.GetKeyCode();
+    switch ( keycode )
+    {
+        case WXK_SPACE:
+            CBox()->SetValue(!CBox()->GetValue());
+            break;
+            
+        case '+':
+            CBox()->SetValue(true);
+            break;
+                
+        case '-':
+            CBox()->SetValue(false);
+            break;
+    }
+}
+
+
 // return the value as "1" for true and the empty string for false
 wxString wxGridCellBoolEditor::GetValue() const
 {
 // return the value as "1" for true and the empty string for false
 wxString wxGridCellBoolEditor::GetValue() const
 {
@@ -1530,7 +1520,6 @@ void wxGridCellEditorEvtHandler::OnKeyDown(wxKeyEvent& event)
                 m_editor->HandleReturn(event);
             break;
 
                 m_editor->HandleReturn(event);
             break;
 
-
         default:
             event.Skip();
     }
         default:
             event.Skip();
     }
@@ -1585,18 +1574,18 @@ void wxGridCellRenderer::Draw(wxGrid& grid,
     // grey out fields if the grid is disabled
     if( grid.IsEnabled() )
     {
     // grey out fields if the grid is disabled
     if( grid.IsEnabled() )
     {
-      if ( isSelected )
-      {
-          dc.SetBrush( wxBrush(grid.GetSelectionBackground(), wxSOLID) );
-      }
-      else
-      {
-          dc.SetBrush( wxBrush(attr.GetBackgroundColour(), wxSOLID) );
-      }
+        if ( isSelected )
+        {
+            dc.SetBrush( wxBrush(grid.GetSelectionBackground(), wxSOLID) );
+        }
+        else
+        {
+            dc.SetBrush( wxBrush(attr.GetBackgroundColour(), wxSOLID) );
+        }
     }
     else
     {
     }
     else
     {
-      dc.SetBrush(wxBrush(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_BTNFACE), wxSOLID));
+        dc.SetBrush(wxBrush(wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE), wxSOLID));
     }
 
     dc.SetPen( *wxTRANSPARENT_PEN );
     }
 
     dc.SetPen( *wxTRANSPARENT_PEN );
@@ -1632,8 +1621,8 @@ void wxGridCellStringRenderer::SetTextColoursAndFont(wxGrid& grid,
     }
     else
     {
     }
     else
     {
-      dc.SetTextBackground(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_BTNFACE));
-      dc.SetTextForeground(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_GRAYTEXT));
+      dc.SetTextBackground(wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE));
+      dc.SetTextForeground(wxSystemSettings::GetColour(wxSYS_COLOUR_GRAYTEXT));
     }
 
     dc.SetFont( attr.GetFont() );
     }
 
     dc.SetFont( attr.GetFont() );
@@ -1920,7 +1909,7 @@ void wxGridCellFloatRenderer::SetParameters(const wxString& params)
     else
     {
         wxString tmp = params.BeforeFirst(_T(','));
     else
     {
         wxString tmp = params.BeforeFirst(_T(','));
-        if ( !!tmp )
+        if ( !tmp.empty() )
         {
             long width;
             if ( tmp.ToLong(&width) )
         {
             long width;
             if ( tmp.ToLong(&width) )
@@ -1934,7 +1923,7 @@ void wxGridCellFloatRenderer::SetParameters(const wxString& params)
 
         }
                 tmp = params.AfterFirst(_T(','));
 
         }
                 tmp = params.AfterFirst(_T(','));
-                if ( !!tmp )
+                if ( !tmp.empty() )
                 {
                     long precision;
             if ( tmp.ToLong(&precision) )
                 {
                     long precision;
             if ( tmp.ToLong(&precision) )
@@ -2419,7 +2408,9 @@ void wxGridCellAttrData::UpdateAttrRows( size_t pos, int numRows )
                 else
                 {
                     // ...or remove the attribute
                 else
                 {
                     // ...or remove the attribute
-                    m_attrs.RemoveAt((size_t)n);
+                    // No need to DecRef the attribute itself since this is
+                    // done be wxGridCellWithAttr's destructor!
+                    m_attrs.RemoveAt(n);
                     n--; count--;
                 }
             }
                     n--; count--;
                 }
             }
@@ -2452,7 +2443,9 @@ void wxGridCellAttrData::UpdateAttrCols( size_t pos, int numCols )
                 else
                 {
                     // ...or remove the attribute
                 else
                 {
                     // ...or remove the attribute
-                    m_attrs.RemoveAt((size_t)n);
+                    // No need to DecRef the attribute itself since this is
+                    // done be wxGridCellWithAttr's destructor!
+                    m_attrs.RemoveAt(n);
                     n--; count--;
                 }
             }
                     n--; count--;
                 }
             }
@@ -2550,8 +2543,9 @@ void wxGridRowOrColAttrData::UpdateAttrRowsOrCols( size_t pos, int numRowsOrCols
                     rowOrCol += numRowsOrCols;
                 else
                 {
                     rowOrCol += numRowsOrCols;
                 else
                 {
-                    m_rowsOrCols.RemoveAt((size_t)n);
-                    m_attrs.RemoveAt((size_t)n);
+                    m_rowsOrCols.RemoveAt(n);
+                    m_attrs[n]->DecRef();
+                    m_attrs.RemoveAt(n);
                     n--; count--;
                 }
             }
                     n--; count--;
                 }
             }
@@ -3486,6 +3480,7 @@ BEGIN_EVENT_TABLE( wxGridRowLabelWindow, wxWindow )
     EVT_MOUSE_EVENTS( wxGridRowLabelWindow::OnMouseEvent )
     EVT_KEY_DOWN( wxGridRowLabelWindow::OnKeyDown )
     EVT_KEY_UP( wxGridRowLabelWindow::OnKeyUp )
     EVT_MOUSE_EVENTS( wxGridRowLabelWindow::OnMouseEvent )
     EVT_KEY_DOWN( wxGridRowLabelWindow::OnKeyDown )
     EVT_KEY_UP( wxGridRowLabelWindow::OnKeyUp )
+    EVT_CHAR ( wxGridRowLabelWindow::OnChar )
 END_EVENT_TABLE()
 
 wxGridRowLabelWindow::wxGridRowLabelWindow( wxGrid *parent,
 END_EVENT_TABLE()
 
 wxGridRowLabelWindow::wxGridRowLabelWindow( wxGrid *parent,
@@ -3540,6 +3535,11 @@ void wxGridRowLabelWindow::OnKeyUp( wxKeyEvent& event )
     if ( !m_owner->GetEventHandler()->ProcessEvent( event ) ) event.Skip();
 }
 
     if ( !m_owner->GetEventHandler()->ProcessEvent( event ) ) event.Skip();
 }
 
+void wxGridRowLabelWindow::OnChar( wxKeyEvent& event )
+{
+    if ( !m_owner->GetEventHandler()->ProcessEvent( event ) ) event.Skip();
+}
+
 
 
 //////////////////////////////////////////////////////////////////////
 
 
 //////////////////////////////////////////////////////////////////////
@@ -3552,6 +3552,7 @@ BEGIN_EVENT_TABLE( wxGridColLabelWindow, wxWindow )
     EVT_MOUSE_EVENTS( wxGridColLabelWindow::OnMouseEvent )
     EVT_KEY_DOWN( wxGridColLabelWindow::OnKeyDown )
     EVT_KEY_UP( wxGridColLabelWindow::OnKeyUp )
     EVT_MOUSE_EVENTS( wxGridColLabelWindow::OnMouseEvent )
     EVT_KEY_DOWN( wxGridColLabelWindow::OnKeyDown )
     EVT_KEY_UP( wxGridColLabelWindow::OnKeyUp )
+    EVT_CHAR ( wxGridColLabelWindow::OnChar )
 END_EVENT_TABLE()
 
 wxGridColLabelWindow::wxGridColLabelWindow( wxGrid *parent,
 END_EVENT_TABLE()
 
 wxGridColLabelWindow::wxGridColLabelWindow( wxGrid *parent,
@@ -3605,6 +3606,10 @@ void wxGridColLabelWindow::OnKeyUp( wxKeyEvent& event )
     if ( !m_owner->GetEventHandler()->ProcessEvent( event ) ) event.Skip();
 }
 
     if ( !m_owner->GetEventHandler()->ProcessEvent( event ) ) event.Skip();
 }
 
+void wxGridColLabelWindow::OnChar( wxKeyEvent& event )
+{
+    if ( !m_owner->GetEventHandler()->ProcessEvent( event ) ) event.Skip();
+}
 
 
 //////////////////////////////////////////////////////////////////////
 
 
 //////////////////////////////////////////////////////////////////////
@@ -3617,6 +3622,7 @@ BEGIN_EVENT_TABLE( wxGridCornerLabelWindow, wxWindow )
     EVT_PAINT( wxGridCornerLabelWindow::OnPaint)
     EVT_KEY_DOWN( wxGridCornerLabelWindow::OnKeyDown )
     EVT_KEY_UP( wxGridCornerLabelWindow::OnKeyUp )
     EVT_PAINT( wxGridCornerLabelWindow::OnPaint)
     EVT_KEY_DOWN( wxGridCornerLabelWindow::OnKeyDown )
     EVT_KEY_UP( wxGridCornerLabelWindow::OnKeyUp )
+    EVT_CHAR ( wxGridCornerLabelWindow::OnChar )
 END_EVENT_TABLE()
 
 wxGridCornerLabelWindow::wxGridCornerLabelWindow( wxGrid *parent,
 END_EVENT_TABLE()
 
 wxGridCornerLabelWindow::wxGridCornerLabelWindow( wxGrid *parent,
@@ -3635,6 +3641,15 @@ void wxGridCornerLabelWindow::OnPaint( wxPaintEvent& WXUNUSED(event) )
     int client_width = 0;
     GetClientSize( &client_width, &client_height );
 
     int client_width = 0;
     GetClientSize( &client_width, &client_height );
 
+#if __WXGTK__
+    wxRect rect;
+    rect.SetX( 1 );
+    rect.SetY( 1 );
+    rect.SetWidth( client_width - 2 );
+    rect.SetHeight( client_height - 2 );
+
+    wxRendererNative::Get().DrawHeaderButton( this, dc, rect, 0 );
+#else
     dc.SetPen( wxPen(wxSystemSettings::GetColour(wxSYS_COLOUR_3DDKSHADOW),1, wxSOLID) );
     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( wxPen(wxSystemSettings::GetColour(wxSYS_COLOUR_3DDKSHADOW),1, wxSOLID) );
     dc.DrawLine( client_width-1, client_height-1, client_width-1, 0 );
     dc.DrawLine( client_width-1, client_height-1, 0, client_height-1 );
@@ -3644,6 +3659,7 @@ void wxGridCornerLabelWindow::OnPaint( wxPaintEvent& WXUNUSED(event) )
     dc.SetPen( *wxWHITE_PEN );
     dc.DrawLine( 1, 1, client_width-1, 1 );
     dc.DrawLine( 1, 1, 1, client_height-1 );
     dc.SetPen( *wxWHITE_PEN );
     dc.DrawLine( 1, 1, client_width-1, 1 );
     dc.DrawLine( 1, 1, 1, client_height-1 );
+#endif
 }
 
 
 }
 
 
@@ -3671,6 +3687,10 @@ void wxGridCornerLabelWindow::OnKeyUp( wxKeyEvent& event )
     if ( !m_owner->GetEventHandler()->ProcessEvent( event ) ) event.Skip();
 }
 
     if ( !m_owner->GetEventHandler()->ProcessEvent( event ) ) event.Skip();
 }
 
+void wxGridCornerLabelWindow::OnChar( wxKeyEvent& event )
+{
+    if ( !m_owner->GetEventHandler()->ProcessEvent( event ) ) event.Skip();
+}
 
 
 //////////////////////////////////////////////////////////////////////
 
 
 //////////////////////////////////////////////////////////////////////
@@ -3683,6 +3703,7 @@ BEGIN_EVENT_TABLE( wxGridWindow, wxWindow )
     EVT_MOUSE_EVENTS( wxGridWindow::OnMouseEvent )
     EVT_KEY_DOWN( wxGridWindow::OnKeyDown )
     EVT_KEY_UP( wxGridWindow::OnKeyUp )
     EVT_MOUSE_EVENTS( wxGridWindow::OnMouseEvent )
     EVT_KEY_DOWN( wxGridWindow::OnKeyDown )
     EVT_KEY_UP( wxGridWindow::OnKeyUp )
+    EVT_CHAR ( wxGridWindow::OnChar )
     EVT_SET_FOCUS( wxGridWindow::OnFocus )
     EVT_KILL_FOCUS( wxGridWindow::OnFocus )
     EVT_ERASE_BACKGROUND( wxGridWindow::OnEraseBackground )
     EVT_SET_FOCUS( wxGridWindow::OnFocus )
     EVT_KILL_FOCUS( wxGridWindow::OnFocus )
     EVT_ERASE_BACKGROUND( wxGridWindow::OnEraseBackground )
@@ -3750,6 +3771,11 @@ void wxGridWindow::OnKeyUp( wxKeyEvent& event )
     if ( !m_owner->GetEventHandler()->ProcessEvent( event ) ) event.Skip();
 }
 
     if ( !m_owner->GetEventHandler()->ProcessEvent( event ) ) event.Skip();
 }
 
+void wxGridWindow::OnChar( wxKeyEvent& event )
+{
+    if ( !m_owner->GetEventHandler()->ProcessEvent( event ) ) event.Skip();
+}
+
 void wxGridWindow::OnEraseBackground( wxEraseEvent& WXUNUSED(event) )
 {
 }
 void wxGridWindow::OnEraseBackground( wxEraseEvent& WXUNUSED(event) )
 {
 }
@@ -3838,6 +3864,7 @@ BEGIN_EVENT_TABLE( wxGrid, wxScrolledWindow )
     EVT_SIZE( wxGrid::OnSize )
     EVT_KEY_DOWN( wxGrid::OnKeyDown )
     EVT_KEY_UP( wxGrid::OnKeyUp )
     EVT_SIZE( wxGrid::OnSize )
     EVT_KEY_DOWN( wxGrid::OnKeyDown )
     EVT_KEY_UP( wxGrid::OnKeyUp )
+    EVT_CHAR ( wxGrid::OnChar )
     EVT_ERASE_BACKGROUND( wxGrid::OnEraseBackground )
 END_EVENT_TABLE()
 
     EVT_ERASE_BACKGROUND( wxGrid::OnEraseBackground )
 END_EVENT_TABLE()
 
@@ -4686,7 +4713,7 @@ wxArrayInt wxGrid::CalcRowLabelsExposed( const wxRegion& reg )
             rowlabels.Add( row );
         }
 
             rowlabels.Add( row );
         }
 
-        iter++ ;
+        ++iter;
     }
 
     return rowlabels;
     }
 
     return rowlabels;
@@ -4737,7 +4764,7 @@ wxArrayInt wxGrid::CalcColLabelsExposed( const wxRegion& reg )
             colLabels.Add( col );
         }
 
             colLabels.Add( col );
         }
 
-        iter++ ;
+        ++iter;
     }
     return colLabels;
 }
     }
     return colLabels;
 }
@@ -4797,7 +4824,7 @@ wxGridCellCoordsArray wxGrid::CalcCellsExposed( const wxRegion& reg )
             }
         }
 
             }
         }
 
-        iter++;
+        ++iter;
     }
 
     return cellsExposed;
     }
 
     return cellsExposed;
@@ -6439,44 +6466,7 @@ void wxGrid::OnKeyDown( wxKeyEvent& event )
                 // Otherwise fall through to default
 
             default:
                 // Otherwise fall through to default
 
             default:
-                // is it possible to edit the current cell at all?
-                if ( !IsCellEditControlEnabled() && CanEnableCellControl() )
-                {
-                    // yes, now check whether the cells editor accepts the key
-                    int row = m_currentCellCoords.GetRow();
-                    int col = m_currentCellCoords.GetCol();
-                    wxGridCellAttr* attr = GetCellAttr(row, col);
-                    wxGridCellEditor *editor = attr->GetEditor(this, row, col);
-
-                    // <F2> is special and will always start editing, for
-                    // other keys - ask the editor itself
-                    if ( (event.GetKeyCode() == WXK_F2 && !event.HasModifiers())
-                         || editor->IsAcceptedKey(event) )
-                    {
-                        // ensure cell is visble
-                        MakeCellVisible(row, col);
-                        EnableCellEditControl();
-
-                        // a problem can arise if the cell is not completely
-                        // visible (even after calling MakeCellVisible the
-                        // control is not created and calling StartingKey will
-                        // crash the app
-                        if( editor->IsCreated() && m_cellEditCtrlEnabled ) editor->StartingKey(event);
-                    }
-                    else
-                    {
-                        event.Skip();
-                    }
-
-                    editor->DecRef();
-                    attr->DecRef();
-                }
-                else
-                {
-                    // let others process char events with modifiers or all
-                    // char events for readonly cells
-                    event.Skip();
-                }
+                event.Skip();
                 break;
         }
     }
                 break;
         }
     }
@@ -6512,6 +6502,48 @@ void wxGrid::OnKeyUp( wxKeyEvent& event )
     }
 }
 
     }
 }
 
+void wxGrid::OnChar( wxKeyEvent& event )
+{
+    // is it possible to edit the current cell at all?
+    if ( !IsCellEditControlEnabled() && CanEnableCellControl() )
+    {
+        // yes, now check whether the cells editor accepts the key
+        int row = m_currentCellCoords.GetRow();
+        int col = m_currentCellCoords.GetCol();
+        wxGridCellAttr* attr = GetCellAttr(row, col);
+        wxGridCellEditor *editor = attr->GetEditor(this, row, col);
+
+        // <F2> is special and will always start editing, for
+        // other keys - ask the editor itself
+        if ( (event.GetKeyCode() == WXK_F2 && !event.HasModifiers())
+             || editor->IsAcceptedKey(event) )
+        {
+            // ensure cell is visble
+            MakeCellVisible(row, col);
+            EnableCellEditControl();
+
+            // a problem can arise if the cell is not completely
+            // visible (even after calling MakeCellVisible the
+            // control is not created and calling StartingKey will
+            // crash the app
+            if ( editor->IsCreated() && m_cellEditCtrlEnabled )
+                editor->StartingKey(event);
+        }
+        else
+        {
+            event.Skip();
+        }
+
+        editor->DecRef();
+        attr->DecRef();
+    }
+    else
+    {
+        event.Skip();
+    }
+}
+
+
 void wxGrid::OnEraseBackground(wxEraseEvent&)
 {
 }
 void wxGrid::OnEraseBackground(wxEraseEvent&)
 {
 }
@@ -7192,6 +7224,19 @@ void wxGrid::DrawRowLabel( wxDC& dc, int row )
     if ( GetRowHeight(row) <= 0 )
         return;
 
     if ( GetRowHeight(row) <= 0 )
         return;
 
+    wxRect rect;
+#ifdef __WXGTK__
+    rect.SetX( 1 );
+    rect.SetY( GetRowTop(row) + 1 );
+    rect.SetWidth( m_rowLabelWidth - 2 );
+    rect.SetHeight( GetRowHeight(row) - 2 );
+
+    CalcScrolledPosition( 0, rect.y, NULL, &rect.y );
+
+    wxWindowDC *win_dc = (wxWindowDC*) &dc;
+
+    wxRendererNative::Get().DrawHeaderButton( win_dc->m_owner, dc, rect, 0 );
+#else
     int rowTop = GetRowTop(row),
         rowBottom = GetRowBottom(row) - 1;
 
     int rowTop = GetRowTop(row),
         rowBottom = GetRowBottom(row) - 1;
 
@@ -7206,7 +7251,7 @@ void wxGrid::DrawRowLabel( wxDC& dc, int row )
     dc.SetPen( *wxWHITE_PEN );
     dc.DrawLine( 1, rowTop, 1, rowBottom );
     dc.DrawLine( 1, rowTop, m_rowLabelWidth-1, rowTop );
     dc.SetPen( *wxWHITE_PEN );
     dc.DrawLine( 1, rowTop, 1, rowBottom );
     dc.DrawLine( 1, rowTop, m_rowLabelWidth-1, rowTop );
-
+#endif
     dc.SetBackgroundMode( wxTRANSPARENT );
     dc.SetTextForeground( GetLabelTextColour() );
     dc.SetFont( GetLabelFont() );
     dc.SetBackgroundMode( wxTRANSPARENT );
     dc.SetTextForeground( GetLabelTextColour() );
     dc.SetFont( GetLabelFont() );
@@ -7214,7 +7259,6 @@ void wxGrid::DrawRowLabel( wxDC& dc, int row )
     int hAlign, vAlign;
     GetRowLabelAlignment( &hAlign, &vAlign );
 
     int hAlign, vAlign;
     GetRowLabelAlignment( &hAlign, &vAlign );
 
-    wxRect rect;
     rect.SetX( 2 );
     rect.SetY( GetRowTop(row) + 2 );
     rect.SetWidth( m_rowLabelWidth - 4 );
     rect.SetX( 2 );
     rect.SetY( GetRowTop(row) + 2 );
     rect.SetWidth( m_rowLabelWidth - 4 );
@@ -7242,8 +7286,20 @@ void wxGrid::DrawColLabel( wxDC& dc, int col )
     if ( GetColWidth(col) <= 0 )
         return;
 
     if ( GetColWidth(col) <= 0 )
         return;
 
-    int colLeft = GetColLeft(col),
-        colRight = GetColRight(col) - 1;
+    int colLeft = GetColLeft(col);
+
+    wxRect rect;
+#ifdef __WXGTK__
+    rect.SetX( colLeft + 1 );
+    rect.SetY( 1 );
+    rect.SetWidth( GetColWidth(col) - 2 );
+    rect.SetHeight( m_colLabelHeight - 2 );
+
+    wxWindowDC *win_dc = (wxWindowDC*) &dc;
+
+    wxRendererNative::Get().DrawHeaderButton( win_dc->m_owner, dc, rect, 0 );
+#else
+    int colRight = GetColRight(col) - 1;
 
     dc.SetPen( wxPen(wxSystemSettings::GetColour(wxSYS_COLOUR_3DDKSHADOW),1, wxSOLID) );
     dc.DrawLine( colRight, 0,
 
     dc.SetPen( wxPen(wxSystemSettings::GetColour(wxSYS_COLOUR_3DDKSHADOW),1, wxSOLID) );
     dc.DrawLine( colRight, 0,
@@ -7257,7 +7313,7 @@ void wxGrid::DrawColLabel( wxDC& dc, int col )
     dc.SetPen( *wxWHITE_PEN );
     dc.DrawLine( colLeft, 1, colLeft, m_colLabelHeight-1 );
     dc.DrawLine( colLeft, 1, colRight, 1 );
     dc.SetPen( *wxWHITE_PEN );
     dc.DrawLine( colLeft, 1, colLeft, m_colLabelHeight-1 );
     dc.DrawLine( colLeft, 1, colRight, 1 );
-
+#endif
     dc.SetBackgroundMode( wxTRANSPARENT );
     dc.SetTextForeground( GetLabelTextColour() );
     dc.SetFont( GetLabelFont() );
     dc.SetBackgroundMode( wxTRANSPARENT );
     dc.SetTextForeground( GetLabelTextColour() );
     dc.SetFont( GetLabelFont() );
@@ -7266,7 +7322,6 @@ void wxGrid::DrawColLabel( wxDC& dc, int col )
     GetColLabelAlignment( &hAlign, &vAlign );
     orient = GetColLabelTextOrientation();
 
     GetColLabelAlignment( &hAlign, &vAlign );
     orient = GetColLabelTextOrientation();
 
-    wxRect rect;
     rect.SetX( colLeft + 2 );
     rect.SetY( 2 );
     rect.SetWidth( GetColWidth(col) - 4 );
     rect.SetX( colLeft + 2 );
     rect.SetY( 2 );
     rect.SetWidth( GetColWidth(col) - 4 );
@@ -7474,6 +7529,16 @@ void wxGrid::ForceRefresh()
     EndBatch();
 }
 
     EndBatch();
 }
 
+bool wxGrid::Enable(bool enable)
+{
+    if ( !wxScrolledWindow::Enable(enable) )
+        return false;
+
+    // redraw in the new state
+    m_gridWin->Refresh();
+
+    return true;
+}
 
 //
 // ------ Edit control functions
 
 //
 // ------ Edit control functions
@@ -10136,7 +10201,7 @@ wxRect wxGrid::BlockToDeviceRect( const wxGridCellCoords &topLeft,
     }
     else
     {
     }
     else
     {
-        rect = wxRect( 0, 0, 0, 0 );
+        rect = wxRect(0,0,0,0);
     }
 
     cellRect = CellToRect( bottomRight );
     }
 
     cellRect = CellToRect( bottomRight );
@@ -10211,7 +10276,7 @@ wxRect wxGrid::BlockToDeviceRect( const wxGridCellCoords &topLeft,
     m_gridWin->GetClientSize( &cw, &ch );
 
     if (right < 0 || bottom < 0 || left > cw || top > ch)
     m_gridWin->GetClientSize( &cw, &ch );
 
     if (right < 0 || bottom < 0 || left > cw || top > ch)
-        return wxRect( 0, 0, 0, 0);
+        return wxRect(0,0,0,0);
 
     rect.SetLeft( wxMax(0, left) );
     rect.SetTop( wxMax(0, top) );
 
     rect.SetLeft( wxMax(0, left) );
     rect.SetTop( wxMax(0, top) );