Commit a2adb0f6 authored by Chui Tey's avatar Chui Tey

Recalls breakpoints set in a file

parent 146f61d4
...@@ -24,6 +24,7 @@ from UndoDelegator import UndoDelegator ...@@ -24,6 +24,7 @@ from UndoDelegator import UndoDelegator
from OutputWindow import OutputWindow from OutputWindow import OutputWindow
from configHandler import idleConf from configHandler import idleConf
import idlever import idlever
import os.path
import rpc import rpc
import RemoteDebugger import RemoteDebugger
...@@ -79,27 +80,41 @@ class PyShellEditorWindow(EditorWindow): ...@@ -79,27 +80,41 @@ class PyShellEditorWindow(EditorWindow):
self.text.bind("<<clear-breakpoint-here>>", self.clear_breakpoint_here) self.text.bind("<<clear-breakpoint-here>>", self.clear_breakpoint_here)
self.text.bind("<<open-python-shell>>", self.flist.open_shell) self.text.bind("<<open-python-shell>>", self.flist.open_shell)
self.breakpointPath=os.path.join(idleConf.GetUserCfgDir(), 'breakpoints.lst')
# whenever a file is changed, restore breakpoints
if self.io.filename: self.restore_file_breaks()
def filename_changed_hook(self,old_hook=self.io.filename_change_hook):
self.restore_file_breaks()
old_hook()
self.io.set_filename_change_hook(filename_changed_hook)
rmenu_specs = [("Set Breakpoint", "<<set-breakpoint-here>>"), rmenu_specs = [("Set Breakpoint", "<<set-breakpoint-here>>"),
("Clear Breakpoint", "<<clear-breakpoint-here>>")] ("Clear Breakpoint", "<<clear-breakpoint-here>>")]
def set_breakpoint_here(self, event=None): def set_breakpoint(self, lineno):
text = self.text text = self.text
filename = self.io.filename filename = self.io.filename
if not filename: text.tag_add("BREAK", "%d.0" % lineno, "%d.0" % (lineno+1))
text.bell()
return
lineno = int(float(text.index("insert")))
try: try:
i = self.breakpoints.index(lineno) i = self.breakpoints.index(lineno)
except: # only add if missing, i.e. do once except ValueError: # only add if missing, i.e. do once
self.breakpoints.append(lineno) self.breakpoints.append(lineno)
text.tag_add("BREAK", "insert linestart", "insert lineend +1char")
try: # update the subprocess debugger try: # update the subprocess debugger
debug = self.flist.pyshell.interp.debugger debug = self.flist.pyshell.interp.debugger
debug.set_breakpoint_here(filename, lineno) debug.set_breakpoint_here(filename, lineno)
except: # but debugger may not be active right now.... except: # but debugger may not be active right now....
pass pass
def set_breakpoint_here(self, event=None):
text = self.text
filename = self.io.filename
if not filename:
text.bell()
return
lineno = int(float(text.index("insert")))
self.set_breakpoint(lineno)
def clear_breakpoint_here(self, event=None): def clear_breakpoint_here(self, event=None):
text = self.text text = self.text
filename = self.io.filename filename = self.io.filename
...@@ -134,6 +149,40 @@ class PyShellEditorWindow(EditorWindow): ...@@ -134,6 +149,40 @@ class PyShellEditorWindow(EditorWindow):
except: except:
pass pass
def store_file_breaks(self):
if not self.breakpoints:
return
filename=self.io.filename
try:
lines=open(self.breakpointPath,"r").readlines()
except IOError:
lines=[]
new_file=open(self.breakpointPath,"w")
for line in lines:
if not line.startswith(filename+"="):
new_file.write(line)
new_file.write(filename+"="+`self.get_current_breaks()`)
new_file.close()
def restore_file_breaks(self):
self.text.update() # this enables setting "BREAK" tags to be visible
filename=self.io.filename
lines=open(self.breakpointPath,"r").readlines()
for line in lines:
if line.startswith(filename+"="):
breakpoint_linenumbers=eval(line[len(filename)+1:])
for breakpoint_linenumber in breakpoint_linenumbers:
self.set_breakpoint(breakpoint_linenumber)
def get_current_breaks(self):
#
# retrieves all the breakpoints in the current window
#
text = self.text
lines = text.tag_ranges("BREAK")
result = [int(float((lines[i]))) for i in range(0,len(lines),2)]
return result
def saved_change_hook(self): def saved_change_hook(self):
"Extend base method - clear breaks if module is modified" "Extend base method - clear breaks if module is modified"
if not self.get_saved(): if not self.get_saved():
...@@ -142,6 +191,7 @@ class PyShellEditorWindow(EditorWindow): ...@@ -142,6 +191,7 @@ class PyShellEditorWindow(EditorWindow):
def _close(self): def _close(self):
"Extend base method - clear breaks when module is closed" "Extend base method - clear breaks when module is closed"
self.store_file_breaks()
self.clear_file_breaks() self.clear_file_breaks()
EditorWindow._close(self) EditorWindow._close(self)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment