]> git.saurik.com Git - wxWidgets.git/blame_incremental - wxPython/demo/GridStdEdRend.py
Typo fix
[wxWidgets.git] / wxPython / demo / GridStdEdRend.py
... / ...
CommitLineData
1# 11/25/2003 - Jeff Grimmett (grimmtooth@softhome.net)
2#
3# o Updated for V2.5
4# o There is one wx.Size() I haven't figured out how to get rid of yet.
5#
6
7import random
8
9import wx
10import wx.grid as gridlib
11
12#---------------------------------------------------------------------------
13
14class MyCustomRenderer(gridlib.PyGridCellRenderer):
15 def __init__(self):
16 gridlib.PyGridCellRenderer.__init__(self)
17
18 def Draw(self, grid, attr, dc, rect, row, col, isSelected):
19 dc.SetBackgroundMode(wx.SOLID)
20 dc.SetBrush(wx.Brush(wx.BLACK, wx.SOLID))
21 dc.SetPen(wx.TRANSPARENT_PEN)
22 dc.DrawRectangleRect(rect)
23
24 dc.SetBackgroundMode(wx.TRANSPARENT)
25 dc.SetFont(attr.GetFont())
26
27 text = grid.GetCellValue(row, col)
28 colors = ["RED", "WHITE", "SKY BLUE"]
29 x = rect.x + 1
30 y = rect.y + 1
31
32 for ch in text:
33 dc.SetTextForeground(random.choice(colors))
34 dc.DrawText(ch, (x, y))
35 w, h = dc.GetTextExtent(ch)
36 x = x + w
37 if x > rect.right - 5:
38 break
39
40
41 def GetBestSize(self, grid, attr, dc, row, col):
42 text = grid.GetCellValue(row, col)
43 dc.SetFont(attr.GetFont())
44 w, h = dc.GetTextExtent(text)
45 return wx.Size(w, h)
46
47
48 def Clone(self):
49 return MyCustomRenderer()
50
51
52#---------------------------------------------------------------------------
53
54rendererDemoData = [
55 ('GridCellStringRenderer\n(the default)', 'this is a text value', gridlib.GridCellStringRenderer, ()),
56 ('GridCellNumberRenderer', '12345', gridlib.GridCellNumberRenderer, ()),
57 ('GridCellFloatRenderer', '1234.5678', gridlib.GridCellFloatRenderer, (6,2)),
58 ('GridCellBoolRenderer', '1', gridlib.GridCellBoolRenderer, ()),
59 ('MyCustomRenderer', 'This is my renderer', MyCustomRenderer, ()),
60 ]
61
62editorDemoData = [
63 ('GridCellTextEditor\n(the default)', 'Here is some more text', gridlib.GridCellTextEditor, ()),
64 ('GridCellNumberEditor\nwith min,max', '101', gridlib.GridCellNumberEditor, (5, 10005)),
65 ('GridCellNumberEditor\nwithout bounds', '101', gridlib.GridCellNumberEditor, ()),
66 ('GridCellFloatEditor', '1234.5678', gridlib.GridCellFloatEditor, ()),
67 ('GridCellBoolEditor', '1', gridlib.GridCellBoolEditor, ()),
68 ('GridCellChoiceEditor', 'one', gridlib.GridCellChoiceEditor, (['one', 'two', 'three', 'four',
69 'kick', 'Microsoft', 'out the',
70 'door'], False)),
71 ]
72
73comboDemoData = [
74 ('GridCellNumberRenderer\nGridCellNumberEditor', '20792', gridlib.GridCellNumberRenderer, gridlib.GridCellNumberEditor),
75 ('GridCellBoolRenderer\nGridCellBoolEditor', '1', gridlib.GridCellBoolRenderer, gridlib.GridCellBoolEditor),
76 ]
77
78
79class EditorsAndRenderersGrid(gridlib.Grid):
80 def __init__(self, parent, log):
81 gridlib.Grid.__init__(self, parent, -1)
82 self.log = log
83
84 self.CreateGrid(25, 8)
85 renCol = 1
86 edCol = 4
87
88
89 self.SetCellValue(0, renCol, '''\
90Cell Renderers are used to draw
91the contents of the cell when they
92need to be refreshed. Different
93types of Renderers can be plugged in
94to different cells in the grid, it can
95even be automatically determined based
96on the type of data in the cell.
97''')
98
99 self.SetCellValue(0, edCol, '''\
100Cell Editors are used when the
101value of the cell is edited by
102the user. An editor class is
103wrapped around a an object
104derived from wxControl and it
105implements some methods required
106to integrate with the grid.
107''')
108
109 self.SetCellValue(16, renCol, '''\
110Here are some combinations of Editors and
111Renderers used together.
112''')
113
114 row = 2
115
116 for label, value, renderClass, args in rendererDemoData:
117 renderer = renderClass(*args)
118 self.SetCellValue(row, renCol, label)
119 self.SetCellValue(row, renCol+1, value)
120 self.SetCellRenderer(row, renCol+1, renderer)
121 row = row + 2
122
123
124 row = 2
125
126 for label, value, editorClass, args in editorDemoData:
127 editor = editorClass(*args)
128 self.SetCellValue(row, edCol, label)
129 self.SetCellValue(row, edCol+1, value)
130 self.SetCellEditor(row, edCol+1, editor)
131 row = row + 2
132
133
134 row = 18
135
136 for label, value, renClass, edClass in comboDemoData:
137 self.SetCellValue(row, renCol, label)
138 self.SetCellValue(row, renCol+1, value)
139 editor = edClass()
140 renderer = renClass()
141 self.SetCellEditor(row, renCol+1, editor)
142 self.SetCellRenderer(row, renCol+1, renderer)
143 row = row + 2
144
145 font = self.GetFont()
146 font.SetWeight(wx.BOLD)
147 attr = gridlib.GridCellAttr()
148 attr.SetFont(font)
149 attr.SetBackgroundColour(wx.LIGHT_GREY)
150 attr.SetReadOnly(True)
151 attr.SetAlignment(wx.RIGHT, -1)
152 self.SetColAttr(renCol, attr)
153 attr.IncRef()
154 self.SetColAttr(edCol, attr)
155
156 # There is a bug in wxGTK for this method...
157 self.AutoSizeColumns(True)
158 self.AutoSizeRows(True)
159
160 self.Bind(gridlib.EVT_GRID_CELL_LEFT_DCLICK, self.OnLeftDClick)
161
162
163 # I do this because I don't like the default behaviour of not starting the
164 # cell editor on double clicks, but only a second click.
165 def OnLeftDClick(self, evt):
166 if self.CanEnableCellControl():
167 self.EnableCellEditControl()
168
169
170#---------------------------------------------------------------------------
171
172class TestFrame(wx.Frame):
173 def __init__(self, parent, log):
174 wx.Frame.__init__(self, parent, -1, "Editors and Renderers Demo", size=(640,480))
175 grid = EditorsAndRenderersGrid(self, log)
176
177
178
179#---------------------------------------------------------------------------
180
181if __name__ == '__main__':
182 import sys
183 app = wx.PySimpleApp()
184 frame = TestFrame(None, sys.stdout)
185 frame.Show(True)
186 app.MainLoop()
187
188
189#---------------------------------------------------------------------------