diff options
Diffstat (limited to 'src/nautilus-emblem-sidebar.c')
-rw-r--r-- | src/nautilus-emblem-sidebar.c | 1110 |
1 files changed, 0 insertions, 1110 deletions
diff --git a/src/nautilus-emblem-sidebar.c b/src/nautilus-emblem-sidebar.c deleted file mode 100644 index 8da5aedfe..000000000 --- a/src/nautilus-emblem-sidebar.c +++ /dev/null @@ -1,1110 +0,0 @@ - /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ - -/* - * Nautilus - * - * Copyright (C) 1999, 2000, 2001 Eazel, Inc. - * Copyright (C) 2001 Red Hat, Inc. - * - * Nautilus 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. - * - * Nautilus 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 - * - * Authors: James Willcox <jwillcox@gnome.org> - * Alexander Larsson <alexl@redhat.com> - * - * This is a sidebar displaying emblems which can be dragged onto files to - * set/unset the chosen emblem. - * - */ - -#include <config.h> -#include "nautilus-emblem-sidebar.h" - -#include <stdio.h> -#include <eel/eel-gtk-macros.h> -#include <eel/eel-glib-extensions.h> -#include <eel/eel-string.h> -#include <eel/eel-wrap-table.h> -#include <eel/eel-labeled-image.h> -#include <eel/eel-graphic-effects.h> -#include <eel/eel-gdk-pixbuf-extensions.h> -#include <eel/eel-stock-dialogs.h> -#include <gdk-pixbuf/gdk-pixbuf.h> -#include <gtk/gtk.h> -#include <glib/gi18n.h> -#include <gconf/gconf-client.h> -#include <libnautilus-private/nautilus-icon-dnd.h> -#include <libnautilus-private/nautilus-emblem-utils.h> -#include <libnautilus-private/nautilus-file-utilities.h> -#include <libnautilus-private/nautilus-sidebar-provider.h> -#include <libnautilus-private/nautilus-module.h> -#include <libnautilus-private/nautilus-signaller.h> - -struct NautilusEmblemSidebarDetails { - NautilusWindowInfo *window; - GConfClient *client; - GtkWidget *emblems_table; - GtkWidget *popup; - GtkWidget *popup_remove; - GtkWidget *popup_rename; - - char *popup_emblem_keyword; - char *popup_emblem_display_name; - GdkPixbuf *popup_emblem_pixbuf; -}; - -#define ERASE_EMBLEM_KEYWORD "erase" -#define STANDARD_EMBLEM_HEIGHT 52 -#define EMBLEM_LABEL_SPACING 2 - -static void nautilus_emblem_sidebar_iface_init (NautilusSidebarIface *iface); -static void nautilus_emblem_sidebar_finalize (GObject *object); -static void nautilus_emblem_sidebar_populate (NautilusEmblemSidebar *emblem_sidebar); -static void nautilus_emblem_sidebar_refresh (NautilusEmblemSidebar *emblem_sidebar); -static void nautilus_emblem_sidebar_iface_init (NautilusSidebarIface *iface); -static void sidebar_provider_iface_init (NautilusSidebarProviderIface *iface); -static GType nautilus_emblem_sidebar_provider_get_type (void); - -static const GtkTargetEntry drag_types[] = { - {"property/keyword", 0, 0 } -}; - -enum { - TARGET_URI_LIST, - TARGET_URI, - TARGET_NETSCAPE_URL -}; - -static const GtkTargetEntry dest_types[] = { - {"text/uri-list", 0, TARGET_URI_LIST}, - {"text/plain", 0, TARGET_URI}, - {"_NETSCAPE_URL", 0, TARGET_NETSCAPE_URL} -}; - -typedef struct _Emblem { - GdkPixbuf *pixbuf; - char *uri; - char *name; - char *keyword; -} Emblem; - -typedef struct { - GObject parent; -} NautilusEmblemSidebarProvider; - -typedef struct { - GObjectClass parent; -} NautilusEmblemSidebarProviderClass; - - - - -G_DEFINE_TYPE_WITH_CODE (NautilusEmblemSidebar, nautilus_emblem_sidebar, GTK_TYPE_VBOX, - G_IMPLEMENT_INTERFACE (NAUTILUS_TYPE_SIDEBAR, - nautilus_emblem_sidebar_iface_init)); - -G_DEFINE_TYPE_WITH_CODE (NautilusEmblemSidebarProvider, nautilus_emblem_sidebar_provider, G_TYPE_OBJECT, - G_IMPLEMENT_INTERFACE (NAUTILUS_TYPE_SIDEBAR_PROVIDER, - sidebar_provider_iface_init)); - -static void -nautilus_emblem_sidebar_drag_data_get_cb (GtkWidget *widget, - GdkDragContext *context, - GtkSelectionData *data, - guint info, - guint time, - NautilusEmblemSidebar *emblem_sidebar) -{ - char *keyword; - - keyword = g_object_get_data (G_OBJECT (widget), "emblem-keyword"); - - g_return_if_fail (keyword != NULL); - - gtk_selection_data_set (data, gtk_selection_data_get_target (data), 8, - keyword, - strlen (keyword)); -} - -static void -nautilus_emblem_sidebar_enter_notify_cb (GtkWidget *widget, - NautilusEmblemSidebar *emblem_sidebar) -{ - GdkPixbuf *pixbuf; - EelLabeledImage *image; - - pixbuf = g_object_get_data (G_OBJECT (widget), "prelight-pixbuf"); - image = g_object_get_data (G_OBJECT (widget), "labeled-image"); - - eel_labeled_image_set_pixbuf (EEL_LABELED_IMAGE (image), pixbuf); -} - -static void -nautilus_emblem_sidebar_leave_notify_cb (GtkWidget *widget, - NautilusEmblemSidebar *emblem_sidebar) -{ - GdkPixbuf *pixbuf; - EelLabeledImage *image; - - pixbuf = g_object_get_data (G_OBJECT (widget), "original-pixbuf"); - image = g_object_get_data (G_OBJECT (widget), "labeled-image"); - - eel_labeled_image_set_pixbuf (EEL_LABELED_IMAGE (image), pixbuf); -} - -static gboolean -nautilus_emblem_sidebar_button_press_cb (GtkWidget *widget, - GdkEventButton *event, - NautilusEmblemSidebar *emblem_sidebar) -{ - char *keyword, *name; - GdkPixbuf *pixbuf; - - if (event->button == 3) { - keyword = g_object_get_data (G_OBJECT (widget), - "emblem-keyword"); - name = g_object_get_data (G_OBJECT (widget), - "emblem-display-name"); - pixbuf = g_object_get_data (G_OBJECT (widget), - "original-pixbuf"); - - emblem_sidebar->details->popup_emblem_keyword = keyword; - emblem_sidebar->details->popup_emblem_display_name = name; - emblem_sidebar->details->popup_emblem_pixbuf = pixbuf; - - gtk_widget_set_sensitive (emblem_sidebar->details->popup_remove, - nautilus_emblem_can_remove_emblem (keyword)); - gtk_widget_set_sensitive (emblem_sidebar->details->popup_rename, - nautilus_emblem_can_rename_emblem (keyword)); - - - gtk_menu_popup (GTK_MENU (emblem_sidebar->details->popup), - NULL, NULL, NULL, NULL, event->button, - event->time); - } - - return TRUE; -} - -static void -send_emblems_changed (void) -{ - g_signal_emit_by_name (nautilus_signaller_get_current (), - "emblems_changed"); -} - -static void -emblems_changed_callback (GObject *signaller, - NautilusEmblemSidebar *emblem_sidebar) -{ - nautilus_emblem_sidebar_refresh (emblem_sidebar); -} - -static void -nautilus_emblem_sidebar_delete_cb (GtkWidget *menu_item, - NautilusEmblemSidebar *emblem_sidebar) -{ - char *error; - - if (nautilus_emblem_remove_emblem (emblem_sidebar->details->popup_emblem_keyword)) { - send_emblems_changed (); - } else { - error = g_strdup_printf (_("Could not remove emblem with name '%s'."), emblem_sidebar->details->popup_emblem_display_name); - eel_show_error_dialog (error, _("This is probably because the emblem is a permanent one, and not one that you added yourself."), - NULL); - g_free (error); - } -} - -static void -rename_dialog_response_cb (GtkWidget *dialog, int response, - NautilusEmblemSidebar *emblem_sidebar) -{ - GtkWidget *entry; - char *keyword, *name, *error; - - keyword = g_object_get_data (G_OBJECT (dialog), "emblem-keyword"); - - if (response == GTK_RESPONSE_CANCEL) { - g_free (keyword); - gtk_widget_destroy (dialog); - return; - } else if (response == GTK_RESPONSE_HELP) { - g_message ("Implement me!"); - return; - } - - entry = g_object_get_data (G_OBJECT (dialog), "entry"); - - name = g_strdup (gtk_entry_get_text (GTK_ENTRY (entry))); - - gtk_widget_destroy (dialog); - - if (nautilus_emblem_rename_emblem (keyword, name)) { - send_emblems_changed (); - } else { - error = g_strdup_printf (_("Could not rename emblem with name '%s'."), name); - eel_show_error_dialog (error, _("This is probably because the emblem is a permanent one, and not one that you added yourself."), - NULL); - g_free (error); - } - - g_free (keyword); - g_free (name); -} - -static GtkWidget * -create_rename_emblem_dialog (NautilusEmblemSidebar *emblem_sidebar, - const char *keyword, const char *orig_name, - GdkPixbuf *pixbuf) -{ - GtkWidget *dialog, *label, *image, *entry, *hbox; - - image = gtk_image_new_from_pixbuf (pixbuf); - entry = gtk_entry_new (); - - dialog = gtk_dialog_new_with_buttons (_("Rename Emblem"), - NULL, - 0, - GTK_STOCK_CANCEL, - GTK_RESPONSE_CANCEL, - GTK_STOCK_OK, - GTK_RESPONSE_OK, - GTK_STOCK_HELP, - GTK_RESPONSE_HELP, - NULL); - - gtk_dialog_set_default_response (GTK_DIALOG (dialog), - GTK_RESPONSE_OK); - - g_object_set_data (G_OBJECT (dialog), "emblem-keyword", - g_strdup (keyword)); - g_object_set_data (G_OBJECT (dialog), "entry", - entry); - - label = gtk_label_new (_("Enter a new name for the displayed emblem:")); - gtk_widget_show (label); - gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog))), label, - FALSE, FALSE, 8); - - - hbox = gtk_hbox_new (FALSE, 8); - gtk_box_pack_start (GTK_BOX (hbox), image, TRUE, TRUE, 8); - - gtk_entry_set_activates_default (GTK_ENTRY (entry), TRUE); - - gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, FALSE, 8); - gtk_widget_show_all (hbox); - - /* it would be nice to have the text selected, ready to be overwritten - * by the user, but that doesn't seem possible. - */ - gtk_widget_grab_focus (entry); - gtk_entry_set_text (GTK_ENTRY (entry), orig_name); - - gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog))), hbox, - TRUE, TRUE, 8); - - - return dialog; -} - -static void -nautilus_emblem_sidebar_rename_cb (GtkWidget *menu_item, - NautilusEmblemSidebar *emblem_sidebar) -{ - GtkWidget *dialog; - - dialog = create_rename_emblem_dialog (emblem_sidebar, - emblem_sidebar->details->popup_emblem_keyword, - emblem_sidebar->details->popup_emblem_display_name, - emblem_sidebar->details->popup_emblem_pixbuf); - g_signal_connect (dialog, "response", - G_CALLBACK (rename_dialog_response_cb), - emblem_sidebar); - gtk_widget_show (dialog); -} - -static void -create_popup_menu (NautilusEmblemSidebar *emblem_sidebar) -{ - GtkWidget *popup, *menu_item, *menu_image; - - popup = gtk_menu_new (); - - /* add the "rename" menu item */ - menu_image = gtk_image_new_from_stock (GTK_STOCK_PROPERTIES, - GTK_ICON_SIZE_MENU); - gtk_widget_show (menu_image); - menu_item = gtk_image_menu_item_new_with_label (_("Rename")); - gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_item), - menu_image); - - g_signal_connect (menu_item, "activate", - G_CALLBACK (nautilus_emblem_sidebar_rename_cb), - emblem_sidebar); - gtk_widget_show (menu_item); - gtk_menu_shell_append (GTK_MENU_SHELL (popup), menu_item); - emblem_sidebar->details->popup_rename = menu_item; - - /* add "delete" menu item */ - menu_item = gtk_image_menu_item_new_from_stock (GTK_STOCK_DELETE, - NULL); - g_signal_connect (menu_item, "activate", - G_CALLBACK (nautilus_emblem_sidebar_delete_cb), - emblem_sidebar); - gtk_widget_show (menu_item); - gtk_menu_shell_append (GTK_MENU_SHELL (popup), menu_item); - emblem_sidebar->details->popup_remove = menu_item; - - emblem_sidebar->details->popup = popup; -} - -static GtkWidget * -create_emblem_widget_with_pixbuf (NautilusEmblemSidebar *emblem_sidebar, - const char *keyword, - const char *display_name, - GdkPixbuf *pixbuf) -{ - GtkWidget *image, *event_box; - GdkPixbuf *prelight_pixbuf; - - - image = eel_labeled_image_new (display_name, pixbuf); - - eel_labeled_image_set_fixed_image_height (EEL_LABELED_IMAGE (image), - STANDARD_EMBLEM_HEIGHT); - eel_labeled_image_set_spacing (EEL_LABELED_IMAGE (image), - EMBLEM_LABEL_SPACING); - event_box = gtk_event_box_new (); - gtk_container_add (GTK_CONTAINER (event_box), image); - - prelight_pixbuf = eel_create_spotlight_pixbuf (pixbuf); - - - gtk_drag_source_set (event_box, GDK_BUTTON1_MASK, drag_types, - G_N_ELEMENTS (drag_types), - GDK_ACTION_COPY | GDK_ACTION_MOVE); - - gtk_drag_source_set_icon_pixbuf (event_box, pixbuf); - - - - g_signal_connect (event_box, "button_press_event", - G_CALLBACK (nautilus_emblem_sidebar_button_press_cb), - emblem_sidebar); - g_signal_connect (event_box, "drag-data-get", - G_CALLBACK (nautilus_emblem_sidebar_drag_data_get_cb), - emblem_sidebar); - g_signal_connect (event_box, "enter-notify-event", - G_CALLBACK (nautilus_emblem_sidebar_enter_notify_cb), - emblem_sidebar); - g_signal_connect (event_box, "leave-notify-event", - G_CALLBACK (nautilus_emblem_sidebar_leave_notify_cb), - emblem_sidebar); - - g_object_set_data_full (G_OBJECT (event_box), - "emblem-keyword", - g_strdup (keyword), g_free); - g_object_set_data_full (G_OBJECT (event_box), - "emblem-display-name", - g_strdup (display_name), g_free); - g_object_set_data_full (G_OBJECT (event_box), - "original-pixbuf", - pixbuf, g_object_unref); - g_object_set_data_full (G_OBJECT (event_box), - "prelight-pixbuf", - prelight_pixbuf, g_object_unref); - g_object_set_data (G_OBJECT (event_box), - "labeled-image", image); - - return event_box; - -} - -static GtkWidget * -create_emblem_widget (NautilusEmblemSidebar *emblem_sidebar, - const char *name) -{ - GtkWidget *ret; - const char *display_name; - char *keyword; - GdkPixbuf *pixbuf; - NautilusIconInfo *info; - - info = nautilus_icon_info_lookup_from_name (name, NAUTILUS_ICON_SIZE_STANDARD); - - pixbuf = nautilus_icon_info_get_pixbuf_at_size (info, NAUTILUS_ICON_SIZE_STANDARD); - - display_name = nautilus_icon_info_get_display_name (info); - - keyword = nautilus_emblem_get_keyword_from_icon_name (name); - if (display_name == NULL) { - display_name = keyword; - } - - ret = create_emblem_widget_with_pixbuf (emblem_sidebar, keyword, - display_name, pixbuf); - g_free (keyword); - g_object_unref (info); - return ret; -} - -static void -emblem_name_entry_changed_cb (GtkWidget *entry, Emblem *emblem) -{ - char *text; - - g_free (emblem->name); - - text = gtk_editable_get_chars (GTK_EDITABLE (entry), 0, -1); - - emblem->name = g_strdup (text); -} - - -static void -destroy_emblem (Emblem *emblem, gpointer user_data) -{ - g_return_if_fail (emblem != NULL); - - - if (emblem->pixbuf != NULL) { - g_object_unref (emblem->pixbuf); - emblem->pixbuf = NULL; - } - - if (emblem->name != NULL) { - g_free (emblem->name); - emblem->name = NULL; - } - - if (emblem->uri != NULL) { - g_free (emblem->uri); - emblem->uri = NULL; - } - - if (emblem->keyword != NULL) { - g_free (emblem->keyword); - emblem->keyword = NULL; - } - - g_free (emblem); -} - -static void -destroy_emblem_list (GSList *list) -{ - g_slist_foreach (list, (GFunc)destroy_emblem, NULL); - g_slist_free (list); -} - -static GtkWidget * -create_add_emblems_dialog (NautilusEmblemSidebar *emblem_sidebar, - GSList *emblems) -{ - GtkWidget *dialog, *label, *table, *image; - GtkWidget *first_entry, *entry, *scroller, *hbox; - Emblem *emblem; - GSList *list; - int num_emblems; - - first_entry = NULL; - - dialog = gtk_dialog_new_with_buttons (_("Add Emblems..."), - NULL, - 0, - GTK_STOCK_CANCEL, - GTK_RESPONSE_CANCEL, - GTK_STOCK_OK, - GTK_RESPONSE_OK, - GTK_STOCK_HELP, - GTK_RESPONSE_HELP, - NULL); - - gtk_dialog_set_default_response (GTK_DIALOG (dialog), - GTK_RESPONSE_OK); - - /* FIXME: make a better message */ - if (g_slist_length (emblems) > 1) { - label = gtk_label_new (_("Enter a descriptive name next to each emblem. This name will be used in other places to identify the emblem.")); - } else { - label = gtk_label_new (_("Enter a descriptive name next to the emblem. This name will be used in other places to identify the emblem.")); - } - - gtk_label_set_line_wrap (GTK_LABEL (label), TRUE); - gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog))), - label, FALSE, FALSE, 8); - gtk_widget_show (label); - - scroller = eel_scrolled_wrap_table_new (TRUE, GTK_SHADOW_NONE, &table); - eel_wrap_table_set_x_spacing (EEL_WRAP_TABLE (table), 8); - eel_wrap_table_set_y_spacing (EEL_WRAP_TABLE (table), 8); - - num_emblems=0; - list = emblems; - while (list != NULL) { - /* walk through the list of emblems, and create an image - * and entry for each one - */ - - emblem = (Emblem *)list->data; - list = list->next; - - image = gtk_image_new_from_pixbuf (emblem->pixbuf); - - hbox = gtk_hbox_new (TRUE, 0); - gtk_box_pack_start (GTK_BOX (hbox), image, FALSE, FALSE, 0); - - entry = gtk_entry_new (); - gtk_entry_set_activates_default (GTK_ENTRY (entry), TRUE); - g_signal_connect (entry, "changed", - G_CALLBACK (emblem_name_entry_changed_cb), - emblem); - - gtk_box_pack_start (GTK_BOX (hbox), entry, FALSE, FALSE, 0); - gtk_container_add (GTK_CONTAINER (table), hbox); - - if (num_emblems == 0) { - first_entry = entry; - } - - num_emblems++; - } - - gtk_container_set_border_width (GTK_CONTAINER (dialog), 8); - gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog))), - scroller, TRUE, TRUE, 8); - gtk_widget_show_all (scroller); - - gtk_widget_grab_focus (first_entry); - - /* we expand the window to hold up to about 4 emblems, but after that - * let the scroller do its thing. Is there a better way to do this? - */ - gtk_window_set_default_size (GTK_WINDOW (dialog), 400, - MIN (120+(60*num_emblems), 350)); - - g_object_set_data_full (G_OBJECT (dialog), "emblems-to-add", - emblems, (GDestroyNotify)destroy_emblem_list); - - return dialog; -} - -static void -remove_widget (GtkWidget *widget, GtkContainer *container) -{ - gtk_container_remove (container, widget); -} - -static void -nautilus_emblem_sidebar_refresh (NautilusEmblemSidebar *emblem_sidebar) -{ - nautilus_emblem_refresh_list (); - - gtk_container_foreach (GTK_CONTAINER (emblem_sidebar->details->emblems_table), - (GtkCallback)remove_widget, - emblem_sidebar->details->emblems_table); - - nautilus_emblem_sidebar_populate (emblem_sidebar); -} - -static void -add_emblems_dialog_response_cb (GtkWidget *dialog, int response, - NautilusEmblemSidebar *emblem_sidebar) -{ - Emblem *emblem; - GSList *emblems; - GSList *l; - - switch (response) { - case GTK_RESPONSE_CANCEL: - gtk_widget_destroy (dialog); - break; - - case GTK_RESPONSE_HELP: - g_message ("Implement me!"); - break; - - case GTK_RESPONSE_OK: - emblems = g_object_get_data (G_OBJECT (dialog), - "emblems-to-add"); - - for (l = emblems; l; l = l->next) { - char *keyword; - - emblem = (Emblem *)l->data; - if (emblem->keyword != NULL) { - /* this one has already been verified */ - continue; - } - - keyword = nautilus_emblem_create_unique_keyword (emblem->name); - if (!nautilus_emblem_verify_keyword - (GTK_WINDOW (dialog), keyword, emblem->name)) { - g_free (keyword); - return; - } else { - emblem->keyword = keyword; - } - - } - - for (l = emblems; l; l = l->next) { - emblem = (Emblem *)l->data; - - nautilus_emblem_install_custom_emblem (emblem->pixbuf, - emblem->keyword, - emblem->name, - GTK_WINDOW (dialog)); - } - - gtk_widget_destroy (dialog); - - send_emblems_changed (); - break; - } -} - -static void -show_add_emblems_dialog (NautilusEmblemSidebar *emblem_sidebar, - GSList *emblems) -{ - GtkWidget *dialog; - - g_return_if_fail (emblems != NULL); - - dialog = create_add_emblems_dialog (emblem_sidebar, emblems); - - if (dialog == NULL) { - return; - } - - g_signal_connect (dialog, "response", - G_CALLBACK (add_emblems_dialog_response_cb), - emblem_sidebar); - - gtk_window_present (GTK_WINDOW (dialog)); -} - -static void -nautilus_emblem_sidebar_drag_received_cb (GtkWidget *widget, - GdkDragContext *drag_context, - gint x, - gint y, - GtkSelectionData *data, - guint info, - guint time, - NautilusEmblemSidebar *emblem_sidebar) -{ - GSList *emblems; - Emblem *emblem; - GdkPixbuf *pixbuf; - char *uri, *error, *uri_utf8; - char **uris; - GFile *f; - int i; - gboolean had_failure; - gint data_format, data_length; - const guchar *data_data; - - had_failure = FALSE; - emblems = NULL; - data_format = gtk_selection_data_get_format (data); - data_length = gtk_selection_data_get_length (data); - data_data = gtk_selection_data_get_data (data); - - switch (info) { - case TARGET_URI_LIST: - if (data_format != 8 || - data_length == 0) { - g_message ("URI list had wrong format (%d) or length (%d)\n", - data_format, data_length); - return; - } - - uris = g_uri_list_extract_uris (data_data); - if (uris == NULL) { - break; - } - - for (i = 0; uris[i] != NULL; ++i) { - f = g_file_new_for_uri (uris[i]); - pixbuf = nautilus_emblem_load_pixbuf_for_emblem (f); - - if (pixbuf == NULL) { - /* this one apparently isn't an image, or - * at least not one that we know how to read - */ - had_failure = TRUE; - g_object_unref (f); - continue; - } - - emblem = g_new (Emblem, 1); - emblem->uri = g_file_get_uri (f); - emblem->name = NULL; /* created later on by the user */ - emblem->keyword = NULL; - emblem->pixbuf = pixbuf; - - g_object_unref (f); - - emblems = g_slist_prepend (emblems, emblem); - } - - g_strfreev (uris); - - if (had_failure && emblems != NULL) { - eel_show_error_dialog (_("Some of the files could not be added as emblems."), _("The emblems do not appear to be valid images."), NULL); - } else if (had_failure && emblems == NULL) { - eel_show_error_dialog (_("None of the files could be added as emblems."), _("The emblems do not appear to be valid images."), NULL); - - } - - if (emblems != NULL) { - show_add_emblems_dialog (emblem_sidebar, emblems); - } - - break; - - case TARGET_URI: - if (data_format != 8 || - data_length == 0) { - g_warning ("URI had wrong format (%d) or length (%d)\n", - data_format, data_length); - return; - } - - uri = g_strndup (data_data, data_length); - - f = g_file_new_for_uri (uri); - pixbuf = nautilus_emblem_load_pixbuf_for_emblem (f); - - if (pixbuf != NULL) { - emblem = g_new (Emblem, 1); - emblem->uri = uri; - emblem->name = NULL; - emblem->keyword = NULL; - emblem->pixbuf = pixbuf; - - emblems = g_slist_prepend (NULL, emblem); - - show_add_emblems_dialog (emblem_sidebar, emblems); - } else { - uri_utf8 = g_file_get_parse_name (f); - - if (uri_utf8) { - error = g_strdup_printf (_("The file '%s' does not appear to be a valid image."), uri_utf8); - g_free (uri_utf8); - } else { - error = g_strdup (_("The dragged file does not appear to be a valid image.")); - } - eel_show_error_dialog (_("The emblem cannot be added."), error, NULL); - g_free (error); - g_free (uri_utf8); - } - - g_object_unref (f); - g_free (uri); - - break; - - case TARGET_NETSCAPE_URL: - if (data_format != 8 || - data_length == 0) { - g_message ("URI had wrong format (%d) or length (%d)\n", - data_format, data_length); - return; - } - - /* apparently, this is a URI/title pair? or just a pair - * of identical URIs? Regardless, this seems to work... - */ - - uris = g_uri_list_extract_uris (data_data); - if (uris == NULL) { - break; - } - - uri = uris[0]; - if (uri == NULL) { - g_strfreev (uris); - break; - } - - f = g_file_new_for_uri (uri); - pixbuf = nautilus_emblem_load_pixbuf_for_emblem (f); - g_object_unref (f); - - if (pixbuf != NULL) { - emblem = g_new (Emblem, 1); - emblem->uri = g_strdup (uri); - emblem->name = NULL; - emblem->keyword = NULL; - emblem->pixbuf = pixbuf; - - emblems = g_slist_prepend (NULL, emblem); - - show_add_emblems_dialog (emblem_sidebar, emblems); - } else { - g_warning ("Tried to load '%s', but failed.\n", - uri); - error = g_strdup_printf (_("The file '%s' does not appear to be a valid image."), uri); - eel_show_error_dialog (_("The emblem cannot be added."), error, NULL); - g_free (error); - } - - g_strfreev (uris); - - break; - } -} - -static GtkWidget * -nautilus_emblem_sidebar_create_container (NautilusEmblemSidebar *emblem_sidebar) -{ - GtkWidget *emblems_table, *scroller; - - /* The emblems wrapped table */ - scroller = eel_scrolled_wrap_table_new (TRUE, GTK_SHADOW_IN, &emblems_table); - - gtk_container_set_border_width (GTK_CONTAINER (emblems_table), 8); - - /* set up dnd for adding emblems */ - gtk_drag_dest_set (scroller, - GTK_DEST_DEFAULT_ALL, - dest_types, G_N_ELEMENTS (dest_types), - GDK_ACTION_COPY | GDK_ACTION_MOVE); - - g_signal_connect (scroller, "drag-data-received", - G_CALLBACK (nautilus_emblem_sidebar_drag_received_cb), - emblem_sidebar); - - gtk_widget_show (scroller); - - emblem_sidebar->details->emblems_table = emblems_table; - - return scroller; -} - -static gint -emblem_widget_sort_func (gconstpointer a, gconstpointer b) -{ - GObject *obj_a, *obj_b; - - obj_a = G_OBJECT (a); - obj_b = G_OBJECT (b); - - return strcmp (g_object_get_data (obj_a, "emblem-display-name"), - g_object_get_data (obj_b, "emblem-display-name")); -} - -static void -nautilus_emblem_sidebar_populate (NautilusEmblemSidebar *emblem_sidebar) -{ - GList *icons, *l, *widgets; - GtkWidget *emblem_widget; - char *name; - char *path; - GdkPixbuf *erase_pixbuf; - - erase_pixbuf = NULL; - - path = nautilus_pixmap_file ("erase.png"); - if (path != NULL) { - erase_pixbuf = gdk_pixbuf_new_from_file (path, NULL); - } - g_free (path); - - if (erase_pixbuf != NULL) { - emblem_widget = create_emblem_widget_with_pixbuf (emblem_sidebar, - ERASE_EMBLEM_KEYWORD, - _("Erase"), - erase_pixbuf); - gtk_container_add (GTK_CONTAINER - (emblem_sidebar->details->emblems_table), - emblem_widget); - } - - - icons = nautilus_emblem_list_available (); - - l = icons; - widgets = NULL; - while (l != NULL) { - name = (char *)l->data; - l = l->next; - - if (!nautilus_emblem_should_show_in_list (name)) { - continue; - } - - emblem_widget = create_emblem_widget (emblem_sidebar, name); - - widgets = g_list_prepend (widgets, emblem_widget); - } - eel_g_list_free_deep (icons); - - /* sort the emblems by display name */ - widgets = g_list_sort (widgets, emblem_widget_sort_func); - - l = widgets; - while (l != NULL) { - gtk_container_add - (GTK_CONTAINER (emblem_sidebar->details->emblems_table), - l->data); - l = l->next; - } - g_list_free (widgets); - - gtk_widget_show_all (emblem_sidebar->details->emblems_table); -} - -static void -nautilus_emblem_sidebar_init (NautilusEmblemSidebar *emblem_sidebar) -{ - GtkWidget *widget; - - emblem_sidebar->details = g_new0 (NautilusEmblemSidebarDetails, 1); - - emblem_sidebar->details->client = gconf_client_get_default (); - - create_popup_menu (emblem_sidebar); - - widget = nautilus_emblem_sidebar_create_container (emblem_sidebar); - nautilus_emblem_sidebar_populate (emblem_sidebar); - - g_signal_connect_object (nautilus_signaller_get_current (), - "emblems_changed", - G_CALLBACK (emblems_changed_callback), emblem_sidebar, 0); - - gtk_box_pack_start (GTK_BOX (emblem_sidebar), widget, - TRUE, TRUE, 0); -} - -static void -nautilus_emblem_sidebar_finalize (GObject *object) -{ - NautilusEmblemSidebar *emblem_sidebar; - - g_assert (NAUTILUS_IS_EMBLEM_SIDEBAR (object)); - emblem_sidebar = NAUTILUS_EMBLEM_SIDEBAR (object); - - if (emblem_sidebar->details != NULL) { - if (emblem_sidebar->details->client != NULL) { - g_object_unref (emblem_sidebar->details->client); - } - - g_free (emblem_sidebar->details); - } - - G_OBJECT_CLASS (nautilus_emblem_sidebar_parent_class)->finalize (object); -} - -static void -nautilus_emblem_sidebar_class_init (NautilusEmblemSidebarClass *object_klass) -{ - GObjectClass *gobject_class; - - NautilusEmblemSidebarClass *klass; - - klass = NAUTILUS_EMBLEM_SIDEBAR_CLASS (object_klass); - gobject_class = G_OBJECT_CLASS (object_klass); - - gobject_class->finalize = nautilus_emblem_sidebar_finalize; -} - -static const char * -nautilus_emblem_sidebar_get_sidebar_id (NautilusSidebar *sidebar) -{ - return NAUTILUS_EMBLEM_SIDEBAR_ID; -} - -static char * -nautilus_emblem_sidebar_get_tab_label (NautilusSidebar *sidebar) -{ - return g_strdup (_("Emblems")); -} - -static char * -nautilus_emblem_sidebar_get_tab_tooltip (NautilusSidebar *sidebar) -{ - return g_strdup (_("Show Emblems")); -} - -static GdkPixbuf * -nautilus_emblem_sidebar_get_tab_icon (NautilusSidebar *sidebar) -{ - return NULL; -} - -static void -nautilus_emblem_sidebar_is_visible_changed (NautilusSidebar *sidebar, - gboolean is_visible) -{ - /* Do nothing */ -} - -static void -nautilus_emblem_sidebar_iface_init (NautilusSidebarIface *iface) -{ - iface->get_sidebar_id = nautilus_emblem_sidebar_get_sidebar_id; - iface->get_tab_label = nautilus_emblem_sidebar_get_tab_label; - iface->get_tab_tooltip = nautilus_emblem_sidebar_get_tab_tooltip; - iface->get_tab_icon = nautilus_emblem_sidebar_get_tab_icon; - iface->is_visible_changed = nautilus_emblem_sidebar_is_visible_changed; -} - -static void -nautilus_emblem_sidebar_set_parent_window (NautilusEmblemSidebar *sidebar, - NautilusWindowInfo *window) -{ - sidebar->details->window = window; -} - -static NautilusSidebar * -nautilus_emblem_sidebar_create (NautilusSidebarProvider *provider, - NautilusWindowInfo *window) -{ - NautilusEmblemSidebar *sidebar; - - sidebar = g_object_new (nautilus_emblem_sidebar_get_type (), NULL); - nautilus_emblem_sidebar_set_parent_window (sidebar, window); - g_object_ref_sink (sidebar); - - return NAUTILUS_SIDEBAR (sidebar); -} - -static void -sidebar_provider_iface_init (NautilusSidebarProviderIface *iface) -{ - iface->create = nautilus_emblem_sidebar_create; -} - -static void -nautilus_emblem_sidebar_provider_init (NautilusEmblemSidebarProvider *sidebar) -{ -} - -static void -nautilus_emblem_sidebar_provider_class_init (NautilusEmblemSidebarProviderClass *class) -{ -} - -void -nautilus_emblem_sidebar_register (void) -{ - nautilus_module_add_type (nautilus_emblem_sidebar_provider_get_type ()); -} - |