OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/autofill/autofill_dialog.h" | 5 #include "chrome/browser/autofill/autofill_dialog.h" |
6 | 6 |
7 #include <gtk/gtk.h> | 7 #include <gtk/gtk.h> |
8 | 8 |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
11 #include "app/gfx/gtk_util.h" | 11 #include "app/gfx/gtk_util.h" |
12 #include "app/l10n_util.h" | 12 #include "app/l10n_util.h" |
| 13 #include "base/logging.h" |
13 #include "base/message_loop.h" | 14 #include "base/message_loop.h" |
14 #include "chrome/browser/autofill/autofill_profile.h" | 15 #include "chrome/browser/autofill/autofill_profile.h" |
| 16 #include "chrome/browser/autofill/credit_card.h" |
15 #include "chrome/browser/autofill/form_group.h" | 17 #include "chrome/browser/autofill/form_group.h" |
16 #include "chrome/browser/gtk/options/options_layout_gtk.h" | 18 #include "chrome/browser/gtk/options/options_layout_gtk.h" |
17 #include "chrome/common/gtk_util.h" | 19 #include "chrome/common/gtk_util.h" |
18 #include "grit/chromium_strings.h" | 20 #include "grit/chromium_strings.h" |
19 #include "grit/generated_resources.h" | 21 #include "grit/generated_resources.h" |
20 #include "grit/locale_settings.h" | 22 #include "grit/locale_settings.h" |
21 | 23 |
22 namespace { | 24 namespace { |
23 | 25 |
24 // Style for dialog group titles. | 26 // Style for dialog group titles. |
25 const char kDialogGroupTitleMarkup[] = "<span weight='bold'>%s</span>"; | 27 const char kDialogGroupTitleMarkup[] = "<span weight='bold'>%s</span>"; |
26 | 28 |
27 // How far we indent dialog widgets, in pixels. | 29 // How far we indent dialog widgets, in pixels. |
28 const int kAutoFillDialogIndent = 5; | 30 const int kAutoFillDialogIndent = 5; |
29 | 31 |
| 32 // All of these widgets are GtkEntrys except for default_profile, which is a |
| 33 // GtkCheckButton. |
| 34 typedef struct _AddressWidgets { |
| 35 GtkWidget* label; |
| 36 GtkWidget* default_profile; |
| 37 GtkWidget* first_name; |
| 38 GtkWidget* middle_name; |
| 39 GtkWidget* last_name; |
| 40 GtkWidget* email; |
| 41 GtkWidget* company_name; |
| 42 GtkWidget* address_line1; |
| 43 GtkWidget* address_line2; |
| 44 GtkWidget* city; |
| 45 GtkWidget* state; |
| 46 GtkWidget* zipcode; |
| 47 GtkWidget* country; |
| 48 GtkWidget* phone1; |
| 49 GtkWidget* phone2; |
| 50 GtkWidget* phone3; |
| 51 GtkWidget* fax1; |
| 52 GtkWidget* fax2; |
| 53 GtkWidget* fax3; |
| 54 } AddressWidgets; |
| 55 |
30 // Adds an alignment around |widget| which indents the widget by |offset|. | 56 // Adds an alignment around |widget| which indents the widget by |offset|. |
31 GtkWidget* IndentWidget(GtkWidget* widget, int offset) { | 57 GtkWidget* IndentWidget(GtkWidget* widget, int offset) { |
32 GtkWidget* alignment = gtk_alignment_new(0, 0, 0, 0); | 58 GtkWidget* alignment = gtk_alignment_new(0, 0, 0, 0); |
33 gtk_alignment_set_padding(GTK_ALIGNMENT(alignment), 0, 0, | 59 gtk_alignment_set_padding(GTK_ALIGNMENT(alignment), 0, 0, |
34 offset, 0); | 60 offset, 0); |
35 gtk_container_add(GTK_CONTAINER(alignment), widget); | 61 gtk_container_add(GTK_CONTAINER(alignment), widget); |
36 return alignment; | 62 return alignment; |
37 } | 63 } |
38 | 64 |
39 // Makes sure we use the gtk theme colors by loading the base color of an entry | 65 // Makes sure we use the gtk theme colors by loading the base color of an entry |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
125 FormTableSetLabel(table, row, col, len, label_id); | 151 FormTableSetLabel(table, row, col, len, label_id); |
126 | 152 |
127 GtkWidget* entry = gtk_entry_new(); | 153 GtkWidget* entry = gtk_entry_new(); |
128 FormTableSetWidget(table, entry, row, col, len, true); | 154 FormTableSetWidget(table, entry, row, col, len, true); |
129 | 155 |
130 return entry; | 156 return entry; |
131 } | 157 } |
132 | 158 |
133 // Adds a sized entry box to the form table. The entry widget width is set to | 159 // Adds a sized entry box to the form table. The entry widget width is set to |
134 // |char_len|. | 160 // |char_len|. |
135 void FormTableAddSizedEntry( | 161 GtkWidget* FormTableAddSizedEntry( |
136 GtkWidget* table, int row, int col, int char_len, int label_id) { | 162 GtkWidget* table, int row, int col, int char_len, int label_id) { |
137 GtkWidget* entry = FormTableAddEntry(table, row, col, 1, label_id); | 163 GtkWidget* entry = FormTableAddEntry(table, row, col, 1, label_id); |
138 gtk_entry_set_width_chars(GTK_ENTRY(entry), char_len); | 164 gtk_entry_set_width_chars(GTK_ENTRY(entry), char_len); |
| 165 return entry; |
139 } | 166 } |
140 | 167 |
141 // Like FormTableAddEntry, but connects to the 'changed' signal. |changed| is a | 168 // Like FormTableAddEntry, but connects to the 'changed' signal. |changed| is a |
142 // callback to handle the 'changed' signal that is emitted when the user edits | 169 // callback to handle the 'changed' signal that is emitted when the user edits |
143 // the entry. |expander| is the expander widget that will be sent to the | 170 // the entry. |expander| is the expander widget that will be sent to the |
144 // callback as the user data. | 171 // callback as the user data. |
145 GtkWidget* FormTableAddLabelEntry( | 172 GtkWidget* FormTableAddLabelEntry( |
146 GtkWidget* table, int row, int col, int len, int label_id, | 173 GtkWidget* table, int row, int col, int len, int label_id, |
147 GtkWidget* expander, GCallback changed) { | 174 GtkWidget* expander, GCallback changed) { |
148 FormTableSetLabel(table, row, col, len, label_id); | 175 FormTableSetLabel(table, row, col, len, label_id); |
149 | 176 |
150 GtkWidget* entry = gtk_entry_new(); | 177 GtkWidget* entry = gtk_entry_new(); |
151 g_signal_connect(entry, "changed", changed, expander); | 178 g_signal_connect(entry, "changed", changed, expander); |
152 FormTableSetWidget(table, entry, row, col, len, false); | 179 FormTableSetWidget(table, entry, row, col, len, false); |
153 | 180 |
154 return entry; | 181 return entry; |
155 } | 182 } |
156 | 183 |
157 } // namespace | 184 } // namespace |
158 | 185 |
159 //////////////////////////////////////////////////////////////////////////////// | 186 //////////////////////////////////////////////////////////////////////////////// |
160 // AutoFillDialog | 187 // AutoFillDialog |
161 // | 188 // |
162 // The contents of the AutoFill dialog. This dialog allows users to add, edit | 189 // The contents of the AutoFill dialog. This dialog allows users to add, edit |
163 // and remove AutoFill profiles. | 190 // and remove AutoFill profiles. |
164 class AutoFillDialog { | 191 class AutoFillDialog { |
165 public: | 192 public: |
166 AutoFillDialog(std::vector<AutoFillProfile>* profiles, | 193 AutoFillDialog(AutoFillDialogObserver* observer, |
167 std::vector<FormGroup>* credit_cards); | 194 const std::vector<AutoFillProfile>& profiles, |
| 195 const std::vector<CreditCard>& credit_cards); |
168 ~AutoFillDialog() {} | 196 ~AutoFillDialog() {} |
169 | 197 |
170 // Shows the AutoFill dialog. | 198 // Shows the AutoFill dialog. |
171 void Show(); | 199 void Show(); |
172 | 200 |
173 private: | 201 private: |
174 // 'destroy' signal handler. We DeleteSoon the global singleton dialog object | 202 // 'destroy' signal handler. We DeleteSoon the global singleton dialog object |
175 // from here. | 203 // from here. |
176 static void OnDestroy(GtkWidget* widget, AutoFillDialog* autofill_dialog); | 204 static void OnDestroy(GtkWidget* widget, AutoFillDialog* autofill_dialog); |
177 | 205 |
| 206 // 'response' signal handler. We notify the AutoFillDialogObserver that new |
| 207 // data is available if the response is GTK_RESPONSE_APPLY or GTK_RESPONSE_OK. |
| 208 // We close the dialog if the response is GTK_RESPONSE_OK or |
| 209 // GTK_RESPONSE_CANCEL. |
| 210 static void OnResponse(GtkDialog* dialog, gint response_id, |
| 211 AutoFillDialog* autofill_dialog); |
| 212 |
178 // 'clicked' signal handler. We add a new address. | 213 // 'clicked' signal handler. We add a new address. |
179 static void OnAddAddressClicked(GtkButton* button, AutoFillDialog* dialog); | 214 static void OnAddAddressClicked(GtkButton* button, AutoFillDialog* dialog); |
180 | 215 |
181 // 'clicked' signal handler. We add a new credit card. | 216 // 'clicked' signal handler. We add a new credit card. |
182 static void OnAddCreditCardClicked(GtkButton* button, AutoFillDialog* dialog); | 217 static void OnAddCreditCardClicked(GtkButton* button, AutoFillDialog* dialog); |
183 | 218 |
184 // 'changed' signal handler. We update the title of the expander widget with | 219 // 'changed' signal handler. We update the title of the expander widget with |
185 // the contents of the label entry widget. | 220 // the contents of the label entry widget. |
186 static void OnLabelChanged(GtkEntry* label, GtkWidget* expander); | 221 static void OnLabelChanged(GtkEntry* label, GtkWidget* expander); |
187 | 222 |
(...skipping 10 matching lines...) Expand all Loading... |
198 // expander widget. The content vbox widget is returned in |content_vbox|. | 233 // expander widget. The content vbox widget is returned in |content_vbox|. |
199 // Returns the expander widget. | 234 // Returns the expander widget. |
200 GtkWidget* InitGroupContentArea(int name_id, GtkWidget** content_vbox); | 235 GtkWidget* InitGroupContentArea(int name_id, GtkWidget** content_vbox); |
201 | 236 |
202 // Returns a GtkExpander that is added to the appropriate vbox. Each method | 237 // Returns a GtkExpander that is added to the appropriate vbox. Each method |
203 // adds the necessary widgets and layout required to fill out information | 238 // adds the necessary widgets and layout required to fill out information |
204 // for either an address or a credit card. | 239 // for either an address or a credit card. |
205 GtkWidget* AddNewAddress(); | 240 GtkWidget* AddNewAddress(); |
206 GtkWidget* AddNewCreditCard(); | 241 GtkWidget* AddNewCreditCard(); |
207 | 242 |
208 // The list of current AutoFill profiles. Owned by AutoFillManager. | 243 // The list of current AutoFill profiles. |
209 std::vector<AutoFillProfile>* profiles_; | 244 std::vector<AutoFillProfile> profiles_; |
210 | 245 |
211 // The list of current AutoFill credit cards. Owned by AutoFillManager. | 246 // The list of current AutoFill credit cards. |
212 std::vector<FormGroup>* credit_cards_; | 247 std::vector<CreditCard> credit_cards_; |
| 248 |
| 249 // The list of address widgets, used to modify the AutoFill profiles. |
| 250 std::vector<AddressWidgets> address_widgets_; |
213 | 251 |
214 // The AutoFill dialog. | 252 // The AutoFill dialog. |
215 GtkWidget* dialog_; | 253 GtkWidget* dialog_; |
216 | 254 |
217 // The addresses group. | 255 // The addresses group. |
218 GtkWidget* addresses_vbox_; | 256 GtkWidget* addresses_vbox_; |
219 | 257 |
220 // The credit cards group. | 258 // The credit cards group. |
221 GtkWidget* creditcards_vbox_; | 259 GtkWidget* creditcards_vbox_; |
222 | 260 |
| 261 // Our observer. |
| 262 AutoFillDialogObserver* observer_; |
| 263 |
223 DISALLOW_COPY_AND_ASSIGN(AutoFillDialog); | 264 DISALLOW_COPY_AND_ASSIGN(AutoFillDialog); |
224 }; | 265 }; |
225 | 266 |
226 // The singleton AutoFill dialog object. | 267 // The singleton AutoFill dialog object. |
227 static AutoFillDialog* dialog = NULL; | 268 static AutoFillDialog* dialog = NULL; |
228 | 269 |
229 AutoFillDialog::AutoFillDialog(std::vector<AutoFillProfile>* profiles, | 270 AutoFillDialog::AutoFillDialog(AutoFillDialogObserver* observer, |
230 std::vector<FormGroup>* credit_cards) | 271 const std::vector<AutoFillProfile>& profiles, |
| 272 const std::vector<CreditCard>& credit_cards) |
231 : profiles_(profiles), | 273 : profiles_(profiles), |
232 credit_cards_(credit_cards) { | 274 credit_cards_(credit_cards), |
| 275 observer_(observer) { |
| 276 DCHECK(observer); |
| 277 |
233 dialog_ = gtk_dialog_new_with_buttons( | 278 dialog_ = gtk_dialog_new_with_buttons( |
234 l10n_util::GetStringUTF8(IDS_AUTOFILL_DIALOG_TITLE).c_str(), | 279 l10n_util::GetStringUTF8(IDS_AUTOFILL_DIALOG_TITLE).c_str(), |
235 // AutoFill dialog is shared between all browser windows. | 280 // AutoFill dialog is shared between all browser windows. |
236 NULL, | 281 NULL, |
237 // Non-modal. | 282 // Non-modal. |
238 GTK_DIALOG_NO_SEPARATOR, | 283 GTK_DIALOG_NO_SEPARATOR, |
239 GTK_STOCK_APPLY, | 284 GTK_STOCK_APPLY, |
240 GTK_RESPONSE_APPLY, | 285 GTK_RESPONSE_APPLY, |
241 GTK_STOCK_CANCEL, | 286 GTK_STOCK_CANCEL, |
242 GTK_RESPONSE_CANCEL, | 287 GTK_RESPONSE_CANCEL, |
243 GTK_STOCK_OK, | 288 GTK_STOCK_OK, |
244 GTK_RESPONSE_OK, | 289 GTK_RESPONSE_OK, |
245 NULL); | 290 NULL); |
246 | 291 |
247 gtk_widget_realize(dialog_); | 292 gtk_widget_realize(dialog_); |
248 gtk_util::SetWindowSizeFromResources(GTK_WINDOW(dialog_), | 293 gtk_util::SetWindowSizeFromResources(GTK_WINDOW(dialog_), |
249 IDS_AUTOFILL_DIALOG_WIDTH_CHARS, | 294 IDS_AUTOFILL_DIALOG_WIDTH_CHARS, |
250 IDS_AUTOFILL_DIALOG_HEIGHT_LINES, | 295 IDS_AUTOFILL_DIALOG_HEIGHT_LINES, |
251 true); | 296 true); |
252 | 297 |
253 // Allow browser windows to go in front of the AutoFill dialog in Metacity. | 298 // Allow browser windows to go in front of the AutoFill dialog in Metacity. |
254 gtk_window_set_type_hint(GTK_WINDOW(dialog_), GDK_WINDOW_TYPE_HINT_NORMAL); | 299 gtk_window_set_type_hint(GTK_WINDOW(dialog_), GDK_WINDOW_TYPE_HINT_NORMAL); |
255 gtk_box_set_spacing(GTK_BOX(GTK_DIALOG(dialog_)->vbox), | 300 gtk_box_set_spacing(GTK_BOX(GTK_DIALOG(dialog_)->vbox), |
256 gtk_util::kContentAreaSpacing); | 301 gtk_util::kContentAreaSpacing); |
257 g_signal_connect(dialog_, "response", G_CALLBACK(gtk_widget_destroy), NULL); | 302 g_signal_connect(dialog_, "response", G_CALLBACK(OnResponse), this); |
258 g_signal_connect(dialog_, "destroy", G_CALLBACK(OnDestroy), this); | 303 g_signal_connect(dialog_, "destroy", G_CALLBACK(OnDestroy), this); |
259 | 304 |
260 // Allow the contents to be scrolled. | 305 // Allow the contents to be scrolled. |
261 GtkWidget* scrolled_window = gtk_scrolled_window_new(NULL, NULL); | 306 GtkWidget* scrolled_window = gtk_scrolled_window_new(NULL, NULL); |
262 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window), | 307 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window), |
263 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); | 308 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); |
264 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog_)->vbox), scrolled_window); | 309 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog_)->vbox), scrolled_window); |
265 | 310 |
266 // We create an event box so that we can color the frame background white. | 311 // We create an event box so that we can color the frame background white. |
267 GtkWidget* frame_event_box = gtk_event_box_new(); | 312 GtkWidget* frame_event_box = gtk_event_box_new(); |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
300 gtk_get_current_event_time()); | 345 gtk_get_current_event_time()); |
301 } | 346 } |
302 | 347 |
303 // static | 348 // static |
304 void AutoFillDialog::OnDestroy(GtkWidget* widget, | 349 void AutoFillDialog::OnDestroy(GtkWidget* widget, |
305 AutoFillDialog* autofill_dialog) { | 350 AutoFillDialog* autofill_dialog) { |
306 dialog = NULL; | 351 dialog = NULL; |
307 MessageLoop::current()->DeleteSoon(FROM_HERE, autofill_dialog); | 352 MessageLoop::current()->DeleteSoon(FROM_HERE, autofill_dialog); |
308 } | 353 } |
309 | 354 |
| 355 static string16 GetEntryText(GtkWidget* entry) { |
| 356 return UTF8ToUTF16(gtk_entry_get_text(GTK_ENTRY(entry))); |
| 357 } |
| 358 |
| 359 static AutoFillProfile AutoFillProfileFromWidgetValues( |
| 360 const AddressWidgets& widgets) { |
| 361 // TODO(jhawkins): unique id? |
| 362 AutoFillProfile profile(GetEntryText(widgets.label), 0); |
| 363 profile.SetInfo(AutoFillType(NAME_FIRST), |
| 364 GetEntryText(widgets.first_name)); |
| 365 profile.SetInfo(AutoFillType(NAME_MIDDLE), |
| 366 GetEntryText(widgets.middle_name)); |
| 367 profile.SetInfo(AutoFillType(NAME_LAST), |
| 368 GetEntryText(widgets.last_name)); |
| 369 profile.SetInfo(AutoFillType(EMAIL_ADDRESS), |
| 370 GetEntryText(widgets.email)); |
| 371 profile.SetInfo(AutoFillType(COMPANY_NAME), |
| 372 GetEntryText(widgets.company_name)); |
| 373 profile.SetInfo(AutoFillType(ADDRESS_HOME_LINE1), |
| 374 GetEntryText(widgets.address_line1)); |
| 375 profile.SetInfo(AutoFillType(ADDRESS_HOME_LINE2), |
| 376 GetEntryText(widgets.address_line2)); |
| 377 profile.SetInfo(AutoFillType(ADDRESS_HOME_CITY), |
| 378 GetEntryText(widgets.city)); |
| 379 profile.SetInfo(AutoFillType(ADDRESS_HOME_STATE), |
| 380 GetEntryText(widgets.state)); |
| 381 profile.SetInfo(AutoFillType(ADDRESS_HOME_ZIP), |
| 382 GetEntryText(widgets.zipcode)); |
| 383 profile.SetInfo(AutoFillType(ADDRESS_HOME_COUNTRY), |
| 384 GetEntryText(widgets.country)); |
| 385 profile.SetInfo(AutoFillType(PHONE_HOME_COUNTRY_CODE), |
| 386 GetEntryText(widgets.phone1)); |
| 387 profile.SetInfo(AutoFillType(PHONE_HOME_CITY_CODE), |
| 388 GetEntryText(widgets.phone2)); |
| 389 profile.SetInfo(AutoFillType(PHONE_HOME_NUMBER), |
| 390 GetEntryText(widgets.phone3)); |
| 391 profile.SetInfo(AutoFillType(PHONE_FAX_COUNTRY_CODE), |
| 392 GetEntryText(widgets.fax1)); |
| 393 profile.SetInfo(AutoFillType(PHONE_FAX_CITY_CODE), |
| 394 GetEntryText(widgets.fax2)); |
| 395 profile.SetInfo(AutoFillType(PHONE_FAX_NUMBER), |
| 396 GetEntryText(widgets.fax3)); |
| 397 return profile; |
| 398 } |
| 399 |
| 400 // static |
| 401 void AutoFillDialog::OnResponse(GtkDialog* dialog, gint response_id, |
| 402 AutoFillDialog* autofill_dialog) { |
| 403 if (response_id == GTK_RESPONSE_APPLY || response_id == GTK_RESPONSE_OK) { |
| 404 autofill_dialog->profiles_.clear(); |
| 405 std::vector<AddressWidgets>::const_iterator iter; |
| 406 for (iter = autofill_dialog->address_widgets_.begin(); |
| 407 iter != autofill_dialog->address_widgets_.end(); |
| 408 ++iter) { |
| 409 autofill_dialog->profiles_.push_back( |
| 410 AutoFillProfileFromWidgetValues(*iter)); |
| 411 } |
| 412 |
| 413 autofill_dialog->observer_->OnAutoFillDialogApply( |
| 414 autofill_dialog->profiles_, autofill_dialog->credit_cards_); |
| 415 } |
| 416 |
| 417 if (response_id == GTK_RESPONSE_OK || response_id == GTK_RESPONSE_CANCEL) { |
| 418 gtk_widget_destroy(GTK_WIDGET(dialog)); |
| 419 } |
| 420 } |
| 421 |
310 // static | 422 // static |
311 void AutoFillDialog::OnAddAddressClicked(GtkButton* button, | 423 void AutoFillDialog::OnAddAddressClicked(GtkButton* button, |
312 AutoFillDialog* dialog) { | 424 AutoFillDialog* dialog) { |
313 GtkWidget* new_address = dialog->AddNewAddress(); | 425 GtkWidget* new_address = dialog->AddNewAddress(); |
314 gtk_box_pack_start(GTK_BOX(dialog->addresses_vbox_), new_address, | 426 gtk_box_pack_start(GTK_BOX(dialog->addresses_vbox_), new_address, |
315 FALSE, FALSE, 0); | 427 FALSE, FALSE, 0); |
316 gtk_widget_show_all(new_address); | 428 gtk_widget_show_all(new_address); |
317 } | 429 } |
318 | 430 |
319 // static | 431 // static |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
381 gtk_container_add(GTK_CONTAINER(frame), vbox_alignment); | 493 gtk_container_add(GTK_CONTAINER(frame), vbox_alignment); |
382 | 494 |
383 // Make it expand by default. | 495 // Make it expand by default. |
384 gtk_expander_set_expanded(GTK_EXPANDER(expander), true); | 496 gtk_expander_set_expanded(GTK_EXPANDER(expander), true); |
385 | 497 |
386 *content_vbox = vbox; | 498 *content_vbox = vbox; |
387 return expander; | 499 return expander; |
388 } | 500 } |
389 | 501 |
390 GtkWidget* AutoFillDialog::AddNewAddress() { | 502 GtkWidget* AutoFillDialog::AddNewAddress() { |
| 503 AddressWidgets widgets = {0}; |
391 GtkWidget* vbox; | 504 GtkWidget* vbox; |
392 GtkWidget* address = InitGroupContentArea(IDS_AUTOFILL_NEW_ADDRESS, &vbox); | 505 GtkWidget* address = InitGroupContentArea(IDS_AUTOFILL_NEW_ADDRESS, &vbox); |
393 | 506 |
394 GtkWidget* table = InitFormTable(5, 3); | 507 GtkWidget* table = InitFormTable(5, 3); |
395 gtk_box_pack_start_defaults(GTK_BOX(vbox), table); | 508 gtk_box_pack_start_defaults(GTK_BOX(vbox), table); |
396 | 509 |
397 FormTableAddLabelEntry(table, 0, 0, 1, IDS_AUTOFILL_DIALOG_LABEL, | 510 widgets.label = FormTableAddLabelEntry(table, 0, 0, 1, |
398 address, G_CALLBACK(OnLabelChanged)); | 511 IDS_AUTOFILL_DIALOG_LABEL, |
399 FormTableAddEntry(table, 1, 0, 1, IDS_AUTOFILL_DIALOG_FIRST_NAME); | 512 address, G_CALLBACK(OnLabelChanged)); |
400 FormTableAddEntry(table, 1, 1, 1, IDS_AUTOFILL_DIALOG_MIDDLE_NAME); | 513 widgets.first_name = FormTableAddEntry(table, 1, 0, 1, |
401 FormTableAddEntry(table, 1, 2, 1, IDS_AUTOFILL_DIALOG_LAST_NAME); | 514 IDS_AUTOFILL_DIALOG_FIRST_NAME); |
402 FormTableAddEntry(table, 2, 0, 1, IDS_AUTOFILL_DIALOG_EMAIL); | 515 widgets.middle_name = FormTableAddEntry(table, 1, 1, 1, |
403 FormTableAddEntry(table, 2, 1, 1, IDS_AUTOFILL_DIALOG_COMPANY_NAME); | 516 IDS_AUTOFILL_DIALOG_MIDDLE_NAME); |
404 FormTableAddEntry(table, 3, 0, 2, IDS_AUTOFILL_DIALOG_ADDRESS_LINE_1); | 517 widgets.last_name = FormTableAddEntry(table, 1, 2, 1, |
405 FormTableAddEntry(table, 4, 0, 2, IDS_AUTOFILL_DIALOG_ADDRESS_LINE_2); | 518 IDS_AUTOFILL_DIALOG_LAST_NAME); |
| 519 widgets.email = FormTableAddEntry(table, 2, 0, 1, |
| 520 IDS_AUTOFILL_DIALOG_EMAIL); |
| 521 widgets.company_name = FormTableAddEntry(table, 2, 1, 1, |
| 522 IDS_AUTOFILL_DIALOG_COMPANY_NAME); |
| 523 widgets.address_line1 = FormTableAddEntry(table, 3, 0, 2, |
| 524 IDS_AUTOFILL_DIALOG_ADDRESS_LINE_1); |
| 525 widgets.address_line2 = FormTableAddEntry(table, 4, 0, 2, |
| 526 IDS_AUTOFILL_DIALOG_ADDRESS_LINE_2); |
406 | 527 |
407 // TODO(jhawkins): If there's not a default profile, automatically check this | 528 // TODO(jhawkins): If there's not a default profile, automatically check this |
408 // check button. | 529 // check button. |
409 GtkWidget* default_check = gtk_check_button_new_with_label( | 530 GtkWidget* default_check = gtk_check_button_new_with_label( |
410 l10n_util::GetStringUTF8(IDS_AUTOFILL_DIALOG_MAKE_DEFAULT).c_str()); | 531 l10n_util::GetStringUTF8(IDS_AUTOFILL_DIALOG_MAKE_DEFAULT).c_str()); |
| 532 widgets.default_profile = default_check; |
411 FormTableSetWidget(table, default_check, 0, 1, 1, false); | 533 FormTableSetWidget(table, default_check, 0, 1, 1, false); |
412 | 534 |
413 GtkWidget* address_table = InitFormTable(1, 4); | 535 GtkWidget* address_table = InitFormTable(1, 4); |
414 gtk_box_pack_start_defaults(GTK_BOX(vbox), address_table); | 536 gtk_box_pack_start_defaults(GTK_BOX(vbox), address_table); |
415 | 537 |
416 FormTableAddEntry(address_table, 0, 0, 1, IDS_AUTOFILL_DIALOG_CITY); | 538 widgets.city = FormTableAddEntry(address_table, 0, 0, 1, |
417 FormTableAddEntry(address_table, 0, 1, 1, IDS_AUTOFILL_DIALOG_STATE); | 539 IDS_AUTOFILL_DIALOG_CITY); |
418 FormTableAddSizedEntry(address_table, 0, 2, 7, IDS_AUTOFILL_DIALOG_ZIP_CODE); | 540 widgets.state = FormTableAddEntry(address_table, 0, 1, 1, |
419 FormTableAddSizedEntry(address_table, 0, 3, 10, IDS_AUTOFILL_DIALOG_COUNTRY); | 541 IDS_AUTOFILL_DIALOG_STATE); |
| 542 widgets.zipcode = FormTableAddSizedEntry(address_table, 0, 2, 7, |
| 543 IDS_AUTOFILL_DIALOG_ZIP_CODE); |
| 544 widgets.country = FormTableAddSizedEntry(address_table, 0, 3, 10, |
| 545 IDS_AUTOFILL_DIALOG_COUNTRY); |
420 | 546 |
421 GtkWidget* phone_table = InitFormTable(1, 8); | 547 GtkWidget* phone_table = InitFormTable(1, 8); |
422 gtk_box_pack_start_defaults(GTK_BOX(vbox), phone_table); | 548 gtk_box_pack_start_defaults(GTK_BOX(vbox), phone_table); |
423 | 549 |
424 FormTableAddSizedEntry(phone_table, 0, 0, 4, IDS_AUTOFILL_DIALOG_PHONE); | 550 widgets.phone1 = FormTableAddSizedEntry(phone_table, 0, 0, 4, |
425 FormTableAddSizedEntry(phone_table, 0, 1, 4, 0); | 551 IDS_AUTOFILL_DIALOG_PHONE); |
426 FormTableAddEntry(phone_table, 0, 2, 2, 0); | 552 widgets.phone2 = FormTableAddSizedEntry(phone_table, 0, 1, 4, 0); |
427 FormTableAddSizedEntry(phone_table, 0, 4, 4, IDS_AUTOFILL_DIALOG_FAX); | 553 widgets.phone3 = FormTableAddEntry(phone_table, 0, 2, 2, 0); |
428 FormTableAddSizedEntry(phone_table, 0, 5, 4, 0); | 554 widgets.fax1 = FormTableAddSizedEntry(phone_table, 0, 4, 4, |
429 FormTableAddEntry(phone_table, 0, 6, 2, 0); | 555 IDS_AUTOFILL_DIALOG_FAX); |
| 556 widgets.fax2 = FormTableAddSizedEntry(phone_table, 0, 5, 4, 0); |
| 557 widgets.fax3 = FormTableAddEntry(phone_table, 0, 6, 2, 0); |
430 | 558 |
431 GtkWidget* button = gtk_button_new_with_label( | 559 GtkWidget* button = gtk_button_new_with_label( |
432 l10n_util::GetStringUTF8(IDS_AUTOFILL_DELETE_BUTTON).c_str()); | 560 l10n_util::GetStringUTF8(IDS_AUTOFILL_DELETE_BUTTON).c_str()); |
433 GtkWidget* alignment = gtk_alignment_new(0, 0, 0, 0); | 561 GtkWidget* alignment = gtk_alignment_new(0, 0, 0, 0); |
434 gtk_container_add(GTK_CONTAINER(alignment), button); | 562 gtk_container_add(GTK_CONTAINER(alignment), button); |
435 gtk_box_pack_start_defaults(GTK_BOX(vbox), alignment); | 563 gtk_box_pack_start_defaults(GTK_BOX(vbox), alignment); |
436 | 564 |
| 565 address_widgets_.push_back(widgets); |
437 return address; | 566 return address; |
438 } | 567 } |
439 | 568 |
440 GtkWidget* AutoFillDialog::AddNewCreditCard() { | 569 GtkWidget* AutoFillDialog::AddNewCreditCard() { |
441 GtkWidget* vbox; | 570 GtkWidget* vbox; |
442 GtkWidget* credit_card = InitGroupContentArea(IDS_AUTOFILL_NEW_CREDITCARD, | 571 GtkWidget* credit_card = InitGroupContentArea(IDS_AUTOFILL_NEW_CREDITCARD, |
443 &vbox); | 572 &vbox); |
444 | 573 |
445 GtkWidget* label_table = InitFormTable(1, 2); | 574 GtkWidget* label_table = InitFormTable(1, 2); |
446 gtk_box_pack_start_defaults(GTK_BOX(vbox), label_table); | 575 gtk_box_pack_start_defaults(GTK_BOX(vbox), label_table); |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
504 GtkWidget* alignment = gtk_alignment_new(0, 0, 0, 0); | 633 GtkWidget* alignment = gtk_alignment_new(0, 0, 0, 0); |
505 gtk_container_add(GTK_CONTAINER(alignment), button); | 634 gtk_container_add(GTK_CONTAINER(alignment), button); |
506 gtk_box_pack_start_defaults(GTK_BOX(vbox), alignment); | 635 gtk_box_pack_start_defaults(GTK_BOX(vbox), alignment); |
507 | 636 |
508 return credit_card; | 637 return credit_card; |
509 } | 638 } |
510 | 639 |
511 /////////////////////////////////////////////////////////////////////////////// | 640 /////////////////////////////////////////////////////////////////////////////// |
512 // Factory/finder method: | 641 // Factory/finder method: |
513 | 642 |
514 void ShowAutoFillDialog(std::vector<AutoFillProfile>* profiles, | 643 void ShowAutoFillDialog(AutoFillDialogObserver* observer, |
515 std::vector<FormGroup>* credit_cards) { | 644 const std::vector<AutoFillProfile>& profiles, |
| 645 const std::vector<CreditCard>& credit_cards) { |
516 if (!dialog) { | 646 if (!dialog) { |
517 dialog = new AutoFillDialog(profiles, credit_cards); | 647 dialog = new AutoFillDialog(observer, profiles, credit_cards); |
518 } | 648 } |
519 dialog->Show(); | 649 dialog->Show(); |
520 } | 650 } |
OLD | NEW |