1// Copyright 2014 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 "ash/wm/drag_details.h"
6
7#include "ash/wm/window_resizer.h"
8#include "ui/aura/window.h"
9#include "ui/base/hit_test.h"
10
11namespace ash {
12
13namespace {
14
15int GetSizeChangeDirectionForWindowComponent(int window_component) {
16  int size_change_direction = WindowResizer::kBoundsChangeDirection_None;
17  switch (window_component) {
18    case HTTOPLEFT:
19    case HTTOPRIGHT:
20    case HTBOTTOMLEFT:
21    case HTBOTTOMRIGHT:
22    case HTGROWBOX:
23    case HTCAPTION:
24      size_change_direction |=
25          WindowResizer::kBoundsChangeDirection_Horizontal |
26          WindowResizer::kBoundsChangeDirection_Vertical;
27      break;
28    case HTTOP:
29    case HTBOTTOM:
30      size_change_direction |= WindowResizer::kBoundsChangeDirection_Vertical;
31      break;
32    case HTRIGHT:
33    case HTLEFT:
34      size_change_direction |= WindowResizer::kBoundsChangeDirection_Horizontal;
35      break;
36    default:
37      break;
38  }
39  return size_change_direction;
40}
41
42}  // namespace
43
44DragDetails::DragDetails(aura::Window* window,
45                         const gfx::Point& location,
46                         int window_component,
47                         aura::client::WindowMoveSource source)
48    : initial_state_type(wm::GetWindowState(window)->GetStateType()),
49      initial_bounds_in_parent(window->bounds()),
50      initial_location_in_parent(location),
51      initial_opacity(window->layer()->opacity()),
52      window_component(window_component),
53      bounds_change(
54          WindowResizer::GetBoundsChangeForWindowComponent(window_component)),
55      position_change_direction(
56          WindowResizer::GetPositionChangeDirectionForWindowComponent(
57              window_component)),
58      size_change_direction(
59          GetSizeChangeDirectionForWindowComponent(window_component)),
60      is_resizable(bounds_change != WindowResizer::kBoundsChangeDirection_None),
61      source(source),
62      should_attach_to_shelf(window->type() == ui::wm::WINDOW_TYPE_PANEL &&
63                             wm::GetWindowState(window)->panel_attached()) {
64  wm::WindowState* window_state = wm::GetWindowState(window);
65  if (window_state->IsNormalOrSnapped() &&
66      window_state->HasRestoreBounds() &&
67      window_component == HTCAPTION) {
68    restore_bounds = window_state->GetRestoreBoundsInScreen();
69  }
70}
71
72DragDetails::~DragDetails() {
73}
74
75}  // namespace ash
76