2 * This file is a part of hildon
4 * Copyright (C) 2005, 2006, 2009 Nokia Corporation, all rights reserved.
6 * Contact: Rodrigo Novo <rodrigo.novo@nokia.com>
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public License
10 * as published by the Free Software Foundation; version 2.1 of
11 * the License, or (at your option) any later version.
13 * This library is distributed in the hope that it will be useful, but
14 * WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with this library; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
26 * SECTION:hildon-get-password-dialog
27 * @short_description: A widget used to get a password.
28 * @see_also: #HildonSetPasswordDialog
30 * HildonGetPasswordDialog prompts the user for a password. It allows
31 * inputting password, with an optional configurable label eg. for
32 * showing a custom message. The maximum length of the password can be set.
35 * <title>HildonGetPassword example</title>
37 * get_dialog = HILDON_GET_PASSWORD_DIALOG (hildon_get_password_dialog_new (parent, FALSE));
39 * gtk_widget_show (GTK_WIDGET (get_dialog));
41 * i = gtk_dialog_run (GTK_DIALOG (get_dialog));
43 * pass = hildon_get_password_dialog_get_password (get_dialog);
45 * if (i == GTK_RESPONSE_OK && (strcmp (pass, dialog.current_password) != 0))
47 * gtk_infoprint (GTK_WINDOW (parent), STR_PASSWORD_INCORRECT);
48 * gtk_widget_set_sensitive (GTK_WIDGET (dialog.button2), FALSE);
49 * gtk_widget_set_sensitive (GTK_WIDGET (dialog.button3), FALSE);
50 * gtk_widget_set_sensitive (GTK_WIDGET (dialog.button4), FALSE);
53 * else if (i == GTK_RESPONSE_OK)
55 * gtk_widget_set_sensitive( GTK_WIDGET( dialog.button2 ), TRUE);
60 * gtk_widget_set_sensitive (GTK_WIDGET (dialog.button2), FALSE);
61 * gtk_widget_set_sensitive (GTK_WIDGET (dialog.button3), FALSE);
62 * gtk_widget_set_sensitive (GTK_WIDGET (dialog.button4), FALSE);
64 * gtk_widget_destroy (GTK_WIDGET (get_dialog));
70 #undef HILDON_DISABLE_DEPRECATED
83 #include "hildon-get-password-dialog.h"
84 #include "hildon-caption.h"
85 #include "hildon-banner.h"
86 #include "hildon-get-password-dialog-private.h"
87 #include "hildon-entry.h"
89 #define _(String) dgettext("hildon-libs", String)
91 #define HILDON_GET_PASSWORD_DIALOG_TITLE "ecdg_ti_get_old_password"
93 #define HILDON_GET_PASSWORD_DIALOG_PASSWORD "ecdg_fi_get_old_pwd_enter_pwd"
95 #define HILDON_GET_PASSWORD_DIALOG_OK "wdgt_bd_done"
97 #define HILDON_GET_PASSWORD_DIALOG_CANCEL "ecdg_bd_get_old_password_dialog_cancel"
99 #define HILDON_GET_PASSWORD_VERIFY_DIALOG_TITLE "ecdg_ti_verify_password"
101 #define HILDON_GET_PASSWORD_VERIFY_DIALOG_PASSWORD "ecdg_fi_verify_pwd_enter_pwd"
103 #define HILDON_GET_PASSWORD_VERIFY_DIALOG_OK "wdgt_bd_done"
105 #define HILDON_GET_PASSWORD_VERIFY_DIALOG_CANCEL "ecdg_bd_verify_password_dialog_cancel"
107 #define HILDON_GET_PASSWORD_DIALOG_MAX_CHARS "ckdg_ib_maximum_characters_reached"
109 static GtkDialogClass* parent_class;
112 hildon_get_password_dialog_class_init (HildonGetPasswordDialogClass *class);
115 hildon_get_password_dialog_init (HildonGetPasswordDialog *widget);
118 hildon_get_password_set_property (GObject *object,
124 hildon_get_password_get_property (GObject *object,
130 create_contents (HildonGetPasswordDialog *dialog);
134 invalid_input (GtkWidget *widget,
135 GtkInvalidInputType reason,
150 /* Private functions */
152 hildon_get_password_set_property (GObject *object,
157 HildonGetPasswordDialog *dialog = HILDON_GET_PASSWORD_DIALOG (object);
158 HildonGetPasswordDialogPrivate *priv;
160 priv = HILDON_GET_PASSWORD_DIALOG_GET_PRIVATE (object);
166 /* Set label text representing password domain */
167 gtk_label_set_text (priv->message_label, g_value_get_string (value));
171 gtk_entry_set_text (GTK_ENTRY (gtk_bin_get_child (GTK_BIN (priv->password_entry))),
172 g_value_get_string(value));
175 case PROP_NUMBERS_ONLY:
177 /* Set input mode for the password entry */
178 g_object_set(G_OBJECT (gtk_bin_get_child GTK_BIN ((priv->password_entry))),
180 (g_value_get_boolean (value)
181 ? HILDON_GTK_INPUT_MODE_NUMERIC
182 : HILDON_GTK_INPUT_MODE_FULL),
187 case PROP_CAPTION_LABEL:
188 hildon_get_password_dialog_set_caption (dialog, g_value_get_string (value));
192 hildon_get_password_dialog_set_max_characters (dialog, g_value_get_int (value));
196 priv->get_old = g_value_get_boolean (value);
197 create_contents (dialog);
201 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
207 hildon_get_password_get_property (GObject *object,
212 HildonGetPasswordDialog *dialog = HILDON_GET_PASSWORD_DIALOG (object);
213 HildonGetPasswordDialogPrivate *priv;
220 priv = HILDON_GET_PASSWORD_DIALOG_GET_PRIVATE (dialog);
226 string = gtk_label_get_text (priv->message_label);
227 g_value_set_string (value, string);
231 string = gtk_entry_get_text (GTK_ENTRY (gtk_bin_get_child (GTK_BIN (priv->password_entry))));
232 g_value_set_string (value, string);
235 case PROP_NUMBERS_ONLY:
237 /* This property is set if and only if the input mode
238 of the password entry has been set to numeric only */
239 g_object_get (G_OBJECT (gtk_bin_get_child (GTK_BIN (priv->password_entry))),
240 "hildon-input-mode", &input_mode, NULL);
241 g_value_set_boolean (value,
242 (input_mode == HILDON_GTK_INPUT_MODE_NUMERIC));
244 g_value_set_boolean (value, FALSE);
248 case PROP_CAPTION_LABEL:
249 string = hildon_caption_get_label (priv->password_entry);
250 g_value_set_string (value, string);
254 max_length = gtk_entry_get_max_length
255 (GTK_ENTRY (gtk_bin_get_child (GTK_BIN (priv->password_entry))));
256 g_value_set_int (value, max_length);
260 g_value_set_boolean (value, priv->get_old);
264 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
270 hildon_get_password_dialog_class_init (HildonGetPasswordDialogClass *class)
272 GObjectClass *object_class = G_OBJECT_CLASS (class);
274 parent_class = g_type_class_peek_parent (class);
276 /* Override virtual functions */
277 object_class->set_property = hildon_get_password_set_property;
278 object_class->get_property = hildon_get_password_get_property;
280 /* Install new properties */
283 * HildonGetPasswordDialog:message:
285 * Optional message displayed to the user.
287 g_object_class_install_property
290 g_param_spec_string ("message",
292 "Set optional message",
297 * HildonGetPasswordDialog:password:
299 * Password field contents.
301 g_object_class_install_property
304 g_param_spec_string ("password",
311 * HildonGetPasswordDialog:numbers-only:
313 * If the password entry field is operating in numbers-only mode.
315 g_object_class_install_property
318 g_param_spec_boolean ("numbers-only",
320 "Set entry to accept only numeric values",
325 * HildonGetPasswordDialog:caption-label:
329 g_object_class_install_property
332 g_param_spec_string ("caption-label",
334 "The text to be set as the caption label",
339 * HildonGetPasswordDialog:max-characters:
341 * Maximum characters than can be entered.
343 g_object_class_install_property
346 g_param_spec_int ("max-characters",
347 "Maximum Characters",
348 "The maximum number of characters the password"
356 * HildonGetPasswordDialog:get-old:
358 * If the dialog is used to retrieve an old password or set a new one.
360 g_object_class_install_property
363 g_param_spec_boolean ("get-old",
365 "TRUE if dialog is a get old password dialog, "
366 "FALSE if dialog is a get password dialog",
368 G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
370 /* Install private structure */
371 g_type_class_add_private (class, sizeof (HildonGetPasswordDialogPrivate));
375 hildon_get_password_dialog_init (HildonGetPasswordDialog *dialog)
377 /* Set initial properties for the dialog; the actual contents are
378 created once the 'get-old' property is set with g_object_new */
380 gtk_dialog_set_has_separator (GTK_DIALOG (dialog), FALSE);
381 gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
382 gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK);
386 create_contents (HildonGetPasswordDialog *dialog)
388 HildonGetPasswordDialogPrivate *priv;
389 GtkSizeGroup * group;
391 AtkObject *atk_aux = NULL;
393 /* Cache private pointer for faster member access */
394 priv = HILDON_GET_PASSWORD_DIALOG_GET_PRIVATE (dialog);
397 /* Sizegroup for captions */
398 group = GTK_SIZE_GROUP (gtk_size_group_new
399 (GTK_SIZE_GROUP_HORIZONTAL));
402 gtk_window_set_title (GTK_WINDOW (dialog),
404 ? _(HILDON_GET_PASSWORD_DIALOG_TITLE)
405 : _(HILDON_GET_PASSWORD_VERIFY_DIALOG_TITLE));
407 /* Optional password domain label */
408 priv->message_label = GTK_LABEL (gtk_label_new (NULL));
411 gtk_dialog_add_button (GTK_DIALOG (dialog),
413 ? _(HILDON_GET_PASSWORD_DIALOG_OK)
414 : _(HILDON_GET_PASSWORD_VERIFY_DIALOG_OK)),
417 gtk_dialog_add_button (GTK_DIALOG (dialog),
419 ? _(HILDON_GET_PASSWORD_DIALOG_CANCEL)
420 : _(HILDON_GET_PASSWORD_VERIFY_DIALOG_CANCEL)),
421 GTK_RESPONSE_CANCEL);
423 /* Create password text entry */
424 control = hildon_entry_new (HILDON_SIZE_FINGER_HEIGHT | HILDON_SIZE_AUTO_WIDTH);
425 if ((atk_aux = gtk_widget_get_accessible(control)))
427 atk_object_set_name(atk_aux, "Passwd");
430 gtk_entry_set_width_chars (GTK_ENTRY (control), 20);
433 g_object_set (control, "hildon-input-mode", HILDON_GTK_INPUT_MODE_FULL, NULL);
436 gtk_entry_set_visibility (GTK_ENTRY(control), FALSE);
437 priv->password_entry = HILDON_CAPTION
438 (hildon_caption_new(group,
440 ? _(HILDON_GET_PASSWORD_DIALOG_PASSWORD)
441 : _(HILDON_GET_PASSWORD_VERIFY_DIALOG_PASSWORD)),
443 HILDON_CAPTION_OPTIONAL));
444 hildon_caption_set_separator (HILDON_CAPTION (priv->password_entry), "");
446 /* Do the basic layout */
447 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox),
448 GTK_WIDGET (priv->message_label), FALSE, FALSE, 0);
449 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox),
450 GTK_WIDGET (priv->password_entry), FALSE, FALSE, 0);
451 gtk_widget_show_all (GTK_DIALOG (dialog)->vbox);
453 /* Ensure group is freed when all its contents have been removed */
454 g_object_unref (group);
458 * hildon_get_password_dialog_get_type:
460 * Returns GType for HildonGetPasswordDialog as produced by
461 * g_type_register_static().
463 * Returns: HildonGetPasswordDialog type
466 hildon_get_password_dialog_get_type (void)
468 static GType dialog_type = 0;
471 static const GTypeInfo dialog_info = {
472 sizeof (HildonGetPasswordDialogClass),
473 NULL, /* base_init */
474 NULL, /* base_finalize */
475 (GClassInitFunc) hildon_get_password_dialog_class_init,
476 NULL, /* class_finalize */
477 NULL, /* class_data */
478 sizeof (HildonGetPasswordDialog),
480 (GInstanceInitFunc) hildon_get_password_dialog_init
483 dialog_type = g_type_register_static (GTK_TYPE_DIALOG,
484 "HildonGetPasswordDialog",
491 * hildon_get_password_dialog_new:
492 * @parent: parent window; can be NULL
493 * @get_old: FALSE creates a new get password dialog and
494 * TRUE creates a new get old password dialog. That is,
495 * if the password to be obtained is the old password,
496 * this parameter is specified TRUE.
498 * Construct a new HildonGetPasswordDialog.
500 * Returns: a new #GtkWidget of type HildonGetPasswordDialog
503 hildon_get_password_dialog_new (GtkWindow *parent,
506 HildonGetPasswordDialog *dialog = g_object_new
507 (HILDON_TYPE_GET_PASSWORD_DIALOG,
508 "get-old", get_old, NULL);
510 if (parent != NULL) {
511 gtk_window_set_transient_for (GTK_WINDOW (dialog), parent);
514 return (GtkWidget *) dialog;
518 * hildon_get_password_dialog_new_with_default:
519 * @parent: parent window; can be NULL
520 * @password: a default password to be shown in password field
521 * @get_old: FALSE creates a new get password dialog and
522 * TRUE creates a new get old password dialog. That is,
523 * if the password to be obtained is the old password,
524 * this parameter is specified TRUE.
527 * Same as #hildon_get_password_dialog_new but with a default password
530 * Returns: a new #GtkWidget of type HildonGetPasswordDialog
533 hildon_get_password_dialog_new_with_default (GtkWindow *parent,
534 const gchar *password,
539 dialog = hildon_get_password_dialog_new (parent, get_old);
541 if (password != NULL)
542 g_object_set (G_OBJECT (dialog), "password", password, NULL);
544 return GTK_WIDGET (dialog);
548 * hildon_get_password_dialog_get_password:
549 * @dialog: pointer to HildonSetPasswordDialog
551 * Gets the currently entered password. The string should not be freed.
553 * Returns: current password entered by the user.
556 hildon_get_password_dialog_get_password (HildonGetPasswordDialog *dialog)
561 HildonGetPasswordDialogPrivate *priv;
563 g_return_val_if_fail (HILDON_IS_GET_PASSWORD_DIALOG (dialog), NULL);
564 priv = HILDON_GET_PASSWORD_DIALOG_GET_PRIVATE (dialog);
567 /* Retrieve the password entry widget */
568 entry1 = GTK_ENTRY (gtk_bin_get_child (GTK_BIN (priv->password_entry)));
569 text1 = GTK_ENTRY (entry1)->text;
575 * hildon_get_password_dialog_set_message
576 * @dialog: the dialog
577 * @message: a custom message or some other descriptive text to be set
579 * Sets the optional descriptive text displayed at the top of the dialog.
582 hildon_get_password_dialog_set_message (HildonGetPasswordDialog *dialog,
583 const gchar *message)
585 HildonGetPasswordDialogPrivate *priv;
587 g_return_if_fail (HILDON_IS_GET_PASSWORD_DIALOG (dialog));
589 priv = HILDON_GET_PASSWORD_DIALOG_GET_PRIVATE (dialog);
592 gtk_label_set_text (priv->message_label, message);
597 * hildon_get_password_dialog_set_caption:
598 * @dialog: the dialog
599 * @new_caption: the text to be set as the caption label
601 * Sets the password entry field's neigbouring label.
604 hildon_get_password_dialog_set_caption (HildonGetPasswordDialog *dialog,
605 const gchar *new_caption)
607 HildonGetPasswordDialogPrivate *priv;
609 g_return_if_fail (HILDON_IS_GET_PASSWORD_DIALOG (dialog));
610 g_return_if_fail (new_caption != NULL);
612 priv = HILDON_GET_PASSWORD_DIALOG_GET_PRIVATE (dialog);
615 hildon_caption_set_label (priv->password_entry, new_caption);
619 * hildon_get_password_dialog_set_max_characters:
620 * @dialog: the dialog
621 * @max_characters: the maximum number of characters the password dialog
624 * sets the maximum number of characters allowed as the password
627 hildon_get_password_dialog_set_max_characters (HildonGetPasswordDialog *dialog,
630 HildonGetPasswordDialogPrivate *priv;
632 g_return_if_fail (max_characters > 0);
633 g_return_if_fail (HILDON_IS_GET_PASSWORD_DIALOG (dialog));
635 priv = HILDON_GET_PASSWORD_DIALOG_GET_PRIVATE (dialog);
638 /* Apply the given length to password entry */
639 gtk_entry_set_max_length (GTK_ENTRY
641 GTK_BIN ((priv->password_entry))),
644 /* FIXME There is a bug here -- the prev. signal needs to be
645 * disconnected before connecting the new signal. Besides, this
646 * should go into the constructor */
649 /* Connect callback to show error banner if the limit is exceeded */
650 g_signal_connect (GTK_ENTRY
652 GTK_BIN ((priv->password_entry))),
654 G_CALLBACK (invalid_input),
661 /* Callback that gets called when maximum chars is reached in the entry */
663 invalid_input (GtkWidget *widget,
664 GtkInvalidInputType reason,
667 if (reason == GTK_INVALID_INPUT_MAX_CHARS_REACHED)
669 hildon_banner_show_information (widget, NULL, _(HILDON_GET_PASSWORD_DIALOG_MAX_CHARS));