// 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/common/shell_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 ShellObserver {
 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;

  // ShellObserver overrides:
  void OnLoginStateChanged(LoginStatus status) override;
  void OnAppTerminating() override;
  void OnLockStateChanged(bool locked) override;

 private:
  Delegate* delegate_;

  DISALLOW_COPY_AND_ASSIGN(OverlayEventFilter);
};

}  // namespace ash

#endif  // ASH_WM_OVERLAY_EVENT_FILTER_H_
