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)
21 from FrameWork
import *
46 DLG_BUTTONS
=[DLG_FULL
, DLG_PPCDEV
, DLG_68K
, DLG_PPC
]
47 DLG_LETTERS
=['S', 'P', 'm', 'p']
53 class EditDialogWindow(DialogWindow
):
54 """Include/exclude editor (modeless dialog window)"""
56 def open(self
, id, (type, src
, dst
), callback
, cancelrv
):
59 title
= "Include file dialog"
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
)
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)
75 def setbutton(self
, num
, value
):
76 tp
, h
, rect
= self
.wid
.GetDialogItem(num
)
77 h
.as_Control().SetControlValue(value
)
79 def getbutton(self
, num
):
80 tp
, h
, rect
= self
.wid
.GetDialogItem(num
)
81 return h
.as_Control().GetControlValue()
83 def do_itemhit(self
, item
, event
):
84 if item
in (DLG_OK
, DLG_CANCEL
):
86 elif item
in DLG_BUTTONS
:
87 v
= self
.getbutton(item
)
88 self
.setbutton(item
, (not v
))
89 # else it is not interesting
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
)
108 self
.callback((item
==DLG_OK
), rv
)
110 class ListWindow(DialogWindow
):
111 """A dialog window containing a list as its main item"""
113 def open(self
, id, contents
):
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
,
120 self
.setlist(contents
)
122 def setlist(self
, contents
):
123 self
.list.LDelRow(0, 0)
124 self
.list.LSetDrawingMode(0)
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)
132 def additem(self
, item
):
133 where
= self
.list.LAddRow(1, 0)
134 self
.list.LSetCell(item
, (0, where
))
136 def delgetitem(self
, item
):
137 data
= self
.list.LGetCell(1000, (0, item
))
138 self
.list.LDelRow(1, item
)
141 def do_listhit(self
, event
):
142 (what
, message
, when
, where
, modifiers
) = event
144 where
= Qd
.GlobalToLocal(where
)
145 if self
.list.LClick(where
, modifiers
):
146 self
.do_dclick(self
.delgetselection())
148 def delgetselection(self
):
152 ok
, point
= self
.list.LGetSelect(1, point
)
155 items
.append(point
[1])
156 point
= point
[0], point
[1]+1
160 values
.append(self
.delgetitem(i
))
163 def do_rawupdate(self
, window
, event
):
171 DialogWindow
.close(self
)
173 def mycb_add(self
, ok
, item
):
175 self
.additem(item
[1])
178 class MainListWindow(ListWindow
):
179 """The main window"""
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)
186 self
.cb_check
= cb_check
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:')
196 self
.cb_run(fss
.as_pathname())
197 if item
== MAIN_CHECK
:
198 list = self
.cb_check()
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
, ''))
206 def do_dclick(self
, list):
210 w
= EditDialogWindow(self
.parent
)
211 w
.open(ID_INCLUDE
, (None, l
, ''), self
.mycb_add
, None)
213 def mycb_add(self
, ok
, item
):
217 class 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"
224 title
= "MkDistr: patterns to exclude"
225 #self.wid.as_Window().SetWTitle(title)
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()
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)
244 def do_dclick(self
, list):
250 w
= EditDialogWindow(self
.parent
)
251 w
.open(self
.editid
, old
, self
.mycb_add
, old
)
253 class MkDistrUI(Application
):
254 def __init__(self
, 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
)
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
)
269 def quit(self
, *args
):
270 if self
.main
.is_modified():
271 rv
= EasyDialogs
.AskYesNoCancel('Database modified. Save?', -1)
278 def save(self
, *args
):
281 def showinc(self
, *args
):
283 if self
._windows
.has_key(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
)
290 def showexc(self
, *args
):
292 if self
._windows
.has_key(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
)
299 def do_about(self
, id, item
, window
, event
):
300 EasyDialogs
.Message("Test the MkDistr user interface.")
303 """Ask user for distribution type"""
304 d
= Dlg
.GetNewDialog(ID_DTYPE
, -1)
306 rv
= ModalDialog(None)
307 if rv
>= 1 and rv
<= 4:
308 return DLG_LETTERS
[rv
-1]
311 """Initialize stuff needed by UI (a resource file)"""
312 Res
.OpenResFile('MkDistr.rsrc')
315 def __init__(self
, which
):
319 return [self
.which
+'-one', self
.which
+'-two']
321 def add(self
, value
):
323 print 'ADD', self
.which
, value
325 def delete(self
, value
):
326 print 'DEL', self
.which
, value
331 Res
.OpenResFile('MkDistr.rsrc')
332 self
.inc
= _testerhelp('include')
333 self
.exc
= _testerhelp('exclude')
334 self
.ui
= MkDistrUI(self
)
340 return ['rv1', 'rv2']
345 if __name__
== '__main__':