X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=src%2Fmoonshot-identity-management-view.vala;h=8033d75bf35dba463fbac4c3c86833ec54390422;hb=53078345094f06a685445bcf67181c7e25736a76;hp=2088e4927e5ad85bf28875e31e3b828fe6d26b01;hpb=d0edd0b035c19de4745e5e15eacaa73ae1df4565;p=moonshot-ui.git diff --git a/src/moonshot-identity-management-view.vala b/src/moonshot-identity-management-view.vala index 2088e49..8033d75 100644 --- a/src/moonshot-identity-management-view.vala +++ b/src/moonshot-identity-management-view.vala @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011-2014, JANET(UK) + * Copyright (c) 2011-2016, JANET(UK) * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -33,38 +33,33 @@ using Gee; using Gtk; public class IdentityManagerView : Window { - private const int WINDOW_WIDTH = 400; + static MoonshotLogger logger = get_logger("IdentityManagerView"); + + private const int WINDOW_WIDTH = 700; private const int WINDOW_HEIGHT = 500; protected IdentityManagerApp parent_app; -#if OS_MACOS - public OSXApplication osxApp; -#endif + #if OS_MACOS + public OSXApplication osxApp; + #endif private UIManager ui_manager = new UIManager(); private Entry search_entry; private VBox vbox_right; - private VBox login_vbox; - private VBox services_vbox; private CustomVBox custom_vbox; - private VBox services_internal_vbox; - - private Entry issuer_entry; - private Entry username_entry; - private Entry password_entry; - private Label prompting_service; + private VBox service_prompt_vbox; private Label no_identity_title; - private CheckButton remember_checkbutton; - private Button update_password_button; + private Button edit_button; + private Button remove_button; + private Button send_button; + private Gtk.ListStore* listmodel; private TreeModelFilter filter; - public IdentityManagerModel identities_manager; + internal IdentityManagerModel identities_manager; private unowned SList candidates; public GLib.Queue request_queue; - private HashTable service_button_map; - private enum Columns { IDCARD_COL, @@ -75,46 +70,39 @@ public class IdentityManagerView : Window { N_COLUMNS } - private const string layout = -"" + -" " + -" " + -" " + -" " + -" " + -"" + -" " + -" " + -" " + -""; + private const string menu_layout = + "" + + " " + + " " + + " " + + ""; public IdentityManagerView(IdentityManagerApp app) { - parent_app = app; -#if OS_MACOS - osxApp = OSXApplication.get_instance(); -#endif - identities_manager = parent_app.model; - request_queue = new GLib.Queue(); - service_button_map = new HashTable (direct_hash, direct_equal); - this.title = "Moonshot Identity Selector"; - this.set_position (WindowPosition.CENTER); - set_default_size (WINDOW_WIDTH, WINDOW_HEIGHT); - build_ui(); - setup_list_model(); - load_id_cards(); - connect_signals(); + parent_app = app; + #if OS_MACOS + osxApp = OSXApplication.get_instance(); + #endif + identities_manager = parent_app.model; + request_queue = new GLib.Queue(); + this.title = "Moonshot Identity Selector"; + this.set_position(WindowPosition.CENTER); + set_default_size(WINDOW_WIDTH, WINDOW_HEIGHT); + build_ui(); + setup_list_model(); + load_id_cards(); + connect_signals(); } - public void on_card_list_changed () { + public void on_card_list_changed() { load_id_cards(); } - private bool visible_func (TreeModel model, TreeIter iter) + private bool visible_func(TreeModel model, TreeIter iter) { IdCard id_card; - model.get (iter, - Columns.IDCARD_COL, out id_card); + model.get(iter, + Columns.IDCARD_COL, out id_card); if (id_card == null) return false; @@ -131,7 +119,7 @@ public class IdentityManagerView : Window { return false; } - string entry_text = search_entry.get_text (); + string entry_text = search_entry.get_text(); if (entry_text == null || entry_text == "") { return true; @@ -143,21 +131,21 @@ public class IdentityManagerView : Window { continue; - string search_text_casefold = search_text.casefold (); + string search_text_casefold = search_text.casefold(); if (id_card.issuer != null) { - string issuer_casefold = id_card.issuer; + string issuer_casefold = id_card.issuer; - if (issuer_casefold.contains (search_text_casefold)) - return true; + if (issuer_casefold.contains(search_text_casefold)) + return true; } if (id_card.display_name != null) { - string display_name_casefold = id_card.display_name.casefold (); + string display_name_casefold = id_card.display_name.casefold(); - if (display_name_casefold.contains (search_text_casefold)) + if (display_name_casefold.contains(search_text_casefold)) return true; } @@ -165,9 +153,9 @@ public class IdentityManagerView : Window { { foreach (string service in id_card.services) { - string service_casefold = service.casefold (); + string service_casefold = service.casefold(); - if (service_casefold.contains (search_text_casefold)) + if (service_casefold.contains(search_text_casefold)) return true; } } @@ -175,84 +163,61 @@ public class IdentityManagerView : Window { return false; } - private void setup_list_model () + private void setup_list_model() { - this.listmodel = new Gtk.ListStore (Columns.N_COLUMNS, typeof (IdCard), - typeof (Gdk.Pixbuf), - typeof (string), - typeof (string), - typeof (string)); - this.filter = new TreeModelFilter (listmodel, null); + this.listmodel = new Gtk.ListStore(Columns.N_COLUMNS, typeof(IdCard), + typeof(Gdk.Pixbuf), + typeof(string), + typeof(string), + typeof(string)); + this.filter = new TreeModelFilter(listmodel, null); - filter.set_visible_func (visible_func); + filter.set_visible_func(visible_func); } - private void search_entry_icon_press_cb (EntryIconPosition pos, Gdk.Event event) + private void search_entry_icon_press_cb(EntryIconPosition pos, Gdk.Event event) { if (pos == EntryIconPosition.PRIMARY) { - print ("Search entry icon pressed\n"); + print("Search entry icon pressed\n"); } else { - this.search_entry.set_text (""); + this.search_entry.set_text(""); } } - private void search_entry_text_changed_cb () + private void search_entry_text_changed_cb() { - this.filter.refilter (); - redraw_id_card_widgets (); - - var has_text = this.search_entry.get_text_length () > 0; - this.search_entry.set_icon_sensitive (EntryIconPosition.PRIMARY, has_text); - this.search_entry.set_icon_sensitive (EntryIconPosition.SECONDARY, has_text); + this.filter.refilter(); + redraw_id_card_widgets(); - this.vbox_right.set_visible (false); + var has_text = this.search_entry.get_text_length() > 0; + this.search_entry.set_icon_sensitive(EntryIconPosition.PRIMARY, has_text); + this.search_entry.set_icon_sensitive(EntryIconPosition.SECONDARY, has_text); } - private bool search_entry_key_press_event_cb (Gdk.EventKey e) + private bool search_entry_key_press_event_cb(Gdk.EventKey e) { if(Gdk.keyval_name(e.keyval) == "Escape") - this.search_entry.set_text(""); + this.search_entry.set_text(""); // Continue processing this event, since the // text entry functionality needs to see it too. return false; } - private void update_password_cb() - { - if (this.custom_vbox.current_idcard != null) { - var identity = this.custom_vbox.current_idcard.id_card; - var dialog = new AddPasswordDialog(identity, null); - var result = dialog.run (); - - switch (result) { - case ResponseType.OK: - identity.password = dialog.password; - identity.store_password = dialog.remember; - if (dialog.remember) - identity.temporary = false; - identity = identities_manager.update_card(identity); - break; - default: - break; - } - dialog.destroy (); - } - } + private void load_id_cards() { + logger.trace("load_id_cards"); - private void load_id_cards () { string current_idcard_nai = null; if (this.custom_vbox.current_idcard != null) { current_idcard_nai = custom_vbox.current_idcard.id_card.nai; custom_vbox.current_idcard = null; } - var children = this.custom_vbox.get_children (); - foreach (var id_card_widget in children) { - remove_id_card_widget((IdCardWidget)id_card_widget); - } + var children = this.custom_vbox.get_children(); + + custom_vbox.clear(); this.listmodel->clear(); LinkedList card_list = identities_manager.get_card_list() ; if (card_list == null) { @@ -260,79 +225,34 @@ public class IdentityManagerView : Window { } foreach (IdCard id_card in card_list) { - add_id_card_data (id_card); - IdCardWidget id_card_widget = add_id_card_widget (id_card); + add_id_card_data(id_card); + IdCardWidget id_card_widget = add_id_card_widget(id_card); if (id_card_widget.id_card.nai == current_idcard_nai) { - fill_details(id_card_widget); + // fill_details(id_card_widget.id_card); id_card_widget.expand(); } } - if (custom_vbox.current_idcard == null) - fill_details(null); } - private void fill_details (IdCardWidget? id_card_widget) - { - var vr_children = this.vbox_right.get_children(); - foreach (var vr_child in vr_children) - this.vbox_right.remove(vr_child); - if (id_card_widget != null) { - var id_card = id_card_widget.id_card; - if (id_card.display_name == IdCard.NO_IDENTITY) { - this.vbox_right.pack_start(no_identity_title, false, true, 0); - } else { - this.issuer_entry.set_text (id_card.issuer); - this.username_entry.set_text (id_card.username); - this.password_entry.set_text (id_card.password ?? ""); - this.vbox_right.pack_start(login_vbox, false, true, 0); - this.remember_checkbutton.active = id_card.store_password; - } - this.vbox_right.pack_start (services_vbox, false, true, 0); - - var children = this.services_internal_vbox.get_children (); - foreach (var hbox in children) - services_internal_vbox.remove(hbox); - fill_services_vbox (id_card_widget.id_card); - } - } - - private void show_details (IdCard id_card) - { - this.vbox_right.set_visible (!vbox_right.get_visible ()); - - if (this.vbox_right.get_visible () == false) - { - this.resize (WINDOW_WIDTH, WINDOW_HEIGHT); - } - } - - private void details_identity_cb (IdCardWidget id_card_widget) - { - fill_details (id_card_widget); - show_details (id_card_widget.id_card); - } - - private IdCard get_id_card_data (AddIdentityDialog dialog) + private IdCard update_id_card_data(IdentityDialog dialog, IdCard id_card) { - var id_card = new IdCard (); - id_card.display_name = dialog.display_name; id_card.issuer = dialog.issuer; id_card.username = dialog.username; id_card.password = dialog.password; id_card.store_password = dialog.store_password; - id_card.services = {}; + id_card.services = dialog.get_services(); return id_card; } - private void add_id_card_data (IdCard id_card) + private void add_id_card_data(IdCard id_card) { TreeIter iter; Gdk.Pixbuf pixbuf; - this.listmodel->append (out iter); + this.listmodel->append(out iter); pixbuf = get_pixbuf(id_card); - listmodel->set (iter, + listmodel->set(iter, Columns.IDCARD_COL, id_card, Columns.LOGO_COL, pixbuf, Columns.ISSUER_COL, id_card.issuer, @@ -340,191 +260,233 @@ public class IdentityManagerView : Window { Columns.PASSWORD_COL, id_card.password); } - private void remove_id_card_data (IdCard id_card) + private void remove_id_card_data(IdCard id_card) { TreeIter iter; string issuer; - if (listmodel->get_iter_first (out iter)) + if (listmodel->get_iter_first(out iter)) { do { - listmodel->get (iter, + listmodel->get(iter, Columns.ISSUER_COL, out issuer); if (id_card.issuer == issuer) { - listmodel->remove (iter); + listmodel->remove(iter); break; } } - while (listmodel->iter_next (ref iter)); + while (listmodel->iter_next(ref iter)); } } - private IdCardWidget add_id_card_widget (IdCard id_card) + private IdCardWidget add_id_card_widget(IdCard id_card) { - var id_card_widget = new IdCardWidget (id_card); - this.custom_vbox.add_id_card_widget (id_card_widget); - id_card_widget.details_id.connect (details_identity_cb); - id_card_widget.remove_id.connect (remove_identity_cb); - id_card_widget.send_id.connect ((w) => send_identity_cb (w.id_card)); - id_card_widget.expanded.connect (this.custom_vbox.receive_expanded_event); - id_card_widget.expanded.connect (fill_details); + var id_card_widget = new IdCardWidget(id_card); + this.custom_vbox.add_id_card_widget(id_card_widget); + id_card_widget.expanded.connect(this.widget_selected_cb); return id_card_widget; } - public bool add_identity (IdCard id_card, bool force_flat_file_store) + private void widget_selected_cb(IdCardWidget id_card_widget) { -#if OS_MACOS + this.remove_button.set_sensitive(true); + this.edit_button.set_sensitive(true); + this.custom_vbox.receive_expanded_event(id_card_widget); + + if (this.request_queue.length > 0) + this.send_button.set_sensitive(true); + } + + public bool add_identity(IdCard id_card, bool force_flat_file_store) + { + #if OS_MACOS /* * TODO: We should have a confirmation dialog, but currently it will crash on Mac OS * so for now we will install silently */ var ret = Gtk.ResponseType.YES; -#else + #else Gtk.MessageDialog dialog; IdCard? prev_id = identities_manager.find_id_card(id_card.nai, force_flat_file_store); + logger.trace("add_identity: find_id_card returned " + (prev_id != null ? "non-null" : "null")); if (prev_id!=null) { int flags = prev_id.Compare(id_card); + logger.trace("add_identity: compare returned " + flags.to_string()); if (flags == 0) { return false; // no changes, no need to update - } else if ((flags & (1<You are about to remove the identity '%s'." + .printf(id_card.display_name) + + "\n\nAre you sure you want to do this?", + "delete_idcard"); + if (remove) + remove_identity(id_card_widget); + } + + private void set_prompting_service(string service) + { + clear_selection_prompts(); + + var prompting_service = new Label(_("Identity requested for service:\n%s").printf(service)); + prompting_service.set_line_wrap(true); + + // left-align + prompting_service.set_alignment(0, (float )0.5); + + var selection_prompt = new Label(_("Select your identity:")); + selection_prompt.set_alignment(0, 1); + + this.service_prompt_vbox.pack_start(prompting_service, false, false, 12); + this.service_prompt_vbox.pack_start(selection_prompt, false, false, 2); + this.service_prompt_vbox.show_all(); } - public void set_prompting_service(string service) + private void clear_selection_prompts() { - prompting_service.set_label( _("Identity requested for service: %s").printf(service) ); + var list = service_prompt_vbox.get_children(); + foreach (Widget w in list) + { + service_prompt_vbox.remove(w); + } } + public void queue_identity_request(IdentityRequest request) { if (this.request_queue.is_empty()) { /* setup widgets */ candidates = request.candidates; filter.refilter(); - redraw_id_card_widgets (); + redraw_id_card_widgets(); set_prompting_service(request.service); make_visible(); } - this.request_queue.push_tail (request); + this.request_queue.push_tail(request); } /** Makes the window visible, or at least, notifies the user that the window - * wants to be visible. - * - * This differs from show() in that show() does not guarantee that the - * window will be moved to the foreground. Actually, neither does this - * method, because the user's settings and window manager may affect the - * behavior significantly. - */ + * wants to be visible. + * + * This differs from show() in that show() does not guarantee that the + * window will be moved to the foreground. Actually, neither does this + * method, because the user's settings and window manager may affect the + * behavior significantly. + */ public void make_visible() { set_urgency_hint(true); @@ -541,8 +503,8 @@ public class IdentityManagerView : Window { identity.password = request.password; retval = model.update_card(identity); } else { - var dialog = new AddPasswordDialog (identity, request); - var result = dialog.run (); + var dialog = new AddPasswordDialog(identity, request); + var result = dialog.run(); switch (result) { case ResponseType.OK: @@ -556,28 +518,28 @@ public class IdentityManagerView : Window { identity = null; break; } - dialog.destroy (); + dialog.destroy(); } } return retval; } - public void send_identity_cb (IdCard id) + private void send_identity_cb(IdCard id) { IdCard identity = id; - return_if_fail (request_queue.length > 0); + return_if_fail(request_queue.length > 0); - candidates = null; - var request = this.request_queue.pop_head (); + candidates = null; + var request = this.request_queue.pop_head(); identity = check_add_password(identity, request, identities_manager); if (this.request_queue.is_empty()) { candidates = null; - prompting_service.set_label(_("")); + clear_selection_prompts(); if (!parent_app.explicitly_launched) { // The following occasionally causes the app to exit without sending the dbus // reply, so for now we just don't exit -// Gtk.main_quit (); +// Gtk.main_quit(); // just hide instead this.hide(); } @@ -587,113 +549,35 @@ public class IdentityManagerView : Window { set_prompting_service(next.service); } filter.refilter(); - redraw_id_card_widgets (); + redraw_id_card_widgets(); if ((identity != null) && (!identity.IsNoIdentity())) parent_app.default_id_card = identity; - request.return_identity (identity); + request.return_identity(identity); } - private void label_make_bold (Label label) - { - var font_desc = new Pango.FontDescription (); + // private void label_make_bold(Label label) + // { + // var font_desc = new Pango.FontDescription(); - font_desc.set_weight (Pango.Weight.BOLD); + // font_desc.set_weight(Pango.Weight.BOLD); - /* This will only affect the weight of the font, the rest is - * from the current state of the widget, which comes from the - * theme or user prefs, since the font desc only has the - * weight flag turned on. - */ - label.modify_font (font_desc); - } - - private void fill_services_vbox (IdCard id_card) - { - int i = 0; - var n_columns = id_card.services.length; - - var services_table = new Table (n_columns, 2, false); - services_table.set_col_spacings (10); - services_table.set_row_spacings (10); - this.services_internal_vbox.add (services_table); - - service_button_map.remove_all (); - - foreach (string service in id_card.services) - { - var label = new Label (service); - label.set_alignment (0, (float) 0.5); -#if VALA_0_12 - var remove_button = new Button.from_stock (Stock.REMOVE); -#else - var remove_button = new Button.from_stock (STOCK_REMOVE); -#endif - - - service_button_map.insert (remove_button, service); - - remove_button.clicked.connect ((remove_button) => - { - var candidate = service_button_map.lookup (remove_button); - if (candidate == null) - return; - var dialog = new Gtk.MessageDialog (this, - Gtk.DialogFlags.DESTROY_WITH_PARENT, - Gtk.MessageType.QUESTION, - Gtk.ButtonsType.YES_NO, - _("Are you sure you want to stop '%s' ID Card from being used with %s?"), - custom_vbox.current_idcard.id_card.display_name, - candidate); - var ret = dialog.run(); - dialog.hide(); - - if (ret == Gtk.ResponseType.YES) - { - IdCard idcard = custom_vbox.current_idcard.id_card; - if (idcard != null) { - SList services = new SList(); - - foreach (string srv in idcard.services) - { - if (srv == candidate) - continue; - services.append (srv); - } - - idcard.services = new string[services.length()]; - for (int j=0; j", - "Sam Thursfield ", - "Alberto Ruiz ", - null - }; - - string copyright = "Copyright 2011 JANET"; + string copyright = "Copyright 2011, 2016 JANET"; string license = -""" -Copyright (c) 2011, JANET(UK) + """ +Copyright (c) 2011, 2016 JANET(UK) All rights reserved. Redistribution and use in source and binary forms, with or without @@ -724,61 +608,32 @@ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. """; - Gtk.show_about_dialog (this, - "comments", _("Moonshot project UI"), - "copyright", copyright, - "website", Config.PACKAGE_URL, - "version", Config.PACKAGE_VERSION, - "license", license, - "website-label", _("Visit the Moonshot project web site"), - "authors", authors, - "translator-credits", _("translator-credits"), - null - ); + Gtk.show_about_dialog(this, + "comments", _("Moonshot project UI"), + "copyright", copyright, + "website", Config.PACKAGE_URL, + "version", Config.PACKAGE_VERSION, + "license", license, + "website-label", _("Visit the Moonshot project web site"), + "translator-credits", _("translator-credits"), + null + ); } private Gtk.ActionEntry[] create_actions() { Gtk.ActionEntry[] actions = new Gtk.ActionEntry[0]; - Gtk.ActionEntry filemenu = { "FileMenuAction", - null, - N_("_File"), - null, null, null }; - actions += filemenu; - Gtk.ActionEntry add = { "AddIdCardAction", -#if VALA_0_12 - Stock.ADD, -#else - STOCK_ADD, -#endif - N_("Add ID Card"), - null, - N_("Add a new ID Card"), - add_identity_manual_cb }; - actions += add; - Gtk.ActionEntry quit = { "QuitAction", -#if VALA_0_12 - Stock.QUIT, -#else - STOCK_QUIT, -#endif - N_("Quit"), - "Q", - N_("Quit the application"), - Gtk.main_quit }; - actions += quit; - Gtk.ActionEntry helpmenu = { "HelpMenuAction", null, N_("_Help"), null, null, null }; actions += helpmenu; Gtk.ActionEntry about = { "AboutAction", -#if VALA_0_12 + #if VALA_0_12 Stock.ABOUT, -#else + #else STOCK_ABOUT, -#endif + #endif N_("About"), null, N_("About this application"), @@ -789,180 +644,173 @@ SUCH DAMAGE. } - private void create_ui_manager () + private void create_ui_manager() { - Gtk.ActionGroup action_group = new Gtk.ActionGroup ("GeneralActionGroup"); - action_group.add_actions (create_actions (), this); - ui_manager.insert_action_group (action_group, 0); + Gtk.ActionGroup action_group = new Gtk.ActionGroup("GeneralActionGroup"); + action_group.add_actions(create_actions(), this); + ui_manager.insert_action_group(action_group, 0); try { - ui_manager.add_ui_from_string (layout, -1); + ui_manager.add_ui_from_string(menu_layout, -1); } catch (Error e) { - stderr.printf ("%s\n", e.message); + stderr.printf("%s\n", e.message); + logger.error("create_ui_manager: Caught error: " + e.message); } - ui_manager.ensure_update (); + ui_manager.ensure_update(); } private void build_ui() { - create_ui_manager (); + // Note: On Debian7/Gtk+2, the menu bar remains gray. This doesn't happen on Debian8/Gtk+3. + Gdk.Color white = Gdk.Color(); + white.red = white.green = white.blue = 65535; + this.modify_bg(StateType.NORMAL, white); + + create_ui_manager(); this.search_entry = new Entry(); - set_atk_name_description (search_entry, _("Search entry"), _("Search for a specific ID Card")); - this.search_entry.set_icon_from_pixbuf (EntryIconPosition.PRIMARY, - find_icon_sized ("edit-find", Gtk.IconSize.MENU)); -// find_icon_sized ("edit-find-symbolic", Gtk.IconSize.MENU)); - this.search_entry.set_icon_tooltip_text (EntryIconPosition.PRIMARY, - _("Search identity or service")); - this.search_entry.set_icon_sensitive (EntryIconPosition.PRIMARY, false); + set_atk_name_description(search_entry, _("Search entry"), _("Search for a specific ID Card")); + this.search_entry.set_icon_from_pixbuf(EntryIconPosition.PRIMARY, + find_icon_sized("edit-find", Gtk.IconSize.MENU)); + this.search_entry.set_icon_tooltip_text(EntryIconPosition.PRIMARY, + _("Search for an identity or service")); + this.search_entry.set_icon_sensitive(EntryIconPosition.PRIMARY, false); - this.search_entry.set_icon_from_pixbuf (EntryIconPosition.SECONDARY, - find_icon_sized ("process-stop", Gtk.IconSize.MENU)); -// find_icon_sized ("edit-clear-symbolic", Gtk.IconSize.MENU)); - this.search_entry.set_icon_tooltip_text (EntryIconPosition.SECONDARY, - _("Clear the current search")); - this.search_entry.set_icon_sensitive (EntryIconPosition.SECONDARY, false); + this.search_entry.set_icon_from_pixbuf(EntryIconPosition.SECONDARY, + find_icon_sized("process-stop", Gtk.IconSize.MENU)); + this.search_entry.set_icon_tooltip_text(EntryIconPosition.SECONDARY, + _("Clear the current search")); + this.search_entry.set_icon_sensitive(EntryIconPosition.SECONDARY, false); - this.search_entry.icon_press.connect (search_entry_icon_press_cb); - this.search_entry.notify["text"].connect (search_entry_text_changed_cb); + this.search_entry.icon_press.connect(search_entry_icon_press_cb); + this.search_entry.notify["text"].connect(search_entry_text_changed_cb); this.search_entry.key_press_event.connect(search_entry_key_press_event_cb); - - this.custom_vbox = new CustomVBox (this, false, 6); - - var viewport = new Viewport (null, null); - viewport.set_border_width (6); - viewport.set_shadow_type (ShadowType.NONE); - viewport.add (custom_vbox); - var scroll = new ScrolledWindow (null, null); - scroll.set_policy (PolicyType.NEVER, PolicyType.AUTOMATIC); - scroll.set_shadow_type (ShadowType.IN); - scroll.add_with_viewport (viewport); - this.prompting_service = new Label (_("")); - // left-align - prompting_service.set_alignment(0, (float )0.5); - - var vbox_left = new VBox (false, 0); - vbox_left.pack_start (search_entry, false, false, 6); - vbox_left.pack_start (scroll, true, true, 0); - vbox_left.pack_start (prompting_service, false, false, 6); - vbox_left.set_size_request (WINDOW_WIDTH, 0); - - this.no_identity_title = new Label (_("No Identity: Send this identity to services which should not use Moonshot")); + this.search_entry.set_width_chars(30); + + + this.custom_vbox = new CustomVBox(this, false, 2); + + var viewport = new Viewport(null, null); + viewport.set_border_width(2); + viewport.set_shadow_type(ShadowType.NONE); + viewport.add(custom_vbox); + var id_scrollwin = new ScrolledWindow(null, null); + id_scrollwin.set_policy(PolicyType.NEVER, PolicyType.AUTOMATIC); + id_scrollwin.set_shadow_type(ShadowType.IN); + id_scrollwin.add_with_viewport(viewport); + + service_prompt_vbox = new VBox(false, 0); + + var vbox_left = new VBox(false, 0); + vbox_left.pack_start(service_prompt_vbox, false, false, 12); + + var search_hbox = new HBox(false, 6); + search_hbox.pack_end(search_entry, false, false, 0); + //// var search_label = new Label(_("Search:")); + //// search_label.set_alignment(1, (float) 0.5); + //// set_atk_relation(search_label, search_entry, Atk.RelationType.LABEL_FOR); + //// search_hbox.pack_end(search_label, false, false, 6); + + var full_search_label = new Label(_("Search for an identity or service")); + full_search_label.set_alignment(1, 0); + var search_vbox = new VBox(false, 4); + search_vbox.pack_start(full_search_label, false, false, 0); + search_vbox.pack_start(search_hbox, false, false, 0); + + var inner_left_vbox = new VBox(false, 6); + inner_left_vbox.pack_start(search_vbox, false, false, 6); +// inner_left_vbox.pack_start(selection_prompt, false, false, 6); + inner_left_vbox.pack_start(id_scrollwin, true, true, 0); + + var id_and_button_box = new HBox(false, 6); + id_and_button_box.pack_start(inner_left_vbox, true, true, 6); + vbox_left.pack_start(id_and_button_box, true, true, 0); + // vbox_left.pack_start(prompting_service, false, false, 6); + vbox_left.set_size_request(WINDOW_WIDTH, 0); + + this.no_identity_title = new Label(_("No Identity: Send this identity to services which should not use Moonshot")); no_identity_title.set_alignment(0, (float ) 0.5); no_identity_title.set_line_wrap(true); no_identity_title.show(); - var login_vbox_title = new Label (_("Login: ")); - label_make_bold (login_vbox_title); - login_vbox_title.set_alignment (0, (float) 0.5); - var issuer_label = new Label (_("Issuer:")); - issuer_label.set_alignment (1, (float) 0.5); - this.issuer_entry = new Entry (); - issuer_entry.set_can_focus (false); - var username_label = new Label (_("Username:")); - username_label.set_alignment (1, (float) 0.5); - this.username_entry = new Entry (); - username_entry.set_can_focus (false); - var password_label = new Label (_("Password:")); - password_label.set_alignment (1, (float) 0.5); - this.password_entry = new Entry (); - password_entry.set_invisible_char ('*'); - password_entry.set_visibility (false); - password_entry.set_sensitive (false); - this.remember_checkbutton = new CheckButton.with_label (_("Remember password")); - remember_checkbutton.set_sensitive(false); - this.update_password_button = new Button.with_label (_("Update Password")); - this.update_password_button.clicked.connect(update_password_cb); - - set_atk_relation (issuer_label, issuer_entry, Atk.RelationType.LABEL_FOR); - set_atk_relation (username_label, username_entry, Atk.RelationType.LABEL_FOR); - set_atk_relation (password_entry, password_entry, Atk.RelationType.LABEL_FOR); - - var login_table = new Table (5, 2, false); - login_table.set_col_spacings (10); - login_table.set_row_spacings (10); - login_table.attach_defaults (issuer_label, 0, 1, 0, 1); - login_table.attach_defaults (issuer_entry, 1, 2, 0, 1); - login_table.attach_defaults (username_label, 0, 1, 1, 2); - login_table.attach_defaults (username_entry, 1, 2, 1, 2); - login_table.attach_defaults (password_label, 0, 1, 2, 3); - login_table.attach_defaults (password_entry, 1, 2, 2, 3); - login_table.attach_defaults (remember_checkbutton, 1, 2, 3, 4); - login_table.attach_defaults (update_password_button, 0, 1, 4, 5); - var login_vbox_alignment = new Alignment (0, 0, 0, 0); - login_vbox_alignment.set_padding (0, 0, 12, 0); - login_vbox_alignment.add (login_table); - this.login_vbox = new VBox (false, 6); - login_vbox.pack_start (login_vbox_title, false, true, 0); - login_vbox.pack_start (login_vbox_alignment, false, true, 0); - - var services_vbox_title = new Label (_("Services:")); - label_make_bold (services_vbox_title); - services_vbox_title.set_alignment (0, (float) 0.5); - var services_vbox_alignment = new Alignment (0, 0, 0, 0); - services_vbox_alignment.set_padding (0, 0, 12, 0); - this.services_internal_vbox = new VBox (true, 6); - services_vbox_alignment.add (services_internal_vbox); - this.services_vbox = new VBox (false, 6); - services_vbox.pack_start (services_vbox_title, false, true, 0); - services_vbox.pack_start (services_vbox_alignment, false, true, 0); - - this.vbox_right = new VBox (false, 18); - vbox_right.pack_start (login_vbox, false, true, 0); - vbox_right.pack_start (services_vbox, false, true, 0); - - var hbox = new HBox (false, 12); - hbox.pack_start (vbox_left, false, false, 0); - hbox.pack_start (vbox_right, true, true, 0); - - var main_vbox = new VBox (false, 0); - main_vbox.set_border_width (12); - + this.vbox_right = new VBox(false, 6); + + var add_button = new Button.with_label(_("Add")); + add_button.clicked.connect((w) => {add_identity_cb();}); + + this.edit_button = new Button.with_label(_("Edit")); + edit_button.clicked.connect((w) => {edit_identity_cb(custom_vbox.current_idcard.id_card);}); + edit_button.set_sensitive(false); + + this.remove_button = new Button.with_label(_("Remove")); + remove_button.clicked.connect((w) => {remove_identity_cb(custom_vbox.current_idcard);}); + remove_button.set_sensitive(false); + + send_button = new Button.with_label(_("Send")); + send_button.clicked.connect((w) => {send_identity_cb(custom_vbox.current_idcard.id_card);}); + // send_button.set_visible(false); + send_button.set_sensitive(false); + + var empty_box = new VBox(false, 0); + empty_box.set_size_request(0, 0); + vbox_right.pack_start(empty_box, false, false, 14); + vbox_right.pack_start(add_button, false, false, 6); + vbox_right.pack_start(edit_button, false, false, 6); + vbox_right.pack_start(remove_button, false, false, 6); + vbox_right.pack_start(send_button, false, false, 24); + + id_and_button_box.pack_start(vbox_right, false, false, 0); + + var main_vbox = new VBox(false, 0); + + // Note: This places a border above the menubar. Is that what we want? + main_vbox.set_border_width(12); + #if OS_MACOS // hide the File | Quit menu item which is now on the Mac Menu - Gtk.Widget quit_item = this.ui_manager.get_widget("/MenuBar/FileMenu/Quit"); - quit_item.hide(); +// Gtk.Widget quit_item = this.ui_manager.get_widget("/MenuBar/FileMenu/Quit"); +// quit_item.hide(); - Gtk.MenuShell menushell = this.ui_manager.get_widget("/MenuBar") as Gtk.MenuShell; - osxApp.set_menu_bar(menushell); - osxApp.set_use_quartz_accelerators(true); - osxApp.sync_menu_bar(); - osxApp.ready(); + Gtk.MenuShell menushell = this.ui_manager.get_widget("/MenuBar") as Gtk.MenuShell; + menushell.modify_bg(StateType.NORMAL, white); + + osxApp.set_menu_bar(menushell); + osxApp.set_use_quartz_accelerators(true); + osxApp.sync_menu_bar(); + osxApp.ready(); #else - var menubar = this.ui_manager.get_widget ("/MenuBar"); - main_vbox.pack_start (menubar, false, false, 0); + var menubar = this.ui_manager.get_widget("/MenuBar"); + main_vbox.pack_start(menubar, false, false, 0); + menubar.modify_bg(StateType.NORMAL, white); #endif - main_vbox.pack_start (hbox, true, true, 0); - add (main_vbox); + main_vbox.pack_start(vbox_left, true, true, 0); + add(main_vbox); main_vbox.show_all(); - this.vbox_right.hide (); - } + } - private void set_atk_name_description (Widget widget, string name, string description) + private void set_atk_name_description(Widget widget, string name, string description) { - var atk_widget = widget.get_accessible (); + var atk_widget = widget.get_accessible(); - atk_widget.set_name (name); - atk_widget.set_description (description); + atk_widget.set_name(name); + atk_widget.set_description(description); } private void connect_signals() { - this.destroy.connect (Gtk.main_quit); + this.destroy.connect(Gtk.main_quit); this.identities_manager.card_list_changed.connect(this.on_card_list_changed); } - private static void set_atk_relation (Widget widget, Widget target_widget, Atk.RelationType relationship) + private static void set_atk_relation(Widget widget, Widget target_widget, Atk.RelationType relationship) { - var atk_widget = widget.get_accessible (); - var atk_target_widget = target_widget.get_accessible (); + var atk_widget = widget.get_accessible(); + var atk_target_widget = target_widget.get_accessible(); - atk_widget.add_relationship (relationship, atk_target_widget); + atk_widget.add_relationship(relationship, atk_target_widget); } } - -