]> granicus.if.org Git - python/commitdiff
Clear associated breakpoints when closing an edit window.
authorKurt B. Kaiser <kbk@shore.net>
Mon, 24 Jun 2002 17:03:37 +0000 (17:03 +0000)
committerKurt B. Kaiser <kbk@shore.net>
Mon, 24 Jun 2002 17:03:37 +0000 (17:03 +0000)
M Debugger.py      : Added clear_file_breaks()
M EditorWindow.py  : Clear breaks when closed, commments->docstrings,
                     comment out some debugging print statements
M PyShell.py       : comments->docstrings ; clarify extending EditorWindow
                     methods.
M RemoteDebugger.py: Add clear_all_file_breaks() functionality,
                     clarify some comments.

Lib/idlelib/Debugger.py
Lib/idlelib/EditorWindow.py
Lib/idlelib/PyShell.py
Lib/idlelib/RemoteDebugger.py

index 46531469e87dda5766f9c44a5c8ff27153b023d1..1039c16dccbc06a7669d0b590d302deb9f063f1b 100644 (file)
@@ -320,17 +320,27 @@ class Debugger:
         text.tag_add("BREAK", "insert linestart", "insert lineend +1char")
 
     def clear_breakpoint_here(self, edit):
-         text = edit.text
-         filename = edit.io.filename
-         if not filename:
-                 text.bell()
-                 return
-         lineno = int(float(text.index("insert")))
-         msg = self.idb.clear_break(filename, lineno)
-         if msg:
-             text.bell()
-             return
-         text.tag_remove("BREAK", "insert linestart",\
-                         "insert lineend +1char")
-
+        text = edit.text
+        filename = edit.io.filename
+        if not filename:
+            text.bell()
+            return
+        lineno = int(float(text.index("insert")))
+        msg = self.idb.clear_break(filename, lineno)
+        if msg:
+            text.bell()
+            return
+        text.tag_remove("BREAK", "insert linestart",\
+                        "insert lineend +1char")
 
+    def clear_file_breaks(self, edit):
+        text = edit.text
+        filename = edit.io.filename
+        if not filename:
+            text.bell()
+            return
+        msg = self.idb.clear_all_file_breaks(filename)
+        if msg:
+            text.bell()
+            return
+        text.tag_delete("BREAK")
index be074b0d13ad295ee586dc1b1c56f945b2210762..453e6ca014db0c4fcedccd7412c5365db0438252 100644 (file)
@@ -490,15 +490,15 @@ class EditorWindow:
         self.per.insertfilter(self.undo)
         
     def ResetColorizer(self):
-        #this function is called from configDialog.py
-        #to update the colour theme if it is changed
+        "Update the colour theme if it is changed"
+        # Called from configDialog.py
         if self.color:
             self.color = self.ColorDelegator()
             self.per.insertfilter(self.color)
 
     def ResetFont(self):
-        #this function is called from configDialog.py
-        #to update the text widgets' font if it is changed
+        "Update the text widgets' font if it is changed" 
+        # Called from configDialog.py
         fontWeight='normal'
         if idleConf.GetOption('main','EditorWindow','font-bold',type='bool'):
             fontWeight='bold'
@@ -507,8 +507,8 @@ class EditorWindow:
                 fontWeight))
 
     def ResetKeybindings(self):
-        #this function is called from configDialog.py
-        #to update the keybindings if they are changed
+        "Update the keybindings if they are changed"
+        # Called from configDialog.py
         self.Bindings.default_keydefs=idleConf.GetCurrentKeySet()
         keydefs = self.Bindings.default_keydefs
         for event, keylist in keydefs.items():
@@ -540,7 +540,7 @@ class EditorWindow:
                             #print 'accel now:',accel,'\n'
 
     def ResetExtraHelpMenu(self):
-        #load or update the Extra Help menu if required
+        "Load or update the Extra Help menu if required"
         menuList=idleConf.GetAllExtraHelpSourcesList()
         helpMenu=self.menudict['help']
         cascadeIndex=helpMenu.index(END)-1
@@ -564,7 +564,7 @@ class EditorWindow:
         return DisplayExtraHelp
                     
     def UpdateRecentFilesList(self,newFile=None):
-        #load or update the recent files list, and menu if required
+        "Load or update the recent files list, and menu if required"
         rfList=[]
         if os.path.exists(self.recentFilesPath):
             RFfile=open(self.recentFilesPath,'r')
@@ -578,8 +578,9 @@ class EditorWindow:
                 rfList.remove(newFile)
             rfList.insert(0,newFile)
         rfList=self.__CleanRecentFiles(rfList)
-        print self.top.instanceDict
-        print self
+        #print self.flist.inversedict
+        #print self.top.instanceDict
+        #print self
         if rfList:
             for instance in self.top.instanceDict.keys():
                 instance.menuRecentFiles.delete(1,END)
@@ -695,10 +696,12 @@ class EditorWindow:
         return reply
 
     def _close(self):
-        print self.io.filename
+        #print self.io.filename
         if self.io.filename:
             self.UpdateRecentFilesList(newFile=self.io.filename)
-            
+        shell = self.flist.pyshell
+        if shell and shell.interp.debugger:
+            shell.interp.debugger.clear_file_breaks(self)
         WindowList.unregister_callback(self.postwindowsmenu)
         if self.close_hook:
             self.close_hook()
@@ -756,7 +759,6 @@ class EditorWindow:
                 methodname = methodname + "_event"
                 if hasattr(ins, methodname):
                     self.text.bind(vevent, getattr(ins, methodname))
-       
         if hasattr(ins, "menudefs"):
             self.fill_menus(ins.menudefs, keydefs)
         return ins
@@ -771,8 +773,10 @@ class EditorWindow:
                 apply(text.event_add, (event,) + tuple(keylist))
 
     def fill_menus(self, defs=None, keydefs=None):
-        # Fill the menus. Menus that are absent or None in
-        # self.menudict are ignored.
+        """Add appropriate entries to the menus and submenus
+
+        Menus that are absent or None in self.menudict are ignored.
+        """
         if defs is None:
             defs = self.Bindings.menudefs
         if keydefs is None:
index f418a5757e3f3b38de816e980ed6cf3eea4ec00e..6fb7f6904ca14d88dd01ffe9b63cadb35eb615ec 100644 (file)
@@ -119,8 +119,7 @@ class PyShellEditorWindow(EditorWindow):
                                     
 
 class PyShellFileList(FileList):
-
-    # File list when a shell is present
+    "Extend base class: file list when a shell is present"
 
     EditorWindow = PyShellEditorWindow
 
@@ -136,8 +135,7 @@ class PyShellFileList(FileList):
 
 
 class ModifiedColorDelegator(ColorDelegator):
-
-    # Colorizer for the shell window itself
+    "Extend base class: colorizer for the shell window itself"
     
     def __init__(self):
         ColorDelegator.__init__(self)
@@ -161,8 +159,7 @@ class ModifiedColorDelegator(ColorDelegator):
         })
 
 class ModifiedUndoDelegator(UndoDelegator):
-
-    # Forbid insert/delete before the I/O mark
+    "Extend base class: forbid insert/delete before the I/O mark"
 
     def insert(self, index, chars, tags=None):
         try:
@@ -283,12 +280,12 @@ class ModifiedInterpreter(InteractiveInterpreter):
     gid = 0
 
     def execsource(self, source):
-        # Like runsource() but assumes complete exec source
+        "Like runsource() but assumes complete exec source"
         filename = self.stuffsource(source)
         self.execfile(filename, source)
 
     def execfile(self, filename, source=None):
-        # Execute an existing file
+        "Execute an existing file"
         if source is None:
             source = open(filename, "r").read()
         try:
@@ -300,7 +297,7 @@ class ModifiedInterpreter(InteractiveInterpreter):
             self.runcode(code)
 
     def runsource(self, source):
-        # Extend base class to stuff the source in the line cache first
+        "Extend base class method: Stuff the source in the line cache first"
         filename = self.stuffsource(source)
         self.more = 0
         self.save_warnings_filters = warnings.filters[:]
@@ -313,7 +310,7 @@ class ModifiedInterpreter(InteractiveInterpreter):
                 self.save_warnings_filters = None
 
     def stuffsource(self, source):
-        # Stuff source in the filename cache
+        "Stuff source in the filename cache"
         filename = "<pyshell#%d>" % self.gid
         self.gid = self.gid + 1
         lines = string.split(source, "\n")
@@ -321,8 +318,12 @@ class ModifiedInterpreter(InteractiveInterpreter):
         return filename
 
     def showsyntaxerror(self, filename=None):
-        # Extend base class to color the offending position
-        # (instead of printing it and pointing at it with a caret)
+        """Extend base class method: Add Colorizing
+
+        Color the offending position instead of printing it and pointing at it
+        with a caret.
+
+        """
         text = self.tkconsole.text
         stuff = self.unpackerror()
         if not stuff:
@@ -357,7 +358,7 @@ class ModifiedInterpreter(InteractiveInterpreter):
             return None
 
     def showtraceback(self):
-        # Extend base class method to reset output properly
+        "Extend base class method to reset output properly"
         self.tkconsole.resetoutput()
         self.checklinecache()
         InteractiveInterpreter.showtraceback(self)
@@ -379,7 +380,7 @@ class ModifiedInterpreter(InteractiveInterpreter):
         return self.debugger
 
     def runcommand(self, code):
-        # This runs the code without invoking the debugger.
+        "Run the code without invoking the debugger"
         # The code better not raise an exception!
         if self.tkconsole.executing:
             tkMessageBox.showerror(
@@ -395,7 +396,7 @@ class ModifiedInterpreter(InteractiveInterpreter):
         return 1
 
     def runcode(self, code):
-        # Override base class method
+        "Override base class method"
         if self.tkconsole.executing:
             tkMessageBox.showerror(
                 "Already executing",
@@ -403,7 +404,7 @@ class ModifiedInterpreter(InteractiveInterpreter):
                 "please wait until it is finished.",
                 master=self.tkconsole.text)
             return
-
+        #
         self.checklinecache()
         if self.save_warnings_filters is not None:
             warnings.filters[:] = self.save_warnings_filters
@@ -414,7 +415,7 @@ class ModifiedInterpreter(InteractiveInterpreter):
             self.active_seq = self.rpcclt.asynccall("exec", "runcode",
                                                     (code,), {})
             return
-
+        #
         try:
             self.tkconsole.beginexecuting()
             try:
@@ -433,12 +434,12 @@ class ModifiedInterpreter(InteractiveInterpreter):
                     self.showtraceback()
             except:
                 self.showtraceback()
-
+        #        
         finally:
             self.tkconsole.endexecuting()
 
     def write(self, s):
-        # Override base class write
+        "Override base class method"
         self.tkconsole.console.write(s)
 
 class PyShell(OutputWindow):
@@ -565,7 +566,7 @@ class PyShell(OutputWindow):
         ##sys.settrace(self._cancel_check)
 
     def endexecuting(self):
-        # Helper for ModifiedInterpreter
+        "Helper for ModifiedInterpreter"
         ##sys.settrace(None)
         ##self._cancel_check = None
         self.executing = 0
@@ -573,7 +574,7 @@ class PyShell(OutputWindow):
         self.showprompt()
 
     def close(self):
-        # Extend base class method
+        "Extend EditorWindow.close()"
         if self.executing:
             # XXX Need to ask a question here
             if not tkMessageBox.askokcancel(
@@ -586,9 +587,10 @@ class PyShell(OutputWindow):
             if self.reading:
                 self.top.quit()
             return "cancel"
-        return OutputWindow.close(self)
+        return EditorWindow.close(self)
 
     def _close(self):
+        "Extend EditorWindow._close(), shut down debugger and execution server"
         self.close_debugger()
         self.interp.kill_subprocess()
         # Restore std streams
@@ -601,10 +603,10 @@ class PyShell(OutputWindow):
         self.auto = None
         self.flist.pyshell = None
         self.history = None
-        OutputWindow._close(self) # Really EditorWindow._close
+        EditorWindow._close(self)
 
     def ispythonsource(self, filename):
-        # Override this so EditorWindow never removes the colorizer
+        "Override EditorWindow method: never remove the colorizer"
         return 1
 
     def short_title(self):
@@ -781,9 +783,6 @@ class PyShell(OutputWindow):
             i = i-1
         line = line[:i]
         more = self.interp.runsource(line)
-        # XXX This was causing extra prompt with shell  KBK
-#       if not more:
-#           self.showprompt()
 
     def cancel_check(self, frame, what, args,
                      dooneevent=tkinter.dooneevent,
index a5b4e7e363d5ba0dc4e72523eefa542f821e97d5..84a51a5b5b8b6b2c471d1459d52239f685436b46 100644 (file)
@@ -101,6 +101,9 @@ class IdbAdapter:
     def clear_break(self, filename, lineno):
         msg = self.idb.clear_break(filename, lineno)
 
+    def clear_all_file_breaks(self, filename):
+        msg = self.idb.clear_all_file_breaks(filename)
+
     #----------called by a FrameProxy----------
 
     def frame_attr(self, fid, name):
@@ -148,14 +151,6 @@ class IdbAdapter:
         dict = dicttable[did]
         value = dict[key]
         value = repr(value)
-#          try:
-#              # Test for picklability
-#              import cPickle
-#              pklstr = cPickle.dumps(value)
-#          except:
-#              print >>sys.__stderr__, "** dict_item pickle failed: ", value
-#              raise    
-#              #value = None
         return value
 
 #----------end class IdbAdapter----------
@@ -165,9 +160,9 @@ def start_debugger(conn, gui_adap_oid):
     """Start the debugger and its RPC link in the Python subprocess
 
     Start the subprocess side of the split debugger and set up that side of the
-    RPC link by instantiating the GUIProxy, Idle debugger, and IdbAdapter
+    RPC link by instantiating the GUIProxy, Idb debugger, and IdbAdapter
     objects and linking them together.  Register the IdbAdapter to handle RPC
-    requests from the split Debugger GUI via the IdbProxy.
+    requests from the split debugger GUI via the IdbProxy.
 
     """
     gui_proxy = GUIProxy(conn, gui_adap_oid)
@@ -316,12 +311,16 @@ class IdbProxy:
     def clear_break(self, filename, lineno):
         msg = self.call("clear_break", filename, lineno)
 
+    def clear_all_file_breaks(self, filename):
+        msg = self.call("clear_all_file_breaks", filename)
+        
+
 def start_remote_debugger(conn, pyshell):
     """Start the subprocess debugger, initialize the debugger GUI and RPC link
 
     Request the RPCServer start the Python subprocess debugger and link.  Set
     up the Idle side of the split debugger by instantiating the IdbProxy,
-    Debugger GUI, and Debugger GUIAdapter objects and linking them together.
+    debugger GUI, and debugger GUIAdapter objects and linking them together.
 
     Register the GUIAdapter to handle debugger GUI interaction requests coming
     from the subprocess debugger via the GUIProxy.