1 import string
2 from Tkinter import *
3 import tkMessageBox
4 import Pmw
5 from teamwork.widgets.cookbook import MultiListbox
6
8 commonFields = ['sequence','actor','action','recipient']
9 msgFields = ['themes','messageSubj','message','force','overhear']
10 cmdFields = ['comact','comrecipient']
11 msgTypes = {'InevitableDefeat' : ['Powerful', 'PunishViolence',
12 'SupportCortinaGov', 'SupportRCNG',
13 'SupportRCNGandGov','Weak'],
14 'PoorSupportGovt': ['SupportCortinaGov',
15 'SupportRCNG',
16 'SupportRCNGandGov'],
17 'BombingHurtsInnocents':[],
18 'GovtPower': ['Powerful'],
19 'Integrity' : ['Professional']}
20 labels = {'sequence':'Time',
21 'actor':'Actor',
22 'action':'Action',
23 'recipient':'Target',
24 'themes':'Theme',
25 'messageSubj':'Msg Subj',
26 'message':'Msg Verb',
27 'force':'Force',
28 'overhear':'Overheard',
29 'comact':'Cmd Verb',
30 'comrecipient':'Cmd Obj'}
31
32
33 - def __init__(self, parent, entities=None,balloon=None):
34
35
36
37
38
39
40
41 self.frame = parent
42 srcs = map(lambda e:e.name,entities.members())
43 self.entities = entities
44 group = Pmw.Group(parent,tag_text='New campaign item:')
45 self.boxes = {}
46 for field in self.commonFields+self.msgFields+self.cmdFields:
47 box = Pmw.OptionMenu(group.interior(),labelpos='nw',
48 label_text=self.labels[field]+':',
49 menubutton_width=8,
50 command=lambda str,s=self,f=field:\
51 s.change(f,str))
52 box.pack(side = 'left', anchor = 'n',padx = 0, pady = 0)
53 if not field in self.commonFields:
54 box.pack_forget()
55 if field == 'sequence':
56 itemList = map(lambda i:entities.time['macro']+i,range(1,6))
57 box.setitems(itemList)
58 box.configure(menubutton_width=1)
59 elif field == 'force':
60 box.configure(menubutton_width=5)
61 box.setitems(['none','accept','reject'])
62 elif field == 'actor':
63 box.setitems(['']+srcs)
64 elif field == 'overhear':
65 box.setitems(['']+srcs)
66 elif field == 'themes':
67 box.configure(menubutton_width = 12)
68 self.boxes[field] = box
69 group.pack(side=TOP,fill=X,expand=1)
70
71
72
73
74 box = Pmw.ButtonBox(parent)
75 label = 'Add'
76 box.add(label,command=self.addItem)
77 if balloon:
78 balloon.bind(box.button(label),
79 'Add the above action/message to the current '\
80 +'campaign below')
81 label = 'Remove'
82 box.add(label,command=self.removeItems)
83 if balloon:
84 balloon.bind(box.button(label),
85 'Remove the action/message selected below from '\
86 +'the current campaign')
87 box.pack(side=TOP,fill=X,expand=1)
88 lists = []
89 for i in range(len(self.commonFields)):
90 l = self.labels[self.commonFields[i]]
91 if l == 'sequence':
92 lists.append((l,5))
93 else:
94 lists.append((l,10))
95 for i in range(len(self.msgFields)):
96 l = self.labels[self.msgFields[i]]
97 try:
98 l += '/'+self.labels[self.cmdFields[i]]
99 except IndexError:
100 pass
101 if string.lower(l) == 'force':
102 lists.append((l,2))
103 else:
104 lists.append((l,10))
105 self.list = MultiListbox(parent,lists)
106 self.list.pack(side=TOP,expand=1,fill=BOTH)
107 self.campaign = []
108
109 - def change(self,field,value):
110 if field == 'actor':
111
112 if len(value) == 0:
113 actList = ['']
114 else:
115 try:
116 entity = self.entities[value]
117 except KeyError:
118 tkMessageBox.showerror('Unknown entity',
119 'I do not know any entity named "%s"'\
120 % (value))
121 entity = None
122 actList = ['']
123 if entity:
124 actList = ['','message']
125 for act in entity.actions:
126 if not act['type'] in actList:
127 actList.append(act['type'])
128 field = 'action'
129 self.boxes[field].setitems(actList)
130 self.boxes[field].invoke(actList[0])
131 elif field == 'action':
132
133 name = self.boxes['actor'].getvalue()
134 try:
135 entity = self.entities[name]
136 except KeyError:
137 entity = None
138 if entity and value == 'message':
139
140 targetList = self.entities.members()
141 targetList.remove(entity)
142 targetList = ['']+map(lambda e:e.name,targetList)
143
144 for field in self.cmdFields:
145 self.boxes[field].pack_forget()
146 for field in self.msgFields:
147 self.boxes[field].pack(side = 'left', anchor = 'n',
148 expand = 0, padx = 0, pady = 0)
149 elif entity:
150
151 targetList = []
152 for act in entity.actions:
153 if act['type'] == value and not act['object'] in targetList:
154 targetList.append(act['object'])
155 if len(targetList) > 1:
156 targetList = [''] + targetList
157 elif len(targetList) == 0:
158 targetList.append('')
159
160 for field in self.msgFields:
161 self.boxes[field].pack_forget()
162 for field in self.cmdFields:
163 if value == 'command':
164 self.boxes[field].pack(side = 'left', anchor = 'n',
165 expand = 0, padx = 0, pady = 0)
166 else:
167 self.boxes[field].pack_forget()
168 else:
169 targetList = ['']
170 self.boxes['recipient'].setitems(targetList)
171 self.boxes['recipient'].invoke(targetList[0])
172 elif field == 'recipient':
173 if self.boxes['action'].getvalue() == 'message':
174
175 if len(value) == 0:
176 themeList = ['']
177 else:
178 try:
179 entity = self.entities[value]
180 except KeyError:
181 msg = 'I do not know an entity named "%s"'% (value)
182 tkMessageBox.showerror('Unknown entity',msg)
183 return
184 try:
185 entity.susceptibilities
186 except AttributeError:
187 entity.susceptibilities = []
188 if len(entity.susceptibilities) == 0:
189 msg = 'I do not know the susceptibilities of PTA '+\
190 value+'. I will use my default list of '+\
191 'themes for now, but query susceptibility '+\
192 'agent for more specific information.'
193 tkMessageBox.showwarning('Warning',msg)
194 themeList = self.entities.themes.keys()
195 else:
196 themeList = map(lambda i:i[0],entity.susceptibilities)
197 self.boxes['themes'].setitems(themeList)
198 self.boxes['themes'].invoke(themeList[0])
199 elif self.boxes['action'].getvalue() == 'command':
200
201 actList = []
202 name = self.boxes['actor'].getvalue()
203 try:
204 entity = self.entities[name]
205 except KeyError:
206 actList.append('')
207 entity = None
208 if entity:
209 for act in entity.actions:
210 if act['type'] == 'command' and act['object'] == value:
211 act = act['command']
212 if not act['type'] in actList:
213 actList.append(act['type'])
214 if len(actList) > 1:
215 actList.insert(0,'')
216 self.boxes['comact'].setitems(actList)
217 self.boxes['comact'].invoke(actList[0])
218 elif field == 'comact':
219
220 objList = []
221 name = self.boxes['actor'].getvalue()
222 try:
223 entity = self.entities[name]
224 except KeyError:
225 entity = None
226 name = self.boxes['recipient'].getvalue()
227 try:
228 commandee = self.entities[name]
229 except KeyError:
230 entity = None
231 if entity:
232 for act in entity.actions:
233 if act['type'] == 'command' and act['object'] == name \
234 and act['command']['type'] == value:
235 if not act['command']['object'] in objList:
236 objList.append(act['command']['object'])
237 if len(objList) > 1:
238 objList.insert(0,'')
239 elif len(objList) == 0:
240 objList.append('')
241 else:
242 objList.append('')
243 self.boxes['comrecipient'].setitems(objList,0)
244 self.boxes['comrecipient'].invoke(objList[0])
245 elif field == 'themes':
246
247 srcs = map(lambda e:e.name, self.entities.members())
248 try:
249 self.boxes['message'].setitems(self.msgTypes[value])
250 self.boxes['messageSubj'].setitems(['']+srcs)
251 except KeyError:
252 self.boxes['message'].setitems([''])
253 self.boxes['messageSubj'].setitems([''])
254 self.boxes['messageSubj'].invoke('')
255 else:
256
257 pass
258
260 """Takes the item currently indicated by the option menus and
261 adds it to the current campaign"""
262 label = ''
263 item = ()
264 error = None
265 itemType = self.boxes['action'].getvalue()
266 fieldList = self.commonFields[:]
267 if itemType == 'message':
268 fieldList += self.msgFields
269 elif itemType == 'command':
270 fieldList += self.cmdFields
271 for field in fieldList:
272 value = self.boxes[field].getvalue()
273 item += (value,)
274 if len(value) > 0:
275 label += field+':'+value + '; '
276 elif not field in ['force','overhear']:
277 if field == 'recipient':
278 if self.boxes['action'].getvalue() != 'wait':
279 error = 1
280 elif field == 'comrecipient':
281 if self.boxes['comact'].getvalue() != 'wait':
282 error = 1
283 else:
284 error = 1
285 if error:
286 break
287 if error:
288 tkMessageBox.showwarning('Warning',
289 'You have not specified the '+field)
290 else:
291 if label in self.campaign:
292 tkMessageBox.showwarning('Warning',
293 'You have already added that action')
294 else:
295 self.campaign.append(label)
296 while len(item) < len(self.commonFields)+len(self.msgFields):
297 item += ('',)
298 self.list.insert(END,item)
299
300
301
309
310
312 result = []
313 for item in self.campaign:
314 action = {}
315 fields = string.split(item,'; ')
316 for pair in fields:
317 if len(pair) > 0:
318 entry = string.split(pair,':')
319 action[entry[0]] = entry[1]
320 result.append(action)
321 return result
322