git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@25140 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
		
			
				
	
	
		
			206 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			206 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| 
 | |
| import  wx
 | |
| import  wx.grid             as  gridlib
 | |
| import  wx.lib.gridmovers   as  gridmovers
 | |
| 
 | |
| #---------------------------------------------------------------------------
 | |
| 
 | |
| class CustomDataTable(gridlib.PyGridTableBase):
 | |
|     def __init__(self, log):
 | |
|         gridlib.PyGridTableBase.__init__(self)
 | |
|         self.log = log
 | |
| 
 | |
|         self.identifiers = ['id','ds','sv','pr','pl','op','fx','ts']
 | |
| 
 | |
|         self.rowLabels = ['Row1','Row2','Row3']
 | |
| 
 | |
|         self.colLabels = {'id':'ID','ds':'Description','sv':'Severity',
 | |
|                           'pr':'Priority','pl':'Platform','op':'Opened?',
 | |
|                           'fx':'Fixed?','ts':'Tested?'}
 | |
| 
 | |
|         self.data = [{'id':1010,
 | |
|                       'ds':"The foo doesn't bar",
 | |
|                       'sv':"major",
 | |
|                       'pr':1,
 | |
|                       'pl':'MSW',
 | |
|                       'op':1,
 | |
|                       'fx':1,
 | |
|                       'ts':1
 | |
|                       },
 | |
|                      {'id':1011,
 | |
|                       'ds':"I've got a wicket in my wocket",
 | |
|                       'sv':"wish list",
 | |
|                       'pr':2,
 | |
|                       'pl':'other',
 | |
|                       'op':0,
 | |
|                       'fx':0,
 | |
|                       'ts':0
 | |
|                       },
 | |
|                      {'id':1012,
 | |
|                       'ds':"Rectangle() returns a triangle",
 | |
|                       'sv':"critical",
 | |
|                       'pr':5,
 | |
|                       'pl':'all',
 | |
|                       'op':0,
 | |
|                       'fx':0,
 | |
|                       'ts':0
 | |
|                       }
 | |
|                      ]
 | |
| 
 | |
|     #--------------------------------------------------
 | |
|     # required methods for the wxPyGridTableBase interface
 | |
| 
 | |
|     def GetNumberRows(self):
 | |
|         return len(self.data)
 | |
| 
 | |
|     def GetNumberCols(self):
 | |
|         return len(self.identifiers)
 | |
| 
 | |
|     def IsEmptyCell(self, row, col):
 | |
|         id = self.identifiers[col]
 | |
|         return not self.data[row][id]
 | |
| 
 | |
|     def GetValue(self, row, col):
 | |
|         id = self.identifiers[col]
 | |
|         return self.data[row][id]
 | |
| 
 | |
|     def SetValue(self, row, col, value):
 | |
|         id = self.identifiers[col]
 | |
|         self.data[row][id] = value
 | |
| 
 | |
|     #--------------------------------------------------
 | |
|     # Some optional methods
 | |
| 
 | |
|     # Called when the grid needs to display column labels
 | |
|     def GetColLabelValue(self, col):
 | |
|         id = self.identifiers[col]
 | |
|         return self.colLabels[id]
 | |
| 
 | |
|     # Called when the grid needs to display row labels
 | |
|     def GetRowLabelValue(self,row):
 | |
|         return self.rowLabels[row]
 | |
| 
 | |
|     #--------------------------------------------------
 | |
|     # Methods added for demo purposes.
 | |
| 
 | |
|     # The physical moving of the cols/rows is left to the implementer.
 | |
|     # Because of the dynamic nature of a wxGrid the physical moving of
 | |
|     # columns differs from implementation to implementation
 | |
| 
 | |
|     # Move the column
 | |
|     def MoveColumn(self,frm,to):
 | |
|         grid = self.GetView()
 | |
| 
 | |
|         if grid:
 | |
|             # Move the identifiers
 | |
|             old = self.identifiers[frm]
 | |
|             del self.identifiers[frm]
 | |
| 
 | |
|             if to > frm:
 | |
|                 self.identifiers.insert(to-1,old)
 | |
|             else:
 | |
|                 self.identifiers.insert(to,old)
 | |
| 
 | |
|             # Notify the grid
 | |
|             grid.BeginBatch()
 | |
|             msg = gridlib.GridTableMessage(
 | |
|                     self, gridlib.GRIDTABLE_NOTIFY_COLS_DELETED, frm, 1
 | |
|                     )
 | |
|                     
 | |
|             grid.ProcessTableMessage(msg)
 | |
|             
 | |
|             msg = gridlib.GridTableMessage(
 | |
|                     self, gridlib.GRIDTABLE_NOTIFY_COLS_INSERTED, to, 1
 | |
|                     )
 | |
| 
 | |
|             grid.ProcessTableMessage(msg)
 | |
|             grid.EndBatch()
 | |
| 
 | |
|     # Move the row
 | |
|     def MoveRow(self,frm,to):
 | |
|         grid = self.GetView()
 | |
| 
 | |
|         if grid:
 | |
|             # Move the rowLabels and data rows
 | |
|             oldLabel = self.rowLabels[frm]
 | |
|             oldData = self.data[frm]
 | |
|             del self.rowLabels[frm]
 | |
|             del self.data[frm]
 | |
| 
 | |
|             if to > frm:
 | |
|                 self.rowLabels.insert(to-1,oldLabel)
 | |
|                 self.data.insert(to-1,oldData)
 | |
|             else:
 | |
|                 self.rowLabels.insert(to,oldLabel)
 | |
|                 self.data.insert(to,oldData)
 | |
| 
 | |
|             # Notify the grid
 | |
|             grid.BeginBatch()
 | |
| 
 | |
|             msg = gridlib.GridTableMessage(
 | |
|                     self, gridlib.GRIDTABLE_NOTIFY_ROWS_DELETED, frm, 1
 | |
|                     )
 | |
| 
 | |
|             grid.ProcessTableMessage(msg)
 | |
| 
 | |
|             msg = gridlib.GridTableMessage(
 | |
|                     self, gridlib.GRIDTABLE_NOTIFY_ROWS_INSERTED, to, 1
 | |
|                     )
 | |
| 
 | |
|             grid.ProcessTableMessage(msg)
 | |
|             grid.EndBatch()
 | |
| 
 | |
| 
 | |
| #---------------------------------------------------------------------------
 | |
| 
 | |
| 
 | |
| class DragableGrid(gridlib.Grid):
 | |
|     def __init__(self, parent, log):
 | |
|         gridlib.Grid.__init__(self, parent, -1)
 | |
| 
 | |
|         table = CustomDataTable(log)
 | |
| 
 | |
|         # The second parameter means that the grid is to take ownership of the
 | |
|         # table and will destroy it when done.  Otherwise you would need to keep
 | |
|         # a reference to it and call it's Destroy method later.
 | |
|         self.SetTable(table, True)
 | |
| 
 | |
|         # Enable Column moving
 | |
|         gridmovers.GridColMover(self)
 | |
|         self.Bind(gridmovers.EVT_GRID_COL_MOVE, self.OnColMove, self)
 | |
| 
 | |
|         # Enable Row moving
 | |
|         gridmovers.GridRowMover(self)
 | |
|         self.Bind(gridmovers.EVT_GRID_ROW_MOVE, self.OnRowMove, self)
 | |
| 
 | |
|     # Event method called when a column move needs to take place
 | |
|     def OnColMove(self,evt):
 | |
|         frm = evt.GetMoveColumn()       # Column being moved
 | |
|         to = evt.GetBeforeColumn()      # Before which column to insert
 | |
|         self.GetTable().MoveColumn(frm,to)
 | |
| 
 | |
|     # Event method called when a row move needs to take place
 | |
|     def OnRowMove(self,evt):
 | |
|         frm = evt.GetMoveRow()          # Row being moved
 | |
|         to = evt.GetBeforeRow()         # Before which row to insert
 | |
|         self.GetTable().MoveRow(frm,to)
 | |
| 
 | |
| #---------------------------------------------------------------------------
 | |
| 
 | |
| class TestFrame(wx.Frame):
 | |
|     def __init__(self, parent, log):
 | |
|         wx.Frame.__init__(self, parent, -1, "Custom Table, data driven Grid  Demo", size=(640,480))
 | |
|         grid = DragableGrid(self, log)
 | |
| 
 | |
| 
 | |
| #---------------------------------------------------------------------------
 | |
| 
 | |
| if __name__ == '__main__':
 | |
|     import sys
 | |
|     app = wx.PySimpleApp()
 | |
|     frame = TestFrame(None, sys.stdout)
 | |
|     frame.Show(True)
 | |
|     app.MainLoop()
 | |
| 
 | |
| #---------------------------------------------------------------------------
 |