15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef UI_BASE_MODELS_BUTTON_MENU_ITEM_MODEL_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define UI_BASE_MODELS_BUTTON_MENU_ITEM_MODEL_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/strings/string16.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/ui_export.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ui {
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A model representing the rows of buttons that should be inserted in a button
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// containing menu item.
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class UI_EXPORT ButtonMenuItemModel {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Types of buttons.
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum ButtonType {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TYPE_SPACE,
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TYPE_BUTTON,
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TYPE_BUTTON_LABEL
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class UI_EXPORT Delegate {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Some command ids have labels that change over time.
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual bool IsItemForCommandIdDynamic(int command_id) const;
30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    virtual base::string16 GetLabelForCommandId(int command_id) const;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Performs the action associated with the specified command id.
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void ExecuteCommand(int command_id, int event_flags) = 0;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual bool IsCommandIdEnabled(int command_id) const;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual bool DoesCommandIdDismissMenu(int command_id) const;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   protected:
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual ~Delegate() {}
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ButtonMenuItemModel(int string_id, ButtonMenuItemModel::Delegate* delegate);
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~ButtonMenuItemModel();
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Adds a button that will emit |command_id|. All buttons created through
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // this method will have the same size, based on the largest button.
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddGroupItemWithStringId(int command_id, int string_id);
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Adds a button that has an icon instead of a label.
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddItemWithImage(int command_id, int icon_idr);
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Adds a non-clickable button with a desensitized label that doesn't do
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // anything. Usually combined with IsItemForCommandIdDynamic() to add
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // information.
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddButtonLabel(int command_id, int string_id);
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Adds a small horizontal space.
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddSpace();
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the number of items for iteration.
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int GetItemCount() const;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns what kind of item is at |index|.
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ButtonType GetTypeAt(int index) const;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Changes a position into a command ID.
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int GetCommandIdAt(int index) const;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Whether the label for item |index| changes.
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsItemDynamicAt(int index) const;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the current label value for the button at |index|.
72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  base::string16 GetLabelAt(int index) const;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If the button at |index| should have an icon instead, returns true and
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // sets the IDR |icon|.
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool GetIconAt(int index, int* icon) const;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If the button at |index| should have its size equalized along with all
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // other items that have their PartOfGroup bit set.
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool PartOfGroup(int index) const;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called from implementations.
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ActivatedCommand(int command_id);
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the enabled state of the button at |index|.
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsEnabledAt(int index) const;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns whether clicking on the button at |index| dismisses the menu.
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool DismissesMenuAt(int index) const;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the enabled state of the command specified by |command_id|.
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsCommandIdEnabled(int command_id) const;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns whether clicking on |command_id| dismisses the menu.
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool DoesCommandIdDismissMenu(int command_id) const;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
97eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  const base::string16& label() const { return item_label_; }
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The non-clickable label to the left of the buttons.
101eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  base::string16 item_label_;
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct Item;
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<Item> items_;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Delegate* delegate_;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ButtonMenuItemModel);
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ui
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // UI_BASE_MODELS_BUTTON_MENU_ITEM_MODEL_H_
114