| Index: chrome/browser/views/panel_controller.cc
|
| ===================================================================
|
| --- chrome/browser/views/panel_controller.cc (revision 0)
|
| +++ chrome/browser/views/panel_controller.cc (revision 0)
|
| @@ -0,0 +1,237 @@
|
| +// 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 <gdk/gdkx.h>
|
| +extern "C" {
|
| +#include <X11/Xlib.h>
|
| +}
|
| +
|
| +#include "app/resource_bundle.h"
|
| +#include "base/logging.h"
|
| +#include "base/singleton.h"
|
| +#include "base/scoped_ptr.h"
|
| +#include "chrome/browser/browser.h"
|
| +#include "chrome/browser/gtk/browser_window_gtk.h"
|
| +#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/label.h"
|
| +#include "views/event.h"
|
| +#include "views/view.h"
|
| +#include "views/widget/widget_gtk.h"
|
| +
|
| +static int close_button_width;
|
| +static int close_button_height;
|
| +static SkBitmap* close_button_n;
|
| +static SkBitmap* close_button_h;
|
| +static SkBitmap* close_button_p;
|
| +static gfx::Font* title_font = NULL;
|
| +
|
| +namespace {
|
| +
|
| +const int kTitleWidth = 200;
|
| +const int kTitleHeight = 24;
|
| +const int kTitlePad = 8;
|
| +const int kButtonPad = 8;
|
| +
|
| +static bool resources_initialized;
|
| +static void InitializeResources() {
|
| + if (resources_initialized) {
|
| + return;
|
| + }
|
| +
|
| + resources_initialized = true;
|
| + ResourceBundle& rb = ResourceBundle::GetSharedInstance();
|
| + title_font = new gfx::Font(rb.GetFont(ResourceBundle::BaseFont));
|
| + close_button_n = rb.GetBitmapNamed(IDR_TAB_CLOSE);
|
| + 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
|
| +
|
| +PanelController::PanelController(BrowserWindowGtk* browser_window)
|
| + : browser_window_(browser_window),
|
| + panel_(browser_window->window()),
|
| + panel_xid_(x11_util::GetX11WindowFromGtkWidget(GTK_WIDGET(panel_))),
|
| + expanded_(true),
|
| + mouse_down_(false),
|
| + dragging_(false) {
|
| + title_window_ = new views::WidgetGtk(views::WidgetGtk::TYPE_WINDOW);
|
| + gfx::Rect title_bounds(
|
| + 0, 0, browser_window->GetNormalBounds().width(), kTitleHeight);
|
| + 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<int> 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() {
|
| + title_content_->title_label()->SetText(
|
| + browser_window_->browser()->GetCurrentPageTitle());
|
| +}
|
| +
|
| +bool PanelController::TitleMousePressed(const views::MouseEvent& event) {
|
| + if (!event.IsOnlyLeftMouseButton()) {
|
| + return false;
|
| + }
|
| + gfx::Point abs_location = event.location();
|
| + views::View::ConvertPointToScreen(title_content_, &abs_location);
|
| + mouse_down_ = true;
|
| + mouse_down_abs_x_ = abs_location.x();
|
| + mouse_down_abs_y_ = abs_location.y();
|
| + mouse_down_offset_x_ = event.x();
|
| + mouse_down_offset_y_ = event.y();
|
| + dragging_ = false;
|
| + 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;
|
| + }
|
| +
|
| + gfx::Point abs_location = event.location();
|
| + views::View::ConvertPointToScreen(title_content_, &abs_location);
|
| + if (!dragging_) {
|
| + if (views::View::ExceededDragThreshold(
|
| + abs_location.x() - mouse_down_abs_x_,
|
| + abs_location.y() - 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, abs_location.x() - mouse_down_offset_x_);
|
| + msg.set_param(2, abs_location.y() - mouse_down_offset_y_);
|
| + TabOverviewTypes::instance()->SendMessage(msg);
|
| + }
|
| + return true;
|
| +}
|
| +
|
| +// static
|
| +bool PanelController::OnPanelClientEvent(
|
| + GtkWidget* widget,
|
| + GdkEventClient* event,
|
| + PanelController* panel_controller) {
|
| + return panel_controller->PanelClientEvent(event);
|
| +}
|
| +
|
| +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() {
|
| + title_window_->Close();
|
| +}
|
| +
|
| +void PanelController::ButtonPressed(views::Button* sender) {
|
| + if (sender == title_content_->close_button()) {
|
| + browser_window_->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);
|
| + AddChildView(close_button_);
|
| +
|
| + title_label_ = new views::Label(std::wstring(), *title_font);
|
| + title_label_->SetHorizontalAlignment(views::Label::ALIGN_LEFT);
|
| + AddChildView(title_label_);
|
| +
|
| + set_background(views::Background::CreateSolidBackground(0xdd, 0xdd, 0xdd, 1));
|
| +}
|
| +
|
| +void PanelController::TitleContentView::Layout() {
|
| + close_button_->SetBounds(
|
| + bounds().width() - (close_button_width + kButtonPad),
|
| + (bounds().height() - close_button_height) / 2,
|
| + close_button_width,
|
| + close_button_height);
|
| + title_label_->SetBounds(
|
| + kTitlePad,
|
| + 0,
|
| + bounds().width() - (kTitlePad + close_button_width + 2 * kButtonPad),
|
| + bounds().height());
|
| +}
|
| +
|
| +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);
|
| +}
|
| +
|
|
|
| Property changes on: chrome/browser/views/panel_controller.cc
|
| ___________________________________________________________________
|
| Name: svn:eol-style
|
| + LF
|
|
|
|
|