blob: f9192f5cea16157108c2d773cdb78dff55a3a4fb [file] [log] [blame]
Jack Jansenc9c99f21995-08-31 13:50:16 +00001#
2# MkDistr - User Interface.
3#
4# Jack Jansen, CWI, August 1995
5#
6# XXXX To be done (requires mods of FrameWork and toolbox interfaces too):
7# - Give dialogs titles (need dlg->win conversion)
8# - Place dialogs better (???)
9# - <return> as <ok>
10# - big box around ok button
11# - window-close crashes on reopen (why?)
12# - Box around lists (???)
13# - Change cursor while busy (need cursor support in Qd)
14#
15import Res
16import Dlg
17import Ctl
18import List
19import Win
20import Qd
21from FrameWork import *
22import EasyDialogs
23import macfs
24
25# Resource IDs
26ID_MAIN = 514
27MAIN_LIST=1
28MAIN_MKDISTR=2
29MAIN_CHECK=3
30MAIN_INCLUDE=4
31MAIN_EXCLUDE=5
32
33ID_INCEXC=515
34INCEXC_DELETE=2
35INCEXC_CHANGE=3
36INCEXC_ADD=4
37
38ID_INCLUDE=512
39ID_EXCLUDE=513
40DLG_OK=1
41DLG_CANCEL=2
42DLG_FULL=3
43DLG_PPCDEV=4
44DLG_68K=5
45DLG_PPC=6
46DLG_BUTTONS=[DLG_FULL, DLG_PPCDEV, DLG_68K, DLG_PPC]
47DLG_LETTERS=['S', 'P', 'm', 'p']
48DLG_SRCPATH=7
49DLG_DSTPATH=8
50
51ID_DTYPE=516
52
53class EditDialogWindow(DialogWindow):
54 """Include/exclude editor (modeless dialog window)"""
55
56 def open(self, id, (type, src, dst), callback, cancelrv):
57 self.id = id
58 if id == ID_INCLUDE:
59 title = "Include file dialog"
60 else:
61 title = "Exclude pattern dialog"
62 #self.wid.as_Window().SetWTitle(title)
63 self.callback = callback
64 self.cancelrv = cancelrv
65 DialogWindow.open(self, id)
66 tp, h, rect = self.wid.GetDialogItem(DLG_SRCPATH)
67 Dlg.SetDialogItemText(h, src)
68 if id == ID_INCLUDE:
69 tp, h, rect = self.wid.GetDialogItem(DLG_DSTPATH)
70 Dlg.SetDialogItemText(h, dst)
71 for b in range(len(DLG_BUTTONS)):
72 if type == None or DLG_LETTERS[b] in type:
73 self.setbutton(DLG_BUTTONS[b], 1)
74
75 def setbutton(self, num, value):
76 tp, h, rect = self.wid.GetDialogItem(num)
77 h.as_Control().SetControlValue(value)
78
79 def getbutton(self, num):
80 tp, h, rect = self.wid.GetDialogItem(num)
81 return h.as_Control().GetControlValue()
82
83 def do_itemhit(self, item, event):
84 if item in (DLG_OK, DLG_CANCEL):
85 self.done(item)
86 elif item in DLG_BUTTONS:
87 v = self.getbutton(item)
88 self.setbutton(item, (not v))
89 # else it is not interesting
90
91 def done(self, item):
92 if item == DLG_OK:
93 distlist = ''
94 for i in range(len(DLG_BUTTONS)):
95 if self.getbutton(DLG_BUTTONS[i]):
96 distlist = distlist + DLG_LETTERS[i]
97 tp, h, rect = self.wid.GetDialogItem(DLG_SRCPATH)
98 src = Dlg.GetDialogItemText(h)
99 if self.id == ID_INCLUDE:
100 tp, h, rect = self.wid.GetDialogItem(DLG_DSTPATH)
101 dst = Dlg.GetDialogItemText(h)
102 rv = (distlist, src, dst)
103 else:
104 rv = (distlist, src)
105 else:
106 rv = self.cancelrv
107 self.close()
108 self.callback((item==DLG_OK), rv)
109
110class ListWindow(DialogWindow):
111 """A dialog window containing a list as its main item"""
112
113 def open(self, id, contents):
114 self.id = id
115 DialogWindow.open(self, id)
116 tp, h, rect = self.wid.GetDialogItem(MAIN_LIST)
117 rect2 = rect[0], rect[1], rect[2]-16, rect[3]-16 # Scroll bar space
118 self.list = List.LNew(rect2, (0, 0, 1, len(contents)), (0,0), 0, self.wid,
119 0, 1, 1, 1)
120 self.setlist(contents)
121
122 def setlist(self, contents):
123 self.list.LDelRow(0, 0)
124 self.list.LSetDrawingMode(0)
125 if contents:
126 self.list.LAddRow(len(contents), 0)
127 for i in range(len(contents)):
128 self.list.LSetCell(contents[i], (0, i))
129 self.list.LSetDrawingMode(1)
130 self.list.LUpdate()
131
132 def additem(self, item):
133 where = self.list.LAddRow(1, 0)
134 self.list.LSetCell(item, (0, where))
135
136 def delgetitem(self, item):
137 data = self.list.LGetCell(1000, (0, item))
138 self.list.LDelRow(1, item)
139 return data
140
141 def do_listhit(self, event):
142 (what, message, when, where, modifiers) = event
143 Qd.SetPort(self.wid)
144 where = Qd.GlobalToLocal(where)
145 if self.list.LClick(where, modifiers):
146 self.do_dclick(self.delgetselection())
147
148 def delgetselection(self):
149 items = []
150 point = (0,0)
151 while 1:
152 ok, point = self.list.LGetSelect(1, point)
153 if not ok:
154 break
155 items.append(point[1])
156 point = point[0], point[1]+1
157 values = []
158 items.reverse()
159 for i in items:
160 values.append(self.delgetitem(i))
161 return values
162
163 def do_rawupdate(self, window, event):
164 self.list.LUpdate()
165
166 def do_close(self):
167 self.close()
168
169 def close(self):
170 del self.list
171 DialogWindow.close(self)
172
173 def mycb_add(self, ok, item):
174 if item:
175 self.additem(item[1])
176 self.cb_add(item)
177
178class MainListWindow(ListWindow):
179 """The main window"""
180
181 def open(self, id, cb_check, cb_run, cb_add):
182 ListWindow.open(self, id, [])
183 title = "MkDistr: Unresolved files"
184 #self.wid.as_Window().SetWTitle(title)
185 self.cb_run = cb_run
186 self.cb_check = cb_check
187 self.cb_add = cb_add
188
189 def do_itemhit(self, item, event):
190 if item == MAIN_LIST:
191 self.do_listhit(event)
192 if item == MAIN_MKDISTR:
193 fss, ok = macfs.StandardPutFile('Destination folder:')
194 if not ok:
195 return
196 self.cb_run(fss.as_pathname())
197 if item == MAIN_CHECK:
198 list = self.cb_check()
199 self.setlist(list)
200 if item == MAIN_INCLUDE:
201 self.do_dclick(self.delgetselection())
202 if item == MAIN_EXCLUDE:
203 for i in self.delgetselection():
204 self.cb_add(('', i, ''))
205
206 def do_dclick(self, list):
207 if not list:
208 list = ['']
209 for l in list:
210 w = EditDialogWindow(self.parent)
211 w.open(ID_INCLUDE, (None, l, ''), self.mycb_add, None)
212
213 def mycb_add(self, ok, item):
214 if item:
215 self.cb_add(item)
216
217class IncListWindow(ListWindow):
218 """An include/exclude window"""
219 def open(self, id, editid, contents, cb_add, cb_del, cb_get):
220 ListWindow.open(self, id, contents)
221 if editid == ID_INCLUDE:
222 title = "MkDistr: files to include"
223 else:
224 title = "MkDistr: patterns to exclude"
225 #self.wid.as_Window().SetWTitle(title)
226 self.editid = editid
227 self.cb_add = cb_add
228 self.cb_del = cb_del
229 self.cb_get = cb_get
230
231 def do_itemhit(self, item, event):
232 if item == MAIN_LIST:
233 self.do_listhit(event)
234 if item == INCEXC_DELETE:
235 old = self.delgetselection()
236 for i in old:
237 self.cb_del(i)
238 if item == INCEXC_CHANGE:
239 self.do_dclick(self.delgetselection())
240 if item == INCEXC_ADD:
241 w = EditDialogWindow(self.parent)
242 w.open(self.editid, (None, '', ''), self.mycb_add, None)
243
244 def do_dclick(self, list):
245 if not list:
246 list = ['']
247 for l in list:
248 old = self.cb_get(l)
249 self.cb_del(l)
250 w = EditDialogWindow(self.parent)
251 w.open(self.editid, old, self.mycb_add, old)
252
253class MkDistrUI(Application):
254 def __init__(self, main):
255 self.main = main
256 Application.__init__(self)
257 self.mwin = MainListWindow(self)
258 self.mwin.open(ID_MAIN, self.main.check, self.main.run, self.main.inc.add)
259 self.iwin = None
260 self.ewin = None
261
262 def makeusermenus(self):
263 self.filemenu = m = Menu(self.menubar, "File")
264 self.includeitem = MenuItem(m, "Show Include window", "", self.showinc)
265 self.excludeitem = MenuItem(m, "Show Exclude window", "", self.showexc)
266 self.saveitem = MenuItem(m, "Save databases", "S", self.save)
267 self.quititem = MenuItem(m, "Quit", "Q", self.quit)
268
269 def quit(self, *args):
270 if self.main.is_modified():
271 rv = EasyDialogs.AskYesNoCancel('Database modified. Save?', -1)
272 if rv == -1:
273 return
274 if rv == 1:
275 self.main.save()
276 raise self
277
278 def save(self, *args):
279 self.main.save()
280
281 def showinc(self, *args):
282 if self.iwin:
283 if self._windows.has_key(self.iwin):
284 self.iwin.close()
285 del self.iwin
286 self.iwin = IncListWindow(self)
287 self.iwin.open(ID_INCEXC, ID_INCLUDE, self.main.inc.getall(), self.main.inc.add,
288 self.main.inc.delete, self.main.inc.get)
289
290 def showexc(self, *args):
291 if self.ewin:
292 if self._windows.has_key(self.ewin):
293 self.ewin.close()
294 del self.ewin
295 self.ewin = IncListWindow(self)
296 self.ewin.open(ID_INCEXC, ID_EXCLUDE, self.main.exc.getall(), self.main.exc.add,
297 self.main.exc.delete, self.main.exc.get)
298
299 def do_about(self, id, item, window, event):
300 EasyDialogs.Message("Test the MkDistr user interface.")
301
302def GetType():
303 """Ask user for distribution type"""
304 d = Dlg.GetNewDialog(ID_DTYPE, -1)
305 while 1:
306 rv = ModalDialog(None)
307 if rv >= 1 and rv <= 4:
308 return DLG_LETTERS[rv-1]
309
310def InitUI():
311 """Initialize stuff needed by UI (a resource file)"""
312 Res.OpenResFile('MkDistr.rsrc')
313
314class _testerhelp:
315 def __init__(self, which):
316 self.which = which
317
318 def get(self):
319 return [self.which+'-one', self.which+'-two']
320
321 def add(self, value):
322 if value:
323 print 'ADD', self.which, value
324
325 def delete(self, value):
326 print 'DEL', self.which, value
327
328class _test:
329 def __init__(self):
330 import sys
331 Res.OpenResFile('MkDistr.rsrc')
332 self.inc = _testerhelp('include')
333 self.exc = _testerhelp('exclude')
334 self.ui = MkDistrUI(self)
335 self.ui.mainloop()
336 sys.exit(1)
337
338 def check(self):
339 print 'CHECK'
340 return ['rv1', 'rv2']
341
342 def run(self):
343 print 'RUN'
344
345if __name__ == '__main__':
346 _test()