summaryrefslogtreecommitdiff
path: root/libnautilus-extensions/nautilus-label.c
diff options
context:
space:
mode:
Diffstat (limited to 'libnautilus-extensions/nautilus-label.c')
-rw-r--r--libnautilus-extensions/nautilus-label.c1971
1 files changed, 0 insertions, 1971 deletions
diff --git a/libnautilus-extensions/nautilus-label.c b/libnautilus-extensions/nautilus-label.c
deleted file mode 100644
index a5f5575ea..000000000
--- a/libnautilus-extensions/nautilus-label.c
+++ /dev/null
@@ -1,1971 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-
-/* nautilus-label.c - A widget to display a anti aliased text.
-
- Copyright (C) 1999, 2000 Eazel, Inc.
-
- The Gnome Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public License as
- published by the Free Software Foundation; either version 2 of the
- License, or (at your option) any later version.
-
- The Gnome Library 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
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with the Gnome Library; see the file COPYING.LIB. If not,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA.
-
- Authors: Ramiro Estrugo <ramiro@eazel.com>
-*/
-
-#include <config.h>
-
-#include "nautilus-label.h"
-
-#include <libgnome/gnome-i18n.h>
-#include "nautilus-gtk-macros.h"
-#include "nautilus-gdk-extensions.h"
-#include "nautilus-gtk-extensions.h"
-#include "nautilus-gdk-pixbuf-extensions.h"
-#include "nautilus-art-gtk-extensions.h"
-#include "nautilus-string.h"
-#include "nautilus-smooth-text-layout.h"
-#include "nautilus-scalable-font-private.h"
-#include "nautilus-debug-drawing.h"
-#include <stdlib.h>
-
-/* These are arbitrary constants to catch insane values */
-#define MIN_SMOOTH_FONT_SIZE 5
-#define MAX_SMOOTH_FONT_SIZE 64
-
-#define DEFAULT_FONT_SIZE 14
-#define LINE_WRAP_SEPARATORS _(" -_,;.?/&")
-#define LINE_OFFSET 2
-
-#define SMOOTH_FONT_MULTIPLIER 1.3
-
-/* This magic string is copied from GtkLabel. It lives there unlocalized as well. */
-#define DEFAULT_LINE_WRAP_WIDTH_TEXT "This is a good enough length for any line to have."
-
-/* Arguments */
-enum
-{
- ARG_0,
-
- /* Deal with the GtkLabel arguments as well */
- ARG_LABEL,
- ARG_WRAP,
- ARG_JUSTIFY,
-
- ARG_BACKGROUND_MODE,
- ARG_IS_SMOOTH,
- ARG_TEXT_OPACITY,
- ARG_SMOOTH_FONT,
- ARG_SMOOTH_FONT_SIZE,
- ARG_SMOOTH_TEXT_COLOR,
- ARG_SMOOTH_DROP_SHADOW_OFFSET,
- ARG_SMOOTH_DROP_SHADOW_COLOR,
- ARG_SMOOTH_LINE_WRAP_WIDTH,
- ARG_ADJUST_WRAP_ON_RESIZE,
-
- ARG_TILE_HEIGHT,
- ARG_TILE_MODE_HORIZONTAL,
- ARG_TILE_MODE_VERTICAL,
- ARG_TILE_OPACITY,
- ARG_TILE_PIXBUF,
- ARG_TILE_WIDTH
-};
-
-/* Signals */
-typedef enum
-{
- DRAW_BACKGROUND,
- SET_IS_SMOOTH,
- LAST_SIGNAL
-} LabelSignal;
-
-/* Signals */
-static guint label_signals[LAST_SIGNAL] = { 0 };
-
-/* Detail member struct */
-struct _NautilusLabelDetails
-{
- gboolean is_smooth;
-
- /* Tile attributes */
- GdkPixbuf *tile_pixbuf;
- int tile_opacity;
- int tile_width;
- int tile_height;
- NautilusSmoothTileMode tile_mode_vertical;
- NautilusSmoothTileMode tile_mode_horizontal;
-
- /* Smooth attributes */
- NautilusScalableFont *smooth_font;
- int smooth_font_size;
- guint32 smooth_text_color;
- gint smooth_drop_shadow_offset;
- guint32 smooth_drop_shadow_color;
- int smooth_line_wrap_width;
- gboolean adjust_wrap_on_resize;
-
- /* Text */
- int text_opacity;
-
- /* Background */
- NautilusSmoothBackgroundMode background_mode;
- guint32 solid_background_color;
-
- GdkPixbuf *solid_cache_pixbuf;
- gboolean never_smooth;
-
- NautilusSmoothTextLayout *smooth_text_layout;
-};
-
-/* GtkObjectClass methods */
-static void nautilus_label_initialize_class (NautilusLabelClass *label_class);
-static void nautilus_label_initialize (NautilusLabel *label);
-static void nautilus_label_destroy (GtkObject *object);
-static void nautilus_label_set_arg (GtkObject *object,
- GtkArg *arg,
- guint arg_id);
-static void nautilus_label_get_arg (GtkObject *object,
- GtkArg *arg,
- guint arg_id);
-
-/* GtkWidgetClass methods */
-static void nautilus_label_size_request (GtkWidget *widget,
- GtkRequisition *requisition);
-static void nautilus_label_size_allocate (GtkWidget *widget,
- GtkAllocation *allocation);
-static int nautilus_label_expose_event (GtkWidget *widget,
- GdkEventExpose *event);
-
-/* NautilusLabel signals */
-static void nautilus_label_set_is_smooth_signal (GtkWidget *widget,
- gboolean is_smooth);
-
-/* Private NautilusLabel things */
-const char * label_peek_text (const NautilusLabel *label);
-static ArtIRect label_get_text_bounds (const NautilusLabel *label);
-static NautilusDimensions label_get_text_dimensions (const NautilusLabel *label);
-static NautilusDimensions label_get_tile_dimensions (const NautilusLabel *label);
-static int label_get_default_line_wrap_width (const NautilusLabel *label);
-static void label_solid_cache_pixbuf_clear (NautilusLabel *label);
-static gboolean label_can_cache_contents (const NautilusLabel *label);
-static gboolean label_is_smooth (const NautilusLabel *label);
-static void label_smooth_text_ensure (const NautilusLabel *label);
-static void label_smooth_text_clear (NautilusLabel *label);
-static NautilusDimensions label_get_content_dimensions (const NautilusLabel *label);
-static ArtIRect label_get_content_bounds (const NautilusLabel *label);
-
-NAUTILUS_DEFINE_CLASS_BOILERPLATE (NautilusLabel, nautilus_label, GTK_TYPE_LABEL)
-
-/* Class init methods */
-static void
-nautilus_label_initialize_class (NautilusLabelClass *label_class)
-{
- GtkObjectClass *object_class = GTK_OBJECT_CLASS (label_class);
- GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (label_class);
-
- /* GtkObjectClass */
- object_class->destroy = nautilus_label_destroy;
- object_class->set_arg = nautilus_label_set_arg;
- object_class->get_arg = nautilus_label_get_arg;
-
- /* GtkWidgetClass */
- widget_class->size_request = nautilus_label_size_request;
- widget_class->size_allocate = nautilus_label_size_allocate;
- widget_class->expose_event = nautilus_label_expose_event;
-
- /* NautilusLabelClass */
- label_class->set_is_smooth = nautilus_label_set_is_smooth_signal;
-
- /* Signals */
- label_signals[DRAW_BACKGROUND] = gtk_signal_new ("draw_background",
- GTK_RUN_LAST,
- object_class->type,
- 0,
- gtk_marshal_NONE__POINTER_POINTER,
- GTK_TYPE_NONE,
- 2,
- GTK_TYPE_POINTER,
- GTK_TYPE_POINTER);
-
- label_signals[SET_IS_SMOOTH] = gtk_signal_new ("set_is_smooth",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (NautilusLabelClass, set_is_smooth),
- gtk_marshal_NONE__BOOL,
- GTK_TYPE_NONE,
- 1,
- GTK_TYPE_BOOL);
-
- gtk_object_class_add_signals (object_class, label_signals, LAST_SIGNAL);
-
- /* Arguments */
- gtk_object_add_arg_type ("NautilusLabel::tile_pixbuf",
- GTK_TYPE_POINTER,
- GTK_ARG_READWRITE,
- ARG_TILE_PIXBUF);
- gtk_object_add_arg_type ("NautilusLabel::tile_opacity",
- GTK_TYPE_INT,
- GTK_ARG_READWRITE,
- ARG_TILE_OPACITY);
- gtk_object_add_arg_type ("NautilusLabel::tile_width",
- GTK_TYPE_INT,
- GTK_ARG_READWRITE,
- ARG_TILE_WIDTH);
- gtk_object_add_arg_type ("NautilusLabel::tile_height",
- GTK_TYPE_INT,
- GTK_ARG_READWRITE,
- ARG_TILE_HEIGHT);
- gtk_object_add_arg_type ("NautilusLabel::tile_mode_vertical",
- GTK_TYPE_UINT,
- GTK_ARG_READWRITE,
- ARG_TILE_MODE_VERTICAL);
- gtk_object_add_arg_type ("NautilusLabel::tile_mode_horizontal",
- GTK_TYPE_UINT,
- GTK_ARG_READWRITE,
- ARG_TILE_MODE_HORIZONTAL);
- gtk_object_add_arg_type ("NautilusLabel::label",
- GTK_TYPE_STRING,
- GTK_ARG_READWRITE,
- ARG_LABEL);
- gtk_object_add_arg_type ("NautilusLabel::wrap",
- GTK_TYPE_BOOL,
- GTK_ARG_READWRITE,
- ARG_WRAP);
- gtk_object_add_arg_type ("NautilusLabel::justify",
- GTK_TYPE_JUSTIFICATION,
- GTK_ARG_READWRITE,
- ARG_JUSTIFY);
- gtk_object_add_arg_type ("NautilusLabel::is_smooth",
- GTK_TYPE_BOOL,
- GTK_ARG_READWRITE,
- ARG_IS_SMOOTH);
- gtk_object_add_arg_type ("NautilusLabel::text_opacity",
- GTK_TYPE_INT,
- GTK_ARG_READWRITE,
- ARG_TEXT_OPACITY);
- gtk_object_add_arg_type ("NautilusLabel::background_mode",
- GTK_TYPE_UINT,
- GTK_ARG_READWRITE,
- ARG_BACKGROUND_MODE);
- gtk_object_add_arg_type ("NautilusLabel::smooth_font",
- GTK_TYPE_OBJECT,
- GTK_ARG_READWRITE,
- ARG_SMOOTH_FONT);
- gtk_object_add_arg_type ("NautilusLabel::smooth_font_size",
- GTK_TYPE_INT,
- GTK_ARG_READWRITE,
- ARG_SMOOTH_FONT_SIZE);
- gtk_object_add_arg_type ("NautilusLabel::smooth_text_color",
- GTK_TYPE_UINT,
- GTK_ARG_READWRITE,
- ARG_SMOOTH_TEXT_COLOR);
- gtk_object_add_arg_type ("NautilusLabel::smooth_drop_shadow_offset",
- GTK_TYPE_INT,
- GTK_ARG_READWRITE,
- ARG_SMOOTH_DROP_SHADOW_OFFSET);
- gtk_object_add_arg_type ("NautilusLabel::smooth_drop_shadow_color",
- GTK_TYPE_UINT,
- GTK_ARG_READWRITE,
- ARG_SMOOTH_DROP_SHADOW_COLOR);
- gtk_object_add_arg_type ("NautilusLabel::smooth_line_wrap_width",
- GTK_TYPE_INT,
- GTK_ARG_READWRITE,
- ARG_SMOOTH_LINE_WRAP_WIDTH);
- gtk_object_add_arg_type ("NautilusLabel::adjust_wrap_on_resize",
- GTK_TYPE_BOOL,
- GTK_ARG_READWRITE,
- ARG_ADJUST_WRAP_ON_RESIZE);
-
- /* Make this class inherit the same kind of theme stuff as GtkLabel */
- nautilus_gtk_class_name_make_like_existing_type ("NautilusLabel", GTK_TYPE_LABEL);
-
- /* Let the smooth widget machinery know that our class can be smooth */
- nautilus_smooth_widget_register_type (NAUTILUS_TYPE_LABEL);
-}
-
-void
-nautilus_label_initialize (NautilusLabel *label)
-{
- GTK_WIDGET_UNSET_FLAGS (label, GTK_CAN_FOCUS);
- GTK_WIDGET_SET_FLAGS (label, GTK_NO_WINDOW);
-
- label->details = g_new0 (NautilusLabelDetails, 1);
-
- label->details->text_opacity = NAUTILUS_OPACITY_FULLY_OPAQUE;
- label->details->smooth_font = nautilus_scalable_font_get_default_font ();
- label->details->smooth_font_size = DEFAULT_FONT_SIZE;
- label->details->smooth_text_color = NAUTILUS_RGBA_COLOR_PACK (0, 0, 0, 255);
- label->details->smooth_drop_shadow_color = NAUTILUS_RGBA_COLOR_PACK (255, 255, 255, 255);
- label->details->smooth_line_wrap_width = label_get_default_line_wrap_width (label);
-
- label->details->tile_opacity = NAUTILUS_OPACITY_FULLY_OPAQUE;
- label->details->tile_width = NAUTILUS_SMOOTH_TILE_EXTENT_FULL;
- label->details->tile_height = NAUTILUS_SMOOTH_TILE_EXTENT_FULL;
- label->details->tile_mode_vertical = NAUTILUS_SMOOTH_TILE_SELF;
- label->details->tile_mode_horizontal = NAUTILUS_SMOOTH_TILE_SELF;
- label->details->background_mode = NAUTILUS_SMOOTH_BACKGROUND_GTK;
-
- nautilus_smooth_widget_register (GTK_WIDGET (label));
-}
-
-/* GtkObjectClass methods */
-static void
-nautilus_label_destroy (GtkObject *object)
-{
- NautilusLabel *label;
-
- g_return_if_fail (NAUTILUS_IS_LABEL (object));
-
- label = NAUTILUS_LABEL (object);
-
- nautilus_gdk_pixbuf_unref_if_not_null (label->details->tile_pixbuf);
- label->details->tile_pixbuf = NULL;
- label_solid_cache_pixbuf_clear (label);
- label_smooth_text_clear (label);
- g_free (label->details);
-
- /* Chain destroy */
- NAUTILUS_CALL_PARENT (GTK_OBJECT_CLASS, destroy, (object));
-}
-
-static void
-nautilus_label_set_arg (GtkObject *object,
- GtkArg *arg,
- guint arg_id)
-{
- NautilusLabel *label;
-
- g_return_if_fail (NAUTILUS_IS_LABEL (object));
-
- label = NAUTILUS_LABEL (object);
-
- switch (arg_id)
- {
-
- case ARG_TILE_OPACITY:
- nautilus_label_set_tile_opacity (label, GTK_VALUE_INT (*arg));
- break;
-
- case ARG_TILE_PIXBUF:
- nautilus_label_set_tile_pixbuf (label, (GdkPixbuf *) GTK_VALUE_POINTER (*arg));
- break;
-
- case ARG_TILE_WIDTH:
- nautilus_label_set_tile_width (label, GTK_VALUE_INT (*arg));
- break;
-
- case ARG_TILE_HEIGHT:
- nautilus_label_set_tile_height (label, GTK_VALUE_INT (*arg));
- break;
-
- case ARG_TILE_MODE_VERTICAL:
- nautilus_label_set_tile_mode_vertical (label, GTK_VALUE_UINT (*arg));
- break;
-
- case ARG_TILE_MODE_HORIZONTAL:
- nautilus_label_set_tile_mode_horizontal (label, GTK_VALUE_UINT (*arg));
- break;
-
- case ARG_LABEL:
- nautilus_label_set_text (label, GTK_VALUE_STRING (*arg));
- break;
-
- case ARG_WRAP:
- nautilus_label_set_wrap (label, GTK_VALUE_BOOL (*arg));
- break;
-
- case ARG_JUSTIFY:
- nautilus_label_set_justify (label, GTK_VALUE_ENUM (*arg));
- break;
-
- case ARG_IS_SMOOTH:
- nautilus_label_set_is_smooth (label, GTK_VALUE_BOOL (*arg));
- break;
-
- case ARG_TEXT_OPACITY:
- nautilus_label_set_text_opacity (label, GTK_VALUE_INT (*arg));
- break;
-
- case ARG_BACKGROUND_MODE:
- nautilus_label_set_background_mode (label, GTK_VALUE_UINT (*arg));
- break;
-
- case ARG_SMOOTH_FONT:
- nautilus_label_set_smooth_font (label, (NautilusScalableFont *) GTK_VALUE_OBJECT (*arg));
- break;
-
- case ARG_SMOOTH_FONT_SIZE:
- nautilus_label_set_smooth_font_size (label, GTK_VALUE_INT (*arg));
- break;
-
- case ARG_SMOOTH_TEXT_COLOR:
- nautilus_label_set_text_color (label, GTK_VALUE_UINT (*arg));
- break;
-
- case ARG_SMOOTH_DROP_SHADOW_OFFSET:
- nautilus_label_set_smooth_drop_shadow_offset (label, GTK_VALUE_INT (*arg));
- break;
-
- case ARG_SMOOTH_DROP_SHADOW_COLOR:
- nautilus_label_set_smooth_drop_shadow_color (label, GTK_VALUE_UINT (*arg));
- break;
-
- case ARG_SMOOTH_LINE_WRAP_WIDTH:
- nautilus_label_set_smooth_line_wrap_width (label, GTK_VALUE_INT (*arg));
- break;
-
- case ARG_ADJUST_WRAP_ON_RESIZE:
- nautilus_label_set_adjust_wrap_on_resize (label, GTK_VALUE_BOOL (*arg));
- break;
-
- default:
- g_assert_not_reached ();
- }
-}
-
-static void
-nautilus_label_get_arg (GtkObject *object,
- GtkArg *arg,
- guint arg_id)
-{
- NautilusLabel *label;
-
- g_return_if_fail (NAUTILUS_IS_LABEL (object));
-
- label = NAUTILUS_LABEL (object);
-
- switch (arg_id)
- {
- case ARG_TILE_OPACITY:
- GTK_VALUE_INT (*arg) = nautilus_label_get_tile_opacity (label);
- break;
-
- case ARG_TILE_PIXBUF:
- GTK_VALUE_POINTER (*arg) = nautilus_label_get_tile_pixbuf (label);
- break;
-
- case ARG_TILE_WIDTH:
- GTK_VALUE_INT (*arg) = nautilus_label_get_tile_width (label);
- break;
-
- case ARG_TILE_HEIGHT:
- GTK_VALUE_INT (*arg) = nautilus_label_get_tile_height (label);
- break;
-
- case ARG_TILE_MODE_VERTICAL:
- GTK_VALUE_UINT (*arg) = nautilus_label_get_tile_mode_vertical (label);
- break;
-
- case ARG_TILE_MODE_HORIZONTAL:
- GTK_VALUE_UINT (*arg) = nautilus_label_get_tile_mode_horizontal (label);
- break;
-
- case ARG_LABEL:
- GTK_VALUE_STRING (*arg) = nautilus_label_get_text (label);
- break;
-
- case ARG_WRAP:
- GTK_VALUE_BOOL (*arg) = nautilus_label_get_wrap (label);
- break;
-
- case ARG_JUSTIFY:
- GTK_VALUE_ENUM (*arg) = nautilus_label_get_text_justify (label);
- break;
-
- case ARG_IS_SMOOTH:
- GTK_VALUE_BOOL (*arg) = nautilus_label_get_is_smooth (label);
- break;
-
- case ARG_TEXT_OPACITY:
- GTK_VALUE_INT (*arg) = nautilus_label_get_text_opacity (label);
- break;
-
- case ARG_BACKGROUND_MODE:
- GTK_VALUE_UINT (*arg) = nautilus_label_get_background_mode (label);
- break;
-
- case ARG_SMOOTH_FONT:
- GTK_VALUE_OBJECT (*arg) = (GtkObject *) nautilus_label_get_smooth_font (label);
- break;
-
- case ARG_SMOOTH_FONT_SIZE:
- GTK_VALUE_INT (*arg) = nautilus_label_get_smooth_font_size (label);
- break;
-
- case ARG_SMOOTH_TEXT_COLOR:
- GTK_VALUE_UINT (*arg) = nautilus_label_get_text_color (label);
- break;
-
- case ARG_SMOOTH_DROP_SHADOW_OFFSET:
- GTK_VALUE_INT (*arg) = nautilus_label_get_smooth_drop_shadow_offset (label);
- break;
-
- case ARG_SMOOTH_DROP_SHADOW_COLOR:
- GTK_VALUE_UINT (*arg) = nautilus_label_get_smooth_drop_shadow_color (label);
- break;
-
- case ARG_SMOOTH_LINE_WRAP_WIDTH:
- GTK_VALUE_INT (*arg) = nautilus_label_get_smooth_line_wrap_width (label);
- break;
-
- case ARG_ADJUST_WRAP_ON_RESIZE:
- GTK_VALUE_BOOL (*arg) = nautilus_label_get_adjust_wrap_on_resize (label);
- break;
-
- default:
- g_assert_not_reached ();
- }
-}
-
-/* GtkWidgetClass methods */
-static void
-nautilus_label_size_request (GtkWidget *widget,
- GtkRequisition *requisition)
-{
- NautilusLabel *label;
-
- NautilusDimensions content_dimensions;
- NautilusDimensions tile_dimensions;
- NautilusDimensions preferred_dimensions;
-
- g_return_if_fail (NAUTILUS_IS_LABEL (widget));
- g_return_if_fail (requisition != NULL);
-
- label = NAUTILUS_LABEL (widget);
-
- if (!label_is_smooth (label)) {
- NAUTILUS_CALL_PARENT (GTK_WIDGET_CLASS, size_request, (widget, requisition));
- return;
- }
-
- content_dimensions = label_get_content_dimensions (label);
- tile_dimensions = label_get_tile_dimensions (label);
-
- preferred_dimensions = nautilus_smooth_widget_get_preferred_dimensions (widget,
- &content_dimensions,
- &tile_dimensions,
- label->details->tile_width,
- label->details->tile_height);
- requisition->width = preferred_dimensions.width;
- requisition->height = preferred_dimensions.height;
-}
-
-static void
-nautilus_label_size_allocate (GtkWidget *widget,
- GtkAllocation *allocation)
-{
- NautilusLabel *label;
-
- g_return_if_fail (NAUTILUS_IS_LABEL (widget));
- g_return_if_fail (allocation != NULL);
-
- label = NAUTILUS_LABEL (widget);
-
- /* Pre chain size_allocate */
- NAUTILUS_CALL_PARENT (GTK_WIDGET_CLASS, size_allocate, (widget, allocation));
-
- /* Update the wrap width if needed */
- if (label->details->adjust_wrap_on_resize) {
- label->details->smooth_line_wrap_width = (int) allocation->width;
- if (label->details->smooth_text_layout != NULL) {
- nautilus_smooth_text_layout_set_line_wrap_width (label->details->smooth_text_layout,
- label->details->smooth_line_wrap_width);
- }
- label_solid_cache_pixbuf_clear (label);
- }
-}
-
-/* Painting callback for non smooth case */
-static void
-label_paint_pixbuf_callback (GtkWidget *widget,
- GdkDrawable *destination_drawable,
- GdkGC *gc,
- int source_x,
- int source_y,
- const ArtIRect *area,
- gpointer callback_data)
-{
- NautilusLabel *label;
- const ArtIRect *screen_dirty_area;
- GdkEventExpose event;
-
- g_return_if_fail (NAUTILUS_IS_LABEL (widget));
- g_return_if_fail (GTK_WIDGET_REALIZED (widget));
- g_return_if_fail (destination_drawable != NULL);
- g_return_if_fail (gc != NULL);
- g_return_if_fail (area != NULL && !art_irect_empty (area));
-
- label = NAUTILUS_LABEL (widget);
-
- screen_dirty_area = callback_data;
-
- event.type = GDK_EXPOSE;
- event.send_event = TRUE;
- event.window = widget->window;
- event.area = nautilus_art_irect_to_gdk_rectangle (screen_dirty_area);
- event.count = 0;
-
- NAUTILUS_CALL_PARENT (GTK_WIDGET_CLASS, expose_event, (widget, &event));
-}
-
-/* Compositing callback for smooth case */
-static void
-label_composite_text_callback_cached (GtkWidget *widget,
- GdkPixbuf *destination_pixbuf,
- int source_x,
- int source_y,
- const ArtIRect *area,
- int opacity,
- gpointer callback_data)
-{
- NautilusLabel *label;
- NautilusDimensions content_dimensions;
- ArtIRect cache_pixbuf_area;
-
- g_return_if_fail (NAUTILUS_IS_LABEL (widget));
- g_return_if_fail (GTK_WIDGET_REALIZED (widget));
- g_return_if_fail (destination_pixbuf != NULL);
- g_return_if_fail (area != NULL && !art_irect_empty (area));
-
- label = NAUTILUS_LABEL (widget);
-
- g_return_if_fail (label_can_cache_contents (label));
-
- content_dimensions = label_get_content_dimensions (label);
-
- g_return_if_fail (!nautilus_dimensions_empty (&content_dimensions));
-
- if (label->details->solid_cache_pixbuf == NULL) {
- label->details->solid_cache_pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB,
- FALSE,
- 8,
- content_dimensions.width,
- content_dimensions.height);
-
- nautilus_gdk_pixbuf_fill_rectangle_with_color (label->details->solid_cache_pixbuf,
- NULL,
- label->details->solid_background_color);
-
- cache_pixbuf_area = nautilus_gdk_pixbuf_intersect (label->details->solid_cache_pixbuf,
- 0,
- 0,
- NULL);
- g_return_if_fail (NAUTILUS_IS_SMOOTH_TEXT_LAYOUT (label->details->smooth_text_layout));
-
- if (label->details->smooth_drop_shadow_offset > 0) {
- cache_pixbuf_area.x0 += label->details->smooth_drop_shadow_offset;
- cache_pixbuf_area.y0 += label->details->smooth_drop_shadow_offset;
- nautilus_smooth_text_layout_draw_to_pixbuf (label->details->smooth_text_layout,
- label->details->solid_cache_pixbuf,
- 0,
- 0,
- &cache_pixbuf_area,
- nautilus_label_get_text_justify (label),
- FALSE,
- label->details->smooth_drop_shadow_color,
- label->details->text_opacity);
- cache_pixbuf_area.x0 -= label->details->smooth_drop_shadow_offset;
- cache_pixbuf_area.y0 -= label->details->smooth_drop_shadow_offset;
- }
-
- nautilus_smooth_text_layout_draw_to_pixbuf (label->details->smooth_text_layout,
- label->details->solid_cache_pixbuf,
- 0,
- 0,
- &cache_pixbuf_area,
- nautilus_label_get_text_justify (label),
- FALSE,
- label->details->smooth_text_color,
- label->details->text_opacity);
- }
-
- g_return_if_fail (label->details->solid_cache_pixbuf != NULL);
-
- nautilus_gdk_pixbuf_draw_to_pixbuf (label->details->solid_cache_pixbuf,
- destination_pixbuf,
- source_x,
- source_y,
- area);
-}
-
-static void
-label_composite_text_callback (GtkWidget *widget,
- GdkPixbuf *destination_pixbuf,
- int source_x,
- int source_y,
- const ArtIRect *area,
- int opacity,
- gpointer callback_data)
-{
- NautilusLabel *label;
-
- g_return_if_fail (NAUTILUS_IS_LABEL (widget));
- g_return_if_fail (GTK_WIDGET_REALIZED (widget));
- g_return_if_fail (destination_pixbuf != NULL);
- g_return_if_fail (area != NULL && !art_irect_empty (area));
-
- label = NAUTILUS_LABEL (widget);
-
- g_return_if_fail (!label_can_cache_contents (label));
-
- nautilus_smooth_text_layout_draw_to_pixbuf (label->details->smooth_text_layout,
- destination_pixbuf,
- source_x,
- source_y,
- area,
- nautilus_label_get_text_justify (label),
- FALSE,
- label->details->smooth_text_color,
- label->details->text_opacity);
-}
-
-static void
-label_composite_text_and_shadow_callback (GtkWidget *widget,
- GdkPixbuf *destination_pixbuf,
- int source_x,
- int source_y,
- const ArtIRect *area,
- int opacity,
- gpointer callback_data)
-{
- NautilusLabel *label;
-
- g_return_if_fail (NAUTILUS_IS_LABEL (widget));
- g_return_if_fail (GTK_WIDGET_REALIZED (widget));
- g_return_if_fail (destination_pixbuf != NULL);
- g_return_if_fail (area != NULL && !art_irect_empty (area));
-
- label = NAUTILUS_LABEL (widget);
-
- g_return_if_fail (!label_can_cache_contents (label));
-
- nautilus_smooth_text_layout_draw_to_pixbuf_shadow (label->details->smooth_text_layout,
- destination_pixbuf,
- source_x,
- source_y,
- area,
- label->details->smooth_drop_shadow_offset,
- nautilus_label_get_text_justify (label),
- FALSE,
- label->details->smooth_text_color,
- label->details->smooth_drop_shadow_color,
- label->details->text_opacity);
-}
-
-static void
-label_paint (NautilusLabel *label,
- const ArtIRect *screen_dirty_area,
- const ArtIRect *tile_bounds)
-{
- ArtIRect widget_bounds;
-
- g_return_if_fail (NAUTILUS_IS_LABEL (label));
- g_return_if_fail (GTK_WIDGET_REALIZED (label));
- g_return_if_fail (screen_dirty_area != NULL);
- g_return_if_fail (tile_bounds != NULL);
-
- /* The smooth and non smooth bounds are different. We have
- * no way to have GtkLabel tell us what its bounds are.
- * So, we cheat and pretend that for the non smooth case,
- * the text bounds are the whole widget.
- *
- * This works because the smooth widget paint handler will
- * properly intersect these bounds and call the paint
- * callback. We feed the paint callback the actual gdk
- * expose event so that we feed the exact exposure area
- * to GtkLabel's expose_event.
- */
- widget_bounds = nautilus_gtk_widget_get_bounds (GTK_WIDGET (label));
-
- /* Make sure the area is screen visible before painting */
- nautilus_smooth_widget_paint (GTK_WIDGET (label),
- GTK_WIDGET (label)->style->white_gc,
- FALSE,
- label->details->background_mode,
- label->details->solid_background_color,
- label->details->tile_pixbuf,
- tile_bounds,
- label->details->tile_opacity,
- label->details->tile_mode_vertical,
- label->details->tile_mode_horizontal,
- &widget_bounds,
- label->details->text_opacity,
- screen_dirty_area,
- label_paint_pixbuf_callback,
- label_composite_text_callback,
- (gpointer) screen_dirty_area);
-}
-
-static void
-paint_label_smooth (NautilusLabel *label,
- const ArtIRect *screen_dirty_area,
- const ArtIRect *tile_bounds)
-{
- ArtIRect text_bounds;
- ArtIRect content_bounds;
-
- g_return_if_fail (NAUTILUS_IS_LABEL (label));
- g_return_if_fail (GTK_WIDGET_REALIZED (label));
- g_return_if_fail (screen_dirty_area != NULL);
- g_return_if_fail (tile_bounds != NULL);
-
- if (label->details->smooth_drop_shadow_offset > 0) {
- /* Paint the text and shadow if needed */
- content_bounds = label_get_content_bounds (label);
- if (!art_irect_empty (&content_bounds)) {
- nautilus_smooth_widget_paint (GTK_WIDGET (label),
- GTK_WIDGET (label)->style->white_gc,
- TRUE,
- label->details->background_mode,
- label->details->solid_background_color,
- label->details->tile_pixbuf,
- tile_bounds,
- label->details->tile_opacity,
- label->details->tile_mode_vertical,
- label->details->tile_mode_horizontal,
- &content_bounds,
- label->details->text_opacity,
- screen_dirty_area,
- label_paint_pixbuf_callback,
- label_composite_text_and_shadow_callback,
- NULL);
- }
- } else {
- /* Paint the text if needed */
- text_bounds = label_get_text_bounds (label);
- nautilus_smooth_widget_paint (GTK_WIDGET (label),
- GTK_WIDGET (label)->style->white_gc,
- TRUE,
- label->details->background_mode,
- label->details->solid_background_color,
- label->details->tile_pixbuf,
- tile_bounds,
- label->details->tile_opacity,
- label->details->tile_mode_vertical,
- label->details->tile_mode_horizontal,
- &text_bounds,
- label->details->text_opacity,
- screen_dirty_area,
- label_paint_pixbuf_callback,
- label_composite_text_callback,
- NULL);
- }
-}
-
-static void
-paint_label_smooth_cached (NautilusLabel *label,
- const ArtIRect *screen_dirty_area,
- const ArtIRect *tile_bounds)
-{
- ArtIRect content_bounds;
-
- g_return_if_fail (NAUTILUS_IS_LABEL (label));
- g_return_if_fail (GTK_WIDGET_REALIZED (label));
- g_return_if_fail (screen_dirty_area != NULL);
- g_return_if_fail (tile_bounds != NULL);
- g_return_if_fail (label_can_cache_contents (label));
-
- content_bounds = label_get_content_bounds (label);
-
- nautilus_smooth_widget_paint (GTK_WIDGET (label),
- GTK_WIDGET (label)->style->white_gc,
- TRUE,
- label->details->background_mode,
- label->details->solid_background_color,
- label->details->tile_pixbuf,
- tile_bounds,
- label->details->tile_opacity,
- label->details->tile_mode_vertical,
- label->details->tile_mode_horizontal,
- &content_bounds,
- label->details->text_opacity,
- screen_dirty_area,
- label_paint_pixbuf_callback,
- label_composite_text_callback_cached,
- NULL);
-}
-
-static int
-nautilus_label_expose_event (GtkWidget *widget,
- GdkEventExpose *event)
-{
- NautilusLabel *label;
- ArtIRect dirty_area;
- ArtIRect screen_dirty_area;
- ArtIRect tile_bounds;
-
- g_return_val_if_fail (NAUTILUS_IS_LABEL (widget), TRUE);
- g_return_val_if_fail (GTK_WIDGET_REALIZED (widget), TRUE);
- g_return_val_if_fail (event != NULL, TRUE);
- g_return_val_if_fail (event->window == widget->window, TRUE);
-
- label = NAUTILUS_LABEL (widget);
-
- /* Check for the dumb case when theres nothing to do */
- if (nautilus_strlen (label_peek_text (label)) == 0 && label->details->tile_pixbuf == NULL) {
- return TRUE;
- }
-
- /* Clip the dirty area to the screen */
- dirty_area = nautilus_gdk_rectangle_to_art_irect (&event->area);
- screen_dirty_area = nautilus_gdk_window_clip_dirty_area_to_screen (event->window,
- &dirty_area);
-
- /* Bail if no work */
- if (art_irect_empty (&screen_dirty_area)) {
- return TRUE;
- }
-
- /* Fetch the tile bounds */
- tile_bounds = nautilus_smooth_widget_get_tile_bounds (widget,
- label->details->tile_pixbuf,
- label->details->tile_width,
- label->details->tile_height);
-
- /* Paint GtkLabel */
- if (!label_is_smooth (label)) {
- label_paint (label, &screen_dirty_area, &tile_bounds);
- return TRUE;
- }
-
- /* Paint smooth */
- if (label_can_cache_contents (label)) {
- paint_label_smooth_cached (label, &screen_dirty_area, &tile_bounds);
- } else {
- paint_label_smooth (label, &screen_dirty_area, &tile_bounds);
- }
-
- return TRUE;
-}
-
-/* NautilusLabel signals */
-static void
-nautilus_label_set_is_smooth_signal (GtkWidget *widget,
- gboolean is_smooth)
-{
- g_return_if_fail (NAUTILUS_IS_LABEL (widget));
-
- nautilus_label_set_is_smooth (NAUTILUS_LABEL (widget), is_smooth);
-}
-
-/* Private NautilusLabel things */
-static int
-label_get_default_line_wrap_width (const NautilusLabel *label)
-{
- g_return_val_if_fail (NAUTILUS_IS_LABEL (label), 0);
-
- return nautilus_scalable_font_text_width (label->details->smooth_font,
- label->details->smooth_font_size,
- DEFAULT_LINE_WRAP_WIDTH_TEXT,
- strlen (DEFAULT_LINE_WRAP_WIDTH_TEXT));
-}
-
-static NautilusDimensions
-label_get_text_dimensions (const NautilusLabel *label)
-{
- NautilusDimensions text_dimensions;
-
- g_return_val_if_fail (NAUTILUS_IS_LABEL (label), NAUTILUS_DIMENSIONS_EMPTY);
- label_smooth_text_ensure (label);
- g_return_val_if_fail (NAUTILUS_IS_SMOOTH_TEXT_LAYOUT (label->details->smooth_text_layout), NAUTILUS_DIMENSIONS_EMPTY);
-
- text_dimensions = nautilus_smooth_text_layout_get_dimensions (label->details->smooth_text_layout);
-
- return text_dimensions;
-}
-
-static ArtIRect
-label_get_text_bounds (const NautilusLabel *label)
-{
- ArtIRect content_bounds;
- NautilusDimensions text_dimensions;
- ArtIRect text_bounds;
-
- g_return_val_if_fail (NAUTILUS_IS_LABEL (label), NAUTILUS_ART_IRECT_EMPTY);
-
- content_bounds = label_get_content_bounds (label);
- text_dimensions = label_get_text_dimensions (label);
-
- if (nautilus_dimensions_empty (&text_dimensions)
- || art_irect_empty (&content_bounds)) {
- return NAUTILUS_ART_IRECT_EMPTY;
- }
-
- nautilus_art_irect_assign (&text_bounds,
- content_bounds.x0,
- content_bounds.y0,
- text_dimensions.width,
- text_dimensions.height);
-
- return text_bounds;
-}
-
-static NautilusDimensions
-label_get_content_dimensions (const NautilusLabel *label)
-{
- NautilusDimensions text_dimensions;
-
- g_return_val_if_fail (NAUTILUS_IS_LABEL (label), NAUTILUS_DIMENSIONS_EMPTY);
-
- text_dimensions = label_get_text_dimensions (label);
- text_dimensions.width += label->details->smooth_drop_shadow_offset;
- text_dimensions.height += label->details->smooth_drop_shadow_offset;
-
- return text_dimensions;
-}
-
-static ArtIRect
-label_get_content_bounds (const NautilusLabel *label)
-{
- NautilusDimensions content_dimensions;
- ArtIRect text_bounds;
- ArtIRect bounds;
-
- g_return_val_if_fail (NAUTILUS_IS_LABEL (label), NAUTILUS_ART_IRECT_EMPTY);
-
- content_dimensions = label_get_content_dimensions (label);
-
- if (nautilus_dimensions_empty (&content_dimensions)) {
- return NAUTILUS_ART_IRECT_EMPTY;
- }
-
- bounds = nautilus_gtk_widget_get_bounds (GTK_WIDGET (label));
-
- text_bounds = nautilus_art_irect_align (&bounds,
- content_dimensions.width,
- content_dimensions.height,
- GTK_MISC (label)->xalign,
- GTK_MISC (label)->yalign);
-
-
- return text_bounds;
-}
-
-static NautilusDimensions
-label_get_tile_dimensions (const NautilusLabel *label)
-{
- NautilusDimensions tile_dimensions;
-
- g_return_val_if_fail (NAUTILUS_IS_LABEL (label), NAUTILUS_DIMENSIONS_EMPTY);
-
- if (!label->details->tile_pixbuf) {
- return NAUTILUS_DIMENSIONS_EMPTY;
- }
-
- tile_dimensions.width = gdk_pixbuf_get_width (label->details->tile_pixbuf);
- tile_dimensions.height = gdk_pixbuf_get_height (label->details->tile_pixbuf);
-
- return tile_dimensions;
-}
-
-static void
-label_solid_cache_pixbuf_clear (NautilusLabel *label)
-{
- g_return_if_fail (NAUTILUS_IS_LABEL (label));
-
- nautilus_gdk_pixbuf_unref_if_not_null (label->details->solid_cache_pixbuf);
- label->details->solid_cache_pixbuf = NULL;
-}
-
-static gboolean
-label_can_cache_contents (const NautilusLabel *label)
-{
- g_return_val_if_fail (NAUTILUS_IS_LABEL (label), FALSE);
-
- return (label->details->background_mode == NAUTILUS_SMOOTH_BACKGROUND_SOLID_COLOR)
- && !label->details->tile_pixbuf;
-}
-
-const char *
-label_peek_text (const NautilusLabel *label)
-{
- g_return_val_if_fail (NAUTILUS_IS_LABEL (label), NULL);
-
- return GTK_LABEL (label)->label;
-}
-
-static void
-label_smooth_text_ensure (const NautilusLabel *label)
-{
- const char *text;
- g_return_if_fail (NAUTILUS_IS_LABEL (label));
-
- if (label->details->smooth_text_layout != NULL) {
- return;
- }
-
- text = label_peek_text (label);
- label->details->smooth_text_layout = nautilus_smooth_text_layout_new (text,
- nautilus_strlen (text),
- label->details->smooth_font,
- label->details->smooth_font_size,
- nautilus_label_get_wrap (label));
- g_return_if_fail (NAUTILUS_IS_SMOOTH_TEXT_LAYOUT (label->details->smooth_text_layout));
- nautilus_smooth_text_layout_set_line_wrap_width (label->details->smooth_text_layout,
- label->details->smooth_line_wrap_width);
-}
-
-static void
-label_smooth_text_clear (NautilusLabel *label)
-{
- g_return_if_fail (NAUTILUS_IS_LABEL (label));
-
- if (label->details->smooth_text_layout != NULL) {
- gtk_object_unref (GTK_OBJECT (label->details->smooth_text_layout));
- }
- label->details->smooth_text_layout = NULL;
-
- /* We also need to clear the cache pixbuf */
- label_solid_cache_pixbuf_clear (label);
-}
-
-gboolean
-label_is_smooth (const NautilusLabel *label)
-{
- g_return_val_if_fail (NAUTILUS_IS_LABEL (label), FALSE);
-
- return !label->details->never_smooth && label->details->is_smooth;
-}
-
-/* Public NautilusLabel methods */
-GtkWidget *
-nautilus_label_new (const char *text)
-{
- NautilusLabel *label;
-
- label = NAUTILUS_LABEL (gtk_widget_new (nautilus_label_get_type (), NULL));
-
- nautilus_label_set_text (label, text);
-
- return GTK_WIDGET (label);
-}
-
-void
-nautilus_label_set_smooth_font (NautilusLabel *label,
- NautilusScalableFont *smooth_font)
-{
- g_return_if_fail (NAUTILUS_IS_LABEL (label));
- g_return_if_fail (NAUTILUS_IS_SCALABLE_FONT (smooth_font));
-
- if (label->details->smooth_font == smooth_font) {
- return;
- }
-
- if (label->details->smooth_font != NULL) {
- gtk_object_unref (GTK_OBJECT (label->details->smooth_font));
- }
-
- gtk_object_ref (GTK_OBJECT (smooth_font));
- label->details->smooth_font = smooth_font;
-
- label_smooth_text_clear (label);
- gtk_widget_queue_resize (GTK_WIDGET (label));
-}
-
-NautilusScalableFont *
-nautilus_label_get_smooth_font (const NautilusLabel *label)
-{
- g_return_val_if_fail (NAUTILUS_IS_LABEL (label), NULL);
-
- if (label->details->smooth_font != NULL) {
- gtk_object_ref (GTK_OBJECT (label->details->smooth_font));
- }
-
- return label->details->smooth_font;
-}
-
-void
-nautilus_label_set_smooth_font_size (NautilusLabel *label,
- int smooth_font_size)
-{
- g_return_if_fail (NAUTILUS_IS_LABEL (label));
- g_return_if_fail (smooth_font_size > MIN_SMOOTH_FONT_SIZE);
-
- if (label->details->smooth_font_size == smooth_font_size) {
- return;
- }
-
- label->details->smooth_font_size = smooth_font_size;
-
- label_smooth_text_clear (label);
- gtk_widget_queue_resize (GTK_WIDGET (label));
-}
-
-int
-nautilus_label_get_smooth_font_size (const NautilusLabel *label)
-{
- g_return_val_if_fail (NAUTILUS_IS_LABEL (label), 0);
-
- return label->details->smooth_font_size;
-}
-
-/* This function is an ugly hack. The issue is that we want
- * GtkLabel to flush its cached requisition dimensions. GtkLabel
- * caches these for efficiency. Unfortunately, there is no public
- * way to do this for GtkLabel. So, instead we trick the GtkLabel
- * into thinking that its 'pattern' has changed. As a result
- * of this phony change, GtkLabel will flush the requisition cache.
- * Of course, we don't really change the pattern, we just set the
- * old one.
- */
-static void
-label_force_cached_requisition_flush (NautilusLabel *label)
-{
- char *same_pattern;
- g_return_if_fail (NAUTILUS_IS_LABEL (label));
-
- same_pattern = g_strdup (GTK_LABEL (label)->pattern);
- gtk_label_set_pattern (GTK_LABEL (label), same_pattern);
- g_free (same_pattern);
-}
-
-void
-nautilus_label_set_is_smooth (NautilusLabel *label,
- gboolean is_smooth)
-{
- g_return_if_fail (NAUTILUS_IS_LABEL (label));
-
- if (label->details->never_smooth) {
- return;
- }
-
- if (label->details->is_smooth == is_smooth) {
- return;
- }
-
- label->details->is_smooth = is_smooth;
-
- label_smooth_text_clear (label);
-
- /* Force GtkLabel to flush its cached requisition dimensions.
- * GtkLabel caches its requisition for efficiency. We need this
- * dimensions to be flushed when our is_smooth attribute changes.
- * The reason is that the geometry of the widget is dependent on
- * whether it is_smooth or not.
- */
- label_force_cached_requisition_flush (label);
-
- gtk_widget_queue_resize (GTK_WIDGET (label));
-}
-
-gboolean
-nautilus_label_get_is_smooth (const NautilusLabel *label)
-{
- g_return_val_if_fail (NAUTILUS_IS_LABEL (label), FALSE);
-
- return label_is_smooth (label);
-}
-
-/**
- * nautilus_label_set_tile_pixbuf:
- *
- * @label: A NautilusLabel
- * @pixbuf: The new tile pixbuf
- *
- * Change the tile pixbuf. A 'pixbuf' value of NULL, means dont use a
- * tile pixbuf - this is the default behavior for the widget.
- */
-void
-nautilus_label_set_tile_pixbuf (NautilusLabel *label,
- GdkPixbuf *pixbuf)
-{
- g_return_if_fail (NAUTILUS_IS_LABEL (label));
-
- if (pixbuf != label->details->tile_pixbuf) {
- nautilus_gdk_pixbuf_unref_if_not_null (label->details->tile_pixbuf);
- nautilus_gdk_pixbuf_ref_if_not_null (pixbuf);
-
- label->details->tile_pixbuf = pixbuf;
-
- gtk_widget_queue_resize (GTK_WIDGET (label));
- }
-}
-
-/**
- * nautilus_label_get_tile_pixbuf:
- *
- * @label: A NautilusLabel
- *
- * Return value: A reference to the tile_pixbuf. Needs to be unreferenced with
- * gdk_pixbuf_unref()
- */
-GdkPixbuf*
-nautilus_label_get_tile_pixbuf (const NautilusLabel *label)
-{
- g_return_val_if_fail (NAUTILUS_IS_LABEL (label), NULL);
-
- nautilus_gdk_pixbuf_ref_if_not_null (label->details->tile_pixbuf);
-
- return label->details->tile_pixbuf;
-}
-
-void
-nautilus_label_set_text_opacity (NautilusLabel *label,
- int opacity)
-{
- g_return_if_fail (NAUTILUS_IS_LABEL (label));
- g_return_if_fail (opacity >= NAUTILUS_OPACITY_FULLY_TRANSPARENT);
- g_return_if_fail (opacity <= NAUTILUS_OPACITY_FULLY_OPAQUE);
-
- label->details->text_opacity = opacity;
-
- gtk_widget_queue_draw (GTK_WIDGET (label));
-}
-
-int
-nautilus_label_get_text_opacity (const NautilusLabel *label)
-{
- g_return_val_if_fail (NAUTILUS_IS_LABEL (label), NAUTILUS_OPACITY_FULLY_OPAQUE);
-
- return label->details->text_opacity;
-}
-
-void
-nautilus_label_set_tile_opacity (NautilusLabel *label,
- int tile_opacity)
-{
- g_return_if_fail (NAUTILUS_IS_LABEL (label));
- g_return_if_fail (tile_opacity >= NAUTILUS_OPACITY_FULLY_TRANSPARENT);
- g_return_if_fail (tile_opacity <= NAUTILUS_OPACITY_FULLY_OPAQUE);
-
- if (label->details->tile_opacity == tile_opacity) {
- return;
- }
-
- label->details->tile_opacity = tile_opacity;
-
- gtk_widget_queue_draw (GTK_WIDGET (label));
-}
-
-int
-nautilus_label_get_tile_opacity (const NautilusLabel *label)
-{
- g_return_val_if_fail (NAUTILUS_IS_LABEL (label), NAUTILUS_OPACITY_FULLY_OPAQUE);
-
- return label->details->tile_opacity;
-}
-
-void
-nautilus_label_set_tile_width (NautilusLabel *label,
- int tile_width)
-{
- g_return_if_fail (NAUTILUS_IS_LABEL (label));
- g_return_if_fail (tile_width >= NAUTILUS_SMOOTH_TILE_EXTENT_ONE_STEP);
-
- if (label->details->tile_width == tile_width) {
- return;
- }
-
- label->details->tile_width = tile_width;
-
- gtk_widget_queue_resize (GTK_WIDGET (label));
-}
-
-/**
- * nautilus_label_get_tile_width:
- *
- * @label: A NautilusLabel
- *
- * Return value: The tile width.
- */
-int
-nautilus_label_get_tile_width (const NautilusLabel *label)
-{
- g_return_val_if_fail (NAUTILUS_IS_LABEL (label), 0);
-
- return label->details->tile_width;
-}
-
-void
-nautilus_label_set_tile_height (NautilusLabel *label,
- int tile_height)
-{
- g_return_if_fail (NAUTILUS_IS_LABEL (label));
- g_return_if_fail (tile_height >= NAUTILUS_SMOOTH_TILE_EXTENT_ONE_STEP);
-
- if (label->details->tile_height == tile_height) {
- return;
- }
-
- label->details->tile_height = tile_height;
-
- gtk_widget_queue_resize (GTK_WIDGET (label));
-}
-
-/**
- * nautilus_label_get_tile_height:
- *
- * @label: A NautilusLabel
- *
- * Return value: The tile height.
- */
-int
-nautilus_label_get_tile_height (const NautilusLabel *label)
-{
- g_return_val_if_fail (NAUTILUS_IS_LABEL (label), 0);
-
- return label->details->tile_height;
-}
-
-void
-nautilus_label_set_tile_mode_vertical (NautilusLabel *label,
- NautilusSmoothTileMode tile_mode_vertical)
-{
- g_return_if_fail (NAUTILUS_IS_LABEL (label));
- g_return_if_fail (tile_mode_vertical >= NAUTILUS_SMOOTH_TILE_SELF);
- g_return_if_fail (tile_mode_vertical <= NAUTILUS_SMOOTH_TILE_ANCESTOR);
-
- if (label->details->tile_mode_vertical == tile_mode_vertical) {
- return;
- }
-
- label->details->tile_mode_vertical = tile_mode_vertical;
-
- gtk_widget_queue_draw (GTK_WIDGET (label));
-}
-
-NautilusSmoothTileMode
-nautilus_label_get_tile_mode_vertical (const NautilusLabel *label)
-{
- g_return_val_if_fail (NAUTILUS_IS_LABEL (label), 0);
-
- return label->details->tile_mode_vertical;
-}
-
-void
-nautilus_label_set_tile_mode_horizontal (NautilusLabel *label,
- NautilusSmoothTileMode tile_mode_horizontal)
-{
- g_return_if_fail (NAUTILUS_IS_LABEL (label));
- g_return_if_fail (tile_mode_horizontal >= NAUTILUS_SMOOTH_TILE_SELF);
- g_return_if_fail (tile_mode_horizontal <= NAUTILUS_SMOOTH_TILE_ANCESTOR);
-
- if (label->details->tile_mode_horizontal == tile_mode_horizontal) {
- return;
- }
-
- label->details->tile_mode_horizontal = tile_mode_horizontal;
-
- gtk_widget_queue_draw (GTK_WIDGET (label));
-}
-
-NautilusSmoothTileMode
-nautilus_label_get_tile_mode_horizontal (const NautilusLabel *label)
-{
- g_return_val_if_fail (NAUTILUS_IS_LABEL (label), 0);
-
- return label->details->tile_mode_horizontal;
-}
-
-void
-nautilus_label_set_tile_pixbuf_from_file_name (NautilusLabel *label,
- const char *tile_file_name)
-{
- GdkPixbuf *tile_pixbuf;
-
- g_return_if_fail (NAUTILUS_IS_LABEL (label));
- g_return_if_fail (tile_file_name != NULL);
-
- tile_pixbuf = gdk_pixbuf_new_from_file (tile_file_name);
-
- if (tile_pixbuf != NULL) {
- nautilus_label_set_tile_pixbuf (label, tile_pixbuf);
- gdk_pixbuf_unref (tile_pixbuf);
- }
-}
-
-void
-nautilus_label_set_background_mode (NautilusLabel *label,
- NautilusSmoothBackgroundMode background_mode)
-{
- g_return_if_fail (NAUTILUS_IS_LABEL (label));
- g_return_if_fail (background_mode >= NAUTILUS_SMOOTH_BACKGROUND_GTK);
- g_return_if_fail (background_mode <= NAUTILUS_SMOOTH_BACKGROUND_SOLID_COLOR);
-
- if (label->details->background_mode == background_mode) {
- return;
- }
-
- label->details->background_mode = background_mode;
-
- gtk_widget_queue_draw (GTK_WIDGET (label));
-}
-
-NautilusSmoothBackgroundMode
-nautilus_label_get_background_mode (const NautilusLabel *label)
-{
- g_return_val_if_fail (NAUTILUS_IS_LABEL (label), 0);
-
- return label->details->background_mode;
-}
-
-void
-nautilus_label_set_solid_background_color (NautilusLabel *label,
- guint32 solid_background_color)
-{
- g_return_if_fail (NAUTILUS_IS_LABEL (label));
-
- if (label->details->solid_background_color == solid_background_color) {
- return;
- }
-
- label->details->solid_background_color = solid_background_color;
-
- gtk_widget_queue_draw (GTK_WIDGET (label));
-}
-
-guint32
-nautilus_label_get_solid_background_color (const NautilusLabel *label)
-{
- g_return_val_if_fail (NAUTILUS_IS_LABEL (label), 0);
-
- return label->details->solid_background_color;
-}
-
-/**
- * nautilus_label_set_wrap_width:
- *
- * @label: A NautilusLabel
- * @line_wrap_width: The new line wrap width.
- *
- * The line wrap width is something.
- *
- */
-void
-nautilus_label_set_smooth_line_wrap_width (NautilusLabel *label,
- int line_wrap_width)
-{
- g_return_if_fail (NAUTILUS_IS_LABEL (label));
-
- if (label->details->smooth_line_wrap_width == line_wrap_width) {
- return;
- }
-
- label->details->smooth_line_wrap_width = line_wrap_width;
-
- label_smooth_text_clear (label);
- gtk_widget_queue_resize (GTK_WIDGET (label));
-}
-
-/**
- * nautilus_label_get_smooth_line_wrap_width:
- *
- * @label: A NautilusLabel
- *
- * Return value: A boolean value indicating whether the label
- * is currently line wrapping text.
- */
-int
-nautilus_label_get_smooth_line_wrap_width (const NautilusLabel *label)
-{
- g_return_val_if_fail (NAUTILUS_IS_LABEL (label), FALSE);
-
- return label->details->smooth_line_wrap_width;
-}
-
-void
-nautilus_label_set_text_color (NautilusLabel *label,
- guint32 text_color)
-{
- char *color_spec;
-
- g_return_if_fail (NAUTILUS_IS_LABEL (label));
-
- if (label->details->smooth_text_color == text_color) {
- return;
- }
-
- label->details->smooth_text_color = text_color;
-
- color_spec = nautilus_gdk_rgb_to_color_spec (text_color);
-
- nautilus_gtk_widget_set_foreground_color (GTK_WIDGET (label), color_spec);
-
- g_free (color_spec);
-
- gtk_widget_queue_draw (GTK_WIDGET (label));
-}
-
-guint32
-nautilus_label_get_text_color (const NautilusLabel *label)
-{
- g_return_val_if_fail (NAUTILUS_IS_LABEL (label), 0);
-
- return label->details->smooth_text_color;
-}
-
-/**
- * nautilus_label_set_smooth_drop_shadow_offset:
- *
- * @label: A NautilusLabel
- * @smooth_drop_shadow_offset: The new drop shadow offset.
-
- * The drop shadow offset is specified in pixels. If greater than zero,
- * the label will render on top of a nice shadow. The shadow will be
- * offset from the label text by 'smooth_drop_shadow_offset' pixels.
- */
-void
-nautilus_label_set_smooth_drop_shadow_offset (NautilusLabel *label,
- int drop_shadow_offset)
- {
- g_return_if_fail (NAUTILUS_IS_LABEL (label));
- g_return_if_fail (drop_shadow_offset >= 0);
-
- if (label->details->smooth_drop_shadow_offset == drop_shadow_offset) {
- return;
- }
-
- label->details->smooth_drop_shadow_offset = drop_shadow_offset;
- label_solid_cache_pixbuf_clear (label);
- gtk_widget_queue_resize (GTK_WIDGET (label));
-}
-
-/**
- * nautilus_label_get_smooth_drop_shadow_offset:
- *
- * @label: A NautilusLabel
- *
- * Return value: The line offset in pixels.
- */
-int
-nautilus_label_get_smooth_drop_shadow_offset (const NautilusLabel *label)
-{
- g_return_val_if_fail (NAUTILUS_IS_LABEL (label), 0);
-
- return label->details->smooth_drop_shadow_offset;
-}
-
-/**
- * nautilus_label_set_smooth_drop_shadow_color:
- *
- * @label: A NautilusLabel
- * @smooth_drop_shadow_color: The new drop shadow color.
- *
- * Return value: The drop shadow color.
- */
-void
-nautilus_label_set_smooth_drop_shadow_color (NautilusLabel *label,
- guint32 drop_shadow_color)
-{
- g_return_if_fail (NAUTILUS_IS_LABEL (label));
-
- if (label->details->smooth_drop_shadow_color == drop_shadow_color) {
- return;
- }
-
- label->details->smooth_drop_shadow_color = drop_shadow_color;
- label_solid_cache_pixbuf_clear (label);
- gtk_widget_queue_draw (GTK_WIDGET (label));
-}
-
-/**
- * nautilus_label_get_smooth_drop_shadow_color:
- *
- * @label: A NautilusLabel
- *
- * Return value: The drop shadow color.
- */
-guint32
-nautilus_label_get_smooth_drop_shadow_color (const NautilusLabel *label)
-{
- g_return_val_if_fail (NAUTILUS_IS_LABEL (label), 0);
-
- return label->details->smooth_drop_shadow_color;
-}
-
-void
-nautilus_label_set_justify (NautilusLabel *label,
- GtkJustification justification)
-{
- g_return_if_fail (NAUTILUS_IS_LABEL (label));
- g_return_if_fail (justification >= GTK_JUSTIFY_LEFT);
- g_return_if_fail (justification <= GTK_JUSTIFY_FILL);
-
- if (nautilus_label_get_text_justify (label) == justification) {
- return;
- }
-
- gtk_label_set_justify (GTK_LABEL (label), justification);
-
- gtk_widget_queue_draw (GTK_WIDGET (label));
-}
-
-GtkJustification
-nautilus_label_get_text_justify (const NautilusLabel *label)
-{
- g_return_val_if_fail (NAUTILUS_IS_LABEL (label), 0);
-
- return GTK_LABEL (label)->jtype;
-}
-
-gboolean
-nautilus_label_set_text (NautilusLabel *label,
- const char *text)
-{
- GtkLabel *gtk_label;
-
- g_return_val_if_fail (NAUTILUS_IS_LABEL (label), FALSE);
-
- gtk_label = GTK_LABEL (label);
-
- if (nautilus_str_is_equal (text, gtk_label->label)) {
- return FALSE;
- }
-
- gtk_label_set_text (gtk_label, text);
-
- label_smooth_text_clear (label);
- gtk_widget_queue_resize (GTK_WIDGET (label));
-
- return TRUE;
-}
-
-char*
-nautilus_label_get_text (const NautilusLabel *label)
-{
- GtkLabel *gtk_label;
-
- g_return_val_if_fail (NAUTILUS_IS_LABEL (label), NULL);
-
- gtk_label = GTK_LABEL (label);
-
- return gtk_label->label ? g_strdup (gtk_label->label) : NULL;
-}
-
-/**
- * nautilus_label_set_wrap:
- *
- * @label: A NautilusLabel
- * @line_wrap: A boolean value indicating whether the label should
- * line wrap words if they dont fit in the horizontally allocated
- * space.
- *
- */
-void
-nautilus_label_set_wrap (NautilusLabel *label,
- gboolean line_wrap)
-{
- g_return_if_fail (NAUTILUS_IS_LABEL (label));
-
- if (nautilus_label_get_wrap (label) == line_wrap) {
- return;
- }
-
- gtk_label_set_line_wrap (GTK_LABEL (label), line_wrap);
-
- label_smooth_text_clear (label);
- gtk_widget_queue_resize (GTK_WIDGET (label));
-}
-
-/**
- * nautilus_label_get_wrap:
- *
- * @label: A NautilusLabel
- *
- * Return value: A boolean value indicating whether the label
- * is currently line wrapping text.
- */
-gboolean
-nautilus_label_get_wrap (const NautilusLabel *label)
-{
- g_return_val_if_fail (NAUTILUS_IS_LABEL (label), FALSE);
-
- return GTK_LABEL (label)->wrap;
-}
-
-/**
- * nautilus_label_new_solid:
- *
- * @text: Text or NULL
- * @drop_shadow_offset: Drop shadow offset.
- * @drop_shadow_color: Drop shadow color.
- * @text_color: Text color.
- * @x_alignment: Horizontal alignment.
- * @y_alignment: Vertical alignment.
- * @x_padding: Amount to pad label in the x direction.
- * @y_padding: Amount to pad label in the y direction.
- * @background_color: Background color.
- * @tile_pixbuf: Pixbuf to use for tile or NULL.
- *
- * Create a label with a solid background.
- *
- * Return value: Newly created label with all the given values.
- */
-GtkWidget *
-nautilus_label_new_solid (const char *text,
- int drop_shadow_offset,
- guint32 drop_shadow_color,
- guint32 text_color,
- float x_alignment,
- float y_alignment,
- int x_padding,
- int y_padding,
- guint32 background_color,
- GdkPixbuf *tile_pixbuf)
-{
- NautilusLabel *label;
-
- label = NAUTILUS_LABEL (nautilus_label_new (text ? text : ""));
-
- nautilus_label_set_background_mode (NAUTILUS_LABEL (label), NAUTILUS_SMOOTH_BACKGROUND_SOLID_COLOR);
- nautilus_label_set_smooth_drop_shadow_color (label, drop_shadow_color);
- nautilus_label_set_smooth_drop_shadow_offset (label, drop_shadow_offset);
- nautilus_label_set_text_color (label, text_color);
- nautilus_label_set_solid_background_color (NAUTILUS_LABEL (label), background_color);
-
- gtk_misc_set_padding (GTK_MISC (label), x_padding, y_padding);
- gtk_misc_set_alignment (GTK_MISC (label), x_alignment, y_alignment);
-
- if (tile_pixbuf != NULL) {
- nautilus_label_set_tile_pixbuf (NAUTILUS_LABEL (label), tile_pixbuf);
- }
-
- return GTK_WIDGET (label);
-}
-
-/**
- * nautilus_gtk_label_make_bold.
- *
- * Switches the font of label to a bold equivalent.
- * @label: The label.
- **/
-void
-nautilus_label_make_bold (NautilusLabel *label)
-{
- NautilusScalableFont *bold_font;
-
- g_return_if_fail (NAUTILUS_IS_LABEL (label));
-
- nautilus_gtk_label_make_bold (GTK_LABEL (label));
-
- bold_font = nautilus_scalable_font_make_bold (label->details->smooth_font);
- g_assert (NAUTILUS_IS_SCALABLE_FONT (bold_font));
-
- if (bold_font != NULL) {
- nautilus_label_set_smooth_font (label, bold_font);
- gtk_object_unref (GTK_OBJECT (bold_font));
- }
-
-
- label_smooth_text_clear (label);
- gtk_widget_queue_resize (GTK_WIDGET (label));
-}
-
-/**
- * nautilus_gtk_label_make_larger.
- *
- * Switches the font of label to a larger version of the font.
- * @label: The label.
- **/
-void
-nautilus_label_make_larger (NautilusLabel *label,
- guint num_steps)
-{
- g_return_if_fail (NAUTILUS_IS_LABEL (label));
-
- label->details->smooth_font_size += num_steps;
-
- nautilus_gtk_label_make_larger (GTK_LABEL (label), num_steps);
-
- label_smooth_text_clear (label);
- gtk_widget_queue_resize (GTK_WIDGET (label));
-}
-
-/**
- * nautilus_gtk_label_make_smaller.
- *
- * Switches the font of label to a smaller version of the font.
- * @label: The label.
- **/
-void
-nautilus_label_make_smaller (NautilusLabel *label,
- guint num_steps)
-{
- g_return_if_fail (NAUTILUS_IS_LABEL (label));
-
- label->details->smooth_font_size -= num_steps;
-
- nautilus_gtk_label_make_smaller (GTK_LABEL (label), num_steps);
-
- label_smooth_text_clear (label);
- gtk_widget_queue_resize (GTK_WIDGET (label));
-}
-
-/**
- * nautilus_label_set_never_smooth
- *
- * @label: A NautilusLabel.
- * @never_smooth: A boolean value indicating whether the label can NEVER be smooth.
- *
- * Force an label to never be smooth. Calls to nautilus_label_set_is_smooth () will
- * thus be ignored. This is useful if you want to use a NautilusLabel in a situation
- * wherre smoothness does not make sense - for example, in a dialog with other "normal"
- * GtkLabel widgets for consistency.
- */
-void
-nautilus_label_set_never_smooth (NautilusLabel *label,
- gboolean never_smooth)
-{
- g_return_if_fail (NAUTILUS_IS_LABEL (label));
-
- label->details->never_smooth = never_smooth;
-
- label_smooth_text_clear (label);
-
- /* Force GtkLabel to flush its cached requisition dimensions.
- * GtkLabel caches its requisition for efficiency. We need this
- * dimensions to be flushed when our is_smooth attribute changes.
- * The reason is that the geometry of the widget is dependent on
- * whether it is_smooth or not.
- */
- label_force_cached_requisition_flush (label);
-
- gtk_widget_queue_resize (GTK_WIDGET (label));
-}
-
-/**
- * nautilus_label_set_adjust_wrap_on_resize:
- *
- * @label: A NautilusLabel
- * @adjust_wrap_on_resize: A boolean value indicating whether the label should
- * automatically update the line_wrap_width when its resized.
- */
-void
-nautilus_label_set_adjust_wrap_on_resize (NautilusLabel *label,
- gboolean adjust_wrap_on_resize)
-{
- g_return_if_fail (NAUTILUS_IS_LABEL (label));
-
- if (label->details->adjust_wrap_on_resize == adjust_wrap_on_resize) {
- return;
- }
-
- label->details->adjust_wrap_on_resize = adjust_wrap_on_resize;
-
- gtk_widget_queue_resize (GTK_WIDGET (label));
-}
-
-/**
- * nautilus_label_get_wrap:
- *
- * @label: A NautilusLabel
- *
- * Return value: A boolean value indicating whether the label
- * automatically updates the line_wrap_width when its resized.
- */
-gboolean
-nautilus_label_get_adjust_wrap_on_resize (const NautilusLabel *label)
-{
- g_return_val_if_fail (NAUTILUS_IS_LABEL (label), FALSE);
-
- return label->details->adjust_wrap_on_resize;
-}