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