Require minimal set of fields when adding a new card. LP 1240008
[moonshot-ui.git] / src / moonshot-add-dialog.vala
1 using Gtk;
2
3 class AddIdentityDialog : Dialog
4 {
5     static const string displayname_labeltext = _("Display Name");
6     static const string issuer_labeltext = _("Issuer");
7     static const string username_labeltext = _("Username");
8     static const string password_labeltext = _("Password");
9     private Entry displayname_entry;
10     private Label displayname_label;
11     private Entry issuer_entry;
12     private Label issuer_label;
13     private Entry username_entry;
14     private Label username_label;
15     private Entry password_entry;
16     private Label password_label;
17     private CheckButton remember_checkbutton;
18     private Label message_label;
19     public bool complete;
20     
21     public string display_name {
22         get { return displayname_entry.get_text(); }
23     }
24
25     public string issuer {
26         get { return issuer_entry.get_text (); }
27     }
28
29      public string username {
30         get { return username_entry.get_text (); }
31     }
32
33     public string password {
34         get { return password_entry.get_text (); }
35     }
36
37     public bool store_password {
38         get { return remember_checkbutton.active; }
39     }
40
41     public AddIdentityDialog ()
42     {
43         this.set_title (_("Add ID Card"));
44         this.set_modal (true);
45
46         this.add_buttons (_("Add ID Card"), ResponseType.OK,
47 #if VALA_0_12
48                           Stock.CANCEL, ResponseType.CANCEL);
49 #else
50                           STOCK_CANCEL, ResponseType.CANCEL);
51 #endif
52
53         var content_area = this.get_content_area ();
54         ((Box) content_area).set_spacing (12);
55         
56         displayname_label = new Label (@"$displayname_labeltext:");
57         displayname_label.set_alignment (1, (float) 0.5);
58         displayname_entry = new Entry ();
59         issuer_label = new Label (@"$issuer_labeltext:");
60         issuer_label.set_alignment (1, (float) 0.5);
61         this.issuer_entry = new Entry ();
62         username_label = new Label (@"$username_labeltext:");
63         username_label.set_alignment (1, (float) 0.5);
64         this.username_entry = new Entry ();
65         password_label = new Label (@"$password_labeltext:");
66         password_label.set_alignment (1, (float) 0.5);
67         this.password_entry = new Entry ();
68         password_entry.set_invisible_char ('*');
69         password_entry.set_visibility (false);
70         this.remember_checkbutton = new CheckButton.with_label (_("Remember password"));
71         this.message_label = new Label("");
72         message_label.set_visible(false);
73
74         set_atk_relation (displayname_label, displayname_entry, Atk.RelationType.LABEL_FOR);
75         set_atk_relation (issuer_label, issuer_entry, Atk.RelationType.LABEL_FOR);
76         set_atk_relation (username_label, username_entry, Atk.RelationType.LABEL_FOR);
77         set_atk_relation (password_entry, password_entry, Atk.RelationType.LABEL_FOR);
78
79         var table = new Table (6, 2, false);
80         table.set_col_spacings (10);
81         table.set_row_spacings (10);
82         
83         table.attach_defaults (message_label, 0, 2, 0, 1);
84         table.attach_defaults (displayname_label, 0, 1, 1, 2);
85         table.attach_defaults (displayname_entry, 1, 2, 1, 2);
86         table.attach_defaults (issuer_label, 0, 1, 2, 3);
87         table.attach_defaults (issuer_entry, 1, 2, 2, 3);
88         table.attach_defaults (username_label, 0, 1, 3, 4);
89         table.attach_defaults (username_entry, 1, 2, 3, 4);
90         table.attach_defaults (password_label, 0, 1, 4, 5);
91         table.attach_defaults (password_entry, 1, 2, 4, 5);
92         table.attach_defaults (remember_checkbutton,  1, 2, 5, 6);
93
94         this.response.connect(on_response);
95         var vbox = new VBox (false, 0);
96         vbox.set_border_width (6);
97         vbox.pack_start (table, false, false, 0);
98
99         ((Container) content_area).add (vbox);
100
101         this.set_border_width (6);
102         this.set_resizable (false);
103         this.show_all ();
104     }
105
106     private static string update_preamble(string preamble)
107     {
108         if (preamble == "")
109             return _("Missing required field: ");
110         return _("Missing required fields: ");
111     }
112
113     private static string update_message(string old_message, string new_item)
114     {
115         string message;
116         if (old_message == "")
117             message = new_item;
118         else
119             message = old_message + ", " + new_item;
120         return message;
121     }
122
123     private static void check_field(string field, Label label, string fieldname, ref string preamble, ref string message)
124     {
125         if (field != "") {
126             label.set_markup(@"$fieldname:");
127             return;
128         }
129         label.set_markup(@"<span foreground=\"red\">$fieldname:</span>");
130         preamble = update_preamble(preamble);
131         message = update_message(message, fieldname);
132     }
133
134     private bool check_fields()
135     {
136         string preamble = "";
137         string message = "";
138         string password_test = store_password ? password : "not required";
139         check_field(display_name, displayname_label, displayname_labeltext, ref preamble, ref message);
140         check_field(issuer, issuer_label, issuer_labeltext, ref preamble, ref message);
141         check_field(username, username_label, username_labeltext, ref preamble, ref message);
142         check_field(password_test, password_label, password_labeltext, ref preamble, ref message);
143         if (message != "") {
144             message_label.set_visible(true);
145             message_label.set_markup(@"<span foreground=\"red\">$preamble$message</span>");
146             return false;
147         }
148         return true;
149     }
150
151     private void on_response (Dialog source, int response_id)
152     {
153         switch (response_id) {
154         case ResponseType.OK:
155             complete = check_fields();
156             break;
157         case ResponseType.CANCEL:
158             complete = true;
159             break;
160         }
161     }
162
163     private void set_atk_relation (Widget widget, Widget target_widget, Atk.RelationType relationship)
164     {
165         var atk_widget = widget.get_accessible ();
166         var atk_target_widget = target_widget.get_accessible ();
167
168         atk_widget.add_relationship (relationship, atk_target_widget);
169     }
170 }