1
2 import gtk
3 import gtk.glade
4
5 import envi.cli as e_cli
6
7 import vwidget.layout as vw_layout
8 import vwidget.menubuilder as vw_menu
9 import vwidget.memview as vw_memview
10
11 from envi.threads import firethread
12 from vwidget.main import idlethread
13
14 -class MainWindow(vw_layout.LayoutWindow):
15 """
16 A nice main text window with a CLI input and history etc...
17 """
18 - def __init__(self, cli, memobj, syms=None):
19 vw_layout.LayoutWindow.__init__(self)
20 self.cli = cli
21 self.connect("key-press-event", self.keypressed)
22
23 self.vbox = gtk.VBox()
24 self.menubar = vw_menu.MenuBar()
25
26 self.add(self.vbox)
27 self.vbox.pack_start(self.menubar, expand=False)
28 toolbar = self.getMainToolbar()
29 if toolbar != None:
30 self.vbox.pack_start(toolbar, expand=False)
31
32 self.canvas = vw_memview.ScrolledMemoryView(memobj, syms=syms)
33 self.canvas.textview.set_property("wrap_mode", gtk.WRAP_WORD)
34 self.vbox.pack_start(self.canvas, expand=True)
35
36
37 if isinstance(cli, e_cli.EnviCli):
38 cli.setCanvas(self.canvas)
39
40 entry = gtk.Entry()
41 entry.connect("activate", self.cli_activate)
42 entry.connect("key-press-event", self.entrykeypressed)
43 self.vbox.pack_start(entry, expand=False)
44 self.entry = entry
45
46 self.history = []
47 self.histidx = 0
48 entry.grab_focus()
49
50 @idlethread
51 - def _sensitive_entry(self, sensitive):
52
53 self.entry.set_sensitive(sensitive)
54 if sensitive:
55 self.entry.grab_focus()
56
59
60 - def useHistory(self, entry, delta):
61 if delta < 0 and self.histidx == 0:
62 return
63
64 if delta > 0 and len(self.history) <= self.histidx+delta:
65 self.histidx = len(self.history)
66 entry.set_text("")
67 return
68
69 self.histidx += delta
70 htext = self.history[self.histidx]
71 entry.set_text(htext)
72 entry.set_position(-1)
73
74 - def entrykeypressed(self, entry, event):
75 if event.keyval == 65362:
76 self.useHistory(entry, -1)
77 return True
78 elif event.keyval == 65364:
79 self.useHistory(entry, 1)
80 return True
81 return False
82
83 @firethread
84 - def onecmd(self, cmd):
85 '''
86 Issue a single command with proper history tracking etc...
87 (fires a thread to do it...)
88 '''
89 self._sensitive_entry(False)
90 try:
91 cmd = self.cli.precmd(cmd)
92 self.canvas.write("%s %s\n" % (self.cli.prompt,cmd))
93 self.cli.onecmd(cmd)
94 self.addHistory(cmd)
95 finally:
96 self._sensitive_entry(True)
97
98 - def keypressed(self, window, event):
99 fkbase = 65469
100 fkey = event.keyval - fkbase
101 if fkey >= 1 and fkey < 13:
102 self.onecmd("<f%d>" % fkey)
103
104 elif event.keyval == 65299:
105 self.onecmd("break")
106
107 - def addHistory(self, histcmd):
108 self.history.append(histcmd)
109 self.histidx = len(self.history)
110
111 - def cli_activate(self, entry):
112 cmd = entry.get_text()
113 entry.set_text("")
114 self.onecmd(cmd)
115
118 """
119 A class for all vdb/vivisect windows to inherit from. Full of
120 little utilities that make GUI writing slightly less painful.
121
122 When inheriting from this class, you *must* make your classname
123 the same as the top level window object in your glade project.
124 """
125
127 self.glade = gtk.glade.XML(fname)
128 self.glade.signal_autoconnect(self)
129 self.getWidget(self.__class__.__name__).connect("delete_event", self.delete)
130 self.notebook_groups = {}
131 self.vwlayout = layout
132
133 - def delete(self, window, event):
136
138 """
139 Returns a tuple of (x, y, xsize, ysize) for later use in setGeometry()
140 """
141 win = self.getWidget(self.__class__.__name__)
142 x, y = win.get_position()
143 xsize, ysize = win.get_size()
144 return (x, y, xsize, ysize)
145
147 win = self.getWidget(self.__class__.__name__)
148 win.move(geom[0], geom[1])
149 win.resize(geom[2], geom[3])
150
152 widget = self.getWidget(self.__class__.__name__)
153 if widget:
154 widget.set_title(title)
155
157 wid = self.getWidget(widgetname)
158 wid.set_sensitive(sensitive)
159
161 wid = self.glade.get_widget(wName)
162 if not wid:
163 raise Exception("ERROR - Can't find widget %s" % wName)
164 return wid.get_text()
165
168
171
174