Add LICENSE
[pygdb.git] / PositionFrame.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 os
11 import string
12 import vte
13
14 import DbgTerminal
15 import StatusFrame
16
17
18 class PositionFrame (StatusFrame.StatusFrame):
19
20
21 def __init__(self, debugger, statuswnd):
22
23 StatusFrame.StatusFrame.__init__(self, debugger)
24 self.set_label("Position")
25
26 self.statuswnd = statuswnd
27 debugger.gotActiveCallback += [self.updateValues]
28 debugger.gotInactiveCallback += [self.updateValues]
29
30 self.file = None
31 self.bt = None
32 self.lineno = 0
33
34 vbox = gtk.VBox(False, 5)
35 self.add(vbox)
36
37 hbox = gtk.HBox(False, 10)
38 vbox.pack_start(hbox, False, False)
39 self.openBtn = gtk.Button(":e")
40 hbox.pack_start(self.openBtn, False, False)
41 self.positionLabel = gtk.Label()
42 hbox.pack_start(self.positionLabel, False, False)
43
44 sw = gtk.ScrolledWindow()
45 sw.set_shadow_type(gtk.SHADOW_ETCHED_IN)
46 sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
47 vbox.add(sw)
48
49 self.model = self.__createModel()
50 self.tv = gtk.TreeView(self.model)
51 self.tv.set_rules_hint(True)
52 self.tv.get_selection().set_mode(gtk.SELECTION_MULTIPLE)
53 self.tv.connect("row-activated", self.rowactivated)
54
55 self.__addColumns(self.tv)
56 sw.add(self.tv)
57
58 self.openBtn.connect("clicked", self.openBtnClicked)
59
60
61 def __createModel(self):
62 model = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING, \
63 gobject.TYPE_STRING, gobject.TYPE_STRING)
64
65 return model
66
67
68 def __addColumns(self, tv):
69
70 model = tv.get_model()
71
72 renderer = gtk.CellRendererText()
73 renderer.set_data("column", 0)
74 col = gtk.TreeViewColumn("Addr", renderer, text=0)
75 col.set_resizable(True)
76 tv.append_column(col)
77
78 renderer = gtk.CellRendererText()
79 renderer.set_data("column", 1)
80 col = gtk.TreeViewColumn("Func", renderer, text=1)
81 col.set_resizable(True)
82 tv.append_column(col)
83
84 renderer = gtk.CellRendererText()
85 renderer.set_data("column", 2)
86 col = gtk.TreeViewColumn("File", renderer, text=2)
87 col.set_resizable(True)
88 tv.append_column(col)
89
90 renderer = gtk.CellRendererText()
91 renderer.set_data("column", 3)
92 col = gtk.TreeViewColumn("Lin", renderer, text=3)
93 col.set_resizable(True)
94 tv.append_column(col)
95
96
97 def openBtnClicked(self, btn):
98
99 if not self.debugger.isActive():
100 return
101
102 if self.file!=None:
103 try:
104 cmd = 'gvim --servername pygdb -c ":GDBLoadConfig" %s' % (self.file)
105 os.system(cmd)
106 except OSError:
107 dialog = gtk.MessageDialog(None, \
108 gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, \
109 gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, \
110 "Error calling editor with '%s'." % cmd)
111 dialog.run()
112 dialog.destroy()
113
114
115 def rowactivated(self, tv, path, col, *w):
116 no, = path
117 no = int(no)
118 entry = self.bt[no]
119 self.statuswnd.gotoVim(entry[2], entry[3])
120
121
122
123 def updateValues(self, status, param):
124
125
126 #Remove them all
127 iter = self.model.get_iter_first()
128 while iter != None:
129 newiter = self.model.iter_next(iter)
130 self.model.remove(iter)
131 iter = newiter
132
133
134 if status == "break":
135
136
137 #Set current file position
138 self.file, self.lineno = param
139 self.positionLabel.set_label("%s:%d" % (self.file, self.lineno))
140
141 #Add the entries
142 self.bt = self.debugger.getBacktrace()
143 for [addr, func, file, lineno] in self.bt:
144 iter = self.model.append()
145
146 if addr!=None:
147 self.model.set(iter, 0, addr)
148
149 self.model.set(iter, 1, func)
150 self.model.set(iter, 2, file)
151 self.model.set(iter, 3, lineno)
152
153
154
155 else:
156 self.file, self.lineno = None, None
157 self.bt = None
158 code = ""
159
160 if status == "exited":
161 self.positionLabel.set_label("Exited with code %d." % param)
162 elif status == "started":
163 self.positionLabel.set_label("Started.")
164 elif status == "continued":
165 self.positionLabel.set_label("Continued.")
166 else:
167 self.positionLabel.set_label(status)
168
169
170
171
172 def applyConfiguration(self, conf):
173 pass
174
175 def fillConfiguration(self, conf):
176 conf.setCurrpos(self.file, self.lineno)
177