]> git.saurik.com Git - wxWidgets.git/blobdiff - wxPython/samples/wxPIA_book/Chapter-14/grid_editor.py
Added the sample code from wxPython In Action to the samples dir
[wxWidgets.git] / wxPython / samples / wxPIA_book / Chapter-14 / grid_editor.py
diff --git a/wxPython/samples/wxPIA_book/Chapter-14/grid_editor.py b/wxPython/samples/wxPIA_book/Chapter-14/grid_editor.py
new file mode 100644 (file)
index 0000000..98d6296
--- /dev/null
@@ -0,0 +1,111 @@
+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()