// Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "chrome/browser/chromeos/frame/panel_browser_view.h" #include "chrome/browser/chromeos/frame/panel_controller.h" #include "third_party/cros/chromeos_wm_ipc_enums.h" #include "views/widget/widget.h" #include "views/window/window.h" namespace { const int kPanelMinWidthPixels = 100; const int kPanelMinHeightPixels = 100; const int kPanelDefaultWidthPixels = 250; const int kPanelDefaultHeightPixels = 300; const float kPanelMaxWidthFactor = 0.80; const float kPanelMaxHeightFactor = 0.80; } namespace chromeos { PanelBrowserView::PanelBrowserView(Browser* browser) : BrowserView(browser), creator_xid_(0) { } //////////////////////////////////////////////////////////////////////////////// // PanelBrowserView functions void PanelBrowserView::LimitBounds(gfx::Rect* bounds) const { GdkScreen* screen = gtk_widget_get_screen(GetWidget()->GetNativeView()); int max_width = gdk_screen_get_width(screen) * kPanelMaxWidthFactor; int max_height = gdk_screen_get_height(screen) * kPanelMaxHeightFactor; if (bounds->width() == 0 && bounds->height() == 0) { bounds->set_width(kPanelDefaultWidthPixels); bounds->set_height(kPanelDefaultHeightPixels); } if (bounds->width() < kPanelMinWidthPixels) bounds->set_width(kPanelMinWidthPixels); else if (bounds->width() > max_width) bounds->set_width(max_width); if (bounds->height() < kPanelMinHeightPixels) bounds->set_height(kPanelMinHeightPixels); else if (bounds->height() > max_height) bounds->set_height(max_height); } //////////////////////////////////////////////////////////////////////////////// // BrowserView overrides. void PanelBrowserView::Show() { InitPanelController(true); // focus when opened ::BrowserView::Show(); } void PanelBrowserView::ShowInactive() { InitPanelController(false); ::BrowserView::ShowInactive(); } void PanelBrowserView::InitPanelController(bool is_active) { if (panel_controller_.get() == NULL) { panel_controller_.reset(new PanelController(this, GetNativeHandle())); panel_controller_->Init( is_active, bounds(), creator_xid_, WM_IPC_PANEL_USER_RESIZE_HORIZONTALLY_AND_VERTICALLY); } } void PanelBrowserView::SetBounds(const gfx::Rect& bounds) { gfx::Rect limit_bounds = bounds; LimitBounds(&limit_bounds); ::BrowserView::SetBounds(limit_bounds); } void PanelBrowserView::Close() { ::BrowserView::Close(); if (panel_controller_.get()) panel_controller_->Close(); } void PanelBrowserView::UpdateTitleBar() { ::BrowserView::UpdateTitleBar(); if (panel_controller_.get()) panel_controller_->UpdateTitleBar(); } void PanelBrowserView::SetCreatorView(PanelBrowserView* creator) { DCHECK(creator); GtkWindow* window = creator->GetNativeHandle(); creator_xid_ = ui::GetX11WindowFromGtkWidget(GTK_WIDGET(window)); } bool PanelBrowserView::GetSavedWindowBounds(gfx::Rect* bounds) const { bool res = ::BrowserView::GetSavedWindowBounds(bounds); if (res) LimitBounds(bounds); return res; } void PanelBrowserView::OnWindowActivationChanged(bool active) { ::BrowserView::OnWindowActivationChanged(active); if (panel_controller_.get()) { if (active) panel_controller_->OnFocusIn(); else panel_controller_->OnFocusOut(); } } //////////////////////////////////////////////////////////////////////////////// // TabStripModelObserver overrides. void PanelBrowserView::TabChangedAt(TabContentsWrapper* contents, int index, TabChangeType change_type) { if (change_type == TabStripModelObserver::TITLE_NOT_LOADING) panel_controller_->SetUrgent(true); } //////////////////////////////////////////////////////////////////////////////// // PanelController::Delegate overrides. string16 PanelBrowserView::GetPanelTitle() { return browser()->GetWindowTitleForCurrentTab(); } SkBitmap PanelBrowserView::GetPanelIcon() { return browser()->GetCurrentPageIcon(); } bool PanelBrowserView::CanClosePanel() { return ::BrowserView::CanClose(); } void PanelBrowserView::ClosePanel() { Close(); } void PanelBrowserView::ActivatePanel() { Activate(); } } // namespace chromeos