/*************************************************************************** * selectuser.cpp * * Thu Mar 23 01:20:29 2006 * Copyright 2006 User * Email ****************************************************************************/ #include "selectuser.h" selectUserWindow::selectUserWindow(gchar* text, gboolean multiple) { text? introText = g_strdup_printf("%s", text): introText = NULL; multipleSelection = multiple; } selectUserWindow::~selectUserWindow() { if (introText) g_free(introText); } GtkWidget* selectUserWindow::createWindowContent() { GtkWidget *vbox1, *vbox2, *label1; GList *search, *searchOwners; contactListUser *userEntry; IMUserDaemon *user; // create the contact list contacts = new contactList(); contacts->setMultipleHighlight(multipleSelection); contacts->setViewMode((contactViewType)0); // fill all users for (searchOwners = IO_getOwnerList(); searchOwners; searchOwners = searchOwners->next) { search = ((IMOwnerDaemon*)searchOwners->data)->users; for (; search; search = search->next) { user = (IMUserDaemon*)search->data; userEntry = new contactListUser(user, NULL); userEntry->setStatus(user->info->status, i_getIcons()->getUserStatusPixbuf(user)); contacts->addChild(userEntry); } } contacts->realizeEntry(TRUE); // setup tooltips tooltips = new userTooltips(); tooltips->attachWidget(contacts->widget, (UTWidgetFunc)cb_tooltipFunction, this); vbox1 = gtk_vbox_new(FALSE, 2); if (introText) { label1 = gtk_label_new(introText); gtk_label_set_use_markup(GTK_LABEL(label1), TRUE); gtk_label_set_line_wrap(GTK_LABEL(label1), TRUE); gtk_misc_set_alignment(GTK_MISC(label1), 0, 0); gtk_box_pack_start(GTK_BOX(vbox1), label1, FALSE, TRUE, 0); } gtk_box_pack_start(GTK_BOX(vbox1), contacts->frame, TRUE, TRUE, 0); vbox2 = gtk_vbox_new(FALSE, 10); gtk_container_set_border_width(GTK_CONTAINER(vbox2), 10); gtk_box_pack_start(GTK_BOX(vbox2), vbox1, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(vbox2), createButtonbar(), FALSE, TRUE, 0); setWindowSize(250, 400); setWindowTitle(tr("User selection")); g_signal_connect_swapped(gtk_tree_view_get_selection(GTK_TREE_VIEW(contacts->widget)), "changed", G_CALLBACK(cb_selectionChanged), this); g_signal_connect_swapped(contacts->widget, "row-activated", G_CALLBACK(cb_okayButtonClicked), this); cb_selectionChanged(this); return vbox2; } GtkWidget* selectUserWindow::createButtonbar() { GtkWidget *hbox, *closeButton; closeButton = gtk_button_new_from_stock(GTK_STOCK_CLOSE); g_signal_connect_swapped(closeButton, "clicked", G_CALLBACK(cb_destroyWindow), this); okayButton = gtk_button_new_from_stock(GTK_STOCK_OK); g_signal_connect_swapped(okayButton, "clicked", G_CALLBACK(cb_okayButtonClicked), this); hbox = gtk_hbox_new(FALSE, 2); gtk_box_pack_end(GTK_BOX(hbox), closeButton, FALSE, FALSE, 0); gtk_box_pack_end(GTK_BOX(hbox), okayButton, FALSE, FALSE, 0); return hbox; } void selectUserWindow::destroyWindowContent() { delete tooltips; delete contacts; } // --------------------------------------------------------- void selectUserWindow::cb_selectionChanged(selectUserWindow* self) { if (self->contacts->getFocusedEntry()) gtk_widget_set_sensitive(self->okayButton, TRUE); else gtk_widget_set_sensitive(self->okayButton, FALSE); } IMUserDaemon* selectUserWindow::cb_tooltipFunction(GtkWidget* w, GdkEventMotion* event, selectUserWindow* self) { contactListEntry *entry; entry = self->contacts->getEntryAtCursor((gint)event->x, (gint)event->y); if (entry && entry->type == CE_USER) return (IMUserDaemon*)entry->data; return NULL; } void selectUserWindow::cb_okayButtonClicked(selectUserWindow* self) { GList *selectedUsers, *selectedEntries, *search; contactListEntry *entry; selectedUsers = NULL; selectedEntries = self->contacts->getMultipleFocusedEntries(); // get the users from the entries for (search = selectedEntries; search; search = search->next) { entry = (contactListEntry*)search->data; if (entry->type == CE_USER) selectedUsers = g_list_append(selectedUsers, entry->data); } self->startCallback(UE_UNDEFINED, -1, 0, selectedUsers); g_list_free(selectedUsers); g_list_free(selectedEntries); self->destroyWindow(); delete self; }