comparison src/gtknotify.c @ 10439:911530134bf8

[gaim-migrate @ 11697] sf patch #1086253, from Alex Converse closes sf rfe #991372, from Adam Petaccia "New Buddy Search Results Dialog," used for oscar Also some memleak fixes from me. My bad. committer: Tailor Script <tailor@pidgin.im>
author Mark Doliner <mark@kingant.net>
date Tue, 28 Dec 2004 06:24:32 +0000
parents ec140184437b
children e6b87f7e8988
comparison
equal deleted inserted replaced
10438:d90ece33e72f 10439:911530134bf8
31 #include "debug.h" 31 #include "debug.h"
32 #include "prefs.h" 32 #include "prefs.h"
33 #include "gtkstock.h" 33 #include "gtkstock.h"
34 #include "util.h" 34 #include "util.h"
35 35
36 #include "gtkblist.h"
36 #include "gtkimhtml.h" 37 #include "gtkimhtml.h"
37 #include "gtknotify.h" 38 #include "gtknotify.h"
38 #include "gtkutils.h" 39 #include "gtkutils.h"
39 40
40 typedef struct 41 typedef struct
43 char *url; 44 char *url;
44 GtkWidget *dialog; 45 GtkWidget *dialog;
45 GtkWidget *label; 46 GtkWidget *label;
46 47
47 } GaimNotifyMailData; 48 } GaimNotifyMailData;
49
50 typedef struct
51 {
52 GaimAccount *account;
53 GtkListStore *model;
54 GtkWidget *treeview;
55 GtkWidget *window;
56
57 } GaimNotifySearchResultsData;
58
59 enum
60 {
61 COLUMN_ICON,
62 COLUMN_SCREENNAME,
63 NUM_COLUMNS
64 };
48 65
49 static void *gaim_gtk_notify_emails(size_t count, gboolean detailed, 66 static void *gaim_gtk_notify_emails(size_t count, gboolean detailed,
50 const char **subjects, 67 const char **subjects,
51 const char **froms, const char **tos, 68 const char **froms, const char **tos,
52 const char **urls, GCallback cb, 69 const char **urls, GCallback cb,
69 86
70 static void 87 static void
71 formatted_close_cb(GtkWidget *win, GdkEvent *event, void *user_data) 88 formatted_close_cb(GtkWidget *win, GdkEvent *event, void *user_data)
72 { 89 {
73 gaim_notify_close(GAIM_NOTIFY_FORMATTED, win); 90 gaim_notify_close(GAIM_NOTIFY_FORMATTED, win);
91 }
92
93 static void
94 searchresults_close_cb(GaimNotifySearchResultsData *data, GdkEvent *event, void *user_data)
95 {
96 gaim_notify_close(GAIM_NOTIFY_SEARCHRESULTS, data);
97 }
98
99 static void
100 add_buddy_helper_cb(GtkWidget *widget, GaimNotifySearchResultsData *data)
101 {
102 GtkTreeSelection *selection;
103 GtkTreeModel *model;
104 GtkTreeIter iter;
105 gchar *buddy;
106
107 g_return_if_fail(data != NULL);
108
109 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(data->treeview));
110
111 if (gtk_tree_selection_get_selected(selection, &model, &iter))
112 {
113 gtk_tree_model_get(GTK_TREE_MODEL(model), &iter,
114 COLUMN_SCREENNAME, &buddy, -1);
115 gaim_blist_request_add_buddy(data->account, buddy, NULL, NULL);
116 g_free(buddy);
117 }
74 } 118 }
75 119
76 static void * 120 static void *
77 gaim_gtk_notify_message(GaimNotifyMsgType type, const char *title, 121 gaim_gtk_notify_message(GaimNotifyMsgType type, const char *title,
78 const char *primary, const char *secondary, 122 const char *primary, const char *secondary,
376 420
377 return window; 421 return window;
378 } 422 }
379 423
380 static void * 424 static void *
425 gaim_gtk_notify_searchresults(GaimConnection *gc, const char *title,
426 const char *primary, const char *secondary,
427 const char **results, GCallback cb,
428 void *user_data)
429 {
430 GtkWidget *window;
431 GtkWidget *vbox;
432 GtkWidget *button_area;
433 GtkWidget *label;
434 GtkWidget *close_button;
435 GtkWidget *add_button;
436 GtkWidget *sw;
437 GtkWidget *treeview;
438 GdkPixbuf *icon, *scaled;
439 GaimNotifySearchResultsData *data;
440 GtkListStore *model;
441 GtkCellRenderer *renderer;
442 GtkTreeIter iter;
443 int i;
444 char *label_text;
445
446 data = g_malloc(sizeof(GaimNotifySearchResultsData));
447
448 /* Create the window */
449 window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
450 gtk_window_set_title(GTK_WINDOW(window), (title ? title :_("Search Results")));
451 gtk_window_set_type_hint(GTK_WINDOW(window), GDK_WINDOW_TYPE_HINT_DIALOG);
452 gtk_container_set_border_width(GTK_CONTAINER(window), 12);
453
454 g_signal_connect_swapped(G_OBJECT(window), "delete_event",
455 G_CALLBACK(searchresults_close_cb), data);
456
457 /* Setup the main vbox */
458 vbox = gtk_vbox_new(FALSE, 12);
459 gtk_container_add(GTK_CONTAINER(window), vbox);
460 gtk_widget_show(vbox);
461
462 /* Setup the descriptive label */
463 label_text = g_strdup_printf(
464 "<span weight=\"bold\" size=\"larger\">%s</span>%s%s",
465 (primary ? primary : ""),
466 (primary && secondary ? "\n" : ""),
467 (secondary ? secondary : ""));
468 label = gtk_label_new(NULL);
469 gtk_label_set_markup(GTK_LABEL(label), label_text);
470 gtk_label_set_line_wrap(GTK_LABEL(label), TRUE);
471 gtk_misc_set_alignment(GTK_MISC(label), 0, 0);
472 gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
473 gtk_widget_show(label);
474 g_free(label_text);
475
476 /* Setup the list model */
477 model = gtk_list_store_new(NUM_COLUMNS, GDK_TYPE_PIXBUF, G_TYPE_STRING);
478
479 /* Setup the scrolled window containing the treeview */
480 sw = gtk_scrolled_window_new(NULL, NULL);
481 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw),
482 GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
483 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sw),
484 GTK_SHADOW_IN);
485 gtk_box_pack_start(GTK_BOX(vbox), sw, TRUE, TRUE, 0);
486 gtk_widget_show(sw);
487
488 /* Setup the treeview */
489 treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(model));
490 gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(treeview), TRUE);
491 gtk_widget_set_size_request(treeview, 250, 150);
492 gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)),
493 GTK_SELECTION_SINGLE);
494 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treeview), FALSE);
495 gtk_container_add(GTK_CONTAINER(sw), treeview);
496 gtk_widget_show(treeview);
497
498 /* icon column */
499 renderer = gtk_cell_renderer_pixbuf_new ();
500 gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(treeview),
501 -1, "Icon", renderer,
502 "pixbuf", COLUMN_ICON,
503 NULL);
504
505 /* screenname column */
506 renderer = gtk_cell_renderer_text_new();
507 gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(treeview),
508 -1, "Screenname", renderer,
509 "text", COLUMN_SCREENNAME,
510 NULL);
511
512 /* Setup the button area */
513 button_area = gtk_hbutton_box_new();
514 gtk_box_pack_start(GTK_BOX(vbox), button_area, FALSE, FALSE, 0);
515 gtk_button_box_set_layout(GTK_BUTTON_BOX(button_area), GTK_BUTTONBOX_END);
516 gtk_box_set_spacing(GTK_BOX(button_area), 12);
517 gtk_widget_show(button_area);
518
519 /* Add the Add button */
520 add_button = gtk_button_new_from_stock(GTK_STOCK_ADD);
521 gtk_box_pack_start(GTK_BOX(button_area), add_button, FALSE, FALSE, 0);
522 gtk_widget_show(add_button);
523
524 /* Add the Close button */
525 close_button = gtk_button_new_from_stock(GTK_STOCK_CLOSE);
526 gtk_box_pack_start(GTK_BOX(button_area), close_button, FALSE, FALSE, 0);
527 gtk_widget_show(close_button);
528
529 /* Add the buddies to the tree view */
530 icon = create_prpl_icon(gc->account);
531 scaled = gdk_pixbuf_scale_simple(icon, 16, 16, GDK_INTERP_BILINEAR);
532
533 for (i = 0; results[i] != NULL; i++)
534 {
535 gtk_list_store_append(model, &iter);
536 gtk_list_store_set(model, &iter,
537 COLUMN_ICON, scaled,
538 COLUMN_SCREENNAME, results[i],
539 -1);
540 }
541
542 data->account = gc->account;
543 data->model = model;
544 data->treeview = treeview;
545 data->window = window;
546
547 /* Connect Signals */
548 g_signal_connect(G_OBJECT(add_button), "clicked",
549 G_CALLBACK(add_buddy_helper_cb), data);
550 g_signal_connect_swapped(G_OBJECT(close_button), "clicked",
551 G_CALLBACK(searchresults_close_cb), data);
552
553 /* Show the window */
554 gtk_widget_show(window);
555 return data;
556 }
557
558 static void *
381 gaim_gtk_notify_userinfo(GaimConnection *gc, const char *who, 559 gaim_gtk_notify_userinfo(GaimConnection *gc, const char *who,
382 const char *title, const char *primary, 560 const char *title, const char *primary,
383 const char *secondary, const char *text, 561 const char *secondary, const char *text,
384 GCallback cb, void *user_data) 562 GCallback cb, void *user_data)
385 { 563 {
395 GaimNotifyMailData *data = (GaimNotifyMailData *)ui_handle; 573 GaimNotifyMailData *data = (GaimNotifyMailData *)ui_handle;
396 574
397 gtk_widget_destroy(data->dialog); 575 gtk_widget_destroy(data->dialog);
398 576
399 g_free(data->url); 577 g_free(data->url);
578 g_free(data);
579 }
580 else if (type == GAIM_NOTIFY_SEARCHRESULTS)
581 {
582 GaimNotifySearchResultsData *data = (GaimNotifySearchResultsData *)ui_handle;
583
584 gtk_widget_destroy(data->window);
585
400 g_free(data); 586 g_free(data);
401 } 587 }
402 else 588 else
403 gtk_widget_destroy(GTK_WIDGET(ui_handle)); 589 gtk_widget_destroy(GTK_WIDGET(ui_handle));
404 } 590 }
610 { 796 {
611 gaim_gtk_notify_message, 797 gaim_gtk_notify_message,
612 gaim_gtk_notify_email, 798 gaim_gtk_notify_email,
613 gaim_gtk_notify_emails, 799 gaim_gtk_notify_emails,
614 gaim_gtk_notify_formatted, 800 gaim_gtk_notify_formatted,
801 gaim_gtk_notify_searchresults,
615 gaim_gtk_notify_userinfo, 802 gaim_gtk_notify_userinfo,
616 gaim_gtk_notify_uri, 803 gaim_gtk_notify_uri,
617 gaim_gtk_close_notify 804 gaim_gtk_close_notify
618 }; 805 };
619 806