--- gtk+-2.6.4/gtk/gtklabel.c 2005-02-28 06:32:03.000000000 +0200 +++ gtk+-2.6.4/gtk/gtklabel.c 2005-04-06 16:19:36.878931912 +0300 @@ -23,6 +23,11 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ + +/* Modified for Nokia Oyj during 2004. See CHANGES file for list + * of changes. + */ + #include #include #include @@ -52,6 +57,7 @@ guint single_line_mode : 1; guint have_transform : 1; gdouble angle; + gboolean request_full_width; } GtkLabelPrivate; @@ -75,6 +81,9 @@ LAST_SIGNAL }; +/* Hildon mod. + A property PROP_TRANSLATABLE has been added here. If new Gtk+ + versions add items here, the compability will break. */ enum { PROP_0, PROP_LABEL, @@ -89,6 +98,7 @@ PROP_MNEMONIC_WIDGET, PROP_CURSOR_POSITION, PROP_SELECTION_BOUND, + PROP_TRANSLATABLE, PROP_ELLIPSIZE, PROP_WIDTH_CHARS, PROP_SINGLE_LINE_MODE, @@ -96,6 +106,12 @@ PROP_MAX_WIDTH_CHARS }; +/* Hildon mod. A few keys. These are used to store data for label + * without changing the private structures. */ +#define LABEL_KEY_TRANSLATABLE "label_translatable" +#define LABEL_KEY_TRANSLATABLETEXT "label_translatabletext" +#define LABEL_KEY_ORIGINAL_LAYOUT "label_original_layout" + static guint signals[LAST_SIGNAL] = { 0 }; static void gtk_label_class_init (GtkLabelClass *klass); @@ -149,7 +165,7 @@ static void gtk_label_set_uline_text_internal (GtkLabel *label, const gchar *str); static void gtk_label_set_pattern_internal (GtkLabel *label, - const gchar *pattern); + const gchar *pattern); static void set_markup (GtkLabel *label, const gchar *str, gboolean with_uline); @@ -516,6 +532,24 @@ G_MAXINT, -1, G_PARAM_READWRITE)); + /* Hildon mod. Add property for a widget - whether it supports run-time + + locale change. Please note that this functionality is not yet + + completed and may change. */ + g_object_class_install_property (gobject_class, + PROP_TRANSLATABLE, + g_param_spec_boolean ("translatable", + _("Is translatable"), + _("Whether label should be translatable."), + FALSE, + G_PARAM_READWRITE)); + + /* Hildonlike class property */ + gtk_widget_class_install_style_property (widget_class, + g_param_spec_boolean ("hildonlike", + _("hildonlike looks"), + _("Changes wrapping etc behaviour, 1/0"), + FALSE, + G_PARAM_READABLE)); /* * Key bindings */ @@ -650,6 +684,10 @@ case PROP_MAX_WIDTH_CHARS: gtk_label_set_max_width_chars (label, g_value_get_int (value)); break; +/* Hildon add. */ + case PROP_TRANSLATABLE: + gtk_label_set_translatable (label, g_value_get_boolean (value)); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -730,6 +768,10 @@ case PROP_MAX_WIDTH_CHARS: g_value_set_int (value, gtk_label_get_max_width_chars (label)); break; +/* Hildon mod. */ + case PROP_TRANSLATABLE: + g_value_set_boolean (value, gtk_label_get_translatable (label)); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); @@ -748,6 +790,7 @@ priv->width_chars = -1; priv->angle = 0.0; priv->max_width_chars = -1; + priv->request_full_width = FALSE; label->label = NULL; label->jtype = GTK_JUSTIFY_LEFT; @@ -766,6 +809,15 @@ label->mnemonic_window = NULL; gtk_label_set_text (label, ""); + +/* Hildon Addition. */ + + g_object_set_data (G_OBJECT (label), LABEL_KEY_TRANSLATABLE, FALSE); + g_object_set_data (G_OBJECT (label), LABEL_KEY_TRANSLATABLETEXT, NULL); + g_object_set_data (G_OBJECT (label), LABEL_KEY_ORIGINAL_LAYOUT, NULL); + +/* /Hildon Addition. */ + } /** @@ -822,7 +874,7 @@ if (str && *str) gtk_label_set_text_with_mnemonic (label, str); - + return GTK_WIDGET (label); } @@ -1257,7 +1309,7 @@ GError *error = NULL; PangoAttrList *attrs = NULL; gunichar accel_char = 0; - + if (!pango_parse_markup (str, -1, with_uline ? '_' : 0, @@ -1340,12 +1392,14 @@ g_return_if_fail (GTK_IS_LABEL (label)); last_keyval = label->mnemonic_keyval; + gtk_label_set_label_internal (label, g_strdup (str ? str : "")); gtk_label_set_use_markup_internal (label, TRUE); gtk_label_set_use_underline_internal (label, TRUE); - gtk_label_recalculate (label); + gtk_label_setup_mnemonic (label, last_keyval); + } /** @@ -1409,7 +1463,7 @@ static void gtk_label_set_pattern_internal (GtkLabel *label, - const gchar *pattern) + const gchar *pattern) { PangoAttrList *attrs; g_return_if_fail (GTK_IS_LABEL (label)); @@ -1421,7 +1475,16 @@ if (label->effective_attrs) pango_attr_list_unref (label->effective_attrs); +/* Following will disable undercores from + keyboard shortcuts if DISABLE_KEYBOARD_SHORTCUTS + is enabled during compile time + */ +#ifndef DISABLE_KEYBOARD_SHORTCUTS label->effective_attrs = attrs; +#else + pango_attr_list_unref (attrs); +#endif /* DISABLE_KEYBOARD_SHORTCUTS */ + } void @@ -1742,8 +1805,13 @@ { PangoLayout *layout; GtkStyle *style = GTK_WIDGET (label)->style; - + + gboolean hildonlike; LabelWrapWidth *wrap_width = g_object_get_data (G_OBJECT (style), "gtk-label-wrap-width"); + + /* Hildon: get hildonlike property */ + gtk_widget_style_get (GTK_WIDGET (label), "hildonlike", &hildonlike, NULL); + if (!wrap_width) { wrap_width = g_new0 (LabelWrapWidth, 1); @@ -1763,7 +1831,12 @@ "This long string gives a good enough length for any line to have."); pango_layout_get_size (layout, &wrap_width->width, NULL); g_object_unref (layout); - + /* A hildon mod for "fixing line wrapping". Remember to remove this + when GtkLabel will implement width for height size negotiation.*/ + if (hildonlike) + { + wrap_width->width = wrap_width->width * 1.25; + } return wrap_width->width; } @@ -1774,8 +1847,12 @@ PangoRectangle logical_rect; gint rwidth, rheight; gboolean rtl; + gboolean hildonlike; widget = GTK_WIDGET (label); + + /* Hildon: get hildonlike property */ + gtk_widget_style_get (widget, "hildonlike", &hildonlike, NULL); rtl = gtk_widget_get_direction(widget) == GTK_TEXT_DIR_RTL; rwidth = label->misc.xpad * 2; @@ -1864,8 +1941,18 @@ wrap_width = get_label_wrap_width (label); width = MIN (width, wrap_width); - width = MIN (width, + + if (!hildonlike) + { + width = MIN (width, PANGO_SCALE * (gdk_screen_get_width (screen) + 1) / 2); + } + else + { + width = MIN (width, + PANGO_SCALE * (gdk_screen_get_width (screen) + 1)); + } + pango_layout_set_width (label->layout, width); pango_layout_get_extents (label->layout, NULL, &logical_rect); @@ -1910,6 +1997,7 @@ else /* !label->wrap */ pango_layout_set_width (label->layout, -1); } + } /* Gets the bounds of a layout in device coordinates. Note cut-and-paste @@ -2017,7 +2105,8 @@ priv->width_chars > 0 || priv->max_width_chars > 0) && aux_info && aux_info->width > 0) width += aux_info->width; - else if (label->ellipsize || priv->width_chars > 0 || priv->max_width_chars > 0) + else if ((label->ellipsize || priv->width_chars > 0 || priv->max_width_chars > 0) && + !priv->request_full_width) { PangoContext *context; PangoFontMetrics *metrics; @@ -2081,11 +2170,24 @@ GtkAllocation *allocation) { GtkLabel *label; + GtkRequisition req; + GtkLabelPrivate *priv; label = GTK_LABEL (widget); + priv = GTK_LABEL_GET_PRIVATE (label); (* GTK_WIDGET_CLASS (parent_class)->size_allocate) (widget, allocation); + gtk_widget_get_child_requisition (widget, &req); + + if (allocation->width < req.width && !label->wrap) + { + gtk_label_set_ellipsize (label, PANGO_ELLIPSIZE_END); + priv->request_full_width = TRUE; + } + else + priv->request_full_width = FALSE; + if (label->ellipsize) { if (label->layout) @@ -2479,7 +2581,7 @@ } *dest = 0; *pattern_dest = 0; - + gtk_label_set_text_internal (label, new_str); gtk_label_set_pattern_internal (label, pattern); @@ -2541,13 +2643,11 @@ last_keyval = label->mnemonic_keyval; g_object_freeze_notify (G_OBJECT (label)); - gtk_label_set_label_internal (label, g_strdup (str ? str : "")); gtk_label_set_use_markup_internal (label, FALSE); gtk_label_set_use_underline_internal (label, TRUE); - - gtk_label_recalculate (label); + gtk_label_recalculate (label); gtk_label_setup_mnemonic (label, last_keyval); g_object_thaw_notify (G_OBJECT (label)); @@ -3948,3 +4048,67 @@ popup_position_func, label, 0, gtk_get_current_event_time ()); } + +/* Hildon mod. + * Functions for run-time locale changing. Beware though that this + functionality is not yet completed. Therefore it's suggested + that these functions shouldn't be used yet outside testing. */ + +void gtk_label_set_translatable (GtkLabel *label, gboolean newstatus) +{ + if (newstatus == gtk_label_get_translatable (label)) return; + + if (newstatus == TRUE) + { + if (g_object_get_data (G_OBJECT (label), LABEL_KEY_TRANSLATABLETEXT) != NULL) + g_free (g_object_get_data (G_OBJECT (label), LABEL_KEY_TRANSLATABLETEXT)); + g_object_set_data (G_OBJECT (label), LABEL_KEY_TRANSLATABLETEXT, g_strdup (label->label)); + g_object_set_data (G_OBJECT (label), LABEL_KEY_TRANSLATABLE, (void*) TRUE); + if (label->text != NULL) + g_free (label->text); + if (label->label != NULL) + g_free (label->label); + label->text = g_strdup(_(g_object_get_data (G_OBJECT (label), LABEL_KEY_TRANSLATABLETEXT))); + label->label = g_strdup(_(g_object_get_data (G_OBJECT (label), LABEL_KEY_TRANSLATABLETEXT))); + } + else + { + if (label->text != NULL) + g_free (label->text); + if (label->label != NULL) + g_free (label->label); + label->text = g_strdup (g_object_get_data (G_OBJECT (label), LABEL_KEY_TRANSLATABLETEXT)); + label->label = g_strdup (g_object_get_data (G_OBJECT (label), LABEL_KEY_TRANSLATABLETEXT)); + g_object_set_data (G_OBJECT (label), LABEL_KEY_TRANSLATABLE, FALSE); + if (g_object_get_data (G_OBJECT (label), LABEL_KEY_TRANSLATABLETEXT) != NULL) + g_free (g_object_get_data (G_OBJECT (label), LABEL_KEY_TRANSLATABLETEXT)); + g_object_set_data (G_OBJECT (label), LABEL_KEY_TRANSLATABLETEXT, NULL); + } + gtk_label_recalculate (label); +} + +gboolean gtk_label_get_translatable (GtkLabel *label) +{ + return (gboolean) (g_object_get_data (G_OBJECT (label), LABEL_KEY_TRANSLATABLE)); +} + + +void gtk_label_retranslate (GtkLabel *label) +{ + g_object_freeze_notify (G_OBJECT (label)); + if (gtk_label_get_translatable (label) == TRUE) + { + if (label->label != NULL) + g_free (label->label); + label->label = g_strdup(gettext(g_object_get_data (G_OBJECT (label), LABEL_KEY_TRANSLATABLETEXT))); + } + 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)); + g_object_set_data (G_OBJECT (label), LABEL_KEY_ORIGINAL_LAYOUT, NULL); + g_object_notify (G_OBJECT (label), "label"); + gtk_label_recalculate (label); + g_object_thaw_notify (G_OBJECT (label)); + gtk_label_set_text (label, label->label); +} + +/* End of hildon mods for run-time locale change. */ +