resize_area.cc revision a1401311d1ab56c4ed0a474bd38c108f75cb0cd9
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#include "ui/views/controls/resize_area.h"
6
7#include "base/logging.h"
8#include "ui/accessibility/ax_view_state.h"
9#include "ui/base/cursor/cursor.h"
10#include "ui/base/resource/resource_bundle.h"
11#include "ui/views/controls/resize_area_delegate.h"
12
13namespace views {
14
15const char ResizeArea::kViewClassName[] = "ResizeArea";
16
17////////////////////////////////////////////////////////////////////////////////
18// ResizeArea
19
20ResizeArea::ResizeArea(ResizeAreaDelegate* delegate)
21    : delegate_(delegate),
22      initial_position_(0) {
23}
24
25ResizeArea::~ResizeArea() {
26}
27
28const char* ResizeArea::GetClassName() const {
29  return kViewClassName;
30}
31
32gfx::NativeCursor ResizeArea::GetCursor(const ui::MouseEvent& event) {
33  return enabled() ? ui::kCursorEastWestResize : gfx::kNullCursor;
34}
35
36bool ResizeArea::OnMousePressed(const ui::MouseEvent& event) {
37  if (!event.IsOnlyLeftMouseButton())
38    return false;
39
40  // The resize area obviously will move once you start dragging so we need to
41  // convert coordinates to screen coordinates so that we don't lose our
42  // bearings.
43  gfx::Point point(event.x(), 0);
44  View::ConvertPointToScreen(this, &point);
45  initial_position_ = point.x();
46
47  return true;
48}
49
50bool ResizeArea::OnMouseDragged(const ui::MouseEvent& event) {
51  if (!event.IsLeftMouseButton())
52    return false;
53
54  ReportResizeAmount(event.x(), false);
55  return true;
56}
57
58void ResizeArea::OnMouseReleased(const ui::MouseEvent& event) {
59  ReportResizeAmount(event.x(), true);
60}
61
62void ResizeArea::OnMouseCaptureLost() {
63  ReportResizeAmount(initial_position_, true);
64}
65
66void ResizeArea::GetAccessibleState(ui::AXViewState* state) {
67  state->role = ui::AX_ROLE_SPLITTER;
68}
69
70void ResizeArea::ReportResizeAmount(int resize_amount, bool last_update) {
71  gfx::Point point(resize_amount, 0);
72  View::ConvertPointToScreen(this, &point);
73  resize_amount = point.x() - initial_position_;
74  delegate_->OnResize(base::i18n::IsRTL() ? -resize_amount : resize_amount,
75                      last_update);
76}
77
78}  // namespace views
79