| OLD | NEW |
| (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 | |
| OLD | NEW |