1 // Copyright (c) 2011 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/chromeos/frame/panel_browser_view.h" 6 7 #include "chrome/browser/chromeos/frame/panel_controller.h" 8 #include "third_party/cros/chromeos_wm_ipc_enums.h" 9 #include "views/widget/widget.h" 10 #include "views/window/window.h" 11 12 namespace { 13 14 const int kPanelMinWidthPixels = 100; 15 const int kPanelMinHeightPixels = 100; 16 const int kPanelDefaultWidthPixels = 250; 17 const int kPanelDefaultHeightPixels = 300; 18 const float kPanelMaxWidthFactor = 0.80; 19 const float kPanelMaxHeightFactor = 0.80; 20 21 } 22 23 namespace chromeos { 24 25 PanelBrowserView::PanelBrowserView(Browser* browser) 26 : BrowserView(browser), 27 creator_xid_(0) { 28 } 29 30 //////////////////////////////////////////////////////////////////////////////// 31 // PanelBrowserView functions 32 33 void PanelBrowserView::LimitBounds(gfx::Rect* bounds) const { 34 GdkScreen* screen = gtk_widget_get_screen(GetWidget()->GetNativeView()); 35 int max_width = gdk_screen_get_width(screen) * kPanelMaxWidthFactor; 36 int max_height = gdk_screen_get_height(screen) * kPanelMaxHeightFactor; 37 38 if (bounds->width() == 0 && bounds->height() == 0) { 39 bounds->set_width(kPanelDefaultWidthPixels); 40 bounds->set_height(kPanelDefaultHeightPixels); 41 } 42 43 if (bounds->width() < kPanelMinWidthPixels) 44 bounds->set_width(kPanelMinWidthPixels); 45 else if (bounds->width() > max_width) 46 bounds->set_width(max_width); 47 48 if (bounds->height() < kPanelMinHeightPixels) 49 bounds->set_height(kPanelMinHeightPixels); 50 else if (bounds->height() > max_height) 51 bounds->set_height(max_height); 52 } 53 54 55 //////////////////////////////////////////////////////////////////////////////// 56 // BrowserView overrides. 57 58 void PanelBrowserView::Show() { 59 InitPanelController(true); // focus when opened 60 ::BrowserView::Show(); 61 } 62 63 void PanelBrowserView::ShowInactive() { 64 InitPanelController(false); 65 ::BrowserView::ShowInactive(); 66 } 67 68 void PanelBrowserView::InitPanelController(bool is_active) { 69 if (panel_controller_.get() == NULL) { 70 panel_controller_.reset(new PanelController(this, GetNativeHandle())); 71 panel_controller_->Init( 72 is_active, bounds(), creator_xid_, 73 WM_IPC_PANEL_USER_RESIZE_HORIZONTALLY_AND_VERTICALLY); 74 } 75 } 76 77 void PanelBrowserView::SetBounds(const gfx::Rect& bounds) { 78 gfx::Rect limit_bounds = bounds; 79 LimitBounds(&limit_bounds); 80 ::BrowserView::SetBounds(limit_bounds); 81 } 82 83 void PanelBrowserView::Close() { 84 ::BrowserView::Close(); 85 if (panel_controller_.get()) 86 panel_controller_->Close(); 87 } 88 89 void PanelBrowserView::UpdateTitleBar() { 90 ::BrowserView::UpdateTitleBar(); 91 if (panel_controller_.get()) 92 panel_controller_->UpdateTitleBar(); 93 } 94 95 void PanelBrowserView::SetCreatorView(PanelBrowserView* creator) { 96 DCHECK(creator); 97 GtkWindow* window = creator->GetNativeHandle(); 98 creator_xid_ = ui::GetX11WindowFromGtkWidget(GTK_WIDGET(window)); 99 } 100 101 bool PanelBrowserView::GetSavedWindowBounds(gfx::Rect* bounds) const { 102 bool res = ::BrowserView::GetSavedWindowBounds(bounds); 103 if (res) 104 LimitBounds(bounds); 105 return res; 106 } 107 108 void PanelBrowserView::OnWindowActivationChanged(bool active) { 109 ::BrowserView::OnWindowActivationChanged(active); 110 if (panel_controller_.get()) { 111 if (active) 112 panel_controller_->OnFocusIn(); 113 else 114 panel_controller_->OnFocusOut(); 115 } 116 } 117 118 //////////////////////////////////////////////////////////////////////////////// 119 // TabStripModelObserver overrides. 120 121 void PanelBrowserView::TabChangedAt(TabContentsWrapper* contents, 122 int index, 123 TabChangeType change_type) { 124 if (change_type == TabStripModelObserver::TITLE_NOT_LOADING) 125 panel_controller_->SetUrgent(true); 126 } 127 128 //////////////////////////////////////////////////////////////////////////////// 129 // PanelController::Delegate overrides. 130 131 string16 PanelBrowserView::GetPanelTitle() { 132 return browser()->GetWindowTitleForCurrentTab(); 133 } 134 135 SkBitmap PanelBrowserView::GetPanelIcon() { 136 return browser()->GetCurrentPageIcon(); 137 } 138 139 bool PanelBrowserView::CanClosePanel() { 140 return ::BrowserView::CanClose(); 141 } 142 143 void PanelBrowserView::ClosePanel() { 144 Close(); 145 } 146 147 void PanelBrowserView::ActivatePanel() { 148 Activate(); 149 } 150 151 } // namespace chromeos 152