首页 | 数据结构 | 文件列表 | 数据字段 | 全局定义

group_admindlg.c

浏览该文件的文档。
00001 
00023 // START OF FILE
00024 /*****************************************************************************/
00025 #include "debug.h"              // gaim_debug
00026 #include "blist.h"              // GAIM_BLIST_NODE_IS_BUDDY
00027 #include "notify.h"             // gaim_notify_warning
00028 
00029 #include "utils.h"              // gaim_name_to_uid
00030 #include "group_admindlg.h"
00031 #include "group_find.h"         // qq_group_find_by_internal_group_id
00032 #include "group_join.h"         // auth_type
00033 #include "group_opt.h"          // QQ_GROUP_TYPE_PERMANENT
00034 
00035 enum {
00036         COLUMN_SELECTED = 0,
00037         COLUMN_UID,
00038         COLUMN_NICKNAME,
00039         NUM_COLUMNS
00040 };
00041 
00042 enum {
00043         PAGE_INFO = 0,
00044         PAGE_MEMBER,
00045 };
00046 
00047 typedef struct _qun_info_window {
00048         guint32 internal_group_id;
00049         GaimConnection *gc;
00050         GtkWidget *window;
00051         GtkWidget *notebook;
00052         GtkWidget *lbl_external_group_id;
00053         GtkWidget *lbl_admin_uid;
00054         GtkWidget *ent_group_name;
00055         GtkWidget *cmb_group_category;
00056         GtkWidget *txt_group_desc;
00057         GtkWidget *txt_group_notice;
00058         GtkWidget *rad_auth[3];
00059         GtkWidget *btn_mod;
00060         GtkWidget *btn_close;
00061         GtkWidget *tre_members;
00062 } qun_info_window;
00063 
00064 const gchar *qq_group_category[] = {
00065         "鍚屽", "鏈嬪弸", "鍚屼簨", "鍏朵粬",
00066 };                              // qq_group_category
00067 
00068 const gchar *qq_group_auth_type_desc[] = {
00069         "鏃犻』璁よ瘉", "闇瑕佽璇", "涓嶅彲娣诲姞",
00070 };                              // qq_group_auth_type_desc
00071 
00072 /*****************************************************************************/
00073 void _qq_group_info_window_deleteevent(GtkWidget * widget, GdkEvent * event, gpointer data) {
00074         gtk_widget_destroy(widget);     // this will call _window_destroy
00075 }                               // _window_deleteevent
00076 
00077 /*****************************************************************************/
00078 void _qq_group_info_window_close(GtkWidget * widget, gpointer data)
00079 {
00080         // this will call _info_window_destroy if it is info-window
00081         gtk_widget_destroy(GTK_WIDGET(data));
00082 }                               // _window_close
00083 
00084 /*****************************************************************************/
00085 void _qq_group_info_window_destroy(GtkWidget * widget, gpointer data)
00086 {
00087         GaimConnection *gc;
00088         GList *list;
00089         qq_data *qd;
00090         qun_info_window *info_window;
00091 
00092         gc = (GaimConnection *) data;
00093         g_return_if_fail(gc != NULL && gc->proto_data != NULL);
00094         gaim_debug(GAIM_DEBUG_INFO, "QQ", "Group info is destoryed\n");
00095 
00096         qd = (qq_data *) gc->proto_data;
00097         list = qd->qun_info_window;
00098 
00099         while (list) {
00100                 info_window = (qun_info_window *) (list->data);
00101                 if (info_window->window != widget)
00102                         list = list->next;
00103                 else {
00104                         qd->qun_info_window = g_list_remove(qd->qun_info_window, info_window);
00105                         g_free(info_window);
00106                         break;
00107                 }               // if info_window
00108         }                       // while
00109 }                               // _window_destroy
00110 
00111 /*****************************************************************************/
00112 void qq_qun_info_window_free(qq_data * qd)
00113 {
00114         gint i;
00115         qun_info_window *info_window;
00116 
00117         i = 0;
00118         while (qd->qun_info_window) {
00119                 info_window = (qun_info_window *) qd->qun_info_window->data;
00120                 qd->qun_info_window = g_list_remove(qd->qun_info_window, info_window);
00121                 if (info_window->window)
00122                         gtk_widget_destroy(info_window->window);
00123                 g_free(info_window);
00124                 i++;
00125         }                       // while
00126 
00127         gaim_debug(GAIM_DEBUG_INFO, "QQ", "%d Qun info windows are freed\n", i);
00128 }                               // qq_qun_info_window_free
00129 
00130 /*****************************************************************************/
00131 void _qq_group_info_window_modify(GtkWidget * widget, gpointer data)
00132 {
00133         GaimConnection *gc;
00134         qun_info_window *info_window;
00135 
00136         g_return_if_fail(data != NULL);
00137         info_window = (qun_info_window *) data;
00138 
00139         gc = info_window->gc;
00140         g_return_if_fail(gc != NULL && gc->proto_data != NULL);
00141 
00142         //henry: This function contains some codes only supported by gtk-2.4 or later
00143 //#if !GTK_CHECK_VERSION(2,4,0)
00144 //        gaim_notify_info(gc, _("QQ Qun Operation"),
00145 //                        _("This version of GTK-2 does not support this function"), NULL);
00146 //        return;
00147 //#else
00148         gint page, group_category, i = 0;
00149         qq_group *group;
00150         qq_data *qd;
00151         GtkTextIter start, end;
00152         GtkTreeModel *model;
00153         GtkTreeIter iter;
00154         GValue value = { 0, };
00155         guint32 *new_members;
00156         guint32 uid;
00157         gboolean selected;
00158 
00159         qd = (qq_data *) gc->proto_data;
00160 
00161         // we assume the modification can succeed
00162         // maybe it needs some tweak here
00163         group = qq_group_find_by_internal_group_id(gc, info_window->internal_group_id);
00164         g_return_if_fail(group != NULL);
00165 
00166         new_members = g_newa(guint32, QQ_QUN_MEMBER_MAX);
00167 
00168         page = gtk_notebook_get_current_page(GTK_NOTEBOOK(info_window->notebook));
00169         switch (page) {
00170         case PAGE_INFO:
00171                 gaim_debug(GAIM_DEBUG_INFO, "QQ", "Gonna change Qun detailed information\n");
00172                 // get the group_category
00173 #if GTK_CHECK_VERSION(2,4,0)
00174                 group_category = gtk_combo_box_get_active(GTK_COMBO_BOX(info_window->cmb_group_category));
00175 #else
00176                 group_category = gtk_option_menu_get_history(GTK_OPTION_MENU(info_window->cmb_group_category));
00177 #endif
00178 
00179                 if (group_category >= 0)
00180                         group->group_category = group_category;
00181                 else {
00182                         g_free(group);
00183                         gaim_debug(GAIM_DEBUG_ERROR, "QQ", "Invalid group_category: %d\n", group_category);
00184                         return;
00185                 }               // if group_category
00186                 // get auth_type
00187                 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(info_window->rad_auth[0])))
00188                         group->auth_type = QQ_GROUP_AUTH_TYPE_NO_AUTH;
00189                 else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(info_window->rad_auth[1])))
00190                         group->auth_type = QQ_GROUP_AUTH_TYPE_NEED_AUTH;
00191                 else
00192                         group->auth_type = QQ_GROUP_AUTH_TYPE_NO_ADD;
00193                 // MUST use g_strdup, otherwise core dump after info_window is closed
00194                 group->group_name_utf8 = g_strdup(gtk_entry_get_text(GTK_ENTRY(info_window->ent_group_name)));
00195                 gtk_text_buffer_get_bounds(gtk_text_view_get_buffer
00196                                            (GTK_TEXT_VIEW(info_window->txt_group_desc)), &start, &end);
00197                 group->group_desc_utf8 =
00198                     g_strdup(gtk_text_buffer_get_text
00199                              (gtk_text_view_get_buffer
00200                               (GTK_TEXT_VIEW(info_window->txt_group_desc)), &start, &end, FALSE));
00201                 gtk_text_buffer_get_bounds(gtk_text_view_get_buffer
00202                                            (GTK_TEXT_VIEW(info_window->txt_group_notice)), &start, &end);
00203                 group->notice_utf8 =
00204                     g_strdup(gtk_text_buffer_get_text
00205                              (gtk_text_view_get_buffer
00206                               (GTK_TEXT_VIEW(info_window->txt_group_notice)), &start, &end, FALSE));
00207                 // finally we can modify it with new information
00208                 qq_group_modify_info(gc, group);
00209                 break;
00210         case PAGE_MEMBER:
00211                 if (info_window->tre_members == NULL) {
00212                         gaim_debug(GAIM_DEBUG_INFO, "QQ", "Member list is not ready, cannot modify!\n");
00213                 } else {
00214                         gaim_debug(GAIM_DEBUG_INFO, "QQ", "Gonna change Qun member list\n");
00215                         model = gtk_tree_view_get_model(GTK_TREE_VIEW(info_window->tre_members));
00216                         if (gtk_tree_model_get_iter_first(model, &iter)) {
00217                                 gtk_tree_model_get_value(model, &iter, COLUMN_UID, &value);
00218                                 uid = g_value_get_uint(&value);
00219                                 g_value_unset(&value);
00220                                 gtk_tree_model_get_value(model, &iter, COLUMN_SELECTED, &value);
00221                                 selected = g_value_get_boolean(&value);
00222                                 g_value_unset(&value);
00223                                 if (!selected)
00224                                         new_members[i++] = uid;
00225                                 while (gtk_tree_model_iter_next(model, &iter)) {
00226                                         gtk_tree_model_get_value(model, &iter, COLUMN_UID, &value);
00227                                         uid = g_value_get_uint(&value);
00228                                         g_value_unset(&value);
00229                                         gtk_tree_model_get_value(model, &iter, COLUMN_SELECTED, &value);
00230                                         selected = g_value_get_boolean(&value);
00231                                         g_value_unset(&value);
00232                                         if (!selected)
00233                                                 new_members[i++] = uid;
00234                                 }       // while
00235                                 new_members[i] = 0xffffffff;    // this labels the end
00236                         } else
00237                                 new_members[0] = 0xffffffff;
00238                         qq_group_modify_members(gc, group, new_members);
00239                 }               // if info_window->tre_members
00240                 break;
00241         default:
00242                 gaim_debug(GAIM_DEBUG_INFO, "QQ", "Invalid page number: %d\n", page);
00243         }                       // switch
00244 
00245         _qq_group_info_window_close(NULL, info_window->window);
00246 
00247 //#endif /* GTK_CHECK_VERSION */
00248 }                               // _qq_group_info_window_modify
00249 
00250 /*****************************************************************************/
00251 void _qq_group_member_list_deleted_toggled(GtkCellRendererToggle * cell, gchar * path_str, gpointer data) {
00252         qun_info_window *info_window;
00253         GaimConnection *gc;
00254         qq_group *group;
00255 
00256         info_window = (qun_info_window *) data;
00257         g_return_if_fail(info_window != NULL);
00258 
00259         gc = info_window->gc;
00260         g_return_if_fail(gc != NULL);
00261 
00262         group = qq_group_find_by_internal_group_id(gc, info_window->internal_group_id);
00263         g_return_if_fail(group != NULL);
00264 
00265         GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(info_window->tre_members));
00266         GtkTreeIter iter;
00267         GtkTreePath *path = gtk_tree_path_new_from_string(path_str);
00268         gboolean selected;
00269         guint32 uid;
00270 
00271         gtk_tree_model_get_iter(model, &iter, path);
00272         gtk_tree_model_get(model, &iter, COLUMN_SELECTED, &selected, -1);
00273         gtk_tree_model_get(model, &iter, COLUMN_UID, &uid, -1);
00274 
00275         if (uid != group->creator_uid) {        // do not allow delete admin
00276                 selected ^= 1;
00277                 gtk_list_store_set(GTK_LIST_STORE(model), &iter, COLUMN_SELECTED, selected, -1);
00278                 gtk_tree_path_free(path);
00279         } else
00280                 gaim_notify_error(gc, NULL, _("Qun creator cannot be removed"), NULL);
00281 }                               // _qq_group_member_list_deleted_toggled
00282 
00283 /*****************************************************************************/
00284 void _qq_group_member_list_drag_data_rcv_cb
00285     (GtkWidget * widget, GdkDragContext * dc, guint x, guint y,
00286      GtkSelectionData * sd, guint info, guint t, gpointer data) {
00287 
00288         GaimConnection *gc;
00289         GaimAccount *account;
00290         GaimBlistNode *n = NULL;
00291         GaimContact *c = NULL;
00292         GaimBuddy *b = NULL;
00293         GtkWidget *treeview;
00294         GtkTreeModel *model;
00295         GtkListStore *store;
00296         GtkTreeIter iter;
00297         GValue value = { 0, };
00298         guint32 uid, input_uid;
00299 
00300         treeview = widget;
00301         gc = (GaimConnection *) data;
00302         g_return_if_fail(gc != NULL);
00303         account = gaim_connection_get_account(gc);
00304 
00305         if (sd->target != gdk_atom_intern("GAIM_BLIST_NODE", FALSE) || sd->data == NULL) {
00306                 gaim_debug(GAIM_DEBUG_ERROR, "QQ", "Invalid drag data received, discard...\n");
00307                 return;
00308         }                       // if (sd->target
00309 
00310         memcpy(&n, sd->data, sizeof(n));
00311 
00312         // we expect GAIM_BLIST_CONTACT_NODE and GAIM_BLIST_BUDDY_NODE
00313         if (GAIM_BLIST_NODE_IS_CONTACT(n)) {
00314                 c = (GaimContact *) n;
00315                 b = c->priority;        // we get the first buddy only
00316         } else if (GAIM_BLIST_NODE_IS_BUDDY(n))
00317                 b = (GaimBuddy *) n;
00318 
00319         if (b == NULL) {
00320                 gaim_debug(GAIM_DEBUG_ERROR, "QQ", "No valid GaimBuddy is passed from DnD\n");
00321                 return;
00322         }                       // if b == NULL
00323 
00324         gaim_debug(GAIM_DEBUG_INFO, "QQ", "We get a GaimBuddy: %s\n", b->name);
00325         input_uid = gaim_name_to_uid(b->name);
00326         g_return_if_fail(input_uid > 0);
00327 
00328         model = gtk_tree_view_get_model(GTK_TREE_VIEW(treeview));
00329         // we need to check if the user id in the member list is unique
00330         // possibly a tree transverse is necessary to achieve this
00331         if (gtk_tree_model_get_iter_first(model, &iter)) {
00332                 gtk_tree_model_get_value(model, &iter, COLUMN_UID, &value);
00333                 uid = g_value_get_uint(&value);
00334                 g_value_unset(&value);
00335                 while (uid != input_uid && gtk_tree_model_iter_next(model, &iter)) {
00336                         gtk_tree_model_get_value(model, &iter, COLUMN_UID, &value);
00337                         uid = g_value_get_uint(&value);
00338                         g_value_unset(&value);
00339                 }               // while
00340         } else
00341                 uid = 0;        // if gtk_tree_model_get_iter_first
00342 
00343         if (uid == input_uid) {
00344                 gaim_debug(GAIM_DEBUG_WARNING, "QQ", "Qun already has this buddy %s\n", b->name);
00345                 return;
00346         } else {                // we add it to list
00347                 store = GTK_LIST_STORE(model);
00348                 gtk_list_store_append(store, &iter);
00349                 gtk_list_store_set(store, &iter,
00350                                    COLUMN_SELECTED, FALSE, COLUMN_UID, input_uid, COLUMN_NICKNAME, b->alias, -1);
00351                 // re-sort the list
00352                 gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(store), COLUMN_UID, GTK_SORT_ASCENDING);
00353         }                       // if uid
00354 
00355 }                               // _qq_group_member_list_drag_data_rcv_cb
00356 
00357 /*****************************************************************************/
00358 GtkWidget *_create_page_info(GaimConnection * gc, qq_group * group, gboolean do_manage, qun_info_window * info_window) {
00359         GtkWidget *vbox, *hbox;
00360         GtkWidget *frame_info, *frame_auth;
00361         GtkWidget *tbl_info;
00362         GtkWidget *label, *entry, *combo, *text, *scrolled_window;
00363         gint i;
00364 
00365         g_return_val_if_fail(gc != NULL && group != NULL, NULL);
00366 
00367         vbox = gtk_vbox_new(FALSE, 5);
00368 
00369         frame_info = gtk_frame_new(NULL);
00370         gtk_box_pack_start(GTK_BOX(vbox), frame_info, TRUE, TRUE, 0);
00371 
00372         tbl_info = gtk_table_new(6, 4, FALSE);
00373         gtk_table_set_row_spacings(GTK_TABLE(tbl_info), 4);
00374         gtk_table_set_col_spacing(GTK_TABLE(tbl_info), 1, 10);
00375         gtk_container_add(GTK_CONTAINER(frame_info), tbl_info);
00376 
00377         label = gtk_label_new(_("Group ID: "));
00378         gtk_table_attach(GTK_TABLE(tbl_info), label, 0, 1, 0, 1, GTK_FILL, GTK_FILL, 0, 0);
00379         label = gtk_label_new(g_strdup_printf("%d", group->external_group_id));
00380         gtk_table_attach(GTK_TABLE(tbl_info), label, 1, 2, 0, 1, GTK_FILL, GTK_FILL, 0, 0);
00381         info_window->lbl_external_group_id = label;
00382 
00383         label = gtk_label_new(_("Group Name"));
00384         gtk_table_attach(GTK_TABLE(tbl_info), label, 2, 3, 0, 1, GTK_FILL, GTK_FILL, 0, 0);
00385         entry = gtk_entry_new();
00386         gtk_widget_set_size_request(entry, 100, -1);
00387         if (group->group_name_utf8 != NULL)
00388                 gtk_entry_set_text(GTK_ENTRY(entry), group->group_name_utf8);
00389         gtk_table_attach(GTK_TABLE(tbl_info), entry, 3, 4, 0, 1, GTK_FILL, GTK_FILL, 0, 0);
00390         info_window->ent_group_name = entry;
00391 
00392         label = gtk_label_new(_("Admin: "));
00393         gtk_table_attach(GTK_TABLE(tbl_info), label, 0, 1, 1, 2, GTK_FILL, GTK_FILL, 0, 0);
00394         label = gtk_label_new(g_strdup_printf("%d", group->creator_uid));
00395         gtk_table_attach(GTK_TABLE(tbl_info), label, 1, 2, 1, 2, GTK_FILL, GTK_FILL, 0, 0);
00396         info_window->lbl_admin_uid = label;
00397 
00398         label = gtk_label_new(_("Category"));
00399         gtk_table_attach(GTK_TABLE(tbl_info), label, 2, 3, 1, 2, GTK_FILL, GTK_FILL, 0, 0);
00400 
00401         //henry: these codes are supported only in GTK-2.4 or later
00402 #if GTK_CHECK_VERSION(2, 4, 0)
00403         combo = gtk_combo_box_new_text();
00404         for (i = 0; i < 4; i++)
00405                 gtk_combo_box_append_text(GTK_COMBO_BOX(combo), qq_group_category[i]);
00406         gtk_combo_box_set_active(GTK_COMBO_BOX(combo), group->group_category);
00407 #else
00408         GtkWidget *menu;
00409         GtkWidget *item;
00410 
00411         combo = gtk_option_menu_new();
00412         menu = gtk_menu_new();
00413         for (i = 0; i < 4; i++) {
00414                 item = gtk_menu_item_new_with_label(qq_group_category[i]);
00415                 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
00416                 gtk_widget_show(item);
00417         }
00418         gtk_option_menu_set_menu(GTK_OPTION_MENU(combo), menu);
00419         gtk_option_menu_set_history(GTK_OPTION_MENU(combo), group->group_category);
00420 #endif                          /* GTK_CHECK_VERSION */
00421 
00422         gtk_table_attach(GTK_TABLE(tbl_info), combo, 3, 4, 1, 2, GTK_FILL, GTK_FILL, 0, 0);
00423         info_window->cmb_group_category = combo;
00424 
00425         label = gtk_label_new(_("Description"));
00426         gtk_table_attach(GTK_TABLE(tbl_info), label, 0, 1, 2, 3, GTK_FILL, GTK_FILL, 0, 0);
00427         text = gtk_text_view_new();
00428         gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(text), GTK_WRAP_WORD);
00429         gtk_widget_set_size_request(text, -1, 50);
00430         if (group->group_desc_utf8 != NULL)
00431                 gtk_text_buffer_set_text(gtk_text_view_get_buffer(GTK_TEXT_VIEW(text)), group->group_desc_utf8, -1);
00432         info_window->txt_group_desc = text;
00433 
00434         scrolled_window = gtk_scrolled_window_new(NULL, NULL);
00435         gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
00436         gtk_container_add(GTK_CONTAINER(scrolled_window), text);
00437         gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled_window), GTK_SHADOW_IN);
00438         gtk_text_view_set_left_margin(GTK_TEXT_VIEW(text), 2);
00439         gtk_text_view_set_right_margin(GTK_TEXT_VIEW(text), 2);
00440         gtk_table_attach(GTK_TABLE(tbl_info), scrolled_window, 0, 4, 3, 4, GTK_FILL, GTK_FILL, 0, 0);
00441 
00442         label = gtk_label_new(_("Group Notice"));
00443         gtk_table_attach(GTK_TABLE(tbl_info), label, 0, 1, 4, 5, GTK_FILL, GTK_FILL, 0, 0);
00444         text = gtk_text_view_new();
00445         gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(text), GTK_WRAP_WORD);
00446         gtk_widget_set_size_request(text, -1, 50);
00447         if (group->notice_utf8 != NULL)
00448                 gtk_text_buffer_set_text(gtk_text_view_get_buffer(GTK_TEXT_VIEW(text)), group->notice_utf8, -1);
00449         info_window->txt_group_notice = text;
00450 
00451         scrolled_window = gtk_scrolled_window_new(NULL, NULL);
00452         gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
00453         gtk_container_add(GTK_CONTAINER(scrolled_window), text);
00454         gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled_window), GTK_SHADOW_IN);
00455         gtk_text_view_set_left_margin(GTK_TEXT_VIEW(text), 2);
00456         gtk_text_view_set_right_margin(GTK_TEXT_VIEW(text), 2);
00457         gtk_table_attach(GTK_TABLE(tbl_info), scrolled_window, 0, 4, 5, 6, GTK_FILL, GTK_FILL, 0, 0);
00458 
00459         frame_auth = gtk_frame_new(_("Authentication"));
00460         hbox = gtk_hbox_new(FALSE, 5);
00461         gtk_container_add(GTK_CONTAINER(frame_auth), hbox);
00462         info_window->rad_auth[0] = gtk_radio_button_new_with_label(NULL, qq_group_auth_type_desc[0]);
00463         info_window->rad_auth[1] =
00464             gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON
00465                                                         (info_window->rad_auth[0]), qq_group_auth_type_desc[1]);
00466         info_window->rad_auth[2] =
00467             gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON
00468                                                         (info_window->rad_auth[0]), qq_group_auth_type_desc[2]);
00469         for (i = 0; i < 3; i++)
00470                 gtk_box_pack_start(GTK_BOX(hbox), info_window->rad_auth[i], FALSE, FALSE, 0);
00471         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(info_window->rad_auth[group->auth_type - 1]), TRUE);
00472         gtk_box_pack_start(GTK_BOX(vbox), frame_auth, FALSE, FALSE, 0);
00473 
00474         if (!do_manage) {
00475                 gtk_widget_set_sensitive(frame_info, FALSE);
00476                 gtk_widget_set_sensitive(frame_auth, FALSE);
00477         }                       // if ! do_manage
00478 
00479         return vbox;
00480 }                               // _create_info_page
00481 
00482 /*****************************************************************************/
00483 GtkWidget *_create_page_members
00484     (GaimConnection * gc, qq_group * group, gboolean do_manage, qun_info_window * info_window) {
00485         GtkWidget *vbox, *sw, *treeview;
00486         GtkTreeModel *model;
00487         GtkListStore *store;
00488         GtkTreeIter iter;
00489         GtkCellRenderer *renderer;
00490         GtkTreeViewColumn *column;
00491         GList *list;
00492         qq_buddy *q_bud;
00493         GtkTargetEntry gte = { "GAIM_BLIST_NODE", GTK_TARGET_SAME_APP, 0 };
00494 
00495         g_return_val_if_fail(gc != NULL && group != NULL, NULL);
00496 
00497         vbox = gtk_vbox_new(FALSE, 0);
00498 
00499         if (group->members == NULL) {   // if NULL, not ready
00500                 sw = gtk_label_new(_
00501                                    ("OpenQ is collecting member information.\nPlease close this window and open again"));
00502                 gtk_box_pack_start(GTK_BOX(vbox), sw, TRUE, TRUE, 0);
00503                 return vbox;
00504         }                       // if group->members
00505 
00506         sw = gtk_scrolled_window_new(NULL, NULL);
00507         gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sw), GTK_SHADOW_ETCHED_IN);
00508         gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
00509         gtk_box_pack_start(GTK_BOX(vbox), sw, TRUE, TRUE, 0);
00510 
00511         store = gtk_list_store_new(NUM_COLUMNS, G_TYPE_BOOLEAN, G_TYPE_UINT, G_TYPE_STRING);
00512 
00513         list = group->members;
00514         while (list != NULL) {
00515                 q_bud = (qq_buddy *) list->data;
00516                 gtk_list_store_append(store, &iter);
00517                 gtk_list_store_set(store, &iter,
00518                                    COLUMN_SELECTED, FALSE,
00519                                    COLUMN_UID, q_bud->uid, COLUMN_NICKNAME, q_bud->nickname, -1);
00520                 list = list->next;
00521         }                       // for
00522 
00523         model = GTK_TREE_MODEL(store);
00524         treeview = gtk_tree_view_new_with_model(model);
00525         info_window->tre_members = treeview;
00526 
00527         gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(treeview), TRUE);
00528         gtk_tree_view_set_search_column(GTK_TREE_VIEW(treeview), COLUMN_UID);
00529         g_object_unref(model);
00530 
00531         // set up drag & drop ONLY for managable Qun
00532         if (do_manage) {
00533                 gtk_tree_view_enable_model_drag_dest(GTK_TREE_VIEW(treeview), &gte, 1, GDK_ACTION_COPY);
00534                 g_signal_connect(G_OBJECT(treeview), "drag-data-received",
00535                                  G_CALLBACK(_qq_group_member_list_drag_data_rcv_cb), gc);
00536         }                       // if do manage
00537 
00538         gtk_container_add(GTK_CONTAINER(sw), treeview);
00539 
00540         model = gtk_tree_view_get_model(GTK_TREE_VIEW(treeview));
00541         renderer = gtk_cell_renderer_toggle_new();
00542 
00543         // it seems this signal has to be handled
00544         // otherwise, the checkbox in the column does not reponse to user action
00545         if (do_manage)
00546                 g_signal_connect(renderer, "toggled", G_CALLBACK(_qq_group_member_list_deleted_toggled), info_window);
00547 
00548         column = gtk_tree_view_column_new_with_attributes(_("Del"), renderer, "active", COLUMN_SELECTED, NULL);
00549 
00550         gtk_tree_view_column_set_sizing(GTK_TREE_VIEW_COLUMN(column), GTK_TREE_VIEW_COLUMN_FIXED);
00551         gtk_tree_view_column_set_fixed_width(GTK_TREE_VIEW_COLUMN(column), 30);
00552         gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column);
00553 
00554         renderer = gtk_cell_renderer_text_new();
00555         column = gtk_tree_view_column_new_with_attributes(_("UID"), renderer, "text", COLUMN_UID, NULL);
00556         gtk_tree_view_column_set_sort_column_id(column, COLUMN_UID);
00557         gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column);
00558         // default sort by UID
00559         gtk_tree_view_column_set_sort_order(column, GTK_SORT_ASCENDING);
00560         gtk_tree_view_column_set_sort_indicator(column, TRUE);
00561 
00562         renderer = gtk_cell_renderer_text_new();
00563         column = gtk_tree_view_column_new_with_attributes(_("Nickname"), renderer, "text", COLUMN_NICKNAME, NULL);
00564         gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column);
00565 
00566         return vbox;
00567 }                               // _create_page_members
00568 
00569 /*****************************************************************************/
00570 void qq_group_detail_window_show(GaimConnection * gc, qq_group * group)
00571 {
00572         GtkWidget *vbox, *notebook;
00573         GtkWidget *label, *bbox;
00574         GList *list;
00575         qq_data *qd;
00576         qun_info_window *info_window = NULL;
00577         gboolean do_manage, do_show, do_exist;
00578 
00579         g_return_if_fail(gc != NULL && gc->proto_data != NULL && group != NULL);
00580         qd = (qq_data *) gc->proto_data;
00581 
00582         do_manage = group->my_status == QQ_GROUP_MEMBER_STATUS_IS_ADMIN;
00583         do_show = do_manage || (group->my_status == QQ_GROUP_MEMBER_STATUS_IS_MEMBER);
00584 
00585         if (!do_show) {
00586                 gaim_notify_error(gc, _("QQ Qun Operation"),
00587                                   _("You can not view Qun details"),
00588                                   _("Only Qun admin or Qun member can view details"));
00589                 return;
00590         }                       // if ! do_show
00591 
00592         list = qd->qun_info_window;
00593         do_exist = FALSE;
00594         while (list != NULL) {
00595                 info_window = (qun_info_window *) list->data;
00596                 if (info_window->internal_group_id == group->internal_group_id) {
00597                         break;
00598                         do_exist = TRUE;
00599                 } else
00600                         list = list->next;
00601         }                       // while list
00602 
00603         if (!do_exist) {
00604                 info_window = g_new0(qun_info_window, 1);
00605                 info_window->gc = gc;
00606                 info_window->internal_group_id = group->internal_group_id;
00607                 g_list_append(qd->qun_info_window, info_window);
00608 
00609                 info_window->window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
00610                 g_signal_connect(GTK_WINDOW(info_window->window),
00611                                  "delete_event", G_CALLBACK(_qq_group_info_window_deleteevent), NULL);
00612                 g_signal_connect(G_OBJECT(info_window->window), "destroy",
00613                                  G_CALLBACK(_qq_group_info_window_destroy), gc);
00614 
00615                 gtk_window_set_title(GTK_WINDOW(info_window->window), _("Manage Qun"));
00616                 gtk_window_set_resizable(GTK_WINDOW(info_window->window), FALSE);
00617                 gtk_container_set_border_width(GTK_CONTAINER(info_window->window), 5);
00618 
00619                 vbox = gtk_vbox_new(FALSE, 0);
00620                 gtk_container_add(GTK_CONTAINER(info_window->window), vbox);
00621 
00622                 notebook = gtk_notebook_new();
00623                 info_window->notebook = notebook;
00624                 gtk_notebook_set_tab_pos(GTK_NOTEBOOK(notebook), GTK_POS_TOP);
00625                 gtk_box_pack_start(GTK_BOX(vbox), notebook, TRUE, TRUE, 0);
00626 
00627                 label = gtk_label_new(_("Qun Information"));
00628                 gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
00629                                          _create_page_info(gc, group, do_manage, info_window), label);
00630                 label = gtk_label_new(_("Members"));
00631                 gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
00632                                          _create_page_members(gc, group, do_manage, info_window), label);
00633 
00634                 bbox = gtk_hbutton_box_new();
00635                 gtk_button_box_set_layout(GTK_BUTTON_BOX(bbox), GTK_BUTTONBOX_SPREAD);
00636                 gtk_box_set_spacing(GTK_BOX(bbox), 10);
00637 
00638                 info_window->btn_mod = gtk_button_new_with_label(_("Modify"));
00639                 gtk_container_add(GTK_CONTAINER(bbox), info_window->btn_mod);
00640                 g_signal_connect(G_OBJECT(info_window->btn_mod), "clicked",
00641                                  G_CALLBACK(_qq_group_info_window_modify), info_window);
00642 
00643                 info_window->btn_close = gtk_button_new_with_label(_("Close"));
00644                 gtk_container_add(GTK_CONTAINER(bbox), info_window->btn_close);
00645                 g_signal_connect(G_OBJECT(info_window->btn_close),
00646                                  "clicked", G_CALLBACK(_qq_group_info_window_close), info_window->window);
00647 
00648                 if (!do_manage)
00649                         gtk_widget_set_sensitive(info_window->btn_mod, FALSE);
00650                 gtk_box_pack_start(GTK_BOX(vbox), bbox, TRUE, TRUE, 5);
00651                 gtk_widget_show_all(info_window->window);
00652 
00653         } else                  // we already have this
00654                 gtk_widget_grab_focus(info_window->window);
00655 
00656 }                               // qq_group_manage_window_show
00657 
00658 /*****************************************************************************/
00659 // END OF FILE

Generated at Mon May 8 15:41:23 2006 for OpenQ by  doxygen 1.4.4