Mercurial > pidgin.yaz
comparison src/gtklog.c @ 7432:31faec55ef8e
[gaim-migrate @ 8037]
You'll want these too.
committer: Tailor Script <tailor@pidgin.im>
author | Sean Egan <seanegan@gmail.com> |
---|---|
date | Wed, 05 Nov 2003 06:16:25 +0000 |
parents | |
children | 7cdbd2eb7546 |
comparison
equal
deleted
inserted
replaced
7431:643cbc9a6035 | 7432:31faec55ef8e |
---|---|
1 /** | |
2 * @file gtklog.c GTK+ Log viewer | |
3 * @ingroup gtkui | |
4 * | |
5 * gaim | |
6 * | |
7 * Copyright (C) 2003 Error of Ruto | |
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 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, write to the Free Software | |
21 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
22 */ | |
23 | |
24 #include "gtkinternal.h" | |
25 | |
26 #include "account.h" | |
27 #include "util.h" | |
28 #include "gtkblist.h" | |
29 #include "gtkimhtml.h" | |
30 #include "gtklog.h" | |
31 #include "gtkutils.h" | |
32 #include "log.h" | |
33 | |
34 static GHashTable *log_viewers = NULL; | |
35 | |
36 struct log_viewer_hash_t { | |
37 char *screenname; | |
38 GaimAccount *account; | |
39 }; | |
40 | |
41 static guint log_viewer_hash(const struct log_viewer_hash_t *viewer) | |
42 { | |
43 return g_str_hash(viewer->screenname) + g_str_hash(gaim_account_get_username(viewer->account)); | |
44 | |
45 } | |
46 | |
47 static gint log_viewer_equal(const struct log_viewer_hash_t *a, const struct log_viewer_hash_t *b) | |
48 { | |
49 int ret; | |
50 char *normal = g_strdup(gaim_normalize(a->account, a->screenname)); | |
51 ret = (a->account == b->account) && !strcmp(normal, gaim_normalize(b->account, b->screenname)); | |
52 g_free(normal); | |
53 return ret; | |
54 } | |
55 | |
56 static void log_select(GtkTreeSelection *sel, GaimGtkLogViewer *viewer) { | |
57 GtkTreeIter iter; | |
58 GValue val = { 0, }; | |
59 GtkTreeModel *model = GTK_TREE_MODEL(viewer->treestore); | |
60 GaimLog *log = NULL; | |
61 GaimLogReadFlags flags; | |
62 char *read = NULL; | |
63 char time[64]; | |
64 | |
65 char *title; | |
66 | |
67 if (! gtk_tree_selection_get_selected (sel, &model, &iter)) | |
68 return; | |
69 gtk_tree_model_get_value (model, &iter, 1, &val); | |
70 log = g_value_get_pointer(&val); | |
71 g_value_unset(&val); | |
72 | |
73 if (!log) | |
74 return; | |
75 | |
76 read = gaim_log_read(log, &flags); | |
77 viewer->flags = flags; | |
78 strftime(time, sizeof(time), "%c", localtime(&log->time)); | |
79 title = g_strdup_printf("%s - %s", log->name, time); | |
80 gtk_window_set_title(GTK_WINDOW(viewer->window), title); | |
81 gtk_imhtml_clear(GTK_IMHTML(viewer->imhtml)); | |
82 gtk_imhtml_append_text(GTK_IMHTML(viewer->imhtml), read, | |
83 GTK_IMHTML_NO_COMMENTS | GTK_IMHTML_NO_TITLE | GTK_IMHTML_NO_SCROLL | | |
84 ((flags & GAIM_LOG_READ_NO_NEWLINE) ? GTK_IMHTML_NO_NEWLINE : 0)); | |
85 g_free(read); | |
86 g_free(title); | |
87 } | |
88 | |
89 /* I want to make this smarter, but haven't come up with a cool algorithm to do so, yet. | |
90 * I want the tree to be divided into groups like "Today," "Yesterday," "Last week," | |
91 * "August," "2002," etc. based on how many conversation took place in each subdivision. | |
92 * | |
93 * For now, I'll just make it a flat list. | |
94 */ | |
95 static void populate_log_tree(GaimGtkLogViewer *lv) | |
96 /* Logs are made from trees in real life. | |
97 This is a tree made from logs */ | |
98 { | |
99 char *title[64]; | |
100 GtkTreeIter iter; | |
101 GList *logs = lv->logs; | |
102 while (logs) { | |
103 GaimLog *log = logs->data; | |
104 strftime(title, sizeof(title), "%c", localtime(&log->time)); | |
105 gtk_tree_store_append (lv->treestore, &iter, NULL); | |
106 gtk_tree_store_set(lv->treestore, &iter, | |
107 0, title, | |
108 1, log, -1); | |
109 logs = logs->next; | |
110 } | |
111 } | |
112 | |
113 void gaim_gtk_log_show(const char *screenname, GaimAccount *account) { | |
114 /* if (log_viewers && g_hash_table */ | |
115 GtkWidget *hbox, *vbox; | |
116 GdkPixbuf *pixbuf, *scale; | |
117 GtkCellRenderer *rend; | |
118 GtkTreeViewColumn *col; | |
119 GaimGtkLogViewer *lv = NULL; | |
120 GtkTreeSelection *sel; | |
121 GtkWidget *icon, *label, *pane, *sw, *button; | |
122 GList *logs; | |
123 char *text; | |
124 struct log_viewer_hash_t *ht = g_malloc(sizeof(struct log_viewer_hash_t)); | |
125 | |
126 ht->screenname = g_strdup(screenname); | |
127 ht->account = account; | |
128 | |
129 if (!log_viewers) { | |
130 log_viewers = g_hash_table_new(log_viewer_hash, log_viewer_equal); | |
131 } else if ((lv = g_hash_table_lookup(log_viewers, ht))) { | |
132 gtk_window_present(GTK_WINDOW(lv->window)); | |
133 return; | |
134 } | |
135 | |
136 lv = g_new0(GaimGtkLogViewer, 1); | |
137 lv->logs = logs = gaim_log_get_logs(g_strdup(screenname), account); | |
138 g_hash_table_insert(log_viewers, ht, lv); | |
139 | |
140 /* Window ***********/ | |
141 lv->window = gtk_dialog_new_with_buttons(screenname, NULL, 0, | |
142 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, NULL); | |
143 gtk_container_set_border_width (GTK_CONTAINER(lv->window), 6); | |
144 gtk_dialog_set_has_separator(GTK_DIALOG(lv->window), FALSE); | |
145 gtk_box_set_spacing(GTK_BOX(GTK_DIALOG(lv->window)->vbox), 0); | |
146 | |
147 hbox = gtk_hbox_new(FALSE, 6); | |
148 gtk_container_set_border_width(GTK_CONTAINER(hbox), 6); | |
149 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(lv->window)->vbox), hbox, FALSE, FALSE, 0); | |
150 | |
151 /* Icon *************/ | |
152 pixbuf = create_prpl_icon(account); | |
153 scale = gdk_pixbuf_scale_simple(pixbuf, 16, 16, GDK_INTERP_BILINEAR); | |
154 icon = gtk_image_new_from_pixbuf(scale); | |
155 gtk_box_pack_start(GTK_BOX(hbox), icon, FALSE, FALSE, 0); | |
156 g_object_unref(G_OBJECT(pixbuf)); | |
157 g_object_unref(G_OBJECT(scale)); | |
158 | |
159 /* Label ************/ | |
160 label = gtk_label_new(NULL); | |
161 text = g_strdup_printf("<span size='larger' weight='bold'>%s %s</span>", | |
162 _("Conversations with"), screenname); | |
163 gtk_label_set_markup(GTK_LABEL(label), text); | |
164 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); | |
165 g_free(text); | |
166 | |
167 /* Pane *************/ | |
168 pane = gtk_hpaned_new(); | |
169 gtk_container_set_border_width(GTK_CONTAINER(pane), 6); | |
170 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(lv->window)->vbox), pane, TRUE, TRUE, 0); | |
171 | |
172 /* List *************/ | |
173 sw = gtk_scrolled_window_new (NULL, NULL); | |
174 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw), GTK_SHADOW_IN); | |
175 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS); | |
176 gtk_paned_add1(GTK_PANED(pane), sw); | |
177 lv->treestore = gtk_tree_store_new (2, G_TYPE_STRING, G_TYPE_POINTER); | |
178 lv->treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL (lv->treestore)); | |
179 rend = gtk_cell_renderer_text_new(); | |
180 col = gtk_tree_view_column_new_with_attributes ("time", rend, "markup", 0, NULL); | |
181 gtk_tree_view_append_column (GTK_TREE_VIEW(lv->treeview), col); | |
182 gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (lv->treeview), FALSE); | |
183 gtk_container_add (GTK_CONTAINER (sw), lv->treeview); | |
184 | |
185 gtk_widget_set_size_request(lv->treeview, 170, 200); | |
186 populate_log_tree(lv); | |
187 | |
188 sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (lv->treeview)); | |
189 g_signal_connect (G_OBJECT (sel), "changed", | |
190 G_CALLBACK (log_select), | |
191 lv); | |
192 | |
193 /* Viewer ************/ | |
194 vbox = gtk_vbox_new(FALSE, 6); | |
195 gtk_paned_add2(GTK_PANED(pane), vbox); | |
196 sw = gtk_scrolled_window_new(NULL, NULL); | |
197 gtk_box_pack_start(GTK_BOX(vbox), sw, TRUE, TRUE, 0); | |
198 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sw), GTK_SHADOW_IN); | |
199 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS); | |
200 lv->imhtml = gtk_imhtml_new(NULL, NULL); | |
201 gtk_container_add(GTK_CONTAINER(sw), lv->imhtml); | |
202 gaim_setup_imhtml(lv->imhtml); | |
203 gtk_widget_set_size_request(lv->imhtml, 320, 200); | |
204 | |
205 /* Search box **********/ | |
206 hbox = gtk_hbox_new(FALSE, 6); | |
207 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); | |
208 lv->entry = gtk_entry_new(); | |
209 gtk_box_pack_start(GTK_BOX(hbox), lv->entry, TRUE, TRUE, 0); | |
210 button = gtk_button_new_from_stock(GTK_STOCK_FIND); | |
211 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); | |
212 | |
213 gtk_widget_show_all(lv->window); | |
214 } |