X-Git-Url: http://git.sthu.org/?a=blobdiff_plain;f=BreakpointsFrame.py;fp=BreakpointsFrame.py;h=3216de661c4ed21ae8b55730a2a7003e7bf8bb31;hb=9a8e5a643a533e00a2c8fdd6f03ea7b7a5e5d649;hp=0000000000000000000000000000000000000000;hpb=e3403072dbc8f31817f6492dea70ebdf5128fcb2;p=pygdb.git diff --git a/BreakpointsFrame.py b/BreakpointsFrame.py new file mode 100644 index 0000000..3216de6 --- /dev/null +++ b/BreakpointsFrame.py @@ -0,0 +1,181 @@ +#!/usr/bin/python +#shuber, 2008-06-04 + +__author__ = "shuber" + + +import gobject +import gtk +import re +import string +import vte + +import DbgTerminal + + +class BreakpointsFrame (gtk.Frame): + + + def __init__(self, debugger): + + gtk.Frame.__init__(self, "Breakpoints") + self.debugger = debugger + + vbox = gtk.VBox(False, 5) + self.add(vbox) + + hbox = gtk.HBox() + vbox.pack_start(hbox, False, False) + self.bpEntry = gtk.Entry() + hbox.add(self.bpEntry) + + + hbox = gtk.HBox() + vbox.pack_start(hbox, False, False) + self.addBtn = gtk.Button(stock=gtk.STOCK_ADD) + self.delBtn = gtk.Button(stock=gtk.STOCK_REMOVE) + self.updBtn = gtk.Button("Update") + hbox.add(self.addBtn) + hbox.add(self.delBtn) + hbox.add(self.updBtn) + + sw = gtk.ScrolledWindow() + sw.set_shadow_type(gtk.SHADOW_ETCHED_IN) + sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) + vbox.add(sw) + + self.model = self.__createModel() + self.tv = gtk.TreeView(self.model) + self.tv.set_rules_hint(True) + self.tv.get_selection().set_mode(gtk.SELECTION_MULTIPLE) + + self.__addColumns(self.tv) + sw.add(self.tv) + + self.addBtn.connect("clicked", self.addBtnClicked) + self.delBtn.connect("clicked", self.delBtnClicked) + self.updBtn.connect("clicked", self.updBtnClicked) + + + + def __createModel(self): + #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 + + + def __addColumns(self, tv): + + model = tv.get_model() + + renderer = gtk.CellRendererText() + renderer.set_data("column", 0) + col = gtk.TreeViewColumn("No", renderer, text=0) + col.set_resizable(True) + tv.append_column(col) + + + renderer = gtk.CellRendererText() + renderer.set_data("column", 1) + col = gtk.TreeViewColumn("Specification", renderer, text=1) + col.set_resizable(True) + tv.append_column(col) + + + + def addBtnClicked(self, btn): + + if not self.debugger.isActive(): + return + + + bpspec = self.bpEntry.get_text() + rx = re.compile("^[\w\._\-]+:\d+\s*(\sif\s+\S+.*)?$") + + #Check if format is correct + if not rx.search(bpspec): + dialog = gtk.MessageDialog(None, \ + gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, \ + gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, \ + "Invalid format!") + dialog.run() + dialog.destroy() + return + + + ifsplit = string.split(bpspec, "if") + + if len(ifsplit)>1: + cond = ifsplit[1].strip() + else: + cond = None + + 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 + + + + + def delBtnClicked(self, btn): + + if not self.debugger.isActive(): + return + + selection = self.tv.get_selection() + model, paths = selection.get_selected_rows() + + for path in paths: + iter = model.get_iter(path) + bpno, = self.model.get(iter, 0) + self.debugger.delBreakpoint(bpno) + model.remove(iter) + + + def updBtnClicked(self, btn): + + if not self.debugger.isActive(): + return + + self.updateValues() + + + def updateValues(self): + + bpnts = self.debugger.getBreakpoints() + + #Remove them all + iter = self.model.get_iter_first() + while iter != None: + newiter = self.model.iter_next(iter) + self.model.remove(iter) + iter = newiter + + 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)) + + +