]> git.saurik.com Git - wxWidgets.git/blob - wxPython/demo/GridSimple.py
The great wxVScrolledWindow refactoring: allow using it both horizontal and
[wxWidgets.git] / wxPython / demo / GridSimple.py
1
2 import wx
3 import wx.grid as gridlib
4 #import wx.lib.mixins.grid as mixins
5
6 #---------------------------------------------------------------------------
7
8 class SimpleGrid(gridlib.Grid): ##, mixins.GridAutoEditMixin):
9 def __init__(self, parent, log):
10 gridlib.Grid.__init__(self, parent, -1)
11 ##mixins.GridAutoEditMixin.__init__(self)
12 self.log = log
13 self.moveTo = None
14
15 self.Bind(wx.EVT_IDLE, self.OnIdle)
16
17 self.CreateGrid(25, 25)#, gridlib.Grid.SelectRows)
18 ##self.EnableEditing(False)
19
20 # simple cell formatting
21 self.SetColSize(3, 200)
22 self.SetRowSize(4, 45)
23 self.SetCellValue(0, 0, "First cell")
24 self.SetCellValue(1, 1, "Another cell")
25 self.SetCellValue(2, 2, "Yet another cell")
26 self.SetCellValue(3, 3, "This cell is read-only")
27 self.SetCellFont(0, 0, wx.Font(12, wx.ROMAN, wx.ITALIC, wx.NORMAL))
28 self.SetCellTextColour(1, 1, wx.RED)
29 self.SetCellBackgroundColour(2, 2, wx.CYAN)
30 self.SetReadOnly(3, 3, True)
31
32 self.SetCellEditor(5, 0, gridlib.GridCellNumberEditor(1,1000))
33 self.SetCellValue(5, 0, "123")
34 self.SetCellEditor(6, 0, gridlib.GridCellFloatEditor())
35 self.SetCellValue(6, 0, "123.34")
36 self.SetCellEditor(7, 0, gridlib.GridCellNumberEditor())
37
38 self.SetCellValue(6, 3, "You can veto editing this cell")
39
40 #self.SetRowLabelSize(0)
41 #self.SetColLabelSize(0)
42
43 # attribute objects let you keep a set of formatting values
44 # in one spot, and reuse them if needed
45 attr = gridlib.GridCellAttr()
46 attr.SetTextColour(wx.BLACK)
47 attr.SetBackgroundColour(wx.RED)
48 attr.SetFont(wx.Font(10, wx.SWISS, wx.NORMAL, wx.BOLD))
49
50 # you can set cell attributes for the whole row (or column)
51 self.SetRowAttr(5, attr)
52
53 self.SetColLabelValue(0, "Custom")
54 self.SetColLabelValue(1, "column")
55 self.SetColLabelValue(2, "labels")
56
57 self.SetColLabelAlignment(wx.ALIGN_LEFT, wx.ALIGN_BOTTOM)
58
59 #self.SetDefaultCellOverflow(False)
60 #r = gridlib.GridCellAutoWrapStringRenderer()
61 #self.SetCellRenderer(9, 1, r)
62
63 # overflow cells
64 self.SetCellValue( 9, 1, "This default cell will overflow into neighboring cells, but not if you turn overflow off.");
65 self.SetCellSize(11, 1, 3, 3);
66 self.SetCellAlignment(11, 1, wx.ALIGN_CENTRE, wx.ALIGN_CENTRE);
67 self.SetCellValue(11, 1, "This cell is set to span 3 rows and 3 columns");
68
69
70 editor = gridlib.GridCellTextEditor()
71 editor.SetParameters('10')
72 self.SetCellEditor(0, 4, editor)
73 self.SetCellValue(0, 4, "Limited text")
74
75 renderer = gridlib.GridCellAutoWrapStringRenderer()
76 self.SetCellRenderer(15,0, renderer)
77 self.SetCellValue(15,0, "The text in this cell will be rendered with word-wrapping")
78
79
80 # test all the events
81 self.Bind(gridlib.EVT_GRID_CELL_LEFT_CLICK, self.OnCellLeftClick)
82 self.Bind(gridlib.EVT_GRID_CELL_RIGHT_CLICK, self.OnCellRightClick)
83 self.Bind(gridlib.EVT_GRID_CELL_LEFT_DCLICK, self.OnCellLeftDClick)
84 self.Bind(gridlib.EVT_GRID_CELL_RIGHT_DCLICK, self.OnCellRightDClick)
85
86 self.Bind(gridlib.EVT_GRID_LABEL_LEFT_CLICK, self.OnLabelLeftClick)
87 self.Bind(gridlib.EVT_GRID_LABEL_RIGHT_CLICK, self.OnLabelRightClick)
88 self.Bind(gridlib.EVT_GRID_LABEL_LEFT_DCLICK, self.OnLabelLeftDClick)
89 self.Bind(gridlib.EVT_GRID_LABEL_RIGHT_DCLICK, self.OnLabelRightDClick)
90
91 self.Bind(gridlib.EVT_GRID_ROW_SIZE, self.OnRowSize)
92 self.Bind(gridlib.EVT_GRID_COL_SIZE, self.OnColSize)
93
94 self.Bind(gridlib.EVT_GRID_RANGE_SELECT, self.OnRangeSelect)
95 self.Bind(gridlib.EVT_GRID_CELL_CHANGE, self.OnCellChange)
96 self.Bind(gridlib.EVT_GRID_SELECT_CELL, self.OnSelectCell)
97
98 self.Bind(gridlib.EVT_GRID_EDITOR_SHOWN, self.OnEditorShown)
99 self.Bind(gridlib.EVT_GRID_EDITOR_HIDDEN, self.OnEditorHidden)
100 self.Bind(gridlib.EVT_GRID_EDITOR_CREATED, self.OnEditorCreated)
101
102
103 def OnCellLeftClick(self, evt):
104 self.log.write("OnCellLeftClick: (%d,%d) %s\n" %
105 (evt.GetRow(), evt.GetCol(), evt.GetPosition()))
106 evt.Skip()
107
108 def OnCellRightClick(self, evt):
109 self.log.write("OnCellRightClick: (%d,%d) %s\n" %
110 (evt.GetRow(), evt.GetCol(), evt.GetPosition()))
111 evt.Skip()
112
113 def OnCellLeftDClick(self, evt):
114 self.log.write("OnCellLeftDClick: (%d,%d) %s\n" %
115 (evt.GetRow(), evt.GetCol(), evt.GetPosition()))
116 evt.Skip()
117
118 def OnCellRightDClick(self, evt):
119 self.log.write("OnCellRightDClick: (%d,%d) %s\n" %
120 (evt.GetRow(), evt.GetCol(), evt.GetPosition()))
121 evt.Skip()
122
123 def OnLabelLeftClick(self, evt):
124 self.log.write("OnLabelLeftClick: (%d,%d) %s\n" %
125 (evt.GetRow(), evt.GetCol(), evt.GetPosition()))
126 evt.Skip()
127
128 def OnLabelRightClick(self, evt):
129 self.log.write("OnLabelRightClick: (%d,%d) %s\n" %
130 (evt.GetRow(), evt.GetCol(), evt.GetPosition()))
131 evt.Skip()
132
133 def OnLabelLeftDClick(self, evt):
134 self.log.write("OnLabelLeftDClick: (%d,%d) %s\n" %
135 (evt.GetRow(), evt.GetCol(), evt.GetPosition()))
136 evt.Skip()
137
138 def OnLabelRightDClick(self, evt):
139 self.log.write("OnLabelRightDClick: (%d,%d) %s\n" %
140 (evt.GetRow(), evt.GetCol(), evt.GetPosition()))
141 evt.Skip()
142
143 def OnRowSize(self, evt):
144 self.log.write("OnRowSize: row %d, %s\n" %
145 (evt.GetRowOrCol(), evt.GetPosition()))
146 evt.Skip()
147
148 def OnColSize(self, evt):
149 self.log.write("OnColSize: col %d, %s\n" %
150 (evt.GetRowOrCol(), evt.GetPosition()))
151 evt.Skip()
152
153 def OnRangeSelect(self, evt):
154 if evt.Selecting():
155 self.log.write("OnRangeSelect: top-left %s, bottom-right %s\n" %
156 (evt.GetTopLeftCoords(), evt.GetBottomRightCoords()))
157 evt.Skip()
158
159
160 def OnCellChange(self, evt):
161 self.log.write("OnCellChange: (%d,%d) %s\n" %
162 (evt.GetRow(), evt.GetCol(), evt.GetPosition()))
163
164 # Show how to stay in a cell that has bad data. We can't just
165 # call SetGridCursor here since we are nested inside one so it
166 # won't have any effect. Instead, set coordinates to move to in
167 # idle time.
168 value = self.GetCellValue(evt.GetRow(), evt.GetCol())
169
170 if value == 'no good':
171 self.moveTo = evt.GetRow(), evt.GetCol()
172
173
174 def OnIdle(self, evt):
175 if self.moveTo != None:
176 self.SetGridCursor(self.moveTo[0], self.moveTo[1])
177 self.moveTo = None
178
179 evt.Skip()
180
181
182 def OnSelectCell(self, evt):
183 self.log.write("OnSelectCell: (%d,%d) %s\n" %
184 (evt.GetRow(), evt.GetCol(), evt.GetPosition()))
185
186 # Another way to stay in a cell that has a bad value...
187 row = self.GetGridCursorRow()
188 col = self.GetGridCursorCol()
189
190 if self.IsCellEditControlEnabled():
191 self.HideCellEditControl()
192 self.DisableCellEditControl()
193
194 value = self.GetCellValue(row, col)
195
196 if value == 'no good 2':
197 return # cancels the cell selection
198
199 evt.Skip()
200
201
202 def OnEditorShown(self, evt):
203 if evt.GetRow() == 6 and evt.GetCol() == 3 and \
204 wx.MessageBox("Are you sure you wish to edit this cell?",
205 "Checking", wx.YES_NO) == wx.NO:
206 evt.Veto()
207 return
208
209 self.log.write("OnEditorShown: (%d,%d) %s\n" %
210 (evt.GetRow(), evt.GetCol(), evt.GetPosition()))
211 evt.Skip()
212
213
214 def OnEditorHidden(self, evt):
215 if evt.GetRow() == 6 and evt.GetCol() == 3 and \
216 wx.MessageBox("Are you sure you wish to finish editing this cell?",
217 "Checking", wx.YES_NO) == wx.NO:
218 evt.Veto()
219 return
220
221 self.log.write("OnEditorHidden: (%d,%d) %s\n" %
222 (evt.GetRow(), evt.GetCol(), evt.GetPosition()))
223 evt.Skip()
224
225
226 def OnEditorCreated(self, evt):
227 self.log.write("OnEditorCreated: (%d, %d) %s\n" %
228 (evt.GetRow(), evt.GetCol(), evt.GetControl()))
229
230
231
232 #---------------------------------------------------------------------------
233
234 class TestFrame(wx.Frame):
235 def __init__(self, parent, log):
236 wx.Frame.__init__(self, parent, -1, "Simple Grid Demo", size=(640,480))
237 self.grid = SimpleGrid(self, log)
238
239
240
241 #---------------------------------------------------------------------------
242
243 if __name__ == '__main__':
244 import sys
245 from wx.lib.mixins.inspection import InspectableApp
246 app = InspectableApp(False)
247 frame = TestFrame(None, sys.stdout)
248 frame.Show(True)
249 #import wx.py
250 #shell = wx.py.shell.ShellFrame(frame, locals={'wx':wx, 'frame':frame})
251 #shell.Show()
252 app.MainLoop()
253
254
255 #---------------------------------------------------------------------------
256
257