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 (???)
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 from Carbon
import Res
16 from Carbon
import Dlg
17 from Carbon
import Ctl
18 from Carbon
import List
19 from Carbon
import Win
21 from FrameWork
import *
44 DLG_OK
=1 # Include for include, exclude for exclude
47 DLG_DSTPATH
=4 # include dialog only
48 DLG_EXCLUDE
=5 # Exclude, include dialog only
55 class EditDialogWindow(DialogWindow
):
56 """Include/exclude editor (modeless dialog window)"""
58 def open(self
, id, (src
, dst
), callback
, cancelrv
):
60 self
.callback
= callback
61 self
.cancelrv
= cancelrv
62 DialogWindow
.open(self
, id)
63 tp
, h
, rect
= self
.dlg
.GetDialogItem(DLG_SRCPATH
)
64 Dlg
.SetDialogItemText(h
, src
)
65 self
.dlg
.SetDialogDefaultItem(DLG_OK
)
66 self
.dlg
.SetDialogCancelItem(DLG_CANCEL
)
68 tp
, h
, rect
= self
.dlg
.GetDialogItem(DLG_DSTPATH
)
71 Dlg
.SetDialogItemText(h
, dst
)
74 def do_itemhit(self
, item
, event
):
75 if item
in (DLG_OK
, DLG_CANCEL
, DLG_EXCLUDE
):
77 # else it is not interesting
80 tp
, h
, rect
= self
.dlg
.GetDialogItem(DLG_SRCPATH
)
81 src
= Dlg
.GetDialogItemText(h
)
83 if self
.id == ID_INCLUDE
:
84 tp
, h
, rect
= self
.dlg
.GetDialogItem(DLG_DSTPATH
)
85 dst
= Dlg
.GetDialogItemText(h
)
89 elif item
== DLG_EXCLUDE
:
94 self
.callback((item
in (DLG_OK
, DLG_EXCLUDE
)), rv
)
96 class ListWindow(DialogWindow
):
97 """A dialog window containing a list as its main item"""
99 def open(self
, id, contents
):
101 DialogWindow
.open(self
, id)
103 tp
, h
, rect
= self
.dlg
.GetDialogItem(MAIN_LIST
)
105 rect2
= rect
[0]+1, rect
[1]+1, rect
[2]-16, rect
[3]-16 # Scroll bar space
106 self
.list = List
.LNew(rect2
, (0, 0, 1, len(contents
)), (0,0), 0, self
.wid
,
108 self
.setlist(contents
)
110 def setlist(self
, contents
):
111 self
.list.LDelRow(0, 0)
112 self
.list.LSetDrawingMode(0)
114 self
.list.LAddRow(len(contents
), 0)
115 for i
in range(len(contents
)):
116 self
.list.LSetCell(contents
[i
], (0, i
))
117 self
.list.LSetDrawingMode(1)
118 ##self.list.LUpdate(self.wid.GetWindowPort().visRgn)
119 self
.wid
.InvalWindowRect(self
.listrect
)
121 def additem(self
, item
):
122 where
= self
.list.LAddRow(1, 0)
123 self
.list.LSetCell(item
, (0, where
))
125 def delgetitem(self
, item
):
126 data
= self
.list.LGetCell(1000, (0, item
))
127 self
.list.LDelRow(1, item
)
130 def do_listhit(self
, event
):
131 (what
, message
, when
, where
, modifiers
) = event
133 where
= Qd
.GlobalToLocal(where
)
134 if self
.list.LClick(where
, modifiers
):
135 self
.do_dclick(self
.delgetselection())
137 def delgetselection(self
):
141 ok
, point
= self
.list.LGetSelect(1, point
)
144 items
.append(point
[1])
145 point
= point
[0], point
[1]+1
149 values
.append(self
.delgetitem(i
))
152 def do_rawupdate(self
, window
, event
):
154 Qd
.FrameRect(self
.listrect
)
155 self
.list.LUpdate(self
.wid
.GetWindowPort().visRgn
)
162 DialogWindow
.close(self
)
164 def mycb_add(self
, ok
, item
):
166 self
.additem(item
[0])
169 class MainListWindow(ListWindow
):
170 """The main window"""
172 def open(self
, id, cb_check
, cb_run
, cb_add
):
173 ListWindow
.open(self
, id, [])
174 self
.dlg
.SetDialogDefaultItem(MAIN_INCLUDE
)
176 self
.cb_check
= cb_check
179 list = self
.cb_check()
183 def do_itemhit(self
, item
, event
):
184 if item
== MAIN_LIST
:
185 self
.do_listhit(event
)
186 if item
== MAIN_MKDISTR
:
190 if item
== MAIN_CHECK
:
192 list = self
.cb_check()
195 if item
== MAIN_INCLUDE
:
196 self
.do_dclick(self
.delgetselection())
197 if item
== MAIN_EXCLUDE
:
198 for i
in self
.delgetselection():
199 self
.cb_add((i
, None))
201 def do_dclick(self
, list):
205 w
= EditDialogWindow(self
.parent
)
206 w
.open(ID_INCLUDE
, (l
, None), self
.mycb_add
, None)
208 def mycb_add(self
, ok
, item
):
212 class IncListWindow(ListWindow
):
213 """An include/exclude window"""
214 def open(self
, id, editid
, contents
, cb_add
, cb_del
, cb_get
):
215 ListWindow
.open(self
, id, contents
)
216 self
.dlg
.SetDialogDefaultItem(INCEXC_CHANGE
)
222 def do_itemhit(self
, item
, event
):
223 if item
== MAIN_LIST
:
224 self
.do_listhit(event
)
225 if item
== INCEXC_DELETE
:
226 old
= self
.delgetselection()
229 if item
== INCEXC_CHANGE
:
230 self
.do_dclick(self
.delgetselection())
231 if item
== INCEXC_ADD
:
232 w
= EditDialogWindow(self
.parent
)
233 w
.open(self
.editid
, ('', None), self
.mycb_add
, None)
235 def do_dclick(self
, list):
241 w
= EditDialogWindow(self
.parent
)
242 w
.open(self
.editid
, old
, self
.mycb_add
, old
)
244 class MkDistrUI(Application
):
245 def __init__(self
, main
):
247 Application
.__init
__(self
)
248 self
.mwin
= MainListWindow(self
)
249 self
.mwin
.open(ID_MAIN
, self
.main
.check
, self
.main
.run
, self
.main
.inc
.add
)
253 def makeusermenus(self
):
254 self
.filemenu
= m
= Menu(self
.menubar
, "File")
255 self
.includeitem
= MenuItem(m
, "Show Include window", "", self
.showinc
)
256 self
.excludeitem
= MenuItem(m
, "Show Exclude window", "", self
.showexc
)
257 self
.saveitem
= MenuItem(m
, "Save databases", "S", self
.save
)
258 self
.quititem
= MenuItem(m
, "Quit", "Q", self
.quit
)
260 def quit(self
, *args
):
261 if self
.main
.is_modified():
262 rv
= EasyDialogs
.AskYesNoCancel('Database modified. Save?', -1)
269 def save(self
, *args
):
272 def showinc(self
, *args
):
274 if self
._windows
.has_key(self
.iwin
):
277 self
.iwin
= IncListWindow(self
)
278 self
.iwin
.open(ID_INCWINDOW
, ID_INCLUDE
, self
.main
.inc
.getall(), self
.main
.inc
.add
,
279 self
.main
.inc
.delete
, self
.main
.inc
.get
)
281 def showexc(self
, *args
):
283 if self
._windows
.has_key(self
.ewin
):
286 self
.ewin
= IncListWindow(self
)
287 self
.ewin
.open(ID_EXCWINDOW
, ID_EXCLUDE
, self
.main
.exc
.getall(), self
.main
.exc
.add
,
288 self
.main
.exc
.delete
, self
.main
.exc
.get
)
290 def do_about(self
, id, item
, window
, event
):
291 EasyDialogs
.Message("Test the MkDistr user interface.")
294 """Ask user for distribution type"""
296 d
= Dlg
.GetNewDialog(ID_DTYPE
, -1)
297 d
.SetDialogDefaultItem(DTYPE_EXIST
)
298 d
.SetDialogCancelItem(DTYPE_CANCEL
)
300 rv
= ModalDialog(None)
301 if rv
in (DTYPE_EXIST
, DTYPE_NEW
, DTYPE_CANCEL
):
304 if rv
== DTYPE_CANCEL
:
306 if rv
== DTYPE_EXIST
:
307 ## macfs.SetFolder(':(MkDistr)')
308 fss
, ok
= macfs
.StandardGetFile('TEXT')
311 path
= fss
.as_pathname()
312 basename
= os
.path
.split(path
)[-1]
313 if basename
[-8:] <> '.include':
314 EasyDialogs
.Message('That is not a distribution include file')
318 name
= EasyDialogs
.AskString('Distribution name:')
324 """Initialize stuff needed by UI (a resource file)"""
325 macresource
.need('DLOG', ID_MAIN
, 'MkDistr.rsrc', modname
=__name__
)
328 def __init__(self
, which
):
332 return [self
.which
+'-one', self
.which
+'-two']
334 def add(self
, value
):
336 print 'ADD', self
.which
, value
338 def delete(self
, value
):
339 print 'DEL', self
.which
, value
345 self
.inc
= _testerhelp('include')
346 self
.exc
= _testerhelp('exclude')
347 self
.ui
= MkDistrUI(self
)
353 return ['rv1', 'rv2']
358 if __name__
== '__main__':