[Idle-dev] CVS: idle PyShell.py,1.30,1.31

Chui Tey teyc@users.sourceforge.net
Mon, 04 Nov 2002 14:14:57 -0800


Update of /cvsroot/idlefork/idle
In directory usw-pr-cvs1:/tmp/cvs-serv15506

Modified Files:
	PyShell.py 
Log Message:
Recalls breakpoints set in a file

Index: PyShell.py
===================================================================
RCS file: /cvsroot/idlefork/idle/PyShell.py,v
retrieving revision 1.30
retrieving revision 1.31
diff -C2 -r1.30 -r1.31
*** PyShell.py	23 Oct 2002 04:48:08 -0000	1.30
--- PyShell.py	4 Nov 2002 22:14:54 -0000	1.31
***************
*** 25,28 ****
--- 25,29 ----
  from configHandler import idleConf
  import idlever
+ import os.path
  
  import rpc
***************
*** 80,98 ****
          self.text.bind("<<open-python-shell>>", self.flist.open_shell)
  
      rmenu_specs = [("Set Breakpoint", "<<set-breakpoint-here>>"),
                     ("Clear Breakpoint", "<<clear-breakpoint-here>>")]
  
!     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")))
          try:
              i = self.breakpoints.index(lineno)
!         except:  # only add if missing, i.e. do once
              self.breakpoints.append(lineno)
-         text.tag_add("BREAK", "insert linestart", "insert lineend +1char")
          try:    # update the subprocess debugger
              debug = self.flist.pyshell.interp.debugger
--- 81,104 ----
          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>>"),
                     ("Clear Breakpoint", "<<clear-breakpoint-here>>")]
  
!     def set_breakpoint(self, lineno):
          text = self.text
          filename = self.io.filename
!         text.tag_add("BREAK", "%d.0" % lineno, "%d.0" % (lineno+1))
          try:
              i = self.breakpoints.index(lineno)
!         except ValueError:  # only add if missing, i.e. do once
              self.breakpoints.append(lineno)
          try:    # update the subprocess debugger
              debug = self.flist.pyshell.interp.debugger
***************
*** 101,104 ****
--- 107,119 ----
              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):
          text = self.text
***************
*** 135,138 ****
--- 150,187 ----
                  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):
          "Extend base method - clear breaks if module is modified"
***************
*** 143,146 ****
--- 192,196 ----
      def _close(self):
          "Extend base method - clear breaks when module is closed"
+         self.store_file_breaks()
          self.clear_file_breaks()
          EditorWindow._close(self)