1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef UI_WM_CORE_WINDOW_MODALITY_CONTROLLER_H_
6#define UI_WM_CORE_WINDOW_MODALITY_CONTROLLER_H_
7
8#include <vector>
9
10#include "base/compiler_specific.h"
11#include "ui/aura/env_observer.h"
12#include "ui/aura/window_observer.h"
13#include "ui/events/event_handler.h"
14#include "ui/wm/wm_export.h"
15
16namespace ui {
17class EventTarget;
18class LocatedEvent;
19}
20
21namespace wm {
22
23// Sets the modal parent for the child.
24WM_EXPORT void SetModalParent(aura::Window* child, aura::Window* parent);
25
26// Returns the modal transient child of |window|, or NULL if |window| does not
27// have any modal transient children.
28WM_EXPORT aura::Window* GetModalTransient(aura::Window* window);
29
30// WindowModalityController is an event filter that consumes events sent to
31// windows that are the transient parents of window-modal windows. This filter
32// must be added to the CompoundEventFilter so that activation works properly.
33class WM_EXPORT WindowModalityController : public ui::EventHandler,
34                                           public aura::EnvObserver,
35                                           public aura::WindowObserver {
36 public:
37  explicit WindowModalityController(ui::EventTarget* event_target);
38  virtual ~WindowModalityController();
39
40  // Overridden from ui::EventHandler:
41  virtual void OnKeyEvent(ui::KeyEvent* event) OVERRIDE;
42  virtual void OnMouseEvent(ui::MouseEvent* event) OVERRIDE;
43  virtual void OnTouchEvent(ui::TouchEvent* event) OVERRIDE;
44
45  // Overridden from aura::EnvObserver:
46  virtual void OnWindowInitialized(aura::Window* window) OVERRIDE;
47
48  // Overridden from aura::WindowObserver:
49  virtual void OnWindowPropertyChanged(aura::Window* window,
50                                       const void* key,
51                                       intptr_t old) OVERRIDE;
52  virtual void OnWindowVisibilityChanged(aura::Window* window,
53                                         bool visible) OVERRIDE;
54  virtual void OnWindowDestroyed(aura::Window* window) OVERRIDE;
55
56 private:
57  // Processes a mouse/touch event, and returns true if the event should be
58  // consumed.
59  bool ProcessLocatedEvent(aura::Window* target,
60                           ui::LocatedEvent* event);
61
62  std::vector<aura::Window*> windows_;
63
64  ui::EventTarget* event_target_;
65
66  DISALLOW_COPY_AND_ASSIGN(WindowModalityController);
67};
68
69}  // namespace wm
70
71#endif  // UI_WM_CORE_WINDOW_MODALITY_CONTROLLER_H_
72