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_VIEWS_CONTROLS_BUTTON_BUTTON_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define UI_VIEWS_CONTROLS_BUTTON_BUTTON_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/native_theme/native_theme.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/view.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace views {
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Button;
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Event;
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// An interface implemented by an object to let it know that a button was
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// pressed.
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class VIEWS_EXPORT ButtonListener {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void ButtonPressed(Button* sender, const ui::Event& event) = 0;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~ButtonListener() {}
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A View representing a button. Depending on the specific type, the button
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// could be implemented by a native control or custom rendered.
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class VIEWS_EXPORT Button : public View {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~Button();
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Button states for various button sub-types.
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  enum ButtonState {
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    STATE_NORMAL = 0,
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    STATE_HOVERED,
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    STATE_PRESSED,
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    STATE_DISABLED,
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    STATE_COUNT,
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Button styles with associated images and border painters.
42868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // TODO(msw): Add Menu, ComboBox, etc.
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  enum ButtonStyle {
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    STYLE_BUTTON = 0,
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    STYLE_TEXTBUTTON,
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    STYLE_COUNT,
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  static ButtonState GetButtonStateFrom(ui::NativeTheme::State state);
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void SetTooltipText(const base::string16& tooltip_text);
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int tag() const { return tag_; }
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_tag(int tag) { tag_ = tag; }
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void SetAccessibleName(const base::string16& name);
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from View:
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool GetTooltipText(const gfx::Point& p,
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                              base::string16* tooltip) const OVERRIDE;
61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void GetAccessibleState(ui::AXViewState* state) OVERRIDE;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Construct the Button with a Listener. The listener can be NULL. This can be
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // true of buttons that don't have a listener - e.g. menubuttons where there's
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // no default action and checkboxes.
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit Button(ButtonListener* listener);
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Cause the button to notify the listener that a click occurred.
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void NotifyClick(const ui::Event& event);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The button's listener. Notified when clicked.
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ButtonListener* listener_;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The text shown in a tooltip.
775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::string16 tooltip_text_;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Accessibility data.
805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::string16 accessible_name_;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The id tag associated with this button. Used to disambiguate buttons in
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the ButtonListener implementation.
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int tag_;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(Button);
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace views
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // UI_VIEWS_CONTROLS_BUTTON_BUTTON_H_
92