]> git.saurik.com Git - wxWidgets.git/blame - wxPython/demo/GridDragable.py
doc tweaks, typo fixed, etc.
[wxWidgets.git] / wxPython / demo / GridDragable.py
CommitLineData
8fa876ca
RD
1# 11/6/2003 - Jeff Grimmett (grimmtooth@softhome.net)
2#
3# o Modified for V2.5
4#
5# 11/25/2003 - Jeff Grimmett (grimmtooth@softhome.net)
6#
7# o wx renamer didn't appear to 'catch' all the classes in
8# wx.lib.gridmovers
9# o Event binder not working properly with wx.lib.gridmovers
10#
11
12import wx
13import wx.grid as gridlib
14import wx.lib.gridmovers as gridmovers
1e4a197e
RD
15
16#---------------------------------------------------------------------------
17
8fa876ca 18class CustomDataTable(gridlib.PyGridTableBase):
1e4a197e 19 def __init__(self, log):
8fa876ca 20 gridlib.PyGridTableBase.__init__(self)
1e4a197e
RD
21 self.log = log
22
23 self.identifiers = ['id','ds','sv','pr','pl','op','fx','ts']
24
25 self.rowLabels = ['Row1','Row2','Row3']
26
27 self.colLabels = {'id':'ID','ds':'Description','sv':'Severity',
28 'pr':'Priority','pl':'Platform','op':'Opened?',
29 'fx':'Fixed?','ts':'Tested?'}
30
31 self.data = [{'id':1010,
32 'ds':"The foo doesn't bar",
33 'sv':"major",
34 'pr':1,
35 'pl':'MSW',
36 'op':1,
37 'fx':1,
38 'ts':1
39 },
40 {'id':1011,
41 'ds':"I've got a wicket in my wocket",
42 'sv':"wish list",
43 'pr':2,
44 'pl':'other',
45 'op':0,
46 'fx':0,
47 'ts':0
48 },
49 {'id':1012,
50 'ds':"Rectangle() returns a triangle",
51 'sv':"critical",
52 'pr':5,
53 'pl':'all',
54 'op':0,
55 'fx':0,
56 'ts':0
57 }
58 ]
59
60 #--------------------------------------------------
61 # required methods for the wxPyGridTableBase interface
62
63 def GetNumberRows(self):
64 return len(self.data)
65
66 def GetNumberCols(self):
67 return len(self.identifiers)
68
69 def IsEmptyCell(self, row, col):
70 id = self.identifiers[col]
71 return not self.data[row][id]
72
73 def GetValue(self, row, col):
74 id = self.identifiers[col]
75 return self.data[row][id]
76
77 def SetValue(self, row, col, value):
78 id = self.identifiers[col]
79 self.data[row][id] = value
80
81 #--------------------------------------------------
82 # Some optional methods
83
84 # Called when the grid needs to display column labels
85 def GetColLabelValue(self, col):
86 id = self.identifiers[col]
87 return self.colLabels[id]
88
89 # Called when the grid needs to display row labels
90 def GetRowLabelValue(self,row):
91 return self.rowLabels[row]
92
93 #--------------------------------------------------
94 # Methods added for demo purposes.
95
96 # The physical moving of the cols/rows is left to the implementer.
97 # Because of the dynamic nature of a wxGrid the physical moving of
98 # columns differs from implementation to implementation
99
100 # Move the column
101 def MoveColumn(self,frm,to):
102 grid = self.GetView()
8fa876ca 103
1e4a197e
RD
104 if grid:
105 # Move the identifiers
106 old = self.identifiers[frm]
107 del self.identifiers[frm]
8fa876ca 108
1e4a197e
RD
109 if to > frm:
110 self.identifiers.insert(to-1,old)
111 else:
112 self.identifiers.insert(to,old)
113
114 # Notify the grid
115 grid.BeginBatch()
8fa876ca
RD
116 msg = gridlib.GridTableMessage(
117 self, gridlib.GRIDTABLE_NOTIFY_COLS_DELETED, frm, 1
118 )
119
1e4a197e 120 grid.ProcessTableMessage(msg)
8fa876ca
RD
121
122 msg = gridlib.GridTableMessage(
123 self, gridlib.GRIDTABLE_NOTIFY_COLS_INSERTED, to, 1
124 )
125
1e4a197e
RD
126 grid.ProcessTableMessage(msg)
127 grid.EndBatch()
128
129 # Move the row
130 def MoveRow(self,frm,to):
131 grid = self.GetView()
8fa876ca 132
1e4a197e
RD
133 if grid:
134 # Move the rowLabels and data rows
135 oldLabel = self.rowLabels[frm]
136 oldData = self.data[frm]
137 del self.rowLabels[frm]
138 del self.data[frm]
8fa876ca 139
1e4a197e
RD
140 if to > frm:
141 self.rowLabels.insert(to-1,oldLabel)
142 self.data.insert(to-1,oldData)
143 else:
144 self.rowLabels.insert(to,oldLabel)
145 self.data.insert(to,oldData)
146
147 # Notify the grid
148 grid.BeginBatch()
8fa876ca
RD
149
150 msg = gridlib.GridTableMessage(
151 self, gridlib.GRIDTABLE_NOTIFY_ROWS_DELETED, frm, 1
152 )
153
1e4a197e 154 grid.ProcessTableMessage(msg)
8fa876ca
RD
155
156 msg = gridlib.GridTableMessage(
157 self, gridlib.GRIDTABLE_NOTIFY_ROWS_INSERTED, to, 1
158 )
159
1e4a197e
RD
160 grid.ProcessTableMessage(msg)
161 grid.EndBatch()
162
163
164#---------------------------------------------------------------------------
165
166
8fa876ca 167class DragableGrid(gridlib.Grid):
1e4a197e 168 def __init__(self, parent, log):
8fa876ca 169 gridlib.Grid.__init__(self, parent, -1)
1e4a197e
RD
170
171 table = CustomDataTable(log)
172
173 # The second parameter means that the grid is to take ownership of the
174 # table and will destroy it when done. Otherwise you would need to keep
175 # a reference to it and call it's Destroy method later.
176 self.SetTable(table, True)
177
178 # Enable Column moving
33785d9f
RD
179 gridmovers.GridColMover(self)
180 self.Bind(gridmovers.EVT_GRID_COL_MOVE, self.OnColMove, self)
1e4a197e
RD
181
182 # Enable Row moving
33785d9f
RD
183 gridmovers.GridRowMover(self)
184 self.Bind(gridmovers.EVT_GRID_ROW_MOVE, self.OnRowMove, self)
1e4a197e
RD
185
186 # Event method called when a column move needs to take place
187 def OnColMove(self,evt):
188 frm = evt.GetMoveColumn() # Column being moved
189 to = evt.GetBeforeColumn() # Before which column to insert
190 self.GetTable().MoveColumn(frm,to)
191
192 # Event method called when a row move needs to take place
193 def OnRowMove(self,evt):
194 frm = evt.GetMoveRow() # Row being moved
195 to = evt.GetBeforeRow() # Before which row to insert
196 self.GetTable().MoveRow(frm,to)
197
198#---------------------------------------------------------------------------
199
8fa876ca 200class TestFrame(wx.Frame):
1e4a197e 201 def __init__(self, parent, log):
8fa876ca 202 wx.Frame.__init__(self, parent, -1, "Custom Table, data driven Grid Demo", size=(640,480))
1e4a197e
RD
203 grid = DragableGrid(self, log)
204
205
206#---------------------------------------------------------------------------
207
208if __name__ == '__main__':
209 import sys
8fa876ca 210 app = wx.PySimpleApp()
1e4a197e
RD
211 frame = TestFrame(None, sys.stdout)
212 frame.Show(True)
213 app.MainLoop()
214
215#---------------------------------------------------------------------------