1# -.- coding: utf-8 -.- 2# 3# Zeitgeist Explorer 4# 5# Copyright © 2011 Collabora Ltd. 6# By Siegfried-Angel Gevatter Pujals <siegfried@gevatter.com> 7# Copyright © 2010 Siegfried Gevatter <siegfried@gevatter.com> 8# 9# This program is free software: you can redistribute it and/or modify 10# it under the terms of the GNU General Public License as published by 11# the Free Software Foundation, either version 2 of the License, or 12# (at your option) any later version. 13# 14# This program is distributed in the hope that it will be useful, 15# but WITHOUT ANY WARRANTY; without even the implied warranty of 16# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17# GNU Lesser General Public License for more details. 18# 19# You should have received a copy of the GNU General Public License 20# along with this program. If not, see <http://www.gnu.org/licenses/>. 21 22import gtk 23import gobject 24 25from zeitgeist.datamodel import Interpretation, Manifestation 26 27import ontology 28 29class _DetailsWindow(gtk.Window): 30 31 _main_box = None 32 _main_table = None 33 34 def __init__(self, *args, **kwargs): 35 super(_DetailsWindow, self).__init__() 36 self.set_resizable(False) 37 38 self._main_box = gtk.VBox() 39 self.add(self._main_box) 40 41 self._build_window(*args, **kwargs) 42 43 button_box = gtk.HBox() 44 button_box.pack_start(gtk.Label("")) 45 close_button = gtk.Button(stock=gtk.STOCK_CLOSE) 46 close_button.connect('clicked', lambda *discard: self.destroy()) 47 button_box.pack_start(close_button, False) 48 self._main_box.pack_start(button_box, True, False) 49 close_button.grab_focus() 50 51 self.show_all() 52 53 def _add_title(self, title_text): 54 title = gtk.Label() 55 title.set_markup('<b>%s</b>' % title_text) 56 title.set_alignment(0, 0) 57 title.set_padding(5, 5) 58 title.set_selectable(True) 59 self._main_box.pack_start(title, False) 60 61 def _add_table_entry(self, pos, label, value, tooltip=None, info=None): 62 entry_label = gtk.Label() 63 entry_label.set_markup('<b>%s:</b>' % label) 64 entry_label.set_alignment(0, 0) 65 entry_label.set_selectable(True) 66 67 value_label = gtk.Label() 68 if value: 69 value_label.set_text(value) 70 else: 71 value_label.set_markup('<i>%s</i>' % _('No value')) 72 value_label.set_alignment(0, 0) 73 value_label.set_selectable(True) 74 75 if tooltip: 76 value_label.set_tooltip_text(tooltip) 77 78 self._main_table.attach(entry_label, 0, 1, pos, pos + 1, 79 xoptions=gtk.FILL, yoptions=gtk.FILL, xpadding=5, ypadding=5) 80 self._main_table.attach(value_label, 1, 2, pos, pos + 1, 81 yoptions=gtk.FILL, xpadding=5, ypadding=5) 82 83 if info: 84 info_image = gtk.Image() 85 info_image.set_from_stock(gtk.STOCK_INFO, gtk.ICON_SIZE_BUTTON) 86 info_button = gtk.Button() 87 info_button.set_image(info_image) 88 info_button.connect('clicked', lambda *discard: info()) 89 self._main_table.attach(info_button, 2, 3, pos, pos + 1, 90 xoptions=gtk.FILL, yoptions=gtk.FILL) 91 92 def _add_table_separator(self, pos): 93 self._main_table.attach(gtk.HSeparator(), 0, 3, pos, pos + 1) 94 95class EventDetails(_DetailsWindow): 96 97 _event = None 98 _subjects_view = None 99 100 def _build_window(self, event): 101 self.set_title(_('Event #%s: %s') % (event.id, event.date_string)) 102 self._event = event 103 104 self._add_title(_('Event #%s') % event.id) 105 106 self._main_table = gtk.Table(5, 3) 107 self._main_box.pack_start(self._main_table, False) 108 109 timestamp_text = '%s (%.3f)' % (event.date_string, 110 int(event.timestamp) / 1000.0) 111 self._add_table_entry(0, _('Timestamp'), timestamp_text) 112 self._add_table_entry(1, _('Interpretation'), event.interp_string, 113 event.interpretation, ontology.EventInterpretationHelp) 114 self._add_table_entry(2, _('Manifestation'), event.manif_string, 115 event.manifestation, ontology.EventManifestationHelp) 116 self._add_table_entry(3, _('Actor'), event.actor) 117 self._add_table_entry(4, _('Origin'), event.origin) 118 119 self._subjects_view = EventSubjectsTreeView() 120 self._main_box.pack_start(self._subjects_view, False) 121 122 for subject in event.subjects: 123 self._subjects_view.add_subject(subject) 124 125class SubjectDetails(_DetailsWindow): 126 127 _subject = None 128 129 def _build_window(self, subject): 130 self.set_title(_('Subject: %s') % subject.text) 131 self._subject = subject 132 133 self._add_title(_('Subject: %s') % subject.text) 134 135 self._main_table = gtk.Table(8, 3) 136 self._main_box.pack_start(self._main_table, False) 137 138 self._add_table_entry(0, _('URI'), subject.uri) 139 self._add_table_entry(1, _('Interpretation'), subject.interp_string, 140 subject.interpretation, ontology.SubjectInterpretationHelp) 141 self._add_table_entry(2, _('Manifestation'), subject.manif_string, 142 subject.manifestation, ontology.SubjectManifestationHelp) 143 self._add_table_entry(3, _('Origin'), subject.origin) 144 self._add_table_entry(4, _('MIME-Type'), subject.mimetype) 145 self._add_table_entry(5, _('Storage'), subject.storage) 146 self._add_table_separator(6) 147 self._add_table_entry(7, _('Current URI'), subject.current_uri) 148 149 self.show_all() 150 151class EventSubjectsTreeView(gtk.TreeView): 152 153 _store = None 154 155 def __init__(self): 156 super(EventSubjectsTreeView, self).__init__() 157 158 self._store = gtk.TreeStore(str, str, str, gobject.TYPE_PYOBJECT) 159 self.set_model(self._store) 160 self.set_search_column(0) 161 162 col = self._create_column(_('Subject'), 0) 163 col = self._create_column(_('Interpretation'), 1) 164 col = self._create_column(_('Manifestation'), 2) 165 166 self.connect('button-press-event', self._on_click) 167 168 def _get_data_from_event(self, event): 169 x, y = (int(round(event.x)), int(round(event.y))) 170 treepath = self.get_path_at_pos(x, y)[0] 171 treeiter = self._store.get_iter(treepath) 172 return self._store.get_value(treeiter, 3) 173 174 def _on_click(self, widget, event): 175 if event.type == gtk.gdk._2BUTTON_PRESS: 176 data = self._get_data_from_event(event) 177 SubjectDetails(data) 178 179 def _create_column(self, name, data_col, cell_renderer=gtk.CellRendererText()): 180 column = gtk.TreeViewColumn(name, cell_renderer) 181 column.set_expand(True) 182 column.set_sort_column_id(data_col) 183 column.add_attribute(cell_renderer, 'text', data_col) 184 self.append_column(column) 185 return (column, cell_renderer) 186 187 def add_subject(self, subject): 188 self._store.append(None, [ 189 subject.text, 190 Interpretation[subject.interpretation].display_name, 191 Manifestation[subject.manifestation].display_name, 192 subject]) 193 194# vim:noexpandtab:ts=4:sw=4 195