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
10 """Frame for creating and editing PWL trees"""
11
13 optiondefs = (
14 ('table', {}, None),
15 ('action', None, Pmw.INITOPT),
16 ('society', {}, None),
17 ('newLabel', 'New...', Pmw.INITOPT),
18
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
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
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
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
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
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
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
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
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