Coccinelle release-1.0.0-rc11
[bpt/coccinelle.git] / python / coccilib / coccigui / coccigui.py
1 import pygtk
2 pygtk.require("2.0")
3 import sys, gtk, gtk.glade, gobject, os, locale, gettext
4 from pycoccimodel import *
5 import vimembed, vimcom
6
7 class VimCallback(object):
8 def __init__(self, app):
9 self.app = app
10
11 def vim_new_serverlist(self, serverlist):
12 self.app.vimcom.stop_fetching_serverlist()
13 self.app.vimcom.open_file(self.app.vimsock.get_server_name(), '~/.vimrc')
14
15 class pycocci(object):
16 def __init__(self):
17 self.local_path = os.path.realpath(os.path.dirname(sys.argv[0]))
18 self.initialize_translation()
19 self.gladefile = os.path.join(self.local_path, "coccilib/coccigui/pygui.glade")
20 self.wTree = gtk.glade.XML(self.gladefile, "mainWindow")
21 self.setup_tree_columns()
22 self.wTree.signal_autoconnect(self)
23 self.initialise_tree()
24 self.main_window = self.wTree.get_widget("mainWindow")
25
26 self.vimsock = vimembed.VimEmbedWidget('gvim', '~/.vimrc')
27 self.vimsock.visible = True
28 self.vbox1 = self.wTree.get_widget("vbox1")
29 self.vbox1.pack_end(self.vimsock)
30 self.setup_vim()
31
32 def setup_vim(self):
33 self.vimcb = VimCallback(self)
34 self.vimcom = vimcom.VimCom(self.vimcb)
35 self.vimsock.run()
36 self.vimsock.connect('destroy', self.on_vimsock_destroy)
37
38 def on_vimsock_destroy(self, widget):
39 self.setup_vim()
40
41 def initialise_tree(self):
42 tree_type_list = []
43 self.__column_dict = {}
44 self.bugTreeView = self.wTree.get_widget("bugView")
45 self.bugTreeView.set_rules_hint(True)
46
47 for c in self.__tree_columns:
48 self.__column_dict[c.id] = c
49 tree_type_list.append(c.type)
50
51 if c.visible:
52 column = gtk.TreeViewColumn(c.name, c.cellrenderer, text=c.pos)
53 column.set_resizable(True)
54 column.set_sort_column_id(c.pos)
55 self.bugTreeView.append_column(column)
56
57 self.bugTree = gtk.TreeStore(*tree_type_list)
58 self.bugTreeView.set_model(self.bugTree)
59 self.bugTreeView.connect('row-activated', self.row_activated)
60
61 def row_activated(self, view, path, view_column):
62 it = view.get_model().get_iter(path)
63 obj, objtype, bugdesc, file, line, col = view.get_model().get(it, 0, 1, 2, 3, 4, 5)
64
65 if file != '':
66 server = self.vimsock.get_server_name()
67
68 self.vimcom.open_file(server, file)
69 if line != '':
70 self.vimcom.send_ex(server, line)
71
72 if col != '':
73 self.vimcom.send_keys(server, col + '|')
74
75 def setup_tree_columns(self):
76 self.__tree_columns = [
77 pycoccicolumn(COL_OBJECT, gobject.TYPE_PYOBJECT, "object", 0),
78 pycoccicolumn(COL_OBJECT, gobject.TYPE_INT, "object_type", 1),
79 pycoccicolumn(COL_TITLE, gobject.TYPE_STRING, _("Bug type"), 2, True, gtk.CellRendererText()),
80 pycoccicolumn(COL_FILE, gobject.TYPE_STRING, _("File"), 3, True, gtk.CellRendererText()),
81 pycoccicolumn(COL_LINE, gobject.TYPE_STRING, _("Line"), 4, True, gtk.CellRendererText()),
82 pycoccicolumn(COL_COLUMN, gobject.TYPE_STRING, _("Column"), 5, True, gtk.CellRendererText())
83 ]
84
85 def initialize_translation(self):
86 langs = []
87 lc, encoding = locale.getdefaultlocale()
88 if lc:
89 langs = [lc]
90 language = os.environ.get('LANGUAGE', None)
91 if language:
92 langs += language.split(':')
93
94 gettext.bindtextdomain('pycocci', self.local_path)
95 gettext.textdomain('pycocci')
96 self.lang = gettext.translation('pycocci', self.local_path,
97 languages=langs, fallback = True)
98 gettext.install('pycocci', self.local_path)
99
100 def on_mainWindow_destroy(self, widget):
101 gtk.main_quit()
102
103 def add_result(self, cocci_file, l):
104 root = self.bugTreeView.get_model().get_iter_root()
105 it = None
106
107 while root != None:
108 c_cocci_file = self.bugTreeView.get_model().get(root, 2)[0]
109 if c_cocci_file == cocci_file:
110 it = root
111 break
112
113 root = self.bugTreeView.get_model().iter_next(root)
114
115 if it == None:
116 it = self.bugTree.insert_after(None, None, (None, 0, cocci_file, '', '', ''))
117
118 description, file, line, col = l[0]
119 mit = self.bugTree.append(it, (None, 1, description, file, line, col))
120
121 for i in xrange(1, len(l)):
122 description, file, line, col = l[i]
123 self.bugTree.append(mit, (None, 2, description, file, line, col))
124
125 #if __name__ == '__main__':
126 # app = pycocci()
127 # app.add_result('Test.cocci', [('Array identified: z', '/home/hstuart/thesis/py-cocci/tests/scripting/array/script4.c', '6', '7'), ('Array use: z', '/home/hstuart/thesis/py-cocci/tests/scripting/array/script4.c', '8', '3')])
128 # app.add_result('Test.cocci', [('Array identified: foo', '/home/hstuart/thesis/py-cocci/tests/scripting/array/script4.c', '12', '17')])
129 # gtk.main()