summaryrefslogtreecommitdiff
path: root/grc/gui/ParseDialog.py
diff options
context:
space:
mode:
Diffstat (limited to 'grc/gui/ParseDialog.py')
-rw-r--r--grc/gui/ParseDialog.py108
1 files changed, 53 insertions, 55 deletions
diff --git a/grc/gui/ParseDialog.py b/grc/gui/ParseDialog.py
index 93fa108e81..119ad2c69b 100644
--- a/grc/gui/ParseDialog.py
+++ b/grc/gui/ParseDialog.py
@@ -19,77 +19,75 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
import pygtk
pygtk.require('2.0')
-import gtk, glib
+import gtk
-from Dialogs import TextDisplay
from Constants import MIN_DIALOG_WIDTH, MIN_DIALOG_HEIGHT
-def get_title_label(title):
- """
- Get a title label for the params window.
- The title will be bold, underlined, and left justified.
-
- Args:
- title: the text of the title
-
- Returns:
- a gtk object
- """
- label = gtk.Label()
- label.set_markup('\n<b><span underline="low">%s</span>:</b>\n'%title)
- hbox = gtk.HBox()
- hbox.pack_start(label, False, False, padding=11)
- return hbox
class ParseDialog(gtk.Dialog):
"""
A dialog for viewing parser errors
"""
- def __init__(self, errors):
+ def __init__(self, error_logs):
"""
- Properties dialog contructor.
+ Properties dialog constructor.
Args:
block: a block instance
"""
- self._hash = 0
- LABEL_SPACING = 7
- gtk.Dialog.__init__(self,
- title='Parser Errors',
- buttons=(gtk.STOCK_OK, gtk.RESPONSE_ACCEPT),
- )
-
- self._errors = errors;
-
- # set up data model
- model = gtk.TreeStore(str)
- for k in self._errors.keys():
- n = model.append(None, [str(k)]);
- for e in self._errors[k]:
- # http://lxml.de/api/lxml.etree._LogEntry-class.html
- em = model.append(n, [ "(%s:%s:%s) %s %s %s"%(e.filename, e.line, e.column, e.level_name, e.domain_name, e.message) ] )
- try:
- sf = open(e.filename,'r');
- lc = sf.readlines()[e.line].rstrip('\n');
- model.append(em, [ lc] )
- except:
- model.append(em, ["could not access source file"] )
-
-
- view = gtk.TreeView(model)
- tvcolumn = gtk.TreeViewColumn('XML Parser Errors by Filename')
- view.append_column(tvcolumn)
- cell = gtk.CellRendererText()
- tvcolumn.pack_start(cell, True)
- tvcolumn.add_attribute(cell, 'text', 0)
- view.set_search_column(0)
- tvcolumn.set_sort_column_id(0)
- view.set_reorderable(True)
-
- self.vbox.add(view);
+ gtk.Dialog.__init__(self, title='Parser Errors', buttons=(gtk.STOCK_CLOSE, gtk.RESPONSE_ACCEPT))
+
+ self._error_logs = None
+ self.tree_store = gtk.TreeStore(str)
+ self.update_tree_store(error_logs)
+
+ column = gtk.TreeViewColumn('XML Parser Errors by Filename')
+ renderer = gtk.CellRendererText()
+ column.pack_start(renderer, True)
+ column.add_attribute(renderer, 'text', 0)
+ column.set_sort_column_id(0)
+
+ self.tree_view = tree_view = gtk.TreeView(self.tree_store)
+ tree_view.set_enable_search(False) #disable pop up search box
+ tree_view.set_search_column(-1) # really disable search
+ tree_view.set_reorderable(False)
+ tree_view.set_headers_visible(False)
+ tree_view.get_selection().set_mode(gtk.SELECTION_NONE)
+ tree_view.append_column(column)
+
+ for row in self.tree_store:
+ tree_view.expand_row(row.path, False)
+
+ scrolled_window = gtk.ScrolledWindow()
+ scrolled_window.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
+ scrolled_window.add_with_viewport(tree_view)
+
+ self.vbox.pack_start(scrolled_window, True)
+ self.set_size_request(2*MIN_DIALOG_WIDTH, MIN_DIALOG_HEIGHT)
self.show_all()
+ def update_tree_store(self, error_logs):
+ """set up data model"""
+ self.tree_store.clear()
+ self._error_logs = error_logs
+ for filename, errors in error_logs.iteritems():
+ parent = self.tree_store.append(None, [str(filename)])
+ try:
+ with open(filename, 'r') as fp:
+ code = fp.readlines()
+ except EnvironmentError:
+ code = None
+ for error in errors:
+ # http://lxml.de/api/lxml.etree._LogEntry-class.html
+ em = self.tree_store.append(parent, ["Line {e.line}: {e.message}".format(e=error)])
+ if code:
+ self.tree_store.append(em, ["\n".join(
+ "{} {}{}".format(line, code[line - 1].replace("\t", " ").strip("\n"),
+ " " * 20 + "<!-- ERROR -->" if line == error.line else "")
+ for line in range(error.line - 2, error.line + 3) if 0 < line <= len(code)
+ )])
+
def run(self):
"""
Run the dialog and get its response.