browser_frame.cc revision 5821806d5e7f356e8fa4b058a389a808ea183019
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#include "chrome/browser/ui/views/frame/browser_frame.h"
6
7#include "base/chromeos/chromeos_version.h"
8#include "base/i18n/rtl.h"
9#include "chrome/browser/themes/theme_service.h"
10#include "chrome/browser/themes/theme_service_factory.h"
11#include "chrome/browser/ui/browser.h"
12#include "chrome/browser/ui/browser_list.h"
13#include "chrome/browser/ui/browser_window_state.h"
14#include "chrome/browser/ui/views/frame/browser_non_client_frame_view.h"
15#include "chrome/browser/ui/views/frame/browser_root_view.h"
16#include "chrome/browser/ui/views/frame/browser_view.h"
17#include "chrome/browser/ui/views/frame/native_browser_frame.h"
18#include "chrome/common/chrome_switches.h"
19#include "ui/base/theme_provider.h"
20#include "ui/gfx/screen.h"
21#include "ui/views/widget/native_widget.h"
22
23#if defined(OS_WIN) && !defined(USE_AURA)
24#include "chrome/browser/ui/views/frame/glass_browser_frame_view.h"
25#endif
26
27////////////////////////////////////////////////////////////////////////////////
28// BrowserFrame, public:
29
30BrowserFrame::BrowserFrame(BrowserView* browser_view)
31    : native_browser_frame_(NULL),
32      root_view_(NULL),
33      browser_frame_view_(NULL),
34      browser_view_(browser_view) {
35  browser_view_->set_frame(this);
36  set_is_secondary_widget(false);
37  // Don't focus anything on creation, selecting a tab will set the focus.
38  set_focus_on_creation(false);
39}
40
41BrowserFrame::~BrowserFrame() {
42}
43
44void BrowserFrame::InitBrowserFrame() {
45  native_browser_frame_ =
46      NativeBrowserFrame::CreateNativeBrowserFrame(this, browser_view_);
47  views::Widget::InitParams params;
48  params.delegate = browser_view_;
49  params.native_widget = native_browser_frame_->AsNativeWidget();
50  if (browser_view_->browser()->is_type_tabbed()) {
51    // Typed panel/popup can only return a size once the widget has been
52    // created.
53    chrome::GetSavedWindowBoundsAndShowState(browser_view_->browser(),
54                                             &params.bounds,
55                                             &params.show_state);
56  }
57  if (browser_view_->IsPanel()) {
58    // We need to set the top-most bit when the panel window is created.
59    // There is a Windows bug/feature that would very likely prevent the window
60    // from being changed to top-most after the window is created without
61    // activation.
62    params.type = views::Widget::InitParams::TYPE_PANEL;
63  }
64  Init(params);
65
66  native_browser_frame_->InitSystemContextMenu();
67}
68
69int BrowserFrame::GetMinimizeButtonOffset() const {
70  return native_browser_frame_->GetMinimizeButtonOffset();
71}
72
73gfx::Rect BrowserFrame::GetBoundsForTabStrip(views::View* tabstrip) const {
74  return browser_frame_view_->GetBoundsForTabStrip(tabstrip);
75}
76
77BrowserNonClientFrameView::TabStripInsets BrowserFrame::GetTabStripInsets(
78    bool force_restored) const {
79  return browser_frame_view_->GetTabStripInsets(force_restored);
80}
81
82int BrowserFrame::GetThemeBackgroundXInset() const {
83  return browser_frame_view_->GetThemeBackgroundXInset();
84}
85
86void BrowserFrame::UpdateThrobber(bool running) {
87  browser_frame_view_->UpdateThrobber(running);
88}
89
90views::View* BrowserFrame::GetFrameView() const {
91  return browser_frame_view_;
92}
93
94void BrowserFrame::TabStripDisplayModeChanged() {
95  if (GetRootView()->has_children()) {
96    // Make sure the child of the root view gets Layout again.
97    GetRootView()->child_at(0)->InvalidateLayout();
98  }
99  GetRootView()->Layout();
100  native_browser_frame_->TabStripDisplayModeChanged();
101}
102
103///////////////////////////////////////////////////////////////////////////////
104// BrowserFrame, views::Widget overrides:
105
106views::internal::RootView* BrowserFrame::CreateRootView() {
107  root_view_ = new BrowserRootView(browser_view_, this);
108  return root_view_;
109}
110
111views::NonClientFrameView* BrowserFrame::CreateNonClientFrameView() {
112  browser_frame_view_ =
113      chrome::CreateBrowserNonClientFrameView(this, browser_view_);
114  return browser_frame_view_;
115}
116
117bool BrowserFrame::GetAccelerator(int command_id,
118                                  ui::Accelerator* accelerator) {
119  return browser_view_->GetAccelerator(command_id, accelerator);
120}
121
122ui::ThemeProvider* BrowserFrame::GetThemeProvider() const {
123  return ThemeServiceFactory::GetForProfile(
124      browser_view_->browser()->profile());
125}
126
127void BrowserFrame::OnNativeWidgetActivationChanged(bool active) {
128  if (active) {
129    // When running under remote desktop, if the remote desktop client is not
130    // active on the users desktop, then none of the windows contained in the
131    // remote desktop will be activated.  However, NativeWidgetWin::Activate()
132    // will still bring this browser window to the foreground.  We explicitly
133    // set ourselves as the last active browser window to ensure that we get
134    // treated as such by the rest of Chrome.
135    BrowserList::SetLastActive(browser_view_->browser());
136  }
137  Widget::OnNativeWidgetActivationChanged(active);
138}
139
140AvatarMenuButton* BrowserFrame::GetAvatarMenuButton() {
141  return browser_frame_view_->avatar_button();
142}
143
144#if !defined(OS_WIN) || defined(USE_AURA)
145bool BrowserFrame::ShouldLeaveOffsetNearTopBorder() {
146  return !IsMaximized();
147}
148#endif  // OS_WIN
149