• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2012 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_FRAME_BROWSER_NON_CLIENT_FRAME_VIEW_ASH_H_
6 #define CHROME_BROWSER_UI_VIEWS_FRAME_BROWSER_NON_CLIENT_FRAME_VIEW_ASH_H_
7 
8 #include "ash/shell_observer.h"
9 #include "base/gtest_prod_util.h"
10 #include "base/memory/scoped_ptr.h"
11 #include "chrome/browser/command_observer.h"
12 #include "chrome/browser/ui/views/frame/browser_non_client_frame_view.h"
13 #include "chrome/browser/ui/views/tab_icon_view_model.h"
14 #include "ui/views/controls/button/button.h"
15 
16 class TabIconView;
17 
18 namespace ash {
19 class FrameBorderHitTestController;
20 class FrameCaptionButton;
21 class FrameCaptionButtonContainerView;
22 class HeaderPainter;
23 }
24 namespace views {
25 class ImageButton;
26 class ToggleImageButton;
27 }
28 
29 class BrowserNonClientFrameViewAsh : public BrowserNonClientFrameView,
30                                      public ash::ShellObserver,
31                                      public chrome::TabIconViewModel,
32                                      public CommandObserver,
33                                      public views::ButtonListener {
34  public:
35   static const char kViewClassName[];
36 
37   BrowserNonClientFrameViewAsh(BrowserFrame* frame, BrowserView* browser_view);
38   virtual ~BrowserNonClientFrameViewAsh();
39 
40   void Init();
41 
42   // BrowserNonClientFrameView:
43   virtual gfx::Rect GetBoundsForTabStrip(views::View* tabstrip) const OVERRIDE;
44   virtual int GetTopInset() const OVERRIDE;
45   virtual int GetThemeBackgroundXInset() const OVERRIDE;
46   virtual void UpdateThrobber(bool running) OVERRIDE;
47 
48   // views::NonClientFrameView:
49   virtual gfx::Rect GetBoundsForClientView() const OVERRIDE;
50   virtual gfx::Rect GetWindowBoundsForClientBounds(
51       const gfx::Rect& client_bounds) const OVERRIDE;
52   virtual int NonClientHitTest(const gfx::Point& point) OVERRIDE;
53   virtual void GetWindowMask(const gfx::Size& size,
54                              gfx::Path* window_mask) OVERRIDE;
55   virtual void ResetWindowControls() OVERRIDE;
56   virtual void UpdateWindowIcon() OVERRIDE;
57   virtual void UpdateWindowTitle() OVERRIDE;
58   virtual void SizeConstraintsChanged() OVERRIDE;
59 
60   // views::View:
61   virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE;
62   virtual void Layout() OVERRIDE;
63   virtual const char* GetClassName() const OVERRIDE;
64   virtual void GetAccessibleState(ui::AXViewState* state) OVERRIDE;
65   virtual gfx::Size GetMinimumSize() const OVERRIDE;
66   virtual void ChildPreferredSizeChanged(views::View* child) OVERRIDE;
67 
68   // ash::ShellObserver:
69   virtual void OnMaximizeModeStarted() OVERRIDE;
70   virtual void OnMaximizeModeEnded() OVERRIDE;
71 
72   // chrome::TabIconViewModel:
73   virtual bool ShouldTabIconViewAnimate() const OVERRIDE;
74   virtual gfx::ImageSkia GetFaviconForTabIconView() OVERRIDE;
75 
76   // CommandObserver:
77   virtual void EnabledStateChangedForCommand(int id, bool enabled) OVERRIDE;
78 
79   // views::ButtonListener:
80   virtual void ButtonPressed(views::Button* sender,
81                              const ui::Event& event) OVERRIDE;
82 
83  private:
84   FRIEND_TEST_ALL_PREFIXES(BrowserNonClientFrameViewAshTest, WindowHeader);
85   FRIEND_TEST_ALL_PREFIXES(BrowserNonClientFrameViewAshTest,
86                            NonImmersiveFullscreen);
87   FRIEND_TEST_ALL_PREFIXES(BrowserNonClientFrameViewAshTest,
88                            ImmersiveFullscreen);
89   FRIEND_TEST_ALL_PREFIXES(BrowserNonClientFrameViewAshTest,
90                            ToggleMaximizeModeRelayout);
91 
92   // views::NonClientFrameView:
93   virtual bool DoesIntersectRect(const views::View* target,
94                                  const gfx::Rect& rect) const OVERRIDE;
95 
96   // Distance between the left edge of the NonClientFrameView and the tab strip.
97   int GetTabStripLeftInset() const;
98 
99   // Distance between the right edge of the NonClientFrameView and the tab
100   // strip.
101   int GetTabStripRightInset() const;
102 
103   // Returns true if we should use a super short header with light bars instead
104   // of regular tabs. This header is used in immersive fullscreen when the
105   // top-of-window views are not revealed.
106   bool UseImmersiveLightbarHeaderStyle() const;
107 
108   // Returns true if the header should be painted so that it looks the same as
109   // the header used for packaged apps. Packaged apps use a different color
110   // scheme than browser windows.
111   bool UsePackagedAppHeaderStyle() const;
112 
113   // Returns true if the header should be painted with a WebApp header style.
114   // The WebApp header style has a back button and title along with the usual
115   // accoutrements.
116   bool UseWebAppHeaderStyle() const;
117 
118   // Layout the incognito icon.
119   void LayoutAvatar();
120 
121   // Returns true if there is anything to paint. Some fullscreen windows do not
122   // need their frames painted.
123   bool ShouldPaint() const;
124 
125   // Paints the header background when the frame is in immersive fullscreen and
126   // tab light bar is visible.
127   void PaintImmersiveLightbarStyleHeader(gfx::Canvas* canvas);
128 
129   void PaintToolbarBackground(gfx::Canvas* canvas);
130 
131   // Draws the line under the header for windows without a toolbar and not using
132   // the packaged app header style.
133   void PaintContentEdge(gfx::Canvas* canvas);
134 
135   // Update the state of the back button.
136   void UpdateBackButtonState(bool enabled);
137 
138   // View which contains the window controls.
139   ash::FrameCaptionButtonContainerView* caption_button_container_;
140 
141   // The back button for web app style header.
142   ash::FrameCaptionButton* web_app_back_button_;
143 
144   // For popups, the window icon.
145   TabIconView* window_icon_;
146 
147   // Helper class for painting the header.
148   scoped_ptr<ash::HeaderPainter> header_painter_;
149 
150   // Updates the hittest bounds overrides based on the window show type.
151   scoped_ptr<ash::FrameBorderHitTestController>
152       frame_border_hit_test_controller_;
153 
154   DISALLOW_COPY_AND_ASSIGN(BrowserNonClientFrameViewAsh);
155 };
156 
157 #endif  // CHROME_BROWSER_UI_VIEWS_FRAME_BROWSER_NON_CLIENT_FRAME_VIEW_ASH_H_
158