diff options
Diffstat (limited to 'panel/frap-icon-entry.c')
-rw-r--r-- | panel/frap-icon-entry.c | 590 |
1 files changed, 0 insertions, 590 deletions
diff --git a/panel/frap-icon-entry.c b/panel/frap-icon-entry.c deleted file mode 100644 index 5128d45f..00000000 --- a/panel/frap-icon-entry.c +++ /dev/null @@ -1,590 +0,0 @@ -/* $Id$ - * - * Copyright (c) 2005-2006 Benedikt Meurer <benny@xfce.org> - * - * 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 - * - * Based on the ThunarPathEntry class, which is part of the Thunar file manager, - * Copyright (c) 2004-2006 Benedikt Meurer <benny@xfce.org>. - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include "frap-icon-entry.h" - - - -/* the margin around the icon */ -#define FRAP_ICON_ENTRY_ICON_MARGIN (2) - - - -#define FRAP_ICON_ENTRY_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), FRAP_TYPE_ICON_ENTRY, FrapIconEntryPrivate)) - - - -/* Property identifiers */ -enum -{ - PROP_0, - PROP_SIZE, - PROP_STOCK_ID, -}; - - - -static void frap_icon_entry_finalize (GObject *object); -static void frap_icon_entry_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec); -static void frap_icon_entry_set_property (GObject *object, - guint prop_id, - const GValue *value, - GParamSpec *pspec); -static void frap_icon_entry_size_request (GtkWidget *widget, - GtkRequisition *requisition); -static void frap_icon_entry_size_allocate (GtkWidget *widget, - GtkAllocation *allocation); -static void frap_icon_entry_realize (GtkWidget *widget); -static void frap_icon_entry_unrealize (GtkWidget *widget); -static gboolean frap_icon_entry_expose_event (GtkWidget *widget, - GdkEventExpose *event); -static void frap_icon_entry_get_borders (FrapIconEntry *icon_entry, - gint *xborder_return, - gint *yborder_return); -static void frap_icon_entry_get_text_area_size (FrapIconEntry *icon_entry, - gint *x_return, - gint *y_return, - gint *width_return, - gint *height_return); - - - -struct _FrapIconEntryPrivate -{ - GtkIconSize size; - gchar *stock_id; -}; - - - -G_DEFINE_TYPE (FrapIconEntry, - frap_icon_entry, - GTK_TYPE_ENTRY); - - - -static void -frap_icon_entry_class_init (FrapIconEntryClass *klass) -{ - GtkWidgetClass *gtkwidget_class; - GObjectClass *gobject_class; - - /* add the private instance data */ - g_type_class_add_private (klass, sizeof (FrapIconEntryPrivate)); - - gobject_class = G_OBJECT_CLASS (klass); - gobject_class->finalize = frap_icon_entry_finalize; - gobject_class->get_property = frap_icon_entry_get_property; - gobject_class->set_property = frap_icon_entry_set_property; - - gtkwidget_class = GTK_WIDGET_CLASS (klass); - gtkwidget_class->size_request = frap_icon_entry_size_request; - gtkwidget_class->size_allocate = frap_icon_entry_size_allocate; - gtkwidget_class->realize = frap_icon_entry_realize; - gtkwidget_class->unrealize = frap_icon_entry_unrealize; - gtkwidget_class->expose_event = frap_icon_entry_expose_event; - - /** - * FrapIconEntry:size: - * - * The #GtkIconSize for the icon in this entry. - **/ - g_object_class_install_property (gobject_class, - PROP_SIZE, - g_param_spec_enum ("size", - "Size", - "The size of the icon in the entry", - GTK_TYPE_ICON_SIZE, - GTK_ICON_SIZE_MENU, - G_PARAM_CONSTRUCT | G_PARAM_READWRITE)); - - /** - * FrapIconEntry:stock-id: - * - * The stock-id of the icon to render, or %NULL if no - * icon should be rendered. - **/ - g_object_class_install_property (gobject_class, - PROP_STOCK_ID, - g_param_spec_string ("stock-id", - "Stock Id", - "The stock-id of the icon in the entry", - NULL, - G_PARAM_READWRITE)); -} - - - -static void -frap_icon_entry_init (FrapIconEntry *icon_entry) -{ - icon_entry->priv = FRAP_ICON_ENTRY_GET_PRIVATE (icon_entry); -} - - - -static void -frap_icon_entry_finalize (GObject *object) -{ - FrapIconEntry *icon_entry = FRAP_ICON_ENTRY (object); - - /* release the stock-id if any */ - g_free (icon_entry->priv->stock_id); - - (*G_OBJECT_CLASS (frap_icon_entry_parent_class)->finalize) (object); -} - - - -static void -frap_icon_entry_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec) -{ - FrapIconEntry *icon_entry = FRAP_ICON_ENTRY (object); - - switch (prop_id) - { - case PROP_SIZE: - g_value_set_enum (value, frap_icon_entry_get_size (icon_entry)); - break; - - case PROP_STOCK_ID: - g_value_set_string (value, frap_icon_entry_get_stock_id (icon_entry)); - break; - - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - - - -static void -frap_icon_entry_set_property (GObject *object, - guint prop_id, - const GValue *value, - GParamSpec *pspec) -{ - FrapIconEntry *icon_entry = FRAP_ICON_ENTRY (object); - - switch (prop_id) - { - case PROP_SIZE: - frap_icon_entry_set_size (icon_entry, g_value_get_enum (value)); - break; - - case PROP_STOCK_ID: - frap_icon_entry_set_stock_id (icon_entry, g_value_get_string (value)); - break; - - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - - - -static void -frap_icon_entry_size_request (GtkWidget *widget, - GtkRequisition *requisition) -{ - FrapIconEntry *icon_entry = FRAP_ICON_ENTRY (widget); - gint text_height; - gint icon_height; - gint icon_width; - gint xborder; - gint yborder; - - /* determine the size request of the text entry */ - (*GTK_WIDGET_CLASS (frap_icon_entry_parent_class)->size_request) (widget, requisition); - - /* lookup the icon dimensions */ - gtk_icon_size_lookup (icon_entry->priv->size, &icon_width, &icon_height); - - /* determine the text area size */ - frap_icon_entry_get_text_area_size (icon_entry, &xborder, &yborder, NULL, &text_height); - - /* adjust the requisition */ - requisition->width += icon_width + xborder + 2 * FRAP_ICON_ENTRY_ICON_MARGIN; - requisition->height = 2 * yborder + MAX (icon_height + 2 * FRAP_ICON_ENTRY_ICON_MARGIN, text_height); -} - - - -static void -frap_icon_entry_size_allocate (GtkWidget *widget, - GtkAllocation *allocation) -{ - FrapIconEntry *icon_entry = FRAP_ICON_ENTRY (widget); - GtkAllocation text_allocation; - GtkAllocation icon_allocation; - gint text_height; - gint icon_height; - gint icon_width; - gint xborder; - gint yborder; - - /* lookup the icon dimensions */ - gtk_icon_size_lookup (icon_entry->priv->size, &icon_width, &icon_height); - - /* determine the text area size */ - frap_icon_entry_get_text_area_size (icon_entry, &xborder, &yborder, NULL, &text_height); - - /* calculate the base text allocation */ - text_allocation.y = yborder; - text_allocation.width = allocation->width - icon_width - 2 * (xborder + FRAP_ICON_ENTRY_ICON_MARGIN); - text_allocation.height = text_height; - - /* calculate the base icon allocation */ - icon_allocation.y = yborder; - icon_allocation.width = icon_width + 2 * FRAP_ICON_ENTRY_ICON_MARGIN; - icon_allocation.height = MAX (icon_height + 2 * FRAP_ICON_ENTRY_ICON_MARGIN, text_height); - - /* the x offset depends on the text direction */ - if (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL) - { - text_allocation.x = xborder; - icon_allocation.x = allocation->width - icon_allocation.width - xborder - 2 * FRAP_ICON_ENTRY_ICON_MARGIN; - } - else - { - icon_allocation.x = xborder; - text_allocation.x = allocation->width - text_allocation.width - xborder; - } - - /* setup the text area */ - (*GTK_WIDGET_CLASS (frap_icon_entry_parent_class)->size_allocate) (widget, allocation); - - /* adjust the dimensions/positions of the areas */ - if (GTK_WIDGET_REALIZED (widget)) - { - gdk_window_move_resize (GTK_ENTRY (icon_entry)->text_area, - text_allocation.x, - text_allocation.y, - text_allocation.width, - text_allocation.height); - - gdk_window_move_resize (icon_entry->icon_area, - icon_allocation.x, - icon_allocation.y, - icon_allocation.width, - icon_allocation.height); - } -} - - - -static void -frap_icon_entry_realize (GtkWidget *widget) -{ - FrapIconEntry *icon_entry = FRAP_ICON_ENTRY (widget); - GdkWindowAttr attributes; - gint attributes_mask; - gint text_height; - gint icon_height; - gint icon_width; - gint spacing; - - /* let GtkEntry handle the realization of the text area */ - (*GTK_WIDGET_CLASS (frap_icon_entry_parent_class)->realize) (widget); - - /* lookup the icon dimensions */ - gtk_icon_size_lookup (icon_entry->priv->size, &icon_width, &icon_height); - - /* determine the spacing for the icon area */ - frap_icon_entry_get_text_area_size (icon_entry, NULL, NULL, NULL, &text_height); - spacing = widget->requisition.height - text_height; - - /* setup the icon_area attributes */ - attributes.window_type = GDK_WINDOW_CHILD; - attributes.wclass = GDK_INPUT_OUTPUT; - attributes.visual = gtk_widget_get_visual (widget); - attributes.colormap = gtk_widget_get_colormap (widget); - attributes.event_mask = gtk_widget_get_events (widget) - | GDK_EXPOSURE_MASK; - attributes.x = widget->allocation.x + widget->allocation.width - icon_width - spacing; - attributes.y = widget->allocation.y + (widget->allocation.height - widget->requisition.height) / 2; - attributes.width = icon_width + spacing; - attributes.height = widget->requisition.height; - attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP; - - /* setup the window for the icon area */ - icon_entry->icon_area = gdk_window_new (widget->window, &attributes, attributes_mask); - gdk_window_set_user_data (icon_entry->icon_area, widget); - gdk_window_set_background (icon_entry->icon_area, &widget->style->base[GTK_WIDGET_STATE (widget)]); - gdk_window_show (icon_entry->icon_area); - - /* need to resize the text_area afterwards */ - gtk_widget_queue_resize (widget); -} - - - -static void -frap_icon_entry_unrealize (GtkWidget *widget) -{ - FrapIconEntry *icon_entry = FRAP_ICON_ENTRY (widget); - - /* destroy the icon_area */ - gdk_window_set_user_data (icon_entry->icon_area, NULL); - gdk_window_destroy (icon_entry->icon_area); - icon_entry->icon_area = NULL; - - (*GTK_WIDGET_CLASS (frap_icon_entry_parent_class)->unrealize) (widget); -} - - - -static gboolean -frap_icon_entry_expose_event (GtkWidget *widget, - GdkEventExpose *event) -{ - FrapIconEntry *icon_entry = FRAP_ICON_ENTRY (widget); - GdkPixbuf *icon; - gint icon_height; - gint icon_width; - gint height; - gint width; - - /* check if the expose is on the icon_area */ - if (event->window == icon_entry->icon_area) - { - /* determine the size of the icon_area */ - gdk_drawable_get_size (GDK_DRAWABLE (icon_entry->icon_area), &width, &height); - - /* clear the icon area */ - gtk_paint_flat_box (widget->style, icon_entry->icon_area, - GTK_WIDGET_STATE (widget), GTK_SHADOW_NONE, - NULL, widget, "entry_bg", 0, 0, width, height); - - /* check if a stock-id is set */ - if (G_LIKELY (icon_entry->priv->stock_id != NULL)) - { - /* try to render the icon for the stock-id */ - icon = gtk_widget_render_icon (widget, icon_entry->priv->stock_id, icon_entry->priv->size, "icon_entry"); - if (G_LIKELY (icon != NULL)) - { - /* determine the dimensions of the icon */ - icon_width = gdk_pixbuf_get_width (icon); - icon_height = gdk_pixbuf_get_height (icon); - - /* draw the icon */ - gdk_draw_pixbuf (icon_entry->icon_area, - widget->style->black_gc, - icon, 0, 0, - (width - icon_width) / 2, - (height - icon_height) / 2, - icon_width, icon_height, - GDK_RGB_DITHER_NORMAL, 0, 0); - - /* release the icon */ - g_object_unref (G_OBJECT (icon)); - } - } - } - else - { - /* the expose is probably for the text_area */ - return (*GTK_WIDGET_CLASS (frap_icon_entry_parent_class)->expose_event) (widget, event); - } - - return TRUE; -} - - - -static void -frap_icon_entry_get_borders (FrapIconEntry *icon_entry, - gint *xborder_return, - gint *yborder_return) -{ - gboolean interior_focus; - gint focus_width; - - gtk_widget_style_get (GTK_WIDGET (icon_entry), - "focus-line-width", &focus_width, - "interior-focus", &interior_focus, - NULL); - - if (gtk_entry_get_has_frame (GTK_ENTRY (icon_entry))) - { - *xborder_return = GTK_WIDGET (icon_entry)->style->xthickness; - *yborder_return = GTK_WIDGET (icon_entry)->style->ythickness; - } - else - { - *xborder_return = 0; - *yborder_return = 0; - } - - if (!interior_focus) - { - *xborder_return += focus_width; - *yborder_return += focus_width; - } -} - - - -static void -frap_icon_entry_get_text_area_size (FrapIconEntry *icon_entry, - gint *x_return, - gint *y_return, - gint *width_return, - gint *height_return) -{ - GtkRequisition requisition; - gint xborder; - gint yborder; - - gtk_widget_get_child_requisition (GTK_WIDGET (icon_entry), &requisition); - - frap_icon_entry_get_borders (icon_entry, &xborder, &yborder); - - if (x_return != NULL) *x_return = xborder; - if (y_return != NULL) *y_return = yborder; - if (width_return != NULL) *width_return = GTK_WIDGET (icon_entry)->allocation.width - xborder * 2; - if (height_return != NULL) *height_return = requisition.height - yborder * 2; -} - - - -/** - * frap_icon_entry_new: - * - * Allocates a new #FrapIconEntry instance. - * - * Return value: the newly allocated #FrapIconEntry. - **/ -GtkWidget* -frap_icon_entry_new (void) -{ - return g_object_new (FRAP_TYPE_ICON_ENTRY, NULL); -} - - - -/** - * frap_icon_entry_get_size: - * @icon_entry : a #FrapIconEntry. - * - * Returns the #GtkIconSize that is currently set for the - * @icon_entry. - * - * Return value: the icon size for the @icon_entry. - **/ -GtkIconSize -frap_icon_entry_get_size (FrapIconEntry *icon_entry) -{ - g_return_val_if_fail (FRAP_IS_ICON_ENTRY (icon_entry), GTK_ICON_SIZE_INVALID); - return icon_entry->priv->size; -} - - - -/** - * frap_icon_entry_set_size: - * @icon_entry : a #FrapIconEntry. - * @size : the new icon size for the @icon_entry. - * - * Sets the size at which the icon of the @icon_entry is drawn - * to @size. - **/ -void -frap_icon_entry_set_size (FrapIconEntry *icon_entry, - GtkIconSize size) -{ - g_return_if_fail (FRAP_IS_ICON_ENTRY (icon_entry)); - - /* check if we have a new setting */ - if (G_LIKELY (icon_entry->priv->size != size)) - { - /* apply the new setting */ - icon_entry->priv->size = size; - - /* notify listeners */ - g_object_notify (G_OBJECT (icon_entry), "size"); - - /* schedule a resize */ - gtk_widget_queue_resize (GTK_WIDGET (icon_entry)); - } -} - - - -/** - * frap_icon_entry_get_stock_id: - * @icon_entry : a #FrapIconEntry. - * - * Returns the stock-id that is currently set for the @icon_entry - * or %NULL if no stock-id is set. - * - * Return value: the stock-id for the @icon_entry. - **/ -const gchar* -frap_icon_entry_get_stock_id (FrapIconEntry *icon_entry) -{ - g_return_val_if_fail (FRAP_IS_ICON_ENTRY (icon_entry), NULL); - return icon_entry->priv->stock_id; -} - - - -/** - * frap_icon_entry_set_stock_id: - * @icon_entry : a #FrapIconEntry. - * @stock_id : the new stock-id or %NULL to reset. - * - * Sets the stock-id of the icon to be drawn in the @icon_entry to - * @stock_id. - **/ -void -frap_icon_entry_set_stock_id (FrapIconEntry *icon_entry, - const gchar *stock_id) -{ - g_return_if_fail (FRAP_IS_ICON_ENTRY (icon_entry)); - - /* release the previous stock-id */ - g_free (icon_entry->priv->stock_id); - - /* apply the new stock-id */ - icon_entry->priv->stock_id = g_strdup (stock_id); - - /* notify listeners */ - g_object_notify (G_OBJECT (icon_entry), "stock-id"); - - /* schedule a resize */ - gtk_widget_queue_resize (GTK_WIDGET (icon_entry)); -} - - |