some code beautifying: __waitForPrompt
[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 import StatusFrame
15
16
17 class BreakpointsFrame (StatusFrame.StatusFrame):
18
19
20 def __init__(self, debugger):
21
22 StatusFrame.StatusFrame.__init__(self, debugger)
23 self.set_label("Breakpoints")
24
25 vbox = gtk.VBox(False, 5)
26 self.add(vbox)
27
28 hbox = gtk.HBox()
29 vbox.pack_start(hbox, False, False)
30 self.bpEntry = gtk.Entry()
31 hbox.add(self.bpEntry)
32
33
34 hbox = gtk.HBox()
35 vbox.pack_start(hbox, False, False)
36 self.addBtn = gtk.Button(stock=gtk.STOCK_ADD)
37 self.delBtn = gtk.Button(stock=gtk.STOCK_REMOVE)
38 self.updBtn = gtk.Button("Update")
39 hbox.add(self.addBtn)
40 hbox.add(self.delBtn)
41 hbox.add(self.updBtn)
42
43 sw = gtk.ScrolledWindow()
44 sw.set_shadow_type(gtk.SHADOW_ETCHED_IN)
45 sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
46 vbox.add(sw)
47
48 self.model = self.__createModel()
49 self.tv = gtk.TreeView(self.model)
50 self.tv.set_rules_hint(True)
51 self.tv.get_selection().set_mode(gtk.SELECTION_MULTIPLE)
52 self.tv.get_selection().connect("changed", self.selChanged)
53
54 self.__addColumns(self.tv)
55 sw.add(self.tv)
56
57 self.addBtn.connect("clicked", self.addBtnClicked)
58 self.delBtn.connect("clicked", self.delBtnClicked)
59 self.updBtn.connect("clicked", self.updBtnClicked)
60
61
62
63 def __createModel(self):
64 #Breakpoint number, position and a boolean flag indicating whether BP has been set
65 #at debugger yet
66 model = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING)
67
68 return model
69
70
71 def __addColumns(self, tv):
72
73 model = tv.get_model()
74
75 renderer = gtk.CellRendererText()
76 renderer.set_data("column", 0)
77 col = gtk.TreeViewColumn("No", renderer, text=0)
78 col.set_resizable(True)
79 tv.append_column(col)
80
81
82 renderer = gtk.CellRendererText()
83 renderer.set_data("column", 1)
84 col = gtk.TreeViewColumn("Specification", renderer, text=1)
85 col.set_resizable(True)
86 tv.append_column(col)
87
88
89 def selChanged(self, sel):
90 model, paths = sel.get_selected_rows()
91
92 if len(paths) > 0:
93 path = paths[0]
94 iter = model.get_iter(path)
95 bpspec, = model.get(iter, 1)
96 self.bpEntry.set_text(bpspec)
97
98
99
100 def addBreakpoint(self, file, lineno, cond=None):
101
102 no = self.debugger.setBreakpoint(file, lineno, cond)
103
104 if no!=None:
105 self.addBreakpointToList(no, file, lineno, cond)
106 else:
107 dialog = gtk.MessageDialog(None, \
108 gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, \
109 gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, \
110 "Invalid specification!")
111 dialog.run()
112 dialog.destroy()
113
114
115 def applyConfiguration(self, conf):
116 for b in conf.breakpoints:
117 self.addBreakpoint(b["file"], b["lineno"], b["cond"])
118 self.updateValues(None)
119
120 def fillConfiguration(self, conf):
121 iter = self.model.get_iter_first()
122 while iter != None:
123 spec, = self.model.get(iter, 1)
124 conf.parseBreak(spec)
125 iter = self.model.iter_next(iter)
126
127
128
129 def addBreakpointToList(self, no, file, lineno, cond=None):
130
131 if cond==None:
132 expr = "%s:%s" % (str(file), str(lineno))
133 else:
134 expr = "%s:%s if %s" % (str(file), str(lineno), str(cond))
135
136 iter = self.model.get_iter_first()
137 while iter != None:
138 newiter = self.model.iter_next(iter)
139 #Found a expression which is the same --> remove the breakpoint
140 if (expr,) == self.model.get(iter,1):
141 self.debugger.delBreakpoint(no)
142 return
143 iter = newiter
144
145 #Add the entry to the breakpoint list
146 iter = self.model.append()
147 self.model.set(iter, 0, no)
148 self.model.set(iter, 1, expr)
149
150
151 def addBtnClicked(self, btn):
152
153 if not self.debugger.isActive():
154 return
155
156
157 bpspec = self.bpEntry.get_text()
158 bpspec = bpspec.strip()
159 rx = re.compile("^[\w/\._\-]+:\d+(\s+if\s+\S+.*)?$")
160
161 #Check if format is correct
162 if not rx.search(bpspec):
163 dialog = gtk.MessageDialog(None, \
164 gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, \
165 gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, \
166 "Invalid format!")
167 dialog.run()
168 dialog.destroy()
169 return
170
171
172 ifsplit = string.split(bpspec, "if")
173
174 if len(ifsplit)>1:
175 cond = ifsplit[1].strip()
176 else:
177 cond = None
178
179 pos = ifsplit[0].strip()
180 [file,lineno] = string.split(pos, ":")
181
182 self.addBreakpoint(file, lineno, cond)
183
184
185
186
187 def delBtnClicked(self, btn):
188
189 if not self.debugger.isActive():
190 return
191
192 selection = self.tv.get_selection()
193 model, paths = selection.get_selected_rows()
194
195 for path in reversed(paths):
196 iter = model.get_iter(path)
197 bpno, = self.model.get(iter, 0)
198 self.debugger.delBreakpoint(bpno)
199 model.remove(iter)
200
201
202 def updBtnClicked(self, btn):
203
204 if not self.debugger.isActive():
205 return
206
207 self.updateValues(None)
208
209
210 def updateValues(self, pos):
211
212 bpnts = self.debugger.getBreakpoints()
213
214 #Remove them all
215 iter = self.model.get_iter_first()
216 while iter != None:
217 newiter = self.model.iter_next(iter)
218 self.model.remove(iter)
219 iter = newiter
220
221 for bp in bpnts:
222 [no, file, lineno, cond] = bp
223 self.addBreakpointToList(no, file, lineno, cond)
224
225
226