/* Jungle Monkey * Copyright (C) 1999-2001 The Regents of the University of Michigan * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "ggui_properties.h" #include "ggui.h" #include "ggui_chat.h" #include "ggui_search.h" #include "util/util.h" #include "util/jmgnet.h" typedef struct _Properties { GURL* url; GtkWidget* dialog; GtkLabel* label; GtkText* text; } Properties; static GHashTable* url_to_properties = NULL; static void shutdown_hfunc (gpointer key, gpointer value, gpointer user_data); static Properties* properties_new (const GURL* url); static void properties_update (Properties* props); static void properties_delete (Properties* props); gboolean on_properties_dialog_destroy (GtkWidget* widget, gpointer user_data); void on_properties_button_clicked (GtkButton* button); /* **************************************** */ void ggui_properties_init (void) { url_to_properties = g_hash_table_new (gnet_url_hash, gnet_url_equal); } void ggui_properties_shutdown (void) { g_hash_table_foreach (url_to_properties, shutdown_hfunc, NULL); g_hash_table_destroy (url_to_properties); url_to_properties = NULL; } static void shutdown_hfunc (gpointer key, gpointer value, gpointer user_data) { Properties* props = (Properties*) value; GtkWidget* dialog; dialog = props->dialog; props->dialog = NULL; gtk_widget_destroy (dialog); properties_delete (props); } /* **************************************** */ void ggui_properties_show (const GURL* url) { Properties* props; g_return_if_fail (url); props = g_hash_table_lookup (url_to_properties, url); if (!props) { props = properties_new (url); g_return_if_fail (props); } properties_update (props); gtk_widget_show (props->dialog); } void ggui_properties_update (const GURL* url) { Properties* props; g_return_if_fail (url); props = g_hash_table_lookup (url_to_properties, url); if (!props) return; properties_update (props); } /* **************************************** */ static Properties* properties_new (const GURL* url) { gchar* name; GladeXML* xml; GtkWidget* dialog; GtkLabel* label; GtkText* text; GtkObject* button; Properties* props; gchar* title; g_return_val_if_fail (url, NULL); # ifdef JM_ENABLE_GNOME name = "properties_dialog_gnome"; # else name = "properties_dialog"; # endif xml = ggui_get_glade_xml (name, "properties_dialog.glade"); g_return_val_if_fail (xml, NULL); glade_xml_signal_autoconnect (xml); dialog = GTK_WIDGET(glade_xml_get_widget(xml, name)); label = GTK_LABEL( glade_xml_get_widget(xml, "properties_label")); text = GTK_TEXT( glade_xml_get_widget(xml, "properties_text")); button = GTK_OBJECT(glade_xml_get_widget(xml, "properties_button")); g_return_val_if_fail (dialog && label && text && button, NULL); props = g_new0 (Properties, 1); props->url = gnet_url_clone (url); props->dialog = dialog; props->label = label; props->text = text; gtk_object_set_user_data (GTK_OBJECT(dialog), props); gtk_object_set_user_data (button, props); title = g_strdup_printf (_("%s Properties"), gnet_url_basename(url)); gtk_window_set_title(GTK_WINDOW(dialog), title); g_free (title); GTK_WINDOW(dialog)->position = GTK_WIN_POS_MOUSE; g_hash_table_insert (url_to_properties, props->url, props); return props; } static void properties_update (Properties* props) { guint length; gchar* str = NULL; gchar* temp; gchar* url_str; g_return_if_fail (props); /* Set the label */ gtk_label_set_text (props->label, gnet_url_basename(props->url)); /* Delete everything in the text box */ gtk_text_set_point (props->text, 0); length = gtk_text_get_length (props->text); gtk_text_forward_delete (props->text, length); /* Set text appropriate to object */ if (!SAFESTRCMP(props->url->protocol, "jmchat")) str = ggui_chat_get_properties (props->url); else if (!SAFESTRCMP(props->url->protocol, "jmmsp")) str = ggui_search_get_properties (props->url); else str = g_strdup (""); /* Add URL */ url_str = gnet_url_get_nice_string (props->url); temp = g_strdup_printf(_("%sURL: %s\n"), str, url_str); g_free (url_str); g_free (str); str = temp; /* Insert text */ gtk_text_insert (props->text, NULL, NULL, NULL, str, strlen(str)); g_free(str); } static void properties_delete (Properties* props) { g_return_if_fail (props); gnet_url_delete (props->url); g_free (props); } /* **************************************** */ gboolean on_properties_dialog_destroy (GtkWidget* widget, gpointer user_data) { Properties* props; props = (Properties*) gtk_object_get_user_data(GTK_OBJECT(widget)); /* Only delete if dialog is set. Otherwise, props would get deleted twice because the other delete functions call widget_destory. */ if (props->dialog) { g_hash_table_remove (url_to_properties, props->url); properties_delete (props); } return TRUE; } void on_properties_button_clicked (GtkButton* button) { Properties* props; GtkWidget* dialog; props = (Properties*) gtk_object_get_user_data(GTK_OBJECT(button)); dialog = props->dialog; props->dialog = NULL; gtk_widget_destroy (dialog); g_hash_table_remove (url_to_properties, props->url); properties_delete (props); }