Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(604)

Side by Side Diff: ui/aura_shell/default_container_event_filter.cc

Issue 9035001: Move some more WM functionality down into ash. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 8 years, 12 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2011 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 #include "ui/aura_shell/default_container_event_filter.h"
6
7 #include "ui/aura/event.h"
8 #include "ui/aura/window.h"
9 #include "ui/aura_shell/default_container_layout_manager.h"
10 #include "ui/aura_shell/window_frame.h"
11 #include "ui/aura_shell/window_util.h"
12 #include "ui/base/hit_test.h"
13
14 namespace {
15
16 // Sends OnWindowHoveredChanged(|hovered|) to the WindowFrame for |window|,
17 // which may be NULL.
18 void WindowHoverChanged(aura::Window* window, bool hovered) {
19 if (!window)
20 return;
21 aura_shell::WindowFrame* window_frame =
22 static_cast<aura_shell::WindowFrame*>(
23 window->GetProperty(aura_shell::kWindowFrameKey));
24 if (!window_frame)
25 return;
26 window_frame->OnWindowHoverChanged(hovered);
27 }
28
29 } // namespace
30
31 namespace aura_shell {
32 namespace internal {
33
34 DefaultContainerEventFilter::DefaultContainerEventFilter(aura::Window* owner)
35 : ToplevelWindowEventFilter(owner),
36 drag_state_(DRAG_NONE),
37 hovered_window_(NULL) {
38 }
39
40 DefaultContainerEventFilter::~DefaultContainerEventFilter() {
41 }
42
43 bool DefaultContainerEventFilter::PreHandleMouseEvent(aura::Window* target,
44 aura::MouseEvent* event) {
45 DefaultContainerLayoutManager* layout_manager =
46 static_cast<DefaultContainerLayoutManager*>(owner()->layout_manager());
47 DCHECK(layout_manager);
48
49 // TODO(oshima|derat): Incorporate the logic below and introduce DragObserver
50 // (or something similar) to decouple DCLM.
51
52 // Notify layout manager that drag event may move/resize the target wnidow.
53 if (event->type() == ui::ET_MOUSE_DRAGGED && drag_state_ == DRAG_NONE)
54 layout_manager->PrepareForMoveOrResize(target, event);
55
56 bool handled = ToplevelWindowEventFilter::PreHandleMouseEvent(target, event);
57
58 switch (event->type()) {
59 case ui::ET_MOUSE_DRAGGED:
60 // Cancel move/resize if the event wasn't handled, or
61 // drag_state_ didn't move to MOVE or RESIZE.
62 if (handled) {
63 switch (drag_state_) {
64 case DRAG_NONE:
65 if (!UpdateDragState())
66 layout_manager->CancelMoveOrResize(target, event);
67 break;
68 case DRAG_MOVE:
69 layout_manager->ProcessMove(target, event);
70 break;
71 case DRAG_RESIZE:
72 break;
73 }
74 } else {
75 layout_manager->CancelMoveOrResize(target, event);
76 }
77 break;
78 case ui::ET_MOUSE_ENTERED:
79 UpdateHoveredWindow(GetActivatableWindow(target));
80 break;
81 case ui::ET_MOUSE_EXITED:
82 UpdateHoveredWindow(NULL);
83 break;
84 case ui::ET_MOUSE_RELEASED:
85 if (drag_state_ == DRAG_MOVE)
86 layout_manager->EndMove(target, event);
87 else if (drag_state_ == DRAG_RESIZE)
88 layout_manager->EndResize(target, event);
89
90 drag_state_ = DRAG_NONE;
91 break;
92 default:
93 break;
94 }
95 return handled;
96 }
97
98 bool DefaultContainerEventFilter::UpdateDragState() {
99 DCHECK_EQ(DRAG_NONE, drag_state_);
100 switch (window_component()) {
101 case HTCAPTION:
102 drag_state_ = DRAG_MOVE;
103 break;
104 case HTTOP:
105 case HTTOPRIGHT:
106 case HTRIGHT:
107 case HTBOTTOMRIGHT:
108 case HTBOTTOM:
109 case HTBOTTOMLEFT:
110 case HTLEFT:
111 case HTTOPLEFT:
112 case HTGROWBOX:
113 drag_state_ = DRAG_RESIZE;
114 break;
115 default:
116 return false;
117 }
118 return true;
119 }
120
121 void DefaultContainerEventFilter::UpdateHoveredWindow(
122 aura::Window* toplevel_window) {
123 if (toplevel_window == hovered_window_)
124 return;
125 WindowHoverChanged(hovered_window_, false);
126 hovered_window_ = toplevel_window;
127 WindowHoverChanged(hovered_window_, true);
128 }
129
130 } // internal
131 } // aura_shell
OLDNEW
« no previous file with comments | « ui/aura_shell/default_container_event_filter.h ('k') | ui/aura_shell/default_container_layout_manager.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698