diff options
Diffstat (limited to 'src/beaver-settings-page.c')
-rw-r--r-- | src/beaver-settings-page.c | 425 |
1 files changed, 425 insertions, 0 deletions
diff --git a/src/beaver-settings-page.c b/src/beaver-settings-page.c new file mode 100644 index 0000000..ea9537a --- /dev/null +++ b/src/beaver-settings-page.c @@ -0,0 +1,425 @@ +/* + * Copyright (C) 2007, 2008 OpenedHand Ltd. + * Authored by: Rob Bradford <rob@o-hand.com> + * + * This is free software: you can redistribute it and/or modify it under the + * terms of the GNU General Public License as published by the Free Software + * Foundation, version 2 of the License. + * + * This software is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "beaver-settings-page.h" +#include "beaver.h" + +G_DEFINE_TYPE (BeaverSettingsPage, beaver_settings_page, GTK_TYPE_VBOX) + +#define SETTINGS_PAGE_PRIVATE(o) \ + (G_TYPE_INSTANCE_GET_PRIVATE ((o), BEAVER_TYPE_SETTINGS_PAGE, BeaverSettingsPagePrivate)) + +typedef struct _BeaverSettingsPagePrivate BeaverSettingsPagePrivate; + +struct _BeaverSettingsPagePrivate +{ + AnjutaShell *shell; + AnjutaPreferences *prefs; + + GtkWidget *kernel_chooser; + GtkWidget *rootfs_chooser; +}; + +enum +{ + PROP_0, + PROP_SHELL +}; + +static void create_ui (BeaverSettingsPage *page); + +static void +beaver_settings_page_get_property (GObject *object, guint property_id, + GValue *value, GParamSpec *pspec) +{ + switch (property_id) { + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + } +} + +static void +beaver_settings_page_set_property (GObject *object, guint property_id, + const GValue *value, GParamSpec *pspec) +{ + BeaverSettingsPagePrivate *priv = SETTINGS_PAGE_PRIVATE (object); + + switch (property_id) { + case PROP_SHELL: + priv->shell = g_value_get_object (value); + priv->prefs = anjuta_shell_get_preferences (priv->shell, NULL); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + } +} + +static void +beaver_settings_page_dispose (GObject *object) +{ + if (G_OBJECT_CLASS (beaver_settings_page_parent_class)->dispose) + G_OBJECT_CLASS (beaver_settings_page_parent_class)->dispose (object); +} + +static void +beaver_settings_page_finalize (GObject *object) +{ + G_OBJECT_CLASS (beaver_settings_page_parent_class)->finalize (object); +} + +static void +beaver_settings_page_constructed (GObject *object) +{ + if (G_OBJECT_CLASS (beaver_settings_page_parent_class)->constructed) + G_OBJECT_CLASS (beaver_settings_page_parent_class)->constructed (object); + + create_ui (BEAVER_SETTINGS_PAGE (object)); +} + +static void +beaver_settings_page_class_init (BeaverSettingsPageClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GParamSpec *pspec = NULL; + + g_type_class_add_private (klass, sizeof (BeaverSettingsPagePrivate)); + + object_class->get_property = beaver_settings_page_get_property; + object_class->set_property = beaver_settings_page_set_property; + object_class->dispose = beaver_settings_page_dispose; + object_class->finalize = beaver_settings_page_finalize; + object_class->constructed = beaver_settings_page_constructed; + + pspec = g_param_spec_object ("shell", "shell", "shell", + ANJUTA_TYPE_SHELL, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_WRITABLE); + g_object_class_install_property (object_class, PROP_SHELL, pspec); +} + +static void +beaver_settings_page_init (BeaverSettingsPage *self) +{ +} + +GtkWidget * +beaver_settings_page_new (AnjutaShell *shell) +{ + return g_object_new (BEAVER_TYPE_SETTINGS_PAGE, + "shell", shell, + NULL); +} + +static gboolean +preferences_timeout_cb (gpointer userdata) +{ + BeaverSettingsPage *page = BEAVER_SETTINGS_PAGE (userdata); + BeaverSettingsPagePrivate *priv = SETTINGS_PAGE_PRIVATE (page); + gchar *filename; + + filename = anjuta_preferences_get (priv->prefs, + PREFS_PROP_KERNEL); + gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (priv->kernel_chooser), + filename); + g_free (filename); + + filename = anjuta_preferences_get (priv->prefs, + PREFS_PROP_ROOTFS); + gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (priv->rootfs_chooser), + filename); + g_free (filename); + + return FALSE; +} + +static void +full_radio_toggled_cb (GtkToggleButton *toggle, gpointer userdata) +{ + gtk_widget_set_sensitive (GTK_WIDGET (userdata), + gtk_toggle_button_get_active (toggle)); +} + +static void +toolchain_radio_toggled_cb (GtkToggleButton *toggle, gpointer userdata) +{ + gtk_widget_set_sensitive (GTK_WIDGET (userdata), + gtk_toggle_button_get_active (toggle)); +} + +static void +create_ui (BeaverSettingsPage *page) +{ + BeaverSettingsPagePrivate *priv = SETTINGS_PAGE_PRIVATE (page); + + GtkSizeGroup *opts_labels_group; + GtkSizeGroup *opts_fields_group; + GtkSizeGroup *qemu_labels_group; + GtkSizeGroup *qemu_fields_group; + + GtkWidget *frame; + GtkWidget *inner_vbox; + GtkWidget *hbox; + GtkWidget *label; + GtkWidget *chooser; + GtkWidget *entry; + GtkWidget *inner_alignment; + GtkWidget *qemu_vbox; + + GtkWidget *toolchain_radio; + GtkWidget *full_radio; + + gboolean res; + gchar *filename = NULL; + + gtk_box_set_spacing (GTK_BOX (page), 6); + gtk_box_set_homogeneous (GTK_BOX (page), FALSE); + gtk_container_set_border_width (GTK_CONTAINER (page), 6); + + /* Frame for options */ + frame = gtk_frame_new (_("<b>Cross-compiler Options</b>")); + gtk_box_pack_start (GTK_BOX (page), frame, FALSE, FALSE, 2); + label = gtk_frame_get_label_widget (GTK_FRAME (frame)); + gtk_label_set_use_markup (GTK_LABEL (label), TRUE); + gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_NONE); + + /* size groups for files */ + opts_labels_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL); + opts_fields_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL); + + /* Pack inner vbox */ + inner_vbox = gtk_vbox_new (FALSE, 6); + inner_alignment = gtk_alignment_new (0, 0.5, 1, 1); + g_object_set (inner_alignment, "left-padding", 12, "top-padding", 6, NULL); + gtk_container_add (GTK_CONTAINER (inner_alignment), inner_vbox); + gtk_container_add (GTK_CONTAINER (frame), inner_alignment); + + /* Radio for external toolchain */ + toolchain_radio = gtk_radio_button_new_with_label (NULL, + _("Use an external toolchain")); + gtk_box_pack_start (GTK_BOX (inner_vbox), toolchain_radio, TRUE, FALSE, 0); + + /* Widgets for sdk root */ + inner_alignment = gtk_alignment_new (0, 0.5, 1, 1); + g_object_set (inner_alignment, "left-padding", 24, NULL); + gtk_box_pack_start (GTK_BOX (inner_vbox), inner_alignment, TRUE, FALSE, 0); + + hbox = gtk_hbox_new (FALSE, 6); + gtk_container_add (GTK_CONTAINER (inner_alignment), hbox); + g_signal_connect (toolchain_radio, "toggled", (GCallback)toolchain_radio_toggled_cb, + hbox); + + /* label */ + label = gtk_label_new (_("SDK root: ")); + gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); + gtk_size_group_add_widget (opts_labels_group, label); + gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5); + + /* chooser */ + chooser = gtk_file_chooser_button_new (_("Select SDK root"), + GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER); + gtk_size_group_add_widget (opts_fields_group, label); + gtk_box_pack_start (GTK_BOX (hbox), chooser, TRUE, TRUE, 0); + + res = anjuta_preferences_register_property_raw ( + priv->prefs, + chooser, + PREFS_PROP_SDK_ROOT, + NULL, + 0, + ANJUTA_PROPERTY_OBJECT_TYPE_FOLDER, + ANJUTA_PROPERTY_DATA_TYPE_TEXT); + + if (!res) + g_warning ("Error adding preference for SDK root"); + + /* Radio for poky tree */ + full_radio = gtk_radio_button_new_with_label_from_widget ( + GTK_RADIO_BUTTON (toolchain_radio), + _("Use a full Poky tree")); + gtk_box_pack_start (GTK_BOX (inner_vbox), full_radio, TRUE, FALSE, 0); + + /* Widgets for full tree */ + inner_alignment = gtk_alignment_new (0, 0.5, 1, 1); + g_object_set (inner_alignment, "left-padding", 24, NULL); + gtk_box_pack_start (GTK_BOX (inner_vbox), inner_alignment, TRUE, FALSE, 0); + + hbox = gtk_hbox_new (FALSE, 6); + gtk_container_add (GTK_CONTAINER (inner_alignment), hbox); + g_signal_connect (full_radio, "toggled", (GCallback)full_radio_toggled_cb, + hbox); + + /* Make the full options insensitive since by default we used external + * toolchain mode */ + gtk_widget_set_sensitive (hbox, FALSE); + + /* label */ + label = gtk_label_new (_("Poky root: ")); + gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); + gtk_size_group_add_widget (opts_labels_group, label); + gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5); + + /* chooser */ + chooser = gtk_file_chooser_button_new (_("Select Poky root"), + GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER); + + gtk_size_group_add_widget (opts_fields_group, label); + gtk_box_pack_start (GTK_BOX (hbox), chooser, TRUE, TRUE, 0); + + res = anjuta_preferences_register_property_raw ( + priv->prefs, + chooser, + PREFS_PROP_POKY_ROOT, + NULL, + 0, + ANJUTA_PROPERTY_OBJECT_TYPE_FOLDER, + ANJUTA_PROPERTY_DATA_TYPE_TEXT); + + if (!res) + g_warning ("Error adding preference for Poky root"); + + /* Register a preference for the toggle */ + + /* This is all a bit of a hack, we register the property on the second one + * in the group. If the mode is 1 then this gets selected and the world is a + * happy place. But if this is 0, then the group is in an inconsistent + * state...Ah, but actually when the widgets are created the first is + * toggled on by default. + */ + res = anjuta_preferences_register_property_raw ( + priv->prefs, + full_radio, + PREFS_PROP_POKY_MODE, + NULL, + 0, + ANJUTA_PROPERTY_OBJECT_TYPE_TOGGLE, + ANJUTA_PROPERTY_DATA_TYPE_INT); + + if (!res) + g_warning ("Error adding preference for mode of operation"); + + /* Widgets for toolchain triplet */ + hbox = gtk_hbox_new (FALSE, 6); + gtk_box_pack_start (GTK_BOX (inner_vbox), hbox, TRUE, FALSE, 0); + + /* label */ + label = gtk_label_new (_("Toolchain triplet: ")); + gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); + gtk_size_group_add_widget (opts_labels_group, label); + gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5); + + /* entry */ + entry = gtk_entry_new (); + gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0); + gtk_size_group_add_widget (opts_fields_group, label); + + /* register prop */ + res = anjuta_preferences_register_property_raw (priv->prefs, + entry, + PREFS_PROP_TRIPLET, + NULL, + 0, + ANJUTA_PROPERTY_OBJECT_TYPE_ENTRY, + ANJUTA_PROPERTY_DATA_TYPE_TEXT); + + if (!res) + g_warning ("Error adding preference for triplet"); + + /* Frame for qemu */ + frame = gtk_frame_new ("<b>QEMU Options</b>"); + gtk_box_pack_start (GTK_BOX (page), frame, FALSE, FALSE, 2); + gtk_label_set_use_markup (GTK_LABEL (gtk_frame_get_label_widget (GTK_FRAME (frame))), + TRUE); + gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_NONE); + + /* size groups for files */ + qemu_labels_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL); + qemu_fields_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL); + + /* Pack inner vbox */ + inner_vbox = gtk_vbox_new (FALSE, 6); + inner_alignment = gtk_alignment_new (0, 0.5, 1, 1); + g_object_set (inner_alignment, "left-padding", 12, "top-padding", 6, NULL); + gtk_container_add (GTK_CONTAINER (inner_alignment), inner_vbox); + gtk_container_add (GTK_CONTAINER (frame), inner_alignment); + + /* Widgets for kernel */ + hbox = gtk_hbox_new (FALSE, 6); + gtk_box_pack_start (GTK_BOX (inner_vbox), hbox, TRUE, FALSE, 0); + + /* label */ + label = gtk_label_new ("Kernel: "); + gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); + gtk_size_group_add_widget (qemu_labels_group, label); + gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5); + + /* chooser */ + chooser = gtk_file_chooser_button_new (_("Select kernel file"), GTK_FILE_CHOOSER_ACTION_OPEN); + gtk_box_pack_start (GTK_BOX (hbox), chooser, TRUE, TRUE, 0); + gtk_size_group_add_widget (qemu_fields_group, chooser); + + anjuta_preferences_register_property_raw ( + priv->prefs, + chooser, + PREFS_PROP_KERNEL, + NULL, + 0, + ANJUTA_PROPERTY_OBJECT_TYPE_FILE, + ANJUTA_PROPERTY_DATA_TYPE_TEXT); + + priv->kernel_chooser = chooser; + + /* Widgets for rootfs */ + hbox = gtk_hbox_new (FALSE, 6); + gtk_box_pack_start (GTK_BOX (inner_vbox), hbox, TRUE, FALSE, 0); + + /* label */ + label = gtk_label_new ("Root filesystem: "); + gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); + gtk_size_group_add_widget (qemu_labels_group, label); + gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5); + + /* chooser */ + chooser = gtk_file_chooser_button_new (_("Select root filesystem file"), + GTK_FILE_CHOOSER_ACTION_OPEN); + gtk_box_pack_start (GTK_BOX (hbox), chooser, TRUE, TRUE, 0); + gtk_size_group_add_widget (qemu_fields_group, chooser); + priv->rootfs_chooser = chooser; + + anjuta_preferences_register_property_raw ( + priv->prefs, + chooser, + PREFS_PROP_ROOTFS, + NULL, + 0, + ANJUTA_PROPERTY_OBJECT_TYPE_FILE, + ANJUTA_PROPERTY_DATA_TYPE_TEXT); + + /* add page */ + gtk_widget_show_all (GTK_WIDGET (page)); + + /* + * This is a horrible hack around some kind of race condition that seems to + * mean that the GtkFileChooserButton doesn't reflect the filename it is + * given by the prefences code in Anjuta. Even if it just gets set here it + * isn't guaranteed to work. This is the best option i've come up with. + * + * After 800ms fire a timeout that reads the values for the preferences and + * then sets the widgets. It only needs to be done for those that are of + * ANJUTA_PROPERTY_OBJECT_TYPE_FILE type. + */ + g_timeout_add (800, preferences_timeout_cb, page); +} + |