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_PANELS_PANEL_FRAME_VIEW_H_
6#define CHROME_BROWSER_UI_VIEWS_PANELS_PANEL_FRAME_VIEW_H_
7
8#include "chrome/browser/ui/panels/panel_constants.h"
9#include "chrome/browser/ui/views/tab_icon_view_model.h"
10#include "ui/views/controls/button/button.h"
11#include "ui/views/window/non_client_view.h"
12
13class PanelView;
14class TabIconView;
15
16namespace views {
17class ImageButton;
18class Label;
19}
20
21class PanelFrameView : public views::NonClientFrameView,
22                       public views::ButtonListener,
23                       public chrome::TabIconViewModel {
24 public:
25  enum PaintState {
26    PAINT_AS_INACTIVE,
27    PAINT_AS_ACTIVE,
28    PAINT_AS_MINIMIZED,
29    PAINT_FOR_ATTENTION
30  };
31
32  explicit PanelFrameView(PanelView* panel_view);
33  virtual ~PanelFrameView();
34
35  void Init();
36  void UpdateTitle();
37  void UpdateIcon();
38  void UpdateThrobber();
39  void UpdateTitlebarMinimizeRestoreButtonVisibility();
40  void SetWindowCornerStyle(panel::CornerStyle corner_style);
41
42  // Returns the size of the non-client area, that is, the window size minus
43  // the size of the client area.
44  gfx::Size NonClientAreaSize() const;
45
46  int BorderThickness() const;
47
48  PaintState GetPaintState() const;
49
50  views::ImageButton* close_button() const { return close_button_; }
51  views::ImageButton* minimize_button() const { return minimize_button_; }
52  views::ImageButton* restore_button() const { return restore_button_; }
53  TabIconView* title_icon() const { return title_icon_; }
54  views::Label* title_label() const { return title_label_; }
55  panel::CornerStyle corner_style() const { return corner_style_; }
56
57 private:
58  // Overridden from views::NonClientFrameView:
59  virtual gfx::Rect GetBoundsForClientView() const OVERRIDE;
60  virtual gfx::Rect GetWindowBoundsForClientBounds(
61      const gfx::Rect& client_bounds) const OVERRIDE;
62  virtual int NonClientHitTest(const gfx::Point& point) OVERRIDE;
63  virtual void GetWindowMask(const gfx::Size& size,
64                             gfx::Path* window_mask) OVERRIDE;
65  virtual void ResetWindowControls() OVERRIDE;
66  virtual void UpdateWindowIcon() OVERRIDE;
67  virtual void UpdateWindowTitle() OVERRIDE;
68  virtual void SizeConstraintsChanged() OVERRIDE;
69
70  // Overridden from views::View:
71  virtual gfx::Size GetPreferredSize() const OVERRIDE;
72  virtual const char* GetClassName() const OVERRIDE;
73  virtual gfx::Size GetMinimumSize() const OVERRIDE;
74  virtual gfx::Size GetMaximumSize() const OVERRIDE;
75  virtual void Layout() OVERRIDE;
76  virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE;
77  virtual bool OnMousePressed(const ui::MouseEvent& event) OVERRIDE;
78  virtual bool OnMouseDragged(const ui::MouseEvent& event) OVERRIDE;
79  virtual void OnMouseReleased(const ui::MouseEvent& event) OVERRIDE;
80  virtual void OnMouseCaptureLost() OVERRIDE;
81
82  // Overridden from views::ButtonListener:
83  virtual void ButtonPressed(views::Button* sender, const ui::Event& event)
84      OVERRIDE;
85
86  // Overridden from chrome::TabIconViewModel:
87  virtual bool ShouldTabIconViewAnimate() const OVERRIDE;
88  virtual gfx::ImageSkia GetFaviconForTabIconView() OVERRIDE;
89
90  int TitlebarHeight() const;
91
92  const gfx::ImageSkia* GetFrameBackground(PaintState paint_state) const;
93
94  // Update control styles to indicate if the titlebar is active or not.
95  void UpdateControlStyles(PaintState paint_state);
96
97  // Custom draw the frame.
98  void PaintFrameBackground(gfx::Canvas* canvas);
99  void PaintFrameEdge(gfx::Canvas* canvas);
100
101  // Retrieves the drawing metrics based on the current painting state.
102  SkColor GetTitleColor(PaintState paint_state) const;
103
104  // Returns true if |mouse_location| is within the panel's resizing area.
105  bool IsWithinResizingArea(const gfx::Point& mouse_location) const;
106
107  static const char kViewClassName[];
108
109  bool is_frameless_;
110  PanelView* panel_view_;
111  views::ImageButton* close_button_;
112  views::ImageButton* minimize_button_;
113  views::ImageButton* restore_button_;
114  TabIconView* title_icon_;
115  views::Label* title_label_;
116  panel::CornerStyle corner_style_;
117
118  DISALLOW_COPY_AND_ASSIGN(PanelFrameView);
119};
120
121#endif  // CHROME_BROWSER_UI_VIEWS_PANELS_PANEL_FRAME_VIEW_H_
122