/***************************************************************************
* contactswindow.cpp
*
* Wed May 17 00:59:50 2006
* Copyright 2006 User
* Email
****************************************************************************/
#include "contactswindow.h"
contactsWindow::contactsWindow(gboolean _isServer):
requestDialog::requestDialog(FALSE, NULL, NULL, NULL, NULL, "contacts.png", (requestFunction)this->cb_requestCallback, this)
{
isServer = _isServer;
if (isServer)
{
topicText = g_strdup_printf("%s", tr("Send contacts to %s"));
infoText = g_strdup_printf("%s", tr("Please select the contacts you want to send."));
preTitle = g_strdup(tr("Send contacts to %s"));
requestName = g_strdup(tr("contacts"));
wType = UE_CONTACTSREQUEST;
} else
{
topicText = g_strdup_printf("%s", tr("Contacts from %s"));
infoText = g_strdup_printf("%s", tr("The user sent you contacts from his list. Please select the ones you wish to add."));
preTitle = g_strdup(tr("Contacts from %s"));
wType = UE_CONTACTS;
}
hasCommentbox = FALSE;
selection = NULL;
addCount = 0;
}
contactsWindow::~contactsWindow()
{
}
void contactsWindow::addContact(IMUserDaemon* contact)
{
contactListEntry *entry;
if (!selection)
return;
entry = selection->contacts->findChildByID(contact->info->licqID, CE_USER);
if (!entry)
return;
entry->setSelected(TRUE);
}
GtkWidget* contactsWindow::createWindowContent()
{
if (isServer)
specialWidget = createServerRequestWidget();
else
specialWidget = createRemoteWidget();
return requestDialog::createWindowContent();
}
void contactsWindow::destroyWindowContent()
{
if (selection)
delete selection;
delete manager;
}
GtkWidget* contactsWindow::createServerRequestWidget()
{
static const GtkTargetEntry targets[] =
{
{"application/x-im-contact", 0, DROP_GCONTACT}
};
selection = new contactsSelection(NULL);
gtk_drag_dest_set(selection->widget, GTK_DEST_DEFAULT_ALL, targets, 1, (GdkDragAction)(GDK_ACTION_COPY | GDK_ACTION_MOVE));
// gtk_tree_view_enable_model_drag_dest(GTK_TREE_VIEW(selection->contacts->widget), targets, 1, (GdkDragAction)(GDK_ACTION_COPY | GDK_ACTION_MOVE));
g_signal_connect_swapped(selection->widget, "drag-data-received", G_CALLBACK(this->cb_selectionEntryDropped), this);
return selection->widget;
}
GtkWidget* contactsWindow::createRemoteWidget()
{
GtkWidget *scrolled,
*hbox,
*vbox;
GtkTreeViewColumn *column;
GtkCellRenderer *renderer;
// -- create the tree view --
contactsStore = gtk_list_store_new(3, G_TYPE_BOOLEAN, G_TYPE_STRING, G_TYPE_STRING);
contactsView = gtk_tree_view_new_with_model(GTK_TREE_MODEL(contactsStore));
gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(contactsView), TRUE);
// the check box
renderer = gtk_cell_renderer_toggle_new();
column = gtk_tree_view_column_new_with_attributes("Add", renderer,
"active", 0,
NULL);
gtk_tree_view_append_column(GTK_TREE_VIEW(contactsView), column);
g_signal_connect (renderer, "toggled", G_CALLBACK(cb_contactsAddToggled), this);
// the alias field
renderer = gtk_cell_renderer_text_new();
column = gtk_tree_view_column_new_with_attributes("Alias", renderer,
"text", 1,
NULL);
gtk_tree_view_column_set_expand(column, TRUE);
gtk_tree_view_append_column(GTK_TREE_VIEW(contactsView), column);
// the id field
renderer = gtk_cell_renderer_text_new();
column = gtk_tree_view_column_new_with_attributes("ID", renderer,
"text", 2,
NULL);
gtk_tree_view_column_set_expand(column, TRUE);
gtk_tree_view_append_column(GTK_TREE_VIEW(contactsView), column);
scrolled = gtk_scrolled_window_new(NULL, NULL);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
gtk_container_add(GTK_CONTAINER(scrolled), contactsView);
gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled), GTK_SHADOW_IN);
// -- create the button bar
infoButton = u_createStockImageButton(ICON_INFO);
g_object_set_data(G_OBJECT(infoButton), "icqnd-contactsev", GUINT_TO_POINTER(UE_USERINFO));
g_signal_connect(infoButton, "clicked", G_CALLBACK(this->cb_userButtonClicked), this);
messageButton = u_createStockImageButton(ICON_MESSAGE);
g_object_set_data(G_OBJECT(messageButton), "icqnd-contactsev", GUINT_TO_POINTER(UE_MESSAGE));
g_signal_connect(messageButton, "clicked", G_CALLBACK(this->cb_userButtonClicked), this);
chatButton = u_createStockImageButton(ICON_CHAT);
g_object_set_data(G_OBJECT(chatButton), "icqnd-contactsev", GUINT_TO_POINTER(UE_CHATREQUEST));
g_signal_connect(chatButton, "clicked", G_CALLBACK(this->cb_userButtonClicked), this);
filetransferButton = u_createStockImageButton(ICON_FILE);
g_object_set_data(G_OBJECT(filetransferButton), "icqnd-contactsev", GUINT_TO_POINTER(UE_FILETRANSFERREQUEST));
g_signal_connect(filetransferButton, "clicked", G_CALLBACK(this->cb_userButtonClicked), this);
hbox = gtk_hbox_new(FALSE, 2);
gtk_box_pack_start(GTK_BOX(hbox), infoButton, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(hbox), messageButton, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(hbox), chatButton, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(hbox), filetransferButton, FALSE, FALSE, 0);
// add everything
vbox = gtk_vbox_new(FALSE, 2);
gtk_box_pack_start(GTK_BOX(vbox), scrolled, TRUE, TRUE, 0);
gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, TRUE, 0);
g_signal_connect_swapped(gtk_tree_view_get_selection(GTK_TREE_VIEW(contactsView)), "changed", G_CALLBACK(this->cb_contactsFocusChanged), this);
cb_contactsFocusChanged(this);
return vbox;
}
gboolean contactsWindow::sendSelectedContacts()
{
GList *entries,
*search,
*users;
if (!selection)
return FALSE;
entries = selection->getSelectedEntries();
if (!entries)
{
u_showAlertMessage(tr("No entries selected"), tr("You selected no entries. Please select at least one user to send"), GTK_STOCK_DIALOG_WARNING);
return FALSE;
}
users = NULL;
for (search = entries; search; search = search->next)
users = g_list_append(users, ((contactListEntry*)search->data)->data);
((IMContactsManager*)manager)->sendContacts(users);
g_list_free(users);
g_list_free(entries);
return TRUE;
}
void contactsWindow::fillContactsBox(contactsEventInfo* info)
{
GList *search;
GtkTreeIter iter;
IMUserInfoBasic *basicInfo;
for (search = info->contacts; search; search = search->next)
{
basicInfo = (IMUserInfoBasic*)search->data;
gtk_list_store_append(contactsStore, &iter);
gtk_list_store_set(contactsStore, &iter,
0, TRUE,
1, basicInfo->alias,
2, basicInfo->licqID,
-1);
addCount++;
}
updateAddButton();
}
GtkWidget* contactsWindow::createButtonbar()
{
GtkWidget *hbox;
if (isServer)
return requestDialog::createButtonbar();
else
{
alertUsersCheckbox = gtk_check_button_new_with_label("Alert users");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(alertUsersCheckbox), TRUE);
addUsersButton = gtk_button_new_with_label("");
g_signal_connect_swapped(addUsersButton, "clicked", G_CALLBACK(cb_addUsersButtonClicked), this);
closeButton = gtk_button_new_from_stock(GTK_STOCK_CLOSE);
g_signal_connect_swapped(closeButton, "clicked", G_CALLBACK(this->cb_closeButtonClicked), 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), alertUsersCheckbox, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(hbox), addUsersButton, FALSE, FALSE, 0);
gtk_box_pack_end(GTK_BOX(hbox), closeButton, FALSE, FALSE, 0);
return hbox;
}
}
void contactsWindow::updateAddButton()
{
gchar *text;
if (addCount == 1)
text = g_strdup_printf(tr("Add 1 User"));
else
text = g_strdup_printf(tr("Add %d Users"), addCount);
gtk_button_set_label(GTK_BUTTON(addUsersButton), text);
gtk_widget_set_sensitive(addUsersButton, addCount!=0);
g_free(text);
}
gboolean contactsWindow::eventCallback(gint command, gint lastResult, gpointer info)
{
switch(command)
{
case UC_EVENT_FINISHED:
stopWaitForRequestAnswer();
if (lastResult != EVENT_RESULT_SUCCESS && lastResult != EVENT_RESULT_ACKED)
uu_showSendErrorMessage(tr("Could not send files"), tr("Sending of the request to send files failed"), lastResult, manager->parentUser->owner->info->status);
else
{
destroyWindow();
delete this;
}
break;
case UC_EVENT_RECEIVED:
fillContactsBox((contactsEventInfo*)info);
manager->deleteEvent(EO_FIRST | EO_NORMAL);
break;
}
return TRUE;
}
// -----------------------------------------------------------------------------
void contactsWindow::cb_requestCallback(gint result, gpointer info, contactsWindow* self)
{
if (self->isServer)
switch(result)
{
case REQUEST_ACCEPTED:
if (self->sendSelectedContacts())
self->waitForRequestAnswer();
break;
case REQUEST_CANCELLED:
self->manager->cancelInitatedEvent();
self->stopWaitForRequestAnswer();
break;
}
}
void contactsWindow::cb_contactsAddToggled(GtkCellRendererToggle *cell, gchar *pathStr, contactsWindow* self)
{
GtkTreeIter iter;
GtkTreePath *path;
gboolean setting;
path = gtk_tree_path_new_from_string(pathStr);
gtk_tree_model_get_iter(GTK_TREE_MODEL(self->contactsStore), &iter, path);
gtk_tree_model_get(GTK_TREE_MODEL(self->contactsStore), &iter, 0, &setting, -1);
setting = !setting;
gtk_list_store_set(self->contactsStore, &iter, 0, setting, -1);
if (setting)
self->addCount++;
else
self->addCount--;
self->updateAddButton();
gtk_tree_path_free(path);
}
void contactsWindow::cb_contactsFocusChanged(contactsWindow* self)
{
GtkTreePath *path;
gtk_tree_view_get_cursor(GTK_TREE_VIEW(self->contactsView), &path, NULL);
gtk_widget_set_sensitive(self->infoButton, path != NULL);
gtk_widget_set_sensitive(self->chatButton, path != NULL);
gtk_widget_set_sensitive(self->filetransferButton, path != NULL);
gtk_widget_set_sensitive(self->messageButton, path != NULL);
if (path)
gtk_tree_path_free(path);
}
void contactsWindow::cb_userButtonClicked(GtkWidget* w, contactsWindow* self)
{
IMUserDaemon *user;
IMBuddy *buddy;
guint toCall;
GtkTreePath *path;
GtkTreeIter iter;
gchar *id,
*alias;
gtk_tree_view_get_cursor(GTK_TREE_VIEW(self->contactsView), &path, NULL);
if (path)
{
gtk_tree_model_get_iter(GTK_TREE_MODEL(self->contactsStore), &iter, path);
gtk_tree_model_get(GTK_TREE_MODEL(self->contactsStore), &iter,
1, &alias,
2, &id,
-1);
if (!(user = ((IMOwnerDaemon*)self->manager->parentUser->owner)->findUserByID(id)))
{
user = ((IMOwnerDaemon*)self->manager->parentUser->owner)->addUserTemporally(id);
user->info->alias = g_strdup(alias);
}
if (!user->dowry)
buddy = new IMBuddy(user);
else
buddy = (IMBuddy*)user->dowry;
toCall = GPOINTER_TO_UINT(g_object_get_data(G_OBJECT(w), "icqnd-contactsev"));
buddy->openEvent((userEventType)toCall, FALSE);
gtk_tree_path_free(path);
}
}
void contactsWindow::cb_addUsersButtonClicked(contactsWindow* self)
{
GtkTreeIter iter;
gchar *id;
gboolean doAlert;
doAlert = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(self->alertUsersCheckbox));
if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(self->contactsStore), &iter))
{
do
{
gtk_tree_model_get(GTK_TREE_MODEL(self->contactsStore), &iter, 2, &id, -1);
((IMOwnerDaemon*)self->manager->parentUser->owner)->addUserToList(id, doAlert);
} while(gtk_tree_model_iter_next(GTK_TREE_MODEL(self->contactsStore), &iter));
}
self->cb_closeButtonClicked(self);
}
void contactsWindow::cb_selectionEntryDropped(contactsWindow* self,
GdkDragContext *drag_context,
gint x,
gint y,
GtkSelectionData *data,
guint info,
guint time)
{
IMOwnerDaemon *owner;
IMUserDaemon *dragUser;
gchar *id,
*alias;
// FIXME: free id and alias afterwards
uu_getFromGaimDnDMimeType((gchar*)data->data, &id, &alias, &owner, NULL);
if (!id)
return;
uu_getUserFromDnDInfo(id, alias, owner, &dragUser, &owner);
// 2ADD: maybe some kind of error message
if (!owner || !dragUser || owner != self->manager->parentUser->owner)
return;
self->addContact(dragUser);
}