diff --git a/src/selectkeydlg.c b/src/selectkeydlg.c index 4987e0c..8886a60 100644 --- a/src/selectkeydlg.c +++ b/src/selectkeydlg.c @@ -1,369 +1,369 @@ /* selectkeydlg.c - A dialog to select a key. * Copyright (C) 2008 g10 Code GmbH. * * This file is part of GPA * * GPA 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 3 of the License, or * (at your option) any later version. * * GPA 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 . */ #include #include "gpa.h" #include "i18n.h" #include "gtktools.h" #include "keylist.h" #include "selectkeydlg.h" struct _SelectKeyDlg { GtkDialog parent; GpaKeyList *keylist; gpgme_protocol_t protocol; gpgme_key_t *initial_keys; const char *initial_pattern; }; struct _SelectKeyDlgClass { GtkDialogClass parent_class; }; /* The parent class. */ static GObjectClass *parent_class; /* Indentifiers for our properties. */ enum { PROP_0, PROP_WINDOW, PROP_PROTOCOL, PROP_INITIAL_KEYS, PROP_INITIAL_PATTERN }; /* Signal handler for selection changes of the keylist. */ static void keylist_selection_changed_cb (GtkTreeSelection *treeselection, gpointer user_data) { SelectKeyDlg *dialog = user_data; gboolean okay; g_debug ("keyring_selection_changed_cb called"); okay = gpa_keylist_has_single_selection (dialog->keylist); gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog), GTK_RESPONSE_OK, okay); } /************************************************************ ****************** Object Management ******************** ************************************************************/ static void select_key_dlg_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { SelectKeyDlg *dialog = SELECT_KEY_DLG (object); switch (prop_id) { case PROP_WINDOW: g_value_set_object (value, gtk_window_get_transient_for (GTK_WINDOW (dialog))); break; case PROP_PROTOCOL: g_value_set_int (value, dialog->protocol); break; case PROP_INITIAL_KEYS: g_value_set_pointer (value, dialog->initial_keys); break; case PROP_INITIAL_PATTERN: g_value_set_string (value, dialog->initial_pattern); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void select_key_dlg_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { SelectKeyDlg *dialog = SELECT_KEY_DLG (object); switch (prop_id) { case PROP_WINDOW: gtk_window_set_transient_for (GTK_WINDOW (dialog), g_value_get_object (value)); break; case PROP_PROTOCOL: dialog->protocol = g_value_get_int (value); break; case PROP_INITIAL_KEYS: dialog->initial_keys = (gpgme_key_t*)g_value_get_pointer (value); break; case PROP_INITIAL_PATTERN: dialog->initial_pattern = g_value_get_string (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void select_key_dlg_finalize (GObject *object) { SelectKeyDlg *dialog = SELECT_KEY_DLG (object); gpa_gpgme_release_keyarray (dialog->initial_keys); /* Fixme: Release the store. */ G_OBJECT_CLASS (parent_class)->finalize (object); } static void select_key_dlg_init (SelectKeyDlg *dialog) { } static GObject* select_key_dlg_constructor (GType type, guint n_construct_properties, GObjectConstructParam *construct_properties) { GObject *object; SelectKeyDlg *dialog; GtkWidget *vbox; GtkWidget *scroller; object = parent_class->constructor (type, n_construct_properties, construct_properties); dialog = SELECT_KEY_DLG (object); gpa_window_set_title (GTK_WINDOW (dialog), _("Select a key")); 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_response_sensitive (GTK_DIALOG (dialog), GTK_RESPONSE_OK, FALSE); gtk_container_set_border_width (GTK_CONTAINER (dialog), 5); // vbox = GTK_DIALOG (dialog)->vbox; - vbox = gtk_dialog_get_content_area(dialog); + vbox = gtk_dialog_get_content_area (GTK_DIALOG (dialog)); gtk_container_set_border_width (GTK_CONTAINER (vbox), 5); scroller = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroller), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_box_pack_start (GTK_BOX (vbox), scroller, TRUE, TRUE, 0); gtk_widget_set_size_request (scroller, 400, 200); /* Create the keylist and initialize if with our initial keys. Because we don't need them then anymore, release our own copy of the keys. */ dialog->keylist = gpa_keylist_new_with_keys (GTK_WIDGET (dialog), TRUE, dialog->protocol, dialog->initial_keys, dialog->initial_pattern, KEY_USAGE_ENCR, TRUE); gpa_gpgme_release_keyarray (dialog->initial_keys); dialog->initial_keys = NULL; gtk_container_add (GTK_CONTAINER (scroller), GTK_WIDGET(dialog->keylist)); g_signal_connect (G_OBJECT (gtk_tree_view_get_selection (GTK_TREE_VIEW (dialog->keylist))), "changed", G_CALLBACK (keylist_selection_changed_cb), dialog); return object; } static void select_key_dlg_class_init (SelectKeyDlgClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); parent_class = g_type_class_peek_parent (klass); object_class->constructor = select_key_dlg_constructor; object_class->finalize = select_key_dlg_finalize; object_class->set_property = select_key_dlg_set_property; object_class->get_property = select_key_dlg_get_property; g_object_class_install_property (object_class, PROP_WINDOW, g_param_spec_object ("window", "Parent window", "Parent window", GTK_TYPE_WIDGET, G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY)); g_object_class_install_property (object_class, PROP_PROTOCOL, g_param_spec_int ("protocol", "Protocol", "The gpgme protocol used to restruct the key listing.", GPGME_PROTOCOL_OpenPGP, GPGME_PROTOCOL_UNKNOWN, GPGME_PROTOCOL_UNKNOWN, G_PARAM_WRITABLE|G_PARAM_CONSTRUCT_ONLY)); g_object_class_install_property (object_class, PROP_INITIAL_KEYS, g_param_spec_pointer ("initial-keys", "Initial-keys", "An array of gpgme_key_t with the initial set of keys or NULL.", G_PARAM_WRITABLE|G_PARAM_CONSTRUCT_ONLY)); g_object_class_install_property (object_class, PROP_INITIAL_PATTERN, g_param_spec_string ("initial-pattern", "Initial-pattern", "A string with pattern to be used for the search boxor NULL.", NULL, G_PARAM_WRITABLE|G_PARAM_CONSTRUCT_ONLY)); } GType select_key_dlg_get_type (void) { static GType this_type; if (!this_type) { static const GTypeInfo this_info = { sizeof (SelectKeyDlgClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) select_key_dlg_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (SelectKeyDlg), 0, /* n_preallocs */ (GInstanceInitFunc) select_key_dlg_init, }; this_type = g_type_register_static (GTK_TYPE_DIALOG, "SelectKeyDlg", &this_info, 0); } return this_type; } /************************************************************ ********************** Public API ************************ ************************************************************/ SelectKeyDlg * select_key_dlg_new (GtkWidget *parent) { SelectKeyDlg *dialog; dialog = g_object_new (SELECT_KEY_DLG_TYPE, "window", parent, NULL); return dialog; } /* Same as select_key_dlg_new but with the options to select the protocol and to set initial keys and a search string. */ SelectKeyDlg * select_key_dlg_new_with_keys (GtkWidget *parent, gpgme_protocol_t protocol, gpgme_key_t *keys, const char *pattern) { SelectKeyDlg *dialog; dialog = g_object_new (SELECT_KEY_DLG_TYPE, "window", parent, "protocol", (int)protocol, "initial-keys", gpa_gpgme_copy_keyarray (keys), "initial-pattern", pattern, NULL); return dialog; } /* Return the selected key. */ gpgme_key_t select_key_dlg_get_key (SelectKeyDlg *dialog) { gpgme_key_t key; g_return_val_if_fail (dialog, NULL); g_return_val_if_fail (dialog->keylist, NULL); key = gpa_keylist_get_selected_key (dialog->keylist); return key; } /* Return an array of selected keys. FIXME: For now it returns only one key. */ gpgme_key_t * select_key_dlg_get_keys (SelectKeyDlg *dialog) { gpgme_key_t *keyarray; g_return_val_if_fail (dialog, NULL); g_return_val_if_fail (dialog->keylist, NULL); keyarray = g_new (gpgme_key_t, 1+1); keyarray[0] = gpa_keylist_get_selected_key (dialog->keylist); keyarray[1] = NULL; return keyarray; }