extracting a launchDebugger code
[pygdb.git] / BreakpointsFrame.py
1 #!/usr/bin/python
2 #shuber, 2008-06-04
3
4 __author__ = "shuber"
5
6
7 import gobject
8 import gtk
9 import re
10 import string
11 import vte
12
13 import DbgTerminal
14
15
16 class BreakpointsFrame (gtk.Frame):
17
18
19 def __init__(self, debugger):
20
21 gtk.Frame.__init__(self, "Breakpoints")
22 self.debugger = debugger
23
24 vbox = gtk.VBox(False, 5)
25 self.add(vbox)
26
27 hbox = gtk.HBox()
28 vbox.pack_start(hbox, False, False)
29 self.bpEntry = gtk.Entry()
30 hbox.add(self.bpEntry)
31
32
33 hbox = gtk.HBox()
34 vbox.pack_start(hbox, False, False)
35 self.addBtn = gtk.Button(stock=gtk.STOCK_ADD)
36 self.delBtn = gtk.Button(stock=gtk.STOCK_REMOVE)
37 self.updBtn = gtk.Button("Update")
38 hbox.add(self.addBtn)
39 hbox.add(self.delBtn)
40 hbox.add(self.updBtn)
41
42 sw = gtk.ScrolledWindow()
43 sw.set_shadow_type(gtk.SHADOW_ETCHED_IN)
44 sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
45 vbox.add(sw)
46
47 self.model = self.__createModel()
48 self.tv = gtk.TreeView(self.model)
49 self.tv.set_rules_hint(True)
50 self.tv.get_selection().set_mode(gtk.SELECTION_MULTIPLE)
51
52 self.__addColumns(self.tv)
53 sw.add(self.tv)
54
55 self.addBtn.connect("clicked", self.addBtnClicked)
56 self.delBtn.connect("clicked", self.delBtnClicked)
57 self.updBtn.connect("clicked", self.updBtnClicked)
58
59
60
61 def __createModel(self):
62 #Breakpoint number, position and a boolean flag indicating whether BP has been set
63 #at debugger yet
64 model = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING)
65
66 return model
67
68
69 def __addColumns(self, tv):
70
71 model = tv.get_model()
72
73 renderer = gtk.CellRendererText()
74 renderer.set_data("column", 0)
75 col = gtk.TreeViewColumn("No", renderer, text=0)
76 col.set_resizable(True)
77 tv.append_column(col)
78
79
80 renderer = gtk.CellRendererText()
81 renderer.set_data("column", 1)
82 col = gtk.TreeViewColumn("Specification", renderer, text=1)
83 col.set_resizable(True)
84 tv.append_column(col)
85
86
87
88 def addBtnClicked(self, btn):
89
90 if not self.debugger.isActive():
91 return
92
93
94 bpspec = self.bpEntry.get_text()
95 rx = re.compile("^[\w\._\-]+:\d+\s*(\sif\s+\S+.*)?$")
96
97 #Check if format is correct
98 if not rx.search(bpspec):
99 dialog = gtk.MessageDialog(None, \
100 gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, \
101 gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, \
102 "Invalid format!")
103 dialog.run()
104 dialog.destroy()
105 return
106
107
108 ifsplit = string.split(bpspec, "if")
109
110 if len(ifsplit)>1:
111 cond = ifsplit[1].strip()
112 else:
113 cond = None
114
115 pos = ifsplit[0].strip()
116 [file,lineno] = string.split(pos, ":")
117
118 pos = self.debugger.setBreakpoint(file, lineno, cond)
119
120 if pos!=None:
121 iter = self.model.append()
122 self.model.set(iter, 0, pos)
123 self.model.set(iter, 1, bpspec)
124 else:
125 dialog = gtk.MessageDialog(None, \
126 gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, \
127 gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, \
128 "Invalid specification!")
129 dialog.run()
130 dialog.destroy()
131 return
132
133
134
135
136 def delBtnClicked(self, btn):
137
138 if not self.debugger.isActive():
139 return
140
141 selection = self.tv.get_selection()
142 model, paths = selection.get_selected_rows()
143
144 for path in paths:
145 iter = model.get_iter(path)
146 bpno, = self.model.get(iter, 0)
147 self.debugger.delBreakpoint(bpno)
148 model.remove(iter)
149
150
151 def updBtnClicked(self, btn):
152
153 if not self.debugger.isActive():
154 return
155
156 self.updateValues()
157
158
159 def updateValues(self):
160
161 bpnts = self.debugger.getBreakpoints()
162
163 #Remove them all
164 iter = self.model.get_iter_first()
165 while iter != None:
166 newiter = self.model.iter_next(iter)
167 self.model.remove(iter)
168 iter = newiter
169
170 for bp in bpnts:
171 [no, file, lineno, cond] = bp
172 iter = self.model.append()
173 self.model.set(iter, 0, no)
174
175 if cond==None:
176 self.model.set(iter, 1, "%s:%s" % (file, lineno))
177 else:
178 self.model.set(iter, 1, "%s:%s if %s" % (file, lineno, cond))
179
180
181