Add LICENSE
[pygdb.git] / BreakpointsFrame.py
index 9b709b403ea610f9721b841f1a1fb427ef75a079..8450699eb4c5e970cd73837bf4ffba2ec177f436 100644 (file)
@@ -11,15 +11,18 @@ import string
 import vte
 
 import DbgTerminal
+import StatusFrame
 
 
-class BreakpointsFrame (gtk.Frame):
+class BreakpointsFrame (StatusFrame.StatusFrame):
 
 
        def __init__(self, debugger):
 
-               gtk.Frame.__init__(self, "Breakpoints")
-               self.debugger = debugger
+               StatusFrame.StatusFrame.__init__(self, debugger)
+               self.set_label("Breakpoints")
+
+               debugger.gotActiveCallback += [self.updateValues]
 
                vbox = gtk.VBox(False, 5)
                self.add(vbox)
@@ -48,6 +51,7 @@ class BreakpointsFrame (gtk.Frame):
                self.tv = gtk.TreeView(self.model)
                self.tv.set_rules_hint(True)
                self.tv.get_selection().set_mode(gtk.SELECTION_MULTIPLE)
+               self.tv.get_selection().connect("changed", self.selChanged)
 
                self.__addColumns(self.tv)      
                sw.add(self.tv)
@@ -84,6 +88,72 @@ class BreakpointsFrame (gtk.Frame):
                tv.append_column(col)
 
 
+       def selChanged(self, sel):
+               model, paths = sel.get_selected_rows()
+
+               if len(paths) > 0:
+                       path = paths[0]
+                       iter = model.get_iter(path)
+                       bpspec, = model.get(iter, 1)
+                       self.bpEntry.set_text(bpspec)
+
+
+
+       def addBreakpoint(self, file, lineno, cond=None):
+
+               no = self.debugger.setBreakpoint(file, lineno, cond)
+               if no!=None:
+                       self.addBreakpointToList(no, file, lineno, cond)
+               else:
+                       dialog = gtk.MessageDialog(None, \
+                               gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, \
+                               gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, \
+                               "Invalid specification!") 
+                       dialog.run()
+                       dialog.destroy()
+
+
+       def applyConfiguration(self, conf):
+               for b in conf.breakpoints:
+                       self.addBreakpoint(b["file"], b["lineno"], b["cond"])
+               self.updateValues(None, None)
+
+       def fillConfiguration(self, conf):
+               iter = self.model.get_iter_first()
+               while iter != None:
+                       spec, = self.model.get(iter, 1)
+
+                       #Replacing file by absolute path
+                       file = string.split(spec, ":")[0]
+                       file = self.debugger.toAbsPath(file)
+                       postfile = string.join( string.split(spec,":")[1:], ":")
+
+                       conf.parseBreak(file + ":" + postfile )
+                       iter = self.model.iter_next(iter)
+
+
+
+       def addBreakpointToList(self, no, file, lineno, cond=None):
+
+               if cond==None:
+                       expr =  "%s:%s" % (str(file), str(lineno))
+               else:
+                       expr = "%s:%s if %s" % (str(file), str(lineno), str(cond))
+
+               iter = self.model.get_iter_first()
+               while iter != None:
+                       newiter = self.model.iter_next(iter)
+                       #Found a expression which is the same --> remove the breakpoint
+                       if (expr,) == self.model.get(iter,1):
+                               self.debugger.delBreakpoint(no)
+                               return
+                       iter = newiter
+       
+               #Add the entry to the breakpoint list
+               iter = self.model.append()
+               self.model.set(iter, 0, no)     
+               self.model.set(iter, 1, expr)
+
 
        def addBtnClicked(self, btn):
 
@@ -93,7 +163,7 @@ class BreakpointsFrame (gtk.Frame):
 
                bpspec = self.bpEntry.get_text()
                bpspec = bpspec.strip()
-               rx = re.compile("^[\w\._\-]+:\d+(\s+if\s+\S+.*)?$")
+               rx = re.compile("^[\w/\._\-]+:\d+(\s+if\s+\S+.*)?$")
 
                #Check if format is correct
                if not rx.search(bpspec):
@@ -106,7 +176,7 @@ class BreakpointsFrame (gtk.Frame):
                        return
 
 
-               ifsplit = string.split(bpspec, "if")
+               ifsplit = string.split(bpspec, " if ")
 
                if len(ifsplit)>1:
                        cond = ifsplit[1].strip()
@@ -117,33 +187,7 @@ class BreakpointsFrame (gtk.Frame):
                [file,lineno] = string.split(pos, ":")
 
                self.addBreakpoint(file, lineno, cond)
-       
-
-
-       def addBreakpoint(self, file, lineno, cond=None):
 
-               no = self.debugger.setBreakpoint(file, lineno, cond)
-
-               if no!=None:
-                       self.addBreakpointToList(no, file, lineno, cond)
-               else:
-                       dialog = gtk.MessageDialog(None, \
-                               gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, \
-                               gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, \
-                               "Invalid specification!") 
-                       dialog.run()
-                       dialog.destroy()
-
-
-
-       def addBreakpointToList(self, no, file, lineno, cond=None):
-               iter = self.model.append()
-               self.model.set(iter, 0, no)
-
-               if cond==None:
-                       self.model.set(iter, 1, "%s:%s" % (str(file), str(lineno)))
-               else:
-                       self.model.set(iter, 1, "%s:%s if %s" % (str(file), str(lineno), str(cond)))
 
 
 
@@ -155,7 +199,7 @@ class BreakpointsFrame (gtk.Frame):
                selection = self.tv.get_selection()
                model, paths = selection.get_selected_rows()
 
-               for path in paths:
+               for path in reversed(paths):
                        iter = model.get_iter(path)
                        bpno, = self.model.get(iter, 0)
                        self.debugger.delBreakpoint(bpno)
@@ -167,10 +211,10 @@ class BreakpointsFrame (gtk.Frame):
                if not self.debugger.isActive():
                        return
 
-               self.updateValues()
+               self.updateValues(None, None)
 
 
-       def updateValues(self):
+       def updateValues(self, status, param):
                
                bpnts = self.debugger.getBreakpoints()