2 * This file is a part of hildon
4 * Copyright (C) 2008 Nokia Corporation, all rights reserved.
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU Lesser Public License as published by
8 * the Free Software Foundation; version 2 of the license.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU Lesser Public License for more details.
18 * SECTION:hildon-entry
19 * @short_description: Widget representing a text entry in the Hildon framework.
21 * The #HildonEntry is a GTK widget which represents a text entry. It
22 * is derived from the #GtkEntry widget and provides additional
23 * commodities specific to the Hildon framework.
25 * Besides all the features inherited from #GtkEntry, a #HildonEntry
26 * can also have a placeholder text. This text will be shown if the
27 * entry is empty and doesn't have the input focus, but it's otherwise
28 * ignored. Thus, calls to hildon_entry_get_text() will never return
29 * the placeholder text, not even when it's being displayed.
31 * Although #HildonEntry is derived from #GtkEntry,
32 * gtk_entry_get_text() and gtk_entry_set_text() must never be used to
33 * get/set the text in this widget. hildon_entry_get_text() and
34 * hildon_entry_set_text() must be used instead.
37 * <title>Creating a HildonEntry with a placeholder</title>
44 * entry = hildon_entry_new (HILDON_SIZE_AUTO);
45 * hildon_entry_set_placeholder (HILDON_ENTRY (entry), "First name");
53 #include "hildon-entry.h"
54 #include "hildon-helper.h"
56 G_DEFINE_TYPE (HildonEntry, hildon_entry, GTK_TYPE_ENTRY);
62 #define HILDON_ENTRY_GET_PRIVATE(obj) \
63 (G_TYPE_INSTANCE_GET_PRIVATE ((obj), \
64 HILDON_TYPE_ENTRY, HildonEntryPrivate));
66 struct _HildonEntryPrivate
69 gboolean showing_placeholder;
73 set_property (GObject *object,
81 hildon_gtk_widget_set_theme_size (GTK_WIDGET (object), g_value_get_flags (value));
84 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
90 hildon_entry_show_placeholder (HildonEntry *entry)
92 HildonEntryPrivate *priv = HILDON_ENTRY (entry)->priv;
94 priv->showing_placeholder = TRUE;
95 gtk_entry_set_text (GTK_ENTRY (entry), priv->placeholder);
96 hildon_helper_set_logical_color (GTK_WIDGET (entry),
97 GTK_RC_TEXT, GTK_STATE_NORMAL, "ReversedSecondaryTextColor");
101 hildon_entry_hide_placeholder (HildonEntry *entry, const gchar *text)
103 HildonEntryPrivate *priv = HILDON_ENTRY (entry)->priv;
105 priv->showing_placeholder = FALSE;
106 gtk_entry_set_text (GTK_ENTRY (entry), text);
107 hildon_helper_set_logical_color (GTK_WIDGET (entry),
108 GTK_RC_TEXT, GTK_STATE_NORMAL, "ReversedTextColor");
112 * hildon_entry_set_text:
113 * @entry: a #HildonEntry
114 * @text: the new text
116 * Sets the text in @entry to @text, replacing its current contents.
118 * Note that you must never use gtk_entry_set_text() to set the text
124 hildon_entry_set_text (HildonEntry *entry,
127 g_return_if_fail (HILDON_IS_ENTRY (entry) && text != NULL);
129 if (text[0] == '\0' && !GTK_WIDGET_HAS_FOCUS (entry)) {
130 hildon_entry_show_placeholder (entry);
132 hildon_entry_hide_placeholder (entry, text);
137 * hildon_entry_get_text:
138 * @entry: a #HildonEntry
140 * Gets the current text in @entry.
142 * Note that you must never use gtk_entry_get_text() to get the text
143 * from a #HildonEntry.
145 * Also note that placeholder text (set using
146 * hildon_entry_set_placeholder()) is never returned. Only text set by
147 * hildon_entry_set_text() or typed by the user is considered.
149 * Returns: the text in @entry. This text must not be modified or
155 hildon_entry_get_text (HildonEntry *entry)
157 g_return_val_if_fail (HILDON_IS_ENTRY (entry), NULL);
159 if (entry->priv->showing_placeholder) {
163 return gtk_entry_get_text (GTK_ENTRY (entry));
167 * hildon_entry_set_placeholder:
168 * @entry: a #HildonEntry
169 * @text: the new text
171 * Sets the placeholder text in @entry to @text.
176 hildon_entry_set_placeholder (HildonEntry *entry,
179 g_return_if_fail (HILDON_IS_ENTRY (entry) && text != NULL);
181 g_free (entry->priv->placeholder);
182 entry->priv->placeholder = g_strdup (text);
184 /* Show the placeholder if it needs to be updated or if should be shown now. */
185 if (entry->priv->showing_placeholder ||
186 (!GTK_WIDGET_HAS_FOCUS (entry) && gtk_entry_get_text (GTK_ENTRY (entry)) [0] == '\0')) {
187 hildon_entry_show_placeholder (entry);
193 * @size: The size of the entry
195 * Creates a new entry.
197 * Returns: a new #HildonEntry
202 hildon_entry_new (HildonSizeType size)
204 return g_object_new (HILDON_TYPE_ENTRY, "size", size, NULL);
208 hildon_entry_focus_in_event (GtkWidget *widget,
209 GdkEventFocus *event)
211 if (HILDON_ENTRY (widget)->priv->showing_placeholder) {
212 hildon_entry_hide_placeholder (HILDON_ENTRY (widget), "");
215 if (GTK_WIDGET_CLASS (hildon_entry_parent_class)->focus_in_event) {
216 return GTK_WIDGET_CLASS (hildon_entry_parent_class)->focus_in_event (widget, event);
223 hildon_entry_focus_out_event (GtkWidget *widget,
224 GdkEventFocus *event)
226 if (gtk_entry_get_text (GTK_ENTRY (widget)) [0] == '\0') {
227 hildon_entry_show_placeholder (HILDON_ENTRY (widget));
230 if (GTK_WIDGET_CLASS (hildon_entry_parent_class)->focus_out_event) {
231 return GTK_WIDGET_CLASS (hildon_entry_parent_class)->focus_out_event (widget, event);
238 hildon_entry_finalize (GObject *object)
240 HildonEntryPrivate *priv = HILDON_ENTRY (object)->priv;
242 g_free (priv->placeholder);
244 if (G_OBJECT_CLASS (hildon_entry_parent_class)->finalize)
245 G_OBJECT_CLASS (hildon_entry_parent_class)->finalize (object);
249 hildon_entry_class_init (HildonEntryClass *klass)
251 GObjectClass *gobject_class = (GObjectClass *)klass;
252 GtkWidgetClass *widget_class = (GtkWidgetClass *)klass;
254 gobject_class->set_property = set_property;
255 gobject_class->finalize = hildon_entry_finalize;
256 widget_class->focus_in_event = hildon_entry_focus_in_event;
257 widget_class->focus_out_event = hildon_entry_focus_out_event;
259 g_object_class_install_property (
265 "Size request for the entry",
266 HILDON_TYPE_SIZE_TYPE,
267 HILDON_SIZE_AUTO_WIDTH | HILDON_SIZE_FINGER_HEIGHT,
270 g_type_class_add_private (klass, sizeof (HildonEntryPrivate));
274 hildon_entry_init (HildonEntry *self)
276 self->priv = HILDON_ENTRY_GET_PRIVATE (self);
277 self->priv->placeholder = g_strdup ("");
278 self->priv->showing_placeholder = FALSE;