1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 from flumotion.common import messages
23 from flumotion.configure import configure
24
25 from gettext import gettext as _
26
27 import os
28 import time
29 import gtk
30
31 _stock_icons = {messages.ERROR: gtk.STOCK_DIALOG_ERROR,
32 messages.WARNING: gtk.STOCK_DIALOG_WARNING,
33 messages.INFO: gtk.STOCK_DIALOG_INFO}
34
35 _headings = {messages.ERROR: _('Error'),
36 messages.WARNING: _('Warning'),
37 messages.INFO: _('Note')}
38
59
60
62 """
63 I am a widget that can show messages.
64 """
65
66
67
69 gtk.VBox.__init__(self)
70
71 h1 = gtk.HBox()
72 self.pack_start(h1, False, False, 0)
73 self.label = gtk.Label()
74 self.label.show()
75 h1.pack_start(self.label, False, False, 6)
76
77
78 h2 = gtk.HBox()
79 h1.pack_end(h2, False, False, 0)
80 s = gtk.HSeparator()
81 self.pack_start(s, False, False, 6)
82 sw = gtk.ScrolledWindow()
83 sw.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
84 sw.set_shadow_type(gtk.SHADOW_NONE)
85 self.pack_start(sw, True, True, 0)
86
87
88
89 tv = gtk.TextView()
90 tv.set_wrap_mode(gtk.WRAP_WORD)
91 tv.set_left_margin(6)
92 tv.set_right_margin(6)
93 tv.set_accepts_tab(False)
94 tv.set_cursor_visible(False)
95 tv.set_editable(False)
96
97 sw.add(tv)
98
99 self.active_button = None
100 self.buttonbox = h2
101 self.textview = tv
102
103 self.show_all()
104 self.clear()
105
106 self._translator = messages.Translator()
107 localedir = os.path.join(configure.localedatadir, 'locale')
108
109 self._translator.addLocaleDir('flumotion', localedir)
110
112 """
113 Remove all messages and hide myself.
114 """
115 for i in self.buttonbox.get_children():
116 self.clear_message(i.message.id)
117 self.hide()
118
120 """
121 Add a message to me.
122 @type m: L{flumotion.common.messages.Message}
123 """
124 def on_toggled(b):
125
126 if not b.get_active():
127 if self.active_button == b:
128 b.set_active(True)
129 return
130 old_active = self.active_button
131 self.active_button = b
132 if old_active and old_active != b:
133 old_active.set_active(False)
134 buf = gtk.TextBuffer()
135
136
137 text = self._translator.translate(m)
138
139 if hasattr(m, 'timestamp'):
140 text += _("\nPosted on %s.\n") % time.strftime(
141 "%c", time.localtime(m.timestamp))
142 if m.debug:
143 text += "\n\n" + _("Debug information:\n") + m.debug
144 buf.set_text(text)
145 self.textview.set_buffer(buf)
146 self.label.set_markup('<b>%s</b>' %
147 _headings.get(m.level, _('Message')))
148
149
150
151 self.clear_message(m.id)
152
153
154 b = MessageButton(m)
155 b.sigid = b.connect('toggled', on_toggled)
156 b.show()
157 self.buttonbox.pack_start(b, False, False, 0)
158
159
160 kids = [(-w.message.level, w.message.priority, w) for w in self.buttonbox.get_children()]
161 kids.sort()
162 kids.reverse()
163 kids = [(i, kids[i][2]) for i in range(len(kids))]
164 for x in kids:
165 self.buttonbox.reorder_child(x[1], x[0])
166
167 if not self.active_button:
168 b.set_active(True)
169 elif b == kids[0][1]:
170 b.set_active(True)
171 self.show()
172
174 """
175 Clear all messages with the given id.
176 Will bring the remaining most important message to the front,
177 or hide the view completely if no messages are left.
178 """
179 for b in self.buttonbox.get_children():
180 if b.message.id == id:
181 self.buttonbox.remove(b)
182 b.disconnect(b.sigid)
183 b.sigid = 0
184 if not self.buttonbox.get_children():
185 self.active_button = None
186 self.hide()
187 elif self.active_button == b:
188 self.active_button = self.buttonbox.get_children()[0]
189 self.active_button.set_active(True)
190 return
191