17 import mactwit_browser
22 # Resource-id (for checking existence)
28 _watch
= Qd
.GetCursor(4).data
30 class Twit(FrameWork
.Application
, TwitCore
.Application
, MiniAEFrame
.AEServer
):
31 """The twit main class - mac-dependent part"""
33 def __init__(self
, sessiontype
, arg
=None):
34 # First init menus, etc.
35 self
.app_menu_bar
= Menu
.GetMenuBar()
36 FrameWork
.Application
.__init
__(self
)
37 MiniAEFrame
.AEServer
.__init
__(self
)
38 AE
.AESetInteractionAllowed(AppleEvents
.kAEInteractWithAll
)
39 self
.installaehandler('aevt', 'odoc', self
.ae_open_doc
)
40 self
.installaehandler('aevt', 'quit', self
.do_quit
)
41 self
.installaehandler('pyth', 'EXEC', self
.do_bbpyexec
) # BBpy execute event
43 self
.dbg_menu_bar
= Menu
.GetMenuBar()
44 self
.setstate(sessiontype
)
49 # Next create our dialogs
50 self
.mi_init(sessiontype
, arg
)
55 self
.to_debugger() # Will get to mainloop via debugger
57 self
.one_mainloop() # Else do it ourselves.
59 def switch_to_app(self
):
60 if not self
.window_aware
:
62 self
.dbg_menu_bar
= Menu
.GetMenuBar()
63 Menu
.SetMenuBar(self
.app_menu_bar
)
66 def switch_to_dbg(self
):
67 if not self
.window_aware
:
69 self
.app_menu_bar
= Menu
.GetMenuBar()
70 Menu
.SetMenuBar(self
.dbg_menu_bar
)
72 self
.run_dialog
.force_redraw()
73 if self
.module_dialog
:
74 self
.module_dialog
.force_redraw()
76 def makeusermenus(self
):
77 self
.filemenu
= m
= FrameWork
.Menu(self
.menubar
, "Debug")
78 self
._openitem
= FrameWork
.MenuItem(m
, "Run File...", "O", self
.do_open
)
79 self
._runitem
= FrameWork
.MenuItem(m
, "Run String...", "R", self
.do_run
)
80 FrameWork
.Separator(m
)
81 self
._awareitem
= FrameWork
.MenuItem(m
, "Window-aware", "", self
.do_aware
)
82 self
._awareitem
.check(1)
83 FrameWork
.Separator(m
)
84 self
._quititem
= FrameWork
.MenuItem(m
, "Quit", "Q", self
.do_quit
)
86 self
.controlmenu
= m
= FrameWork
.Menu(self
.menubar
, "Control")
87 self
._stepitem
= FrameWork
.MenuItem(m
, "Step Next", "N", self
.do_step
)
88 self
._stepinitem
= FrameWork
.MenuItem(m
, "Step In", "S", self
.do_stepin
)
89 self
._stepoutitem
= FrameWork
.MenuItem(m
, "Step Out", "U", self
.do_stepout
)
90 self
._continueitem
= FrameWork
.MenuItem(m
, "Continue", "G", self
.do_continue
)
91 FrameWork
.Separator(m
)
92 self
._killitem
= FrameWork
.MenuItem(m
, "Kill", "K", self
.do_kill
)
94 def setstate(self
, state
):
97 self
._stepitem
.enable(1)
98 self
._stepoutitem
.enable(1)
99 self
._stepinitem
.enable(1)
100 self
._continueitem
.enable(1)
101 self
._killitem
.enable(1)
103 self
._stepitem
.enable(0)
104 self
._stepoutitem
.enable(0)
105 self
._stepinitem
.enable(0)
106 self
._continueitem
.enable(0)
107 self
._killitem
.enable(0)
109 def asknewsession(self
):
110 if self
.state
== 'none':
112 if EasyDialogs
.AskYesNoCancel("Abort current debug session?") == 1:
117 def do_about(self
, id, item
, window
, event
):
119 d
= Dlg
.GetNewDialog(ID_ABOUT
, -1)
122 w
= d
.GetDialogWindow()
123 port
= w
.GetWindowPort()
124 l
, t
, r
, b
= port
.portRect
125 sl
, st
, sr
, sb
= Qd
.qd
.screenBits
.bounds
126 x
= ((sr
-sl
) - (r
-l
)) / 2
127 y
= ((sb
-st
-16) - (b
-t
)) / 5
128 w
.MoveWindow(x
, y
, 0)
132 tp
, h
, rect
= d
.GetDialogItem(2)
133 x0
, y0
, x1
, y1
= rect
138 ok
, evt
= self
.getevent(Events
.mDownMask|Events
.keyDownMask
, 1)
140 (what
, message
, when
, where
, modifiers
) = event
142 nexttime
= when
+delta_t
144 # Do the animation, if it is time
146 Qd
.ScrollRect((x0
, y0
, x1
, ybot
), 0, 1, rgn
)
149 # And update next time
150 delta_t
= int(delta_t
*0.6)-1
153 nexttime
= when
+ delta_t
154 # Check for an event.
155 ok
, evt
= self
.getevent(Events
.mDownMask|Events
.keyDownMask
, 0)
157 (what
, message
, when
, where
, modifiers
) = evt
159 ok
, evt
= self
.getevent(Events
.mDownMask|Events
.keyDownMask
, -1)
162 def do_open(self
, *args
):
163 if not self
.asknewsession():
165 fss
, ok
= macfs
.StandardGetFile('TEXT')
167 self
.runfile(fss
.as_pathname())
169 def ae_open_doc(self
, object=None, **args
):
170 if not object: return
171 if self
.state
<> 'none':
172 if AE
.AEInteractWithUser(AppleEvents
.kAEDefaultTimeout
) == 0:
173 if not self
.asknewsession():
175 if type(object) == type([]):
177 fss
, changed
= object.Resolve()
178 self
.runfile(fss
.as_pathname())
180 def do_bbpyexec(self
, object=None, NAME
=None, **args
):
181 if type(object) <> type(''):
182 if AE
.AEInteractWithUser(AppleEvents
.kAEDefaultTimeout
) == 0:
183 EasyDialogs
.Message('EXEC AppleEvent arg should be a string')
185 if self
.state
<> 'none':
186 if AE
.AEInteractWithUser(AppleEvents
.kAEDefaultTimeout
) == 0:
187 if not self
.asknewsession():
189 stuff
= string
.splitfields(object, '\r')
190 stuff
= string
.joinfields(stuff
, '\n')
191 self
.runstring(stuff
)
193 def do_run(self
, *args
):
194 if not self
.asknewsession():
198 def do_aware(self
, *args
):
199 self
.window_aware
= not self
.window_aware
200 self
._awareitem
.check(self
.window_aware
)
202 def do_quit(self
, *args
):
203 self
._quit
() # Signal FrameWork.Application to stop
205 self
.quit_bdb() # Tell debugger to quit.
207 def do_step(self
, *args
):
208 self
.run_dialog
.click_step()
210 def do_stepin(self
, *args
):
211 self
.run_dialog
.click_step_in()
213 def do_stepout(self
, *args
):
214 self
.run_dialog
.click_step_out()
216 def do_continue(self
, *args
):
217 self
.run_dialog
.click_continue()
219 def do_kill(self
, *args
):
220 self
.run_dialog
.click_kill()
222 def exit_mainloop(self
):
223 self
._quit
() # Signal FrameWork.Application to stop
226 def one_mainloop(self
):
236 def AskString(self
, *args
):
237 return apply(EasyDialogs
.AskString
, args
)
239 def Message(self
, *args
):
240 return apply(EasyDialogs
.Message
, args
)
242 def new_module_browser(self
, parent
):
243 return mactwit_mod
.ModuleBrowser(parent
)
245 def new_stack_browser(self
, parent
):
246 return mactwit_stack
.StackBrowser(parent
)
248 def new_var_browser(self
, parent
, var
):
249 return mactwit_browser
.VarBrowser(parent
).open(var
)
251 def edit(self
, file, line
):
252 return mactwit_edit
.edit(file, line
)
257 # if this doesn't raise an error, we are an applet containing the
258 # necessary resources or we have been initialized already
259 # so we don't have to bother opening the resource file
260 dummy
= Res
.GetResource('DLOG', ID_MODULES
)
263 Res
.FSpOpenResFile("Twit.rsrc", 1)
264 except Res
.Error
, arg
:
265 EasyDialogs
.Message("Cannot open Twit.rsrc: "+arg
[1])