12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef CHROME_BROWSER_UI_AUTOFILL_AUTOFILL_DIALOG_MODELS_H_
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define CHROME_BROWSER_UI_AUTOFILL_AUTOFILL_DIALOG_MODELS_H_
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <string>
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <vector>
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/basictypes.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/compiler_specific.h"
137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/strings/string16.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/models/combobox_model.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/models/simple_menu_model.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace autofill {
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class SuggestionsMenuModel;
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class SuggestionsMenuModelDelegate {
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~SuggestionsMenuModelDelegate();
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Called when a menu item has been activated.
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void SuggestionItemSelected(SuggestionsMenuModel* model,
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                      size_t index) = 0;
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// A model for the dropdowns that allow the user to select from different
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// sets of known data. It wraps a SimpleMenuModel, providing a mapping between
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// index and item GUID.
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class SuggestionsMenuModel : public ui::SimpleMenuModel,
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             public ui::SimpleMenuModel::Delegate {
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit SuggestionsMenuModel(SuggestionsMenuModelDelegate* delegate);
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~SuggestionsMenuModel();
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Adds an item and its identifying key to the model. Keys needn't be unique.
40a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void AddKeyedItem(const std::string& key,
41a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                    const base::string16& display_label);
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // As above, but also accepts an image which will be displayed alongside the
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // text.
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void AddKeyedItemWithIcon(const std::string& key,
46a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                            const base::string16& display_label,
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            const gfx::Image& icon);
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Adds a label with a minor text and its identifying key to the model.
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Keys needn't be unique.
5158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  void AddKeyedItemWithMinorText(const std::string& key,
52a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                const base::string16& display_label,
53a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                const base::string16& display_minor_text);
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // As above, but also accepts an image which will be displayed alongside the
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // text.
57a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void AddKeyedItemWithMinorTextAndIcon(
58a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      const std::string& key,
59a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      const base::string16& display_label,
60a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      const base::string16& display_minor_text,
61a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      const gfx::Image& icon);
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Resets the model to empty.
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void Reset();
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns the ID key for the item at |index|.
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string GetItemKeyAt(int index) const;
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns the ID key for the item at |checked_item_|, or an empty string if
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // there are no items.
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string GetItemKeyForCheckedItem() const;
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Sets which item is checked.
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void SetCheckedItem(const std::string& item_key);
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void SetCheckedIndex(size_t index);
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
7790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  int checked_item() const { return checked_item_; }
7890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
7990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Enable/disable an item by key.
8090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void SetEnabled(const std::string& item_key, bool enabled);
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // ui::SimpleMenuModel::Delegate implementation.
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool IsCommandIdChecked(int command_id) const OVERRIDE;
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool IsCommandIdEnabled(int command_id) const OVERRIDE;
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool GetAcceleratorForCommandId(
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      int command_id,
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::Accelerator* accelerator) OVERRIDE;
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void ExecuteCommand(int command_id, int event_flags) OVERRIDE;
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
9190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Represents an item in this model.
9290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  struct Item {
9390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    std::string key;  //  The key of the item.
9490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    bool enabled;  // Whether the item is selectable.
9590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  };
9690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // The items this model represents in presentation order.
9790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Note: the index in this vector is the |command_id| of the item.
9890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  std::vector<Item> items_;
9990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
10090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Returns the command id (and index) of the item by the |key|.
10190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  size_t GetItemIndex(const std::string& item_key);
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SuggestionsMenuModelDelegate* delegate_;
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // The command id (and index) of the item which is currently checked. Only one
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // item is checked at a time.
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int checked_item_;
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SuggestionsMenuModel);
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// A model for possible months in the Gregorian calendar.
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class MonthComboboxModel : public ui::ComboboxModel {
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MonthComboboxModel();
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~MonthComboboxModel();
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
118a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  static base::string16 FormatMonth(int index);
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // ui::Combobox implementation:
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual int GetItemCount() const OVERRIDE;
122a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual base::string16 GetItemAt(int index) OVERRIDE;
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(MonthComboboxModel);
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// A model for years between now and a decade hence.
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class YearComboboxModel : public ui::ComboboxModel {
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  YearComboboxModel();
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~YearComboboxModel();
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // ui::Combobox implementation:
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual int GetItemCount() const OVERRIDE;
136a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual base::string16 GetItemAt(int index) OVERRIDE;
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The current year (e.g., 2012).
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int this_year_;
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(YearComboboxModel);
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}  // namespace autofill
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // CHROME_BROWSER_UI_AUTOFILL_AUTOFILL_DIALOG_MODELS_H_
148