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