--- /dev/null
+import wx
+import wx.grid
+import string
+
+class UpCaseCellEditor(wx.grid.PyGridCellEditor):
+ def __init__(self):
+ wx.grid.PyGridCellEditor.__init__(self)
+
+ def Create(self, parent, id, evtHandler):
+ """
+ Called to create the control, which must derive from wx.Control.
+ *Must Override*
+ """
+ self._tc = wx.TextCtrl(parent, id, "")
+ self._tc.SetInsertionPoint(0)
+ self.SetControl(self._tc)
+
+ if evtHandler:
+ self._tc.PushEventHandler(evtHandler)
+
+ self._tc.Bind(wx.EVT_CHAR, self.OnChar)
+
+ def SetSize(self, rect):
+ """
+ Called to position/size the edit control within the cell rectangle.
+ If you don't fill the cell (the rect) then be sure to override
+ PaintBackground and do something meaningful there.
+ """
+ self._tc.SetDimensions(rect.x, rect.y, rect.width+2, rect.height+2,
+ wx.SIZE_ALLOW_MINUS_ONE)
+
+ def BeginEdit(self, row, col, grid):
+ """
+ Fetch the value from the table and prepare the edit control
+ to begin editing. Set the focus to the edit control.
+ *Must Override*
+ """
+ self.startValue = grid.GetTable().GetValue(row, col)
+ self._tc.SetValue(self.startValue)
+ self._tc.SetInsertionPointEnd()
+ self._tc.SetFocus()
+ self._tc.SetSelection(0, self._tc.GetLastPosition())
+
+ def EndEdit(self, row, col, grid):
+ """
+ Complete the editing of the current cell. Returns True if the value
+ has changed. If necessary, the control may be destroyed.
+ *Must Override*
+ """
+ changed = False
+
+ val = self._tc.GetValue()
+
+ if val != self.startValue:
+ changed = True
+ grid.GetTable().SetValue(row, col, val) # update the table
+
+ self.startValue = ''
+ self._tc.SetValue('')
+ return changed
+
+ def Reset(self):
+ """
+ Reset the value in the control back to its starting value.
+ *Must Override*
+ """
+ self._tc.SetValue(self.startValue)
+ self._tc.SetInsertionPointEnd()
+
+ def Clone(self):
+ """
+ Create a new object which is the copy of this one
+ *Must Override*
+ """
+ return UpCaseCellEditor()
+
+ def StartingKey(self, evt):
+ """
+ If the editor is enabled by pressing keys on the grid, this will be
+ called to let the editor do something about that first key if desired.
+ """
+ self.OnChar(evt)
+ if evt.GetSkipped():
+ self._tc.EmulateKeyPress(evt)
+
+ def OnChar(self, evt):
+ key = evt.GetKeyCode()
+ if key > 255:
+ evt.Skip()
+ return
+ char = chr(key)
+ if char in string.letters:
+ char = char.upper()
+ self._tc.WriteText(char)
+ else:
+ evt.Skip()
+
+class TestFrame(wx.Frame):
+ def __init__(self):
+ wx.Frame.__init__(self, None, title="Grid Editor",
+ size=(640,480))
+
+ grid = wx.grid.Grid(self)
+ grid.CreateGrid(50,50)
+ grid.SetDefaultEditor(UpCaseCellEditor())
+
+
+app = wx.PySimpleApp()
+frame = TestFrame()
+frame.Show()
+app.MainLoop()