172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
24a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
34a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// found in the LICENSE file.
44a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
54a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#ifndef CHROME_BROWSER_UI_VIEWS_FRAME_GLASS_BROWSER_FRAME_VIEW_H_
64a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#define CHROME_BROWSER_UI_VIEWS_FRAME_GLASS_BROWSER_FRAME_VIEW_H_
74a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#pragma once
84a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
9ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h"
10ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/prefs/pref_member.h"
1172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/views/frame/browser_frame_win.h"
1272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/views/frame/browser_non_client_frame_view.h"
134a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "views/controls/button/button.h"
14ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "views/controls/menu/view_menu_delegate.h"
154a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "views/window/non_client_view.h"
164a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
174a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass BrowserView;
184a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass SkBitmap;
194a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
20ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsennamespace views {
21ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass ProfileMenuButton;
22ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass ProfileMenuModel;
23ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass ProfileTagView;
24ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
25ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
26ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass GlassBrowserFrameView : public BrowserNonClientFrameView,
27ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                              public NotificationObserver,
28ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                              public views::ViewMenuDelegate {
294a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch public:
304a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Constructs a non-client view for an BrowserFrame.
314a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  GlassBrowserFrameView(BrowserFrame* frame, BrowserView* browser_view);
324a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  virtual ~GlassBrowserFrameView();
334a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
344a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Overridden from BrowserNonClientFrameView:
35ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual gfx::Rect GetBoundsForTabStrip(views::View* tabstrip) const OVERRIDE;
36ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual int GetHorizontalTabStripVerticalOffset(bool restored) const OVERRIDE;
37ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void UpdateThrobber(bool running) OVERRIDE;
384a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
394a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Overridden from views::NonClientFrameView:
40ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual gfx::Rect GetBoundsForClientView() const OVERRIDE;
41ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual bool AlwaysUseNativeFrame() const OVERRIDE;
424a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  virtual gfx::Rect GetWindowBoundsForClientBounds(
43ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      const gfx::Rect& client_bounds) const OVERRIDE;
44ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual int NonClientHitTest(const gfx::Point& point) OVERRIDE;
45ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void GetWindowMask(const gfx::Size& size, gfx::Path* window_mask)
46ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      OVERRIDE { }
47ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void EnableClose(bool enable) OVERRIDE { }
48ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void ResetWindowControls() OVERRIDE { }
49ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void UpdateWindowIcon() OVERRIDE { }
50ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
51ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // views::ViewMenuDelegate implementation:
52ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void RunMenu(views::View* source, const gfx::Point& pt) OVERRIDE;
534a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
544a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch protected:
554a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Overridden from views::View:
56ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE;
57ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void Layout() OVERRIDE;
58ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual bool HitTest(const gfx::Point& l) const OVERRIDE;
594a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
604a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch private:
614a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Returns the thickness of the border that makes up the window frame edges.
624a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // This does not include any client edge.
634a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  int FrameBorderThickness() const;
644a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
654a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Returns the thickness of the entire nonclient left, right, and bottom
664a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // borders, including both the window frame and any client edge.
674a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  int NonClientBorderThickness() const;
684a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
694a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Returns the height of the entire nonclient top border, including the window
704a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // frame, any title area, and any connected client edge.  If |restored| is
714a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // true, acts as if the window is restored regardless of the real mode.  If
724a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // |ignore_vertical_tabs| is true, acts as if vertical tabs are off regardless
734a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // of the real state.
744a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  int NonClientTopBorderHeight(bool restored, bool ignore_vertical_tabs) const;
754a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
764a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Paint various sub-components of this view.
774a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  void PaintToolbarBackground(gfx::Canvas* canvas);
784a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  void PaintOTRAvatar(gfx::Canvas* canvas);
794a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  void PaintRestoredClientEdge(gfx::Canvas* canvas);
804a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
814a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Layout various sub-components of this view.
824a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  void LayoutOTRAvatar();
834a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  void LayoutClientView();
84ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void LayoutProfileTag();
854a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
864a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Returns the bounds of the client area for the specified view size.
874a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  gfx::Rect CalculateClientAreaBounds(int width, int height) const;
884a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
894a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Starts/Stops the window throbber running.
904a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  void StartThrobber();
914a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  void StopThrobber();
924a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
934a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Displays the next throbber frame.
944a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  void DisplayNextThrobberFrame();
954a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
96ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // NotificationObserver implementation:
97ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void Observe(NotificationType type,
98ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                       const NotificationSource& source,
99ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                       const NotificationDetails& details) OVERRIDE;
100ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
101ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Receive notifications when the user's Google services user name changes.
102ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void RegisterLoginNotifications();
103ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
104ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Returns true if the ProfileButton has been created.
105ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool show_profile_button() const { return profile_button_.get() != NULL; }
106ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1074a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // The layout rect of the OTR avatar icon, if visible.
1084a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  gfx::Rect otr_avatar_bounds_;
1094a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1104a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // The frame that hosts this view.
1114a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  BrowserFrame* frame_;
1124a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1134a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // The BrowserView hosted within this View.
1144a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  BrowserView* browser_view_;
1154a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1164a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // The bounds of the ClientView.
1174a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  gfx::Rect client_view_bounds_;
1184a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
119ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Menu button that displays user's name and multi-profile menu.
120ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  scoped_ptr<views::ProfileMenuButton> profile_button_;
121ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
122ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Image tag displayed on frame beneath profile_button_.
123ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  scoped_ptr<views::ProfileTagView> profile_tag_;
124ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
125ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Multi-profile menu for profile_button_.
126ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  scoped_ptr<views::ProfileMenuModel> profile_menu_model_;
127ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1284a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Whether or not the window throbber is currently animating.
1294a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  bool throbber_running_;
1304a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1314a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // The index of the current frame of the throbber animation.
1324a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  int throbber_frame_;
1334a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
134ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // The Google services user name associated with this BrowserView's profile.
135ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  StringPrefMember username_pref_;
136ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1374a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  static const int kThrobberIconCount = 24;
1384a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  static HICON throbber_icons_[kThrobberIconCount];
1394a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  static void InitThrobberIcons();
1404a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1414a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(GlassBrowserFrameView);
1424a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch};
1434a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1444a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#endif  // CHROME_BROWSER_UI_VIEWS_FRAME_GLASS_BROWSER_FRAME_VIEW_H_
145