00001
00023
00024
00025 #include "debug.h"
00026 #include "blist.h"
00027 #include "notify.h"
00028
00029 #include "utils.h"
00030 #include "group_admindlg.h"
00031 #include "group_find.h"
00032 #include "group_join.h"
00033 #include "group_opt.h"
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 };
00067
00068 const gchar *qq_group_auth_type_desc[] = {
00069 "鏃犻』璁よ瘉", "闇瑕佽璇", "涓嶅彲娣诲姞",
00070 };
00071
00072
00073 void _qq_group_info_window_deleteevent(GtkWidget * widget, GdkEvent * event, gpointer data) {
00074 gtk_widget_destroy(widget);
00075 }
00076
00077
00078 void _qq_group_info_window_close(GtkWidget * widget, gpointer data)
00079 {
00080
00081 gtk_widget_destroy(GTK_WIDGET(data));
00082 }
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 }
00108 }
00109 }
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 }
00126
00127 gaim_debug(GAIM_DEBUG_INFO, "QQ", "%d Qun info windows are freed\n", i);
00128 }
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
00143
00144
00145
00146
00147
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
00162
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
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 }
00186
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
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
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 }
00235 new_members[i] = 0xffffffff;
00236 } else
00237 new_members[0] = 0xffffffff;
00238 qq_group_modify_members(gc, group, new_members);
00239 }
00240 break;
00241 default:
00242 gaim_debug(GAIM_DEBUG_INFO, "QQ", "Invalid page number: %d\n", page);
00243 }
00244
00245 _qq_group_info_window_close(NULL, info_window->window);
00246
00247
00248 }
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) {
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 }
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 }
00309
00310 memcpy(&n, sd->data, sizeof(n));
00311
00312
00313 if (GAIM_BLIST_NODE_IS_CONTACT(n)) {
00314 c = (GaimContact *) n;
00315 b = c->priority;
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 }
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
00330
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 }
00340 } else
00341 uid = 0;
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 {
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
00352 gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(store), COLUMN_UID, GTK_SORT_ASCENDING);
00353 }
00354
00355 }
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
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
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 }
00478
00479 return vbox;
00480 }
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) {
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 }
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 }
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
00532 if (do_manage) {
00533 gtk_tree_view_enable_model_drag_dest(GTK_TREE_VIEW(treeview), >e, 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 }
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
00544
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
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 }
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 }
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 }
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
00654 gtk_widget_grab_focus(info_window->window);
00655
00656 }
00657
00658
00659