Package teamwork :: Package widgets :: Module TreeBuilder
[hide private]
[frames] | no frames]

Source Code for Module teamwork.widgets.TreeBuilder

  1  from Tkinter import * 
  2  import Pmw 
  3  import tkMessageBox 
  4  from DynamicsEditor import * 
  5  from ActionDialog import ActionDialog 
  6  from teamwork.math.ProbabilityTree import ProbabilityTree,identityTree 
  7  from teamwork.dynamics.pwlDynamics import PWLDynamics 
  8           
9 -class TreeBuilder(DynamicsEditor):
10 """Frame for creating and editing PWL trees""" 11
12 - def __init__(self,parent=None,**kw):
13 optiondefs = ( 14 ('table', {}, None), 15 ('action', None, Pmw.INITOPT), 16 ('society', {}, None), 17 ('newLabel', 'New...', Pmw.INITOPT), 18 # Callback when creating a new tree 19 ('new',None,None), 20 ('key',None,Pmw.INITOPT), 21 ('default',None,None), 22 ) 23 self.defineoptions(kw,optiondefs) 24 DynamicsEditor.__init__(self,parent) 25 # Create listbox-based action selector 26 self.configure(menus_key=self['key']) 27 pane = self.insert('select pane',min=150) 28 button = self.createcomponent('selector',(),None,Pmw.ScrolledListBox, 29 (pane,), 30 labelpos='nw',label_text='Action:', 31 selectioncommand=self.selectTree, 32 listbox_selectmode='single', 33 ) 34 button.pack(side='top',fill='both',expand='yes') 35 if self['society']: 36 box = self.createcomponent('select buttons',(),None, 37 Pmw.ButtonBox,(pane,), 38 ) 39 box.add(self['newLabel'],command=self.newTree) 40 box.add('Delete',command=self.delTree,state='disabled') 41 box.pack(side='top',fill='x') 42 if len(self['table']) > 0: 43 options = self['table'].keys() 44 options.sort(lambda x,y:cmp(str(x).lower(),str(y).lower())) 45 button.setlist(map(str,options)) 46 button.setvalue(str(options[0])) 47 self.selectTree() 48 self.initialiseoptions()
49
50 - def newTree(self):
51 try: 52 dialog = self.component('dialog') 53 except KeyError: 54 dialog = self.createDialog() 55 dialog.component('actions').clear() 56 actions = {} 57 for entity in self['society'].members(): 58 for option in entity.actions.getOptions(): 59 for action in option: 60 actions[action['type']] = True 61 actionList = actions.keys() 62 actionList.sort() 63 dialog['actions'] = actionList 64 dialog.activate()
65
66 - def newAction(self,button):
67 self.component('dialog').deactivate() 68 if button == 'OK': 69 entry = {'actions': self.component('dialog').getCondition()} 70 if self['default']: 71 entry['tree'] = ProbabilityTree(self['default']) 72 else: 73 entry['tree'] = identityTree(self['key']) 74 if self['new']: 75 self['new'](self['key'],entry['actions'],entry['tree']) 76 option = str(entry['actions']) 77 self['table'][option] = entry 78 self.refreshItems(option) 79 self.selectTree(entry)
80
81 - def selectTree(self,entry=''):
82 if entry == '': 83 widget = self.component('selector') 84 try: 85 entry = self['table'][widget.getcurselection()[0]] 86 except KeyError: 87 raise UserWarning,'Unknown selection: %s' % \ 88 widget.getcurselection()[0] 89 except IndexError: 90 # Empty selection 91 pass 92 if entry != '': 93 self.configure(tree=entry['tree']) 94 self.component('tree').root.invoke() 95 if self['society']: 96 self.component('select buttons').component('Delete').configure(state='normal')
97
98 - def delTree(self):
99 widget = self.component('selector') 100 label = widget.getcurselection()[0] 101 title = 'Confirm delete' 102 msg = 'Delete these dynamics permanently?' 103 if tkMessageBox.askokcancel(title=title,message=msg): 104 del self['table'][label] 105 self.refreshItems() 106 self.configure(tree=None)
107
108 - def refreshItems(self,selection=None):
109 """Redraw the items in the selection pane (on the left) 110 """ 111 widget = self.component('selector') 112 itemList = self['table'].keys() 113 itemList.sort(lambda x,y:cmp(x.lower(),y.lower())) 114 widget.setlist(itemList) 115 if selection is None: 116 if self['society']: 117 self.component('select buttons').component('Delete').configure(state='disabled') 118 else: 119 widget.setvalue(selection)
120
121 - def createDialog(self):
122 """Creates the dialog for selecting action dependencies 123 """ 124 dialog = self.createcomponent('dialog',(),None,ActionDialog, 125 (self.interior(),), 126 buttons=('OK','Cancel'), 127 defaultbutton=0,command=self.newAction,) 128 dialog.withdraw() 129 return dialog
130