/*************************************************************************** * modeswindow.cpp * * Fri Jul 8 03:08:02 2005 * Copyright 2005 User * Email ****************************************************************************/ #include "modeswindow.h" #define MW_MAKEBUTTON(but, txt, act) \ but = gtk_check_button_new_with_mnemonic(txt);\ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(but), act); \ g_signal_connect_swapped(but, "clicked", G_CALLBACK(this->cb_someButtonClicked), this); struct _mw_combo { gchar *name; guint status; } comboTexts[5] = { {tr_NOOP("Online"), BUDDY_STATUS_ONLINE}, {tr_NOOP("Away"), BUDDY_STATUS_AWAY}, {tr_NOOP("Not Available"), BUDDY_STATUS_NA}, {tr_NOOP("Occupied"), BUDDY_STATUS_OCC}, {tr_NOOP("Do Not Disturb"), BUDDY_STATUS_DND} }; modesWindow::modesWindow() { wType = UE_EDITUSERMODES; } modesWindow::~modesWindow() { delete manager; } GtkWidget* modesWindow::createWindowContent() { GtkWidget *notebook, *vbox; gchar *titleText; notebook = gtk_notebook_new(); gtk_notebook_append_page(GTK_NOTEBOOK(notebook), createGroupsTab(), gtk_label_new_with_mnemonic(tr("_Groups"))); gtk_notebook_append_page(GTK_NOTEBOOK(notebook), createStatusTab(), gtk_label_new_with_mnemonic(tr("_Status / Lists"))); gtk_notebook_append_page(GTK_NOTEBOOK(notebook), createAcceptTab(), gtk_label_new_with_mnemonic(tr("_Accept Modes"))); vbox = gtk_vbox_new(FALSE, 10); gtk_container_set_border_width(GTK_CONTAINER(vbox), 10); gtk_box_pack_start(GTK_BOX(vbox), notebook, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(vbox), createButtonbar(), FALSE, TRUE, 0); titleText = g_strdup_printf(tr("Set groups/info for %s"), manager->info->alias); setWindowTitle(titleText); g_free(titleText); return vbox; } GtkWidget* modesWindow::createGroupsTab() { GtkWidget *vbox, *label, *scrolled; GList *search; groupInfo *currentGroup; GtkTreeIter iter; GtkCellRenderer *renderer; GtkTreeViewColumn *column; gulong groups; gint i; gchar *fstr; // create and fill the store groupsStore = gtk_list_store_new(2, G_TYPE_BOOLEAN, G_TYPE_STRING); groups = manager->parentUser->getLicqGroups(GROUPS_USER); i = 0; search = IO_getGroupManager()->groups->next; while(search) { currentGroup = (groupInfo*)search->data; gtk_list_store_append(groupsStore, &iter); gtk_list_store_set(groupsStore, &iter, 0, groups & (1<name, -1); i++; search = search->next; } groupsView = gtk_tree_view_new_with_model(GTK_TREE_MODEL(groupsStore)); gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(groupsView), TRUE); // create the columns renderer = gtk_cell_renderer_toggle_new(); g_signal_connect(renderer, "toggled", G_CALLBACK(this->cb_groupsListToggled), this); column = gtk_tree_view_column_new_with_attributes(tr("Selected"), renderer, "active", 0, NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(groupsView), column); renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new_with_attributes(tr("Name"), renderer, "text", 1, NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(groupsView), column); scrolled = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled), GTK_SHADOW_IN); gtk_container_add(GTK_CONTAINER(scrolled), groupsView); // create the label with the hint text fstr = g_strdup_printf("%s", tr("Please select the groups the user shall be in. You can select more than one group.")); label = gtk_label_new(fstr); g_free(fstr); gtk_widget_set_size_request(label, 300, -1); gtk_label_set_use_markup(GTK_LABEL(label), TRUE); gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.0f); vbox = gtk_vbox_new(FALSE, 5); gtk_container_set_border_width(GTK_CONTAINER(vbox), 10); gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, TRUE, 0); gtk_box_pack_start(GTK_BOX(vbox), scrolled, TRUE, TRUE, 0); return vbox; } GtkWidget* modesWindow::createStatusTab() { gint i; GtkWidget *alignment, *vbox1, *vbox2, *vbox3, *label; gchar *fstr; vbox2 = gtk_vbox_new(FALSE, 15); gtk_container_set_border_width(GTK_CONTAINER(vbox2), 10); // special status fstr = g_strdup_printf("%s", tr("Fake a special status to the user")); label = gtk_label_new(fstr); g_free(fstr); gtk_label_set_use_markup(GTK_LABEL(label), TRUE); useSpecialStatusButton = gtk_check_button_new(); gtk_container_add(GTK_CONTAINER(useSpecialStatusButton), label); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(useSpecialStatusButton), manager->info->statusToUser != BUDDY_STATUS_OFFLINE); specialStatusList = gtk_combo_box_new_text(); for (i=0; i<5; i++) { gtk_combo_box_append_text(GTK_COMBO_BOX(specialStatusList), comboTexts[i].name); if (comboTexts[i].status == manager->info->statusToUser) gtk_combo_box_set_active(GTK_COMBO_BOX(specialStatusList), i); } gtk_combo_box_set_active(GTK_COMBO_BOX(specialStatusList), 0); g_signal_connect_swapped(specialStatusList, "changed", G_CALLBACK(this->cb_someButtonClicked), this); gtk_widget_set_sensitive(specialStatusList, manager->info->statusToUser != BUDDY_STATUS_OFFLINE); alignment = gtk_alignment_new(0.0f, 0.0f, 1.0f, 1.0f); gtk_alignment_set_padding(GTK_ALIGNMENT(alignment), 0, 0, 20, 0); gtk_container_add(GTK_CONTAINER(alignment), specialStatusList); vbox1 = gtk_vbox_new(FALSE, 2); gtk_box_pack_start(GTK_BOX(vbox1), useSpecialStatusButton, FALSE, TRUE, 0); gtk_box_pack_start(GTK_BOX(vbox1), alignment, FALSE, TRUE, 0); gtk_box_pack_start(GTK_BOX(vbox2), vbox1, FALSE, TRUE, 0); // lists MW_MAKEBUTTON(onlineNotifyButton, tr("Notify me when this user is online"), manager->parentUser->getLicqGroups(GROUPS_SYSTEM) & (1<<(GROUP_ONLINE_NOTIFY-1))); MW_MAKEBUTTON(visibleListButton, tr("Let the user see when you are invisible"), manager->parentUser->getLicqGroups(GROUPS_SYSTEM) & (1<<(GROUP_VISIBLE_LIST-1))); MW_MAKEBUTTON(invisibleListButton, tr("Let yourself appear offline to the user"), manager->parentUser->getLicqGroups(GROUPS_SYSTEM) & (1<<(GROUP_INVISIBLE_LIST-1))); MW_MAKEBUTTON(ignoreListButton, tr("Ignore all events from the user"), manager->parentUser->getLicqGroups(GROUPS_SYSTEM) & (1<<(GROUP_IGNORE_LIST-1))); fstr = g_strdup_printf("%s", tr("Special Status modes:")); label = gtk_label_new(fstr); g_free(fstr); gtk_label_set_use_markup(GTK_LABEL(label), TRUE); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.0f); vbox3 = gtk_vbox_new(FALSE, 2); gtk_box_pack_start(GTK_BOX(vbox3), onlineNotifyButton, FALSE, TRUE, 0); gtk_box_pack_start(GTK_BOX(vbox3), visibleListButton, FALSE, TRUE, 0); gtk_box_pack_start(GTK_BOX(vbox3), invisibleListButton, FALSE, TRUE, 0); gtk_box_pack_start(GTK_BOX(vbox3), ignoreListButton, FALSE, TRUE, 0); alignment = gtk_alignment_new(0.0f, 0.0f, 1.0f, 1.0f); gtk_alignment_set_padding(GTK_ALIGNMENT(alignment), 0, 0, 20, 0); gtk_container_add(GTK_CONTAINER(alignment), vbox3); vbox1 = gtk_vbox_new(FALSE, 2); gtk_box_pack_start(GTK_BOX(vbox1), label, FALSE, TRUE, 0); gtk_box_pack_start(GTK_BOX(vbox1), alignment, FALSE, TRUE, 0); gtk_box_pack_start(GTK_BOX(vbox2), vbox1, FALSE, TRUE, 0); g_signal_connect_swapped(useSpecialStatusButton, "clicked", G_CALLBACK(this->cb_someButtonClicked), this); g_signal_connect_swapped(useSpecialStatusButton, "toggled", G_CALLBACK(this->cb_statusToUserButtonClicked), this); return vbox2; } GtkWidget* modesWindow::createAcceptTab() { GtkWidget *vbox1, *vbox2, *table, *alignment, *label; gchar *fstr; MW_MAKEBUTTON(acceptAwayButton, tr("Away"), manager->parentUser->getAcceptModes(AM_ACCEPTINAWAY)); MW_MAKEBUTTON(acceptNAButton, tr("Not Available"), manager->parentUser->getAcceptModes(AM_ACCEPTINNA)); MW_MAKEBUTTON(acceptOccButton, tr("Occupied"), manager->parentUser->getAcceptModes(AM_ACCEPTINOCC)); MW_MAKEBUTTON(acceptDNDButton, tr("Do Not Disturb"), manager->parentUser->getAcceptModes(AM_ACCEPTINDND)); MW_MAKEBUTTON(autoAcceptFilesButton, tr("File Transfers"), manager->parentUser->getAcceptModes(AM_AUTOACCEPTFILES)); MW_MAKEBUTTON(autoAcceptChatsButton, tr("Chat Requests"), manager->parentUser->getAcceptModes(AM_AUTOACCEPTCHATS)); MW_MAKEBUTTON(autoRequestSecureButton, tr("Auto Request Secure Channel"), manager->parentUser->getAcceptModes(AM_AUTOSECURE)); MW_MAKEBUTTON(useGPGButton, tr("Use GPG Encryption"), manager->parentUser->getAcceptModes(AM_USEGPG)); MW_MAKEBUTTON(useRealIPButton, tr("Use Real IP (Lan)"), manager->parentUser->getAcceptModes(AM_SENDREALIP)); // create the main vbox vbox2 = gtk_vbox_new(FALSE, 15); gtk_container_set_border_width(GTK_CONTAINER(vbox2), 10); // Accepts fstr = g_strdup_printf("%s", tr("Accept Events when your status is:")); label = gtk_label_new(fstr); g_free(fstr); gtk_label_set_use_markup(GTK_LABEL(label), TRUE); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.0f); table = gtk_table_new(2, 2, TRUE); gtk_table_attach_defaults(GTK_TABLE(table), acceptAwayButton, 0, 1, 0, 1); gtk_table_attach_defaults(GTK_TABLE(table), acceptNAButton, 1, 2, 0, 1); gtk_table_attach_defaults(GTK_TABLE(table), acceptOccButton, 0, 1, 1, 2); gtk_table_attach_defaults(GTK_TABLE(table), acceptDNDButton, 1, 2, 1, 2); alignment = gtk_alignment_new(0.0f, 0.0f, 1.0f, 1.0f); gtk_alignment_set_padding(GTK_ALIGNMENT(alignment), 0, 0, 20, 0); gtk_container_add(GTK_CONTAINER(alignment), table); vbox1 = gtk_vbox_new(FALSE, 2); gtk_box_pack_start(GTK_BOX(vbox1), label, FALSE, TRUE, 0); gtk_box_pack_start(GTK_BOX(vbox1), alignment, FALSE, TRUE, 0); gtk_box_pack_start(GTK_BOX(vbox2), vbox1, FALSE, TRUE, 0); // Auto accepts fstr = g_strdup_printf("%s", tr("Automatic Accept Events:")); label = gtk_label_new(fstr); g_free(fstr); gtk_label_set_use_markup(GTK_LABEL(label), TRUE); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.0f); table = gtk_table_new(1, 2, TRUE); gtk_table_attach_defaults(GTK_TABLE(table), autoAcceptFilesButton, 0, 1, 0, 1); gtk_table_attach_defaults(GTK_TABLE(table), autoAcceptChatsButton, 1, 2, 0, 1); alignment = gtk_alignment_new(0.0f, 0.0f, 1.0f, 1.0f); gtk_alignment_set_padding(GTK_ALIGNMENT(alignment), 0, 0, 20, 0); gtk_container_add(GTK_CONTAINER(alignment), table); vbox1 = gtk_vbox_new(FALSE, 2); gtk_box_pack_start(GTK_BOX(vbox1), label, FALSE, TRUE, 0); gtk_box_pack_start(GTK_BOX(vbox1), alignment, FALSE, TRUE, 0); gtk_box_pack_start(GTK_BOX(vbox2), vbox1, FALSE, TRUE, 0); // Other modes fstr = g_strdup_printf("%s", tr("Other Modes for the User:")); label = gtk_label_new(fstr); g_free(fstr); gtk_label_set_use_markup(GTK_LABEL(label), TRUE); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.0f); table = gtk_table_new(3, 1, TRUE); gtk_table_attach_defaults(GTK_TABLE(table), autoRequestSecureButton, 0, 1, 0, 1); gtk_table_attach_defaults(GTK_TABLE(table), useGPGButton, 0, 1, 1, 2); gtk_table_attach_defaults(GTK_TABLE(table), useRealIPButton, 0, 1, 2, 3); alignment = gtk_alignment_new(0.0f, 0.0f, 1.0f, 1.0f); gtk_alignment_set_padding(GTK_ALIGNMENT(alignment), 0, 0, 20, 0); gtk_container_add(GTK_CONTAINER(alignment), table); vbox1 = gtk_vbox_new(FALSE, 2); gtk_box_pack_start(GTK_BOX(vbox1), label, FALSE, TRUE, 0); gtk_box_pack_start(GTK_BOX(vbox1), alignment, FALSE, TRUE, 0); gtk_box_pack_start(GTK_BOX(vbox2), vbox1, FALSE, TRUE, 0); return vbox2; } GtkWidget* modesWindow::createButtonbar() { GtkWidget *hbox, *closeButton; closeButton = gtk_button_new_from_stock(GTK_STOCK_CLOSE); g_signal_connect_swapped(closeButton, "clicked", G_CALLBACK(this->cb_destroyWindow), this); applyButton = gtk_button_new_from_stock(GTK_STOCK_APPLY); g_signal_connect_swapped(applyButton, "clicked", G_CALLBACK(this->cb_applyButtonClicked), this); gtk_widget_set_sensitive(applyButton, FALSE); hbox = gtk_hbutton_box_new(); gtk_button_box_set_layout(GTK_BUTTON_BOX(hbox), GTK_BUTTONBOX_END); gtk_box_set_spacing(GTK_BOX(hbox), 2); gtk_box_pack_start(GTK_BOX(hbox), applyButton, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), closeButton, FALSE, FALSE, 0); return hbox; } void modesWindow::destroyWindowContent() { } void modesWindow::cb_groupsListToggled(GtkCellRendererToggle *cell, gchar *pathStr, modesWindow* self) { GtkTreePath *path; GtkTreeIter iter; gboolean state; path = gtk_tree_path_new_from_string(pathStr); gtk_tree_model_get_iter(GTK_TREE_MODEL(self->groupsStore), &iter, path); gtk_tree_model_get(GTK_TREE_MODEL(self->groupsStore), &iter, 0, &state, -1); state = !state; gtk_list_store_set(GTK_LIST_STORE(self->groupsStore), &iter, 0, state, -1); gtk_tree_path_free(path); gtk_widget_set_sensitive(self->applyButton, TRUE); } void modesWindow::cb_someButtonClicked(modesWindow* self) { gtk_widget_set_sensitive(self->applyButton, TRUE); } void modesWindow::cb_statusToUserButtonClicked(modesWindow* self) { gtk_widget_set_sensitive(self->specialStatusList, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(self->useSpecialStatusButton))); } #define MW_ACTIVE(but) \ gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(self->but)) void modesWindow::cb_applyButtonClicked(modesWindow* self) { gulong sysGroups, userGroups, i; GtkTreeIter iter; gboolean selected; i=0; userGroups = 0; // apply groups if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(self->groupsStore), &iter)) { do { gtk_tree_model_get(GTK_TREE_MODEL(self->groupsStore), &iter, 0, &selected, -1); if (selected) userGroups|=(1<groupsStore), &iter)); } self->manager->parentUser->setLicqGroups(GROUPS_USER, userGroups); // apply accept modes self->manager->parentUser->setAcceptMode(AM_ACCEPTINAWAY, MW_ACTIVE(acceptAwayButton)); self->manager->parentUser->setAcceptMode(AM_ACCEPTINNA, MW_ACTIVE(acceptNAButton)); self->manager->parentUser->setAcceptMode(AM_ACCEPTINOCC, MW_ACTIVE(acceptOccButton)); self->manager->parentUser->setAcceptMode(AM_ACCEPTINDND, MW_ACTIVE(acceptDNDButton)); self->manager->parentUser->setAcceptMode(AM_AUTOACCEPTFILES, MW_ACTIVE(autoAcceptFilesButton)); self->manager->parentUser->setAcceptMode(AM_AUTOACCEPTCHATS, MW_ACTIVE(autoAcceptChatsButton)); self->manager->parentUser->setAcceptMode(AM_USEGPG, MW_ACTIVE(useGPGButton)); self->manager->parentUser->setAcceptMode(AM_AUTOSECURE, MW_ACTIVE(autoRequestSecureButton)); self->manager->parentUser->setAcceptMode(AM_SENDREALIP, MW_ACTIVE(useRealIPButton)); // apply the status if (MW_ACTIVE(useSpecialStatusButton)) self->manager->parentUser->setStatus(comboTexts[gtk_combo_box_get_active(GTK_COMBO_BOX(self->specialStatusList))].status); else self->manager->parentUser->setStatus(BUDDY_STATUS_OFFLINE); // apply the system groups sysGroups = 0; if (MW_ACTIVE(onlineNotifyButton)) sysGroups|=1<<(GROUP_ONLINE_NOTIFY-1); if (MW_ACTIVE(visibleListButton)) sysGroups|=1<<(GROUP_VISIBLE_LIST-1); if (MW_ACTIVE(invisibleListButton)) sysGroups|=1<<(GROUP_INVISIBLE_LIST-1); if (MW_ACTIVE(ignoreListButton)) sysGroups|=1<<(GROUP_IGNORE_LIST-1); self->manager->parentUser->setLicqGroups(GROUPS_SYSTEM, sysGroups); gtk_widget_set_sensitive(self->applyButton, FALSE); }