17 class BreakpointsFrame (StatusFrame
.StatusFrame
):
20 def __init__(self
, debugger
):
22 StatusFrame
.StatusFrame
.__init
__(self
, debugger
)
23 self
.set_label("Breakpoints")
25 vbox
= gtk
.VBox(False, 5)
29 vbox
.pack_start(hbox
, False, False)
30 self
.bpEntry
= gtk
.Entry()
31 hbox
.add(self
.bpEntry
)
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")
43 sw
= gtk
.ScrolledWindow()
44 sw
.set_shadow_type(gtk
.SHADOW_ETCHED_IN
)
45 sw
.set_policy(gtk
.POLICY_AUTOMATIC
, gtk
.POLICY_AUTOMATIC
)
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
)
54 self
.__addColumns
(self
.tv
)
57 self
.addBtn
.connect("clicked", self
.addBtnClicked
)
58 self
.delBtn
.connect("clicked", self
.delBtnClicked
)
59 self
.updBtn
.connect("clicked", self
.updBtnClicked
)
63 def __createModel(self
):
64 #Breakpoint number, position and a boolean flag indicating whether BP has been set
66 model
= gtk
.ListStore(gobject
.TYPE_STRING
, gobject
.TYPE_STRING
)
71 def __addColumns(self
, tv
):
73 model
= tv
.get_model()
75 renderer
= gtk
.CellRendererText()
76 renderer
.set_data("column", 0)
77 col
= gtk
.TreeViewColumn("No", renderer
, text
=0)
78 col
.set_resizable(True)
82 renderer
= gtk
.CellRendererText()
83 renderer
.set_data("column", 1)
84 col
= gtk
.TreeViewColumn("Specification", renderer
, text
=1)
85 col
.set_resizable(True)
89 def selChanged(self
, sel
):
90 model
, paths
= sel
.get_selected_rows()
94 iter = model
.get_iter(path
)
95 bpspec
, = model
.get(iter, 1)
96 self
.bpEntry
.set_text(bpspec
)
100 def addBreakpoint(self
, file, lineno
, cond
=None):
102 no
= self
.debugger
.setBreakpoint(file, lineno
, cond
)
105 self
.addBreakpointToList(no
, file, lineno
, cond
)
107 dialog
= gtk
.MessageDialog(None, \
108 gtk
.DIALOG_MODAL | gtk
.DIALOG_DESTROY_WITH_PARENT
, \
109 gtk
.MESSAGE_ERROR
, gtk
.BUTTONS_OK
, \
110 "Invalid specification!")
115 def applyConfiguration(self
, conf
):
116 for b
in conf
.breakpoints
:
117 self
.addBreakpoint(b
["file"], b
["lineno"], b
["cond"])
119 def fillConfiguration(self
, conf
):
120 iter = self
.model
.get_iter_first()
122 spec
, = self
.model
.get(iter, 1)
123 conf
.parseBreak(spec
)
124 iter = self
.model
.iter_next(iter)
128 def addBreakpointToList(self
, no
, file, lineno
, cond
=None):
129 iter = self
.model
.append()
130 self
.model
.set(iter, 0, no
)
133 self
.model
.set(iter, 1, "%s:%s" % (str(file), str(lineno
)))
135 self
.model
.set(iter, 1, "%s:%s if %s" % (str(file), str(lineno
), str(cond
)))
138 def addBtnClicked(self
, btn
):
140 if not self
.debugger
.isActive():
144 bpspec
= self
.bpEntry
.get_text()
145 bpspec
= bpspec
.strip()
146 rx
= re
.compile("^[\w\._\-]+:\d+(\s+if\s+\S+.*)?$")
148 #Check if format is correct
149 if not rx
.search(bpspec
):
150 dialog
= gtk
.MessageDialog(None, \
151 gtk
.DIALOG_MODAL | gtk
.DIALOG_DESTROY_WITH_PARENT
, \
152 gtk
.MESSAGE_ERROR
, gtk
.BUTTONS_OK
, \
159 ifsplit
= string
.split(bpspec
, "if")
162 cond
= ifsplit
[1].strip()
166 pos
= ifsplit
[0].strip()
167 [file,lineno
] = string
.split(pos
, ":")
169 self
.addBreakpoint(file, lineno
, cond
)
174 def delBtnClicked(self
, btn
):
176 if not self
.debugger
.isActive():
179 selection
= self
.tv
.get_selection()
180 model
, paths
= selection
.get_selected_rows()
182 for path
in reversed(paths
):
183 iter = model
.get_iter(path
)
184 bpno
, = self
.model
.get(iter, 0)
185 self
.debugger
.delBreakpoint(bpno
)
189 def updBtnClicked(self
, btn
):
191 if not self
.debugger
.isActive():
194 self
.updateValues(None)
197 def updateValues(self
, pos
):
199 bpnts
= self
.debugger
.getBreakpoints()
202 iter = self
.model
.get_iter_first()
204 newiter
= self
.model
.iter_next(iter)
205 self
.model
.remove(iter)
209 [no
, file, lineno
, cond
] = bp
210 self
.addBreakpointToList(no
, file, lineno
, cond
)