1 --- gtk+-2.6.4/gtk/gtklabel.c 2005-02-28 06:32:03.000000000 +0200
2 +++ gtk+-2.6.4/gtk/gtklabel.c 2005-04-06 16:19:36.878931912 +0300
4 * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
8 +/* Modified for Nokia Oyj during 2004. See CHANGES file for list
16 guint single_line_mode : 1;
17 guint have_transform : 1;
19 + gboolean request_full_width;
28 + A property PROP_TRANSLATABLE has been added here. If new Gtk+
29 + versions add items here, the compability will break. */
40 PROP_SINGLE_LINE_MODE,
45 +/* Hildon mod. A few keys. These are used to store data for label
46 + * without changing the private structures. */
47 +#define LABEL_KEY_TRANSLATABLE "label_translatable"
48 +#define LABEL_KEY_TRANSLATABLETEXT "label_translatabletext"
49 +#define LABEL_KEY_ORIGINAL_LAYOUT "label_original_layout"
51 static guint signals[LAST_SIGNAL] = { 0 };
53 static void gtk_label_class_init (GtkLabelClass *klass);
55 static void gtk_label_set_uline_text_internal (GtkLabel *label,
57 static void gtk_label_set_pattern_internal (GtkLabel *label,
58 - const gchar *pattern);
59 + const gchar *pattern);
60 static void set_markup (GtkLabel *label,
67 + /* Hildon mod. Add property for a widget - whether it supports run-time
68 + + locale change. Please note that this functionality is not yet
69 + + completed and may change. */
70 + g_object_class_install_property (gobject_class,
72 + g_param_spec_boolean ("translatable",
73 + _("Is translatable"),
74 + _("Whether label should be translatable."),
76 + G_PARAM_READWRITE));
78 + /* Hildonlike class property */
79 + gtk_widget_class_install_style_property (widget_class,
80 + g_param_spec_boolean ("hildonlike",
81 + _("hildonlike looks"),
82 + _("Changes wrapping etc behaviour, 1/0"),
89 case PROP_MAX_WIDTH_CHARS:
90 gtk_label_set_max_width_chars (label, g_value_get_int (value));
93 + case PROP_TRANSLATABLE:
94 + gtk_label_set_translatable (label, g_value_get_boolean (value));
97 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
100 case PROP_MAX_WIDTH_CHARS:
101 g_value_set_int (value, gtk_label_get_max_width_chars (label));
104 + case PROP_TRANSLATABLE:
105 + g_value_set_boolean (value, gtk_label_get_translatable (label));
109 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
111 priv->width_chars = -1;
113 priv->max_width_chars = -1;
114 + priv->request_full_width = FALSE;
117 label->jtype = GTK_JUSTIFY_LEFT;
119 label->mnemonic_window = NULL;
121 gtk_label_set_text (label, "");
123 +/* Hildon Addition. */
125 + g_object_set_data (G_OBJECT (label), LABEL_KEY_TRANSLATABLE, FALSE);
126 + g_object_set_data (G_OBJECT (label), LABEL_KEY_TRANSLATABLETEXT, NULL);
127 + g_object_set_data (G_OBJECT (label), LABEL_KEY_ORIGINAL_LAYOUT, NULL);
129 +/* /Hildon Addition. */
137 gtk_label_set_text_with_mnemonic (label, str);
140 return GTK_WIDGET (label);
143 @@ -1257,7 +1309,7 @@
144 GError *error = NULL;
145 PangoAttrList *attrs = NULL;
146 gunichar accel_char = 0;
149 if (!pango_parse_markup (str,
151 with_uline ? '_' : 0,
152 @@ -1340,12 +1392,14 @@
153 g_return_if_fail (GTK_IS_LABEL (label));
155 last_keyval = label->mnemonic_keyval;
157 gtk_label_set_label_internal (label, g_strdup (str ? str : ""));
158 gtk_label_set_use_markup_internal (label, TRUE);
159 gtk_label_set_use_underline_internal (label, TRUE);
161 gtk_label_recalculate (label);
163 gtk_label_setup_mnemonic (label, last_keyval);
168 @@ -1409,7 +1463,7 @@
171 gtk_label_set_pattern_internal (GtkLabel *label,
172 - const gchar *pattern)
173 + const gchar *pattern)
175 PangoAttrList *attrs;
176 g_return_if_fail (GTK_IS_LABEL (label));
177 @@ -1421,7 +1475,16 @@
179 if (label->effective_attrs)
180 pango_attr_list_unref (label->effective_attrs);
181 +/* Following will disable undercores from
182 + keyboard shortcuts if DISABLE_KEYBOARD_SHORTCUTS
183 + is enabled during compile time
185 +#ifndef DISABLE_KEYBOARD_SHORTCUTS
186 label->effective_attrs = attrs;
188 + pango_attr_list_unref (attrs);
189 +#endif /* DISABLE_KEYBOARD_SHORTCUTS */
194 @@ -1742,8 +1805,13 @@
197 GtkStyle *style = GTK_WIDGET (label)->style;
200 + gboolean hildonlike;
201 LabelWrapWidth *wrap_width = g_object_get_data (G_OBJECT (style), "gtk-label-wrap-width");
203 + /* Hildon: get hildonlike property */
204 + gtk_widget_style_get (GTK_WIDGET (label), "hildonlike", &hildonlike, NULL);
208 wrap_width = g_new0 (LabelWrapWidth, 1);
209 @@ -1763,7 +1831,12 @@
210 "This long string gives a good enough length for any line to have.");
211 pango_layout_get_size (layout, &wrap_width->width, NULL);
212 g_object_unref (layout);
214 + /* A hildon mod for "fixing line wrapping". Remember to remove this
215 + when GtkLabel will implement width for height size negotiation.*/
218 + wrap_width->width = wrap_width->width * 1.25;
220 return wrap_width->width;
223 @@ -1774,8 +1847,12 @@
224 PangoRectangle logical_rect;
225 gint rwidth, rheight;
227 + gboolean hildonlike;
229 widget = GTK_WIDGET (label);
231 + /* Hildon: get hildonlike property */
232 + gtk_widget_style_get (widget, "hildonlike", &hildonlike, NULL);
234 rtl = gtk_widget_get_direction(widget) == GTK_TEXT_DIR_RTL;
235 rwidth = label->misc.xpad * 2;
236 @@ -1864,8 +1941,18 @@
238 wrap_width = get_label_wrap_width (label);
239 width = MIN (width, wrap_width);
240 - width = MIN (width,
244 + width = MIN (width,
245 PANGO_SCALE * (gdk_screen_get_width (screen) + 1) / 2);
249 + width = MIN (width,
250 + PANGO_SCALE * (gdk_screen_get_width (screen) + 1));
254 pango_layout_set_width (label->layout, width);
255 pango_layout_get_extents (label->layout, NULL, &logical_rect);
256 @@ -1910,6 +1997,7 @@
257 else /* !label->wrap */
258 pango_layout_set_width (label->layout, -1);
263 /* Gets the bounds of a layout in device coordinates. Note cut-and-paste
264 @@ -2017,7 +2105,8 @@
265 priv->width_chars > 0 || priv->max_width_chars > 0) &&
266 aux_info && aux_info->width > 0)
267 width += aux_info->width;
268 - else if (label->ellipsize || priv->width_chars > 0 || priv->max_width_chars > 0)
269 + else if ((label->ellipsize || priv->width_chars > 0 || priv->max_width_chars > 0) &&
270 + !priv->request_full_width)
272 PangoContext *context;
273 PangoFontMetrics *metrics;
274 @@ -2081,11 +2170,24 @@
275 GtkAllocation *allocation)
278 + GtkRequisition req;
279 + GtkLabelPrivate *priv;
281 label = GTK_LABEL (widget);
282 + priv = GTK_LABEL_GET_PRIVATE (label);
284 (* GTK_WIDGET_CLASS (parent_class)->size_allocate) (widget, allocation);
286 + gtk_widget_get_child_requisition (widget, &req);
288 + if (allocation->width < req.width && !label->wrap)
290 + gtk_label_set_ellipsize (label, PANGO_ELLIPSIZE_END);
291 + priv->request_full_width = TRUE;
294 + priv->request_full_width = FALSE;
296 if (label->ellipsize)
299 @@ -2479,7 +2581,7 @@
305 gtk_label_set_text_internal (label, new_str);
306 gtk_label_set_pattern_internal (label, pattern);
308 @@ -2541,13 +2643,11 @@
309 last_keyval = label->mnemonic_keyval;
311 g_object_freeze_notify (G_OBJECT (label));
313 gtk_label_set_label_internal (label, g_strdup (str ? str : ""));
314 gtk_label_set_use_markup_internal (label, FALSE);
315 gtk_label_set_use_underline_internal (label, TRUE);
317 - gtk_label_recalculate (label);
319 + gtk_label_recalculate (label);
320 gtk_label_setup_mnemonic (label, last_keyval);
322 g_object_thaw_notify (G_OBJECT (label));
323 @@ -3948,3 +4048,67 @@
324 popup_position_func, label,
325 0, gtk_get_current_event_time ());
329 + * Functions for run-time locale changing. Beware though that this
330 + functionality is not yet completed. Therefore it's suggested
331 + that these functions shouldn't be used yet outside testing. */
333 +void gtk_label_set_translatable (GtkLabel *label, gboolean newstatus)
335 + if (newstatus == gtk_label_get_translatable (label)) return;
337 + if (newstatus == TRUE)
339 + if (g_object_get_data (G_OBJECT (label), LABEL_KEY_TRANSLATABLETEXT) != NULL)
340 + g_free (g_object_get_data (G_OBJECT (label), LABEL_KEY_TRANSLATABLETEXT));
341 + g_object_set_data (G_OBJECT (label), LABEL_KEY_TRANSLATABLETEXT, g_strdup (label->label));
342 + g_object_set_data (G_OBJECT (label), LABEL_KEY_TRANSLATABLE, (void*) TRUE);
343 + if (label->text != NULL)
344 + g_free (label->text);
345 + if (label->label != NULL)
346 + g_free (label->label);
347 + label->text = g_strdup(_(g_object_get_data (G_OBJECT (label), LABEL_KEY_TRANSLATABLETEXT)));
348 + label->label = g_strdup(_(g_object_get_data (G_OBJECT (label), LABEL_KEY_TRANSLATABLETEXT)));
352 + if (label->text != NULL)
353 + g_free (label->text);
354 + if (label->label != NULL)
355 + g_free (label->label);
356 + label->text = g_strdup (g_object_get_data (G_OBJECT (label), LABEL_KEY_TRANSLATABLETEXT));
357 + label->label = g_strdup (g_object_get_data (G_OBJECT (label), LABEL_KEY_TRANSLATABLETEXT));
358 + g_object_set_data (G_OBJECT (label), LABEL_KEY_TRANSLATABLE, FALSE);
359 + if (g_object_get_data (G_OBJECT (label), LABEL_KEY_TRANSLATABLETEXT) != NULL)
360 + g_free (g_object_get_data (G_OBJECT (label), LABEL_KEY_TRANSLATABLETEXT));
361 + g_object_set_data (G_OBJECT (label), LABEL_KEY_TRANSLATABLETEXT, NULL);
363 + gtk_label_recalculate (label);
366 +gboolean gtk_label_get_translatable (GtkLabel *label)
368 + return (gboolean) (g_object_get_data (G_OBJECT (label), LABEL_KEY_TRANSLATABLE));
372 +void gtk_label_retranslate (GtkLabel *label)
374 + g_object_freeze_notify (G_OBJECT (label));
375 + if (gtk_label_get_translatable (label) == TRUE)
377 + if (label->label != NULL)
378 + g_free (label->label);
379 + label->label = g_strdup(gettext(g_object_get_data (G_OBJECT (label), LABEL_KEY_TRANSLATABLETEXT)));
381 + if (g_object_get_data (G_OBJECT (label), LABEL_KEY_ORIGINAL_LAYOUT)) g_object_unref (g_object_get_data (G_OBJECT (label), LABEL_KEY_ORIGINAL_LAYOUT));
382 + g_object_set_data (G_OBJECT (label), LABEL_KEY_ORIGINAL_LAYOUT, NULL);
383 + g_object_notify (G_OBJECT (label), "label");
384 + gtk_label_recalculate (label);
385 + g_object_thaw_notify (G_OBJECT (label));
386 + gtk_label_set_text (label, label->label);
389 +/* End of hildon mods for run-time locale change. */