1// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CHROME_BROWSER_UI_VIEWS_INFOBARS_INFOBAR_VIEW_H_
6#define CHROME_BROWSER_UI_VIEWS_INFOBARS_INFOBAR_VIEW_H_
7#pragma once
8
9#include "base/task.h"
10#include "chrome/browser/ui/views/infobars/infobar.h"
11#include "chrome/browser/ui/views/infobars/infobar_background.h"
12#include "chrome/browser/ui/views/infobars/infobar_container.h"
13#include "views/controls/button/button.h"
14#include "views/focus/focus_manager.h"
15
16class SkPath;
17
18namespace views {
19class ExternalFocusTracker;
20class ImageButton;
21class ImageView;
22class Label;
23class Link;
24class LinkController;
25class MenuButton;
26class TextButton;
27class ViewMenuDelegate;
28}
29
30class InfoBarView : public InfoBar,
31                    public views::View,
32                    public views::ButtonListener,
33                    public views::FocusChangeListener {
34 public:
35  explicit InfoBarView(InfoBarDelegate* delegate);
36
37  SkPath* fill_path() const { return fill_path_.get(); }
38  SkPath* stroke_path() const { return stroke_path_.get(); }
39
40 protected:
41  static const int kButtonButtonSpacing;
42  static const int kEndOfLabelSpacing;
43
44  virtual ~InfoBarView();
45
46  // Creates a label with the appropriate font and color for an infobar.
47  static views::Label* CreateLabel(const string16& text);
48
49  // Creates a link with the appropriate font and color for an infobar.
50  static views::Link* CreateLink(const string16& text,
51                                 views::LinkController* controller,
52                                 const SkColor& background_color);
53
54  // Creates a menu button with an infobar-specific appearance.
55  static views::MenuButton* CreateMenuButton(
56      const string16& text,
57      bool normal_has_border,
58      views::ViewMenuDelegate* menu_delegate);
59
60  // Creates a text button with an infobar-specific appearance.
61  static views::TextButton* CreateTextButton(views::ButtonListener* listener,
62                                             const string16& text,
63                                             bool needs_elevation);
64
65  // views::View:
66  virtual void Layout() OVERRIDE;
67  virtual void ViewHierarchyChanged(bool is_add,
68                                    View* parent,
69                                    View* child) OVERRIDE;
70
71  // views::ButtonListener:
72  virtual void ButtonPressed(views::Button* sender,
73                             const views::Event& event) OVERRIDE;
74
75  // Returns the minimum width the content (that is, everything between the icon
76  // and the close button) can be shrunk to.  This is used to prevent the close
77  // button from overlapping views that cannot be shrunk any further.
78  virtual int ContentMinimumWidth() const;
79
80  // These return x coordinates delimiting the usable area for subclasses to lay
81  // out their controls.
82  int StartX() const;
83  int EndX() const;
84
85  // Convenience getter.
86  const InfoBarContainer::Delegate* container_delegate() const;
87
88 private:
89  static const int kHorizontalPadding;
90
91  // InfoBar:
92  virtual void PlatformSpecificHide(bool animate) OVERRIDE;
93  virtual void PlatformSpecificOnHeightsRecalculated() OVERRIDE;
94
95  // views::View:
96  virtual void GetAccessibleState(ui::AccessibleViewState* state) OVERRIDE;
97  virtual gfx::Size GetPreferredSize() OVERRIDE;
98  virtual void PaintChildren(gfx::Canvas* canvas) OVERRIDE;
99
100  // views::FocusChangeListener:
101  virtual void FocusWillChange(View* focused_before,
102                               View* focused_now) OVERRIDE;
103
104  // Destroys the external focus tracker, if present. If |restore_focus| is
105  // true, restores focus to the view tracked by the focus tracker before doing
106  // so.
107  void DestroyFocusTracker(bool restore_focus);
108
109  // Deletes this object (called after a return to the message loop to allow
110  // the stack in ViewHierarchyChanged to unwind).
111  void DeleteSelf();
112
113  // The optional icon at the left edge of the InfoBar.
114  views::ImageView* icon_;
115
116  // The close button at the right edge of the InfoBar.
117  views::ImageButton* close_button_;
118
119  // Tracks and stores the last focused view which is not the InfoBar or any of
120  // its children. Used to restore focus once the InfoBar is closed.
121  scoped_ptr<views::ExternalFocusTracker> focus_tracker_;
122
123  // Used to delete this object after a return to the message loop.
124  ScopedRunnableMethodFactory<InfoBarView> delete_factory_;
125
126  // The paths for the InfoBarBackground to draw, sized according to the heights
127  // above.
128  scoped_ptr<SkPath> fill_path_;
129  scoped_ptr<SkPath> stroke_path_;
130
131  DISALLOW_COPY_AND_ASSIGN(InfoBarView);
132};
133
134#endif  // CHROME_BROWSER_UI_VIEWS_INFOBARS_INFOBAR_VIEW_H_
135