blob: b5aab75a646edb6155b264f7ae23ea43f82c0082 [file] [log] [blame]
// Copyright 2015 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 ASH_MUS_MOVE_EVENT_HANDLER_H_
#define ASH_MUS_MOVE_EVENT_HANDLER_H_
#include <memory>
#include "ash/common/wm/wm_toplevel_window_event_handler.h"
#include "base/macros.h"
#include "ui/aura/window_observer.h"
#include "ui/events/event_handler.h"
namespace aura {
class Window;
}
namespace ui {
class CancelModeEvent;
class Window;
class WindowManagerClient;
}
namespace ash {
namespace mus {
class WmWindowMus;
class WorkspaceEventHandlerMus;
// EventHandler attached to windows that may be dragged and/or resized. This
// forwards to WmToplevelWindowEventHandler to handle the actual drag/resize.
//
// TODO(sky): rename this class to better reflect that it handles redirecting
// events in addition to drag.
class MoveEventHandler : public ui::EventHandler, public aura::WindowObserver {
public:
MoveEventHandler(ui::Window* mus_window,
ui::WindowManagerClient* window_manager_client,
aura::Window* aura_window);
~MoveEventHandler() override;
// Retrieves the MoveEventHandler for an existing WmWindow.
static MoveEventHandler* GetForWindow(WmWindow* wm_window);
// Attempts to start a drag if one is not already in progress. This passes
// the call to the underlying WmToplevelWindowEventHandler. After the drag
// completes, |end_closure| will be called to return whether the drag was
// successfully completed.
void AttemptToStartDrag(
const gfx::Point& point_in_parent,
int window_component,
aura::client::WindowMoveSource source,
const base::Callback<void(bool success)>& end_closure);
// Returns whether we're in a drag.
bool IsDragInProgress();
// Reverts a manually started drag started with AttemptToStartDrag().
void RevertDrag();
private:
// Removes observer and EventHandler installed on |root_window_|.
void Detach();
// Returns the WorkspaceEventHandlerMus, or null if the window is not in a
// workspace.
WorkspaceEventHandlerMus* GetWorkspaceEventHandlerMus();
// Overridden from ui::EventHandler:
void OnMouseEvent(ui::MouseEvent* event) override;
void OnGestureEvent(ui::GestureEvent* event) override;
void OnCancelMode(ui::CancelModeEvent* event) override;
// Overridden from aura::WindowObserver:
void OnWindowDestroying(aura::Window* window) override;
WmWindowMus* wm_window_;
ui::WindowManagerClient* window_manager_client_;
// The root window of the aura::Window supplied to the constructor.
// MoveEventHandler is added as a pre-target handler (and observer) of this.
aura::Window* root_window_;
wm::WmToplevelWindowEventHandler toplevel_window_event_handler_;
DISALLOW_COPY_AND_ASSIGN(MoveEventHandler);
};
} // namespace mus
} // namespace ash
#endif // ASH_MUS_MOVE_EVENT_HANDLER_H_