// Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CHROME_BROWSER_CHROMEOS_FRAME_PANEL_CONTROLLER_H_ #define CHROME_BROWSER_CHROMEOS_FRAME_PANEL_CONTROLLER_H_ #pragma once #include <gtk/gtk.h> #include "third_party/cros/chromeos_wm_ipc_enums.h" #include "ui/base/x/x11_util.h" #include "views/controls/button/button.h" class BrowserView; class SkBitmap; typedef unsigned long XID; namespace base { class Time; } namespace views { class ImageButton; class ImageView; class Label; class MouseEvent; class Widget; } namespace chromeos { // Controls interactions with the WM for popups / panels. class PanelController { public: enum State { INITIAL, EXPANDED, MINIMIZED, }; // Delegate to control panel's appearance and behavior. class Delegate { public: // Retrieves the title string of the panel. virtual string16 GetPanelTitle() = 0; // Retrieves the icon to use in the panel's titlebar. virtual SkBitmap GetPanelIcon() = 0; // Can the panel be closed? Called before ClosePanel() when the close // button is pressed to give beforeunload handlers a chance to cancel. virtual bool CanClosePanel() = 0; // Close the panel. Called when a close button is pressed. virtual void ClosePanel() = 0; // Activate the panel. Called when maximized. virtual void ActivatePanel() = 0; }; PanelController(Delegate* delegate_window, GtkWindow* window); virtual ~PanelController() {} // Initializes the panel controller with the initial state of the focus and // the window bounds. void Init(bool initial_focus, const gfx::Rect& init_bounds, XID creator_xid, WmIpcPanelUserResizeType resize_type); bool TitleMousePressed(const views::MouseEvent& event); void TitleMouseReleased(const views::MouseEvent& event); void TitleMouseCaptureLost(); bool TitleMouseDragged(const views::MouseEvent& event); bool PanelClientEvent(GdkEventClient* event); void OnFocusIn(); void OnFocusOut(); void UpdateTitleBar(); void SetUrgent(bool urgent); void Close(); void SetState(State state); bool urgent() { return urgent_; } private: class TitleContentView : public views::View, public views::ButtonListener { public: explicit TitleContentView(PanelController* panelController); virtual ~TitleContentView(); // Overridden from View: virtual void Layout() OVERRIDE; virtual bool OnMousePressed(const views::MouseEvent& event) OVERRIDE; virtual void OnMouseReleased(const views::MouseEvent& event) OVERRIDE; virtual void OnMouseCaptureLost() OVERRIDE; virtual bool OnMouseDragged(const views::MouseEvent& event) OVERRIDE; void OnFocusIn(); void OnFocusOut(); void OnClose(); views::ImageView* title_icon() { return title_icon_; } views::Label* title_label() { return title_label_; } views::ImageButton* close_button() { return close_button_; } // ButtonListener methods. virtual void ButtonPressed(views::Button* sender, const views::Event& event) OVERRIDE; private: views::ImageView* title_icon_; views::Label* title_label_; views::ImageButton* close_button_; PanelController* panel_controller_; DISALLOW_COPY_AND_ASSIGN(TitleContentView); }; // Called from TitleContentView's ButtonPressed handler. void OnCloseButtonPressed(); // Dispatches client events to PanelController instances static bool OnPanelClientEvent( GtkWidget* widget, GdkEventClient* event, PanelController* panel_controller); // Panel's delegate. Delegate* delegate_; // Gtk object for content. GtkWindow* panel_; // X id for content. XID panel_xid_; // Views object representing title. views::Widget* 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_; // GTK client event handler id. int client_event_handler_id_; // Focused state. bool focused_; // Urgent (highlight) state. bool urgent_; // Timestamp to prevent setting urgent immediately after clearing it. base::TimeTicks urgent_cleared_time_; DISALLOW_COPY_AND_ASSIGN(PanelController); }; } // namespace chromeos #endif // CHROME_BROWSER_CHROMEOS_FRAME_PANEL_CONTROLLER_H_