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