/***************************************************************************
* 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;
}