2
# -.- coding: utf-8 -.-
6
# Copyright © 2012 Manish Sinha <manishsinha@ubuntu.com>
7
# Copyright © 2012 Dhananjay Sathe <dhananjaysathe@gmail.com>
9
# This program is free software: you can redistribute it and/or modify it
10
# under the terms of the GNU Lesser General Public License as published
11
# by the Free Software Foundation, either version 2 of the License, or
12
# (at your option) any later version.
14
# This program is distributed in the hope that it will be useful, but
15
# WITHOUT ANY WARRANTY; without even the implied warranty of
16
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17
# See the GNU Lesser General Public License for more details.
19
# You should have received a copy of the GNU Lesser General Public License
20
# along with this program. If not, see <http://www.gnu.org/licenses/>.";
23
from datetime import datetime
24
from gi.repository import Gtk, Gdk, Gio
25
from zeitgeist.datamodel import Event, Subject, Manifestation, \
26
Interpretation, StorageState, Symbol, ResultType
28
from lookupdata import *
30
# workaround for Gtk ComboBoxText Widgets
31
def get_active_text(combobox):
32
model = combobox.get_model()
33
active = combobox.get_active()
36
return model[active][0]
38
class EventsViewer(Gtk.VBox):
43
super(EventsViewer, self).__init__()
45
self.scroll = Gtk.ScrolledWindow(None, None,border_width=1,shadow_type=Gtk.ShadowType.IN)
46
self.scroll.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC)
47
self.pack_start(self.scroll, True, True, 6)
49
self.treeview = EventsTreeView()
50
self.treeview.set_selection_changed_cb(self.on_event_selected)
51
self.scroll.add(self.treeview)
53
self.viewer = EventDetailsViewer()
54
self.pack_start(self.viewer, False, False, 6)
56
def on_event_selected(self, event_id):
57
event = self.events[event_id]
58
self.viewer.map(event)
60
def insert(self, events):
62
if event.id not in self.events.keys():
63
self.events[event.id] = event
64
self.treeview.add_events(events)
68
self.viewer.map(Event.new_for_values(subjects=[Subject()]))
69
self.treeview.set_events([])
71
class EventsTreeView(Gtk.TreeView):
73
# TODO: It may make sense to use GenericTreeModel here.
75
_selection_changed_cb = None
78
super(EventsTreeView, self).__init__()
80
# event id, timestamp, interpretation, manifestation, actor
82
self._store = Gtk.ListStore(int, str, str, str, str) # GObject.TYPE_PYOBJECT)
83
self.set_model(self._store)
84
self.set_search_column(0)
86
col = self._create_column(_('ID'), 0)
87
col = self._create_column(_('Timestamp'), 1)
88
col = self._create_column(_('Interpretation'), 2)
89
col = self._create_column(_('Manifestation'), 3)
90
col = self._create_column(_('Actor'), 4)
92
self.connect('button-press-event', self._on_click)
93
self.connect('cursor-changed', self._on_selection_changed)
95
def _create_column(self, name, data_col, cell_renderer=Gtk.CellRendererText()):
96
column = Gtk.TreeViewColumn(name, cell_renderer)
97
column.set_expand(True)
98
column.set_resizable(True)
99
column.set_sort_column_id(data_col)
100
column.add_attribute(cell_renderer, 'text', data_col)
101
self.append_column(column)
102
return (column, cell_renderer)
105
def _get_data_from_event(self, event):
106
x, y = (int(round(event.x)), int(round(event.y)))
107
treepath = self.get_path_at_pos(x, y)[0]
108
treeiter = self._store.get_iter(treepath)
109
return self._store.get_value(treeiter, 3)
112
def _on_click(self, widget, event):
113
if event.type == Gdk.EventType._2BUTTON_PRESS:
114
data = self._get_data_from_event(event)
115
if isinstance(data, Event):
116
details.EventDetails(data)
117
elif isinstance(data, Subject):
118
details.SubjectDetails(data)
120
print 'Unknown row selected.'
122
def _on_selection_changed(self, widget):
123
selection = self.get_selection()
125
model, _iter = selection.get_selected()
127
event_id = model.get(_iter, 0)[0]
128
if self._selection_changed_cb:
129
self._selection_changed_cb(event_id)
132
def add_event(self, event):
133
self._store.append([event.id, event.date_string,
134
event.interp_string, event.manif_string, unicode(event.actor)])
135
#event_iter = self._store.append(None, [event.id, event.date_string,
136
# event.interp_string, event.manif_string, unicode(event.actor)])
137
#for subject in event.subjects:
138
# self._store.append(event_iter, [None, subject.text,
139
# subject.interp_string, subject.manif_string, subject.mimetype])
140
#self.expand_row(event_iter)
142
def add_events(self, events):
143
map(self.add_event, events)
145
def set_events(self, events):
147
self.add_events(events)
150
def set_selection_changed_cb(self, cb):
151
self._selection_changed_cb = cb
153
class EventDetailsViewer(Gtk.VBox):
157
super(EventDetailsViewer, self).__init__()
159
self.table = Gtk.Table(18, 4, False,border_width=1)
160
self.pack_start(self.table, False, False, 6)
162
id_label = Gtk.Label(xalign=0,yalign=0.5)
163
id_label.set_markup("<b>%s</b>" %("Event ID"))
165
self.id_entry = Gtk.Label(xalign=0,yalign=0.5)
167
time_label = Gtk.Label(xalign=0,yalign=0.5)
168
time_label.set_markup("<b>%s</b>" %("Timestamp"))
170
self.time_entry = Gtk.Label(xalign=0,yalign=0.5)
172
event_int_label = Gtk.Label(xalign=0,yalign=0.5)
173
event_int_label.set_markup("<b>%s</b>" %("Interpretation"))
175
self.event_int_entry = Gtk.Label(xalign=0,yalign=0.5)
177
event_manifes_label = Gtk.Label(xalign=0,yalign=0.5)
178
event_manifes_label.set_markup("<b>%s</b>" %("Manifestation"))
180
self.event_manifes_entry = Gtk.Label(xalign=0,yalign=0.5)
182
actor_label = Gtk.Label(xalign=0,yalign=0.5)
183
actor_label.set_markup("<b>%s</b>" %("Actor"))
185
self.actor_entry = Gtk.Label(xalign=0,yalign=0.5)
187
actor_box = Gtk.HBox()
188
self.image_entry = Gtk.Image(xalign=0,yalign=0.5)
189
actor_box.pack_start(self.image_entry, False, False, 6)
190
self.actor_name_entry = Gtk.Label(xalign=0,yalign=0.5)
191
actor_box.pack_start(self.actor_name_entry, False, False, 6)
193
uri_label = Gtk.Label(xalign=0,yalign=0.5)
194
uri_label.set_markup("<b>%s</b>" %("URI"))
196
self.uri_entry = Gtk.Label(xalign=0,yalign=0.5)
198
current_uri_label = Gtk.Label(xalign=0,yalign=0.5)
199
current_uri_label.set_markup("<b>%s</b>" %("Current URI"))
201
self.current_uri_entry = Gtk.Label(xalign=0,yalign=0.5)
203
subj_int_label = Gtk.Label(xalign=0,yalign=0.5)
204
subj_int_label.set_markup("<b>%s</b>" %("Interpretation"))
206
self.subj_int_entry = Gtk.Label(xalign=0,yalign=0.5)
208
subj_manifes_label = Gtk.Label(xalign=0,yalign=0.5)
209
subj_manifes_label.set_markup("<b>%s</b>" %("Manifestation"))
211
self.subj_manifes_entry = Gtk.Label(xalign=0,yalign=0.5)
214
origin_label = Gtk.Label(xalign=0,yalign=0.5)
215
origin_label.set_markup("<b>%s</b>" %("Origin"))
217
self.origin_entry = Gtk.Label(xalign=0,yalign=0.5)
219
mimetype_label = Gtk.Label(xalign=0,yalign=0.5)
220
mimetype_label.set_markup("<b>%s</b>" %("Mimetype"))
222
self.mime_entry = Gtk.Label(xalign=0,yalign=0.5)
224
text_label = Gtk.Label(xalign=0,yalign=0.5)
225
text_label.set_markup("<b>%s</b>" %("Text"))
227
self.text_entry = Gtk.Label(xalign=0,yalign=0.5)
229
storage_label = Gtk.Label(xalign=0,yalign=0.5)
230
storage_label.set_markup("<b>%s</b>" %("Storage"))
232
self.storage_entry = Gtk.Label(xalign=0,yalign=0.5)
235
(id_label,(0, 1, 0, 1)),
236
(self.id_entry,(1, 2, 0, 1)),
237
(time_label,(2, 3, 0, 1)),
238
(self.time_entry,(3, 4, 0, 1)),
239
(event_int_label,(0, 1, 1, 2)),
240
(self.event_int_entry,(1, 4, 1, 2)),
241
(event_manifes_label,(0, 1, 2, 3)),
242
(self.event_manifes_entry,(1, 4, 2, 3)),
243
(actor_label,(0, 1, 3, 4)),
244
(self.actor_entry,(1, 2, 3, 4)),
245
(actor_box,(2, 4, 3, 4)),
246
(uri_label,(0, 1, 4, 5)),
247
(self.uri_entry,(1, 4, 4, 5)),
248
(current_uri_label,(0, 1, 5, 6)),
249
(self.current_uri_entry,(1, 4, 5, 6)),
250
(subj_int_label,(0, 1, 6, 7)),
251
(self.subj_int_entry,(1, 4, 6, 7)),
252
(subj_manifes_label,(0, 1, 7, 8)),
253
(self.subj_manifes_entry,(1, 4, 7, 8)),
254
(origin_label,(0, 1, 8, 9)),
255
(self.origin_entry,(1, 2, 8, 9)),
256
(mimetype_label,(2, 3, 8, 9)),
257
(self.mime_entry,(3, 4, 8, 9)),
258
(text_label,(0, 1, 9, 10)),
259
(self.text_entry,(1, 2, 9, 10)),
260
(storage_label,(2, 3, 9, 10)),
261
(self.storage_entry,(3, 4, 9, 10))
263
for widget_entry in attach_list:
264
widget,pos = widget_entry
265
self.table.attach(widget,pos[0],pos[1], pos[2], pos[3], xpadding=6, ypadding=6)
267
def map(self, event):
269
id_val = int(event.get_id())
270
self.id_entry.set_text(str(id_val) if id_val > 0 else "")
272
timestamp = int(str(event.get_timestamp()))
273
time = datetime.fromtimestamp(timestamp/1000).strftime("%Y-%m-%d %I:%M:%S %p")
274
self.time_entry.set_text(time if id_val > 0 else "")
276
self.id_entry.set_text("")
277
self.time_entry.set_text("")
279
self.event_int_entry.set_text(str(event.get_interpretation()))
280
self.event_manifes_entry.set_text(str(event.get_manifestation()))
282
actor = str(event.get_actor())
283
self.actor_entry.set_label(actor)
285
if actor.startswith("application://"):
286
app_info = Gio.DesktopAppInfo.new(actor.replace("application://", ""))
287
self.image_entry.set_from_gicon(app_info.get_icon(), Gtk.IconSize.DIALOG)
288
self.actor_name_entry.set_text(app_info.get_display_name())
290
self.image_entry.clear()
291
self.actor_name_entry.set_text("")
293
if len(event.subjects) > 0:
294
subj = event.subjects[0]
296
self.uri_entry.set_text(str(subj.get_uri()))
297
self.current_uri_entry.set_text(str(subj.get_current_uri()))
299
self.subj_int_entry.set_text(str(subj.get_interpretation()))
300
self.subj_manifes_entry.set_text(str(subj.get_manifestation()))
302
self.origin_entry.set_text(str(subj.get_origin()))
303
self.mime_entry.set_text(subj.get_mimetype())
305
txt = str(subj.get_text())
306
self.text_entry.set_text(txt)
308
#print unicode(subj.get_text().strip(codecs.BOM_UTF8), 'utf-8')
309
self.text_entry.set_text("")
310
self.storage_entry.set_text(str(subj.get_storage()))