1 | /* ---------------------------------------------------------------------- |
---|
2 | |
---|
3 | Copyright (C) 1998 Cesar Miquel (miquel@df.uba.ar) |
---|
4 | |
---|
5 | This program is free software; you can redistribute it and/or modify |
---|
6 | it under the terms of the GNU General Public License as published by |
---|
7 | the Free Software Foundation; either version 2 of the License, or |
---|
8 | (at your option) any later version. |
---|
9 | |
---|
10 | This program is distributed in the hope that it will be useful, |
---|
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
---|
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
---|
13 | GNU General Public License for more details. |
---|
14 | |
---|
15 | You should have received a copy of the GNU General Public License |
---|
16 | along with this program; if not, write to the Free Software |
---|
17 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
---|
18 | |
---|
19 | ---------------------------------------------------------------------- */ |
---|
20 | |
---|
21 | |
---|
22 | #include <config.h> |
---|
23 | #include <gnome.h> |
---|
24 | #include <unistd.h> |
---|
25 | #include <time.h> |
---|
26 | #include <sys/stat.h> |
---|
27 | #include "logview.h" |
---|
28 | #include "gnome.h" |
---|
29 | |
---|
30 | /* |
---|
31 | * -------------------------- |
---|
32 | * Local and global variables |
---|
33 | * -------------------------- |
---|
34 | */ |
---|
35 | |
---|
36 | int zoom_visible; |
---|
37 | GtkWidget *zoom_dialog; |
---|
38 | static GtkWidget *scrolled_window = NULL; |
---|
39 | |
---|
40 | extern Log *curlog; |
---|
41 | extern char *month[12]; |
---|
42 | extern GList *regexp_db, *descript_db; |
---|
43 | extern GnomeUIInfo view_menu[]; |
---|
44 | |
---|
45 | void close_zoom_view (GtkWidget *widget, gpointer data); |
---|
46 | void quit_zoom_view (GtkWidget *widget, gpointer data); |
---|
47 | void create_zoom_view (void); |
---|
48 | int match_line_in_db (LogLine *line, GList *db); |
---|
49 | |
---|
50 | /* ---------------------------------------------------------------------- |
---|
51 | NAME: create_zoom_view |
---|
52 | DESCRIPTION: Display the statistics of the log. |
---|
53 | ---------------------------------------------------------------------- */ |
---|
54 | |
---|
55 | void |
---|
56 | create_zoom_view (void) |
---|
57 | { |
---|
58 | |
---|
59 | if (curlog == NULL || zoom_visible) |
---|
60 | return; |
---|
61 | |
---|
62 | if (zoom_dialog == NULL) { |
---|
63 | zoom_dialog = gtk_dialog_new_with_buttons (_("Zoom view"), |
---|
64 | GTK_WINDOW_TOPLEVEL, |
---|
65 | GTK_DIALOG_DESTROY_WITH_PARENT, |
---|
66 | GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, |
---|
67 | NULL); |
---|
68 | /* FIXME: no need to pass zoom_dialog - its global !! */ |
---|
69 | g_signal_connect (G_OBJECT (zoom_dialog), "response", |
---|
70 | G_CALLBACK (close_zoom_view), |
---|
71 | &zoom_dialog); |
---|
72 | g_signal_connect (G_OBJECT (zoom_dialog), "destroy", |
---|
73 | G_CALLBACK (quit_zoom_view), |
---|
74 | &zoom_dialog); |
---|
75 | g_signal_connect (G_OBJECT (zoom_dialog), "delete_event", |
---|
76 | G_CALLBACK (gtk_true), |
---|
77 | NULL); |
---|
78 | |
---|
79 | gtk_window_set_default_size (GTK_WINDOW (zoom_dialog), 500, 175); |
---|
80 | gtk_dialog_set_default_response (GTK_DIALOG (zoom_dialog), GTK_RESPONSE_CLOSE); |
---|
81 | gtk_container_set_border_width (GTK_CONTAINER (zoom_dialog), 0); |
---|
82 | |
---|
83 | repaint_zoom (); |
---|
84 | } |
---|
85 | gtk_widget_show (zoom_dialog); |
---|
86 | |
---|
87 | zoom_visible = TRUE; |
---|
88 | } |
---|
89 | |
---|
90 | /* ---------------------------------------------------------------------- |
---|
91 | NAME: repaint_zoom |
---|
92 | DESCRIPTION: Repaint the zoom window. |
---|
93 | ---------------------------------------------------------------------- */ |
---|
94 | |
---|
95 | int |
---|
96 | repaint_zoom (void) |
---|
97 | { |
---|
98 | static GtkWidget *zoom_tree; |
---|
99 | static GtkCellRenderer *renderer; |
---|
100 | static GtkTreeViewColumn *column1, *column2; |
---|
101 | static GtkListStore *store; |
---|
102 | const gchar *titles[] = { N_("Date:"), N_("Process:"), |
---|
103 | N_("Message:"), N_("Description:"), NULL }; |
---|
104 | GtkTreeIter iter; |
---|
105 | LogLine *line; |
---|
106 | struct tm date = {0}; |
---|
107 | char buffer[1024]; |
---|
108 | char *utf8; |
---|
109 | gint i; |
---|
110 | |
---|
111 | if (scrolled_window == NULL) { |
---|
112 | |
---|
113 | scrolled_window = gtk_scrolled_window_new (NULL, NULL); |
---|
114 | gtk_widget_set_sensitive (scrolled_window, TRUE); |
---|
115 | gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), |
---|
116 | GNOME_PAD_SMALL); |
---|
117 | gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), |
---|
118 | GTK_POLICY_AUTOMATIC, |
---|
119 | GTK_POLICY_AUTOMATIC); |
---|
120 | gtk_box_pack_start (GTK_BOX (GTK_DIALOG (zoom_dialog)->vbox), |
---|
121 | scrolled_window, TRUE, TRUE, 0); |
---|
122 | |
---|
123 | store = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_STRING); |
---|
124 | zoom_tree = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store)); |
---|
125 | gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (zoom_tree), TRUE); |
---|
126 | |
---|
127 | gtk_container_add (GTK_CONTAINER (scrolled_window), zoom_tree); |
---|
128 | |
---|
129 | /* Create Columns */ |
---|
130 | renderer = gtk_cell_renderer_text_new (); |
---|
131 | column1 = gtk_tree_view_column_new_with_attributes (_("Log line detail for"), |
---|
132 | renderer, "text", 0, NULL); |
---|
133 | gtk_tree_view_column_set_sizing (column1, GTK_TREE_VIEW_COLUMN_AUTOSIZE); |
---|
134 | gtk_tree_view_column_set_resizable (column1, TRUE); |
---|
135 | gtk_tree_view_append_column (GTK_TREE_VIEW (zoom_tree), column1); |
---|
136 | gtk_tree_view_column_set_spacing (column1, GNOME_PAD_BIG); |
---|
137 | |
---|
138 | renderer = gtk_cell_renderer_text_new (); |
---|
139 | column2 = gtk_tree_view_column_new_with_attributes ("", renderer, |
---|
140 | "text", 1, NULL); |
---|
141 | gtk_tree_view_column_set_sizing (column2, GTK_TREE_VIEW_COLUMN_AUTOSIZE); |
---|
142 | gtk_tree_view_column_set_resizable (column2, TRUE); |
---|
143 | gtk_tree_view_append_column (GTK_TREE_VIEW (zoom_tree), column2); |
---|
144 | gtk_tree_view_column_set_spacing (column2, GNOME_PAD_BIG); |
---|
145 | |
---|
146 | /* Add entries to the list */ |
---|
147 | for (i = 0; titles[i]; ++i) { |
---|
148 | gtk_list_store_append (GTK_LIST_STORE (store), &iter); |
---|
149 | gtk_list_store_set (GTK_LIST_STORE (store), &iter, 0, titles[i], -1); |
---|
150 | } |
---|
151 | |
---|
152 | } |
---|
153 | |
---|
154 | if (curlog != NULL) |
---|
155 | g_snprintf (buffer, sizeof (buffer), "%s", curlog->name); |
---|
156 | else |
---|
157 | g_snprintf (buffer, sizeof (buffer), _("<No log loaded>")); |
---|
158 | gtk_tree_view_column_set_title (column2, buffer); |
---|
159 | |
---|
160 | gtk_widget_show_all (scrolled_window); |
---|
161 | |
---|
162 | /* Check that there is at least one log */ |
---|
163 | if (curlog == NULL) { |
---|
164 | gtk_list_store_clear (GTK_LIST_STORE (store)); |
---|
165 | /* Add entries to the list */ |
---|
166 | for (i = 0; titles[i]; ++i) { |
---|
167 | gtk_list_store_append (GTK_LIST_STORE (store), &iter); |
---|
168 | gtk_list_store_set (GTK_LIST_STORE (store), &iter, 0, titles[i], -1); |
---|
169 | } |
---|
170 | return -1; |
---|
171 | } |
---|
172 | |
---|
173 | if (gtk_tree_model_get_iter_root (GTK_TREE_MODEL (store), &iter)) { |
---|
174 | line = (curlog->lines)[curlog->current_line_no]; |
---|
175 | |
---|
176 | date.tm_mon = line->month; |
---|
177 | date.tm_year = 70 /* bogus */; |
---|
178 | date.tm_mday = line->date; |
---|
179 | date.tm_hour = line->hour; |
---|
180 | date.tm_min = line->min; |
---|
181 | date.tm_sec = line->sec; |
---|
182 | date.tm_isdst = 0; |
---|
183 | |
---|
184 | /* Translators: do not include year, it would be bogus */ |
---|
185 | if (strftime (buffer, sizeof (buffer), _("%B %e %X"), &date) <= 0) { |
---|
186 | /* as a backup print in US style */ |
---|
187 | utf8 = g_strdup_printf ("%s %d %02d:%02d:%02d", |
---|
188 | _(month[(int)line->month]), |
---|
189 | (int) line->date, |
---|
190 | (int) line->hour, |
---|
191 | (int) line->min, |
---|
192 | (int) line->sec); |
---|
193 | } else { |
---|
194 | utf8 = LocaleToUTF8 (buffer); |
---|
195 | } |
---|
196 | |
---|
197 | gtk_list_store_set (GTK_LIST_STORE (store), &iter, 1, utf8, -1); |
---|
198 | g_free (utf8); |
---|
199 | |
---|
200 | gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter); |
---|
201 | utf8 = LocaleToUTF8 (line->process); |
---|
202 | gtk_list_store_set (GTK_LIST_STORE (store), &iter, 1, utf8, -1); |
---|
203 | g_free (utf8); |
---|
204 | |
---|
205 | gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter); |
---|
206 | utf8 = LocaleToUTF8 (line->message); |
---|
207 | gtk_list_store_set (GTK_LIST_STORE (store), &iter, 1, utf8, -1); |
---|
208 | g_free (utf8); |
---|
209 | |
---|
210 | gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter); |
---|
211 | if (match_line_in_db (line, regexp_db)) |
---|
212 | if (find_tag_in_db (line, descript_db)) { |
---|
213 | utf8 = LocaleToUTF8 (line->description->description); |
---|
214 | gtk_list_store_set (GTK_LIST_STORE (store), &iter, 1, utf8, -1); |
---|
215 | g_free (utf8); |
---|
216 | } |
---|
217 | |
---|
218 | } |
---|
219 | |
---|
220 | return TRUE; |
---|
221 | |
---|
222 | } |
---|
223 | |
---|
224 | /* ---------------------------------------------------------------------- |
---|
225 | NAME: CloseLogInfo |
---|
226 | DESCRIPTION: Callback called when the log info window is closed. |
---|
227 | ---------------------------------------------------------------------- */ |
---|
228 | |
---|
229 | void |
---|
230 | close_zoom_view (GtkWidget *widget, gpointer data) |
---|
231 | { |
---|
232 | if (zoom_visible) { |
---|
233 | gtk_widget_hide (GTK_WIDGET (zoom_dialog)); |
---|
234 | gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (view_menu[1].widget), FALSE); |
---|
235 | /* |
---|
236 | if (G_IS_OBJECT (zoom_layout)) |
---|
237 | g_object_unref (G_OBJECT (zoom_layout)); */ |
---|
238 | } |
---|
239 | zoom_dialog = NULL; |
---|
240 | scrolled_window = NULL; |
---|
241 | zoom_visible = FALSE; |
---|
242 | } |
---|
243 | |
---|
244 | void |
---|
245 | quit_zoom_view (GtkWidget *widget, gpointer data) { |
---|
246 | |
---|
247 | zoom_dialog = NULL; |
---|
248 | scrolled_window = NULL; |
---|
249 | } |
---|