summaryrefslogtreecommitdiffstats
path: root/chrome/browser/ui/views/autofill_profiles_view_win.h
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/ui/views/autofill_profiles_view_win.h')
-rw-r--r--chrome/browser/ui/views/autofill_profiles_view_win.h440
1 files changed, 440 insertions, 0 deletions
diff --git a/chrome/browser/ui/views/autofill_profiles_view_win.h b/chrome/browser/ui/views/autofill_profiles_view_win.h
new file mode 100644
index 0000000..6dbe8dd
--- /dev/null
+++ b/chrome/browser/ui/views/autofill_profiles_view_win.h
@@ -0,0 +1,440 @@
+// 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_UI_VIEWS_AUTOFILL_PROFILES_VIEW_WIN_H_
+#define CHROME_BROWSER_UI_VIEWS_AUTOFILL_PROFILES_VIEW_WIN_H_
+#pragma once
+
+#include <list>
+#include <map>
+#include <vector>
+
+#include "app/combobox_model.h"
+#include "app/table_model.h"
+#include "base/string16.h"
+#include "chrome/browser/autofill/autofill_dialog.h"
+#include "chrome/browser/autofill/autofill_profile.h"
+#include "chrome/browser/autofill/personal_data_manager.h"
+#include "chrome/browser/prefs/pref_member.h"
+#include "chrome/common/notification_observer.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;
+} // namespace views
+
+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 NotificationObserver {
+ 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();
+ // Called when 'Edit' dialog is accepted.
+ void EditAccepted(EditableSetInfo* data, bool new_item);
+
+ // Updates state of the buttons.
+ void UpdateWidgetState();
+
+ // 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* GetWarningBitmap(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();
+ virtual void OnPersonalDataChanged();
+
+ // NotificationObserver methods:
+ virtual void Observe(NotificationType type,
+ const NotificationSource& source,
+ const NotificationDetails& details);
+
+ // 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;
+ // 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) {
+ }
+ explicit EditableSetInfo(const CreditCard* input_credit_card)
+ : credit_card(*input_credit_card),
+ is_address(false) {
+ }
+
+ std::string guid() const {
+ if (is_address)
+ return address.guid();
+ else
+ return credit_card.guid();
+ }
+ };
+
+ 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;
+ void SaveData();
+
+ // 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;
+
+ views::Textfield* text_phone() { return text_phone_; }
+
+ 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 StringVectorComboboxModel;
+
+ // Sub-view for editing/adding a credit card or address.
+ class EditableSetViewContents : public views::View,
+ public views::DialogDelegate,
+ public views::ButtonListener,
+ public views::Textfield::Controller,
+ public views::Combobox::Listener {
+ public:
+ EditableSetViewContents(AutoFillProfilesView* observer,
+ bool new_item,
+ const EditableSetInfo& 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 IsModal() const { return true; }
+ 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();
+
+ // If |field| is a phone or fax ContentsChanged is passed to the
+ // PhoneSubView, the appropriate fields in |temporary_info_| are updated and
+ // true is returned. Otherwise false is returned.
+ bool UpdateContentsPhoneViews(TextFields field,
+ views::Textfield* sender,
+ const string16& new_contents);
+
+ views::Textfield* text_fields_[MAX_TEXT_FIELD];
+ EditableSetInfo temporary_info_;
+ bool has_credit_card_number_been_edited_;
+ AutoFillProfilesView* observer_;
+ 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);
+ };
+
+ 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);
+
+ // Overridden from ComboboxModel:
+ virtual int GetItemCount();
+ virtual string16 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_;
+
+ BooleanPrefMember enable_auto_fill_;
+
+ 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_UI_VIEWS_AUTOFILL_PROFILES_VIEW_WIN_H_