From ae25f9f425e0e652e0d72edf6fb5d080d5760f3b Mon Sep 17 00:00:00 2001 From: "oshima@chromium.org" Date: Thu, 22 Oct 2009 23:41:24 +0000 Subject: * Moved panel controller to chromeos directory * Include BrowserExtender to regular build to remove CHROMEOS ifdefs in BrowserView * moved browser_extender.h to chrome/browser/views/frame, and BrowserExtender methods to chrome/browser/views/frame/browser_extender.cc. * Added StandardExtender (standard_extender.cc), which is empty now. I'm going to add MainMenu support to win, which will be added vua StandardExtender with a command line flag. * factory method "Create" is now defined in standard_extender.cc and chromeos/chromeos_browser_extenders.cc. toolkit_views=1 uses chromeos_browser_extenders.cc and other build uses standard_extender BUG=None TEST=None Review URL: http://codereview.chromium.org/317001 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@29836 0039d316-1c4b-4281-b951-d872f2087c98 --- chrome/browser/chromeos/browser_extender.cc | 240 --------------- chrome/browser/chromeos/browser_extender.h | 92 ------ .../browser/chromeos/chromeos_browser_extenders.cc | 233 ++++++++++++++ chrome/browser/chromeos/panel_controller.cc | 334 +++++++++++++++++++++ chrome/browser/chromeos/panel_controller.h | 127 ++++++++ chrome/browser/chromeos/panels/panel_scroller.cc | 253 ++++++++++++++++ chrome/browser/chromeos/panels/panel_scroller.h | 70 +++++ .../chromeos/panels/panel_scroller_container.cc | 30 ++ .../chromeos/panels/panel_scroller_container.h | 37 +++ .../chromeos/panels/panel_scroller_header.cc | 51 ++++ .../chromeos/panels/panel_scroller_header.h | 42 +++ chrome/browser/gtk/browser_window_gtk.cc | 2 +- chrome/browser/views/frame/browser_extender.cc | 25 ++ chrome/browser/views/frame/browser_extender.h | 86 ++++++ chrome/browser/views/frame/browser_view.cc | 38 +-- chrome/browser/views/frame/browser_view.h | 8 +- chrome/browser/views/frame/standard_extender.cc | 38 +++ chrome/browser/views/panel_controller.cc | 333 -------------------- chrome/browser/views/panel_controller.h | 126 -------- chrome/browser/views/panels/panel_scroller.cc | 253 ---------------- chrome/browser/views/panels/panel_scroller.h | 69 ----- .../views/panels/panel_scroller_container.cc | 30 -- .../views/panels/panel_scroller_container.h | 36 --- .../browser/views/panels/panel_scroller_header.cc | 51 ---- .../browser/views/panels/panel_scroller_header.h | 41 --- .../browser/views/tabs/tab_overview_controller.cc | 2 +- chrome/chrome.gyp | 27 +- 27 files changed, 1351 insertions(+), 1323 deletions(-) delete mode 100644 chrome/browser/chromeos/browser_extender.cc delete mode 100644 chrome/browser/chromeos/browser_extender.h create mode 100644 chrome/browser/chromeos/chromeos_browser_extenders.cc create mode 100644 chrome/browser/chromeos/panel_controller.cc create mode 100644 chrome/browser/chromeos/panel_controller.h create mode 100644 chrome/browser/chromeos/panels/panel_scroller.cc create mode 100644 chrome/browser/chromeos/panels/panel_scroller.h create mode 100644 chrome/browser/chromeos/panels/panel_scroller_container.cc create mode 100644 chrome/browser/chromeos/panels/panel_scroller_container.h create mode 100644 chrome/browser/chromeos/panels/panel_scroller_header.cc create mode 100644 chrome/browser/chromeos/panels/panel_scroller_header.h create mode 100644 chrome/browser/views/frame/browser_extender.cc create mode 100644 chrome/browser/views/frame/browser_extender.h create mode 100644 chrome/browser/views/frame/standard_extender.cc delete mode 100644 chrome/browser/views/panel_controller.cc delete mode 100644 chrome/browser/views/panel_controller.h delete mode 100644 chrome/browser/views/panels/panel_scroller.cc delete mode 100644 chrome/browser/views/panels/panel_scroller.h delete mode 100644 chrome/browser/views/panels/panel_scroller_container.cc delete mode 100644 chrome/browser/views/panels/panel_scroller_container.h delete mode 100644 chrome/browser/views/panels/panel_scroller_header.cc delete mode 100644 chrome/browser/views/panels/panel_scroller_header.h diff --git a/chrome/browser/chromeos/browser_extender.cc b/chrome/browser/chromeos/browser_extender.cc deleted file mode 100644 index 44b4e51..0000000 --- a/chrome/browser/chromeos/browser_extender.cc +++ /dev/null @@ -1,240 +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 "chrome/browser/chromeos/browser_extender.h" - -#include - -#include "app/theme_provider.h" -#include "chrome/app/chrome_dll_resource.h" -#include "chrome/browser/chromeos/main_menu.h" -#include "chrome/browser/chromeos/status_area_view.h" -#include "chrome/browser/views/frame/browser_frame_gtk.h" -#include "chrome/browser/views/frame/browser_view.h" -#include "chrome/browser/views/panel_controller.h" -#include "chrome/browser/views/tabs/tab_overview_types.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 BrowserView -// created with Browser::TYPE_NORMAL. 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) { - } - 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_); - - 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(browser_view()->frame()); - gtk_frame->GetNonClientView()->SetContextMenuController(this); - } - - virtual gfx::Rect Layout(const gfx::Rect& bounds) { - // skip if there is no space to layout. - if (bounds.IsEmpty()) - return bounds; - - // 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 width = bounds.width() - main_menu_size.width() - status_size.width(); - return gfx::Rect(bounds.x() + main_menu_size.width(), - bounds.y(), - std::max(0, width), // in case there is no space left. - 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); - - gfx::Point point_in_status_area_coords(point); - views::View::ConvertPointToView(browser_view(), status_area_, - &point_in_status_area_coords); - - return main_menu_->HitTest(point_in_main_menu_coords) || - status_area_->HitTest(point_in_status_area_coords); - } - - virtual void Show() { - // TODO(oshima): PanelController seems to be doing something similar. - // Investigate if we need both. - TabOverviewTypes::instance()->SetWindowType( - GTK_WIDGET(GetBrowserWindow()->GetNativeWindow()), - TabOverviewTypes::WINDOW_TYPE_CHROME_TOPLEVEL, - NULL); - } - - private: - // 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 system_menu_contents_; - scoped_ptr system_menu_menu_; - - 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 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(); - } - } - - // Controls interactions with the window manager for popup panels. - scoped_ptr panel_controller_; - - DISALLOW_COPY_AND_ASSIGN(PopupExtender); -}; - -} // namespace - -//////////////////////////////////////////////////////////////////////////////// -// BrowserExtender, public: - -BrowserExtender::BrowserExtender(BrowserView* browser_view) - : browser_view_(browser_view), - can_close_(true) { -} - -// 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; -} - -//////////////////////////////////////////////////////////////////////////////// -// BrowserExtender, protected: - -views::Window* BrowserExtender::GetBrowserWindow() { - return browser_view_->frame()->GetWindow(); -} diff --git a/chrome/browser/chromeos/browser_extender.h b/chrome/browser/chromeos/browser_extender.h deleted file mode 100644 index 3cc3d5d..0000000 --- a/chrome/browser/chromeos/browser_extender.h +++ /dev/null @@ -1,92 +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. - -#ifndef CHROME_BROWSER_CHROMEOS_BROWSER_EXTENDER_H_ -#define CHROME_BROWSER_CHROMEOS_BROWSER_EXTENDER_H_ - -#include "base/basictypes.h" -#include "base/gfx/rect.h" - -class BrowserView; - -namespace views { -class Window; -} // namespace views - - -// BrowserExtender adds chromeos specific features to BrowserView. -// The factory method |Create(BrowserView*)| returns two different types -// of extender depending on the type of BrowserView. If the browser_view -// is normal browser, it returns NormalExtender that adds controls to -// the title bar as follows: -// ____ __ __ -// [MainMenu] / \ \ \ [StatusArea] -// -// and adds the system context menu to the remaining arae of the titlebar. -// -// If it is popup window, it returns PopupExtender that creates -// a title window. -class BrowserExtender { - public: - // Factory method to create a BrowserExtender for given - // BrowserView object. Please see the class description for details. - static BrowserExtender* Create(BrowserView* browser_view); - - virtual ~BrowserExtender() {} - - // Initializes the extender. - virtual void Init() = 0; - - // Layouts controls within the given bounds and returns the remaining - // bounds for tabstip to be layed out. - virtual gfx::Rect Layout(const gfx::Rect& bounds) { return bounds; } - - // Tests if the given |point|, which is given in BrowserView coordinates, - // hits any of controls. - virtual bool NonClientHitTest(const gfx::Point& browser_view_point) = 0; - - // Updates the title bar (if any). - virtual void UpdateTitleBar() {} - - // Called when the BrowserView is shown. - virtual void Show() = 0; - - // Called when the BrowserView is closed. - virtual void Close() {} - - // Called when the browser window is either activated or deactivated. - virtual void ActivationChanged() {} - - // Tells if the browser can be closed. - bool can_close() const { - return can_close_; - } - - // Specifies if the browser can be closed or not. This typically set - // to false when the browser is being dragged. - void set_can_close(bool b) { - can_close_ = b; - } - - protected: - explicit BrowserExtender(BrowserView* browser_view); - - // Returns the view Window object that contains the BrowserView. - views::Window* GetBrowserWindow(); - - BrowserView* browser_view() { - return browser_view_; - } - - private: - // BrowserView to be extended. - BrowserView* browser_view_; - - // True if the browser can be closed. See set_can_close method for setails. - bool can_close_; - - DISALLOW_COPY_AND_ASSIGN(BrowserExtender); -}; - -#endif // CHROME_BROWSER_CHROMEOS_BROWSER_EXTENDER_H_ diff --git a/chrome/browser/chromeos/chromeos_browser_extenders.cc b/chrome/browser/chromeos/chromeos_browser_extenders.cc new file mode 100644 index 0000000..cf11585 --- /dev/null +++ b/chrome/browser/chromeos/chromeos_browser_extenders.cc @@ -0,0 +1,233 @@ +// 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 + +#include "app/theme_provider.h" +#include "chrome/app/chrome_dll_resource.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/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) { + } + 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_); + + 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(browser_view()->frame()); + gtk_frame->GetNonClientView()->SetContextMenuController(this); + } + + virtual gfx::Rect Layout(const gfx::Rect& bounds) { + // skip if there is no space to layout. + if (bounds.IsEmpty()) + return bounds; + + // 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 width = bounds.width() - main_menu_size.width() - status_size.width(); + return gfx::Rect(bounds.x() + main_menu_size.width(), + bounds.y(), + std::max(0, width), // in case there is no space left. + 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); + + gfx::Point point_in_status_area_coords(point); + views::View::ConvertPointToView(browser_view(), status_area_, + &point_in_status_area_coords); + + return main_menu_->HitTest(point_in_main_menu_coords) || + status_area_->HitTest(point_in_status_area_coords); + } + + virtual void Show() { + // TODO(oshima): PanelController seems to be doing something similar. + // Investigate if we need both. + TabOverviewTypes::instance()->SetWindowType( + GTK_WIDGET(GetBrowserWindow()->GetNativeWindow()), + TabOverviewTypes::WINDOW_TYPE_CHROME_TOPLEVEL, + NULL); + } + + private: + // 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 system_menu_contents_; + scoped_ptr system_menu_menu_; + + 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 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(); + } + } + + // Controls interactions with the window manager for popup panels. + scoped_ptr 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; +} diff --git a/chrome/browser/chromeos/panel_controller.cc b/chrome/browser/chromeos/panel_controller.cc new file mode 100644 index 0000000..3b393d2 --- /dev/null +++ b/chrome/browser/chromeos/panel_controller.cc @@ -0,0 +1,334 @@ +// 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 "chrome/browser/chromeos/panel_controller.h" + +#include "app/resource_bundle.h" +#include "base/logging.h" +#include "base/singleton.h" +#include "base/scoped_ptr.h" +#include "base/string_util.h" +#include "chrome/browser/browser.h" +#if defined(TOOLKIT_VIEWS) +#include "chrome/browser/views/frame/browser_view.h" +#else +#include "chrome/browser/gtk/browser_window_gtk.h" +#endif +#include "chrome/browser/views/tabs/tab_overview_types.h" +#include "chrome/common/x11_util.h" +#include "grit/app_resources.h" +#include "grit/generated_resources.h" +#include "grit/theme_resources.h" +#include "views/controls/button/image_button.h" +#include "views/controls/image_view.h" +#include "views/controls/label.h" +#include "views/event.h" +#include "views/view.h" +#include "views/widget/widget_gtk.h" +#include "views/window/window.h" + +static int close_button_width; +static int close_button_height; +static SkBitmap* close_button_n; +static SkBitmap* close_button_m; +static SkBitmap* close_button_h; +static SkBitmap* close_button_p; +static gfx::Font* active_font = NULL; +static gfx::Font* inactive_font = NULL; + +namespace { + +const int kTitleWidth = 200; +const int kTitleHeight = 20; +const int kTitleIconSize = 16; +const int kTitleWidthPad = 2; +const int kTitleHeightPad = 1; +const int kButtonPad = 4; + +const SkColor kActiveGradientStart = 0xffebeff9; +const SkColor kActiveGradientEnd = 0xffb3c4f6; +const SkColor kInactiveGradientStart = 0xfff2f2f2; +const SkColor kInactiveGradientEnd = 0xfff2f2f2; +const SkColor kActiveColor = SK_ColorBLACK; +const SkColor kInactiveColor = 0xff333333; +const SkColor kCloseButtonColor = SK_ColorBLACK; + +static bool resources_initialized; +static void InitializeResources() { + if (resources_initialized) { + return; + } + + resources_initialized = true; + ResourceBundle& rb = ResourceBundle::GetSharedInstance(); + inactive_font = new gfx::Font(rb.GetFont(ResourceBundle::BaseFont)); + active_font = new gfx::Font(inactive_font->DeriveFont(0, gfx::Font::BOLD)); + close_button_n = rb.GetBitmapNamed(IDR_TAB_CLOSE); + close_button_m = rb.GetBitmapNamed(IDR_TAB_CLOSE_MASK); + close_button_h = rb.GetBitmapNamed(IDR_TAB_CLOSE_H); + close_button_p = rb.GetBitmapNamed(IDR_TAB_CLOSE_P); + close_button_width = close_button_n->width(); + close_button_height = close_button_n->height(); +} + +} // namespace + +#if defined(TOOLKIT_VIEWS) +PanelController::PanelController(BrowserView* browser_window) + : browser_window_(browser_window), + panel_(browser_window->GetNativeHandle()), + panel_xid_(x11_util::GetX11WindowFromGtkWidget(GTK_WIDGET(panel_))), + title_window_(NULL), + expanded_(true), + mouse_down_(false), + dragging_(false) { + Init(browser_window->bounds()); +} +#else +PanelController::PanelController(BrowserWindowGtk* browser_window) + : browser_window_(browser_window), + panel_(browser_window->window()), + panel_xid_(x11_util::GetX11WindowFromGtkWidget(GTK_WIDGET(panel_))), + title_window_(NULL), + expanded_(true), + mouse_down_(false), + dragging_(false) { + Init(browser_window->bounds()); +} +#endif + +void PanelController::Init(const gfx::Rect window_bounds) { + gfx::Rect title_bounds( + 0, 0, window_bounds.width(), kTitleHeight); + + title_window_ = new views::WidgetGtk(views::WidgetGtk::TYPE_WINDOW); + title_window_->Init(NULL, title_bounds); + title_ = title_window_->GetNativeView(); + title_xid_ = x11_util::GetX11WindowFromGtkWidget(title_); + + TabOverviewTypes* tab_overview = TabOverviewTypes::instance(); + tab_overview->SetWindowType( + title_, + TabOverviewTypes::WINDOW_TYPE_CHROME_PANEL_TITLEBAR, + NULL); + std::vector type_params; + type_params.push_back(title_xid_); + type_params.push_back(expanded_ ? 1 : 0); + tab_overview->SetWindowType( + GTK_WIDGET(panel_), + TabOverviewTypes::WINDOW_TYPE_CHROME_PANEL, + &type_params); + + g_signal_connect( + panel_, "client-event", G_CALLBACK(OnPanelClientEvent), this); + + title_content_ = new TitleContentView(this); + title_window_->SetContentsView(title_content_); + title_window_->Show(); +} + +void PanelController::UpdateTitleBar() { + if (!browser_window_ || !title_window_) + return; + Browser* browser = browser_window_->browser(); + title_content_->title_label()->SetText( + UTF16ToWideHack(browser->GetWindowTitleForCurrentTab())); + title_content_->title_icon()->SetImage(browser->GetCurrentPageIcon()); +} + +bool PanelController::TitleMousePressed(const views::MouseEvent& event) { + if (!event.IsOnlyLeftMouseButton()) { + return false; + } + GdkEvent* gdk_event = gtk_get_current_event(); + if (gdk_event->type != GDK_BUTTON_PRESS) { + gdk_event_free(gdk_event); + NOTREACHED(); + return false; + } + GdkEventButton last_button_event = gdk_event->button; + mouse_down_ = true; + mouse_down_abs_x_ = last_button_event.x_root; + mouse_down_abs_y_ = last_button_event.y_root; + mouse_down_offset_x_ = event.x(); + mouse_down_offset_y_ = event.y(); + dragging_ = false; + gdk_event_free(gdk_event); + return true; +} + +void PanelController::TitleMouseReleased( + const views::MouseEvent& event, bool canceled) { + if (!event.IsOnlyLeftMouseButton()) { + return; + } + // Only handle clicks that started in our window. + if (!mouse_down_) { + return; + } + + mouse_down_ = false; + if (!dragging_) { + TabOverviewTypes::Message msg( + TabOverviewTypes::Message::WM_SET_PANEL_STATE); + msg.set_param(0, panel_xid_); + msg.set_param(1, expanded_ ? 0 : 1); + TabOverviewTypes::instance()->SendMessage(msg); + } else { + TabOverviewTypes::Message msg( + TabOverviewTypes::Message::WM_NOTIFY_PANEL_DRAG_COMPLETE); + msg.set_param(0, panel_xid_); + TabOverviewTypes::instance()->SendMessage(msg); + dragging_ = false; + } +} + +bool PanelController::TitleMouseDragged(const views::MouseEvent& event) { + if (!mouse_down_) { + return false; + } + + GdkEvent* gdk_event = gtk_get_current_event(); + if (gdk_event->type != GDK_MOTION_NOTIFY) { + gdk_event_free(gdk_event); + NOTREACHED(); + return false; + } + GdkEventMotion last_motion_event = gdk_event->motion; + if (!dragging_) { + if (views::View::ExceededDragThreshold( + last_motion_event.x_root - mouse_down_abs_x_, + last_motion_event.y_root - mouse_down_abs_y_)) { + dragging_ = true; + } + } + if (dragging_) { + TabOverviewTypes::Message msg(TabOverviewTypes::Message::WM_MOVE_PANEL); + msg.set_param(0, panel_xid_); + msg.set_param(1, last_motion_event.x_root - mouse_down_offset_x_); + msg.set_param(2, last_motion_event.y_root - mouse_down_offset_y_); + TabOverviewTypes::instance()->SendMessage(msg); + } + gdk_event_free(gdk_event); + return true; +} + +// static +bool PanelController::OnPanelClientEvent( + GtkWidget* widget, + GdkEventClient* event, + PanelController* panel_controller) { + return panel_controller->PanelClientEvent(event); +} + +void PanelController::OnFocusIn() { + if (title_window_) + title_content_->OnFocusIn(); +} + +void PanelController::OnFocusOut() { + if (title_window_) + title_content_->OnFocusOut(); +} + +bool PanelController::PanelClientEvent(GdkEventClient* event) { + TabOverviewTypes::Message msg; + TabOverviewTypes::instance()->DecodeMessage(*event, &msg); + if (msg.type() == TabOverviewTypes::Message::CHROME_NOTIFY_PANEL_STATE) { + expanded_ = msg.param(0); + } + return true; +} + +void PanelController::Close() { + // ignore if the title window is already closed. + if (title_window_) { + title_window_->Close(); + title_window_ = NULL; + } +} + +void PanelController::ButtonPressed( + views::Button* sender, const views::Event& event) { + if (title_window_ && sender == title_content_->close_button()) { + browser_window_->Close(); + Close(); + } +} + +PanelController::TitleContentView::TitleContentView( + PanelController* panel_controller) + : panel_controller_(panel_controller) { + InitializeResources(); + close_button_ = new views::ImageButton(panel_controller_); + close_button_->SetImage(views::CustomButton::BS_NORMAL, close_button_n); + close_button_->SetImage(views::CustomButton::BS_HOT, close_button_h); + close_button_->SetImage(views::CustomButton::BS_PUSHED, close_button_p); + close_button_->SetBackground( + kCloseButtonColor, close_button_n, close_button_m); + AddChildView(close_button_); + + title_icon_ = new views::ImageView(); + AddChildView(title_icon_); + title_label_ = new views::Label(std::wstring()); + title_label_->SetHorizontalAlignment(views::Label::ALIGN_LEFT); + AddChildView(title_label_); + + // Default to inactive + OnFocusOut(); +} + +void PanelController::TitleContentView::Layout() { + int close_button_x = bounds().width() - (close_button_width + kButtonPad); + close_button_->SetBounds( + close_button_x, + (bounds().height() - close_button_height) / 2, + close_button_width, + close_button_height); + title_icon_->SetBounds( + kTitleWidthPad, + kTitleHeightPad * 2, + kTitleIconSize, + kTitleIconSize); + int title_x = kTitleWidthPad * 2 + kTitleIconSize; + title_label_->SetBounds( + title_x, + kTitleHeightPad, + close_button_x - (title_x + kButtonPad), + bounds().height() - kTitleHeightPad); +} + +bool PanelController::TitleContentView::OnMousePressed( + const views::MouseEvent& event) { + return panel_controller_->TitleMousePressed(event); +} + +void PanelController::TitleContentView::OnMouseReleased( + const views::MouseEvent& event, bool canceled) { + return panel_controller_->TitleMouseReleased(event, canceled); +} + +bool PanelController::TitleContentView::OnMouseDragged( + const views::MouseEvent& event) { + return panel_controller_->TitleMouseDragged(event); +} + +void PanelController::TitleContentView::OnFocusIn() { + set_background(views::Background::CreateVerticalGradientBackground( + kActiveGradientStart, kActiveGradientEnd)); + title_label_->SetColor(kActiveColor); + title_label_->SetFont(*active_font); + Layout(); + SchedulePaint(); +} + +void PanelController::TitleContentView::OnFocusOut() { + set_background(views::Background::CreateVerticalGradientBackground( + kInactiveGradientStart, kInactiveGradientEnd)); + title_label_->SetColor(kInactiveColor); + title_label_->SetFont(*inactive_font); + Layout(); + SchedulePaint(); +} + diff --git a/chrome/browser/chromeos/panel_controller.h b/chrome/browser/chromeos/panel_controller.h new file mode 100644 index 0000000..5b3e494 --- /dev/null +++ b/chrome/browser/chromeos/panel_controller.h @@ -0,0 +1,127 @@ +// 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. + +#ifndef CHROME_BROWSER_CHROMEOS_PANEL_CONTROLLER_H_ +#define CHROME_BROWSER_CHROMEOS_PANEL_CONTROLLER_H_ + +#include + +#include "views/controls/button/button.h" + +#if defined(TOOLKIT_VIEWS) +class BrowserView; +#else +class BrowserWindowGtk; +#endif +typedef unsigned long XID; + +namespace views { +class ImageButton; +class ImageView; +class Label; +class MouseEvent; +class WidgetGtk; +} + +// Controls interactions with the WM for popups / panels. +class PanelController : public views::ButtonListener { + public: +#if defined(TOOLKIT_VIEWS) + explicit PanelController(BrowserView* browser_window); +#else + explicit PanelController(BrowserWindowGtk* browser_window); +#endif + virtual ~PanelController() {} + + bool TitleMousePressed(const views::MouseEvent& event); + void TitleMouseReleased(const views::MouseEvent& event, bool canceled); + bool TitleMouseDragged(const views::MouseEvent& event); + bool PanelClientEvent(GdkEventClient* event); + void OnFocusIn(); + void OnFocusOut(); + + void UpdateTitleBar(); + void Close(); + // ButtonListener methods. + virtual void ButtonPressed(views::Button* sender, const views::Event& event); + + private: + class TitleContentView : public views::View { + public: + explicit TitleContentView(PanelController* panelController); + virtual ~TitleContentView() {} + virtual void Layout(); + virtual bool OnMousePressed(const views::MouseEvent& event); + virtual void OnMouseReleased(const views::MouseEvent& event, bool canceled); + virtual bool OnMouseDragged(const views::MouseEvent& event); + void OnFocusIn(); + void OnFocusOut(); + + views::ImageView* title_icon() { return title_icon_; } + views::Label* title_label() { return title_label_; } + views::ImageButton* close_button() { return close_button_; } + + private: + views::ImageView* title_icon_; + views::Label* title_label_; + views::ImageButton* close_button_; + PanelController* panel_controller_; + DISALLOW_COPY_AND_ASSIGN(TitleContentView); + }; + + // Dispatches client events to PanelController instances + static bool OnPanelClientEvent( + GtkWidget* widget, + GdkEventClient* event, + PanelController* panel_controller); + + // Initializes the panel controller with the window bounds. + void Init(const gfx::Rect window_bounds); + + // Browser window containing content. +#if defined(TOOLKIT_VIEWS) + BrowserView* browser_window_; +#else + BrowserWindowGtk* browser_window_; +#endif + + // Gtk object for content. + GtkWindow* panel_; + // X id for content. + XID panel_xid_; + + // Views object representing title. + views::WidgetGtk* title_window_; + // Gtk object representing title. + GtkWidget* title_; + // X id representing title. + XID title_xid_; + + // Views object, holds title and close button. + TitleContentView* title_content_; + + // Is the panel expanded or collapsed? + bool expanded_; + + // Is the mouse button currently down? + bool mouse_down_; + + // Cursor's absolute position when the mouse button was pressed. + int mouse_down_abs_x_; + int mouse_down_abs_y_; + + // Cursor's offset from the upper-left corner of the titlebar when the + // mouse button was pressed. + int mouse_down_offset_x_; + int mouse_down_offset_y_; + + // Is the titlebar currently being dragged? That is, has the cursor + // moved more than kDragThreshold away from its starting position? + bool dragging_; + + DISALLOW_COPY_AND_ASSIGN(PanelController); +}; + +#endif // CHROME_BROWSER_CHROMEOS_PANEL_CONTROLLER_H_ + diff --git a/chrome/browser/chromeos/panels/panel_scroller.cc b/chrome/browser/chromeos/panels/panel_scroller.cc new file mode 100644 index 0000000..c2af341 --- /dev/null +++ b/chrome/browser/chromeos/panels/panel_scroller.cc @@ -0,0 +1,253 @@ +// 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 "chrome/browser/chromeos/panels/panel_scroller.h" + +#include "app/gfx/canvas.h" +#include "base/compiler_specific.h" +#include "base/logging.h" +#include "base/stl_util-inl.h" +#include "base/string_util.h" +#include "chrome/browser/chromeos/panels/panel_scroller_container.h" +#include "chrome/browser/chromeos/panels/panel_scroller_header.h" +#include "views/widget/widget_gtk.h" + +struct PanelScroller::Panel { + PanelScrollerHeader* header; + PanelScrollerContainer* container; +}; + +PanelScroller::PanelScroller() + : views::View(), + divider_height_(18), + needs_layout_(true), + scroll_pos_(0), + ALLOW_THIS_IN_INITIALIZER_LIST(animation_(this)), + animated_scroll_begin_(0), + animated_scroll_end_(0) { + animation_.SetTweenType(SlideAnimation::EASE_IN_OUT); + animation_.SetSlideDuration(300); + + Panel* panel = new Panel; + panel->header = new PanelScrollerHeader(this); + panel->header->set_title(ASCIIToUTF16("Email")); + panel->container = new PanelScrollerContainer(this, new views::View()); + panels_.push_back(panel); + + panel = new Panel; + panel->header = new PanelScrollerHeader(this); + panel->header->set_title(ASCIIToUTF16("Chat")); + panel->container = new PanelScrollerContainer(this, new views::View()); + panels_.push_back(panel); + + panel = new Panel; + panel->header = new PanelScrollerHeader(this); + panel->header->set_title(ASCIIToUTF16("Calendar")); + panel->container = new PanelScrollerContainer(this, new views::View()); + panels_.push_back(panel); + + panel = new Panel; + panel->header = new PanelScrollerHeader(this); + panel->header->set_title(ASCIIToUTF16("Recent searches")); + panel->container = new PanelScrollerContainer(this, new views::View()); + panels_.push_back(panel); + + panel = new Panel; + panel->header = new PanelScrollerHeader(this); + panel->header->set_title(ASCIIToUTF16("Pony news")); + panel->container = new PanelScrollerContainer(this, new views::View()); + panels_.push_back(panel); + + // Add the containers first since they're on the bottom. + AddChildView(panels_[0]->container); + AddChildView(panels_[1]->container); + AddChildView(panels_[2]->container); + AddChildView(panels_[3]->container); + AddChildView(panels_[4]->container); + + AddChildView(panels_[0]->header); + AddChildView(panels_[1]->header); + AddChildView(panels_[2]->header); + AddChildView(panels_[3]->header); + AddChildView(panels_[4]->header); +} + +PanelScroller::~PanelScroller() { + STLDeleteContainerPointers(panels_.begin(), panels_.end()); +} + +// static +PanelScroller* PanelScroller::CreateWindow() { + views::WidgetGtk* widget = + new views::WidgetGtk(views::WidgetGtk::TYPE_WINDOW); + widget->set_delete_on_destroy(true); + widget->Init(NULL, gfx::Rect(0, 0, 100, 800)); + + PanelScroller* scroller = new PanelScroller(); + widget->SetContentsView(scroller); + + widget->Show(); + + return scroller; +} + +void PanelScroller::ViewHierarchyChanged(bool is_add, + views::View* parent, + views::View* child) { + // Our child views changed without us knowing it. Stop the animation and mark + // us as dirty (needs_layout_ = true). + animation_.Stop(); + needs_layout_ = true; +} + +gfx::Size PanelScroller::GetPreferredSize() { + return gfx::Size(75, 200); +} + +void PanelScroller::Layout() { +/* TODO(brettw) this doesn't work for some reason. + if (!needs_layout_ || !animation_.IsShowing()) + return; + needs_layout_ = false;*/ + + // The current location in the content that we're laying out. This is before + // scrolling is accounted for. + int cur_content_pos = 0; + + // Number of pixels used by headers stuck to the top of the scroll area. + int top_header_pixel_count = 0; + + int panel_count = static_cast(panels_.size()); + for (int i = 0; i < panel_count; i++) { + if (cur_content_pos < scroll_pos_ + top_header_pixel_count) { + // This panel is at least partially off the top. Put the header below the + // others already there. + panels_[i]->header->SetBounds(gfx::Rect(0, top_header_pixel_count, + width(), divider_height_)); + top_header_pixel_count += divider_height_; + + } else if (cur_content_pos > height() + scroll_pos_ - + (panel_count - i) * divider_height_) { + // When we've hit the bottom of the visible content, all the remaining + // headers will stack up at the bottom. Counting this header, there are + // (size() - i) left, which is used in the expression above. + int top = height() - (panel_count - i) * divider_height_; + panels_[i]->header->SetBounds(gfx::Rect(0, top, + width(), divider_height_)); + } else { + // Normal header positioning in-flow. + panels_[i]->header->SetBounds(gfx::Rect(0, cur_content_pos - scroll_pos_, + width(), divider_height_)); + } + + cur_content_pos += divider_height_; + + // Now position the content. It always goes in-flow ignoring any stacked + // up headers at the top or bottom. + int container_height = panels_[i]->container->GetPreferredSize().height(); + panels_[i]->container->SetBounds( + gfx::Rect(0, cur_content_pos - scroll_pos_, + width(), container_height)); + cur_content_pos += container_height; + } +} + +bool PanelScroller::OnMousePressed(const views::MouseEvent& event) { + return true; +} + +bool PanelScroller::OnMouseDragged(const views::MouseEvent& event) { + return true; +} + +void PanelScroller::OnMouseReleased(const views::MouseEvent& event, + bool canceled) { +} + +void PanelScroller::HeaderClicked(PanelScrollerHeader* source) { + for (size_t i = 0; i < panels_.size(); i++) { + if (panels_[i]->header == source) { + ScrollToPanel(static_cast(i)); + return; + } + } + NOTREACHED() << "Invalid panel passed to HeaderClicked."; +} + +void PanelScroller::ScrollToPanel(int index) { + int affected_panel_height = + panels_[index]->container->GetPreferredSize().height(); + + // The pixel size we need to reserve for the stuck headers. + int top_stuck_header_pixel_size = index * divider_height_; + int bottom_stuck_header_pixel_size = + (static_cast(panels_.size()) - index - 1) * divider_height_; + + // Compute the offset of the top of the panel to scroll to. + int space_above = 0; + for (int i = 0; i < index; i++) { + space_above += divider_height_ + + panels_[i]->container->GetPreferredSize().height(); + } + + // Compute the space below the top of the panel. + int space_below = 0; + for (int i = index; i < static_cast(panels_.size()); i++) { + space_below += divider_height_ + + panels_[i]->container->GetPreferredSize().height(); + } + + // The scroll position of the top of the stuck headers is the space above + // minus the size of the headers stuck there. + int top_stuck_headers_scroll_pos = space_above - top_stuck_header_pixel_size; + + // If the panel is already fully visible, do nothing. + if (scroll_pos_ <= top_stuck_headers_scroll_pos && + space_above + divider_height_ + affected_panel_height - + bottom_stuck_header_pixel_size <= scroll_pos_ + height()) + return; + + // Compute the scroll position. + if (height() > space_below) { + // There's enough room for this panel and everything below it to fit on the + // screen. + animated_scroll_end_ = (space_above + space_below) - height(); + if (animated_scroll_end_ > top_stuck_headers_scroll_pos) + animated_scroll_end_ = top_stuck_headers_scroll_pos; + } else if (space_above > scroll_pos_) { + // If we're going to be scrolling the content up, scroll just until the + // panel in question is fully visible. + animated_scroll_end_ = space_above + + divider_height_ + affected_panel_height + // Size of this panel. + bottom_stuck_header_pixel_size - // Leave room for these. + height(); // Available size in the window. + if (animated_scroll_end_ > top_stuck_headers_scroll_pos) + animated_scroll_end_ = top_stuck_headers_scroll_pos; + } else { + animated_scroll_end_ = top_stuck_headers_scroll_pos; + } + + animated_scroll_begin_ = scroll_pos_; + if (animated_scroll_begin_ == animated_scroll_end_) + return; // Nothing to animate. + + // Start animating to the destination. + animation_.Reset(); + animation_.Show(); +} + +void PanelScroller::AnimationEnded(const Animation* animation) { +} + +void PanelScroller::AnimationProgressed(const Animation* animation) { + scroll_pos_ = static_cast( + static_cast(animated_scroll_end_ - animated_scroll_begin_) * + animation_.GetCurrentValue()) + animated_scroll_begin_; + + Layout(); + SchedulePaint(); +} + +void PanelScroller::AnimationCanceled(const Animation* animation) { +} diff --git a/chrome/browser/chromeos/panels/panel_scroller.h b/chrome/browser/chromeos/panels/panel_scroller.h new file mode 100644 index 0000000..a3db3db --- /dev/null +++ b/chrome/browser/chromeos/panels/panel_scroller.h @@ -0,0 +1,70 @@ +// 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. + +#ifndef CHROME_BROWSER_CHROMEOS_PANELS_PANEL_SCROLLER_H_ +#define CHROME_BROWSER_CHROMEOS_PANELS_PANEL_SCROLLER_H_ + +#include + +#include "app/slide_animation.h" +#include "base/basictypes.h" +#include "views/view.h" + +class PanelScrollerHeader; + +class PanelScroller : public views::View, public AnimationDelegate { + public: + PanelScroller(); + ~PanelScroller(); + + static PanelScroller* CreateWindow(); + + // View overrides. + virtual void ViewHierarchyChanged(bool is_add, + views::View* parent, + views::View* child); + virtual gfx::Size GetPreferredSize(); + virtual void Layout(); + virtual bool OnMousePressed(const views::MouseEvent& event); + virtual bool OnMouseDragged(const views::MouseEvent& event); + virtual void OnMouseReleased(const views::MouseEvent& event, bool canceled); + + // Called when a panel header is clicked with the affected container. This + // function will make sure the panel is fully visible. + void HeaderClicked(PanelScrollerHeader* source); + + private: + struct Panel; + + // AnimationDelegate overrides. + virtual void AnimationEnded(const Animation* animation); + virtual void AnimationProgressed(const Animation* animation); + virtual void AnimationCanceled(const Animation* animation); + + // Scrolls to the panel at the given index. It will be moved to the top. + void ScrollToPanel(int index); + + // All panels in this scroller. + std::vector panels_; + + // Height in pixels of the headers above each panel. + int divider_height_; + + bool needs_layout_; + + // The current scroll position. + int scroll_pos_; + + SlideAnimation animation_; + + // When animating a scroll, these indicate the beginning and ending of the + // scroll. The scroll_pos_ always indicates the current one. + int animated_scroll_begin_; + int animated_scroll_end_; + + DISALLOW_COPY_AND_ASSIGN(PanelScroller); +}; + +#endif // CHROME_BROWSER_CHROMEOS_PANELS_PANEL_SCROLLER_H_ + diff --git a/chrome/browser/chromeos/panels/panel_scroller_container.cc b/chrome/browser/chromeos/panels/panel_scroller_container.cc new file mode 100644 index 0000000..ace44d5 --- /dev/null +++ b/chrome/browser/chromeos/panels/panel_scroller_container.cc @@ -0,0 +1,30 @@ +// 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 "chrome/browser/chromeos/panels/panel_scroller_container.h" + +#include "app/gfx/canvas.h" + +PanelScrollerContainer::PanelScrollerContainer(PanelScroller* scroller, + views::View* contents) + : views::View(), + scroller_(scroller), + contents_(contents) { + AddChildView(0, contents_); + // TODO(brettw) figure out memory management. +} + +PanelScrollerContainer::~PanelScrollerContainer() { +} + +gfx::Size PanelScrollerContainer::GetPreferredSize() { + return gfx::Size(100, 500); +} + +void PanelScrollerContainer::Layout() { +} + +void PanelScrollerContainer::Paint(gfx::Canvas* canvas) { + canvas->DrawLineInt(0xFF000080, 0, 0, size().width(), size().height()); +} diff --git a/chrome/browser/chromeos/panels/panel_scroller_container.h b/chrome/browser/chromeos/panels/panel_scroller_container.h new file mode 100644 index 0000000..5007e95 --- /dev/null +++ b/chrome/browser/chromeos/panels/panel_scroller_container.h @@ -0,0 +1,37 @@ +// 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. + +#ifndef CHROME_BROWSER_CHROMEOS_PANELS_PANEL_SCROLLER_CONTAINER_H_ +#define CHROME_BROWSER_CHROMEOS_PANELS_PANEL_SCROLLER_CONTAINER_H_ + +#include "base/basictypes.h" +#include "views/view.h" + +class PanelScroller; + +// This class wraps the contents of a panel in the panel scroller. It currently +// doesn't do anything useful, but it just a placeholder. +class PanelScrollerContainer : public views::View { + public: + PanelScrollerContainer(PanelScroller* scroller, views::View* contents); + virtual ~PanelScrollerContainer(); + + int HeaderSize() const; + + // view::View overrides. + virtual gfx::Size GetPreferredSize(); + virtual void Layout(); + virtual void Paint(gfx::Canvas* canvas); + + private: + // Non-owning pointer to our parent scroller object. + PanelScroller* scroller_; + + views::View* contents_; + + DISALLOW_COPY_AND_ASSIGN(PanelScrollerContainer); +}; + +#endif // CHROME_BROWSER_CHROMEOS_PANELS_PANEL_SCROLLER_CONTAINER_H_ + diff --git a/chrome/browser/chromeos/panels/panel_scroller_header.cc b/chrome/browser/chromeos/panels/panel_scroller_header.cc new file mode 100644 index 0000000..47da1ad --- /dev/null +++ b/chrome/browser/chromeos/panels/panel_scroller_header.cc @@ -0,0 +1,51 @@ +// 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 "chrome/browser/chromeos/panels/panel_scroller_header.h" + +#include "app/gfx/canvas.h" +#include "app/gfx/font.h" +#include "app/resource_bundle.h" +#include "base/string_util.h" +#include "chrome/browser/chromeos/panels/panel_scroller.h" + +PanelScrollerHeader::PanelScrollerHeader(PanelScroller* scroller) + : views::View(), + scroller_(scroller) { +} + +PanelScrollerHeader::~PanelScrollerHeader() { +} + +bool PanelScrollerHeader::OnMousePressed(const views::MouseEvent& event) { + return true; +} + +bool PanelScrollerHeader::OnMouseDragged(const views::MouseEvent& event) { + return false; +} + +void PanelScrollerHeader::OnMouseReleased(const views::MouseEvent& event, + bool canceled) { + scroller_->HeaderClicked(this); +} + +gfx::Size PanelScrollerHeader::GetPreferredSize() { + return gfx::Size(size().width(), 18); +} + +void PanelScrollerHeader::Paint(gfx::Canvas* canvas) { + // TODO(brettw) fill this out with real styling. + canvas->FillRectInt(0xFFFFFFFF, 0, 0, size().width(), size().height()); + canvas->DrawLineInt(0xFFE6E6E6, 0, size().height() - 1, + size().width(), size().height() - 1); + + ResourceBundle& rb = ResourceBundle::GetSharedInstance(); + gfx::Font font = + rb.GetFont(ResourceBundle::BaseFont).DeriveFont(0, gfx::Font::BOLD); + int font_top = 1; + canvas->DrawStringInt(UTF16ToWideHack(title_), font, 0xFF000000, 3, font_top, + size().width(), size().height() - font_top); + +} diff --git a/chrome/browser/chromeos/panels/panel_scroller_header.h b/chrome/browser/chromeos/panels/panel_scroller_header.h new file mode 100644 index 0000000..e4aa8d9 --- /dev/null +++ b/chrome/browser/chromeos/panels/panel_scroller_header.h @@ -0,0 +1,42 @@ +// 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. + +#ifndef CHROME_BROWSER_CHROMEOS_PANELS_PANEL_SCROLLER_HEADER_H_ +#define CHROME_BROWSER_CHROMEOS_PANELS_PANEL_SCROLLER_HEADER_H_ + +#include + +#include "base/basictypes.h" +#include "base/string16.h" +#include "views/view.h" + +class PanelScroller; + +class PanelScrollerHeader : public views::View { + public: + PanelScrollerHeader(PanelScroller* scroller); + virtual ~PanelScrollerHeader(); + + void set_title(const string16& title) { + title_ = title; + } + + // views::View overrides. + virtual bool OnMousePressed(const views::MouseEvent& event); + virtual bool OnMouseDragged(const views::MouseEvent& event); + virtual void OnMouseReleased(const views::MouseEvent& event, bool canceled); + virtual gfx::Size GetPreferredSize(); + virtual void Paint(gfx::Canvas* canvas); + + private: + // Non-owning pointer to our parent scroller object. + PanelScroller* scroller_; + + string16 title_; + + DISALLOW_COPY_AND_ASSIGN(PanelScrollerHeader); +}; + +#endif // CHROME_BROWSER_CHROMEOS_PANELS_PANEL_SCROLLER_HEADER_H_ + diff --git a/chrome/browser/gtk/browser_window_gtk.cc b/chrome/browser/gtk/browser_window_gtk.cc index 9981031..d4e0ffe 100644 --- a/chrome/browser/gtk/browser_window_gtk.cc +++ b/chrome/browser/gtk/browser_window_gtk.cc @@ -79,9 +79,9 @@ #if defined(OS_CHROMEOS) #include "chrome/browser/chromeos/compact_navigation_bar.h" #include "chrome/browser/chromeos/main_menu.h" +#include "chrome/browser/chromeos/panel_controller.h" #include "chrome/browser/chromeos/status_area_view.h" #include "chrome/browser/views/browser_dialogs.h" -#include "chrome/browser/views/panel_controller.h" #include "chrome/browser/views/tabs/tab_overview_types.h" #include "views/widget/widget_gtk.h" #endif diff --git a/chrome/browser/views/frame/browser_extender.cc b/chrome/browser/views/frame/browser_extender.cc new file mode 100644 index 0000000..be9cb29 --- /dev/null +++ b/chrome/browser/views/frame/browser_extender.cc @@ -0,0 +1,25 @@ +// 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 "chrome/browser/views/frame/browser_extender.h" + +#include + +#include "chrome/browser/views/frame/browser_view.h" + +//////////////////////////////////////////////////////////////////////////////// +// BrowserExtender, public: + +BrowserExtender::BrowserExtender(BrowserView* browser_view) + : browser_view_(browser_view), + can_close_(true) { +} + +//////////////////////////////////////////////////////////////////////////////// +// BrowserExtender, protected: + +views::Window* BrowserExtender::GetBrowserWindow() { + return browser_view_->frame()->GetWindow(); +} + diff --git a/chrome/browser/views/frame/browser_extender.h b/chrome/browser/views/frame/browser_extender.h new file mode 100644 index 0000000..6481d11 --- /dev/null +++ b/chrome/browser/views/frame/browser_extender.h @@ -0,0 +1,86 @@ +// 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. + +#ifndef CHROME_BROWSER_VIEWS_FRAME_BROWSER_EXTENDER_H_ +#define CHROME_BROWSER_VIEWS_FRAME_BROWSER_EXTENDER_H_ + +#include "base/basictypes.h" +#include "base/gfx/rect.h" + +class BrowserView; + +namespace views { +class Window; +} // namespace views + + +// BrowserExtender adds chromeos specific features to BrowserView. +// The factory method |Create(BrowserView*)| creates different types +// of extender depending on the type of BrowserView and target platform. +// Please see chromeos_browser_extender.cc for ChromeOS extenders, and +// standard_extender.cc for Chrome browser. +class BrowserExtender { + public: + // Factory method to create a BrowserExtender for given + // BrowserView object. Please see the class description for details. + static BrowserExtender* Create(BrowserView* browser_view); + + virtual ~BrowserExtender() {} + + // Initializes the extender. + virtual void Init() = 0; + + // Layouts controls within the given bounds and returns the remaining + // bounds for tabstip to be layed out. + virtual gfx::Rect Layout(const gfx::Rect& bounds) { return bounds; } + + // Tests if the given |point|, which is given in BrowserView coordinates, + // hits any of controls. + virtual bool NonClientHitTest(const gfx::Point& browser_view_point) = 0; + + // Updates the title bar (if any). + virtual void UpdateTitleBar() {} + + // Called when the BrowserView is shown. + virtual void Show() = 0; + + // Called when the BrowserView is closed. + virtual void Close() {} + + // Called when the browser window is either activated or deactivated. + virtual void ActivationChanged() {} + + // Tells if the browser can be closed. + bool can_close() const { + return can_close_; + } + + // Specifies if the browser can be closed or not. This typically set + // to false when the browser is being dragged. + void set_can_close(bool b) { + can_close_ = b; + } + + protected: + explicit BrowserExtender(BrowserView* browser_view); + + // Returns the view Window object that contains the BrowserView. + views::Window* GetBrowserWindow(); + + BrowserView* browser_view() { + return browser_view_; + } + + private: + // BrowserView to be extended. + BrowserView* browser_view_; + + // True if the browser can be closed. See set_can_close method for setails. + bool can_close_; + + DISALLOW_COPY_AND_ASSIGN(BrowserExtender); +}; + +#endif // CHROME_BROWSER_CHROMEOS_BROWSER_EXTENDER_H_ + diff --git a/chrome/browser/views/frame/browser_view.cc b/chrome/browser/views/frame/browser_view.cc index b52ccf1..8fb342a9 100644 --- a/chrome/browser/views/frame/browser_view.cc +++ b/chrome/browser/views/frame/browser_view.cc @@ -38,6 +38,7 @@ #include "chrome/browser/views/chrome_views_delegate.h" #include "chrome/browser/views/download_shelf_view.h" #include "chrome/browser/views/extensions/extension_shelf.h" +#include "chrome/browser/views/frame/browser_extender.h" #include "chrome/browser/views/frame/browser_frame.h" #include "chrome/browser/views/fullscreen_exit_bubble.h" #include "chrome/browser/views/infobars/infobar_container.h" @@ -83,10 +84,6 @@ #include "views/window/hit_test.h" #endif -#if defined(OS_CHROMEOS) -#include "chrome/browser/chromeos/browser_extender.h" -#endif - using base::TimeDelta; using views::ColumnSet; using views::GridLayout; @@ -650,9 +647,7 @@ bool BrowserView::ActivateAppModalDialog() const { void BrowserView::ActivationChanged(bool activated) { if (activated) BrowserList::SetLastActive(browser_.get()); -#if defined(OS_CHROMEOS) browser_extender_->ActivationChanged(); -#endif } TabContents* BrowserView::GetSelectedTabContents() const { @@ -694,12 +689,8 @@ void BrowserView::DetachBrowserBubble(BrowserBubble* bubble) { bool BrowserView::IsPositionInWindowCaption(const gfx::Point& point) { gfx::Point tabstrip_point(point); View::ConvertPointToView(this, tabstrip()->GetView(), &tabstrip_point); -#if defined(OS_CHROMEOS) return tabstrip()->IsPositionInWindowCaption(tabstrip_point) && !browser_extender_->NonClientHitTest(point); -#else - return tabstrip()->IsPositionInWindowCaption(tabstrip_point); -#endif } /////////////////////////////////////////////////////////////////////////////// @@ -741,9 +732,7 @@ void BrowserView::Show() { frame_->GetWindow()->Show(); -#if defined (OS_CHROMEOS) browser_extender_->Show(); -#endif } void BrowserView::SetBounds(const gfx::Rect& bounds) { @@ -761,9 +750,7 @@ void BrowserView::Close() { frame_->GetWindow()->Close(); -#if defined(OS_CHROMEOS) browser_extender_->Close(); -#endif } void BrowserView::Activate() { @@ -819,9 +806,7 @@ void BrowserView::UpdateTitleBar() { frame_->GetWindow()->UpdateWindowTitle(); if (ShouldShowWindowIcon()) frame_->GetWindow()->UpdateWindowIcon(); -#if defined(OS_CHROMEOS) browser_extender_->UpdateTitleBar(); -#endif } void BrowserView::ShelfVisibilityChanged() { @@ -1479,10 +1464,8 @@ views::ClientView* BrowserView::CreateClientView(views::Window* window) { // BrowserView, views::ClientView overrides: bool BrowserView::CanClose() const { -#if defined(OS_CHROMEOS) if (!browser_extender_->can_close()) return false; -#endif // You cannot close a frame for which there is an active originating drag // session. @@ -1537,11 +1520,12 @@ int BrowserView::NonClientHitTest(const gfx::Point& point) { #endif } + gfx::Point point_in_browser_view_coords(point); + View::ConvertPointToView(GetParent(), this, &point_in_browser_view_coords); + // Determine if the TabStrip exists and is capable of being clicked on. We // might be a popup window without a TabStrip. if (IsTabStripVisible()) { - gfx::Point point_in_view_coords(point); - View::ConvertPointToView(GetParent(), this, &point_in_view_coords); // See if the mouse pointer is within the bounds of the TabStrip. gfx::Point point_in_tabstrip_coords(point); @@ -1557,7 +1541,7 @@ int BrowserView::NonClientHitTest(const gfx::Point& point) { // starved of dragable area, let's give it to window dragging (this also // makes sense visually). if (!IsMaximized() && - (point_in_view_coords.y() < + (point_in_browser_view_coords.y() < (tabstrip_->GetView()->y() + kTabShadowSize))) { // We return HTNOWHERE as this is a signal to our containing // NonClientView that it should figure out what the correct hit-test @@ -1566,12 +1550,8 @@ int BrowserView::NonClientHitTest(const gfx::Point& point) { } } -#if defined(OS_CHROMEOS) - gfx::Point browser_view_point(point); - ConvertPointToView(GetParent(), this, &browser_view_point); - if (browser_extender_->NonClientHitTest(browser_view_point)) + if (browser_extender_->NonClientHitTest(point_in_browser_view_coords)) return HTCLIENT; -#endif // If the point's y coordinate is below the top of the toolbar and otherwise // within the bounds of this view, the point is considered to be within the @@ -1768,9 +1748,7 @@ void BrowserView::Init() { } #endif -#if defined(OS_CHROMEOS) browser_extender_.reset(BrowserExtender::Create(this)); -#endif } #if defined(OS_WIN) @@ -1800,10 +1778,8 @@ int BrowserView::LayoutTabStrip() { ConvertPointToView(GetParent(), this, &tabstrip_origin); tabstrip_bounds.set_origin(tabstrip_origin); -#if defined(OS_CHROMEOS) - // Layout chromeos specific components. + // Layout extra components. tabstrip_bounds = browser_extender_->Layout(tabstrip_bounds); -#endif bool visible = IsTabStripVisible(); int y = visible ? tabstrip_bounds.y() : 0; diff --git a/chrome/browser/views/frame/browser_view.h b/chrome/browser/views/frame/browser_view.h index c48a7e0..42967af 100644 --- a/chrome/browser/views/frame/browser_view.h +++ b/chrome/browser/views/frame/browser_view.h @@ -34,6 +34,7 @@ class BookmarkBarView; class Browser; class BrowserBubble; +class BrowserExtender; class DownloadShelfView; class EncodingMenuModel; class ExtensionShelf; @@ -49,9 +50,6 @@ class TabContentsContainer; class TabStripWrapper; class ToolbarView; class ZoomMenuModel; -#if defined(OS_CHROMEOS) -class BrowserExtender; -#endif namespace views { class ExternalFocusTracker; @@ -332,12 +330,10 @@ class BrowserView : public BrowserWindow, virtual bool GetAccessibleName(std::wstring* name); virtual void SetAccessibleName(const std::wstring& name); -#if defined(OS_CHROMEOS) // Returns BrowserExtender. BrowserExtender* browser_extender() const { return browser_extender_.get(); } -#endif protected: // Overridden from views::View: @@ -529,9 +525,7 @@ class BrowserView : public BrowserWindow, // The accessible name of this view. std::wstring accessible_name_; -#if defined(OS_CHROMEOS) scoped_ptr browser_extender_; -#endif DISALLOW_COPY_AND_ASSIGN(BrowserView); }; diff --git a/chrome/browser/views/frame/standard_extender.cc b/chrome/browser/views/frame/standard_extender.cc new file mode 100644 index 0000000..3f32fa6 --- /dev/null +++ b/chrome/browser/views/frame/standard_extender.cc @@ -0,0 +1,38 @@ +// 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 "chrome/browser/views/frame/browser_extender.h" + +namespace { + +// StandardExtender for non ChromeOS build. This currently adds/does nothing. +// TODO(oshima): Add MainMenu support with a command line flag. +class StandardExtender : public BrowserExtender { + public: + explicit StandardExtender(BrowserView* browser_view) + : BrowserExtender(browser_view) { + } + virtual ~StandardExtender() {} + + private: + // BrowserExtender overrides. + virtual void Init() {} + virtual bool NonClientHitTest(const gfx::Point& point) { return false; } + virtual void Show() {} + virtual void Close() {} + virtual void UpdateTitleBar() {} + virtual void ActivationChanged() {} + + DISALLOW_COPY_AND_ASSIGN(StandardExtender); +}; + +} // namespace + +//////////////////////////////////////////////////////////////////////////////// +// BrowserExtender, public: + +// static +BrowserExtender* BrowserExtender::Create(BrowserView* browser_view) { + return new StandardExtender(browser_view); +} diff --git a/chrome/browser/views/panel_controller.cc b/chrome/browser/views/panel_controller.cc deleted file mode 100644 index 7515b55..0000000 --- a/chrome/browser/views/panel_controller.cc +++ /dev/null @@ -1,333 +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 "chrome/browser/views/panel_controller.h" - -#include "app/resource_bundle.h" -#include "base/logging.h" -#include "base/singleton.h" -#include "base/scoped_ptr.h" -#include "base/string_util.h" -#include "chrome/browser/browser.h" -#if defined(TOOLKIT_VIEWS) -#include "chrome/browser/views/frame/browser_view.h" -#else -#include "chrome/browser/gtk/browser_window_gtk.h" -#endif -#include "chrome/browser/views/tabs/tab_overview_types.h" -#include "chrome/common/x11_util.h" -#include "grit/app_resources.h" -#include "grit/generated_resources.h" -#include "grit/theme_resources.h" -#include "views/controls/button/image_button.h" -#include "views/controls/image_view.h" -#include "views/controls/label.h" -#include "views/event.h" -#include "views/view.h" -#include "views/widget/widget_gtk.h" -#include "views/window/window.h" - -static int close_button_width; -static int close_button_height; -static SkBitmap* close_button_n; -static SkBitmap* close_button_m; -static SkBitmap* close_button_h; -static SkBitmap* close_button_p; -static gfx::Font* active_font = NULL; -static gfx::Font* inactive_font = NULL; - -namespace { - -const int kTitleWidth = 200; -const int kTitleHeight = 20; -const int kTitleIconSize = 16; -const int kTitleWidthPad = 2; -const int kTitleHeightPad = 1; -const int kButtonPad = 4; - -const SkColor kActiveGradientStart = 0xffebeff9; -const SkColor kActiveGradientEnd = 0xffb3c4f6; -const SkColor kInactiveGradientStart = 0xfff2f2f2; -const SkColor kInactiveGradientEnd = 0xfff2f2f2; -const SkColor kActiveColor = SK_ColorBLACK; -const SkColor kInactiveColor = 0xff333333; -const SkColor kCloseButtonColor = SK_ColorBLACK; - -static bool resources_initialized; -static void InitializeResources() { - if (resources_initialized) { - return; - } - - resources_initialized = true; - ResourceBundle& rb = ResourceBundle::GetSharedInstance(); - inactive_font = new gfx::Font(rb.GetFont(ResourceBundle::BaseFont)); - active_font = new gfx::Font(inactive_font->DeriveFont(0, gfx::Font::BOLD)); - close_button_n = rb.GetBitmapNamed(IDR_TAB_CLOSE); - close_button_m = rb.GetBitmapNamed(IDR_TAB_CLOSE_MASK); - close_button_h = rb.GetBitmapNamed(IDR_TAB_CLOSE_H); - close_button_p = rb.GetBitmapNamed(IDR_TAB_CLOSE_P); - close_button_width = close_button_n->width(); - close_button_height = close_button_n->height(); -} - -} // namespace - -#if defined(TOOLKIT_VIEWS) -PanelController::PanelController(BrowserView* browser_window) - : browser_window_(browser_window), - panel_(browser_window->GetNativeHandle()), - panel_xid_(x11_util::GetX11WindowFromGtkWidget(GTK_WIDGET(panel_))), - title_window_(NULL), - expanded_(true), - mouse_down_(false), - dragging_(false) { - Init(browser_window->bounds()); -} -#else -PanelController::PanelController(BrowserWindowGtk* browser_window) - : browser_window_(browser_window), - panel_(browser_window->window()), - panel_xid_(x11_util::GetX11WindowFromGtkWidget(GTK_WIDGET(panel_))), - title_window_(NULL), - expanded_(true), - mouse_down_(false), - dragging_(false) { - Init(browser_window->bounds()); -} -#endif - -void PanelController::Init(const gfx::Rect window_bounds) { - gfx::Rect title_bounds( - 0, 0, window_bounds.width(), kTitleHeight); - - title_window_ = new views::WidgetGtk(views::WidgetGtk::TYPE_WINDOW); - title_window_->Init(NULL, title_bounds); - title_ = title_window_->GetNativeView(); - title_xid_ = x11_util::GetX11WindowFromGtkWidget(title_); - - TabOverviewTypes* tab_overview = TabOverviewTypes::instance(); - tab_overview->SetWindowType( - title_, - TabOverviewTypes::WINDOW_TYPE_CHROME_PANEL_TITLEBAR, - NULL); - std::vector type_params; - type_params.push_back(title_xid_); - type_params.push_back(expanded_ ? 1 : 0); - tab_overview->SetWindowType( - GTK_WIDGET(panel_), - TabOverviewTypes::WINDOW_TYPE_CHROME_PANEL, - &type_params); - - g_signal_connect( - panel_, "client-event", G_CALLBACK(OnPanelClientEvent), this); - - title_content_ = new TitleContentView(this); - title_window_->SetContentsView(title_content_); - title_window_->Show(); -} - -void PanelController::UpdateTitleBar() { - if (!browser_window_ || !title_window_) - return; - Browser* browser = browser_window_->browser(); - title_content_->title_label()->SetText( - UTF16ToWideHack(browser->GetWindowTitleForCurrentTab())); - title_content_->title_icon()->SetImage(browser->GetCurrentPageIcon()); -} - -bool PanelController::TitleMousePressed(const views::MouseEvent& event) { - if (!event.IsOnlyLeftMouseButton()) { - return false; - } - GdkEvent* gdk_event = gtk_get_current_event(); - if (gdk_event->type != GDK_BUTTON_PRESS) { - gdk_event_free(gdk_event); - NOTREACHED(); - return false; - } - GdkEventButton last_button_event = gdk_event->button; - mouse_down_ = true; - mouse_down_abs_x_ = last_button_event.x_root; - mouse_down_abs_y_ = last_button_event.y_root; - mouse_down_offset_x_ = event.x(); - mouse_down_offset_y_ = event.y(); - dragging_ = false; - gdk_event_free(gdk_event); - return true; -} - -void PanelController::TitleMouseReleased( - const views::MouseEvent& event, bool canceled) { - if (!event.IsOnlyLeftMouseButton()) { - return; - } - // Only handle clicks that started in our window. - if (!mouse_down_) { - return; - } - - mouse_down_ = false; - if (!dragging_) { - TabOverviewTypes::Message msg( - TabOverviewTypes::Message::WM_SET_PANEL_STATE); - msg.set_param(0, panel_xid_); - msg.set_param(1, expanded_ ? 0 : 1); - TabOverviewTypes::instance()->SendMessage(msg); - } else { - TabOverviewTypes::Message msg( - TabOverviewTypes::Message::WM_NOTIFY_PANEL_DRAG_COMPLETE); - msg.set_param(0, panel_xid_); - TabOverviewTypes::instance()->SendMessage(msg); - dragging_ = false; - } -} - -bool PanelController::TitleMouseDragged(const views::MouseEvent& event) { - if (!mouse_down_) { - return false; - } - - GdkEvent* gdk_event = gtk_get_current_event(); - if (gdk_event->type != GDK_MOTION_NOTIFY) { - gdk_event_free(gdk_event); - NOTREACHED(); - return false; - } - GdkEventMotion last_motion_event = gdk_event->motion; - if (!dragging_) { - if (views::View::ExceededDragThreshold( - last_motion_event.x_root - mouse_down_abs_x_, - last_motion_event.y_root - mouse_down_abs_y_)) { - dragging_ = true; - } - } - if (dragging_) { - TabOverviewTypes::Message msg(TabOverviewTypes::Message::WM_MOVE_PANEL); - msg.set_param(0, panel_xid_); - msg.set_param(1, last_motion_event.x_root - mouse_down_offset_x_); - msg.set_param(2, last_motion_event.y_root - mouse_down_offset_y_); - TabOverviewTypes::instance()->SendMessage(msg); - } - gdk_event_free(gdk_event); - return true; -} - -// static -bool PanelController::OnPanelClientEvent( - GtkWidget* widget, - GdkEventClient* event, - PanelController* panel_controller) { - return panel_controller->PanelClientEvent(event); -} - -void PanelController::OnFocusIn() { - if (title_window_) - title_content_->OnFocusIn(); -} - -void PanelController::OnFocusOut() { - if (title_window_) - title_content_->OnFocusOut(); -} - -bool PanelController::PanelClientEvent(GdkEventClient* event) { - TabOverviewTypes::Message msg; - TabOverviewTypes::instance()->DecodeMessage(*event, &msg); - if (msg.type() == TabOverviewTypes::Message::CHROME_NOTIFY_PANEL_STATE) { - expanded_ = msg.param(0); - } - return true; -} - -void PanelController::Close() { - // ignore if the title window is already closed. - if (title_window_) { - title_window_->Close(); - title_window_ = NULL; - } -} - -void PanelController::ButtonPressed( - views::Button* sender, const views::Event& event) { - if (title_window_ && sender == title_content_->close_button()) { - browser_window_->Close(); - Close(); - } -} - -PanelController::TitleContentView::TitleContentView( - PanelController* panel_controller) - : panel_controller_(panel_controller) { - InitializeResources(); - close_button_ = new views::ImageButton(panel_controller_); - close_button_->SetImage(views::CustomButton::BS_NORMAL, close_button_n); - close_button_->SetImage(views::CustomButton::BS_HOT, close_button_h); - close_button_->SetImage(views::CustomButton::BS_PUSHED, close_button_p); - close_button_->SetBackground( - kCloseButtonColor, close_button_n, close_button_m); - AddChildView(close_button_); - - title_icon_ = new views::ImageView(); - AddChildView(title_icon_); - title_label_ = new views::Label(std::wstring()); - title_label_->SetHorizontalAlignment(views::Label::ALIGN_LEFT); - AddChildView(title_label_); - - // Default to inactive - OnFocusOut(); -} - -void PanelController::TitleContentView::Layout() { - int close_button_x = bounds().width() - (close_button_width + kButtonPad); - close_button_->SetBounds( - close_button_x, - (bounds().height() - close_button_height) / 2, - close_button_width, - close_button_height); - title_icon_->SetBounds( - kTitleWidthPad, - kTitleHeightPad * 2, - kTitleIconSize, - kTitleIconSize); - int title_x = kTitleWidthPad * 2 + kTitleIconSize; - title_label_->SetBounds( - title_x, - kTitleHeightPad, - close_button_x - (title_x + kButtonPad), - bounds().height() - kTitleHeightPad); -} - -bool PanelController::TitleContentView::OnMousePressed( - const views::MouseEvent& event) { - return panel_controller_->TitleMousePressed(event); -} - -void PanelController::TitleContentView::OnMouseReleased( - const views::MouseEvent& event, bool canceled) { - return panel_controller_->TitleMouseReleased(event, canceled); -} - -bool PanelController::TitleContentView::OnMouseDragged( - const views::MouseEvent& event) { - return panel_controller_->TitleMouseDragged(event); -} - -void PanelController::TitleContentView::OnFocusIn() { - set_background(views::Background::CreateVerticalGradientBackground( - kActiveGradientStart, kActiveGradientEnd)); - title_label_->SetColor(kActiveColor); - title_label_->SetFont(*active_font); - Layout(); - SchedulePaint(); -} - -void PanelController::TitleContentView::OnFocusOut() { - set_background(views::Background::CreateVerticalGradientBackground( - kInactiveGradientStart, kInactiveGradientEnd)); - title_label_->SetColor(kInactiveColor); - title_label_->SetFont(*inactive_font); - Layout(); - SchedulePaint(); -} diff --git a/chrome/browser/views/panel_controller.h b/chrome/browser/views/panel_controller.h deleted file mode 100644 index ac9909c..0000000 --- a/chrome/browser/views/panel_controller.h +++ /dev/null @@ -1,126 +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. - -#ifndef CHROME_BROWSER_VIEWS_PANEL_CONTROLLER_H_ -#define CHROME_BROWSER_VIEWS_PANEL_CONTROLLER_H_ - -#include - -#include "views/controls/button/button.h" - -#if defined(TOOLKIT_VIEWS) -class BrowserView; -#else -class BrowserWindowGtk; -#endif -typedef unsigned long XID; - -namespace views { -class ImageButton; -class ImageView; -class Label; -class MouseEvent; -class WidgetGtk; -} - -// Controls interactions with the WM for popups / panels. -class PanelController : public views::ButtonListener { - public: -#if defined(TOOLKIT_VIEWS) - explicit PanelController(BrowserView* browser_window); -#else - explicit PanelController(BrowserWindowGtk* browser_window); -#endif - virtual ~PanelController() {} - - bool TitleMousePressed(const views::MouseEvent& event); - void TitleMouseReleased(const views::MouseEvent& event, bool canceled); - bool TitleMouseDragged(const views::MouseEvent& event); - bool PanelClientEvent(GdkEventClient* event); - void OnFocusIn(); - void OnFocusOut(); - - void UpdateTitleBar(); - void Close(); - // ButtonListener methods. - virtual void ButtonPressed(views::Button* sender, const views::Event& event); - - private: - class TitleContentView : public views::View { - public: - explicit TitleContentView(PanelController* panelController); - virtual ~TitleContentView() {} - virtual void Layout(); - virtual bool OnMousePressed(const views::MouseEvent& event); - virtual void OnMouseReleased(const views::MouseEvent& event, bool canceled); - virtual bool OnMouseDragged(const views::MouseEvent& event); - void OnFocusIn(); - void OnFocusOut(); - - views::ImageView* title_icon() { return title_icon_; } - views::Label* title_label() { return title_label_; } - views::ImageButton* close_button() { return close_button_; } - - private: - views::ImageView* title_icon_; - views::Label* title_label_; - views::ImageButton* close_button_; - PanelController* panel_controller_; - DISALLOW_COPY_AND_ASSIGN(TitleContentView); - }; - - // Dispatches client events to PanelController instances - static bool OnPanelClientEvent( - GtkWidget* widget, - GdkEventClient* event, - PanelController* panel_controller); - - // Initializes the panel controller with the window bounds. - void Init(const gfx::Rect window_bounds); - - // Browser window containing content. -#if defined(TOOLKIT_VIEWS) - BrowserView* browser_window_; -#else - BrowserWindowGtk* browser_window_; -#endif - - // Gtk object for content. - GtkWindow* panel_; - // X id for content. - XID panel_xid_; - - // Views object representing title. - views::WidgetGtk* title_window_; - // Gtk object representing title. - GtkWidget* title_; - // X id representing title. - XID title_xid_; - - // Views object, holds title and close button. - TitleContentView* title_content_; - - // Is the panel expanded or collapsed? - bool expanded_; - - // Is the mouse button currently down? - bool mouse_down_; - - // Cursor's absolute position when the mouse button was pressed. - int mouse_down_abs_x_; - int mouse_down_abs_y_; - - // Cursor's offset from the upper-left corner of the titlebar when the - // mouse button was pressed. - int mouse_down_offset_x_; - int mouse_down_offset_y_; - - // Is the titlebar currently being dragged? That is, has the cursor - // moved more than kDragThreshold away from its starting position? - bool dragging_; - - DISALLOW_COPY_AND_ASSIGN(PanelController); -}; - -#endif // CHROME_BROWSER_PANEL_CONTROLLER_H_ diff --git a/chrome/browser/views/panels/panel_scroller.cc b/chrome/browser/views/panels/panel_scroller.cc deleted file mode 100644 index ec93daa..0000000 --- a/chrome/browser/views/panels/panel_scroller.cc +++ /dev/null @@ -1,253 +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 "chrome/browser/views/panels/panel_scroller.h" - -#include "app/gfx/canvas.h" -#include "base/compiler_specific.h" -#include "base/logging.h" -#include "base/stl_util-inl.h" -#include "base/string_util.h" -#include "chrome/browser/views/panels/panel_scroller_container.h" -#include "chrome/browser/views/panels/panel_scroller_header.h" -#include "views/widget/widget_gtk.h" - -struct PanelScroller::Panel { - PanelScrollerHeader* header; - PanelScrollerContainer* container; -}; - -PanelScroller::PanelScroller() - : views::View(), - divider_height_(18), - needs_layout_(true), - scroll_pos_(0), - ALLOW_THIS_IN_INITIALIZER_LIST(animation_(this)), - animated_scroll_begin_(0), - animated_scroll_end_(0) { - animation_.SetTweenType(SlideAnimation::EASE_IN_OUT); - animation_.SetSlideDuration(300); - - Panel* panel = new Panel; - panel->header = new PanelScrollerHeader(this); - panel->header->set_title(ASCIIToUTF16("Email")); - panel->container = new PanelScrollerContainer(this, new views::View()); - panels_.push_back(panel); - - panel = new Panel; - panel->header = new PanelScrollerHeader(this); - panel->header->set_title(ASCIIToUTF16("Chat")); - panel->container = new PanelScrollerContainer(this, new views::View()); - panels_.push_back(panel); - - panel = new Panel; - panel->header = new PanelScrollerHeader(this); - panel->header->set_title(ASCIIToUTF16("Calendar")); - panel->container = new PanelScrollerContainer(this, new views::View()); - panels_.push_back(panel); - - panel = new Panel; - panel->header = new PanelScrollerHeader(this); - panel->header->set_title(ASCIIToUTF16("Recent searches")); - panel->container = new PanelScrollerContainer(this, new views::View()); - panels_.push_back(panel); - - panel = new Panel; - panel->header = new PanelScrollerHeader(this); - panel->header->set_title(ASCIIToUTF16("Pony news")); - panel->container = new PanelScrollerContainer(this, new views::View()); - panels_.push_back(panel); - - // Add the containers first since they're on the bottom. - AddChildView(panels_[0]->container); - AddChildView(panels_[1]->container); - AddChildView(panels_[2]->container); - AddChildView(panels_[3]->container); - AddChildView(panels_[4]->container); - - AddChildView(panels_[0]->header); - AddChildView(panels_[1]->header); - AddChildView(panels_[2]->header); - AddChildView(panels_[3]->header); - AddChildView(panels_[4]->header); -} - -PanelScroller::~PanelScroller() { - STLDeleteContainerPointers(panels_.begin(), panels_.end()); -} - -// static -PanelScroller* PanelScroller::CreateWindow() { - views::WidgetGtk* widget = - new views::WidgetGtk(views::WidgetGtk::TYPE_WINDOW); - widget->set_delete_on_destroy(true); - widget->Init(NULL, gfx::Rect(0, 0, 100, 800)); - - PanelScroller* scroller = new PanelScroller(); - widget->SetContentsView(scroller); - - widget->Show(); - - return scroller; -} - -void PanelScroller::ViewHierarchyChanged(bool is_add, - views::View* parent, - views::View* child) { - // Our child views changed without us knowing it. Stop the animation and mark - // us as dirty (needs_layout_ = true). - animation_.Stop(); - needs_layout_ = true; -} - -gfx::Size PanelScroller::GetPreferredSize() { - return gfx::Size(75, 200); -} - -void PanelScroller::Layout() { -/* TODO(brettw) this doesn't work for some reason. - if (!needs_layout_ || !animation_.IsShowing()) - return; - needs_layout_ = false;*/ - - // The current location in the content that we're laying out. This is before - // scrolling is accounted for. - int cur_content_pos = 0; - - // Number of pixels used by headers stuck to the top of the scroll area. - int top_header_pixel_count = 0; - - int panel_count = static_cast(panels_.size()); - for (int i = 0; i < panel_count; i++) { - if (cur_content_pos < scroll_pos_ + top_header_pixel_count) { - // This panel is at least partially off the top. Put the header below the - // others already there. - panels_[i]->header->SetBounds(gfx::Rect(0, top_header_pixel_count, - width(), divider_height_)); - top_header_pixel_count += divider_height_; - - } else if (cur_content_pos > height() + scroll_pos_ - - (panel_count - i) * divider_height_) { - // When we've hit the bottom of the visible content, all the remaining - // headers will stack up at the bottom. Counting this header, there are - // (size() - i) left, which is used in the expression above. - int top = height() - (panel_count - i) * divider_height_; - panels_[i]->header->SetBounds(gfx::Rect(0, top, - width(), divider_height_)); - } else { - // Normal header positioning in-flow. - panels_[i]->header->SetBounds(gfx::Rect(0, cur_content_pos - scroll_pos_, - width(), divider_height_)); - } - - cur_content_pos += divider_height_; - - // Now position the content. It always goes in-flow ignoring any stacked - // up headers at the top or bottom. - int container_height = panels_[i]->container->GetPreferredSize().height(); - panels_[i]->container->SetBounds( - gfx::Rect(0, cur_content_pos - scroll_pos_, - width(), container_height)); - cur_content_pos += container_height; - } -} - -bool PanelScroller::OnMousePressed(const views::MouseEvent& event) { - return true; -} - -bool PanelScroller::OnMouseDragged(const views::MouseEvent& event) { - return true; -} - -void PanelScroller::OnMouseReleased(const views::MouseEvent& event, - bool canceled) { -} - -void PanelScroller::HeaderClicked(PanelScrollerHeader* source) { - for (size_t i = 0; i < panels_.size(); i++) { - if (panels_[i]->header == source) { - ScrollToPanel(static_cast(i)); - return; - } - } - NOTREACHED() << "Invalid panel passed to HeaderClicked."; -} - -void PanelScroller::ScrollToPanel(int index) { - int affected_panel_height = - panels_[index]->container->GetPreferredSize().height(); - - // The pixel size we need to reserve for the stuck headers. - int top_stuck_header_pixel_size = index * divider_height_; - int bottom_stuck_header_pixel_size = - (static_cast(panels_.size()) - index - 1) * divider_height_; - - // Compute the offset of the top of the panel to scroll to. - int space_above = 0; - for (int i = 0; i < index; i++) { - space_above += divider_height_ + - panels_[i]->container->GetPreferredSize().height(); - } - - // Compute the space below the top of the panel. - int space_below = 0; - for (int i = index; i < static_cast(panels_.size()); i++) { - space_below += divider_height_ + - panels_[i]->container->GetPreferredSize().height(); - } - - // The scroll position of the top of the stuck headers is the space above - // minus the size of the headers stuck there. - int top_stuck_headers_scroll_pos = space_above - top_stuck_header_pixel_size; - - // If the panel is already fully visible, do nothing. - if (scroll_pos_ <= top_stuck_headers_scroll_pos && - space_above + divider_height_ + affected_panel_height - - bottom_stuck_header_pixel_size <= scroll_pos_ + height()) - return; - - // Compute the scroll position. - if (height() > space_below) { - // There's enough room for this panel and everything below it to fit on the - // screen. - animated_scroll_end_ = (space_above + space_below) - height(); - if (animated_scroll_end_ > top_stuck_headers_scroll_pos) - animated_scroll_end_ = top_stuck_headers_scroll_pos; - } else if (space_above > scroll_pos_) { - // If we're going to be scrolling the content up, scroll just until the - // panel in question is fully visible. - animated_scroll_end_ = space_above + - divider_height_ + affected_panel_height + // Size of this panel. - bottom_stuck_header_pixel_size - // Leave room for these. - height(); // Available size in the window. - if (animated_scroll_end_ > top_stuck_headers_scroll_pos) - animated_scroll_end_ = top_stuck_headers_scroll_pos; - } else { - animated_scroll_end_ = top_stuck_headers_scroll_pos; - } - - animated_scroll_begin_ = scroll_pos_; - if (animated_scroll_begin_ == animated_scroll_end_) - return; // Nothing to animate. - - // Start animating to the destination. - animation_.Reset(); - animation_.Show(); -} - -void PanelScroller::AnimationEnded(const Animation* animation) { -} - -void PanelScroller::AnimationProgressed(const Animation* animation) { - scroll_pos_ = static_cast( - static_cast(animated_scroll_end_ - animated_scroll_begin_) * - animation_.GetCurrentValue()) + animated_scroll_begin_; - - Layout(); - SchedulePaint(); -} - -void PanelScroller::AnimationCanceled(const Animation* animation) { -} diff --git a/chrome/browser/views/panels/panel_scroller.h b/chrome/browser/views/panels/panel_scroller.h deleted file mode 100644 index 4d32551..0000000 --- a/chrome/browser/views/panels/panel_scroller.h +++ /dev/null @@ -1,69 +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. - -#ifndef CHROME_BROWSER_VIEWS_PANELS_PANEL_SCROLLER_H_ -#define CHROME_BROWSER_VIEWS_PANELS_PANEL_SCROLLER_H_ - -#include - -#include "app/slide_animation.h" -#include "base/basictypes.h" -#include "views/view.h" - -class PanelScrollerHeader; - -class PanelScroller : public views::View, public AnimationDelegate { - public: - PanelScroller(); - ~PanelScroller(); - - static PanelScroller* CreateWindow(); - - // View overrides. - virtual void ViewHierarchyChanged(bool is_add, - views::View* parent, - views::View* child); - virtual gfx::Size GetPreferredSize(); - virtual void Layout(); - virtual bool OnMousePressed(const views::MouseEvent& event); - virtual bool OnMouseDragged(const views::MouseEvent& event); - virtual void OnMouseReleased(const views::MouseEvent& event, bool canceled); - - // Called when a panel header is clicked with the affected container. This - // function will make sure the panel is fully visible. - void HeaderClicked(PanelScrollerHeader* source); - - private: - struct Panel; - - // AnimationDelegate overrides. - virtual void AnimationEnded(const Animation* animation); - virtual void AnimationProgressed(const Animation* animation); - virtual void AnimationCanceled(const Animation* animation); - - // Scrolls to the panel at the given index. It will be moved to the top. - void ScrollToPanel(int index); - - // All panels in this scroller. - std::vector panels_; - - // Height in pixels of the headers above each panel. - int divider_height_; - - bool needs_layout_; - - // The current scroll position. - int scroll_pos_; - - SlideAnimation animation_; - - // When animating a scroll, these indicate the beginning and ending of the - // scroll. The scroll_pos_ always indicates the current one. - int animated_scroll_begin_; - int animated_scroll_end_; - - DISALLOW_COPY_AND_ASSIGN(PanelScroller); -}; - -#endif // CHROME_BROWSER_VIEWS_PANELS_PANEL_SCROLLER_H_ diff --git a/chrome/browser/views/panels/panel_scroller_container.cc b/chrome/browser/views/panels/panel_scroller_container.cc deleted file mode 100644 index dcd9167..0000000 --- a/chrome/browser/views/panels/panel_scroller_container.cc +++ /dev/null @@ -1,30 +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 "chrome/browser/views/panels/panel_scroller_container.h" - -#include "app/gfx/canvas.h" - -PanelScrollerContainer::PanelScrollerContainer(PanelScroller* scroller, - views::View* contents) - : views::View(), - scroller_(scroller), - contents_(contents) { - AddChildView(0, contents_); - // TODO(brettw) figure out memory management. -} - -PanelScrollerContainer::~PanelScrollerContainer() { -} - -gfx::Size PanelScrollerContainer::GetPreferredSize() { - return gfx::Size(100, 500); -} - -void PanelScrollerContainer::Layout() { -} - -void PanelScrollerContainer::Paint(gfx::Canvas* canvas) { - canvas->DrawLineInt(0xFF000080, 0, 0, size().width(), size().height()); -} diff --git a/chrome/browser/views/panels/panel_scroller_container.h b/chrome/browser/views/panels/panel_scroller_container.h deleted file mode 100644 index 43bf0b2..0000000 --- a/chrome/browser/views/panels/panel_scroller_container.h +++ /dev/null @@ -1,36 +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. - -#ifndef CHROME_BROWSER_VIEWS_PANELS_PANEL_SCROLLER_CONTAINER_H_ -#define CHROME_BROWSER_VIEWS_PANELS_PANEL_SCROLLER_CONTAINER_H_ - -#include "base/basictypes.h" -#include "views/view.h" - -class PanelScroller; - -// This class wraps the contents of a panel in the panel scroller. It currently -// doesn't do anything useful, but it just a placeholder. -class PanelScrollerContainer : public views::View { - public: - PanelScrollerContainer(PanelScroller* scroller, views::View* contents); - virtual ~PanelScrollerContainer(); - - int HeaderSize() const; - - // view::View overrides. - virtual gfx::Size GetPreferredSize(); - virtual void Layout(); - virtual void Paint(gfx::Canvas* canvas); - - private: - // Non-owning pointer to our parent scroller object. - PanelScroller* scroller_; - - views::View* contents_; - - DISALLOW_COPY_AND_ASSIGN(PanelScrollerContainer); -}; - -#endif // CHROME_BROWSER_VIEWS_PANELS_PANEL_SCROLLER_CONTAINER_H_ diff --git a/chrome/browser/views/panels/panel_scroller_header.cc b/chrome/browser/views/panels/panel_scroller_header.cc deleted file mode 100644 index 46e4ffb..0000000 --- a/chrome/browser/views/panels/panel_scroller_header.cc +++ /dev/null @@ -1,51 +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 "chrome/browser/views/panels/panel_scroller_header.h" - -#include "app/gfx/canvas.h" -#include "app/gfx/font.h" -#include "app/resource_bundle.h" -#include "base/string_util.h" -#include "chrome/browser/views/panels/panel_scroller.h" - -PanelScrollerHeader::PanelScrollerHeader(PanelScroller* scroller) - : views::View(), - scroller_(scroller) { -} - -PanelScrollerHeader::~PanelScrollerHeader() { -} - -bool PanelScrollerHeader::OnMousePressed(const views::MouseEvent& event) { - return true; -} - -bool PanelScrollerHeader::OnMouseDragged(const views::MouseEvent& event) { - return false; -} - -void PanelScrollerHeader::OnMouseReleased(const views::MouseEvent& event, - bool canceled) { - scroller_->HeaderClicked(this); -} - -gfx::Size PanelScrollerHeader::GetPreferredSize() { - return gfx::Size(size().width(), 18); -} - -void PanelScrollerHeader::Paint(gfx::Canvas* canvas) { - // TODO(brettw) fill this out with real styling. - canvas->FillRectInt(0xFFFFFFFF, 0, 0, size().width(), size().height()); - canvas->DrawLineInt(0xFFE6E6E6, 0, size().height() - 1, - size().width(), size().height() - 1); - - ResourceBundle& rb = ResourceBundle::GetSharedInstance(); - gfx::Font font = - rb.GetFont(ResourceBundle::BaseFont).DeriveFont(0, gfx::Font::BOLD); - int font_top = 1; - canvas->DrawStringInt(UTF16ToWideHack(title_), font, 0xFF000000, 3, font_top, - size().width(), size().height() - font_top); - -} diff --git a/chrome/browser/views/panels/panel_scroller_header.h b/chrome/browser/views/panels/panel_scroller_header.h deleted file mode 100644 index 0be080b..0000000 --- a/chrome/browser/views/panels/panel_scroller_header.h +++ /dev/null @@ -1,41 +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. - -#ifndef CHROME_BROWSER_VIEWS_PANELS_PANEL_SCROLLER_HEADER_H_ -#define CHROME_BROWSER_VIEWS_PANELS_PANEL_SCROLLER_HEADER_H_ - -#include - -#include "base/basictypes.h" -#include "base/string16.h" -#include "views/view.h" - -class PanelScroller; - -class PanelScrollerHeader : public views::View { - public: - PanelScrollerHeader(PanelScroller* scroller); - virtual ~PanelScrollerHeader(); - - void set_title(const string16& title) { - title_ = title; - } - - // views::View overrides. - virtual bool OnMousePressed(const views::MouseEvent& event); - virtual bool OnMouseDragged(const views::MouseEvent& event); - virtual void OnMouseReleased(const views::MouseEvent& event, bool canceled); - virtual gfx::Size GetPreferredSize(); - virtual void Paint(gfx::Canvas* canvas); - - private: - // Non-owning pointer to our parent scroller object. - PanelScroller* scroller_; - - string16 title_; - - DISALLOW_COPY_AND_ASSIGN(PanelScrollerHeader); -}; - -#endif // CHROME_BROWSER_VIEWS_PANELS_PANEL_SCROLLER_HEADER_H_ diff --git a/chrome/browser/views/tabs/tab_overview_controller.cc b/chrome/browser/views/tabs/tab_overview_controller.cc index ee26feebc..91e9dd6 100644 --- a/chrome/browser/views/tabs/tab_overview_controller.cc +++ b/chrome/browser/views/tabs/tab_overview_controller.cc @@ -8,7 +8,7 @@ #include "chrome/browser/browser_process.h" #if defined(TOOLKIT_VIEWS) #include "chrome/common/x11_util.h" -#include "chrome/browser/chromeos/browser_extender.h" +#include "chrome/browser/views/frame/browser_extender.h" #include "chrome/browser/views/frame/browser_view.h" #else #include "chrome/browser/gtk/browser_window_gtk.h" diff --git a/chrome/chrome.gyp b/chrome/chrome.gyp index 7bda7a4..39b29d7 100755 --- a/chrome/chrome.gyp +++ b/chrome/chrome.gyp @@ -957,8 +957,7 @@ 'browser/chrome_plugin_host.h', 'browser/chrome_thread.cc', 'browser/chrome_thread.h', - 'browser/chromeos/browser_extender.cc', - 'browser/chromeos/browser_extender.h', + 'browser/chromeos/chromeos_browser_extenders.cc', 'browser/chromeos/chromeos_version_loader.cc', 'browser/chromeos/chromeos_version_loader.h', 'browser/chromeos/clock_menu_button.cc', @@ -979,6 +978,14 @@ 'browser/chromeos/main_menu.h', 'browser/chromeos/network_menu_button.cc', 'browser/chromeos/network_menu_button.h', + 'browser/chromeos/panel_controller.cc', + 'browser/chromeos/panel_controller.h', + 'browser/chromeos/panels/panel_scroller.cc', + 'browser/chromeos/panels/panel_scroller.h', + 'browser/chromeos/panels/panel_scroller_container.cc', + 'browser/chromeos/panels/panel_scroller_container.h', + 'browser/chromeos/panels/panel_scroller_header.cc', + 'browser/chromeos/panels/panel_scroller_header.h', 'browser/chromeos/password_dialog_view.cc', 'browser/chromeos/password_dialog_view.h', 'browser/chromeos/pipe_reader.cc', @@ -2219,6 +2226,8 @@ 'browser/views/first_run_view.h', 'browser/views/first_run_view_base.cc', 'browser/views/first_run_view_base.h', + 'browser/views/frame/browser_extender.cc', + 'browser/views/frame/browser_extender.h', 'browser/views/frame/browser_frame.h', 'browser/views/frame/browser_frame_gtk.cc', 'browser/views/frame/browser_frame_gtk.h', @@ -2233,6 +2242,7 @@ 'browser/views/frame/glass_browser_frame_view.h', 'browser/views/frame/opaque_browser_frame_view.cc', 'browser/views/frame/opaque_browser_frame_view.h', + 'browser/views/frame/standard_extender.cc', 'browser/views/fullscreen_exit_bubble.cc', 'browser/views/fullscreen_exit_bubble.h', 'browser/views/go_button.cc', @@ -2292,14 +2302,6 @@ 'browser/views/options/passwords_page_view.cc', 'browser/views/options/passwords_page_view.h', 'browser/views/page_info_window_view.cc', - 'browser/views/panel_controller.cc', - 'browser/views/panel_controller.h', - 'browser/views/panels/panel_scroller.cc', - 'browser/views/panels/panel_scroller.h', - 'browser/views/panels/panel_scroller_container.cc', - 'browser/views/panels/panel_scroller_container.h', - 'browser/views/panels/panel_scroller_header.cc', - 'browser/views/panels/panel_scroller_header.h', 'browser/views/repost_form_warning_view.cc', 'browser/views/repost_form_warning_view.h', 'browser/views/restart_message_box.cc', @@ -2419,8 +2421,7 @@ }], ['chromeos==1 and toolkit_views==0', { 'sources!': [ - 'browser/chromeos/browser_extender.cc', - 'browser/chromeos/browser_extender.h', + 'browser/chromeos/chromeos_browser_extenders.cc', ], }], ['chromeos==0 and toolkit_views==0', { @@ -2734,6 +2735,8 @@ ['include', '^browser/views/go_button.h'], ['include', '^browser/views/toolbar_star_toggle.h'], ['include', '^browser/views/toolbar_star_toggle.cc'], + ['include', '^browser/views/frame/browser_extender.cc'], + ['include', '^browser/views/frame/browser_extender.h'], ['include', '^browser/views/frame/browser_view.cc'], ['include', '^browser/views/frame/browser_view.h'], ['include', '^browser/views/frame/browser_frame_gtk.cc'], -- cgit v1.1