mirror of
https://github.com/python/cpython.git
synced 2025-08-31 22:18:28 +00:00
- Simplified inheritance structure (still not good enough)
- Added menubar in stead of buttons - (optionally) switch menubar back and forth to facilitate debugging FrameWork applications - Handle "Open Document" appleevent - Fixed click in grow-box location - Allow a new debug session after previous one has finished
This commit is contained in:
parent
b1667ef782
commit
a1560cfb29
7 changed files with 1162 additions and 1099 deletions
|
@ -3,6 +3,7 @@ import sys
|
||||||
import types
|
import types
|
||||||
import bdb
|
import bdb
|
||||||
import types
|
import types
|
||||||
|
import os
|
||||||
|
|
||||||
SIMPLE_TYPES=(
|
SIMPLE_TYPES=(
|
||||||
types.NoneType,
|
types.NoneType,
|
||||||
|
@ -20,9 +21,6 @@ ICON_CALL=516
|
||||||
ICON_ZERO=517
|
ICON_ZERO=517
|
||||||
ICON_DEAD=518
|
ICON_DEAD=518
|
||||||
|
|
||||||
def Initialize():
|
|
||||||
pass
|
|
||||||
|
|
||||||
class DebuggerStuff(bdb.Bdb):
|
class DebuggerStuff(bdb.Bdb):
|
||||||
|
|
||||||
def __init__(self, parent):
|
def __init__(self, parent):
|
||||||
|
@ -38,15 +36,19 @@ class DebuggerStuff(bdb.Bdb):
|
||||||
self.forget()
|
self.forget()
|
||||||
|
|
||||||
def forget(self):
|
def forget(self):
|
||||||
print 'FORGET'
|
|
||||||
self.lineno = None
|
self.lineno = None
|
||||||
self.stack = []
|
self.stack = []
|
||||||
self.curindex = 0
|
self.curindex = 0
|
||||||
self.curframe = None
|
self.curframe = None
|
||||||
|
|
||||||
|
def run(self, cmd, locals, globals):
|
||||||
|
self.reason = 'Running'
|
||||||
|
bdb.Bdb.run(self, cmd, locals, globals)
|
||||||
|
print 'RETURN from run'
|
||||||
|
self.reason = 'Not running'
|
||||||
|
|
||||||
def setup(self, f, t):
|
def setup(self, f, t):
|
||||||
self.forget()
|
self.forget()
|
||||||
print 'SETUP', f, t
|
|
||||||
self.stack, self.curindex = self.get_stack(f, t)
|
self.stack, self.curindex = self.get_stack(f, t)
|
||||||
self.curframe = self.stack[self.curindex][0]
|
self.curframe = self.stack[self.curindex][0]
|
||||||
|
|
||||||
|
@ -55,10 +57,10 @@ class DebuggerStuff(bdb.Bdb):
|
||||||
self.parent.interact()
|
self.parent.interact()
|
||||||
self.exception_info = (None, None)
|
self.exception_info = (None, None)
|
||||||
|
|
||||||
def user_call(self, frame, argument_list):
|
# def user_call(self, frame, argument_list):
|
||||||
self.reason = 'Calling'
|
# self.reason = 'Calling'
|
||||||
self.icon = ICON_CALL
|
# self.icon = ICON_CALL
|
||||||
self.interaction(frame, None)
|
# self.interaction(frame, None)
|
||||||
|
|
||||||
def user_line(self, frame):
|
def user_line(self, frame):
|
||||||
self.reason = 'Stopped'
|
self.reason = 'Stopped'
|
||||||
|
@ -73,6 +75,7 @@ class DebuggerStuff(bdb.Bdb):
|
||||||
def user_exception(self, frame, (exc_type, exc_value, exc_traceback)):
|
def user_exception(self, frame, (exc_type, exc_value, exc_traceback)):
|
||||||
self.reason = 'Exception occurred'
|
self.reason = 'Exception occurred'
|
||||||
self.icon = ICON_DEAD
|
self.icon = ICON_DEAD
|
||||||
|
self.parent.setstate('tb')
|
||||||
self.exception_info = (exc_type, exc_value)
|
self.exception_info = (exc_type, exc_value)
|
||||||
self.interaction(frame, exc_traceback)
|
self.interaction(frame, exc_traceback)
|
||||||
|
|
||||||
|
@ -85,7 +88,6 @@ class DebuggerStuff(bdb.Bdb):
|
||||||
return tp, value
|
return tp, value
|
||||||
|
|
||||||
def getstacktrace(self):
|
def getstacktrace(self):
|
||||||
print 'DBG GETSTACKTRACE', self.stack
|
|
||||||
names, locations = [], []
|
names, locations = [], []
|
||||||
for frame, lineno in self.stack:
|
for frame, lineno in self.stack:
|
||||||
name = frame.f_code.co_name
|
name = frame.f_code.co_name
|
||||||
|
@ -104,7 +106,6 @@ class DebuggerStuff(bdb.Bdb):
|
||||||
if not modname: modname = "<unknown>"
|
if not modname: modname = "<unknown>"
|
||||||
|
|
||||||
locations.append("%s:%d" % (modname, lineno))
|
locations.append("%s:%d" % (modname, lineno))
|
||||||
print 'DBG RETURNS', names, locations
|
|
||||||
return names, locations
|
return names, locations
|
||||||
|
|
||||||
def getframe(self, number):
|
def getframe(self, number):
|
||||||
|
@ -138,35 +139,41 @@ class DebuggerStuff(bdb.Bdb):
|
||||||
class Application:
|
class Application:
|
||||||
"""Base code for the application"""
|
"""Base code for the application"""
|
||||||
|
|
||||||
def mi_init(self, run_args, pm_args):
|
def mi_init(self, sessiontype, arg):
|
||||||
self.dbg = DebuggerStuff(self)
|
self.dbg = DebuggerStuff(self)
|
||||||
self.run_dialog = self.new_stack_browser(self)
|
self.run_dialog = self.new_stack_browser(self)
|
||||||
self.run_dialog.open()
|
self.run_dialog.open()
|
||||||
self.module_dialog = None
|
self.module_dialog = None
|
||||||
self.initial_cmd = None
|
self.initial_cmd = None
|
||||||
self.cur_string_name = None
|
self.cur_string_name = None
|
||||||
if pm_args:
|
if sessiontype == 'tb':
|
||||||
while pm_args.tb_next <> None:
|
while arg.tb_next <> None:
|
||||||
pm_args = pm_args.tb_next
|
arg = arg.tb_next
|
||||||
self.dbg.setup(pm_args.tb_frame, pm_args)
|
self.dbg.setup(arg.tb_frame, arg)
|
||||||
self.run_dialog.setsession_pm()
|
self.run_dialog.setup()
|
||||||
self.run_dialog.update_views()
|
elif sessiontype == 'run':
|
||||||
elif run_args:
|
self.initial_cmd = arg
|
||||||
self.run_dialog.setsession_run()
|
|
||||||
self.initial_cmd = run_args
|
|
||||||
else:
|
|
||||||
self.run_dialog.setsession_none()
|
|
||||||
|
|
||||||
def breaks_changed(self, filename):
|
def breaks_changed(self, filename):
|
||||||
self.run_dialog.breaks_changed(filename)
|
self.run_dialog.breaks_changed(filename)
|
||||||
if self.module_dialog:
|
if self.module_dialog:
|
||||||
self.module_dialog.breaks_changed(filename)
|
self.module_dialog.breaks_changed(filename)
|
||||||
|
|
||||||
def to_debugger(self):
|
def to_debugger(self):
|
||||||
apply(self.dbg.run, self.initial_cmd)
|
cmd = self.initial_cmd
|
||||||
|
self.initial_cmd = None
|
||||||
|
self.setstate('run')
|
||||||
|
self.switch_to_app()
|
||||||
|
apply(self.dbg.run, cmd)
|
||||||
|
self.setstate('none')
|
||||||
|
self.switch_to_dbg()
|
||||||
|
self.run_dialog.update_views()
|
||||||
|
if self.module_dialog:
|
||||||
|
self.module_dialog.update_views()
|
||||||
|
|
||||||
def interact(self):
|
def interact(self):
|
||||||
# Interact with user. First, display correct info
|
# Interact with user. First, display correct info
|
||||||
|
self.switch_to_dbg()
|
||||||
self.run_dialog.update_views()
|
self.run_dialog.update_views()
|
||||||
if self.module_dialog:
|
if self.module_dialog:
|
||||||
self.module_dialog.update_views()
|
self.module_dialog.update_views()
|
||||||
|
@ -175,21 +182,35 @@ class Application:
|
||||||
self.one_mainloop()
|
self.one_mainloop()
|
||||||
|
|
||||||
# Finally (before we start the debuggee again) show state
|
# Finally (before we start the debuggee again) show state
|
||||||
|
self.switch_to_app()
|
||||||
self.run_dialog.show_it_running()
|
self.run_dialog.show_it_running()
|
||||||
|
|
||||||
def quit_bdb(self):
|
def quit_bdb(self):
|
||||||
self.dbg.set_quit()
|
self.dbg.set_quit()
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
cmd = AskString('Statement to execute:')
|
cmd = self.AskString('Statement to execute:')
|
||||||
|
self.runstring(cmd)
|
||||||
|
|
||||||
|
def runfile(self, path):
|
||||||
|
dir, file = os.path.split(path)
|
||||||
|
try:
|
||||||
|
os.chdir(dir)
|
||||||
|
except os.error, arg:
|
||||||
|
self.Message("%s: %s"%(dir, arg))
|
||||||
|
return
|
||||||
|
ns = {'__name__':'__main__', '__file__':path}
|
||||||
|
cmd = "execfile('%s')"%file
|
||||||
|
self.runstring(cmd, ns, ns)
|
||||||
|
|
||||||
|
def runstring(self, cmd, globals={}, locals={}):
|
||||||
self.cur_string_name = '<string: "%s">'%cmd
|
self.cur_string_name = '<string: "%s">'%cmd
|
||||||
try:
|
try:
|
||||||
cmd = compile(cmd, self.cur_string_name, 'exec')
|
cmd = compile(cmd, self.cur_string_name, 'exec')
|
||||||
except SyntaxError, arg:
|
except SyntaxError, arg:
|
||||||
ShowMessage('Syntax error: %s'%`arg`)
|
self.Message('Syntax error: %s'%`arg`)
|
||||||
return
|
return
|
||||||
self.initial_cmd = (cmd, None, None)
|
self.initial_cmd = (cmd, globals, locals)
|
||||||
self.run_dialog.setsession_run()
|
|
||||||
self.exit_mainloop()
|
self.exit_mainloop()
|
||||||
|
|
||||||
def cont(self):
|
def cont(self):
|
||||||
|
@ -208,6 +229,10 @@ class Application:
|
||||||
self.dbg.set_return(frame)
|
self.dbg.set_return(frame)
|
||||||
self.exit_mainloop()
|
self.exit_mainloop()
|
||||||
|
|
||||||
|
def kill(self):
|
||||||
|
self.dbg.set_quit()
|
||||||
|
self.exit_mainloop()
|
||||||
|
|
||||||
def quit(self):
|
def quit(self):
|
||||||
self.do_quit()
|
self.do_quit()
|
||||||
|
|
||||||
|
@ -237,7 +262,7 @@ class StackBrowser:
|
||||||
# create_items(self) should create self.modules, self.vars and self.source
|
# create_items(self) should create self.modules, self.vars and self.source
|
||||||
|
|
||||||
def setup(self):
|
def setup(self):
|
||||||
SetWatch()
|
self.parent.SetWatch()
|
||||||
"""Fill the various widgets with values"""
|
"""Fill the various widgets with values"""
|
||||||
name, value = self.parent.dbg.getexception()
|
name, value = self.parent.dbg.getexception()
|
||||||
self.setexception(name, value)
|
self.setexception(name, value)
|
||||||
|
@ -251,7 +276,7 @@ class StackBrowser:
|
||||||
|
|
||||||
def setup_frame(self):
|
def setup_frame(self):
|
||||||
"""Setup frame-dependent widget data"""
|
"""Setup frame-dependent widget data"""
|
||||||
SetWatch()
|
self.parent.SetWatch()
|
||||||
self.cont_varnames, self.cont_varvalues = \
|
self.cont_varnames, self.cont_varvalues = \
|
||||||
self.parent.dbg.getframevars(self.cur_stackitem,
|
self.parent.dbg.getframevars(self.cur_stackitem,
|
||||||
self.show_complex, self.show_system)
|
self.show_complex, self.show_system)
|
||||||
|
@ -276,8 +301,6 @@ class StackBrowser:
|
||||||
self.cur_source[:8] == '<string:':
|
self.cur_source[:8] == '<string:':
|
||||||
msg = "Executing from "+self.cur_source
|
msg = "Executing from "+self.cur_source
|
||||||
self.cur_source = None
|
self.cur_source = None
|
||||||
print 'SOURCE', self.cur_source
|
|
||||||
print 'LINE', self.cur_line
|
|
||||||
|
|
||||||
self.setsource(msg)
|
self.setsource(msg)
|
||||||
if not self.cur_line:
|
if not self.cur_line:
|
||||||
|
@ -287,7 +310,7 @@ class StackBrowser:
|
||||||
self.breaks_changed(self.cur_source)
|
self.breaks_changed(self.cur_source)
|
||||||
|
|
||||||
|
|
||||||
SetCursor()
|
self.parent.SetCursor()
|
||||||
|
|
||||||
# setsource(msg) should display cur_source+content, or msg if None
|
# setsource(msg) should display cur_source+content, or msg if None
|
||||||
|
|
||||||
|
@ -349,6 +372,9 @@ class StackBrowser:
|
||||||
self.parent.step_out(frame)
|
self.parent.step_out(frame)
|
||||||
else:
|
else:
|
||||||
self.parent.step_in()
|
self.parent.step_in()
|
||||||
|
|
||||||
|
def click_kill(self):
|
||||||
|
self.parent.kill()
|
||||||
|
|
||||||
def click_browse(self):
|
def click_browse(self):
|
||||||
self.parent.browse(self.cur_modname)
|
self.parent.browse(self.cur_modname)
|
||||||
|
@ -377,7 +403,7 @@ class ModuleBrowser:
|
||||||
|
|
||||||
def setup(self):
|
def setup(self):
|
||||||
"""Fill the various widgets with values"""
|
"""Fill the various widgets with values"""
|
||||||
SetWatch()
|
self.parent.SetWatch()
|
||||||
modnames = getmodulenames()
|
modnames = getmodulenames()
|
||||||
if not self.cur_module in modnames:
|
if not self.cur_module in modnames:
|
||||||
self.cur_module = None
|
self.cur_module = None
|
||||||
|
@ -392,7 +418,7 @@ class ModuleBrowser:
|
||||||
|
|
||||||
def setup_module(self):
|
def setup_module(self):
|
||||||
"""Setup module-dependent widget data"""
|
"""Setup module-dependent widget data"""
|
||||||
SetWatch()
|
self.parent.SetWatch()
|
||||||
if not self.cur_module:
|
if not self.cur_module:
|
||||||
self.vars.setcontent([], [])
|
self.vars.setcontent([], [])
|
||||||
else:
|
else:
|
||||||
|
@ -415,7 +441,7 @@ class ModuleBrowser:
|
||||||
self.source.select(self.cur_line)
|
self.source.select(self.cur_line)
|
||||||
self.breaks_changed(self.cur_source)
|
self.breaks_changed(self.cur_source)
|
||||||
|
|
||||||
SetCursor()
|
self.parent.SetCursor()
|
||||||
|
|
||||||
# setsource(msg) should display cur_source+content, or msg if None
|
# setsource(msg) should display cur_source+content, or msg if None
|
||||||
|
|
||||||
|
|
|
@ -14,6 +14,9 @@ MARGIN=2
|
||||||
ICONSIZE=16
|
ICONSIZE=16
|
||||||
TEXTWIDTH=4096 # More-or-less random value
|
TEXTWIDTH=4096 # More-or-less random value
|
||||||
|
|
||||||
|
TEXTFONT=4
|
||||||
|
TEXTSIZE=9
|
||||||
|
|
||||||
PIC_BREAK=513
|
PIC_BREAK=513
|
||||||
picture_cache={}
|
picture_cache={}
|
||||||
|
|
||||||
|
@ -26,8 +29,8 @@ class MT_TextWidget:
|
||||||
right-(MARGIN+SCROLLBAR), bottom-(MARGIN+SCROLLBAR)
|
right-(MARGIN+SCROLLBAR), bottom-(MARGIN+SCROLLBAR)
|
||||||
dr = self.terect[0], self.terect[1], TEXTWIDTH, self.terect[3]
|
dr = self.terect[0], self.terect[1], TEXTWIDTH, self.terect[3]
|
||||||
Qd.SetPort(wid)
|
Qd.SetPort(wid)
|
||||||
Qd.TextFont(4)
|
Qd.TextFont(TEXTFONT)
|
||||||
Qd.TextSize(9)
|
Qd.TextSize(TEXTSIZE)
|
||||||
self.ted = TE.TENew(dr, self.terect)
|
self.ted = TE.TENew(dr, self.terect)
|
||||||
self.ted.TEAutoView(1)
|
self.ted.TEAutoView(1)
|
||||||
self.activate(1)
|
self.activate(1)
|
||||||
|
@ -130,7 +133,10 @@ class MT_TextWidget:
|
||||||
return None, 0
|
return None, 0
|
||||||
off = self.ted.TEGetOffset(where)
|
off = self.ted.TEGetOffset(where)
|
||||||
inborder = where[0] < self.terect[0]
|
inborder = where[0] < self.terect[0]
|
||||||
return self.offsettoline(off), inborder
|
l, t, r, b = self.terect
|
||||||
|
if l <= where[0] <= r and t <= where[1] <= b or inborder:
|
||||||
|
return self.offsettoline(off), inborder
|
||||||
|
return None, 0 # In the grow box or something.
|
||||||
|
|
||||||
def offsettoline(self, offset):
|
def offsettoline(self, offset):
|
||||||
for i in range(len(self.line_index)):
|
for i in range(len(self.line_index)):
|
||||||
|
@ -233,7 +239,6 @@ class MT_IconTextWidget(MT_TextWidget):
|
||||||
rect = self.rect[0]+2, boty-self.ted.lineHeight, \
|
rect = self.rect[0]+2, boty-self.ted.lineHeight, \
|
||||||
self.rect[0]+ICONSIZE-2, boty
|
self.rect[0]+ICONSIZE-2, boty
|
||||||
if not picture_cache.has_key(which):
|
if not picture_cache.has_key(which):
|
||||||
print 'Get picture', which
|
|
||||||
picture_cache[which] = Qd.GetPicture(which)
|
picture_cache[which] = Qd.GetPicture(which)
|
||||||
self.drawicon(rect, picture_cache[which])
|
self.drawicon(rect, picture_cache[which])
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,8 @@
|
||||||
import FrameWork
|
import FrameWork
|
||||||
|
import MiniAEFrame
|
||||||
import EasyDialogs
|
import EasyDialogs
|
||||||
|
import AE
|
||||||
|
import AppleEvents
|
||||||
import Res
|
import Res
|
||||||
import sys
|
import sys
|
||||||
import Qd
|
import Qd
|
||||||
|
@ -7,6 +10,13 @@ import Evt
|
||||||
import Events
|
import Events
|
||||||
import Dlg
|
import Dlg
|
||||||
import Win
|
import Win
|
||||||
|
import Menu
|
||||||
|
import TwitCore
|
||||||
|
import mactwit_mod
|
||||||
|
import mactwit_stack
|
||||||
|
import mactwit_browser
|
||||||
|
import mactwit_edit
|
||||||
|
import macfs
|
||||||
|
|
||||||
# Resource-id (for checking existence)
|
# Resource-id (for checking existence)
|
||||||
ID_MODULES=512
|
ID_MODULES=512
|
||||||
|
@ -16,48 +26,92 @@ ID_ABOUT=515
|
||||||
_arrow = Qd.qd.arrow
|
_arrow = Qd.qd.arrow
|
||||||
_watch = Qd.GetCursor(4).data
|
_watch = Qd.GetCursor(4).data
|
||||||
|
|
||||||
# Made available to TwitCore:
|
class Twit(FrameWork.Application, TwitCore.Application, MiniAEFrame.AEServer):
|
||||||
AskString = EasyDialogs.AskString
|
|
||||||
ShowMessage = EasyDialogs.Message
|
|
||||||
|
|
||||||
def SetCursor():
|
|
||||||
Qd.SetCursor(_arrow)
|
|
||||||
|
|
||||||
def SetWatch():
|
|
||||||
Qd.SetCursor(_watch)
|
|
||||||
|
|
||||||
# Exception for temporarily exiting the loop and program
|
|
||||||
ExitMainloop = 'ExitMainloop'
|
|
||||||
ExitFully = 'ExitFully'
|
|
||||||
|
|
||||||
class Application(FrameWork.Application):
|
|
||||||
"""The twit main class - mac-dependent part"""
|
"""The twit main class - mac-dependent part"""
|
||||||
|
|
||||||
def __init__(self, run_args, pm_args):
|
def __init__(self, sessiontype, arg=None):
|
||||||
# First init menus, etc.
|
# First init menus, etc.
|
||||||
|
self.app_menu_bar = Menu.GetMenuBar()
|
||||||
FrameWork.Application.__init__(self)
|
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.dbg_menu_bar = Menu.GetMenuBar()
|
||||||
|
self.setstate(sessiontype)
|
||||||
self._quitting = 0
|
self._quitting = 0
|
||||||
self.real_quit = 0
|
self.real_quit = 0
|
||||||
|
self.window_aware = 1
|
||||||
|
|
||||||
# Next create our dialogs
|
# Next create our dialogs
|
||||||
self.mi_init(run_args, pm_args)
|
self.mi_init(sessiontype, arg)
|
||||||
if self.real_quit:
|
while 1:
|
||||||
return
|
|
||||||
|
|
||||||
if not run_args:
|
|
||||||
# Go into mainloop once
|
|
||||||
self.one_mainloop()
|
|
||||||
if self.real_quit:
|
if self.real_quit:
|
||||||
return
|
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()
|
||||||
|
|
||||||
if not pm_args:
|
def switch_to_dbg(self):
|
||||||
# And give the debugger control.
|
if not self.window_aware:
|
||||||
self.to_debugger()
|
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):
|
def makeusermenus(self):
|
||||||
self.filemenu = m = FrameWork.Menu(self.menubar, "File")
|
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._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):
|
def do_about(self, id, item, window, event):
|
||||||
import time
|
import time
|
||||||
d = Dlg.GetNewDialog(ID_ABOUT, -1)
|
d = Dlg.GetNewDialog(ID_ABOUT, -1)
|
||||||
|
@ -102,12 +156,54 @@ class Application(FrameWork.Application):
|
||||||
while 1:
|
while 1:
|
||||||
ok, evt = self.getevent(Events.mDownMask|Events.keyDownMask, -1)
|
ok, evt = self.getevent(Events.mDownMask|Events.keyDownMask, -1)
|
||||||
if ok: return
|
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_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):
|
def do_quit(self, *args):
|
||||||
self._quit() # Signal FrameWork.Application to stop
|
self._quit() # Signal FrameWork.Application to stop
|
||||||
self.real_quit = 1
|
self.real_quit = 1
|
||||||
self.quit_bdb() # Tell debugger to quit.
|
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):
|
def exit_mainloop(self):
|
||||||
self._quit() # Signal FrameWork.Application to stop
|
self._quit() # Signal FrameWork.Application to stop
|
||||||
self.real_quit = 0
|
self.real_quit = 0
|
||||||
|
@ -115,6 +211,31 @@ class Application(FrameWork.Application):
|
||||||
def one_mainloop(self):
|
def one_mainloop(self):
|
||||||
self.quitting = 0
|
self.quitting = 0
|
||||||
self.mainloop()
|
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(file, line)
|
||||||
|
|
||||||
|
|
||||||
def Initialize():
|
def Initialize():
|
||||||
try:
|
try:
|
||||||
|
|
|
@ -6,6 +6,7 @@ import Win
|
||||||
import FrameWork
|
import FrameWork
|
||||||
import EasyDialogs
|
import EasyDialogs
|
||||||
import sys
|
import sys
|
||||||
|
import TwitCore
|
||||||
from mac_widgets import MT_AnyList, MT_IconTextWidget
|
from mac_widgets import MT_AnyList, MT_IconTextWidget
|
||||||
|
|
||||||
# Our dialogs
|
# Our dialogs
|
||||||
|
@ -19,7 +20,7 @@ I_SOURCE=6
|
||||||
I_RULER=7
|
I_RULER=7
|
||||||
I_EDIT=8
|
I_EDIT=8
|
||||||
|
|
||||||
class ModuleBrowser(FrameWork.DialogWindow):
|
class ModuleBrowser(FrameWork.DialogWindow, TwitCore.ModuleBrowser):
|
||||||
"""The module-browser dialog - mac-dependent part"""
|
"""The module-browser dialog - mac-dependent part"""
|
||||||
def open(self, module):
|
def open(self, module):
|
||||||
FrameWork.DialogWindow.open(self, ID_MODULES)
|
FrameWork.DialogWindow.open(self, ID_MODULES)
|
||||||
|
@ -74,6 +75,10 @@ class ModuleBrowser(FrameWork.DialogWindow):
|
||||||
self.vars.update(rgn)
|
self.vars.update(rgn)
|
||||||
self.source.update(rgn)
|
self.source.update(rgn)
|
||||||
|
|
||||||
|
def force_redraw(self):
|
||||||
|
Qd.SetPort(self.wid)
|
||||||
|
Win.InvalRgn(self.wid.GetWindowPort().visRgn)
|
||||||
|
|
||||||
def do_activate(self, activate, event):
|
def do_activate(self, activate, event):
|
||||||
self.modules.activate(activate)
|
self.modules.activate(activate)
|
||||||
self.vars.activate(activate)
|
self.vars.activate(activate)
|
||||||
|
|
|
@ -6,6 +6,7 @@ import Win
|
||||||
import FrameWork
|
import FrameWork
|
||||||
import EasyDialogs
|
import EasyDialogs
|
||||||
import sys
|
import sys
|
||||||
|
import TwitCore
|
||||||
from mac_widgets import MT_AnyList, MT_IndexList, MT_IconTextWidget
|
from mac_widgets import MT_AnyList, MT_IndexList, MT_IconTextWidget
|
||||||
|
|
||||||
# Our dialogs
|
# Our dialogs
|
||||||
|
@ -20,22 +21,16 @@ I_EXC_TITLE=7
|
||||||
I_EXC=8
|
I_EXC=8
|
||||||
I_EXCVALUE_TITLE=9
|
I_EXCVALUE_TITLE=9
|
||||||
I_EXCVALUE=10
|
I_EXCVALUE=10
|
||||||
I_QUIT=11
|
I_BROWSE=11
|
||||||
I_CONTINUE=12
|
I_RULER1=12
|
||||||
I_STEP=13
|
I_RULER2=13
|
||||||
I_BROWSE=14
|
I_STATE_TITLE=14
|
||||||
I_RULER1=15
|
I_STATE=15
|
||||||
I_RULER2=16
|
I_SHOW_COMPLEX=16
|
||||||
I_STATE_TITLE=17
|
I_SHOW_SYSTEM=17
|
||||||
I_STATE=18
|
I_EDIT=18
|
||||||
I_STEP_IN=19
|
|
||||||
I_STEP_OUT=20
|
|
||||||
I_RUN=21
|
|
||||||
I_SHOW_COMPLEX=22
|
|
||||||
I_SHOW_SYSTEM=23
|
|
||||||
I_EDIT=24
|
|
||||||
|
|
||||||
class StackBrowser(FrameWork.DialogWindow):
|
class StackBrowser(FrameWork.DialogWindow, TwitCore.StackBrowser):
|
||||||
"""The stack-browser dialog - mac-dependent part"""
|
"""The stack-browser dialog - mac-dependent part"""
|
||||||
def open(self):
|
def open(self):
|
||||||
FrameWork.DialogWindow.open(self, ID_STACK)
|
FrameWork.DialogWindow.open(self, ID_STACK)
|
||||||
|
@ -62,7 +57,6 @@ class StackBrowser(FrameWork.DialogWindow):
|
||||||
self.source.setcontent(self.cur_source)
|
self.source.setcontent(self.cur_source)
|
||||||
|
|
||||||
def setexception(self, name, value):
|
def setexception(self, name, value):
|
||||||
print 'SETEXC', (name, value)
|
|
||||||
if name == None:
|
if name == None:
|
||||||
self.wid.HideDialogItem(I_EXC)
|
self.wid.HideDialogItem(I_EXC)
|
||||||
self.wid.HideDialogItem(I_EXC_TITLE)
|
self.wid.HideDialogItem(I_EXC_TITLE)
|
||||||
|
@ -85,46 +79,11 @@ class StackBrowser(FrameWork.DialogWindow):
|
||||||
tp, h, rect = self.wid.GetDialogItem(I_STATE)
|
tp, h, rect = self.wid.GetDialogItem(I_STATE)
|
||||||
Dlg.SetDialogItemText(h, msg)
|
Dlg.SetDialogItemText(h, msg)
|
||||||
|
|
||||||
def setsession_none(self):
|
|
||||||
"""Nothing running, no stack trace"""
|
|
||||||
self.wid.HideDialogItem(I_CONTINUE)
|
|
||||||
self.wid.HideDialogItem(I_STEP)
|
|
||||||
self.wid.HideDialogItem(I_STEP_IN)
|
|
||||||
self.wid.HideDialogItem(I_STEP_OUT)
|
|
||||||
self.wid.ShowDialogItem(I_RUN)
|
|
||||||
|
|
||||||
def setsession_run(self):
|
|
||||||
"""Running"""
|
|
||||||
self.wid.HideDialogItem(I_RUN)
|
|
||||||
self.wid.ShowDialogItem(I_CONTINUE)
|
|
||||||
self.wid.ShowDialogItem(I_STEP)
|
|
||||||
self.wid.ShowDialogItem(I_STEP_IN)
|
|
||||||
self.wid.ShowDialogItem(I_STEP_OUT)
|
|
||||||
|
|
||||||
def setsession_pm(self):
|
|
||||||
"""Post-mortem debugging"""
|
|
||||||
self.wid.HideDialogItem(I_CONTINUE)
|
|
||||||
self.wid.HideDialogItem(I_STEP)
|
|
||||||
self.wid.HideDialogItem(I_STEP_IN)
|
|
||||||
self.wid.HideDialogItem(I_STEP_OUT)
|
|
||||||
self.wid.HideDialogItem(I_RUN)
|
|
||||||
|
|
||||||
def setsession_none(self):
|
|
||||||
"""Nothing running, no stack trace"""
|
|
||||||
self.wid.HideDialogItem(I_CONTINUE)
|
|
||||||
self.wid.HideDialogItem(I_STEP)
|
|
||||||
self.wid.HideDialogItem(I_STEP_IN)
|
|
||||||
self.wid.HideDialogItem(I_STEP_OUT)
|
|
||||||
self.wid.ShowDialogItem(I_RUN)
|
|
||||||
|
|
||||||
|
|
||||||
def do_itemhit(self, item, event):
|
def do_itemhit(self, item, event):
|
||||||
(what, message, when, where, modifiers) = event
|
(what, message, when, where, modifiers) = event
|
||||||
Qd.SetPort(self.wid)
|
Qd.SetPort(self.wid)
|
||||||
where = Qd.GlobalToLocal(where)
|
where = Qd.GlobalToLocal(where)
|
||||||
|
|
||||||
print 'STACKHIT', item
|
|
||||||
|
|
||||||
if item == I_STACK:
|
if item == I_STACK:
|
||||||
new_stackitem, double = self.stack.click(where, 0)
|
new_stackitem, double = self.stack.click(where, 0)
|
||||||
self.click_stack(new_stackitem)
|
self.click_stack(new_stackitem)
|
||||||
|
@ -136,20 +95,8 @@ class StackBrowser(FrameWork.DialogWindow):
|
||||||
lineno, inborder = self.source.click(where, 0)
|
lineno, inborder = self.source.click(where, 0)
|
||||||
if lineno <> None and lineno >= 0:
|
if lineno <> None and lineno >= 0:
|
||||||
self.click_source(lineno, inborder)
|
self.click_source(lineno, inborder)
|
||||||
elif item == I_QUIT:
|
|
||||||
self.click_quit()
|
|
||||||
elif item == I_CONTINUE:
|
|
||||||
self.click_continue()
|
|
||||||
elif item == I_STEP:
|
|
||||||
self.click_step()
|
|
||||||
elif item == I_STEP_IN:
|
|
||||||
self.click_step_in()
|
|
||||||
elif item == I_STEP_OUT:
|
|
||||||
self.click_step_out()
|
|
||||||
elif item == I_BROWSE:
|
elif item == I_BROWSE:
|
||||||
self.click_browse()
|
self.click_browse()
|
||||||
elif item == I_RUN:
|
|
||||||
self.click_run()
|
|
||||||
elif item == I_SHOW_COMPLEX:
|
elif item == I_SHOW_COMPLEX:
|
||||||
self.show_complex = not self.show_complex
|
self.show_complex = not self.show_complex
|
||||||
self.setup_frame()
|
self.setup_frame()
|
||||||
|
@ -177,6 +124,10 @@ class StackBrowser(FrameWork.DialogWindow):
|
||||||
self.stack.update(rgn)
|
self.stack.update(rgn)
|
||||||
self.vars.update(rgn)
|
self.vars.update(rgn)
|
||||||
self.source.update(rgn)
|
self.source.update(rgn)
|
||||||
|
|
||||||
|
def force_redraw(self):
|
||||||
|
Qd.SetPort(self.wid)
|
||||||
|
Win.InvalRgn(self.wid.GetWindowPort().visRgn)
|
||||||
|
|
||||||
def do_activate(self, activate, event):
|
def do_activate(self, activate, event):
|
||||||
self.stack.activate(activate)
|
self.stack.activate(activate)
|
||||||
|
|
|
@ -15,11 +15,7 @@ if os.name == 'mac':
|
||||||
# Not supported in distributed 1.4b3:
|
# Not supported in distributed 1.4b3:
|
||||||
## import MacOS
|
## import MacOS
|
||||||
## MacOS.splash(515) # Try to show the splash screen
|
## MacOS.splash(515) # Try to show the splash screen
|
||||||
import mactwit_mod; twit_mod = mactwit_mod
|
|
||||||
import mactwit_stack; twit_stack = mactwit_stack
|
|
||||||
import mactwit_app; twit_app = mactwit_app
|
import mactwit_app; twit_app = mactwit_app
|
||||||
import mactwit_browser; twit_browser = mactwit_browser
|
|
||||||
import mactwit_edit; twit_edit = mactwit_edit
|
|
||||||
else:
|
else:
|
||||||
try:
|
try:
|
||||||
import _tkinter
|
import _tkinter
|
||||||
|
@ -27,65 +23,26 @@ else:
|
||||||
except ImportError:
|
except ImportError:
|
||||||
have_tk = 0
|
have_tk = 0
|
||||||
if have_tk:
|
if have_tk:
|
||||||
import tktwit_mod; twit_mod = tktwit_mod
|
|
||||||
import tktwit_stack; twit_stack = tktwit_stack
|
|
||||||
import tktwit_app; twit_app = tktwit_app
|
import tktwit_app; twit_app = tktwit_app
|
||||||
else:
|
else:
|
||||||
print 'Please implementent twit_mod, twit_stack and twit_app and try again:-)'
|
print 'Please implementent machine-dependent code and try again:-)'
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
import TwitCore
|
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
class Twit(twit_app.Application, TwitCore.Application):
|
|
||||||
|
|
||||||
def new_module_browser(self, *args):
|
|
||||||
return apply(TWIT_ModuleBrowser, args)
|
|
||||||
|
|
||||||
def new_stack_browser(self, *args):
|
|
||||||
return apply(TWIT_StackBrowser, args)
|
|
||||||
|
|
||||||
def new_var_browser(self, *args):
|
|
||||||
return apply(TWIT_VarBrowser, args)
|
|
||||||
|
|
||||||
def edit(self, *args):
|
|
||||||
return apply(twit_edit.edit, args)
|
|
||||||
|
|
||||||
class TWIT_ModuleBrowser(twit_mod.ModuleBrowser, TwitCore.ModuleBrowser):
|
|
||||||
pass
|
|
||||||
|
|
||||||
class TWIT_StackBrowser(twit_stack.StackBrowser, TwitCore.StackBrowser):
|
|
||||||
pass
|
|
||||||
|
|
||||||
def TWIT_VarBrowser(parent, var):
|
|
||||||
return twit_browser.VarBrowser(parent).open(var)
|
|
||||||
|
|
||||||
def Initialize():
|
|
||||||
# Gross...
|
|
||||||
TwitCore.AskString = twit_app.AskString
|
|
||||||
TwitCore.ShowMessage = twit_app.ShowMessage
|
|
||||||
TwitCore.SetWatch = twit_app.SetWatch
|
|
||||||
TwitCore.SetCursor = twit_app.SetCursor
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
twit_app.Initialize()
|
twit_app.Initialize()
|
||||||
TwitCore.Initialize()
|
|
||||||
Initialize()
|
|
||||||
## if os.name == 'mac':
|
## if os.name == 'mac':
|
||||||
## MacOS.splash()
|
## MacOS.splash()
|
||||||
Twit(None, None)
|
twit_app.Twit('none', None)
|
||||||
|
|
||||||
def run(statement, globals=None, locals=None):
|
def run(statement, globals=None, locals=None):
|
||||||
twit_app.Initialize()
|
twit_app.Initialize()
|
||||||
TwitCore.Initialize()
|
twit_app.Twit('run', (statement, globals, locals))
|
||||||
Initialize()
|
|
||||||
Twit((statement, globals, locals), None)
|
|
||||||
|
|
||||||
def post_mortem(t):
|
def post_mortem(t):
|
||||||
twit_app.Initialize()
|
|
||||||
TwitCore.Initialize()
|
|
||||||
Initialize()
|
Initialize()
|
||||||
Twit(None, t)
|
twit_app.Twit('pm', t)
|
||||||
|
|
||||||
def pm():
|
def pm():
|
||||||
post_mortem(sys.last_traceback)
|
post_mortem(sys.last_traceback)
|
||||||
|
|
File diff suppressed because it is too large
Load diff
Loading…
Add table
Add a link
Reference in a new issue