]>
Commit | Line | Data |
---|---|---|
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 | ||
7 | import random | |
8 | ||
9 | import wx | |
10 | import wx.grid as gridlib | |
11 | ||
12 | #--------------------------------------------------------------------------- | |
13 | ||
14 | class 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 | ||
54 | rendererDemoData = [ | |
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 | ||
62 | editorDemoData = [ | |
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 | ||
73 | comboDemoData = [ | |
74 | ('GridCellNumberRenderer\nGridCellNumberEditor', '20792', gridlib.GridCellNumberRenderer, gridlib.GridCellNumberEditor), | |
75 | ('GridCellBoolRenderer\nGridCellBoolEditor', '1', gridlib.GridCellBoolRenderer, gridlib.GridCellBoolEditor), | |
76 | ] | |
77 | ||
78 | ||
79 | class 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, '''\ | |
90 | Cell Renderers are used to draw | |
91 | the contents of the cell when they | |
92 | need to be refreshed. Different | |
93 | types of Renderers can be plugged in | |
94 | to different cells in the grid, it can | |
95 | even be automatically determined based | |
96 | on the type of data in the cell. | |
97 | ''') | |
98 | ||
99 | self.SetCellValue(0, edCol, '''\ | |
100 | Cell Editors are used when the | |
101 | value of the cell is edited by | |
102 | the user. An editor class is | |
103 | wrapped around a an object | |
104 | derived from wxControl and it | |
105 | implements some methods required | |
106 | to integrate with the grid. | |
107 | ''') | |
108 | ||
109 | self.SetCellValue(16, renCol, '''\ | |
110 | Here are some combinations of Editors and | |
111 | Renderers 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 | ||
172 | class 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 | ||
181 | if __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 | #--------------------------------------------------------------------------- |