diff options
Diffstat (limited to 'src/caja-x-content-bar.c')
-rw-r--r-- | src/caja-x-content-bar.c | 331 |
1 files changed, 331 insertions, 0 deletions
diff --git a/src/caja-x-content-bar.c b/src/caja-x-content-bar.c new file mode 100644 index 00000000..a936bb3e --- /dev/null +++ b/src/caja-x-content-bar.c @@ -0,0 +1,331 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * Copyright (C) 2008 Red Hat, Inc. + * Copyright (C) 2006 Paolo Borelli <[email protected]> + * + * 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. + * + * Authors: David Zeuthen <[email protected]> + * Paolo Borelli <[email protected]> + * + */ + +#include "config.h" + +#include <glib/gi18n-lib.h> +#include <gtk/gtk.h> +#include <string.h> + +#include "caja-x-content-bar.h" +#include <libcaja-private/caja-autorun.h> +#include <libcaja-private/caja-icon-info.h> + +#define CAJA_X_CONTENT_BAR_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), CAJA_TYPE_X_CONTENT_BAR, CajaXContentBarPrivate)) + +struct CajaXContentBarPrivate +{ + GtkWidget *label; + GtkWidget *button; + + char *x_content_type; + GMount *mount; +}; + +enum +{ + PROP_0, + PROP_MOUNT, + PROP_X_CONTENT_TYPE, +}; + +G_DEFINE_TYPE (CajaXContentBar, caja_x_content_bar, GTK_TYPE_HBOX) + +void +caja_x_content_bar_set_x_content_type (CajaXContentBar *bar, const char *x_content_type) +{ + char *message; + char *description; + GAppInfo *default_app; + + g_free (bar->priv->x_content_type); + bar->priv->x_content_type = g_strdup (x_content_type); + + description = g_content_type_get_description (x_content_type); + + /* Customize greeting for well-known x-content types */ + if (strcmp (x_content_type, "x-content/audio-cdda") == 0) + { + message = g_strdup (_("These files are on an Audio CD.")); + } + else if (strcmp (x_content_type, "x-content/audio-dvd") == 0) + { + message = g_strdup (_("These files are on an Audio DVD.")); + } + else if (strcmp (x_content_type, "x-content/video-dvd") == 0) + { + message = g_strdup (_("These files are on a Video DVD.")); + } + else if (strcmp (x_content_type, "x-content/video-vcd") == 0) + { + message = g_strdup (_("These files are on a Video CD.")); + } + else if (strcmp (x_content_type, "x-content/video-svcd") == 0) + { + message = g_strdup (_("These files are on a Super Video CD.")); + } + else if (strcmp (x_content_type, "x-content/image-photocd") == 0) + { + message = g_strdup (_("These files are on a Photo CD.")); + } + else if (strcmp (x_content_type, "x-content/image-picturecd") == 0) + { + message = g_strdup (_("These files are on a Picture CD.")); + } + else if (strcmp (x_content_type, "x-content/image-dcf") == 0) + { + message = g_strdup (_("The media contains digital photos.")); + } + else if (strcmp (x_content_type, "x-content/audio-player") == 0) + { + message = g_strdup (_("These files are on a digital audio player.")); + } + else if (strcmp (x_content_type, "x-content/software") == 0) + { + message = g_strdup (_("The media contains software.")); + } + else + { + /* fallback to generic greeting */ + message = g_strdup_printf (_("The media has been detected as \"%s\"."), description); + } + + + gtk_label_set_text (GTK_LABEL (bar->priv->label), message); + gtk_widget_show (bar->priv->label); + + /* TODO: We really need a GtkBrowserBackButton-ish widget here.. until then, we only + * show the default application. */ + + default_app = g_app_info_get_default_for_type (x_content_type, FALSE); + if (default_app != NULL) + { + char *button_text; + const char *name; + GIcon *icon; + GtkWidget *image; + + icon = g_app_info_get_icon (default_app); + if (icon != NULL) + { + GdkPixbuf *pixbuf; + int icon_size; + CajaIconInfo *icon_info; + icon_size = caja_get_icon_size_for_stock_size (GTK_ICON_SIZE_BUTTON); + icon_info = caja_icon_info_lookup (icon, icon_size); + pixbuf = caja_icon_info_get_pixbuf_at_size (icon_info, icon_size); + image = gtk_image_new_from_pixbuf (pixbuf); + g_object_unref (pixbuf); + g_object_unref (icon_info); + } + else + { + image = NULL; + } + + name = g_app_info_get_display_name (default_app); + button_text = g_strdup_printf (_("Open %s"), name); + + gtk_button_set_image (GTK_BUTTON (bar->priv->button), image); + gtk_button_set_label (GTK_BUTTON (bar->priv->button), button_text); + gtk_widget_show (bar->priv->button); + g_free (button_text); + g_object_unref (default_app); + } + else + { + gtk_widget_hide (bar->priv->button); + } + + g_free (message); + g_free (description); +} + +const char * +caja_x_content_bar_get_x_content_type (CajaXContentBar *bar) +{ + return bar->priv->x_content_type; +} + +GMount * +caja_x_content_bar_get_mount (CajaXContentBar *bar) +{ + return bar->priv->mount != NULL ? g_object_ref (bar->priv->mount) : NULL; +} + +void +caja_x_content_bar_set_mount (CajaXContentBar *bar, GMount *mount) +{ + if (bar->priv->mount != NULL) + { + g_object_unref (bar->priv->mount); + } + bar->priv->mount = mount != NULL ? g_object_ref (mount) : NULL; +} + + +static void +caja_x_content_bar_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + CajaXContentBar *bar; + + bar = CAJA_X_CONTENT_BAR (object); + + switch (prop_id) + { + case PROP_MOUNT: + caja_x_content_bar_set_mount (bar, G_MOUNT (g_value_get_object (value))); + break; + case PROP_X_CONTENT_TYPE: + caja_x_content_bar_set_x_content_type (bar, g_value_get_string (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +caja_x_content_bar_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + CajaXContentBar *bar; + + bar = CAJA_X_CONTENT_BAR (object); + + switch (prop_id) + { + case PROP_MOUNT: + g_value_set_object (value, bar->priv->mount); + break; + case PROP_X_CONTENT_TYPE: + g_value_set_string (value, bar->priv->x_content_type); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +caja_x_content_bar_finalize (GObject *object) +{ + CajaXContentBar *bar = CAJA_X_CONTENT_BAR (object); + + g_free (bar->priv->x_content_type); + if (bar->priv->mount != NULL) + g_object_unref (bar->priv->mount); + + G_OBJECT_CLASS (caja_x_content_bar_parent_class)->finalize (object); +} + +static void +caja_x_content_bar_class_init (CajaXContentBarClass *klass) +{ + GObjectClass *object_class; + + object_class = G_OBJECT_CLASS (klass); + object_class->get_property = caja_x_content_bar_get_property; + object_class->set_property = caja_x_content_bar_set_property; + object_class->finalize = caja_x_content_bar_finalize; + + g_type_class_add_private (klass, sizeof (CajaXContentBarPrivate)); + + g_object_class_install_property (object_class, + PROP_MOUNT, + g_param_spec_object ( + "mount", + "The GMount to run programs for", + "The GMount to run programs for", + G_TYPE_MOUNT, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT)); + + g_object_class_install_property (object_class, + PROP_X_CONTENT_TYPE, + g_param_spec_string ( + "x-content-type", + "The x-content type for the cluebar", + "The x-content type for the cluebar", + NULL, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT)); +} + +static void +button_clicked_callback (GtkWidget *button, CajaXContentBar *bar) +{ + GAppInfo *default_app; + + if (bar->priv->x_content_type == NULL || + bar->priv->mount == NULL) + return; + + default_app = g_app_info_get_default_for_type (bar->priv->x_content_type, FALSE); + if (default_app != NULL) + { + caja_autorun_launch_for_mount (bar->priv->mount, default_app); + g_object_unref (default_app); + } +} + +static void +caja_x_content_bar_init (CajaXContentBar *bar) +{ + GtkWidget *hbox; + + bar->priv = CAJA_X_CONTENT_BAR_GET_PRIVATE (bar); + + hbox = GTK_WIDGET (bar); + + bar->priv->label = gtk_label_new (NULL); + gtk_label_set_ellipsize (GTK_LABEL (bar->priv->label), PANGO_ELLIPSIZE_END); + gtk_misc_set_alignment (GTK_MISC (bar->priv->label), 0.0, 0.5); + gtk_box_pack_start (GTK_BOX (bar), bar->priv->label, TRUE, TRUE, 0); + + bar->priv->button = gtk_button_new (); + gtk_box_pack_end (GTK_BOX (hbox), bar->priv->button, FALSE, FALSE, 0); + + g_signal_connect (bar->priv->button, + "clicked", + G_CALLBACK (button_clicked_callback), + bar); +} + +GtkWidget * +caja_x_content_bar_new (GMount *mount, + const char *x_content_type) +{ + GObject *bar; + + bar = g_object_new (CAJA_TYPE_X_CONTENT_BAR, + "mount", mount, + "x-content-type", x_content_type, + NULL); + + return GTK_WIDGET (bar); +} |