r4269: Bugfix: New detail crashes cleanice theme. Try another value... (reported
[rox-filer/translations.git] / ROX-Filer / src / wrapped.c
blobda88ae99de97f96a3e0523bce377f1b801a68c7d
1 /*
2 * $Id$
4 * ROX-Filer, filer for the ROX desktop project
5 * Copyright (C) 2005, the ROX-Filer team.
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the Free
9 * Software Foundation; either version 2 of the License, or (at your option)
10 * any later version.
12 * This program is distributed in the hope that it will be useful, but WITHOUT
13 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
15 * more details.
17 * You should have received a copy of the GNU General Public License along with
18 * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
19 * Place, Suite 330, Boston, MA 02111-1307 USA
22 /* wrapped.c - a replacement for GtkLabel that wraps sensibly */
24 #include "config.h"
26 #include <gtk/gtk.h>
28 #include "global.h"
30 #include "wrapped.h"
32 static gpointer parent_class = NULL;
34 /* Static prototypes */
35 static void wrapped_label_finialize(GObject *object);
36 static void wrapped_label_class_init(gpointer gclass, gpointer data);
37 static void wrapped_label_init(GTypeInstance *object, gpointer gclass);
38 static void wrapped_label_size_request(GtkWidget *widget,
39 GtkRequisition *requisition);
40 static gint wrapped_label_expose(GtkWidget *widget, GdkEventExpose *event);
41 static void wrapped_label_style_set(GtkWidget *widget,
42 GtkStyle *previous_style);
45 /****************************************************************
46 * EXTERNAL INTERFACE *
47 ****************************************************************/
49 GtkWidget *wrapped_label_new(const char *text, gint width)
51 WrappedLabel *wl;
53 wl = g_object_new(wrapped_label_get_type(), NULL);
54 wl->width = width;
56 wrapped_label_set_text(wl, text);
58 return GTK_WIDGET(wl);
61 void wrapped_label_set_text(WrappedLabel *wl, const char *text)
63 GtkWidget *widget = GTK_WIDGET(wl);
65 if (!wl->layout)
67 wl->layout = gtk_widget_create_pango_layout(widget, text);
68 pango_layout_set_width(wl->layout, wl->width * PANGO_SCALE);
69 pango_layout_set_wrap(wl->layout, PANGO_WRAP_WORD);
70 pango_layout_set_alignment(wl->layout, PANGO_ALIGN_CENTER);
72 else
73 pango_layout_set_text(wl->layout, text, -1);
75 gtk_widget_queue_resize(widget);
78 /****************************************************************
79 * INTERNAL FUNCTIONS *
80 ****************************************************************/
82 static void wrapped_label_finialize(GObject *object)
84 WrappedLabel *wl = (WrappedLabel *) object;
86 if (wl->layout)
88 g_object_unref(G_OBJECT(wl->layout));
89 wl->layout = NULL;
92 G_OBJECT_CLASS(parent_class)->finalize(object);
95 static void wrapped_label_class_init(gpointer gclass, gpointer data)
97 GObjectClass *object = (GObjectClass *) gclass;
98 GtkWidgetClass *widget_class = (GtkWidgetClass *) gclass;
100 parent_class = g_type_class_peek_parent(gclass);
102 object->finalize = wrapped_label_finialize;
104 widget_class->size_request = wrapped_label_size_request;
105 widget_class->expose_event = wrapped_label_expose;
106 widget_class->style_set = wrapped_label_style_set;
109 static void wrapped_label_init(GTypeInstance *object, gpointer gclass)
111 WrappedLabel *wl = (WrappedLabel *) object;
112 GtkWidget *widget = (GtkWidget *) object;
114 GTK_WIDGET_SET_FLAGS(widget, GTK_NO_WINDOW);
116 wl->layout = NULL;
117 wl->width = -1;
118 wl->text_width = -1;
121 GType wrapped_label_get_type(void)
123 static GType type = 0;
125 if (!type)
127 static const GTypeInfo info =
129 sizeof (WrappedLabelClass),
130 NULL, /* base_init */
131 NULL, /* base_finalise */
132 wrapped_label_class_init,
133 NULL, /* class_finalise */
134 NULL, /* class_data */
135 sizeof(WrappedLabel),
136 0, /* n_preallocs */
137 wrapped_label_init
140 type = g_type_register_static(GTK_TYPE_WIDGET, "WrappedLabel",
141 &info, 0);
144 return type;
147 static void wrapped_label_size_request(GtkWidget *widget,
148 GtkRequisition *requisition)
150 PangoRectangle logical_rect;
151 WrappedLabel *wl = (WrappedLabel *) widget;
153 g_return_if_fail(wl->layout != NULL);
155 pango_layout_get_extents(wl->layout, NULL, &logical_rect);
157 wl->x_off = PANGO_PIXELS(logical_rect.x);
158 wl->y_off = PANGO_PIXELS(logical_rect.y);
159 wl->text_width = PANGO_PIXELS(logical_rect.width);
161 requisition->width = PANGO_PIXELS(logical_rect.width);
162 requisition->height = PANGO_PIXELS(logical_rect.height);
165 static gint wrapped_label_expose(GtkWidget *widget, GdkEventExpose *event)
167 WrappedLabel *wl = (WrappedLabel *) widget;
168 int x;
170 g_return_val_if_fail(event != NULL, TRUE);
171 g_return_val_if_fail(wl->layout != NULL, TRUE);
173 x = widget->allocation.x -
174 ((wl->text_width - widget->allocation.width) >> 1);
176 gtk_paint_layout(widget->style,
177 widget->window,
178 GTK_WIDGET_STATE(widget),
179 FALSE,
180 NULL, /* DON'T clip! */
181 widget,
182 "label",
183 x - wl->x_off,
184 widget->allocation.y - wl->y_off,
185 wl->layout);
187 return FALSE;
190 static void wrapped_label_style_set(GtkWidget *widget,
191 GtkStyle *previous_style)
193 WrappedLabel *wl = (WrappedLabel *) widget;
195 if (wl->layout)
197 const gchar *txt;
198 PangoLayout *old = wl->layout;
200 txt = pango_layout_get_text(wl->layout);
202 wl->layout = NULL;
203 wrapped_label_set_text(wl, txt);
205 g_object_unref(old);