import FrameWork import MiniAEFrame import EasyDialogs import AE import AppleEvents import Res import sys import Qd import Evt import Events import Dlg import Win import Menu import TwitCore import mactwit_mod import mactwit_stack import mactwit_browser import mactwit_edit import macfs import string # Resource-id (for checking existence) ID_MODULES=500 ID_ABOUT=502 _arrow = Qd.qd.arrow _watch = Qd.GetCursor(4).data class Twit(FrameWork.Application, TwitCore.Application, MiniAEFrame.AEServer): """The twit main class - mac-dependent part""" def __init__(self, sessiontype, arg=None): # First init menus, etc. self.app_menu_bar = Menu.GetMenuBar() FrameWork.Application.__init__(self) MiniAEFrame.AEServer.__init__(self) AE.AESetInteractionAllowed(AppleEvents.kAEInteractWithAll) self.installaehandler('aevt', 'odoc', self.ae_open_doc) self.installaehandler('aevt', 'quit', self.do_quit) self.installaehandler('pyth', 'EXEC', self.do_bbpyexec) # BBpy execute event self.dbg_menu_bar = Menu.GetMenuBar() self.setstate(sessiontype) self._quitting = 0 self.real_quit = 0 self.window_aware = 1 # Next create our dialogs self.mi_init(sessiontype, arg) while 1: if self.real_quit: break if self.initial_cmd: self.to_debugger() # Will get to mainloop via debugger else: self.one_mainloop() # Else do it ourselves. def switch_to_app(self): if not self.window_aware: return self.dbg_menu_bar = Menu.GetMenuBar() Menu.SetMenuBar(self.app_menu_bar) Menu.DrawMenuBar() def switch_to_dbg(self): if not self.window_aware: return self.app_menu_bar = Menu.GetMenuBar() Menu.SetMenuBar(self.dbg_menu_bar) Menu.DrawMenuBar() self.run_dialog.force_redraw() if self.module_dialog: self.module_dialog.force_redraw() def makeusermenus(self): self.filemenu = m = FrameWork.Menu(self.menubar, "Debug") self._openitem = FrameWork.MenuItem(m, "Run File...", "O", self.do_open) self._runitem = FrameWork.MenuItem(m, "Run String...", "R", self.do_run) FrameWork.Separator(m) self._awareitem = FrameWork.MenuItem(m, "Window-aware", "", self.do_aware) self._awareitem.check(1) FrameWork.Separator(m) self._quititem = FrameWork.MenuItem(m, "Quit", "Q", self.do_quit) self.controlmenu = m = FrameWork.Menu(self.menubar, "Control") self._stepitem = FrameWork.MenuItem(m, "Step Next", "N", self.do_step) self._stepinitem = FrameWork.MenuItem(m, "Step In", "S", self.do_stepin) self._stepoutitem = FrameWork.MenuItem(m, "Step Out", "U", self.do_stepout) self._continueitem = FrameWork.MenuItem(m, "Continue", "G", self.do_continue) FrameWork.Separator(m) self._killitem = FrameWork.MenuItem(m, "Kill", "K", self.do_kill) def setstate(self, state): self.state = state if state == 'run': self._stepitem.enable(1) self._stepoutitem.enable(1) self._stepinitem.enable(1) self._continueitem.enable(1) self._killitem.enable(1) else: self._stepitem.enable(0) self._stepoutitem.enable(0) self._stepinitem.enable(0) self._continueitem.enable(0) self._killitem.enable(0) def asknewsession(self): if self.state == 'none': return 1 if EasyDialogs.AskYesNoCancel("Abort current debug session?") == 1: self.quit_bdb() return 1 return 0 def do_about(self, id, item, window, event): import time d = Dlg.GetNewDialog(ID_ABOUT, -1) if not d: return w = d.GetDialogWindow() port = w.GetWindowPort() l, t, r, b = port.portRect sl, st, sr, sb = Qd.qd.screenBits.bounds x = ((sr-sl) - (r-l)) / 2 y = ((sb-st-16) - (b-t)) / 5 w.MoveWindow(x, y, 0) w.ShowWindow() d.DrawDialog() tp, h, rect = d.GetDialogItem(2) x0, y0, x1, y1 = rect ybot = y0 + 32 rgn = Qd.NewRgn() Qd.SetPort(d) ok, evt = self.getevent(Events.mDownMask|Events.keyDownMask, 1) if ok: return (what, message, when, where, modifiers) = event delta_t = 128 nexttime = when+delta_t while ybot < y1: # Do the animation, if it is time if when > nexttime: Qd.ScrollRect((x0, y0, x1, ybot), 0, 1, rgn) y0 = y0 + 1 ybot = ybot + 1 # And update next time delta_t = int(delta_t*0.6)-1 if delta_t < 0: delta_t = 0 nexttime = when + delta_t # Check for an event. ok, evt = self.getevent(Events.mDownMask|Events.keyDownMask, 0) if ok: return (what, message, when, where, modifiers) = evt while 1: ok, evt = self.getevent(Events.mDownMask|Events.keyDownMask, -1) if ok: return def do_open(self, *args): if not self.asknewsession(): return fss, ok = macfs.StandardGetFile('TEXT') if not ok: return self.runfile(fss.as_pathname()) def ae_open_doc(self, object=None, **args): if not object: return if self.state <> 'none': if AE.AEInteractWithUser(AppleEvents.kAEDefaultTimeout) == 0: if not self.asknewsession(): return if type(object) == type([]): object = object[0] fss, changed = object.Resolve() self.runfile(fss.as_pathname()) def do_bbpyexec(self, object=None, NAME=None, **args): if type(object) <> type(''): if AE.AEInteractWithUser(AppleEvents.kAEDefaultTimeout) == 0: EasyDialogs.Message('EXEC AppleEvent arg should be a string') return if self.state <> 'none': if AE.AEInteractWithUser(AppleEvents.kAEDefaultTimeout) == 0: if not self.asknewsession(): return stuff = string.splitfields(object, '\r') stuff = string.joinfields(stuff, '\n') self.runstring(stuff) def do_run(self, *args): if not self.asknewsession(): return self.run() def do_aware(self, *args): self.window_aware = not self.window_aware self._awareitem.check(self.window_aware) def do_quit(self, *args): self._quit() # Signal FrameWork.Application to stop self.real_quit = 1 self.quit_bdb() # Tell debugger to quit. def do_step(self, *args): self.run_dialog.click_step() def do_stepin(self, *args): self.run_dialog.click_step_in() def do_stepout(self, *args): self.run_dialog.click_step_out() def do_continue(self, *args): self.run_dialog.click_continue() def do_kill(self, *args): self.run_dialog.click_kill() def exit_mainloop(self): self._quit() # Signal FrameWork.Application to stop self.real_quit = 0 def one_mainloop(self): self.quitting = 0 self.mainloop() def SetCursor(self): Qd.SetCursor(_arrow) def SetWatch(self): Qd.SetCursor(_watch) def AskString(self, *args): return apply(EasyDialogs.AskString, args) def Message(self, *args): return apply(EasyDialogs.Message, args) def new_module_browser(self, parent): return mactwit_mod.ModuleBrowser(parent) def new_stack_browser(self, parent): return mactwit_stack.StackBrowser(parent) def new_var_browser(self, parent, var): return mactwit_browser.VarBrowser(parent).open(var) def edit(self, file, line): return mactwit_edit.edit(file, line) def Initialize(): try: # if this doesn't raise an error, we are an applet containing the # necessary resources or we have been initialized already # so we don't have to bother opening the resource file dummy = Res.GetResource('DLOG', ID_MODULES) except Res.Error: try: Res.FSpOpenResFile("Twit.rsrc", 1) except Res.Error, arg: EasyDialogs.Message("Cannot open Twit.rsrc: "+arg[1]) sys.exit(1)