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)
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
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 */
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
)
53 wl
= g_object_new(wrapped_label_get_type(), NULL
);
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
);
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
);
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
;
88 g_object_unref(G_OBJECT(wl
->layout
));
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
);
121 GType
wrapped_label_get_type(void)
123 static GType type
= 0;
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
),
140 type
= g_type_register_static(GTK_TYPE_WIDGET
, "WrappedLabel",
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
;
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
,
178 GTK_WIDGET_STATE(widget
),
180 NULL
, /* DON'T clip! */
184 widget
->allocation
.y
- wl
->y_off
,
190 static void wrapped_label_style_set(GtkWidget
*widget
,
191 GtkStyle
*previous_style
)
193 WrappedLabel
*wl
= (WrappedLabel
*) widget
;
198 PangoLayout
*old
= wl
->layout
;
200 txt
= pango_layout_get_text(wl
->layout
);
203 wrapped_label_set_text(wl
, txt
);