- fixing ssh problem
[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 bpspec = bpspec.strip()
96 rx = re.compile("^[\w\._\-]+:\d+(\s+if\s+\S+.*)?$")
97
98 #Check if format is correct
99 if not rx.search(bpspec):
100 dialog = gtk.MessageDialog(None, \
101 gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, \
102 gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, \
103 "Invalid format!")
104 dialog.run()
105 dialog.destroy()
106 return
107
108
109 ifsplit = string.split(bpspec, "if")
110
111 if len(ifsplit)>1:
112 cond = ifsplit[1].strip()
113 else:
114 cond = None
115
116 pos = ifsplit[0].strip()
117 [file,lineno] = string.split(pos, ":")
118
119 self.addBreakpoint(file, lineno, cond)
120
121
122
123 def addBreakpoint(self, file, lineno, cond=None):
124
125 no = self.debugger.setBreakpoint(file, lineno, cond)
126
127 if no!=None:
128 self.addBreakpointToList(no, file, lineno, cond)
129 else:
130 dialog = gtk.MessageDialog(None, \
131 gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, \
132 gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, \
133 "Invalid specification!")
134 dialog.run()
135 dialog.destroy()
136
137
138
139 def addBreakpointToList(self, no, file, lineno, cond=None):
140 iter = self.model.append()
141 self.model.set(iter, 0, no)
142
143 if cond==None:
144 self.model.set(iter, 1, "%s:%s" % (str(file), str(lineno)))
145 else:
146 self.model.set(iter, 1, "%s:%s if %s" % (str(file), str(lineno), str(cond)))
147
148
149
150 def delBtnClicked(self, btn):
151
152 if not self.debugger.isActive():
153 return
154
155 selection = self.tv.get_selection()
156 model, paths = selection.get_selected_rows()
157
158 for path in paths:
159 iter = model.get_iter(path)
160 bpno, = self.model.get(iter, 0)
161 self.debugger.delBreakpoint(bpno)
162 model.remove(iter)
163
164
165 def updBtnClicked(self, btn):
166
167 if not self.debugger.isActive():
168 return
169
170 self.updateValues()
171
172
173 def updateValues(self):
174
175 bpnts = self.debugger.getBreakpoints()
176
177 #Remove them all
178 iter = self.model.get_iter_first()
179 while iter != None:
180 newiter = self.model.iter_next(iter)
181 self.model.remove(iter)
182 iter = newiter
183
184 for bp in bpnts:
185 [no, file, lineno, cond] = bp
186 self.addBreakpointToList(no, file, lineno, cond)
187
188
189