Home | History | Annotate | Download | only in frame
      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