diff options
author | georgey@chromium.org <georgey@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-02-01 20:24:48 +0000 |
---|---|---|
committer | georgey@chromium.org <georgey@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-02-01 20:24:48 +0000 |
commit | ac084442a04ed742bd4408d7e5ca1756e2e3b79d (patch) | |
tree | abdd5745d31a348831cfffb06ed58d35894ebf7c /chrome/browser/views/autofill_profiles_view_win.h | |
parent | 08d87dcc005057164d9cc19ddba5ddda77ce4942 (diff) | |
download | chromium_src-ac084442a04ed742bd4408d7e5ca1756e2e3b79d.zip chromium_src-ac084442a04ed742bd4408d7e5ca1756e2e3b79d.tar.gz chromium_src-ac084442a04ed742bd4408d7e5ca1756e2e3b79d.tar.bz2 |
Moved Autofill view to appropriate browser/views folder.
BUG=33026
TEST=none
Review URL: http://codereview.chromium.org/558051
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@37732 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/views/autofill_profiles_view_win.h')
-rw-r--r-- | chrome/browser/views/autofill_profiles_view_win.h | 364 |
1 files changed, 364 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..3eac54e --- /dev/null +++ b/chrome/browser/views/autofill_profiles_view_win.h @@ -0,0 +1,364 @@ +// 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 <vector> +#include <list> + +#include "app/combobox_model.h" +#include "chrome/browser/autofill/autofill_dialog.h" +#include "chrome/browser/autofill/autofill_profile.h" +#include "views/controls/combobox/combobox.h" +#include "views/controls/textfield/textfield.h" +#include "views/view.h" +#include "views/window/dialog_delegate.h" + +namespace views { +class GridLayout; +class ImageButton; +class Label; +class ScrollView; +} + +/////////////////////////////////////////////////////////////////////////////// +// AutoFillProfilesView +// +// The contents of the "Autofill profiles" dialog window. +// +// Overview: has following sub-views: +// AutoFillScrollView - scroll view that has all of the addresses and credit +// cards. Implemented by connecting views::ScrollView to ScrollViewContents. +// ScrollViewContents - contents of the scroll view. Has multiple +// EditableSetViewContents views for credit cards and addresses and +// 'Add address' and 'Add Credit Card' buttons. +// 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: + virtual ~AutoFillProfilesView(); + + static int Show(AutoFillDialogObserver* observer, + const std::vector<AutoFillProfile*>& profiles, + const std::vector<CreditCard*>& credit_cards); + + protected: + enum EditableSetType { + EDITABLE_SET_ADDRESS, + EDITABLE_SET_CREDIT_CARD, + }; + // forward declaration. This struct defined further down. + struct EditableSetInfo; + // Callbacks, called from EditableSetViewContents and ScrollViewContents. + // Called from ScrollViewContents when 'Add Address' (|item_type| is + // EDITABLE_SET_ADDRESS) or 'Add Credit Card' (|item_type| is + // EDITABLE_SET_CREDIT_CARD) is clicked. + void AddClicked(EditableSetType item_type); + // Called from EditableSetViewContents when 'Delete' is clicked. + // |field_set_iterator| is iterator to item being deleted + void DeleteEditableSet( + std::vector<EditableSetInfo>::iterator field_set_iterator); + // Called from EditableSetViewContents when header of the item is clicked + // either to collapse or expand. |field_set_iterator| is iterator to item + // being changed. + void CollapseStateChanged( + std::vector<EditableSetInfo>::iterator field_set_iterator); + + // 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 CanResize() const { return true; } + virtual bool CanMaximize() const { return true; } + 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 Accept(); + + // views::ButtonListener methods: + virtual void ButtonPressed(views::Button* sender, + const views::Event& event); + + // 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 is_opened; + // If |is_address| is true |address| has some data and |credit_card| + // is empty, and vice versa + AutoFillProfile address; + CreditCard credit_card; + + EditableSetInfo(const AutoFillProfile* input_address, bool opened) + : address(*input_address), + is_address(true), + is_opened(opened) { + } + EditableSetInfo(const CreditCard* input_credit_card, bool opened) + : credit_card(*input_credit_card), + is_address(false), + is_opened(opened) { + } + }; + + private: + AutoFillProfilesView(AutoFillDialogObserver* observer, + const std::vector<AutoFillProfile*>& profiles, + const std::vector<CreditCard*>& credit_cards); + void Init(); + + // 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: + PhoneSubView(views::Label* label, + views::Textfield* text_country, + views::Textfield* text_area, + views::Textfield* text_phone); + virtual ~PhoneSubView() {} + + protected: + // views::View methods: + virtual void ViewHierarchyChanged(bool is_add, views::View* parent, + views::View* child); + private: + views::Label* label_; + views::Textfield* text_country_; + views::Textfield* text_area_; + views::Textfield* text_phone_; + + DISALLOW_COPY_AND_ASSIGN(PhoneSubView); + }; + + // forward declaration + class AddressComboBoxModel; + + // Sub-view dealing with addresses. + class EditableSetViewContents : public views::View, + public views::Textfield::Controller, + public views::ButtonListener, + public views::Combobox::Listener { + public: + EditableSetViewContents(AutoFillProfilesView* observer, + AddressComboBoxModel* billing_model, + AddressComboBoxModel* shipping_model, + 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::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::ButtonListener methods: + virtual void ButtonPressed(views::Button* sender, + const views::Event& event); + // views::Combobox::Listener methods: + virtual void ItemChanged(views::Combobox* combo_box, + int prev_index, + int new_index); + private: + void InitTitle(views::GridLayout* layout); + void InitAddressFields(views::GridLayout* layout); + void InitCreditCardFields(views::GridLayout* layout); + void InitLayoutGrid(views::GridLayout* layout); + views::Label* CreateLeftAlignedLabel(int label_id); + + enum TextFields { + TEXT_LABEL, + TEXT_FIRST_NAME, + TEXT_MIDDLE_NAME, + TEXT_LAST_NAME, + TEXT_EMAIL, + TEXT_COMPANY_NAME, + TEXT_ADDRESS_LINE_1, + TEXT_ADDRESS_LINE_2, + TEXT_ADDRESS_CITY, + TEXT_ADDRESS_STATE, + TEXT_ADDRESS_ZIP, + TEXT_ADDRESS_COUNTRY, + TEXT_PHONE_COUNTRY, + TEXT_PHONE_AREA, + TEXT_PHONE_PHONE, + TEXT_FAX_COUNTRY, + TEXT_FAX_AREA, + TEXT_FAX_PHONE, + TEXT_CC_NAME, + TEXT_CC_NUMBER, + TEXT_CC_EXPIRATION_MONTH, + TEXT_CC_EXPIRATION_YEAR, + TEXT_CC_EXPIRATION_CVC, + // must be last + MAX_TEXT_FIELD + }; + views::Textfield* text_fields_[MAX_TEXT_FIELD]; + std::vector<EditableSetInfo>::iterator editable_fields_set_; + views::ImageButton* expand_item_button_; + views::Label* title_label_; + views::Label* title_label_preview_; + views::Button* delete_button_; + AutoFillProfilesView* observer_; + AddressComboBoxModel* billing_model_; + AddressComboBoxModel* shipping_model_; + views::Combobox* combo_box_billing_; + views::Combobox* combo_box_shipping_; + + 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 four_column_ccnumber_expiration_cvc_ = 5; + static const int three_column_header_ = 6; + + 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); + + // Call this function if one of the labels has changed + void LabelChanged(); + + // Gets index of the string in the model or -1 if not found. + int GetIndex(const string16 &s); + + // 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); + }; + + // Sub-view for scrolling credit cards and addresses + class ScrollViewContents : public views::View, + public views::ButtonListener { + public: + ScrollViewContents(AutoFillProfilesView* observer, + std::vector<EditableSetInfo>* profiles, + std::vector<EditableSetInfo>* credit_cards); + virtual ~ScrollViewContents() {} + + protected: + // views::View methods: + virtual int GetLineScrollIncrement(views::ScrollView* scroll_view, + bool is_horizontal, bool is_positive); + virtual void Layout(); + virtual gfx::Size GetPreferredSize(); + virtual void ViewHierarchyChanged(bool is_add, views::View* parent, + views::View* child); + // views::ButtonListener methods: + virtual void ButtonPressed(views::Button* sender, + const views::Event& event); + private: + void Init(); + + std::vector<EditableSetInfo>* profiles_; + std::vector<EditableSetInfo>* credit_cards_; + views::Button* add_address_; + views::Button* add_credit_card_; + AutoFillProfilesView* observer_; + + AddressComboBoxModel billing_model_; + AddressComboBoxModel shipping_model_; + + static int line_height_; + + DISALLOW_COPY_AND_ASSIGN(ScrollViewContents); + }; + + class AutoFillScrollView : public views::View { + public: + AutoFillScrollView(AutoFillProfilesView* observer, + std::vector<EditableSetInfo>* profiles, + std::vector<EditableSetInfo>* credit_cards); + virtual ~AutoFillScrollView() {} + + // Rebuilds the view by deleting and re-creating sub-views + void RebuildView(); + + protected: + // views::View overrides: + virtual void Layout(); + + private: + // The scroll view that contains list of the profiles. + views::ScrollView* scroll_view_; + ScrollViewContents* scroll_contents_view_; + + std::vector<EditableSetInfo>* profiles_; + std::vector<EditableSetInfo>* credit_cards_; + AutoFillProfilesView* observer_; + + DISALLOW_COPY_AND_ASSIGN(AutoFillScrollView); + }; + + AutoFillDialogObserver* observer_; + std::vector<EditableSetInfo> profiles_set_; + std::vector<EditableSetInfo> credit_card_set_; + + views::Button* save_changes_; + AutoFillScrollView* scroll_view_; + + static AutoFillProfilesView* instance_; + + DISALLOW_COPY_AND_ASSIGN(AutoFillProfilesView); +}; + +#endif // CHROME_BROWSER_VIEWS_AUTOFILL_PROFILES_VIEW_WIN_H_ + |