// 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_