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
25 #include <gtk/gtkdialog.h>
26 #include <gtk/gtknotebook.h>
27 #include <gtk/gtkimage.h>
28 #include <gtk/gtkbox.h>
29 #include <gtk/gtkhbox.h>
30 #include <gtk/gtkvbox.h>
31 #include <gtk/gtkbutton.h>
32 #include <hildon-widgets/hildon-defines.h>
34 #include "hildon-wizard-dialog.h"
42 #define _(String) dgettext(PACKAGE, String)
44 static GtkDialogClass *parent_class;
46 static void hildon_wizard_dialog_class_init(HildonWizardDialogClass *
48 static void hildon_wizard_dialog_init(HildonWizardDialog * wizard_dialog);
50 hildon_wizard_dialog_create_title(HildonWizardDialog * wizard_dialog);
51 static void direction_button_clicked(GtkWidget *widget,
52 HildonWizardDialog *wizard_dialog);
53 static void hildon_wizard_dialog_set_property(GObject * object,
57 static void hildon_wizard_dialog_get_property(GObject * object,
61 static void hildon_wizard_dialog_finalize(GObject * object);
69 struct _HildonWizardDialogPrivate {
71 GtkNotebook *notebook;
74 GtkWidget *previous_button;
75 GtkWidget *next_button;
79 GType hildon_wizard_dialog_get_type(void)
81 static GType wizard_dialog_type = 0;
83 if (!wizard_dialog_type) {
84 static const GTypeInfo wizard_dialog_info = {
85 sizeof(HildonWizardDialogClass),
87 NULL, /* base_finalize */
88 (GClassInitFunc) hildon_wizard_dialog_class_init,
89 NULL, /* class_finalize */
90 NULL, /* class_data */
91 sizeof(HildonWizardDialog),
93 (GInstanceInitFunc) hildon_wizard_dialog_init,
95 wizard_dialog_type = g_type_register_static(GTK_TYPE_DIALOG,
100 return wizard_dialog_type;
105 hildon_wizard_dialog_class_init(HildonWizardDialogClass *
108 GObjectClass *object_class = G_OBJECT_CLASS(wizard_dialog_class);
110 parent_class = g_type_class_peek_parent(wizard_dialog_class);
112 g_type_class_add_private(wizard_dialog_class,
113 sizeof(HildonWizardDialogPrivate));
115 object_class->set_property = hildon_wizard_dialog_set_property;
116 object_class->get_property = hildon_wizard_dialog_get_property;
117 object_class->finalize = hildon_wizard_dialog_finalize;
119 g_object_class_install_property(object_class, PROP_WIZARD_NAME,
120 g_param_spec_string("wizard-name",
122 "Set the HildonWizardDialog name",
126 g_object_class_install_property(object_class, PROP_WIZARD_NOTEBOOK,
127 g_param_spec_object("wizard-notebook",
129 "Set the GtkNotebook to be used in the "
130 "HildonWizardDialog",
131 GTK_TYPE_NOTEBOOK, G_PARAM_READWRITE));
134 static void hildon_wizard_dialog_finalize(GObject * object)
136 g_free(HILDON_WIZARD_DIALOG(object)->priv->wizard_name);
137 if (G_OBJECT_CLASS(parent_class)->finalize)
138 G_OBJECT_CLASS(parent_class)->finalize(object);
141 static void hildon_wizard_dialog_init(HildonWizardDialog * wizard_dialog)
143 HildonWizardDialogPrivate *priv =
144 G_TYPE_INSTANCE_GET_PRIVATE(wizard_dialog,
145 HILDON_TYPE_WIZARD_DIALOG,
146 HildonWizardDialogPrivate);
147 GtkDialog *dialog = GTK_DIALOG(wizard_dialog);
148 GtkWidget *vbox = gtk_vbox_new(FALSE, 0);
150 gtk_dialog_set_has_separator(dialog, FALSE);
152 wizard_dialog->priv = priv;
153 priv->box = GTK_BOX(gtk_hbox_new(FALSE, 0));
154 priv->image = gtk_image_new_from_icon_name("qgn_widg_wizard",
155 HILDON_ICON_SIZE_WIDG_WIZARD);
156 priv->notebook = NULL;
157 priv->wizard_name = NULL;
159 gtk_box_pack_start_defaults(GTK_BOX(dialog->vbox),
160 GTK_WIDGET(priv->box));
161 gtk_box_pack_start_defaults(GTK_BOX(priv->box), GTK_WIDGET(vbox));
162 gtk_box_pack_start(GTK_BOX(vbox),GTK_WIDGET(priv->image), FALSE, FALSE, 0);
164 gtk_dialog_add_button(dialog, _("Ecdg_bd_wizard_cancel"),
165 HILDON_WIZARD_DIALOG_CANCEL);
167 priv->previous_button =
168 gtk_button_new_with_label(_("Ecdg_bd_wizard_previous"));
169 gtk_box_pack_start(GTK_BOX(dialog->action_area),
170 priv->previous_button, FALSE, TRUE, 0);
172 g_signal_connect(priv->previous_button, "clicked",
173 G_CALLBACK(direction_button_clicked), wizard_dialog);
176 gtk_button_new_with_label(_("Ecdg_bd_wizard_next"));
177 gtk_box_pack_start(GTK_BOX(dialog->action_area),
178 priv->next_button, FALSE, TRUE, 0);
180 g_signal_connect(priv->next_button, "clicked",
181 G_CALLBACK(direction_button_clicked), wizard_dialog);
183 gtk_dialog_add_button(dialog, _("Ecdg_bd_wizard_finish"),
184 HILDON_WIZARD_DIALOG_FINISH);
186 gtk_dialog_set_response_sensitive(GTK_DIALOG(wizard_dialog),
187 HILDON_WIZARD_DIALOG_FINISH,
189 gtk_widget_set_sensitive(priv->previous_button, FALSE);
191 hildon_wizard_dialog_create_title(wizard_dialog);
196 hildon_wizard_dialog_set_property(GObject * object, guint property_id,
197 const GValue * value, GParamSpec * pspec)
199 HildonWizardDialogPrivate *priv = HILDON_WIZARD_DIALOG(object)->priv;
201 switch (property_id) {
202 case PROP_WIZARD_NAME:
203 if (priv->wizard_name)
204 g_free(priv->wizard_name);
205 priv->wizard_name = g_strdup((gchar *) g_value_get_string(value));
207 hildon_wizard_dialog_create_title(HILDON_WIZARD_DIALOG
210 case PROP_WIZARD_NOTEBOOK:
211 priv->notebook = GTK_NOTEBOOK(g_value_get_object(value));
212 gtk_notebook_set_show_tabs(priv->notebook, FALSE);
213 gtk_notebook_set_show_border(priv->notebook, FALSE);
214 gtk_box_pack_start_defaults(GTK_BOX(priv->box),
215 GTK_WIDGET(priv->notebook));
217 if (priv->wizard_name)
218 hildon_wizard_dialog_create_title(HILDON_WIZARD_DIALOG
222 G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec);
229 hildon_wizard_dialog_get_property(GObject * object, guint property_id,
230 GValue * value, GParamSpec * pspec)
232 HildonWizardDialogPrivate *priv = HILDON_WIZARD_DIALOG(object)->priv;
234 switch (property_id) {
235 case PROP_WIZARD_NAME:
236 g_value_set_string(value, priv->wizard_name);
238 case PROP_WIZARD_NOTEBOOK:
239 g_value_set_object(value, priv->notebook);
242 G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec);
249 hildon_wizard_dialog_create_title(HildonWizardDialog * wizard_dialog)
253 HildonWizardDialogPrivate *priv = wizard_dialog->priv;
254 GtkNotebook *notebook = priv->notebook;
256 const gchar *step = _("step");
257 const gchar *welcome = _("Welcome");
258 const gchar *wizard_completed = _("Wizard completed");
262 pages = gtk_notebook_get_n_pages(notebook);
263 current = gtk_notebook_get_current_page(priv->notebook);
268 str = g_strdup_printf(_("Ecdg_ti_wizard_welcome"),
269 priv->wizard_name, pages);
270 } else if (current + 1 == pages) {
271 gchar *steps = (gchar *) gtk_notebook_get_tab_label_text(notebook,
272 gtk_notebook_get_nth_page(notebook, current));
273 str = g_strdup_printf(_("Ecdg_ti_wizard_step"),
274 priv->wizard_name, current + 1, pages, steps);
276 gchar *steps = (gchar *) gtk_notebook_get_tab_label_text(notebook,
277 gtk_notebook_get_nth_page(notebook, current));
278 str = g_strdup_printf(_("Ecdg_ti_wizard_step"),
279 priv->wizard_name, current + 1, pages, steps);
283 str = g_strdup_printf("%s %s %d/%d %s", priv->wizard_name, step,
284 current + 1, pages, welcome);
285 else if (current + 1 == pages)
286 str = g_strdup_printf("%s %s %d/%d %s",
287 priv->wizard_name, step, current + 1, pages,
290 gchar *steps = (gchar *) gtk_notebook_get_tab_label_text(notebook,
291 gtk_notebook_get_nth_page(notebook, current));
292 str = g_strdup_printf("%s %s %d/%d: %s", priv->wizard_name, step,
293 current + 1, pages, steps);
296 gtk_window_set_title(GTK_WINDOW(wizard_dialog), str);
300 static void direction_button_clicked(GtkWidget *widget,
301 HildonWizardDialog *wizard_dialog)
303 HildonWizardDialogPrivate *priv = wizard_dialog->priv;
304 GtkNotebook *notebook = priv->notebook;
306 gint last = gtk_notebook_get_n_pages(notebook) - 1;
308 if (widget == priv->previous_button)
310 gtk_notebook_prev_page(notebook);
311 current = gtk_notebook_get_current_page(notebook);
314 gtk_widget_set_sensitive(priv->previous_button, FALSE);
315 gtk_dialog_set_response_sensitive
316 (GTK_DIALOG(wizard_dialog),
317 HILDON_WIZARD_DIALOG_FINISH,
321 gtk_widget_set_sensitive(priv->next_button, TRUE);
323 else /* Next button */
325 gtk_notebook_next_page(notebook);
326 current = gtk_notebook_get_current_page(notebook);
327 if (gtk_notebook_get_current_page(notebook) != 0)
329 gtk_widget_set_sensitive(priv->previous_button, TRUE);
330 gtk_dialog_set_response_sensitive
331 (GTK_DIALOG(wizard_dialog),
332 HILDON_WIZARD_DIALOG_FINISH,
336 gtk_widget_set_sensitive(priv->next_button, FALSE);
339 if (current == last || current == 0)
340 gtk_widget_show(GTK_WIDGET(priv->image));
342 gtk_widget_hide(GTK_WIDGET(priv->image));
343 hildon_wizard_dialog_create_title(wizard_dialog);
348 * hildon_wizard_dialog_new:
349 * @parent: A #GtkWindow
350 * @wizard_name: The name of dialog
351 * @notebook: The notebook to be shown on the dialog
353 * Creates a new #HildonWizardDialog
355 * Return value: A new HildonWizardDialog
357 GtkWidget *hildon_wizard_dialog_new(GtkWindow * parent,
358 const char *wizard_name,
359 GtkNotebook * notebook)
363 g_return_val_if_fail(GTK_IS_NOTEBOOK(notebook), NULL);
364 widget = GTK_WIDGET(g_object_new(HILDON_TYPE_WIZARD_DIALOG,
365 "wizard-name", wizard_name,
366 "wizard-notebook", notebook, NULL));
368 gtk_window_set_transient_for(GTK_WINDOW(widget), parent);