Added log viewer
[gregoa/zavai.git] / src / app_log.vala
1 /*
2  * app_log - zavai log applet
3  *
4  * Copyright (C) 2010  Enrico Zini <enrico@enricozini.org>
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  */
20
21 namespace zavai {
22 namespace ui {
23 namespace logview {
24
25 public class Log : Applet
26 {
27     protected Gtk.ScrolledWindow scroll_list;
28     protected Gtk.ListStore model;
29     protected Gtk.TreeView list;
30     protected Gtk.CellRendererText rend_name;
31     protected Gtk.Frame details_frame;
32     protected Gtk.ScrolledWindow details_scroll;
33     protected Gtk.TextBuffer details;
34     protected Gtk.TextView details_view;
35
36     public Log()
37     {
38         _label = "Log";
39
40         model = new Gtk.ListStore(3, typeof(string), typeof(string), typeof(bool));
41         model.set_sort_column_id(1, Gtk.SortType.DESCENDING);
42
43         rend_name = new Gtk.CellRendererText();
44
45         list = new Gtk.TreeView.with_model(model);
46         list.insert_column_with_attributes (-1, "Name", rend_name, "text", 1, "strikethrough", 2, null);
47         //list.insert_column_with_attributes (-1, "Notes", new Gtk.CellRendererText(), "text", 1);
48
49         scroll_list = new Gtk.ScrolledWindow(null, null);
50         scroll_list.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC);
51         scroll_list.add(list);
52
53         details_frame = new Gtk.Frame("Entry details");
54         details = new Gtk.TextBuffer(null);
55         details_view = new Gtk.TextView.with_buffer(details);
56         details_view.wrap_mode = Gtk.WrapMode.WORD;
57         details_view.cursor_visible = false;
58         details_view.editable = false;
59         details_scroll = new Gtk.ScrolledWindow(null, null);
60         details_scroll.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC);
61         details_scroll.add(details_view);
62         details_frame.add(details_scroll);
63
64         pack_start(scroll_list, true, true, 0);
65         pack_start(details_frame, true, true, 0);
66
67         list.cursor_changed += on_row_selected;
68     }
69
70     private void render_details(zavai.log.Log l)
71     {
72         details.text = "";
73         details.insert_at_cursor("%s: %s\n".printf(l.tag, l.title), -1);
74
75         for (weak List<zavai.log.LogEntry> i = l.entries; i != null; i = i.next)
76         {
77             // We are displaying it to the user, so use local timezone
78             var t = Time.local(i.data.ts);
79             string formatted = t.format("%Y-%m-%d %H:%M:%S");
80             details.insert_at_cursor("%s: %s\n".printf(formatted, i.data.msg), -1);
81             // public double lat;
82             // public double lon;
83         }
84     }
85
86     private void on_row_selected(Gtk.TreeView tv)
87     {
88         Gtk.TreePath path;
89         list.get_cursor(out path, null);
90
91         Gtk.TreeIter iter;
92         if (!model.get_iter(out iter, path)) return;
93
94         Value vdir, vname;
95         model.get_value(iter, 0, out vdir);
96         model.get_value(iter, 1, out vname);
97
98         string pathname = vdir.get_string() + "/" + vname.get_string();
99         zavai.log.Log l = zavai.log.log.load(pathname);
100         render_details(l);
101
102         // l.acked
103
104         // model.set(iter, 0, d); // set new dir
105         //selected((int)year, (int)month, (int)day);
106     }
107
108     public void refresh()
109     {
110         model.clear();
111
112         zavai.log.log.list_entries((d, f) => {
113             Gtk.TreeIter iter;
114             model.insert_with_values(out iter, -1, 0, d, 1, f, 2, false, -1);
115             return true;
116         });
117     }
118
119     public override void start()
120     {
121         refresh();
122     }
123     public override void stop()
124     {
125     }
126 }
127
128 public Log log;
129
130 public void init()
131 {
132     log = new Log();
133     zavai.menu_misc.add_applet(log);
134 }
135
136 }
137 }
138 }