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 ¶ms.bounds, 55 ¶ms.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