/* $Id$ */ /*- * Copyright (c) 2005 Benedikt Meurer * All rights reserved. * * This program 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; either version 2, or (at your option) * any later version. * * This program 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, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA. */ #ifdef HAVE_CONFIG_H #include #endif #include "xfae-dialog.h" static void xfae_dialog_init (XfaeDialog *dialog); static void xfae_dialog_update (XfaeDialog *dialog); static void xfae_dialog_browse (XfaeDialog *dialog); struct _XfaeDialogClass { GtkDialogClass __parent__; }; struct _XfaeDialog { GtkDialog __parent__; GtkWidget *name_entry; GtkWidget *descr_entry; GtkWidget *command_entry; }; GType xfae_dialog_get_type (void) { static GType type = G_TYPE_INVALID; if (G_UNLIKELY (type == G_TYPE_INVALID)) { static const GTypeInfo info = { sizeof (XfaeDialogClass), NULL, NULL, NULL, NULL, NULL, sizeof (XfaeDialog), 0, (GInstanceInitFunc) xfae_dialog_init, NULL, }; type = g_type_register_static (GTK_TYPE_DIALOG, "XfaeDialog", &info, 0); } return type; } static void xfae_dialog_init (XfaeDialog *dialog) { GtkWidget *table; GtkWidget *label; GtkWidget *hbox; GtkWidget *button; GtkWidget *image; gtk_dialog_add_buttons (GTK_DIALOG (dialog), GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OK, GTK_RESPONSE_OK, NULL); gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK); gtk_dialog_set_has_separator (GTK_DIALOG (dialog), FALSE); gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog), GTK_RESPONSE_OK, FALSE); gtk_window_set_title (GTK_WINDOW (dialog), _("Add application")); table = g_object_new (GTK_TYPE_TABLE, "border-width", 12, "row-spacing", 6, "column-spacing", 12, "n-rows", 3, "n-columns", 2, "homogeneous", FALSE, NULL); gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), table, TRUE, TRUE, 0); gtk_widget_show (table); label = g_object_new (GTK_TYPE_LABEL, "label", _("Name:"), "xalign", 0.0f, NULL); gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1, GTK_FILL, GTK_FILL, 0, 0); gtk_widget_show (label); dialog->name_entry = g_object_new (GTK_TYPE_ENTRY, "activates-default", TRUE, NULL); g_signal_connect_swapped (G_OBJECT (dialog->name_entry), "notify::text", G_CALLBACK (xfae_dialog_update), dialog); gtk_table_attach (GTK_TABLE (table), dialog->name_entry, 1, 2, 0, 1, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0); gtk_widget_show (dialog->name_entry); label = g_object_new (GTK_TYPE_LABEL, "label", _("Description:"), "xalign", 0.0f, NULL); gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2, GTK_FILL, GTK_FILL, 0, 0); gtk_widget_show (label); dialog->descr_entry = g_object_new (GTK_TYPE_ENTRY, "activates-default", TRUE, NULL); gtk_table_attach (GTK_TABLE (table), dialog->descr_entry, 1, 2, 1, 2, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0); gtk_widget_show (dialog->descr_entry); label = g_object_new (GTK_TYPE_LABEL, "label", _("Command:"), "xalign", 0.0f, NULL); gtk_table_attach (GTK_TABLE (table), label, 0, 1, 2, 3, GTK_FILL, GTK_FILL, 0, 0); gtk_widget_show (label); hbox = g_object_new (GTK_TYPE_HBOX, "spacing", 6, NULL); gtk_table_attach (GTK_TABLE (table), hbox, 1, 2, 2, 3, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0); gtk_widget_show (hbox); dialog->command_entry = g_object_new (GTK_TYPE_ENTRY, "activates-default", TRUE, NULL); g_signal_connect_swapped (G_OBJECT (dialog->command_entry), "notify::text", G_CALLBACK (xfae_dialog_update), dialog); gtk_box_pack_start (GTK_BOX (hbox), dialog->command_entry, TRUE, TRUE, 0); gtk_widget_show (dialog->command_entry); button = g_object_new (GTK_TYPE_BUTTON, "can-default", FALSE, NULL); g_signal_connect_swapped (G_OBJECT (button), "clicked", G_CALLBACK (xfae_dialog_browse), dialog); gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0); gtk_widget_show (button); image = gtk_image_new_from_stock (GTK_STOCK_OPEN, GTK_ICON_SIZE_BUTTON); gtk_container_add (GTK_CONTAINER (button), image); gtk_widget_show (image); } static void xfae_dialog_update (XfaeDialog *dialog) { const gchar *command; const gchar *name; command = gtk_entry_get_text (GTK_ENTRY (dialog->command_entry)); name = gtk_entry_get_text (GTK_ENTRY (dialog->name_entry)); gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog), GTK_RESPONSE_OK, *command && *name); } static void xfae_dialog_browse (XfaeDialog *dialog) { const gchar *command; GtkWidget *chooser; gchar *filename; chooser = gtk_file_chooser_dialog_new (_("Select a command"), GTK_WINDOW (dialog), GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, NULL); gtk_file_chooser_set_local_only (GTK_FILE_CHOOSER (chooser), TRUE); command = gtk_entry_get_text (GTK_ENTRY (dialog->command_entry)); if (G_UNLIKELY (*command == '/')) gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (chooser), command); if (gtk_dialog_run (GTK_DIALOG (chooser)) == GTK_RESPONSE_ACCEPT) { filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (chooser)); gtk_entry_set_text (GTK_ENTRY (dialog->command_entry), filename); g_free (filename); } gtk_widget_destroy (chooser); } /** * xfae_dialog_new: * * Allocates a new #XfaeDialog instance. * * Return value: the newly allocated #XfaeDialog. **/ GtkWidget* xfae_dialog_new (void) { return g_object_new (XFAE_TYPE_DIALOG, NULL); } /** * xfae_dialog_get: * @dialog : a #XfaeDialog. * @name : return location for the name. * @descr : return location for the description. * @command : return location for the command. * * Extracts the parameters selected by the user * from the @dialog. **/ void xfae_dialog_get (XfaeDialog *dialog, gchar **name, gchar **descr, gchar **command) { g_return_if_fail (XFAE_IS_DIALOG (dialog)); g_return_if_fail (name != NULL); g_return_if_fail (descr != NULL); g_return_if_fail (command != NULL); *name = gtk_editable_get_chars (GTK_EDITABLE (dialog->name_entry), 0, -1); *descr = gtk_editable_get_chars (GTK_EDITABLE (dialog->descr_entry), 0, -1); *command = gtk_editable_get_chars (GTK_EDITABLE (dialog->command_entry), 0, -1); g_strstrip (*name); g_strstrip (*descr); g_strstrip (*command); }