// Copyright 2014 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_UI_VIEWS_PANELS_X11_PANEL_RESIZER_H_
#define CHROME_BROWSER_UI_VIEWS_PANELS_X11_PANEL_RESIZER_H_

#include "base/macros.h"
#include "ui/events/event_handler.h"
#include "ui/gfx/geometry/point.h"

namespace aura {
class Window;
}

class Panel;

// EventHandler which implements special handling for resizing panels. Panels
// should use X11PanelResizer instead of X11WindowEventFilter.
// When resizing a panel:
// - The panel bounds should update in sync with the user's mouse movement
//   during the resize operation.
// - The layout of all of the panels should be updated once the resize operation
//   completes.
// X11PanelResizer does not hand off resizing to the window manager because it
// is not possible to determine when the window manager has finished resizing.
class X11PanelResizer : public ui::EventHandler {
 public:
  X11PanelResizer(Panel* panel, aura::Window* window);
  ~X11PanelResizer() override;

 private:
  enum ResizeState {
    NOT_RESIZING,

    // The user has clicked on one of the panel's edges.
    RESIZE_CAN_START,

    // The user has dragged one of the panel's edges far enough for resizing to
    // begin.
    RESIZE_IN_PROGRESS
  };

  // Called as a result of ET_MOUSE_PRESSED.
  void OnMousePressed(ui::MouseEvent* event);

  // Called as a result of ET_MOUSE_DRAGGED.
  void OnMouseDragged(ui::MouseEvent* event);

  // Stops the resize operation if one is in progress. Consumes |event| if it
  // is not NULL and the resize operation was stopped.
  void StopResizing(ui::MouseEvent* event, bool canceled);

  // ui::EventHandler:
  void OnMouseEvent(ui::MouseEvent* event) override;

  // The panel being resized.
  Panel* panel_;

  // |panel|'s window.
  aura::Window* window_;

  ResizeState resize_state_;

  // The edge that the user is resizing.
  int resize_component_;

  // The location of the mouse click on the window border.
  gfx::Point initial_press_location_in_screen_;

  DISALLOW_COPY_AND_ASSIGN(X11PanelResizer);
};

#endif  // CHROME_BROWSER_UI_VIEWS_PANELS_X11_PANEL_RESIZER_H_