Remove a ?? in the description of Mac OS support.
[python/dscho.git] / Mac / scripts / MkDistr_ui.py
blob6b39aaa4b9e832c1d554bec73af582f031f92faf
2 # MkDistr - User Interface.
4 # Jack Jansen, CWI, August 1995
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)
15 import Res
16 import Dlg
17 import Ctl
18 import List
19 import Win
20 import Qd
21 from FrameWork import *
22 import EasyDialogs
23 import macfs
24 import os
25 import sys
27 # Resource IDs
28 ID_MAIN = 514
29 MAIN_LIST=1
30 MAIN_MKDISTR=2
31 MAIN_CHECK=3
32 MAIN_INCLUDE=4
33 MAIN_EXCLUDE=5
35 ID_INCWINDOW=515
36 ID_EXCWINDOW=517
37 INCEXC_DELETE=2
38 INCEXC_CHANGE=3
39 INCEXC_ADD=4
41 ID_INCLUDE=512
42 ID_EXCLUDE=513
43 DLG_OK=1 # Include for include, exclude for exclude
44 DLG_CANCEL=2
45 DLG_SRCPATH=3
46 DLG_DSTPATH=4 # include dialog only
47 DLG_EXCLUDE=5 # Exclude, include dialog only
49 ID_DTYPE=516
50 DTYPE_EXIST=1
51 DTYPE_NEW=2
52 DTYPE_CANCEL=3
54 class EditDialogWindow(DialogWindow):
55 """Include/exclude editor (modeless dialog window)"""
57 def open(self, id, (src, dst), callback, cancelrv):
58 self.id = id
59 self.callback = callback
60 self.cancelrv = cancelrv
61 DialogWindow.open(self, id)
62 tp, h, rect = self.wid.GetDialogItem(DLG_SRCPATH)
63 Dlg.SetDialogItemText(h, src)
64 self.wid.SetDialogDefaultItem(DLG_OK)
65 self.wid.SetDialogCancelItem(DLG_CANCEL)
66 if id == ID_INCLUDE:
67 tp, h, rect = self.wid.GetDialogItem(DLG_DSTPATH)
68 if dst == None:
69 dst = ''
70 Dlg.SetDialogItemText(h, dst)
71 self.wid.DrawDialog()
73 def do_itemhit(self, item, event):
74 if item in (DLG_OK, DLG_CANCEL, DLG_EXCLUDE):
75 self.done(item)
76 # else it is not interesting
78 def done(self, item):
79 tp, h, rect = self.wid.GetDialogItem(DLG_SRCPATH)
80 src = Dlg.GetDialogItemText(h)
81 if item == DLG_OK:
82 if self.id == ID_INCLUDE:
83 tp, h, rect = self.wid.GetDialogItem(DLG_DSTPATH)
84 dst = Dlg.GetDialogItemText(h)
85 rv = (src, dst)
86 else:
87 rv = (src, None)
88 elif item == DLG_EXCLUDE:
89 rv = (src, None)
90 else:
91 rv = self.cancelrv
92 self.close()
93 self.callback((item in (DLG_OK, DLG_EXCLUDE)), rv)
95 class ListWindow(DialogWindow):
96 """A dialog window containing a list as its main item"""
98 def open(self, id, contents):
99 self.id = id
100 DialogWindow.open(self, id)
101 Qd.SetPort(self.wid)
102 tp, h, rect = self.wid.GetDialogItem(MAIN_LIST)
103 self.listrect = rect
104 rect2 = rect[0]+1, rect[1]+1, rect[2]-16, rect[3]-16 # Scroll bar space
105 self.list = List.LNew(rect2, (0, 0, 1, len(contents)), (0,0), 0, self.wid,
106 0, 1, 1, 1)
107 self.setlist(contents)
109 def setlist(self, contents):
110 self.list.LDelRow(0, 0)
111 self.list.LSetDrawingMode(0)
112 if contents:
113 self.list.LAddRow(len(contents), 0)
114 for i in range(len(contents)):
115 self.list.LSetCell(contents[i], (0, i))
116 self.list.LSetDrawingMode(1)
117 ##self.list.LUpdate(self.wid.GetWindowPort().visRgn)
118 Win.InvalRect(self.listrect)
120 def additem(self, item):
121 where = self.list.LAddRow(1, 0)
122 self.list.LSetCell(item, (0, where))
124 def delgetitem(self, item):
125 data = self.list.LGetCell(1000, (0, item))
126 self.list.LDelRow(1, item)
127 return data
129 def do_listhit(self, event):
130 (what, message, when, where, modifiers) = event
131 Qd.SetPort(self.wid)
132 where = Qd.GlobalToLocal(where)
133 if self.list.LClick(where, modifiers):
134 self.do_dclick(self.delgetselection())
136 def delgetselection(self):
137 items = []
138 point = (0,0)
139 while 1:
140 ok, point = self.list.LGetSelect(1, point)
141 if not ok:
142 break
143 items.append(point[1])
144 point = point[0], point[1]+1
145 values = []
146 items.reverse()
147 for i in items:
148 values.append(self.delgetitem(i))
149 return values
151 def do_rawupdate(self, window, event):
152 Qd.SetPort(window)
153 Qd.FrameRect(self.listrect)
154 self.list.LUpdate(self.wid.GetWindowPort().visRgn)
156 def do_close(self):
157 self.close()
159 def close(self):
160 del self.list
161 DialogWindow.close(self)
163 def mycb_add(self, ok, item):
164 if item:
165 self.additem(item[0])
166 self.cb_add(item)
168 class MainListWindow(ListWindow):
169 """The main window"""
171 def open(self, id, cb_check, cb_run, cb_add):
172 ListWindow.open(self, id, [])
173 self.wid.SetDialogDefaultItem(MAIN_INCLUDE)
174 self.cb_run = cb_run
175 self.cb_check = cb_check
176 self.cb_add = cb_add
177 setwatchcursor()
178 list = self.cb_check()
179 self.setlist(list)
180 setarrowcursor()
182 def do_itemhit(self, item, event):
183 if item == MAIN_LIST:
184 self.do_listhit(event)
185 if item == MAIN_MKDISTR:
186 setwatchcursor()
187 self.cb_run()
188 setarrowcursor()
189 if item == MAIN_CHECK:
190 setwatchcursor()
191 list = self.cb_check()
192 self.setlist(list)
193 setarrowcursor()
194 if item == MAIN_INCLUDE:
195 self.do_dclick(self.delgetselection())
196 if item == MAIN_EXCLUDE:
197 for i in self.delgetselection():
198 self.cb_add((i, None))
200 def do_dclick(self, list):
201 if not list:
202 list = ['']
203 for l in list:
204 w = EditDialogWindow(self.parent)
205 w.open(ID_INCLUDE, (l, None), self.mycb_add, None)
207 def mycb_add(self, ok, item):
208 if item:
209 self.cb_add(item)
211 class IncListWindow(ListWindow):
212 """An include/exclude window"""
213 def open(self, id, editid, contents, cb_add, cb_del, cb_get):
214 ListWindow.open(self, id, contents)
215 self.wid.SetDialogDefaultItem(INCEXC_CHANGE)
216 self.editid = editid
217 self.cb_add = cb_add
218 self.cb_del = cb_del
219 self.cb_get = cb_get
221 def do_itemhit(self, item, event):
222 if item == MAIN_LIST:
223 self.do_listhit(event)
224 if item == INCEXC_DELETE:
225 old = self.delgetselection()
226 for i in old:
227 self.cb_del(i)
228 if item == INCEXC_CHANGE:
229 self.do_dclick(self.delgetselection())
230 if item == INCEXC_ADD:
231 w = EditDialogWindow(self.parent)
232 w.open(self.editid, ('', None), self.mycb_add, None)
234 def do_dclick(self, list):
235 if not list:
236 list = ['']
237 for l in list:
238 old = self.cb_get(l)
239 self.cb_del(l)
240 w = EditDialogWindow(self.parent)
241 w.open(self.editid, old, self.mycb_add, old)
243 class MkDistrUI(Application):
244 def __init__(self, main):
245 self.main = main
246 Application.__init__(self)
247 self.mwin = MainListWindow(self)
248 self.mwin.open(ID_MAIN, self.main.check, self.main.run, self.main.inc.add)
249 self.iwin = None
250 self.ewin = None
252 def makeusermenus(self):
253 self.filemenu = m = Menu(self.menubar, "File")
254 self.includeitem = MenuItem(m, "Show Include window", "", self.showinc)
255 self.excludeitem = MenuItem(m, "Show Exclude window", "", self.showexc)
256 self.saveitem = MenuItem(m, "Save databases", "S", self.save)
257 self.quititem = MenuItem(m, "Quit", "Q", self.quit)
259 def quit(self, *args):
260 if self.main.is_modified():
261 rv = EasyDialogs.AskYesNoCancel('Database modified. Save?', -1)
262 if rv == -1:
263 return
264 if rv == 1:
265 self.main.save()
266 raise self
268 def save(self, *args):
269 self.main.save()
271 def showinc(self, *args):
272 if self.iwin:
273 if self._windows.has_key(self.iwin):
274 self.iwin.close()
275 del self.iwin
276 self.iwin = IncListWindow(self)
277 self.iwin.open(ID_INCWINDOW, ID_INCLUDE, self.main.inc.getall(), self.main.inc.add,
278 self.main.inc.delete, self.main.inc.get)
280 def showexc(self, *args):
281 if self.ewin:
282 if self._windows.has_key(self.ewin):
283 self.ewin.close()
284 del self.ewin
285 self.ewin = IncListWindow(self)
286 self.ewin.open(ID_EXCWINDOW, ID_EXCLUDE, self.main.exc.getall(), self.main.exc.add,
287 self.main.exc.delete, self.main.exc.get)
289 def do_about(self, id, item, window, event):
290 EasyDialogs.Message("Test the MkDistr user interface.")
292 def GetType():
293 """Ask user for distribution type"""
294 while 1:
295 d = Dlg.GetNewDialog(ID_DTYPE, -1)
296 d.SetDialogDefaultItem(DTYPE_EXIST)
297 d.SetDialogCancelItem(DTYPE_CANCEL)
298 while 1:
299 rv = ModalDialog(None)
300 if rv in (DTYPE_EXIST, DTYPE_NEW, DTYPE_CANCEL):
301 break
302 del d
303 if rv == DTYPE_CANCEL:
304 sys.exit(0)
305 if rv == DTYPE_EXIST:
306 ## macfs.SetFolder(':(MkDistr)')
307 fss, ok = macfs.StandardGetFile('TEXT')
308 if not ok:
309 sys.exit(0)
310 path = fss.as_pathname()
311 basename = os.path.split(path)[-1]
312 if basename[-8:] <> '.include':
313 EasyDialogs.Message('That is not a distribution include file')
314 else:
315 return basename[:-8]
316 else:
317 name = EasyDialogs.AskString('Distribution name:')
318 if name:
319 return name
320 sys.exit(0)
322 def InitUI():
323 """Initialize stuff needed by UI (a resource file)"""
324 Res.FSpOpenResFile('MkDistr.rsrc', 1)
326 class _testerhelp:
327 def __init__(self, which):
328 self.which = which
330 def get(self):
331 return [self.which+'-one', self.which+'-two']
333 def add(self, value):
334 if value:
335 print 'ADD', self.which, value
337 def delete(self, value):
338 print 'DEL', self.which, value
340 class _test:
341 def __init__(self):
342 import sys
343 Res.FSpOpenResFile('MkDistr.rsrc', 1)
344 self.inc = _testerhelp('include')
345 self.exc = _testerhelp('exclude')
346 self.ui = MkDistrUI(self)
347 self.ui.mainloop()
348 sys.exit(1)
350 def check(self):
351 print 'CHECK'
352 return ['rv1', 'rv2']
354 def run(self):
355 print 'RUN'
357 if __name__ == '__main__':
358 _test()