Mercurial > pidgin.yaz
annotate src/gtklog.c @ 13663:b76c6de0c3b5
[gaim-migrate @ 16065]
Kill a number of trivial UNUSED_VALUE "defects":
CID 155
CID 156
CID 157
CID 158
CID 159
CID 160
CID 161
CID 162
CID 163
CID 165
CID 166
CID 167
CID 173
CID 174
CID 177
committer: Tailor Script <tailor@pidgin.im>
author | Richard Laager <rlaager@wiktel.com> |
---|---|
date | Wed, 19 Apr 2006 05:50:50 +0000 |
parents | 6034444bbcf5 |
children | 8bda65b88e49 |
rev | line source |
---|---|
7432 | 1 /** |
2 * @file gtklog.c GTK+ Log viewer | |
3 * @ingroup gtkui | |
4 * | |
5 * gaim | |
6 * | |
8046 | 7 * Gaim is the legal property of its developers, whose names are too numerous |
8 * to list here. Please refer to the COPYRIGHT file distributed with this | |
9 * source distribution. | |
7537
083427fd8ba8
[gaim-migrate @ 8150]
Christian Hammond <chipx86@chipx86.com>
parents:
7535
diff
changeset
|
10 * |
7432 | 11 * This program is free software; you can redistribute it and/or modify |
12 * it under the terms of the GNU General Public License as published by | |
13 * the Free Software Foundation; either version 2 of the License, or | |
14 * (at your option) any later version. | |
15 * | |
16 * This program is distributed in the hope that it will be useful, | |
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
19 * GNU General Public License for more details. | |
20 * | |
21 * You should have received a copy of the GNU General Public License | |
22 * along with this program; if not, write to the Free Software | |
23 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
24 */ | |
9791 | 25 #include "internal.h" |
26 #include "gtkgaim.h" | |
7432 | 27 |
28 #include "account.h" | |
29 #include "gtkblist.h" | |
30 #include "gtkimhtml.h" | |
31 #include "gtklog.h" | |
32 #include "gtkutils.h" | |
33 #include "log.h" | |
11769 | 34 #include "notify.h" |
10636 | 35 #include "util.h" |
7432 | 36 |
37 static GHashTable *log_viewers = NULL; | |
7535 | 38 static void populate_log_tree(GaimGtkLogViewer *lv); |
8573 | 39 static GaimGtkLogViewer *syslog_viewer = NULL; |
7432 | 40 |
41 struct log_viewer_hash_t { | |
10663 | 42 GaimLogType type; |
7432 | 43 char *screenname; |
44 GaimAccount *account; | |
10663 | 45 GaimContact *contact; |
7432 | 46 }; |
47 | |
7440 | 48 static guint log_viewer_hash(gconstpointer data) |
7432 | 49 { |
7440 | 50 const struct log_viewer_hash_t *viewer = data; |
51 | |
10663 | 52 if (viewer->contact != NULL) |
53 return g_direct_hash(viewer->contact); | |
54 | |
55 return g_str_hash(viewer->screenname) + | |
56 g_str_hash(gaim_account_get_username(viewer->account)); | |
7432 | 57 } |
58 | |
10663 | 59 static gboolean log_viewer_equal(gconstpointer y, gconstpointer z) |
7432 | 60 { |
7440 | 61 const struct log_viewer_hash_t *a, *b; |
7432 | 62 int ret; |
7440 | 63 char *normal; |
64 | |
65 a = y; | |
66 b = z; | |
67 | |
10663 | 68 if (a->contact != NULL) { |
69 if (b->contact != NULL) | |
70 return (a->contact == b->contact); | |
71 else | |
72 return FALSE; | |
73 } else { | |
74 if (b->contact != NULL) | |
75 return FALSE; | |
76 } | |
77 | |
7440 | 78 normal = g_strdup(gaim_normalize(a->account, a->screenname)); |
79 ret = (a->account == b->account) && | |
80 !strcmp(normal, gaim_normalize(b->account, b->screenname)); | |
7432 | 81 g_free(normal); |
10663 | 82 |
7432 | 83 return ret; |
84 } | |
85 | |
13568
6034444bbcf5
[gaim-migrate @ 15947]
Richard Laager <rlaager@wiktel.com>
parents:
13434
diff
changeset
|
86 static void select_first_log(GaimGtkLogViewer *lv) |
6034444bbcf5
[gaim-migrate @ 15947]
Richard Laager <rlaager@wiktel.com>
parents:
13434
diff
changeset
|
87 { |
6034444bbcf5
[gaim-migrate @ 15947]
Richard Laager <rlaager@wiktel.com>
parents:
13434
diff
changeset
|
88 GtkTreeModel *model; |
6034444bbcf5
[gaim-migrate @ 15947]
Richard Laager <rlaager@wiktel.com>
parents:
13434
diff
changeset
|
89 GtkTreeIter iter, it; |
6034444bbcf5
[gaim-migrate @ 15947]
Richard Laager <rlaager@wiktel.com>
parents:
13434
diff
changeset
|
90 GtkTreePath *path; |
6034444bbcf5
[gaim-migrate @ 15947]
Richard Laager <rlaager@wiktel.com>
parents:
13434
diff
changeset
|
91 |
6034444bbcf5
[gaim-migrate @ 15947]
Richard Laager <rlaager@wiktel.com>
parents:
13434
diff
changeset
|
92 model = GTK_TREE_MODEL(lv->treestore); |
6034444bbcf5
[gaim-migrate @ 15947]
Richard Laager <rlaager@wiktel.com>
parents:
13434
diff
changeset
|
93 |
6034444bbcf5
[gaim-migrate @ 15947]
Richard Laager <rlaager@wiktel.com>
parents:
13434
diff
changeset
|
94 if (!gtk_tree_model_get_iter_first(model, &iter)) |
6034444bbcf5
[gaim-migrate @ 15947]
Richard Laager <rlaager@wiktel.com>
parents:
13434
diff
changeset
|
95 return; |
6034444bbcf5
[gaim-migrate @ 15947]
Richard Laager <rlaager@wiktel.com>
parents:
13434
diff
changeset
|
96 |
6034444bbcf5
[gaim-migrate @ 15947]
Richard Laager <rlaager@wiktel.com>
parents:
13434
diff
changeset
|
97 path = gtk_tree_model_get_path(model, &iter); |
6034444bbcf5
[gaim-migrate @ 15947]
Richard Laager <rlaager@wiktel.com>
parents:
13434
diff
changeset
|
98 if (gtk_tree_model_iter_children(model, &it, &iter)) |
6034444bbcf5
[gaim-migrate @ 15947]
Richard Laager <rlaager@wiktel.com>
parents:
13434
diff
changeset
|
99 { |
6034444bbcf5
[gaim-migrate @ 15947]
Richard Laager <rlaager@wiktel.com>
parents:
13434
diff
changeset
|
100 gtk_tree_view_expand_row(GTK_TREE_VIEW(lv->treeview), path, TRUE); |
6034444bbcf5
[gaim-migrate @ 15947]
Richard Laager <rlaager@wiktel.com>
parents:
13434
diff
changeset
|
101 path = gtk_tree_model_get_path(model, &it); |
6034444bbcf5
[gaim-migrate @ 15947]
Richard Laager <rlaager@wiktel.com>
parents:
13434
diff
changeset
|
102 } |
6034444bbcf5
[gaim-migrate @ 15947]
Richard Laager <rlaager@wiktel.com>
parents:
13434
diff
changeset
|
103 |
6034444bbcf5
[gaim-migrate @ 15947]
Richard Laager <rlaager@wiktel.com>
parents:
13434
diff
changeset
|
104 gtk_tree_selection_select_path(gtk_tree_view_get_selection(GTK_TREE_VIEW(lv->treeview)), path); |
6034444bbcf5
[gaim-migrate @ 15947]
Richard Laager <rlaager@wiktel.com>
parents:
13434
diff
changeset
|
105 |
6034444bbcf5
[gaim-migrate @ 15947]
Richard Laager <rlaager@wiktel.com>
parents:
13434
diff
changeset
|
106 gtk_tree_path_free(path); |
6034444bbcf5
[gaim-migrate @ 15947]
Richard Laager <rlaager@wiktel.com>
parents:
13434
diff
changeset
|
107 } |
6034444bbcf5
[gaim-migrate @ 15947]
Richard Laager <rlaager@wiktel.com>
parents:
13434
diff
changeset
|
108 |
7535 | 109 static void search_cb(GtkWidget *button, GaimGtkLogViewer *lv) |
110 { | |
111 const char *search_term = gtk_entry_get_text(GTK_ENTRY(lv->entry)); | |
112 GList *logs; | |
10175 | 113 |
10663 | 114 if (lv->search != NULL) |
7535 | 115 g_free(lv->search); |
10175 | 116 |
11585 | 117 gtk_tree_store_clear(lv->treestore); |
12232
375f1f3817a8
[gaim-migrate @ 14534]
Richard Laager <rlaager@wiktel.com>
parents:
11869
diff
changeset
|
118 if (!(*search_term)) { |
375f1f3817a8
[gaim-migrate @ 14534]
Richard Laager <rlaager@wiktel.com>
parents:
11869
diff
changeset
|
119 /* reset the tree */ |
7535 | 120 populate_log_tree(lv); |
121 lv->search = NULL; | |
7537
083427fd8ba8
[gaim-migrate @ 8150]
Christian Hammond <chipx86@chipx86.com>
parents:
7535
diff
changeset
|
122 gtk_imhtml_search_clear(GTK_IMHTML(lv->imhtml)); |
13568
6034444bbcf5
[gaim-migrate @ 15947]
Richard Laager <rlaager@wiktel.com>
parents:
13434
diff
changeset
|
123 select_first_log(lv); |
7535 | 124 return; |
125 } | |
10175 | 126 |
7535 | 127 lv->search = g_strdup(search_term); |
13568
6034444bbcf5
[gaim-migrate @ 15947]
Richard Laager <rlaager@wiktel.com>
parents:
13434
diff
changeset
|
128 gtk_imhtml_clear(GTK_IMHTML(lv->imhtml)); |
10175 | 129 |
13434
ffd724befbf8
[gaim-migrate @ 15809]
Richard Laager <rlaager@wiktel.com>
parents:
13280
diff
changeset
|
130 gaim_gtk_set_cursor(lv->window, GDK_WATCH); |
10175 | 131 |
7535 | 132 for (logs = lv->logs; logs != NULL; logs = logs->next) { |
133 char *read = gaim_log_read((GaimLog*)logs->data, NULL); | |
12232
375f1f3817a8
[gaim-migrate @ 14534]
Richard Laager <rlaager@wiktel.com>
parents:
11869
diff
changeset
|
134 if (read && *read && gaim_strcasestr(read, search_term)) { |
7535 | 135 GtkTreeIter iter; |
136 GaimLog *log = logs->data; | |
12232
375f1f3817a8
[gaim-migrate @ 14534]
Richard Laager <rlaager@wiktel.com>
parents:
11869
diff
changeset
|
137 |
7535 | 138 gtk_tree_store_append (lv->treestore, &iter, NULL); |
139 gtk_tree_store_set(lv->treestore, &iter, | |
13119
fcde3faa1f57
[gaim-migrate @ 15481]
Richard Laager <rlaager@wiktel.com>
parents:
13104
diff
changeset
|
140 0, gaim_date_format_full(localtime(&log->time)), |
10175 | 141 1, log, -1); |
7535 | 142 } |
10574 | 143 g_free(read); |
7535 | 144 } |
10175 | 145 |
13568
6034444bbcf5
[gaim-migrate @ 15947]
Richard Laager <rlaager@wiktel.com>
parents:
13434
diff
changeset
|
146 select_first_log(lv); |
13434
ffd724befbf8
[gaim-migrate @ 15809]
Richard Laager <rlaager@wiktel.com>
parents:
13280
diff
changeset
|
147 gaim_gtk_clear_cursor(lv->window); |
7535 | 148 } |
149 | |
7454 | 150 static gboolean destroy_cb(GtkWidget *w, gint resp, struct log_viewer_hash_t *ht) { |
8573 | 151 GaimGtkLogViewer *lv = syslog_viewer; |
7454 | 152 |
10663 | 153 if (ht != NULL) { |
8573 | 154 lv = g_hash_table_lookup(log_viewers, ht); |
155 g_hash_table_remove(log_viewers, ht); | |
10663 | 156 |
157 if (ht->screenname != NULL) | |
158 g_free(ht->screenname); | |
159 | |
8573 | 160 g_free(ht); |
161 } else | |
162 syslog_viewer = NULL; | |
163 | |
13568
6034444bbcf5
[gaim-migrate @ 15947]
Richard Laager <rlaager@wiktel.com>
parents:
13434
diff
changeset
|
164 g_list_foreach(lv->logs, (GFunc)gaim_log_free, NULL); |
6034444bbcf5
[gaim-migrate @ 15947]
Richard Laager <rlaager@wiktel.com>
parents:
13434
diff
changeset
|
165 g_list_free(lv->logs); |
10663 | 166 |
167 if (lv->search != NULL) | |
7535 | 168 g_free(lv->search); |
10663 | 169 |
8573 | 170 g_free(lv); |
7454 | 171 gtk_widget_destroy(w); |
172 | |
173 return TRUE; | |
174 } | |
175 | |
10663 | 176 static void log_row_activated_cb(GtkTreeView *tv, GtkTreePath *path, GtkTreeViewColumn *col, GaimGtkLogViewer *viewer) { |
177 if (gtk_tree_view_row_expanded(tv, path)) | |
178 gtk_tree_view_collapse_row(tv, path); | |
179 else | |
180 gtk_tree_view_expand_row(tv, path, FALSE); | |
8573 | 181 } |
10663 | 182 |
7454 | 183 static void log_select_cb(GtkTreeSelection *sel, GaimGtkLogViewer *viewer) { |
12838
cb36bc2db7c5
[gaim-migrate @ 15186]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
184 GtkTreeIter iter; |
12600
e856f985a0b9
[gaim-migrate @ 14934]
Richard Laager <rlaager@wiktel.com>
parents:
12232
diff
changeset
|
185 GValue val; |
7432 | 186 GtkTreeModel *model = GTK_TREE_MODEL(viewer->treestore); |
187 GaimLog *log = NULL; | |
188 GaimLogReadFlags flags; | |
189 char *read = NULL; | |
190 | |
10663 | 191 if (!gtk_tree_selection_get_selected(sel, &model, &iter)) |
7432 | 192 return; |
12600
e856f985a0b9
[gaim-migrate @ 14934]
Richard Laager <rlaager@wiktel.com>
parents:
12232
diff
changeset
|
193 |
e856f985a0b9
[gaim-migrate @ 14934]
Richard Laager <rlaager@wiktel.com>
parents:
12232
diff
changeset
|
194 val.g_type = 0; |
7432 | 195 gtk_tree_model_get_value (model, &iter, 1, &val); |
196 log = g_value_get_pointer(&val); | |
197 g_value_unset(&val); | |
198 | |
10663 | 199 if (log == NULL) |
7432 | 200 return; |
201 | |
13434
ffd724befbf8
[gaim-migrate @ 15809]
Richard Laager <rlaager@wiktel.com>
parents:
13280
diff
changeset
|
202 gaim_gtk_set_cursor(viewer->window, GDK_WATCH); |
12232
375f1f3817a8
[gaim-migrate @ 14534]
Richard Laager <rlaager@wiktel.com>
parents:
11869
diff
changeset
|
203 |
10663 | 204 if (log->type != GAIM_LOG_SYSTEM) { |
205 char *title; | |
206 if (log->type == GAIM_LOG_CHAT) | |
13104
e1e5462b7d81
[gaim-migrate @ 15466]
Richard Laager <rlaager@wiktel.com>
parents:
13090
diff
changeset
|
207 title = g_strdup_printf(_("<span size='larger' weight='bold'>Conversation in %s on %s</span>"), |
13119
fcde3faa1f57
[gaim-migrate @ 15481]
Richard Laager <rlaager@wiktel.com>
parents:
13104
diff
changeset
|
208 log->name, |
fcde3faa1f57
[gaim-migrate @ 15481]
Richard Laager <rlaager@wiktel.com>
parents:
13104
diff
changeset
|
209 log->tm ? gaim_date_format_full(log->tm) : |
fcde3faa1f57
[gaim-migrate @ 15481]
Richard Laager <rlaager@wiktel.com>
parents:
13104
diff
changeset
|
210 gaim_date_format_full(localtime(&log->time))); |
10663 | 211 else |
13104
e1e5462b7d81
[gaim-migrate @ 15466]
Richard Laager <rlaager@wiktel.com>
parents:
13090
diff
changeset
|
212 title = g_strdup_printf(_("<span size='larger' weight='bold'>Conversation with %s on %s</span>"), |
13119
fcde3faa1f57
[gaim-migrate @ 15481]
Richard Laager <rlaager@wiktel.com>
parents:
13104
diff
changeset
|
213 log->name, |
fcde3faa1f57
[gaim-migrate @ 15481]
Richard Laager <rlaager@wiktel.com>
parents:
13104
diff
changeset
|
214 log->tm ? gaim_date_format_full(log->tm) : |
fcde3faa1f57
[gaim-migrate @ 15481]
Richard Laager <rlaager@wiktel.com>
parents:
13104
diff
changeset
|
215 gaim_date_format_full(localtime(&log->time))); |
10663 | 216 |
217 gtk_label_set_markup(GTK_LABEL(viewer->label), title); | |
218 g_free(title); | |
219 } | |
220 | |
7432 | 221 read = gaim_log_read(log, &flags); |
222 viewer->flags = flags; | |
10663 | 223 |
7432 | 224 gtk_imhtml_clear(GTK_IMHTML(viewer->imhtml)); |
10645 | 225 gtk_imhtml_set_protocol_name(GTK_IMHTML(viewer->imhtml), |
226 gaim_account_get_protocol_name(log->account)); | |
12838
cb36bc2db7c5
[gaim-migrate @ 15186]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
227 |
cb36bc2db7c5
[gaim-migrate @ 15186]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
228 gaim_signal_emit(gaim_gtk_log_get_handle(), "log-displaying", viewer, log); |
cb36bc2db7c5
[gaim-migrate @ 15186]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
229 |
10574 | 230 gtk_imhtml_append_text(GTK_IMHTML(viewer->imhtml), read, |
10175 | 231 GTK_IMHTML_NO_COMMENTS | GTK_IMHTML_NO_TITLE | GTK_IMHTML_NO_SCROLL | |
7432 | 232 ((flags & GAIM_LOG_READ_NO_NEWLINE) ? GTK_IMHTML_NO_NEWLINE : 0)); |
12232
375f1f3817a8
[gaim-migrate @ 14534]
Richard Laager <rlaager@wiktel.com>
parents:
11869
diff
changeset
|
233 g_free(read); |
7535 | 234 |
10663 | 235 if (viewer->search != NULL) { |
10574 | 236 gtk_imhtml_search_clear(GTK_IMHTML(viewer->imhtml)); |
7537
083427fd8ba8
[gaim-migrate @ 8150]
Christian Hammond <chipx86@chipx86.com>
parents:
7535
diff
changeset
|
237 gtk_imhtml_search_find(GTK_IMHTML(viewer->imhtml), viewer->search); |
10574 | 238 } |
10175 | 239 |
13434
ffd724befbf8
[gaim-migrate @ 15809]
Richard Laager <rlaager@wiktel.com>
parents:
13280
diff
changeset
|
240 gaim_gtk_clear_cursor(viewer->window); |
7432 | 241 } |
242 | |
243 /* I want to make this smarter, but haven't come up with a cool algorithm to do so, yet. | |
244 * I want the tree to be divided into groups like "Today," "Yesterday," "Last week," | |
245 * "August," "2002," etc. based on how many conversation took place in each subdivision. | |
246 * | |
247 * For now, I'll just make it a flat list. | |
248 */ | |
249 static void populate_log_tree(GaimGtkLogViewer *lv) | |
11585 | 250 /* Logs are made from trees in real life. |
7432 | 251 This is a tree made from logs */ |
252 { | |
13104
e1e5462b7d81
[gaim-migrate @ 15466]
Richard Laager <rlaager@wiktel.com>
parents:
13090
diff
changeset
|
253 const char *month; |
10663 | 254 char prev_top_month[30] = ""; |
9435 | 255 GtkTreeIter toplevel, child; |
7432 | 256 GList *logs = lv->logs; |
10663 | 257 |
258 while (logs != NULL) { | |
7432 | 259 GaimLog *log = logs->data; |
10175 | 260 |
13119
fcde3faa1f57
[gaim-migrate @ 15481]
Richard Laager <rlaager@wiktel.com>
parents:
13104
diff
changeset
|
261 month = gaim_utf8_strftime(_("%B %Y"), |
fcde3faa1f57
[gaim-migrate @ 15481]
Richard Laager <rlaager@wiktel.com>
parents:
13104
diff
changeset
|
262 log->tm ? log->tm : localtime(&log->time)); |
10175 | 263 |
13104
e1e5462b7d81
[gaim-migrate @ 15466]
Richard Laager <rlaager@wiktel.com>
parents:
13090
diff
changeset
|
264 if (strcmp(month, prev_top_month) != 0) |
e1e5462b7d81
[gaim-migrate @ 15466]
Richard Laager <rlaager@wiktel.com>
parents:
13090
diff
changeset
|
265 { |
9435 | 266 /* top level */ |
267 gtk_tree_store_append(lv->treestore, &toplevel, NULL); | |
268 gtk_tree_store_set(lv->treestore, &toplevel, 0, month, 1, NULL, -1); | |
10175 | 269 |
10680 | 270 strncpy(prev_top_month, month, sizeof(prev_top_month)); |
271 } | |
10175 | 272 |
10680 | 273 /* sub */ |
274 gtk_tree_store_append(lv->treestore, &child, &toplevel); | |
13104
e1e5462b7d81
[gaim-migrate @ 15466]
Richard Laager <rlaager@wiktel.com>
parents:
13090
diff
changeset
|
275 gtk_tree_store_set(lv->treestore, &child, |
13119
fcde3faa1f57
[gaim-migrate @ 15481]
Richard Laager <rlaager@wiktel.com>
parents:
13104
diff
changeset
|
276 0, log->tm ? gaim_date_format_full(log->tm) : gaim_date_format_full(localtime(&log->time)), |
13104
e1e5462b7d81
[gaim-migrate @ 15466]
Richard Laager <rlaager@wiktel.com>
parents:
13090
diff
changeset
|
277 1, log, |
e1e5462b7d81
[gaim-migrate @ 15466]
Richard Laager <rlaager@wiktel.com>
parents:
13090
diff
changeset
|
278 -1); |
10175 | 279 |
7432 | 280 logs = logs->next; |
281 } | |
282 } | |
283 | |
10663 | 284 static GaimGtkLogViewer *display_log_viewer(struct log_viewer_hash_t *ht, GList *logs, |
11585 | 285 const char *title, GdkPixbuf *pixbuf, int log_size) |
10663 | 286 { |
287 GaimGtkLogViewer *lv; | |
288 GtkWidget *title_box; | |
289 char *text; | |
11769 | 290 GtkWidget *pane; |
291 GtkWidget *sw; | |
292 GtkCellRenderer *rend; | |
293 GtkTreeViewColumn *col; | |
294 GtkTreeSelection *sel; | |
295 GtkWidget *vbox; | |
296 GtkWidget *frame; | |
297 GtkWidget *hbox; | |
298 GtkWidget *button; | |
299 GtkWidget *size_label; | |
7432 | 300 |
11769 | 301 if (logs == NULL) |
302 { | |
303 /* No logs were found. */ | |
304 const char *log_preferences = NULL; | |
305 | |
306 if (ht == NULL) { | |
307 if (!gaim_prefs_get_bool("/core/logging/log_system")) | |
308 log_preferences = _("System events will only be logged if the \"Log all status changes to system log\" preference is enabled."); | |
309 } else { | |
310 if (ht->type == GAIM_LOG_IM) { | |
311 if (!gaim_prefs_get_bool("/core/logging/log_ims")) | |
312 log_preferences = _("Instant messages will only be logged if the \"Log all instant messages\" preference is enabled."); | |
313 } else if (ht->type == GAIM_LOG_CHAT) { | |
314 if (!gaim_prefs_get_bool("/core/logging/log_chats")) | |
11869 | 315 log_preferences = _("Chats will only be logged if the \"Log all chats\" preference is enabled."); |
11769 | 316 } |
317 } | |
318 | |
319 gaim_notify_info(NULL, title, _("No logs were found"), log_preferences); | |
320 return NULL; | |
321 } | |
322 | |
13568
6034444bbcf5
[gaim-migrate @ 15947]
Richard Laager <rlaager@wiktel.com>
parents:
13434
diff
changeset
|
323 lv = g_new0(GaimGtkLogViewer, 1); |
6034444bbcf5
[gaim-migrate @ 15947]
Richard Laager <rlaager@wiktel.com>
parents:
13434
diff
changeset
|
324 lv->logs = logs; |
6034444bbcf5
[gaim-migrate @ 15947]
Richard Laager <rlaager@wiktel.com>
parents:
13434
diff
changeset
|
325 |
10663 | 326 if (ht != NULL) |
327 g_hash_table_insert(log_viewers, ht, lv); | |
7432 | 328 |
329 /* Window ***********/ | |
10663 | 330 lv->window = gtk_dialog_new_with_buttons(title, NULL, 0, |
7432 | 331 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, NULL); |
11243 | 332 gtk_container_set_border_width (GTK_CONTAINER(lv->window), GAIM_HIG_BOX_SPACE); |
7432 | 333 gtk_dialog_set_has_separator(GTK_DIALOG(lv->window), FALSE); |
334 gtk_box_set_spacing(GTK_BOX(GTK_DIALOG(lv->window)->vbox), 0); | |
10175 | 335 g_signal_connect(G_OBJECT(lv->window), "response", |
7454 | 336 G_CALLBACK(destroy_cb), ht); |
11004
a3d3729a9130
[gaim-migrate @ 12859]
Etan Reisner <pidgin@unreliablesource.net>
parents:
10884
diff
changeset
|
337 gtk_window_set_role(GTK_WINDOW(lv->window), "log_viewer"); |
7454 | 338 |
10663 | 339 /* Icon *************/ |
340 if (pixbuf != NULL) { | |
341 GdkPixbuf *scale; | |
342 GtkWidget *icon; | |
7432 | 343 |
11243 | 344 title_box = gtk_hbox_new(FALSE, GAIM_HIG_BOX_SPACE); |
345 gtk_container_set_border_width(GTK_CONTAINER(title_box), GAIM_HIG_BOX_SPACE); | |
10663 | 346 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(lv->window)->vbox), title_box, FALSE, FALSE, 0); |
347 | |
348 scale = gdk_pixbuf_scale_simple(pixbuf, 16, 16, GDK_INTERP_BILINEAR); | |
349 icon = gtk_image_new_from_pixbuf(scale); | |
350 gtk_box_pack_start(GTK_BOX(title_box), icon, FALSE, FALSE, 0); | |
351 g_object_unref(G_OBJECT(pixbuf)); | |
352 g_object_unref(G_OBJECT(scale)); | |
353 } else | |
354 title_box = GTK_DIALOG(lv->window)->vbox; | |
7432 | 355 |
356 /* Label ************/ | |
10663 | 357 lv->label = gtk_label_new(NULL); |
358 | |
359 text = g_strdup_printf("<span size='larger' weight='bold'>%s</span>", title); | |
9624 | 360 |
10663 | 361 gtk_label_set_markup(GTK_LABEL(lv->label), text); |
362 gtk_misc_set_alignment(GTK_MISC(lv->label), 0, 0); | |
363 gtk_box_pack_start(GTK_BOX(title_box), lv->label, FALSE, FALSE, 0); | |
7432 | 364 g_free(text); |
365 | |
11769 | 366 /* Pane *************/ |
367 pane = gtk_hpaned_new(); | |
368 gtk_container_set_border_width(GTK_CONTAINER(pane), GAIM_HIG_BOX_SPACE); | |
369 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(lv->window)->vbox), pane, TRUE, TRUE, 0); | |
7432 | 370 |
11769 | 371 /* List *************/ |
372 sw = gtk_scrolled_window_new (NULL, NULL); | |
373 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw), GTK_SHADOW_IN); | |
374 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS); | |
375 gtk_paned_add1(GTK_PANED(pane), sw); | |
376 lv->treestore = gtk_tree_store_new (2, G_TYPE_STRING, G_TYPE_POINTER); | |
377 lv->treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL (lv->treestore)); | |
378 rend = gtk_cell_renderer_text_new(); | |
379 col = gtk_tree_view_column_new_with_attributes ("time", rend, "markup", 0, NULL); | |
380 gtk_tree_view_append_column (GTK_TREE_VIEW(lv->treeview), col); | |
381 gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (lv->treeview), FALSE); | |
382 gtk_container_add (GTK_CONTAINER (sw), lv->treeview); | |
11402 | 383 |
11769 | 384 populate_log_tree(lv); |
11402 | 385 |
11769 | 386 sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (lv->treeview)); |
387 g_signal_connect (G_OBJECT (sel), "changed", | |
388 G_CALLBACK (log_select_cb), | |
389 lv); | |
390 g_signal_connect (G_OBJECT(lv->treeview), "row-activated", | |
391 G_CALLBACK(log_row_activated_cb), | |
392 lv); | |
393 gaim_set_accessible_label(lv->treeview, lv->label); | |
11585 | 394 |
11769 | 395 /* Log size ************/ |
396 if(log_size) { | |
397 char *sz_txt = gaim_str_size_to_units(log_size); | |
398 text = g_strdup_printf("<span weight='bold'>%s</span> %s", _("Total log size:"), sz_txt); | |
399 size_label = gtk_label_new(NULL); | |
400 gtk_label_set_markup(GTK_LABEL(size_label), text); | |
401 /* gtk_paned_add1(GTK_PANED(pane), size_label); */ | |
402 gtk_misc_set_alignment(GTK_MISC(size_label), 0, 0); | |
403 gtk_box_pack_end(GTK_BOX(GTK_DIALOG(lv->window)->vbox), size_label, FALSE, FALSE, 0); | |
404 g_free(sz_txt); | |
405 g_free(text); | |
406 } | |
11402 | 407 |
11769 | 408 /* A fancy little box ************/ |
409 vbox = gtk_vbox_new(FALSE, GAIM_HIG_BOX_SPACE); | |
410 gtk_paned_add2(GTK_PANED(pane), vbox); | |
11402 | 411 |
11769 | 412 /* Viewer ************/ |
13280
3de53fe8345f
[gaim-migrate @ 15646]
Richard Laager <rlaager@wiktel.com>
parents:
13119
diff
changeset
|
413 frame = gaim_gtk_create_imhtml(FALSE, &lv->imhtml, NULL, NULL); |
11769 | 414 gtk_widget_set_name(lv->imhtml, "gaim_gtklog_imhtml"); |
415 gtk_widget_set_size_request(lv->imhtml, 320, 200); | |
416 gtk_box_pack_start(GTK_BOX(vbox), frame, TRUE, TRUE, 0); | |
417 gtk_widget_show(frame); | |
10181 | 418 |
11769 | 419 /* Search box **********/ |
420 hbox = gtk_hbox_new(FALSE, GAIM_HIG_BOX_SPACE); | |
421 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); | |
422 lv->entry = gtk_entry_new(); | |
423 gtk_box_pack_start(GTK_BOX(hbox), lv->entry, TRUE, TRUE, 0); | |
424 button = gtk_button_new_from_stock(GTK_STOCK_FIND); | |
425 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); | |
426 g_signal_connect(GTK_ENTRY(lv->entry), "activate", G_CALLBACK(search_cb), lv); | |
427 g_signal_connect(GTK_BUTTON(button), "clicked", G_CALLBACK(search_cb), lv); | |
10175 | 428 |
13568
6034444bbcf5
[gaim-migrate @ 15947]
Richard Laager <rlaager@wiktel.com>
parents:
13434
diff
changeset
|
429 select_first_log(lv); |
7432 | 430 |
431 gtk_widget_show_all(lv->window); | |
10663 | 432 |
433 return lv; | |
434 } | |
435 | |
436 void gaim_gtk_log_show(GaimLogType type, const char *screenname, GaimAccount *account) { | |
437 struct log_viewer_hash_t *ht = g_new0(struct log_viewer_hash_t, 1); | |
438 GaimGtkLogViewer *lv = NULL; | |
439 const char *name = screenname; | |
440 char *title; | |
441 | |
442 g_return_if_fail(account != NULL); | |
443 g_return_if_fail(screenname != NULL); | |
444 | |
445 ht->type = type; | |
446 ht->screenname = g_strdup(screenname); | |
447 ht->account = account; | |
448 | |
449 if (log_viewers == NULL) { | |
450 log_viewers = g_hash_table_new(log_viewer_hash, log_viewer_equal); | |
451 } else if ((lv = g_hash_table_lookup(log_viewers, ht))) { | |
452 gtk_window_present(GTK_WINDOW(lv->window)); | |
453 g_free(ht); | |
454 return; | |
455 } | |
456 | |
457 if (type == GAIM_LOG_CHAT) { | |
458 GaimChat *chat; | |
459 | |
460 chat = gaim_blist_find_chat(account, screenname); | |
461 if (chat != NULL) | |
462 name = gaim_chat_get_name(chat); | |
463 | |
464 title = g_strdup_printf(_("Conversations in %s"), name); | |
465 } else { | |
466 GaimBuddy *buddy; | |
467 | |
468 buddy = gaim_find_buddy(account, screenname); | |
469 if (buddy != NULL) | |
470 name = gaim_buddy_get_contact_alias(buddy); | |
471 | |
472 title = g_strdup_printf(_("Conversations with %s"), name); | |
473 } | |
474 | |
475 display_log_viewer(ht, gaim_log_get_logs(type, screenname, account), | |
13090 | 476 title, gaim_gtk_create_prpl_icon(account, 0.5), gaim_log_get_total_size(type, screenname, account)); |
10663 | 477 g_free(title); |
478 } | |
479 | |
480 void gaim_gtk_log_show_contact(GaimContact *contact) { | |
481 struct log_viewer_hash_t *ht = g_new0(struct log_viewer_hash_t, 1); | |
482 GaimBlistNode *child; | |
483 GaimGtkLogViewer *lv = NULL; | |
484 GList *logs = NULL; | |
485 char *filename; | |
486 GdkPixbuf *pixbuf; | |
487 const char *name = NULL; | |
488 char *title; | |
11585 | 489 int total_log_size = 0; |
10663 | 490 |
491 g_return_if_fail(contact != NULL); | |
492 | |
493 ht->type = GAIM_LOG_IM; | |
494 ht->contact = contact; | |
495 | |
496 if (log_viewers == NULL) { | |
497 log_viewers = g_hash_table_new(log_viewer_hash, log_viewer_equal); | |
498 } else if ((lv = g_hash_table_lookup(log_viewers, ht))) { | |
499 gtk_window_present(GTK_WINDOW(lv->window)); | |
500 g_free(ht); | |
501 return; | |
502 } | |
503 | |
504 for (child = contact->node.child ; child ; child = child->next) { | |
505 if (!GAIM_BLIST_NODE_IS_BUDDY(child)) | |
506 continue; | |
507 | |
11703
a53cef8bd22b
[gaim-migrate @ 13994]
Richard Laager <rlaager@wiktel.com>
parents:
11700
diff
changeset
|
508 logs = g_list_concat(gaim_log_get_logs(GAIM_LOG_IM, ((GaimBuddy *)child)->name, |
a53cef8bd22b
[gaim-migrate @ 13994]
Richard Laager <rlaager@wiktel.com>
parents:
11700
diff
changeset
|
509 ((GaimBuddy *)child)->account), logs); |
11585 | 510 total_log_size += gaim_log_get_total_size(GAIM_LOG_IM, ((GaimBuddy *)child)->name, ((GaimBuddy *)child)->account); |
10663 | 511 } |
512 logs = g_list_sort(logs, gaim_log_compare); | |
513 | |
514 filename = g_build_filename(DATADIR, "pixmaps", "gaim", "icons", "online.png", NULL); | |
515 pixbuf = gdk_pixbuf_new_from_file(filename, NULL); | |
516 g_free(filename); | |
517 | |
518 if (contact->alias != NULL) | |
519 name = contact->alias; | |
520 else if (contact->priority != NULL) | |
521 name = gaim_buddy_get_contact_alias(contact->priority); | |
522 | |
523 title = g_strdup_printf(_("Conversations with %s"), name); | |
11585 | 524 display_log_viewer(ht, logs, title, pixbuf, total_log_size); |
10663 | 525 g_free(title); |
7432 | 526 } |
8573 | 527 |
528 void gaim_gtk_syslog_show() | |
529 { | |
530 GList *accounts = NULL; | |
10663 | 531 GList *logs = NULL; |
8573 | 532 |
10181 | 533 if (syslog_viewer != NULL) { |
8573 | 534 gtk_window_present(GTK_WINDOW(syslog_viewer->window)); |
535 return; | |
536 } | |
537 | |
10663 | 538 for(accounts = gaim_accounts_get_all(); accounts != NULL; accounts = accounts->next) { |
8573 | 539 |
540 GaimAccount *account = (GaimAccount *)accounts->data; | |
10663 | 541 if(gaim_find_prpl(gaim_account_get_protocol_id(account)) == NULL) |
8573 | 542 continue; |
543 | |
11703
a53cef8bd22b
[gaim-migrate @ 13994]
Richard Laager <rlaager@wiktel.com>
parents:
11700
diff
changeset
|
544 logs = g_list_concat(gaim_log_get_system_logs(account), logs); |
8573 | 545 } |
10663 | 546 logs = g_list_sort(logs, gaim_log_compare); |
10175 | 547 |
11585 | 548 syslog_viewer = display_log_viewer(NULL, logs, _("System Log"), NULL, 0); |
8573 | 549 } |
12838
cb36bc2db7c5
[gaim-migrate @ 15186]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
550 |
cb36bc2db7c5
[gaim-migrate @ 15186]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
551 /**************************************************************************** |
cb36bc2db7c5
[gaim-migrate @ 15186]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
552 * GTK+ LOG SUBSYSTEM ******************************************************* |
cb36bc2db7c5
[gaim-migrate @ 15186]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
553 ****************************************************************************/ |
cb36bc2db7c5
[gaim-migrate @ 15186]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
554 |
cb36bc2db7c5
[gaim-migrate @ 15186]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
555 void * |
cb36bc2db7c5
[gaim-migrate @ 15186]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
556 gaim_gtk_log_get_handle(void) |
cb36bc2db7c5
[gaim-migrate @ 15186]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
557 { |
cb36bc2db7c5
[gaim-migrate @ 15186]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
558 static int handle; |
cb36bc2db7c5
[gaim-migrate @ 15186]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
559 |
cb36bc2db7c5
[gaim-migrate @ 15186]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
560 return &handle; |
cb36bc2db7c5
[gaim-migrate @ 15186]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
561 } |
cb36bc2db7c5
[gaim-migrate @ 15186]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
562 |
cb36bc2db7c5
[gaim-migrate @ 15186]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
563 void gaim_gtk_log_init(void) |
cb36bc2db7c5
[gaim-migrate @ 15186]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
564 { |
cb36bc2db7c5
[gaim-migrate @ 15186]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
565 void *handle = gaim_gtk_log_get_handle(); |
cb36bc2db7c5
[gaim-migrate @ 15186]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
566 |
cb36bc2db7c5
[gaim-migrate @ 15186]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
567 gaim_signal_register(handle, "log-displaying", |
cb36bc2db7c5
[gaim-migrate @ 15186]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
568 gaim_marshal_VOID__POINTER_POINTER, |
cb36bc2db7c5
[gaim-migrate @ 15186]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
569 NULL, 2, |
cb36bc2db7c5
[gaim-migrate @ 15186]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
570 gaim_value_new(GAIM_TYPE_BOXED, |
cb36bc2db7c5
[gaim-migrate @ 15186]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
571 "GaimGtkLogViewer *"), |
cb36bc2db7c5
[gaim-migrate @ 15186]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
572 gaim_value_new(GAIM_TYPE_SUBTYPE, |
cb36bc2db7c5
[gaim-migrate @ 15186]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
573 GAIM_SUBTYPE_LOG)); |
cb36bc2db7c5
[gaim-migrate @ 15186]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
574 } |
cb36bc2db7c5
[gaim-migrate @ 15186]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
575 |
cb36bc2db7c5
[gaim-migrate @ 15186]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
576 void |
cb36bc2db7c5
[gaim-migrate @ 15186]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
577 gaim_gtk_log_uninit(void) |
cb36bc2db7c5
[gaim-migrate @ 15186]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
578 { |
cb36bc2db7c5
[gaim-migrate @ 15186]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
579 gaim_signals_unregister_by_instance(gaim_gtk_log_get_handle()); |
cb36bc2db7c5
[gaim-migrate @ 15186]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
580 } |