summaryrefslogtreecommitdiffstats
path: root/chrome/browser/views/autofill_profiles_view_win.h
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/views/autofill_profiles_view_win.h')
-rw-r--r--chrome/browser/views/autofill_profiles_view_win.h465
1 files changed, 465 insertions, 0 deletions
diff --git a/chrome/browser/views/autofill_profiles_view_win.h b/chrome/browser/views/autofill_profiles_view_win.h
new file mode 100644
index 0000000..be54e14
--- /dev/null
+++ b/chrome/browser/views/autofill_profiles_view_win.h
@@ -0,0 +1,465 @@
+// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_VIEWS_AUTOFILL_PROFILES_VIEW_WIN_H_
+#define CHROME_BROWSER_VIEWS_AUTOFILL_PROFILES_VIEW_WIN_H_
+
+#include <list>
+#include <vector>
+
+#include "app/combobox_model.h"
+#include "app/table_model.h"
+#include "chrome/browser/autofill/autofill_dialog.h"
+#include "chrome/browser/autofill/autofill_profile.h"
+#include "chrome/browser/autofill/personal_data_manager.h"
+#include "views/controls/combobox/combobox.h"
+#include "views/controls/link.h"
+#include "views/controls/table/table_view_observer.h"
+#include "views/controls/textfield/textfield.h"
+#include "views/focus/focus_manager.h"
+#include "views/view.h"
+#include "views/window/dialog_delegate.h"
+
+namespace views {
+class Checkbox;
+class GridLayout;
+class ImageButton;
+class Label;
+class RadioButton;
+class TableView;
+class TextButton;
+}
+
+class PrefService;
+class SkBitmap;
+
+///////////////////////////////////////////////////////////////////////////////
+// AutoFillProfilesView
+//
+// The contents of the "AutoFill profiles" dialog window.
+//
+// Overview: has following sub-views:
+// EditableSetViewContents - set of displayed fields for address or credit card,
+// has iterator to std::vector<EditableSetInfo> vector so data could be
+// updated or notifications passes to the dialog view.
+// PhoneSubView - support view for the phone fields sets. used in
+// ScrollViewContents.
+// And there is a support data structure EditableSetInfo which encapsulates
+// editable set (address or credit card) and allows for quick addition and
+// deletion.
+class AutoFillProfilesView : public views::View,
+ public views::DialogDelegate,
+ public views::ButtonListener,
+ public views::LinkController,
+ public views::FocusChangeListener,
+ public views::TableViewObserver,
+ public PersonalDataManager::Observer {
+ public:
+ virtual ~AutoFillProfilesView();
+
+ static int Show(gfx::NativeWindow parent,
+ AutoFillDialogObserver* observer,
+ PersonalDataManager* personal_data_manager,
+ Profile* profile,
+ PrefService* preferences,
+ AutoFillProfile* imported_profile,
+ CreditCard* imported_credit_card);
+
+ protected:
+ // forward declaration. This struct defined further down.
+ struct EditableSetInfo;
+ // Called when 'Add Address' (|group_type| is
+ // ContentListTableModel::kAddressGroup) or 'Add Credit Card' (|group_type| is
+ // ContentListTableModel::kCreditCardGroup) is clicked.
+ void AddClicked(int group_type);
+ // Called when 'Edit...' is clicked.
+ void EditClicked();
+ // Called when 'Remove' is clicked.
+ void DeleteClicked();
+
+ // Updates state of the buttons.
+ void UpdateButtonState();
+
+ // Updates inferred labels.
+ void UpdateProfileLabels();
+
+ // Following two functions are called from opened child dialog to
+ // disable/enable buttons.
+ void ChildWindowOpened();
+ void ChildWindowClosed();
+
+ // Returns warning bitmap to set on warning indicator. If |good| is true it
+ // returns the bitmap idicating validity, if false - indicating error.
+ // Caller owns the bitmap after the call.
+ SkBitmap* GetWarningBimap(bool good);
+
+ // views::View methods:
+ virtual void Layout();
+ virtual gfx::Size GetPreferredSize();
+ virtual void ViewHierarchyChanged(bool is_add, views::View* parent,
+ views::View* child);
+
+ // views::DialogDelegate methods:
+ virtual int GetDialogButtons() const;
+ virtual std::wstring GetDialogButtonLabel(
+ MessageBoxFlags::DialogButton button) const;
+ virtual View* GetExtraView();
+ virtual bool IsDialogButtonEnabled(
+ MessageBoxFlags::DialogButton button) const;
+ virtual bool CanResize() const { return true; }
+ virtual bool CanMaximize() const { return false; }
+ virtual bool IsAlwaysOnTop() const { return false; }
+ virtual bool HasAlwaysOnTopMenu() const { return false; }
+ virtual std::wstring GetWindowTitle() const;
+ virtual void WindowClosing();
+ virtual views::View* GetContentsView();
+ virtual bool Cancel();
+ virtual bool Accept();
+
+ // views::ButtonListener methods:
+ virtual void ButtonPressed(views::Button* sender,
+ const views::Event& event);
+
+ // views::LinkController methods:
+ virtual void LinkActivated(views::Link* source, int event_flags);
+
+ // views::FocusChangeListener methods:
+ virtual void FocusWillChange(views::View* focused_before,
+ views::View* focused_now);
+
+ // views::TableViewObserver methods:
+ virtual void OnSelectionChanged();
+ virtual void OnDoubleClick();
+
+ // PersonalDataManager::Observer methods:
+ virtual void OnPersonalDataLoaded();
+
+ // Helper structure to keep info on one address or credit card.
+ // Keeps info on one item in EditableSetViewContents.
+ // Also keeps info on opened status. Allows to quickly add and delete items,
+ // and then rebuild EditableSetViewContents.
+ struct EditableSetInfo {
+ bool is_address;
+ bool has_credit_card_number_been_edited;
+ // If |is_address| is true |address| has some data and |credit_card|
+ // is empty, and vice versa
+ AutoFillProfile address;
+ CreditCard credit_card;
+
+ explicit EditableSetInfo(const AutoFillProfile* input_address)
+ : address(*input_address),
+ is_address(true),
+ has_credit_card_number_been_edited(false) {
+ }
+ explicit EditableSetInfo(const CreditCard* input_credit_card)
+ : credit_card(*input_credit_card),
+ is_address(false),
+ has_credit_card_number_been_edited(false) {
+ }
+ };
+
+ private:
+ // Indicates that there was no item focused. After re-building of the lists
+ // first item will be focused.
+ static const int kNoItemFocused = -1;
+
+ struct FocusedItem {
+ int group;
+ int item;
+ FocusedItem() : group(kNoItemFocused), item(kNoItemFocused) {}
+ FocusedItem(int g, int i) : group(g), item(i) {}
+ };
+
+ AutoFillProfilesView(AutoFillDialogObserver* observer,
+ PersonalDataManager* personal_data_manager,
+ Profile* profile,
+ PrefService* preferences,
+ AutoFillProfile* imported_profile,
+ CreditCard* imported_credit_card);
+ void Init();
+
+ void GetData();
+ bool IsDataReady() const;
+
+ // Rebuilds the view by deleting and re-creating sub-views
+ void RebuildView(const FocusedItem& new_focus_index);
+
+ // PhoneSubView encapsulates three phone fields (country, area, and phone)
+ // and label above them, so they could be used together in one grid cell.
+ class PhoneSubView : public views::View,
+ public views::ButtonListener {
+ public:
+ PhoneSubView(AutoFillProfilesView* autofill_view,
+ views::Label* label,
+ views::Textfield* text_phone);
+ virtual ~PhoneSubView() {}
+
+ virtual void ContentsChanged(views::Textfield* sender,
+ const string16& new_contents);
+
+ bool IsValid() const;
+
+ protected:
+ // views::View methods:
+ virtual void ViewHierarchyChanged(bool is_add, views::View* parent,
+ views::View* child);
+
+ // public views::ButtonListener method:
+ virtual void ButtonPressed(views::Button* sender,
+ const views::Event& event) {
+ // Only stub is needed, it is never called.
+ NOTREACHED();
+ }
+
+ private:
+ void UpdateButtons();
+ AutoFillProfilesView* autofill_view_;
+ views::Label* label_;
+ views::Textfield* text_phone_;
+ views::ImageButton* phone_warning_button_;
+ bool last_state_;
+
+ DISALLOW_COPY_AND_ASSIGN(PhoneSubView);
+ };
+
+ // forward declaration
+ class AddressComboBoxModel;
+ class StringVectorComboboxModel;
+
+ // Sub-view dealing with addresses.
+ class EditableSetViewContents : public views::View,
+ public views::DialogDelegate,
+ public views::ButtonListener,
+ public views::Textfield::Controller,
+ public views::Combobox::Listener {
+ public:
+ EditableSetViewContents(AutoFillProfilesView* observer,
+ AddressComboBoxModel* billing_model,
+ bool new_item,
+ std::vector<EditableSetInfo>::iterator field_set);
+ virtual ~EditableSetViewContents() {}
+
+ protected:
+ // views::View methods:
+ virtual void Layout();
+ virtual gfx::Size GetPreferredSize();
+ virtual void ViewHierarchyChanged(bool is_add, views::View* parent,
+ views::View* child);
+
+ // views::DialogDelegate methods:
+ virtual int GetDialogButtons() const;
+ virtual std::wstring GetDialogButtonLabel(
+ MessageBoxFlags::DialogButton button) const;
+ virtual bool IsDialogButtonEnabled(
+ MessageBoxFlags::DialogButton button) const;
+ virtual bool CanResize() const { return false; }
+ virtual bool CanMaximize() const { return false; }
+ virtual bool IsAlwaysOnTop() const { return false; }
+ virtual bool HasAlwaysOnTopMenu() const { return false; }
+ virtual std::wstring GetWindowTitle() const;
+ virtual void WindowClosing();
+ virtual views::View* GetContentsView();
+ virtual bool Cancel();
+ virtual bool Accept();
+
+ // views::ButtonListener methods:
+ virtual void ButtonPressed(views::Button* sender,
+ const views::Event& event);
+
+ // views::Textfield::Controller methods:
+ virtual void ContentsChanged(views::Textfield* sender,
+ const string16& new_contents);
+ virtual bool HandleKeystroke(views::Textfield* sender,
+ const views::Textfield::Keystroke& keystroke);
+
+ // views::Combobox::Listener methods:
+ virtual void ItemChanged(views::Combobox* combo_box,
+ int prev_index,
+ int new_index);
+ private:
+ enum TextFields {
+ TEXT_FULL_NAME,
+ TEXT_COMPANY,
+ TEXT_EMAIL,
+ TEXT_ADDRESS_LINE_1,
+ TEXT_ADDRESS_LINE_2,
+ TEXT_ADDRESS_CITY,
+ TEXT_ADDRESS_STATE,
+ TEXT_ADDRESS_ZIP,
+ TEXT_ADDRESS_COUNTRY,
+ TEXT_PHONE_PHONE,
+ TEXT_FAX_PHONE,
+ TEXT_CC_NAME,
+ TEXT_CC_NUMBER,
+ // must be last
+ MAX_TEXT_FIELD
+ };
+
+ void InitAddressFields(views::GridLayout* layout);
+ void InitCreditCardFields(views::GridLayout* layout);
+ void InitLayoutGrid(views::GridLayout* layout);
+ views::Label* CreateLeftAlignedLabel(int label_id);
+
+ void UpdateButtons();
+
+ void UpdateContentsPhoneViews(TextFields field,
+ views::Textfield* sender,
+ const string16& new_contents);
+
+ views::Textfield* text_fields_[MAX_TEXT_FIELD];
+ std::vector<EditableSetInfo>::iterator editable_fields_set_;
+ EditableSetInfo temporary_info_;
+ AutoFillProfilesView* observer_;
+ AddressComboBoxModel* billing_model_;
+ views::Combobox* combo_box_billing_;
+ scoped_ptr<StringVectorComboboxModel> combo_box_model_month_;
+ views::Combobox* combo_box_month_;
+ scoped_ptr<StringVectorComboboxModel> combo_box_model_year_;
+ views::Combobox* combo_box_year_;
+ bool new_item_;
+ std::vector<PhoneSubView*> phone_sub_views_;
+
+ struct TextFieldToAutoFill {
+ TextFields text_field;
+ AutoFillFieldType type;
+ };
+
+ static TextFieldToAutoFill address_fields_[];
+ static TextFieldToAutoFill credit_card_fields_[];
+
+ static const int double_column_fill_view_set_id_ = 0;
+ static const int double_column_leading_view_set_id_ = 1;
+ static const int triple_column_fill_view_set_id_ = 2;
+ static const int triple_column_leading_view_set_id_ = 3;
+ static const int four_column_city_state_zip_set_id_ = 4;
+ static const int double_column_ccnumber_cvc_ = 5;
+ static const int three_column_header_ = 6;
+ static const int double_column_ccexpiration_ = 7;
+
+ DISALLOW_COPY_AND_ASSIGN(EditableSetViewContents);
+ };
+
+ // Encapsulates ComboboxModel for address
+ class AddressComboBoxModel : public ComboboxModel {
+ public:
+ explicit AddressComboBoxModel(bool is_billing);
+ virtual ~AddressComboBoxModel() {}
+
+ // Should be called only once. No other function should be called before it.
+ // Does not own |address_labels|. To update the model text,
+ // update label in one of the profiles and call LabelChanged()
+ void set_address_labels(const std::vector<EditableSetInfo>* address_labels);
+
+ // When you add a CB view that relies on this model, call this function
+ // so the CB can be notified if strings change. Can be called multiple
+ // times if several combo boxes relying on the model.
+ // Model does not own |combo_box|.
+ void UsedWithComboBox(views::Combobox *combo_box);
+
+ // Need to be called when comboboxes are destroyed.
+ void ClearComboBoxes() { combo_boxes_.clear(); }
+
+ // Call this function if one of the labels has changed
+ void LabelChanged();
+
+ // Gets index of the item in the model or -1 if not found.
+ int GetIndex(int unique_id);
+
+ // ComboboxModel methods, public as they used from EditableSetViewContents
+ virtual int GetItemCount();
+ virtual std::wstring GetItemAt(int index);
+
+ private:
+ std::list<views::Combobox *> combo_boxes_;
+ const std::vector<EditableSetInfo>* address_labels_;
+ bool is_billing_;
+
+ DISALLOW_COPY_AND_ASSIGN(AddressComboBoxModel);
+ };
+
+ class StringVectorComboboxModel : public ComboboxModel {
+ public:
+ StringVectorComboboxModel() {}
+ virtual ~StringVectorComboboxModel() {}
+
+ // Sets the vector of the strings for the combobox. Swaps content with
+ // |source|.
+ void set_cb_strings(std::vector<std::wstring> *source);
+
+ // Return the number of items in the combo box.
+ virtual int GetItemCount();
+
+ // Return the string that should be used to represent a given item.
+ virtual std::wstring GetItemAt(int index);
+
+ // Find an index of the item in the model, -1 if not present.
+ int GetIndex(const std::wstring& value);
+
+ private:
+ std::vector<std::wstring> cb_strings_;
+
+ DISALLOW_COPY_AND_ASSIGN(StringVectorComboboxModel);
+ };
+
+
+ // Model for scrolling credit cards and addresses
+ class ContentListTableModel : public TableModel {
+ public:
+ ContentListTableModel(std::vector<EditableSetInfo>* profiles,
+ std::vector<EditableSetInfo>* credit_cards);
+ virtual ~ContentListTableModel() {}
+
+ // Two constants defined for indexes of groups. The first one is index
+ // of Add Address button, the second one is the index of Add Credit Card
+ // button.
+ static const int kAddressGroup = 1;
+ static const int kCreditCardGroup = 2;
+
+ void Refresh();
+ void AddItem(int index);
+ void RemoveItem(int index);
+ void UpdateItem(int index);
+
+ // TableModel members:
+ virtual int RowCount();
+ virtual std::wstring GetText(int row, int column_id);
+ virtual bool HasGroups() { return true; }
+ virtual TableModel::Groups GetGroups();
+ virtual int GetGroupID(int row);
+ virtual void SetObserver(TableModelObserver* observer);
+
+ private:
+ std::vector<EditableSetInfo>* profiles_;
+ std::vector<EditableSetInfo>* credit_cards_;
+ TableModelObserver* observer_;
+
+ DISALLOW_COPY_AND_ASSIGN(ContentListTableModel);
+ };
+
+ AutoFillDialogObserver* observer_;
+ PersonalDataManager* personal_data_manager_;
+ Profile* profile_;
+ PrefService* preferences_;
+ std::vector<EditableSetInfo> profiles_set_;
+ std::vector<EditableSetInfo> credit_card_set_;
+
+ AddressComboBoxModel billing_model_;
+
+ views::Checkbox* enable_auto_fill_button_;
+ views::Button* add_address_button_;
+ views::Button* add_credit_card_button_;
+ views::Button* edit_button_;
+ views::Button* remove_button_;
+ views::TableView* scroll_view_;
+ scoped_ptr<ContentListTableModel> table_model_;
+ views::FocusManager* focus_manager_;
+ bool child_dialog_opened_;
+
+ static AutoFillProfilesView* instance_;
+
+ DISALLOW_COPY_AND_ASSIGN(AutoFillProfilesView);
+};
+
+#endif // CHROME_BROWSER_VIEWS_AUTOFILL_PROFILES_VIEW_WIN_H_
+