summaryrefslogtreecommitdiff
path: root/portato/gui/gtk/views.py
blob: 46f8c657c1bad1de3fef547c62c0acd352794bac (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
# -*- coding: utf-8 -*-
#
# File: portato/gui/gtk/views.py
# This file is part of the Portato-Project, a graphical portage-frontend.
#
# Copyright (C) 2006-2007 René 'Necoro' Neumann
# This is free software.  You may redistribute copies of it under the terms of
# the GNU General Public License version 2.
# There is NO WARRANTY, to the extent permitted by law.
#
# Written by René 'Necoro' Neumann <necoro@necoro.net>

from __future__ import absolute_import, with_statement

import pango
import gtksourceview2
import logging

class HighlightView (gtksourceview2.View):

	def __init__ (self, get_file_fn, languages = []):
		self.get_fn = get_file_fn

		man = gtksourceview2.LanguageManager()
		
		language = None
		old_lang = None
		for lang in languages:
			if old_lang and not language:
				warning(_("No %(old)s language file installed. Falling back to %(new)s."), {"old" : old_lang, "new" : lang})
			language = man.get_language(lang)
			old_lang = lang

		if not language and old_lang:
			warning(_("No %(old)s language file installed. Disable highlighting."), {"old" : old_lang})

		buf = gtksourceview2.Buffer()
		buf.set_language(language)

		gtksourceview2.View.__init__(self, buf)

		self.set_editable(False)
		self.set_cursor_visible(False)
		self.connect("map", self.cb_mapped)

		self.pkg = None
		self.updated = False

	def update (self, pkg):
		self.pkg = pkg
		self.updated = True
		
	def cb_mapped (self, *args):
		if self.updated and self.pkg:
			try:
				with open(self.get_fn(self.pkg)) as f:
					lines = f.readlines()
			except IOError, e:
				lines = _("Error: %s") % e.strerror

			self.get_buffer().set_text("".join(lines))

		return False

class LogView (logging.Handler):

	colors = (
			(logging.DEBUG, "debug", "blue"),
			(logging.INFO, "info", "green"),
			(logging.WARNING, "warning", "yellow"),
			(-1, "error", "red")
			)

	def __init__ (self, view):
		logging.Handler.__init__(self, logging.DEBUG)

		self.view = view
		self.buf = view.get_buffer()

		# set tags
		for lvl, name, color in self.colors:
			self.buf.create_tag("log_%s" % name, foreground = color,weight = pango.WEIGHT_BOLD)
		
		logging.getLogger("portatoLogger").addHandler(self)

	def emit (self, record):
		iter = self.buf.get_end_iter()
		
		for lvl, name, color in self.colors:
			if lvl == -1 or record.levelno <= lvl:
				tag = "log_%s" % name
				break

		self.buf.insert_with_tags_by_name(iter, "* ", tag)
		self.buf.insert_at_cursor(record.getMessage()+"\n")