/*************************************************************************** * randomchat.cpp * * Thu Jun 22 22:03:42 2006 * Copyright 2006 User * Email ****************************************************************************/ #include "randomchat.h" #include "imbuddy.h" gchar* chatRooms[10] = {"General", "Romance", "Games", "Students", "20 Something", "30 Something", "40 Something", "50 Plus", "Seeking Women", "Seeking Men"}; selectRandomChatGroupWindow::selectRandomChatGroupWindow() { wType = UE_SETRANDOMCHAT; introText = g_strdup_printf("%s", tr("Please select the chat group that you'd like to participate on when you set your status to \"Free For Chat\".")); titleText = g_strdup(tr("Select chat group")); } selectRandomChatGroupWindow::~selectRandomChatGroupWindow() { } GtkWidget* selectRandomChatGroupWindow::createWindowContent() { GtkWidget *img, *label1, *hbox1, *vbox1, *vbox2, *scrolled; gchar *imgName; GtkCellRenderer *renderer; GtkTreeViewColumn *column; gchar i; gint currentGroup; GtkTreeIter iter; GtkTreePath *path; // create headline 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_widget_set_size_request(label1, 220, -1); imgName = g_strdup_printf("%sicqnd/chat.png", SHARE_DIR); img = gtk_image_new_from_file(imgName); g_free(imgName); hbox1 = gtk_hbox_new(FALSE, 5); gtk_box_pack_start(GTK_BOX(hbox1), img, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox1), label1, TRUE, TRUE, 0); // create the view currentGroup = ((IMRandomChatManager*)manager)->getChatGroup(); path = NULL; groupsStore = gtk_list_store_new(1, G_TYPE_STRING); for (i=0; i<10; i++) { gtk_list_store_append(groupsStore, &iter); gtk_list_store_set(groupsStore, &iter, 0, chatRooms[i], -1); if (i == currentGroup) path = gtk_tree_model_get_path(GTK_TREE_MODEL(groupsStore), &iter); } groupsView = gtk_tree_view_new_with_model(GTK_TREE_MODEL(groupsStore)); if (path) { gtk_tree_view_set_cursor(GTK_TREE_VIEW(groupsView), path, NULL, FALSE); gtk_tree_path_free(path); } gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(groupsView), FALSE); g_signal_connect_swapped(groupsView, "row-activated", G_CALLBACK(this->cb_okayButtonClicked), this); renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new_with_attributes("Room", renderer, "text", 0, 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_NEVER, GTK_POLICY_AUTOMATIC); gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled), GTK_SHADOW_IN); gtk_container_add(GTK_CONTAINER(scrolled), groupsView); // Add everything together vbox1 = gtk_vbox_new(FALSE, 10); gtk_container_set_border_width(GTK_CONTAINER(vbox1), 5); gtk_box_pack_start(GTK_BOX(vbox1), hbox1, FALSE, TRUE, 0); gtk_box_pack_start(GTK_BOX(vbox1), scrolled, TRUE, TRUE, 0); notebook = gtk_notebook_new(); gtk_notebook_set_show_tabs(GTK_NOTEBOOK(notebook), FALSE); gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox1, NULL); vbox2 = gtk_vbox_new(FALSE, 10); gtk_container_set_border_width(GTK_CONTAINER(vbox2), 10); gtk_box_pack_start(GTK_BOX(vbox2), notebook, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(vbox2), createButtonbar(), FALSE, TRUE, 0); setWindowTitle(titleText); setWindowSize(250, 400); return vbox2; } GtkWidget* selectRandomChatGroupWindow::createButtonbar() { GtkWidget *hbox, *okayButton, *cancelButton; okayButton = gtk_button_new_from_stock(GTK_STOCK_OK); g_signal_connect_swapped(okayButton, "clicked", G_CALLBACK(this->cb_okayButtonClicked), this); cancelButton = gtk_button_new_from_stock(GTK_STOCK_CANCEL); g_signal_connect_swapped(cancelButton, "clicked", G_CALLBACK(this->cb_destroyWindow), this); hbox = gtk_hbutton_box_new(); gtk_box_set_spacing(GTK_BOX(hbox), 3); gtk_button_box_set_layout(GTK_BUTTON_BOX(hbox), GTK_BUTTONBOX_END); gtk_box_pack_start(GTK_BOX(hbox), okayButton, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), cancelButton, FALSE, FALSE, 0); return hbox; } void selectRandomChatGroupWindow::destroyWindowContent() { delete manager; } void selectRandomChatGroupWindow::okayButtonClicked() { GtkTreePath *path; gtk_tree_view_get_cursor(GTK_TREE_VIEW(groupsView), &path, NULL); ((IMRandomChatManager*)manager)->setChatGroup(gtk_tree_path_get_indices(path)[0]); gtk_tree_path_free(path); cb_destroyWindow(this); } void selectRandomChatGroupWindow::cb_okayButtonClicked(selectRandomChatGroupWindow* self) { self->okayButtonClicked(); } // ============================================================================= startRandomChatWindow::startRandomChatWindow() { newUser = NULL; wType = UE_SETRANDOMCHAT; introText = g_strdup_printf("%s", tr("Please select the chat group that you want to look for a chat partner in")); titleText = tr("Start a random chat"); } startRandomChatWindow::~startRandomChatWindow() { } GtkWidget* startRandomChatWindow::createButtonbar() { GtkWidget *hbox, *hbox2, *cancelButton; sendAni = new processingAni(); sendAni->setupAnimation(i_getIcons()->images.searchingAni, 22, 22); findButton = gtk_button_new_from_stock(GTK_STOCK_FIND); g_signal_connect_swapped(findButton, "clicked", G_CALLBACK(this->cb_okayButtonClicked), this); cancelButton = gtk_button_new_from_stock(GTK_STOCK_CANCEL); g_signal_connect_swapped(cancelButton, "clicked", G_CALLBACK(this->cb_cancelButtonClicked), this); hbox = gtk_hbutton_box_new(); gtk_box_set_spacing(GTK_BOX(hbox), 3); gtk_button_box_set_layout(GTK_BUTTON_BOX(hbox), GTK_BUTTONBOX_END); gtk_box_pack_start(GTK_BOX(hbox), findButton, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), cancelButton, FALSE, FALSE, 0); hbox2 = gtk_hbox_new(FALSE, 3); gtk_box_pack_start(GTK_BOX(hbox2), sendAni->widget, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox2), hbox, TRUE, TRUE, 0); return hbox2; } gboolean startRandomChatWindow::eventCallback(gint command, gint lastResult, gpointer info) { if (command != UC_EVENT_FINISHED) return TRUE; gtk_widget_set_sensitive(findButton, TRUE); gtk_widget_set_sensitive(notebook, TRUE); sendAni->stop(); if (lastResult != EVENT_RESULT_ACKED && lastResult != EVENT_RESULT_SUCCESS) uu_showSendErrorMessage(tr("Error while searching"), tr("Could not search for a chat partner"), lastResult, manager->info->status); else // create the user-found window createUserFoundWindow(((IMUserDaemon*)info)); return TRUE; } void startRandomChatWindow::createUserFoundWindow(IMUserDaemon *user) { GtkWidget *label1, *label2, *viewInfoButton, *sendMessageButton, *addToListButton, *vbox, *vbbox; newUser = user; // We connect some functions so we can listen to user updates user->addCallback((IMEventCallback)cb_foundUserEventCallback, this); label1 = gtk_label_new("A chat partner was found. His alias is"); gtk_widget_set_size_request(label1, 250, -1); label2 = gtk_label_new("What would you like to do?"); aliasLabel = gtk_label_new(user->info->alias); viewInfoButton = u_createTextStockImageButton(tr("View users information"), ICON_INFO); g_signal_connect_swapped(viewInfoButton, "clicked", G_CALLBACK(this->cb_showUserInfoButtonClicked), this); sendMessageButton = u_createTextStockImageButton(tr("Start a chat"), ICON_MESSAGE); g_signal_connect_swapped(sendMessageButton, "clicked", G_CALLBACK(this->cb_startChatInfoButtonClicked), this); addToListButton = u_createTextStockImageButton(tr("Add to list permanently"), GTK_STOCK_ADD); g_signal_connect_swapped(addToListButton, "clicked", G_CALLBACK(this->cb_addPermanentlyButtonClicked), this); vbbox = gtk_vbutton_box_new(); gtk_button_box_set_layout(GTK_BUTTON_BOX(vbbox), GTK_BUTTONBOX_SPREAD); gtk_container_set_border_width(GTK_CONTAINER(vbbox), 10); gtk_box_set_spacing(GTK_BOX(vbbox), 20); gtk_box_pack_start(GTK_BOX(vbbox), viewInfoButton, FALSE, TRUE, 0); gtk_box_pack_start(GTK_BOX(vbbox), sendMessageButton, FALSE, TRUE, 0); gtk_box_pack_start(GTK_BOX(vbbox), addToListButton, FALSE, TRUE, 0); vbox = gtk_vbox_new(FALSE, 5); gtk_container_set_border_width(GTK_CONTAINER(vbox), 10); gtk_box_pack_start(GTK_BOX(vbox), label1, FALSE, TRUE, 0); gtk_box_pack_start(GTK_BOX(vbox), aliasLabel, FALSE, TRUE, 0); gtk_box_pack_start(GTK_BOX(vbox), label2, FALSE, TRUE, 0); gtk_box_pack_start(GTK_BOX(vbox), vbbox, TRUE, TRUE, 0); gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox, NULL); gtk_widget_show_all(notebook); gtk_notebook_set_current_page(GTK_NOTEBOOK(notebook), -1); gtk_widget_set_sensitive(findButton, FALSE); } void startRandomChatWindow::destroyWindowContent() { sendAni->stop(); delete sendAni; manager->cancelInitatedEvent(); // have we connected a listener function? -> remove it! if (newUser) newUser->removeCallback((IMEventCallback)this->cb_foundUserEventCallback); delete manager; } void startRandomChatWindow::okayButtonClicked() { GtkTreePath *path; sendAni->play(); gtk_widget_set_sensitive(findButton, FALSE); gtk_widget_set_sensitive(notebook, FALSE); // self->createUserFoundWindow(self->manager->parentUser); gtk_tree_view_get_cursor(GTK_TREE_VIEW(groupsView), &path, NULL); ((IMRandomChatManager*)manager)->searchForChatPartner(gtk_tree_path_get_indices(path)[0]); gtk_tree_path_free(path); } // --------------- void startRandomChatWindow::cb_cancelButtonClicked(startRandomChatWindow* self) { // we are searching -> cancel the event if (!GTK_WIDGET_SENSITIVE(self->notebook)) { self->manager->cancelInitatedEvent(); gtk_widget_set_sensitive(self->findButton, TRUE); gtk_widget_set_sensitive(self->notebook, TRUE); self->sendAni->stop(); } else cb_destroyWindow(self); } void startRandomChatWindow::cb_showUserInfoButtonClicked(startRandomChatWindow* self) { if (!self->newUser) return; self->newUser->startCallback(EC_FROMMANAGER, UE_USERINFO, NULL); } void startRandomChatWindow::cb_startChatInfoButtonClicked(startRandomChatWindow* self) { if (!self->newUser) return; self->newUser->startCallback(EC_FROMMANAGER, UE_MESSAGE, NULL); } void startRandomChatWindow::cb_addPermanentlyButtonClicked(startRandomChatWindow* self) { if (!self->newUser) return; ((IMOwnerDaemon*)self->manager->parentUser)->addUserToList(self->newUser->info->licqID, TRUE); } gboolean startRandomChatWindow::cb_foundUserEventCallback(userEventType type, gint command, gint lastResult, gpointer info, startRandomChatWindow* self) { gchar *newName; if (command == UC_UPDATEUSER && info) { newName = uu_getFormattedBuddyName(((IMUserDaemon*)info)->info, TRUE); gtk_label_set_label(GTK_LABEL(self->aliasLabel), newName); g_free(newName); } return TRUE; }