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)
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)
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)
+ conf.parseBreak(spec)
+ 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):
bpspec = self.bpEntry.get_text()
- rx = re.compile("^[\w\._\-]+:\d+\s*(\sif\s+\S+.*)?$")
+ bpspec = bpspec.strip()
+ rx = re.compile("^[\w/\._\-]+:\d+(\s+if\s+\S+.*)?$")
#Check if format is correct
if not rx.search(bpspec):
pos = ifsplit[0].strip()
[file,lineno] = string.split(pos, ":")
- pos = self.debugger.setBreakpoint(file, lineno, cond)
-
- if pos!=None:
- iter = self.model.append()
- self.model.set(iter, 0, pos)
- self.model.set(iter, 1, bpspec)
- 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()
- return
+ self.addBreakpoint(file, lineno, cond)
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)
if not self.debugger.isActive():
return
- self.updateValues()
+ self.updateValues(None, None)
- def updateValues(self):
+ def updateValues(self, status, param):
bpnts = self.debugger.getBreakpoints()
for bp in bpnts:
[no, file, lineno, cond] = bp
- iter = self.model.append()
- self.model.set(iter, 0, no)
-
- if cond==None:
- self.model.set(iter, 1, "%s:%s" % (file, lineno))
- else:
- self.model.set(iter, 1, "%s:%s if %s" % (file, lineno, cond))
+ self.addBreakpointToList(no, file, lineno, cond)