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