Index: ui/aura_shell/toplevel_window_event_filter.cc |
=================================================================== |
--- ui/aura_shell/toplevel_window_event_filter.cc (revision 115655) |
+++ ui/aura_shell/toplevel_window_event_filter.cc (working copy) |
@@ -1,353 +0,0 @@ |
-// Copyright (c) 2011 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. |
- |
-#include "ui/aura_shell/toplevel_window_event_filter.h" |
- |
-#include "ui/aura/client/aura_constants.h" |
-#include "ui/aura/cursor.h" |
-#include "ui/aura/event.h" |
-#include "ui/aura/root_window.h" |
-#include "ui/aura/window.h" |
-#include "ui/aura/window_delegate.h" |
-#include "ui/aura_shell/window_util.h" |
-#include "ui/base/hit_test.h" |
-#include "ui/base/ui_base_types.h" |
- |
-namespace aura_shell { |
- |
-namespace { |
- |
-// Identifies the types of bounds change operations performed by a drag to a |
-// particular window component. |
-const int kBoundsChange_None = 0; |
-const int kBoundsChange_Repositions = 1; |
-const int kBoundsChange_Resizes = 2; |
- |
-int GetBoundsChangeForWindowComponent(int window_component) { |
- int bounds_change = kBoundsChange_None; |
- switch (window_component) { |
- case HTTOPLEFT: |
- case HTTOP: |
- case HTTOPRIGHT: |
- case HTLEFT: |
- case HTBOTTOMLEFT: |
- bounds_change |= kBoundsChange_Repositions | kBoundsChange_Resizes; |
- break; |
- case HTCAPTION: |
- bounds_change |= kBoundsChange_Repositions; |
- break; |
- case HTRIGHT: |
- case HTBOTTOMRIGHT: |
- case HTBOTTOM: |
- case HTGROWBOX: |
- bounds_change |= kBoundsChange_Resizes; |
- break; |
- default: |
- break; |
- } |
- return bounds_change; |
-} |
- |
-// Possible directions for changing bounds. |
- |
-const int kBoundsChangeDirection_None = 0; |
-const int kBoundsChangeDirection_Horizontal = 1; |
-const int kBoundsChangeDirection_Vertical = 2; |
- |
-int GetPositionChangeDirectionForWindowComponent(int window_component) { |
- int pos_change_direction = kBoundsChangeDirection_None; |
- switch (window_component) { |
- case HTTOPLEFT: |
- case HTBOTTOMRIGHT: |
- case HTGROWBOX: |
- case HTCAPTION: |
- pos_change_direction |= |
- kBoundsChangeDirection_Horizontal | kBoundsChangeDirection_Vertical; |
- break; |
- case HTTOP: |
- case HTTOPRIGHT: |
- case HTBOTTOM: |
- pos_change_direction |= kBoundsChangeDirection_Vertical; |
- break; |
- case HTBOTTOMLEFT: |
- case HTRIGHT: |
- case HTLEFT: |
- pos_change_direction |= kBoundsChangeDirection_Horizontal; |
- break; |
- default: |
- break; |
- } |
- return pos_change_direction; |
-} |
- |
-int GetSizeChangeDirectionForWindowComponent(int window_component) { |
- int size_change_direction = kBoundsChangeDirection_None; |
- switch (window_component) { |
- case HTTOPLEFT: |
- case HTTOPRIGHT: |
- case HTBOTTOMLEFT: |
- case HTBOTTOMRIGHT: |
- case HTGROWBOX: |
- case HTCAPTION: |
- size_change_direction |= |
- kBoundsChangeDirection_Horizontal | kBoundsChangeDirection_Vertical; |
- break; |
- case HTTOP: |
- case HTBOTTOM: |
- size_change_direction |= kBoundsChangeDirection_Vertical; |
- break; |
- case HTRIGHT: |
- case HTLEFT: |
- size_change_direction |= kBoundsChangeDirection_Horizontal; |
- break; |
- default: |
- break; |
- } |
- return size_change_direction; |
-} |
- |
-// Returns true for resize components along the right edge, where a drag in |
-// positive x will make the window larger. |
-bool IsRightEdge(int window_component) { |
- return window_component == HTTOPRIGHT || |
- window_component == HTRIGHT || |
- window_component == HTBOTTOMRIGHT || |
- window_component == HTGROWBOX; |
-} |
- |
-// Returns true for resize components in along the bottom edge, where a drag |
-// in positive y will make the window larger. |
-bool IsBottomEdge(int window_component) { |
- return window_component == HTBOTTOMLEFT || |
- window_component == HTBOTTOM || |
- window_component == HTBOTTOMRIGHT || |
- window_component == HTGROWBOX; |
-} |
- |
-void ToggleMaximizedState(aura::Window* window) { |
- window->SetIntProperty(aura::client::kShowStateKey, |
- IsWindowMaximized(window) ? |
- ui::SHOW_STATE_NORMAL : ui::SHOW_STATE_MAXIMIZED); |
-} |
- |
-} // namespace |
- |
-ToplevelWindowEventFilter::ToplevelWindowEventFilter(aura::Window* owner) |
- : EventFilter(owner), |
- window_component_(HTNOWHERE) { |
-} |
- |
-ToplevelWindowEventFilter::~ToplevelWindowEventFilter() { |
-} |
- |
-bool ToplevelWindowEventFilter::PreHandleKeyEvent(aura::Window* target, |
- aura::KeyEvent* event) { |
- return false; |
-} |
- |
-bool ToplevelWindowEventFilter::PreHandleMouseEvent(aura::Window* target, |
- aura::MouseEvent* event) { |
- // Process EventFilters implementation first so that it processes |
- // activation/focus first. |
- switch (event->type()) { |
- case ui::ET_MOUSE_MOVED: |
- UpdateWindowComponentForEvent(target, event); |
- break; |
- case ui::ET_MOUSE_PRESSED: |
- // We also update the current window component here because for the |
- // mouse-drag-release-press case, where the mouse is released and |
- // pressed without mouse move event. |
- UpdateWindowComponentForEvent(target, event); |
- if (window_component_ == HTCAPTION && |
- event->flags() & ui::EF_IS_DOUBLE_CLICK) { |
- ToggleMaximizedState(target); |
- } |
- UpdateLocationFromEvent(target, event); |
- return GetBoundsChangeForWindowComponent(window_component_) != |
- kBoundsChange_None; |
- case ui::ET_MOUSE_DRAGGED: |
- return HandleDrag(target, event); |
- case ui::ET_MOUSE_RELEASED: |
- window_component_ = HTNOWHERE; |
- break; |
- default: |
- break; |
- } |
- return false; |
-} |
- |
-ui::TouchStatus ToplevelWindowEventFilter::PreHandleTouchEvent( |
- aura::Window* target, |
- aura::TouchEvent* event) { |
- // Process EventFilters implementation first so that it processes |
- // activation/focus first. |
- // TODO(sad): Allow resizing/maximizing etc. from touch? |
- UpdateWindowComponentForEvent(target, event); |
- int bounds_change = GetBoundsChangeForWindowComponent(window_component_); |
- if (bounds_change == kBoundsChange_None) |
- return ui::TOUCH_STATUS_UNKNOWN; |
- |
- // Handle touch move by simulate mouse drag with single touch. |
- switch (event->type()) { |
- case ui::ET_TOUCH_PRESSED: |
- UpdateLocationFromEvent(target, event); |
- pressed_touch_ids_.insert(event->touch_id()); |
- if (pressed_touch_ids_.size() == 1) |
- return ui::TOUCH_STATUS_START; |
- break; |
- case ui::ET_TOUCH_MOVED: |
- if (pressed_touch_ids_.size() == 1) { |
- if (HandleDrag(target, event)) |
- return ui::TOUCH_STATUS_CONTINUE; |
- } |
- break; |
- case ui::ET_TOUCH_RELEASED: |
- pressed_touch_ids_.erase(event->touch_id()); |
- if (pressed_touch_ids_.empty()) { |
- window_component_ = HTNOWHERE; |
- return ui::TOUCH_STATUS_END; |
- } |
- break; |
- default: |
- break; |
- } |
- return ui::TOUCH_STATUS_UNKNOWN; |
-} |
- |
-void ToplevelWindowEventFilter::MoveWindowToFront(aura::Window* target) { |
- aura::Window* parent = target->parent(); |
- aura::Window* child = target; |
- while (parent) { |
- parent->StackChildAtTop(child); |
- if (parent == owner()) |
- break; |
- parent = parent->parent(); |
- child = child->parent(); |
- } |
-} |
- |
-bool ToplevelWindowEventFilter::HandleDrag(aura::Window* target, |
- aura::LocatedEvent* event) { |
- // This function only be triggered to move window |
- // by mouse drag or touch move event. |
- DCHECK(event->type() == ui::ET_MOUSE_DRAGGED || |
- event->type() == ui::ET_TOUCH_MOVED); |
- |
- int bounds_change = GetBoundsChangeForWindowComponent(window_component_); |
- if (bounds_change == kBoundsChange_None) |
- return false; |
- |
- // Only a normal/default window can be moved/resized. |
- if (target->GetIntProperty(aura::client::kShowStateKey) != |
- ui::SHOW_STATE_NORMAL && |
- target->GetIntProperty(aura::client::kShowStateKey) != |
- ui::SHOW_STATE_DEFAULT) |
- return false; |
- |
- // Dragging a window moves the local coordinate frame, so do arithmetic |
- // in the parent coordinate frame. |
- gfx::Point event_location_in_parent(event->location()); |
- aura::Window::ConvertPointToWindow(target, target->parent(), |
- &event_location_in_parent); |
- int delta_x = event_location_in_parent.x() - mouse_down_offset_in_parent_.x(); |
- int delta_y = event_location_in_parent.y() - mouse_down_offset_in_parent_.y(); |
- |
- // The minimize size constraint may limit how much we change the window |
- // position. For example, dragging the left edge to the right should stop |
- // repositioning the window when the minimize size is reached. |
- gfx::Size size = GetSizeForDrag(bounds_change, target, &delta_x, &delta_y); |
- gfx::Point origin = GetOriginForDrag(bounds_change, delta_x, delta_y); |
- |
- target->SetBounds(gfx::Rect(origin, size)); |
- return true; |
-} |
- |
-void ToplevelWindowEventFilter::UpdateLocationFromEvent( |
- aura::Window* target, |
- aura::LocatedEvent* event) { |
- mouse_down_bounds_ = target->bounds(); |
- mouse_down_offset_in_parent_ = event->location(); |
- aura::Window::ConvertPointToWindow(target, target->parent(), |
- &mouse_down_offset_in_parent_); |
-} |
- |
-void ToplevelWindowEventFilter::UpdateWindowComponentForEvent( |
- aura::Window* target, |
- aura::LocatedEvent* event) { |
- window_component_ = |
- target->delegate()->GetNonClientComponent(event->location()); |
-} |
- |
-gfx::Point ToplevelWindowEventFilter::GetOriginForDrag( |
- int bounds_change, |
- int delta_x, |
- int delta_y) const { |
- gfx::Point origin = mouse_down_bounds_.origin(); |
- if (bounds_change & kBoundsChange_Repositions) { |
- int pos_change_direction = |
- GetPositionChangeDirectionForWindowComponent(window_component_); |
- if (pos_change_direction & kBoundsChangeDirection_Horizontal) |
- origin.Offset(delta_x, 0); |
- if (pos_change_direction & kBoundsChangeDirection_Vertical) |
- origin.Offset(0, delta_y); |
- } |
- return origin; |
-} |
- |
-gfx::Size ToplevelWindowEventFilter::GetSizeForDrag( |
- int bounds_change, |
- aura::Window* target, |
- int* delta_x, |
- int* delta_y) const { |
- gfx::Size size = mouse_down_bounds_.size(); |
- if (bounds_change & kBoundsChange_Resizes) { |
- gfx::Size min_size = target->delegate()->GetMinimumSize(); |
- int size_change_direction = |
- GetSizeChangeDirectionForWindowComponent(window_component_); |
- size.SetSize( |
- GetWidthForDrag(size_change_direction, min_size.width(), delta_x), |
- GetHeightForDrag(size_change_direction, min_size.height(), delta_y)); |
- } |
- return size; |
-} |
- |
-int ToplevelWindowEventFilter::GetWidthForDrag(int size_change_direction, |
- int min_width, |
- int* delta_x) const { |
- int width = mouse_down_bounds_.width(); |
- if (size_change_direction & kBoundsChangeDirection_Horizontal) { |
- // Along the right edge, positive delta_x increases the window size. |
- int x_multiplier = IsRightEdge(window_component_) ? 1 : -1; |
- width += x_multiplier * (*delta_x); |
- |
- // Ensure we don't shrink past the minimum width and clamp delta_x |
- // for the window origin computation. |
- if (width < min_width) { |
- width = min_width; |
- *delta_x = -x_multiplier * (mouse_down_bounds_.width() - min_width); |
- } |
- } |
- return width; |
-} |
- |
-int ToplevelWindowEventFilter::GetHeightForDrag(int size_change_direction, |
- int min_height, |
- int* delta_y) const { |
- int height = mouse_down_bounds_.height(); |
- if (size_change_direction & kBoundsChangeDirection_Vertical) { |
- // Along the bottom edge, positive delta_y increases the window size. |
- int y_multiplier = IsBottomEdge(window_component_) ? 1 : -1; |
- height += y_multiplier * (*delta_y); |
- |
- // Ensure we don't shrink past the minimum height and clamp delta_y |
- // for the window origin computation. |
- if (height < min_height) { |
- height = min_height; |
- *delta_y = -y_multiplier * (mouse_down_bounds_.height() - min_height); |
- } |
- } |
- return height; |
-} |
- |
-} // namespace aura |