| Yattm - unified GTK instant-messaging client | ![]() |
| [Generated for version 0.2-17 - Mon Jan 6 19:01:23 GMT+1 2003] |
#include "intl.h"#include <stdio.h>#include <stdlib.h>#include <string.h>#include <gdk/gdk.h>#include <gdk/gdkkeysyms.h>#include <assert.h>#include "globals.h"#include "gtk_eb_html.h"#include "log_window.h"#include "util.h"#include "pixmaps/cancel.xpm"Include dependency graph for log_window.c:

Go to the source code of this file.
Functions | |
| void | free_string_list (gpointer data, gpointer user_data) |
| void | free_gs_list (gpointer data, gpointer user_data) |
| void | create_html_widget (log_window *lw) |
| void | set_html_text (GSList *gl, log_window *lw) |
| void | load_log_information (log_window *lw) |
| void | destroy_event (GtkWidget *widget, gpointer data) |
| void | close_log_window_callback (GtkWidget *button, gpointer data) |
| gboolean | search_callback (GtkWidget *widget, GdkEventKey *event, gpointer data) |
| void | select_date_callback (GtkCList *clist, gint row, gint column, GdkEventButton *event, gpointer user_data) |
| log_window * | eb_log_window_new (struct contact *rc) |
Variables | |
| int | current_row = -1 |
| int | last_pos = -1 |
|
||||||||||||
|
Definition at line 196 of file log_window.c. References _log_window::window. Referenced by eb_log_window_new().
00197 {
00198 log_window* lw = (log_window*)data;
00199 gtk_widget_destroy(lw->window);
00200 }
|
|
|
Definition at line 58 of file log_window.c. References _log_window::date_html_hbox, EXT_GTK_TEXT, ext_gtk_text_new(), gtk_eb_html_init(), _log_window::html_display, and _log_window::html_scroller. Referenced by set_html_text().
00059 {
00060 /* add in the html display */
00061 lw->html_display = ext_gtk_text_new(NULL, NULL);
00062 gtk_eb_html_init(EXT_GTK_TEXT(lw->html_display));
00063
00064 /* need to add scrollbar to the html text box*/
00065 lw->html_scroller = gtk_scrolled_window_new(NULL, NULL);
00066 gtk_widget_set_usize(lw->html_scroller, 375, 150);
00067 gtk_container_add(GTK_CONTAINER(lw->html_scroller), lw->html_display);
00068 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(lw->html_scroller), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS);
00069
00070 gtk_box_pack_end(GTK_BOX(lw->date_html_hbox), lw->html_scroller, TRUE, TRUE, 5);
00071
00072 gtk_widget_show(GTK_WIDGET(lw->html_scroller));
00073 gtk_widget_show(GTK_WIDGET(lw->html_display));
00074 }
|
|
||||||||||||
|
Definition at line 185 of file log_window.c. References _log_window::entries, free_gs_list(), contact::logwindow, _log_window::remote, and _log_window::window. Referenced by eb_log_window_new().
00186 {
00187 log_window* lw = (log_window*)data;
00188
00189 g_slist_foreach(lw->entries, (GFunc)free_gs_list, NULL);
00190
00191 lw->remote->logwindow = NULL;
00192 lw->window = NULL;
00193 g_free(lw);
00194 }
|
|
|
Definition at line 304 of file log_window.c. References _, close_log_window_callback(), _log_window::date_html_hbox, _log_window::date_list, _log_window::date_scroller, destroy_event(), _log_window::html_display, load_log_information(), contact::logwindow, contact::nick, _log_window::remote, search_callback(), select_date_callback(), and _log_window::window. Referenced by eb_view_log().
00305 {
00306 GtkWidget *iconwid0;
00307 GdkPixmap *icon0;
00308 GdkBitmap *mask;
00309
00310 log_window* lw = g_new0(log_window, 1);
00311 char buffer[512];
00312 GtkWidget* vbox;
00313 GtkWidget* hbox;
00314 GtkWidget* button;
00315 GtkWidget* toolbar;
00316 GtkWidget* search_label;
00317 GtkWidget* search_entry;
00318 lw->remote = rc;
00319 rc->logwindow = lw;
00320 lw->window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
00321 gtk_window_set_position(GTK_WINDOW(lw->window), GTK_WIN_POS_MOUSE);
00322 /* show who the conversation is with */
00323 sprintf(buffer, _("Past conversations with %s"), rc->nick);
00324 gtk_window_set_title(GTK_WINDOW(lw->window), buffer);
00325 gtk_container_set_border_width(GTK_CONTAINER(lw->window), 5);
00326
00327
00328 /* for the html and list box */
00329 lw->date_html_hbox = gtk_hbox_new(FALSE, 0);
00330
00331 lw->date_list = gtk_clist_new(1);
00332 gtk_clist_set_column_width(GTK_CLIST(lw->date_list), 0, 100);
00333 gtk_clist_set_selection_mode(GTK_CLIST(lw->date_list), GTK_SELECTION_BROWSE);
00334
00335 /* scroll window for the date list */
00336 lw->date_scroller = gtk_scrolled_window_new(NULL, NULL);
00337 gtk_widget_set_usize(lw->date_scroller, 180, 150);
00338 gtk_container_add(GTK_CONTAINER(lw->date_scroller), lw->date_list);
00339 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(lw->date_scroller), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS);
00340
00341 /* let the packing begin (god that sounds wrong) */
00342 gtk_box_pack_start(GTK_BOX(lw->date_html_hbox), lw->date_scroller, TRUE, TRUE, 5);
00343 vbox = gtk_vbox_new(FALSE, 0);
00344 gtk_box_pack_start(GTK_BOX(vbox), lw->date_html_hbox, TRUE, TRUE, 5);
00345 gtk_container_add(GTK_CONTAINER(lw->window), vbox);
00346
00347 gtk_signal_connect(GTK_OBJECT(lw->window), "destroy",
00348 GTK_SIGNAL_FUNC(destroy_event), lw);
00349
00350 /* buttons toolbar */
00351 hbox = gtk_hbox_new(FALSE, 0);
00352 toolbar = gtk_toolbar_new(GTK_ORIENTATION_HORIZONTAL, GTK_TOOLBAR_ICONS);
00353 gtk_toolbar_set_button_relief(GTK_TOOLBAR(toolbar), GTK_RELIEF_NONE);
00354 gtk_container_set_border_width(GTK_CONTAINER(toolbar), 0);
00355
00356 /* need to realize the window for the pixmaps */
00357 gtk_widget_realize(GTK_WIDGET(lw->window));
00358
00359
00360 /* search field */
00361 search_label = gtk_label_new(_("Search: "));
00362 search_entry = gtk_entry_new();
00363 gtk_box_pack_start(GTK_BOX(hbox), search_label, FALSE, FALSE, 0);
00364 gtk_box_pack_start(GTK_BOX(hbox), search_entry, TRUE, TRUE, 0);
00365 gtk_widget_show (search_label);
00366 gtk_widget_show (search_entry);
00367 gtk_signal_connect(GTK_OBJECT(search_entry), "key_press_event",
00368 GTK_SIGNAL_FUNC(search_callback), lw);
00369
00370
00371 /* close button*/
00372 icon0 = gdk_pixmap_create_from_xpm_d(lw->window->window, &mask, NULL, cancel_xpm);
00373 iconwid0 = gtk_pixmap_new(icon0, mask);
00374 gtk_widget_show(iconwid0);
00375 button = gtk_toolbar_append_element(GTK_TOOLBAR(toolbar),
00376 GTK_TOOLBAR_CHILD_BUTTON,
00377 NULL,
00378 "close",
00379 "Close",
00380 "close",
00381 iconwid0,
00382 GTK_SIGNAL_FUNC(close_log_window_callback),
00383 lw);
00384 gtk_widget_show(GTK_WIDGET(button));
00385 gtk_widget_show(GTK_WIDGET(toolbar));
00386
00387 gtk_box_pack_end(GTK_BOX(hbox), toolbar, FALSE, FALSE, 0);
00388 gtk_box_pack_end(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
00389
00390 /* connect signals to the date list */
00391 gtk_signal_connect(GTK_OBJECT(lw->date_list), "select-row",
00392 GTK_SIGNAL_FUNC(select_date_callback), lw);
00393
00394 load_log_information(lw);
00395
00396 /* show everything... can you get arrested for baring it all? */
00397 gtk_widget_show(GTK_WIDGET(lw->date_list));
00398 gtk_widget_show(GTK_WIDGET(lw->html_display));
00399 gtk_widget_show(GTK_WIDGET(lw->date_scroller));
00400 gtk_widget_show(GTK_WIDGET(lw->date_html_hbox));
00401 gtk_widget_show(GTK_WIDGET(hbox));
00402 gtk_widget_show(GTK_WIDGET(vbox));
00403
00404 gtk_widget_show(GTK_WIDGET(lw->window));
00405
00406 gtk_clist_select_row(GTK_CLIST(lw->date_list), 0, 0);
00407
00408 return lw;
00409 }
|
|
||||||||||||
|
Definition at line 52 of file log_window.c. References free_string_list(). Referenced by destroy_event().
00053 {
00054 g_slist_foreach((GSList*)data, (GFunc)free_string_list, NULL);
00055 g_slist_free((GSList*)data);
00056 }
|
|
||||||||||||
|
Definition at line 47 of file log_window.c. Referenced by free_gs_list().
00048 {
00049 g_free(data);
00050 }
|
|
|
Definition at line 106 of file log_window.c. References _, _log_window::date_list, _log_window::entries, make_safe_filename(), NAME_MAX, contact::nick, and _log_window::remote. Referenced by eb_log_window_new().
00107 {
00108 gchar name_buffer[NAME_MAX];
00109 gchar read_buffer[4096];
00110 FILE* fp;
00111 gchar* p1, *p2;
00112 gchar date_buffer[128];
00113 gchar* p3[1];
00114 GSList* gl = NULL, *gl1 = NULL;
00115 gint idx;
00116
00117 gtk_clist_freeze(GTK_CLIST(lw->date_list)); /* freeze, thaw? So corny. */
00118
00119 make_safe_filename(name_buffer, lw->remote->nick);
00120
00121 if ( (fp = fopen(name_buffer, "r")) != NULL) {
00122 gl = g_slist_alloc();
00123
00124 while (fgets(read_buffer, 4096, fp) != NULL) {
00125 if ((p1 = strstr(read_buffer, _("Conversation started on "))) != NULL)
00126 {
00127
00128 /* extract the date, I am not sure if this is portable (but it
00129 works on my machine, so if someone wants to hack it, go ahead */
00130 p1 += strlen(_("Conversation started on "));
00131
00132 /* if html tags are in the buffer, gotta strip the last two tags */
00133 if ((p2 = strstr(read_buffer, "</B></P>")) != NULL) {
00134 strncpy(date_buffer, p1, p2 - p1);
00135 date_buffer[p2-p1] = '\0';
00136 } else {
00137 /* eww, c's string handling sucks */
00138 strncpy(date_buffer, p1, (read_buffer + strlen(read_buffer)) - p1);
00139 date_buffer[(read_buffer + strlen(read_buffer)) - p1 - 1] = '\0';
00140 }
00141
00142 p3[0] = date_buffer;
00143 idx = gtk_clist_append(GTK_CLIST(lw->date_list), p3);
00144
00145 /* add new gslist entry */
00146 gl1 = g_slist_alloc();
00147 gl = g_slist_append(gl, gl1);
00148
00149 /* set the datapointer for the clist */
00150 gtk_clist_set_row_data(GTK_CLIST(lw->date_list), idx, gl1);
00151 } else if ((p1 = strstr(read_buffer, _("Conversation ended on "))) == NULL) {
00152 if (gl1 != NULL) {
00153 gl1 = g_slist_append(gl1, strdup(read_buffer));
00154 }
00155 else
00156 {
00157 char buff1[4096];
00158 p3[0] = _("Undated Log");
00159
00160 strcpy(buff1, read_buffer);
00161 idx = gtk_clist_append(GTK_CLIST(lw->date_list), p3);
00162
00163 /* add new gslist entry */
00164 gl1 = g_slist_alloc();
00165 gl = g_slist_append(gl, gl1);
00166
00167 /* set the datapointer for the clist */
00168 gtk_clist_set_row_data(GTK_CLIST(lw->date_list), idx, gl1);
00169 gl1 = g_slist_append(gl1, strdup(buff1));
00170 }
00171 }
00172 }
00173 fclose(fp);
00174 } else {
00175 perror(name_buffer);
00176 }
00177
00178 lw->entries = gl;
00179
00180 gtk_clist_thaw(GTK_CLIST(lw->date_list));
00181 }
|
|
||||||||||||||||
|
Definition at line 202 of file log_window.c. References current_row, _log_window::date_list, DBG_CORE, eb_debug, _log_window::html_display, last_pos, set_html_text(), and strip_html(). Referenced by eb_log_window_new().
00203 {
00204 int cur_pos=0,cur_log=current_row;
00205 log_window * lw = (log_window *)data;
00206 gboolean looped=FALSE;
00207 /* if user wants to search */
00208 if (event->keyval == GDK_Return) {
00209 gchar * text = gtk_entry_get_text(GTK_ENTRY(widget));
00210 strip_html(text);
00211 if(strlen(text) == 0)
00212 return TRUE;
00213
00214 while(!looped) {
00215 int total_length=0;
00216 GSList *c_slist, *s_list;
00217 /* get the selected conversation's log */
00218 s_list = (GSList*)gtk_clist_get_row_data(GTK_CLIST(lw->date_list), cur_log);
00219 if (!s_list) {
00220 /* end of the conversation's list, back to the beginning */
00221 s_list = (GSList*)gtk_clist_get_row_data(GTK_CLIST(lw->date_list), 0);
00222 /*reset */
00223 cur_log=cur_pos=current_row=last_pos=total_length=0;
00224 looped=TRUE;
00225 }
00226 if(!s_list) {
00227 eb_debug(DBG_CORE, "search: breaking\n");
00228 /* empty !*/
00229 break;
00230 }
00231
00232 /* keep a pointer to the beginning of the conversation
00233 * as we'll move s_list pointer */
00234 c_slist = s_list;
00235 while(s_list && cur_pos <= last_pos) {
00236 s_list=s_list->next;
00237 if(s_list && s_list->data && cur_pos<last_pos) {
00238 total_length+=strlen((char*)s_list->data);
00239 }
00240 if(s_list) cur_pos++;
00241 }
00242 while(s_list) {
00243 gchar *list_text = (gchar *)s_list->data;
00244 gchar *no_html_text = NULL;
00245 if (list_text)
00246 no_html_text = strdup(list_text);
00247 if (no_html_text)
00248 strip_html(no_html_text);
00249 /* found string ? */
00250 if(no_html_text && strstr(no_html_text,text) != NULL) {
00251 GtkEditable *editable;
00252 /* go to the the found conversation */
00253 gtk_clist_select_row(GTK_CLIST(lw->date_list),cur_log,0);
00254 gtk_clist_moveto (GTK_CLIST(lw->date_list),
00255 cur_log,0,0,0);
00256 /* update the conversation log */
00257 set_html_text(c_slist,lw);
00258 editable = GTK_EDITABLE (lw->html_display);
00259
00260 last_pos=cur_pos+1;
00261 current_row=cur_log;
00262 /* select the matching substring */
00263 eb_debug(DBG_CORE, "search: total2=%d\n",total_length);
00264 gtk_editable_set_position ( editable,
00265 total_length+(int)(strstr(no_html_text,text)-no_html_text));
00266 gtk_editable_select_region( editable,
00267 total_length+(int)(strstr(no_html_text,text)-no_html_text),
00268 total_length+(int)(strstr(no_html_text,text)-no_html_text)+strlen(text));
00269 total_length+=strlen(no_html_text);
00270 return TRUE;
00271 } else if (no_html_text)
00272 total_length+=strlen(no_html_text);
00273
00274 if (no_html_text)
00275 free(no_html_text);
00276 /* next line */
00277 s_list=s_list->next;
00278 cur_pos++;
00279 last_pos=cur_pos;
00280 }
00281 /* next conversation */
00282 cur_log++;
00283 cur_pos=0;last_pos=0;
00284 current_row=cur_log;
00285 }
00286
00287 }
00288 return TRUE;
00289 }
|
|
||||||||||||||||||||||||
|
Definition at line 292 of file log_window.c. References current_row, last_pos, and set_html_text(). Referenced by eb_log_window_new().
00294 {
00295 GSList* string_list;
00296 log_window* lw = (log_window*)user_data;
00297
00298 string_list = (GSList*)gtk_clist_get_row_data(GTK_CLIST(clist), row);
00299 set_html_text(string_list, lw);
00300 current_row = row; last_pos=0;
00301 }
|
|
||||||||||||
|
Definition at line 77 of file log_window.c. References create_html_widget(), EXT_GTK_TEXT, ext_gtk_text_freeze(), ext_gtk_text_thaw(), gtk_eb_html_add(), _log_window::html_display, and _log_window::html_scroller. Referenced by search_callback(), and select_date_callback().
00078 {
00079 GSList *h;
00080
00081 /* need to destroy the html widget, and add it again */
00082 if (lw->html_display != NULL)
00083 gtk_widget_destroy(GTK_WIDGET(lw->html_display));
00084 if (lw->html_scroller != NULL)
00085 gtk_widget_destroy(GTK_WIDGET(lw->html_scroller));
00086
00087
00088 /* create the html stuff */
00089 create_html_widget(lw);
00090
00091 ext_gtk_text_freeze(EXT_GTK_TEXT(lw->html_display)); /* cold snap */
00092
00093 /* walk down the list and add the test */
00094 h = gl;
00095 while (h != NULL) {
00096 if (h->data != NULL) {
00097 gtk_eb_html_add(EXT_GTK_TEXT(lw->html_display), (gchar*)h->data,0,0,0);
00098 }
00099 h = g_slist_next(h);
00100 }
00101
00102 ext_gtk_text_thaw(EXT_GTK_TEXT(lw->html_display)); /* and now, a warm front */
00103
00104 }
|
|
|
Definition at line 45 of file log_window.c. Referenced by search_callback(), and select_date_callback(). |
|
|
Definition at line 45 of file log_window.c. Referenced by search_callback(), and select_date_callback(). |