Added controller class:
[pygdb.git] / BreakpointsFrame.py
index 1a24574423477034bbcee8dbdc39139c8828f8e7..201ca2f12abecff73eb13680967e967ec3c4556d 100644 (file)
@@ -22,6 +22,8 @@ class BreakpointsFrame (StatusFrame.StatusFrame):
                StatusFrame.StatusFrame.__init__(self, debugger)
                self.set_label("Breakpoints")
 
+               debugger.gotActiveCallback += [self.updateValues]
+
                vbox = gtk.VBox(False, 5)
                self.add(vbox)
 
@@ -61,8 +63,8 @@ class BreakpointsFrame (StatusFrame.StatusFrame):
 
 
        def __createModel(self):        
-               #Breakpoint number, position and a boolean flag indicating whether BP has been set
-               #at debugger yet
+               #Breakpoint number, position and a boolean flag indicating
+               #whether BP has been set at debugger yet
                model = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING)
 
                return model
@@ -100,7 +102,6 @@ class BreakpointsFrame (StatusFrame.StatusFrame):
        def addBreakpoint(self, file, lineno, cond=None):
 
                no = self.debugger.setBreakpoint(file, lineno, cond)
-
                if no!=None:
                        self.addBreakpointToList(no, file, lineno, cond)
                else:
@@ -111,28 +112,67 @@ class BreakpointsFrame (StatusFrame.StatusFrame):
                        dialog.run()
                        dialog.destroy()
 
+               return no
+
+
+       def delBreakpoints(self, file, lineno):
+
+               def addIters(model, path, iter, iters):
+                       expr = model.get_value(iter,1)
+                       expr = string.split(expr, " if ")[0].strip()
+                       if expr == "%s:%d"%(file,lineno):
+                               iters += [iter]
+
+               iters = []
+               self.model.foreach(addIters, iters)
+
+               #Need reversed here since rows are moved
+               #when removing rows
+               for i in reversed(iters):
+                       self.model.remove(i)
+
+
 
        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)
-                       conf.parseBreak(spec)
+
+                       #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):
-               iter = self.model.append()
-               self.model.set(iter, 0, no)
 
                if cond==None:
-                       self.model.set(iter, 1, "%s:%s" % (str(file), str(lineno)))
+                       expr =  "%s:%s" % (str(file), str(lineno))
                else:
-                       self.model.set(iter, 1, "%s:%s if %s" % (str(file), str(lineno), str(cond)))
+                       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):
@@ -143,7 +183,7 @@ class BreakpointsFrame (StatusFrame.StatusFrame):
 
                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):
@@ -156,7 +196,7 @@ class BreakpointsFrame (StatusFrame.StatusFrame):
                        return
 
 
-               ifsplit = string.split(bpspec, "if")
+               ifsplit = string.split(bpspec, " if ")
 
                if len(ifsplit)>1:
                        cond = ifsplit[1].strip()
@@ -173,6 +213,9 @@ class BreakpointsFrame (StatusFrame.StatusFrame):
 
        def delBtnClicked(self, btn):
 
+               self.delBreakpoints("main.cpp", 26)
+               return
+
                if not self.debugger.isActive():
                        return
 
@@ -191,10 +234,10 @@ class BreakpointsFrame (StatusFrame.StatusFrame):
                if not self.debugger.isActive():
                        return
 
-               self.updateValues(None)
+               self.updateValues(None, None)
 
 
-       def updateValues(self, pos):
+       def updateValues(self, status, param):
                
                bpnts = self.debugger.getBreakpoints()