// Copyright (c) 2012 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_WM_OVERLAY_EVENT_FILTER_H_
#define ASH_WM_OVERLAY_EVENT_FILTER_H_

#include "ash/ash_export.h"
#include "ash/session/session_observer.h"
#include "base/compiler_specific.h"
#include "base/macros.h"
#include "ui/aura/window.h"
#include "ui/events/event_handler.h"

namespace ash {

// EventFilter for the "overlay window", which intercepts events before they are
// processed by the usual path (e.g. the partial screenshot UI, the keyboard
// overlay).  It does nothing the first time, but works when |Activate()| is
// called.  The main task of this event filter is just to stop propagation
// of any key events during activation, and also signal cancellation when keys
// for canceling are pressed.
class ASH_EXPORT OverlayEventFilter : public ui::EventHandler,
                                      public SessionObserver {
 public:
  // Windows that need to receive events from OverlayEventFilter implement this.
  class ASH_EXPORT Delegate {
   public:
    // Invoked when OverlayEventFilter needs to stop handling events.
    virtual void Cancel() = 0;

    // Returns true if the overlay should be canceled in response to |event|.
    virtual bool IsCancelingKeyEvent(ui::KeyEvent* event) = 0;

    // Returns the window that needs to receive events. NULL if no window needs
    // to receive key events from OverlayEventFilter.
    virtual aura::Window* GetWindow() = 0;
  };

  OverlayEventFilter();
  ~OverlayEventFilter() override;

  // Starts the filtering of events.  It also notifies the specified
  // |delegate| when a key event means cancel (like Esc).  It holds the
  // pointer to the specified |delegate| until Deactivate() is called, but
  // does not take ownership.
  void Activate(Delegate* delegate);

  // Ends the filtering of events.
  void Deactivate(Delegate* delegate);

  // Cancels the partial screenshot UI.  Do nothing if it's not activated.
  void Cancel();

  // Returns true if it's currently active.
  bool IsActive();

  // ui::EventHandler overrides:
  void OnKeyEvent(ui::KeyEvent* event) override;

  // SessionObserver overrides:
  void OnLoginStatusChanged(LoginStatus status) override;
  void OnChromeTerminating() override;
  void OnLockStateChanged(bool locked) override;

 private:
  Delegate* delegate_ = nullptr;
  ScopedSessionObserver scoped_session_observer_;

  DISALLOW_COPY_AND_ASSIGN(OverlayEventFilter);
};

}  // namespace ash

#endif  // ASH_WM_OVERLAY_EVENT_FILTER_H_
