2 * This file is part of hildon-libs
4 * Copyright (C) 2005 Nokia Corporation.
6 * Contact: Luc Pionchon <luc.pionchon@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; either 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
27 #include <gdk/gdkkeysyms.h>
30 #include <sys/types.h>
41 #include "hildon-add-home-dialog.h"
42 #include <hildon-widgets/hildon-caption.h>
44 #define _(String) dgettext(PACKAGE, String)
45 #define MAX_ERR_MSG 256
46 #define HILDON_ADD_HOME_DIALOG_WIDTH 370
47 #define HILDON_ADD_HOME_DIALOG_HEIGHT 100
48 #define HILDON_MAX_TITLE_LENGTH 256
49 #define HILDON_HOME_MAX_SHORTCUT_LEN 255
51 #define HILDON_ADD_HOME_DIALOG_GET_PRIVATE(obj) \
52 (G_TYPE_INSTANCE_GET_PRIVATE ((obj), \
53 HILDON_TYPE_ADD_HOME_DIALOG, \
54 HildonAddHomeDialogPrivate));
56 typedef struct _HildonAddHomeDialogPrivate HildonAddHomeDialogPrivate;
58 static GtkDialogClass *parent_class;
60 static const gchar *hildon_add_home_dialog_get_old_name(HildonAddHomeDialog * dialog);
61 static void hildon_add_home_dialog_set_old_name(HildonAddHomeDialog * dialog, const gchar* name);
62 static void hildon_add_home_dialog_set_new_name(HildonAddHomeDialog * dialog, const gchar* name);
63 static void hildon_add_home_dialog_create_widgets(HildonAddHomeDialog * dialog, gboolean new_isrename);
66 hildon_add_home_dialog_get_property(GObject * object,
71 hildon_add_home_dialog_set_property(GObject * object,
76 hildon_add_home_dialog_class_init(HildonAddHomeDialogClass * class);
77 static void hildon_add_home_dialog_init(HildonAddHomeDialog * dialog);
81 struct _HildonAddHomeDialogPrivate {
82 GtkWidget *desc_label;
83 GtkWidget *name_entry; /* Used when isrename */
84 GtkWidget *name_label; /* Used when !isrename */
85 GtkWidget *caption_name_entry; /* Used when isrename */
86 GtkWidget *new_name_entry;
87 GtkWidget *caption_new_name_entry;
88 GtkSizeGroup *size_group;
90 GtkWidget *cancelButton;
102 /* Private functions */
105 hildon_add_home_dialog_class_init(HildonAddHomeDialogClass * klass)
107 GObjectClass * gobject_class = G_OBJECT_CLASS(klass);
108 parent_class = g_type_class_peek_parent(klass);
110 gobject_class->set_property = hildon_add_home_dialog_set_property;
111 gobject_class->get_property = hildon_add_home_dialog_get_property;
114 * HildonAddHomeDialog:name
118 g_object_class_install_property(gobject_class,
120 g_param_spec_string ("name",
127 * HildonAddHomeDialog:new_name
131 g_object_class_install_property(gobject_class,
133 g_param_spec_string ("new_name",
139 g_type_class_add_private(klass, sizeof(HildonAddHomeDialogPrivate));
142 static void hildon_add_home_dialog_init(HildonAddHomeDialog * dialog)
144 HildonAddHomeDialogPrivate *priv;
146 gtk_dialog_set_has_separator(GTK_DIALOG(dialog), FALSE);
148 priv = HILDON_ADD_HOME_DIALOG_GET_PRIVATE(dialog);
149 priv->name_entry = NULL;
150 priv->name_label = NULL;
151 priv->caption_name_entry = NULL;
152 priv->new_name_entry = NULL;
153 priv->isrename = FALSE;
155 priv->okButton = gtk_dialog_add_button(GTK_DIALOG(dialog),
156 "addtoHome_button_ok",
158 priv->cancelButton = gtk_dialog_add_button(GTK_DIALOG(dialog),
159 "addtoHome_button_cancel",
160 GTK_RESPONSE_CANCEL);
162 gtk_window_resize(GTK_WINDOW(dialog),
163 HILDON_ADD_HOME_DIALOG_WIDTH,
164 HILDON_ADD_HOME_DIALOG_HEIGHT);
166 gtk_widget_show_all(GTK_DIALOG(dialog)->vbox);
167 gtk_widget_show_all(GTK_DIALOG(dialog)->action_area);
169 priv->size_group = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
172 /* add description text (only shown when isrename==true */
173 priv->desc_label = gtk_label_new(_("ckdg_ib_link_exists"));
174 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox),
175 priv->desc_label, FALSE, FALSE, 0);
177 /* We don't use the hildon_caption_new() C convenience function, because it demands a non-NULL child widget (via gtk_container_add()). */
178 priv->caption_name_entry = GTK_WIDGET( g_object_new( HILDON_TYPE_CAPTION, "size_group", priv->size_group, "label", _("addtoHome_editor_caption"), "status", HILDON_CAPTION_OPTIONAL, NULL) );
179 gtk_widget_show(priv->caption_name_entry);
180 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), priv->caption_name_entry,
184 gtk_widget_show_all(GTK_DIALOG(dialog)->action_area);
187 /* Public functions */
189 GType hildon_add_home_dialog_get_type(void)
191 static GType dialog_type = 0;
194 static const GTypeInfo dialog_info = {
195 sizeof(HildonAddHomeDialogClass),
196 NULL, /* base_init */
197 NULL, /* base_finalize */
198 (GClassInitFunc) hildon_add_home_dialog_class_init,
199 NULL, /* class_finalize */
200 NULL, /* class_data */
201 sizeof(HildonAddHomeDialog),
203 (GInstanceInitFunc) hildon_add_home_dialog_init
206 dialog_type = g_type_register_static(GTK_TYPE_DIALOG,
207 "HildonAddHomeDialog",
214 hildon_add_home_dialog_get_property (GObject *object,
219 HildonAddHomeDialog * dialog = HILDON_ADD_HOME_DIALOG(object);
220 HildonAddHomeDialogPrivate *priv = HILDON_ADD_HOME_DIALOG_GET_PRIVATE(dialog);
226 const gchar* name = NULL;
227 if(priv->isrename && priv->name_label)
228 name = gtk_entry_get_text(GTK_ENTRY(priv->name_label));
229 else if(!(priv->isrename) && priv->name_entry)
230 name = gtk_entry_get_text(GTK_ENTRY(priv->name_entry));
232 g_value_set_string (value, name);
237 const gchar* new_name = NULL;
238 if(priv->isrename && priv->new_name_entry)
239 new_name = gtk_entry_get_text(GTK_ENTRY(priv->new_name_entry));
241 g_value_set_string (value, new_name);
245 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
251 hildon_add_home_dialog_set_window_title (HildonAddHomeDialog * dialog)
253 HildonAddHomeDialogPrivate *priv;
255 g_return_if_fail(HILDON_IS_ADD_HOME_DIALOG(dialog));
256 priv = HILDON_ADD_HOME_DIALOG_GET_PRIVATE(dialog);
258 /* Set up the window title */
260 gtk_window_set_title(GTK_WINDOW(dialog), _("ckdg_ti_rename_link"));
262 gtk_window_set_title(GTK_WINDOW(dialog), _("addtoHome_dialog_title"));
267 hildon_add_home_dialog_set_property (GObject *object,
272 HildonAddHomeDialog * dialog = HILDON_ADD_HOME_DIALOG(object);
273 HildonAddHomeDialogPrivate *priv;
275 g_return_if_fail(HILDON_IS_ADD_HOME_DIALOG(dialog));
276 priv = HILDON_ADD_HOME_DIALOG_GET_PRIVATE(dialog);
281 hildon_add_home_dialog_set_old_name (dialog, g_value_get_string (value));
284 hildon_add_home_dialog_set_new_name (dialog, g_value_get_string (value));
287 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
293 * hildon_add_home_dialog_new:
294 * @parent: parent window for the dialog
295 * @name: name to show in the entry (or label, if @new_name is not NULL)
296 * @new_name: name to show in the new name entry. If this is not NULL
297 * the widget acts as a RenameShortcutDialog.
299 * Creates a new Add to Home dialog or Rename Shortcut dialog.
301 * Returns: the new dialog.
303 GtkWidget *hildon_add_home_dialog_new(GtkWindow * parent,
305 const gchar * new_name)
307 HildonAddHomeDialog *dialog =
308 HILDON_ADD_HOME_DIALOG(g_object_new
309 (HILDON_TYPE_ADD_HOME_DIALOG, "name", name, "new_name", new_name, NULL));
312 gtk_window_set_transient_for(GTK_WINDOW(dialog), parent);
314 return GTK_WIDGET(dialog);
318 * hildon_add_home_dialog_get_name:
319 * @dialog: the dialog
321 * Returns: the string the user has entered in the entry
323 const gchar *hildon_add_home_dialog_get_name(HildonAddHomeDialog * dialog)
325 HildonAddHomeDialogPrivate *priv;
327 g_return_val_if_fail(HILDON_IS_ADD_HOME_DIALOG(dialog), NULL);
328 priv = HILDON_ADD_HOME_DIALOG_GET_PRIVATE(dialog);
330 if (priv->isrename && priv->new_name_entry)
331 return gtk_entry_get_text(GTK_ENTRY(priv->new_name_entry));
332 else if(priv->name_entry)
333 return gtk_entry_get_text(GTK_ENTRY(priv->name_entry));
338 static const gchar *hildon_add_home_dialog_get_old_name(HildonAddHomeDialog * dialog)
340 HildonAddHomeDialogPrivate *priv;
342 g_return_val_if_fail(HILDON_IS_ADD_HOME_DIALOG(dialog), NULL);
343 priv = HILDON_ADD_HOME_DIALOG_GET_PRIVATE(dialog);
345 if (priv->isrename && priv->name_label)
346 return gtk_label_get_text(GTK_LABEL(priv->name_label));
347 else if(!priv->isrename && priv->name_entry)
348 return gtk_entry_get_text(GTK_ENTRY(priv->name_entry));
353 static void hildon_add_home_dialog_set_old_name(HildonAddHomeDialog * dialog, const gchar* name)
355 HildonAddHomeDialogPrivate *priv;
357 g_return_if_fail(HILDON_IS_ADD_HOME_DIALOG(dialog));
358 priv = HILDON_ADD_HOME_DIALOG_GET_PRIVATE(dialog);
360 hildon_add_home_dialog_create_widgets(dialog, priv->isrename);
362 /* Set text in the widgets: */
364 gtk_label_set_text(GTK_LABEL(priv->name_label), name);
366 gtk_entry_set_text(GTK_ENTRY(priv->name_entry), name);
369 static void hildon_add_home_dialog_set_new_name(HildonAddHomeDialog * dialog, const gchar* new_name)
371 HildonAddHomeDialogPrivate *priv;
373 gboolean new_isrename = FALSE;
375 g_return_if_fail(HILDON_IS_ADD_HOME_DIALOG(dialog));
376 priv = HILDON_ADD_HOME_DIALOG_GET_PRIVATE(dialog);
378 /* We get the old name, in case we need to set it again in a new widget. */
379 name = g_strdup( hildon_add_home_dialog_get_old_name(dialog) );
380 new_isrename = (new_name != NULL);
382 hildon_add_home_dialog_create_widgets(dialog, new_isrename);
385 /* Set text in the widgets: */
388 gtk_entry_set_text(GTK_ENTRY(priv->new_name_entry), new_name);
389 gtk_label_set_text(GTK_LABEL(priv->name_label), (name) ? name : "");
393 gtk_entry_set_text(GTK_ENTRY(priv->name_entry), (name) ? name : "");
400 static void hildon_add_home_dialog_create_widgets(HildonAddHomeDialog * dialog, gboolean new_isrename)
402 HildonAddHomeDialogPrivate *priv;
404 g_return_if_fail(HILDON_IS_ADD_HOME_DIALOG(dialog));
405 priv = HILDON_ADD_HOME_DIALOG_GET_PRIVATE(dialog);
407 /* Create and destroy widgets, depending on the mode.
408 * Note that we are making a small speed sacrifice (recreating the widgets)
409 * in exchange for memory (creating all widgets and just hiding the ones we don't use.)
412 if(priv->isrename && !new_isrename)
414 /* Remove widgets that were used for isrename mode,
415 because we don't need them anymore. */
416 if(priv->new_name_entry)
418 gtk_widget_destroy(priv->new_name_entry);
419 priv->new_name_entry = NULL;
422 if(priv->caption_new_name_entry)
424 gtk_widget_destroy(priv->caption_new_name_entry);
425 priv->caption_new_name_entry = NULL;
428 if(priv->name_label) /* A label */
430 gtk_widget_destroy(priv->name_label);
431 priv->name_label = NULL;
434 if(priv->name_entry) /* A box with label inside */
436 gtk_widget_destroy(priv->name_entry);
437 priv->name_entry = NULL;
440 else if(!priv->isrename && new_isrename)
442 /* Remove widgets that were used only for !isrename mode,
443 because we don't need them anymore. */
444 if(priv->name_entry) /* An entry. */
446 gtk_widget_destroy(priv->name_entry);
447 priv->name_entry = NULL;
451 priv->isrename = new_isrename;
455 /* Create widgets needed for isrename mode: */
457 /* Create Entry (in a Caption) for the new name, and pack it into the dialog: */
458 if(!priv->new_name_entry)
460 priv->new_name_entry = gtk_entry_new();
461 gtk_widget_show(priv->new_name_entry);
464 if(!priv->caption_new_name_entry)
466 priv->caption_new_name_entry = hildon_caption_new(priv->size_group, _("ckdg_fi_rename_name"),
467 priv->new_name_entry, NULL,
468 HILDON_CAPTION_OPTIONAL);
469 gtk_widget_show(priv->caption_new_name_entry);
470 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), GTK_WIDGET(priv->caption_new_name_entry),
474 /* add description text */
476 gtk_widget_show(priv->desc_label);
478 /* Create Label (in a Box) for the existing name: */
479 if(!priv->name_entry)
481 priv->name_label = gtk_label_new(NULL);
482 gtk_widget_show(priv->name_label);
484 priv->name_entry = gtk_hbox_new(FALSE, 0);
485 gtk_widget_show(priv->name_entry);
486 gtk_box_pack_start(GTK_BOX(priv->name_entry), priv->name_label, FALSE, FALSE,
488 gtk_container_add(GTK_CONTAINER(priv->caption_name_entry), GTK_WIDGET(priv->name_entry));
494 gtk_widget_hide(priv->desc_label);
496 /* Create widgets needed for !isrename mode: */
497 if(!priv->name_entry)
499 priv->name_entry = gtk_entry_new();
500 gtk_widget_show(priv->name_entry);
501 gtk_container_add(GTK_CONTAINER(priv->caption_name_entry), GTK_WIDGET(priv->name_entry));
505 hildon_add_home_dialog_set_window_title(dialog);
507 priv->isrename = new_isrename;
510 void hildon_add_home_dialog_set_name(HildonAddHomeDialog * dialog, const gchar* name)
512 HildonAddHomeDialogPrivate *priv;
514 g_return_if_fail(HILDON_IS_ADD_HOME_DIALOG(dialog));
515 priv = HILDON_ADD_HOME_DIALOG_GET_PRIVATE(dialog);
517 hildon_add_home_dialog_create_widgets(dialog, priv->isrename);
519 /* Set text in the widgets: */
521 gtk_entry_set_text(GTK_ENTRY(priv->new_name_entry), name);
523 gtk_label_set_text(GTK_LABEL(priv->name_entry), name);