| Index: chrome/browser/chromeos/chromeos_browser_extenders.cc
|
| ===================================================================
|
| --- chrome/browser/chromeos/chromeos_browser_extenders.cc (revision 30488)
|
| +++ chrome/browser/chromeos/chromeos_browser_extenders.cc (working copy)
|
| @@ -1,338 +0,0 @@
|
| -// Copyright (c) 2009 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 <algorithm>
|
| -
|
| -#include "app/theme_provider.h"
|
| -#include "chrome/app/chrome_dll_resource.h"
|
| -#include "chrome/browser/chromeos/compact_location_bar.h"
|
| -#include "chrome/browser/chromeos/compact_navigation_bar.h"
|
| -#include "chrome/browser/chromeos/main_menu.h"
|
| -#include "chrome/browser/chromeos/status_area_view.h"
|
| -#include "chrome/browser/chromeos/panel_controller.h"
|
| -#include "chrome/browser/views/frame/browser_extender.h"
|
| -#include "chrome/browser/views/frame/browser_frame_gtk.h"
|
| -#include "chrome/browser/views/frame/browser_view.h"
|
| -#include "chrome/browser/views/tabs/tab_overview_types.h"
|
| -#include "chrome/browser/views/tabs/tab_strip.h"
|
| -#include "chrome/browser/views/tabs/tab_strip_wrapper.h"
|
| -#include "chrome/browser/views/toolbar_view.h"
|
| -#include "grit/generated_resources.h"
|
| -#include "grit/theme_resources.h"
|
| -#include "views/controls/button/button.h"
|
| -#include "views/controls/button/image_button.h"
|
| -#include "views/controls/menu/simple_menu_model.h"
|
| -#include "views/window/window.h"
|
| -
|
| -namespace {
|
| -
|
| -// NormalExtender adds ChromeOS specific controls and menus to a BrowserView
|
| -// created with Browser::TYPE_NORMAL. This extender adds controls to
|
| -// the title bar as follows:
|
| -// ____ __ __
|
| -// [MainMenu] / \ \ \ [StatusArea]
|
| -//
|
| -// and adds the system context menu to the remaining arae of the titlebar.
|
| -//
|
| -// For Browser::TYPE_POPUP type of BrowserView, see PopupExtender class below.
|
| -class NormalExtender : public BrowserExtender,
|
| - public views::ButtonListener,
|
| - public views::ContextMenuController {
|
| - public:
|
| - explicit NormalExtender(BrowserView* browser_view)
|
| - : BrowserExtender(browser_view),
|
| - main_menu_(NULL),
|
| - status_area_(NULL),
|
| - compact_navigation_bar_(NULL),
|
| - // CompactNavigationBar is disabled by default.
|
| - // TODO(oshima): Get this info from preference.
|
| - compact_navigation_bar_enabled_(false) {
|
| - }
|
| - virtual ~NormalExtender() {}
|
| -
|
| - protected:
|
| - // BrowserExtender overrides.
|
| - virtual void Init() {
|
| - main_menu_ = new views::ImageButton(this);
|
| - ThemeProvider* theme_provider =
|
| - browser_view()->frame()->GetThemeProviderForFrame();
|
| - SkBitmap* image = theme_provider->GetBitmapNamed(IDR_MAIN_MENU_BUTTON);
|
| - main_menu_->SetImage(views::CustomButton::BS_NORMAL, image);
|
| - main_menu_->SetImage(views::CustomButton::BS_HOT, image);
|
| - main_menu_->SetImage(views::CustomButton::BS_PUSHED, image);
|
| - browser_view()->AddChildView(main_menu_);
|
| -
|
| - compact_location_bar_.reset(new CompactLocationBar(browser_view()));
|
| - compact_navigation_bar_ =
|
| - new CompactNavigationBar(browser_view()->browser());
|
| - browser_view()->AddChildView(compact_navigation_bar_);
|
| - compact_navigation_bar_->Init();
|
| - status_area_ = new StatusAreaView(
|
| - browser_view()->browser(),
|
| - browser_view()->GetWindow()->GetNativeWindow());
|
| - browser_view()->AddChildView(status_area_);
|
| - status_area_->Init();
|
| -
|
| - InitSystemMenu();
|
| - MainMenu::ScheduleCreation();
|
| -
|
| - // The ContextMenuController has to be set to a NonClientView but
|
| - // not to a NonClientFrameView because a TabStrip is not a child of
|
| - // a NonClientFrameView even though visually a TabStrip is over a
|
| - // NonClientFrameView.
|
| - BrowserFrameGtk* gtk_frame =
|
| - static_cast<BrowserFrameGtk*>(browser_view()->frame());
|
| - gtk_frame->GetNonClientView()->SetContextMenuController(this);
|
| - }
|
| -
|
| - virtual gfx::Rect Layout(const gfx::Rect& bounds) {
|
| - // Skip if there is no space to layout, or if the browser is in
|
| - // fullscreen mode.
|
| - if (bounds.IsEmpty() || browser_view()->IsFullscreen()) {
|
| - main_menu_->SetVisible(false);
|
| - compact_navigation_bar_->SetVisible(false);
|
| - status_area_->SetVisible(false);
|
| - return bounds;
|
| - } else {
|
| - main_menu_->SetVisible(true);
|
| - compact_navigation_bar_->SetVisible(compact_navigation_bar_enabled_);
|
| - status_area_->SetVisible(true);
|
| - }
|
| -
|
| - if (compact_navigation_bar_->IsVisible()) {
|
| - // Update the size and location of the compact location bar.
|
| - compact_location_bar_->UpdateBounds(
|
| - browser_view()->tabstrip()->AsTabStrip()->GetSelectedTab());
|
| - }
|
| -
|
| - // Layout main menu before tab strip.
|
| - gfx::Size main_menu_size = main_menu_->GetPreferredSize();
|
| - main_menu_->SetBounds(bounds.x(), bounds.y(),
|
| - main_menu_size.width(), bounds.height());
|
| -
|
| - // Layout status area after tab strip.
|
| - gfx::Size status_size = status_area_->GetPreferredSize();
|
| - status_area_->SetBounds(bounds.x() + bounds.width() - status_size.width(),
|
| - bounds.y(), status_size.width(),
|
| - status_size.height());
|
| - int curx = bounds.x() + main_menu_size.width();
|
| - int width = bounds.width() - main_menu_size.width() - status_size.width();
|
| -
|
| - if (compact_navigation_bar_->IsVisible()) {
|
| - gfx::Size cnb_bounds = compact_navigation_bar_->GetPreferredSize();
|
| - compact_navigation_bar_->SetBounds(curx, bounds.y(),
|
| - cnb_bounds.width(), bounds.height());
|
| - curx += cnb_bounds.width();
|
| - width -= cnb_bounds.width();
|
| - }
|
| - width = std::max(0, width); // In case there is no space left.
|
| - return gfx::Rect(curx, bounds.y(), width, bounds.height());
|
| - }
|
| -
|
| - virtual bool NonClientHitTest(const gfx::Point& point) {
|
| - gfx::Point point_in_main_menu_coords(point);
|
| - views::View::ConvertPointToView(browser_view(), main_menu_,
|
| - &point_in_main_menu_coords);
|
| - if (main_menu_->HitTest(point_in_main_menu_coords))
|
| - return true;
|
| -
|
| - gfx::Point point_in_status_area_coords(point);
|
| - views::View::ConvertPointToView(browser_view(), status_area_,
|
| - &point_in_status_area_coords);
|
| - if (status_area_->HitTest(point_in_status_area_coords))
|
| - return true;
|
| -
|
| - if (compact_navigation_bar_->IsVisible()) {
|
| - gfx::Point point_in_cnb_coords(point);
|
| - views::View::ConvertPointToView(browser_view(),
|
| - compact_navigation_bar_,
|
| - &point_in_cnb_coords);
|
| - return compact_navigation_bar_->HitTest(point_in_cnb_coords);
|
| - }
|
| - return false;
|
| - }
|
| -
|
| - virtual void UpdateTitleBar() {}
|
| -
|
| - virtual void Show() {
|
| - TabOverviewTypes::instance()->SetWindowType(
|
| - GTK_WIDGET(GetBrowserWindow()->GetNativeWindow()),
|
| - TabOverviewTypes::WINDOW_TYPE_CHROME_TOPLEVEL,
|
| - NULL);
|
| - }
|
| -
|
| - virtual void Close() {}
|
| -
|
| - virtual void ActivationChanged() {}
|
| -
|
| - virtual bool ShouldForceHideToolbar() {
|
| - return compact_navigation_bar_enabled_;
|
| - }
|
| -
|
| - virtual void ToggleCompactNavigationBar() {
|
| - compact_navigation_bar_enabled_ = !compact_navigation_bar_enabled_;
|
| - }
|
| -
|
| - virtual void OnMouseEnteredToTab(Tab* tab) {
|
| - ShowCompactLocationBarUnderSelectedTab();
|
| - }
|
| -
|
| - virtual void OnMouseMovedOnTab(Tab* tab) {
|
| - ShowCompactLocationBarUnderSelectedTab();
|
| - }
|
| -
|
| - virtual void OnMouseExitedFromTab(Tab* tab) {
|
| - compact_location_bar_->StartPopupTimer();
|
| - }
|
| -
|
| - private:
|
| - // Shows the compact location bar under the selected tab.
|
| - void ShowCompactLocationBarUnderSelectedTab() {
|
| - if (!compact_navigation_bar_enabled_)
|
| - return;
|
| - compact_location_bar_->Update(
|
| - browser_view()->tabstrip()->AsTabStrip()->GetSelectedTab(),
|
| - browser_view()->browser()->GetSelectedTabContents());
|
| - }
|
| -
|
| - // Creates system menu.
|
| - void InitSystemMenu() {
|
| - system_menu_contents_.reset(new views::SimpleMenuModel(browser_view()));
|
| - system_menu_contents_->AddItemWithStringId(IDC_RESTORE_TAB,
|
| - IDS_RESTORE_TAB);
|
| - system_menu_contents_->AddItemWithStringId(IDC_NEW_TAB, IDS_NEW_TAB);
|
| - system_menu_contents_->AddSeparator();
|
| - system_menu_contents_->AddItemWithStringId(IDC_TASK_MANAGER,
|
| - IDS_TASK_MANAGER);
|
| - system_menu_menu_.reset(new views::Menu2(system_menu_contents_.get()));
|
| - }
|
| -
|
| - // views::ButtonListener overrides.
|
| - virtual void ButtonPressed(views::Button* sender, const views::Event& event) {
|
| - MainMenu::Show(browser_view()->browser());
|
| - }
|
| -
|
| - // views::ContextMenuController overrides.
|
| - virtual void ShowContextMenu(views::View* source,
|
| - int x,
|
| - int y,
|
| - bool is_mouse_gesture) {
|
| - system_menu_menu_->RunMenuAt(gfx::Point(x, y), views::Menu2::ALIGN_TOPLEFT);
|
| - }
|
| -
|
| - // Main menu button.
|
| - views::ImageButton* main_menu_;
|
| -
|
| - // Status Area view.
|
| - StatusAreaView* status_area_;
|
| -
|
| - // System menus.
|
| - scoped_ptr<views::SimpleMenuModel> system_menu_contents_;
|
| - scoped_ptr<views::Menu2> system_menu_menu_;
|
| -
|
| - // CompactNavigationBar view.
|
| - CompactNavigationBar* compact_navigation_bar_;
|
| -
|
| - // A toggle flag to show/hide the compact navigation bar.
|
| - bool compact_navigation_bar_enabled_;
|
| -
|
| - // CompactLocationBar view.
|
| - scoped_ptr<CompactLocationBar> compact_location_bar_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(NormalExtender);
|
| -};
|
| -
|
| -// PopupExtender class creates dedicated title window for popup window.
|
| -// The size and location of the created title window is controlled by
|
| -// by window manager.
|
| -class PopupExtender : public BrowserExtender {
|
| - public:
|
| - explicit PopupExtender(BrowserView* browser_view)
|
| - : BrowserExtender(browser_view) {
|
| - }
|
| - virtual ~PopupExtender() {}
|
| -
|
| - private:
|
| - // BrowserExtender overrides.
|
| - virtual void Init() {
|
| - // The visibility of toolbar is controlled in
|
| - // the BrowserView::IsToolbarVisible method.
|
| -
|
| - views::Window* window = GetBrowserWindow();
|
| - gfx::NativeWindow native_window = window->GetNativeWindow();
|
| - // The window manager needs the min size for popups.
|
| - gfx::Rect bounds = window->GetBounds();
|
| - gtk_widget_set_size_request(
|
| - GTK_WIDGET(native_window), bounds.width(), bounds.height());
|
| - // If we don't explicitly resize here there is a race condition between
|
| - // the X Server and the window manager. Windows will appear with a default
|
| - // size of 200x200 if this happens.
|
| - gtk_window_resize(native_window, bounds.width(), bounds.height());
|
| - }
|
| -
|
| - virtual gfx::Rect Layout(const gfx::Rect& bounds) {
|
| - return bounds;
|
| - }
|
| -
|
| - virtual bool NonClientHitTest(const gfx::Point& point) {
|
| - return false;
|
| - }
|
| -
|
| - virtual void Show() {
|
| - panel_controller_.reset(new PanelController(browser_view()));
|
| - }
|
| -
|
| - virtual void Close() {
|
| - if (panel_controller_.get())
|
| - panel_controller_->Close();
|
| - }
|
| -
|
| - virtual void UpdateTitleBar() {
|
| - if (panel_controller_.get())
|
| - panel_controller_->UpdateTitleBar();
|
| - }
|
| -
|
| - virtual void ActivationChanged() {
|
| - if (panel_controller_.get()) {
|
| - if (GetBrowserWindow()->IsActive())
|
| - panel_controller_->OnFocusIn();
|
| - else
|
| - panel_controller_->OnFocusOut();
|
| - }
|
| - }
|
| -
|
| - virtual bool ShouldForceHideToolbar() {
|
| - // Always hide toolbar for popups.
|
| - return true;
|
| - }
|
| -
|
| - virtual void ToggleCompactNavigationBar() {}
|
| -
|
| - virtual void OnMouseEnteredToTab(Tab* tab) {}
|
| -
|
| - virtual void OnMouseMovedOnTab(Tab* tab) {}
|
| -
|
| - virtual void OnMouseExitedFromTab(Tab* tab) {}
|
| -
|
| - // Controls interactions with the window manager for popup panels.
|
| - scoped_ptr<PanelController> panel_controller_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(PopupExtender);
|
| -};
|
| -
|
| -} // namespace
|
| -
|
| -////////////////////////////////////////////////////////////////////////////////
|
| -// BrowserExtender, public:
|
| -
|
| -// static
|
| -BrowserExtender* BrowserExtender::Create(BrowserView* browser_view) {
|
| - BrowserExtender* extender;
|
| - if (browser_view->browser()->type() & Browser::TYPE_POPUP)
|
| - extender = new PopupExtender(browser_view);
|
| - else
|
| - extender = new NormalExtender(browser_view);
|
| - extender->Init();
|
| - return extender;
|
| -}
|
|
|