Index: ui/touch_selection/touch_selection_controller.cc |
diff --git a/ui/touch_selection/touch_selection_controller.cc b/ui/touch_selection/touch_selection_controller.cc |
index 2e18037c658c9b0f7fc02d66e5a8471e8589d0a2..4c02867187a5ca59ad2c53f252b63db60504c67b 100644 |
--- a/ui/touch_selection/touch_selection_controller.cc |
+++ b/ui/touch_selection/touch_selection_controller.cc |
@@ -11,9 +11,12 @@ |
namespace ui { |
namespace { |
-gfx::Vector2dF ComputeLineOffsetFromBottom(const SelectionBound& bound) { |
- gfx::Vector2dF line_offset = |
- gfx::ScaleVector2d(bound.edge_top() - bound.edge_bottom(), 0.5f); |
+gfx::Vector2dF ComputeLineOffsetFromBottom(const SelectionBound& bound, |
+ bool compute_from_top) { |
+ gfx::Vector2dF vertical_offset = |
+ compute_from_top ? (bound.edge_bottom() - bound.edge_top()) |
+ : (bound.edge_top() - bound.edge_bottom()); |
+ gfx::Vector2dF line_offset = gfx::ScaleVector2d(vertical_offset, 0.5f); |
// An offset of 5 DIPs is sufficient for most line sizes. For small lines, |
// using half the line height avoids synthesizing a point on a line above |
// (or below) the intended line. |
@@ -59,6 +62,7 @@ TouchSelectionController::TouchSelectionController( |
selection_empty_(false), |
selection_editable_(false), |
temporarily_hidden_(false), |
+ viewport_size_changed_(false), |
selection_handle_dragged_(false) { |
DCHECK(client_); |
} |
@@ -66,16 +70,25 @@ TouchSelectionController::TouchSelectionController( |
TouchSelectionController::~TouchSelectionController() { |
} |
+void TouchSelectionController::OnViewportChanged( |
+ const gfx::RectF viewport_rect) { |
+ if (viewport_rect_ == viewport_rect) |
+ return; |
+ viewport_size_changed_ = true; |
+ viewport_rect_ = viewport_rect; |
+} |
+ |
void TouchSelectionController::OnSelectionBoundsChanged( |
const SelectionBound& start, |
const SelectionBound& end) { |
- if (start == start_ && end_ == end) |
+ if (start == start_ && end_ == end && !viewport_size_changed_) |
return; |
start_ = start; |
end_ = end; |
start_orientation_ = ToTouchHandleOrientation(start_.type()); |
end_orientation_ = ToTouchHandleOrientation(end_.type()); |
+ viewport_size_changed_ = false; |
if (!activate_selection_automatically_ && |
!activate_insertion_automatically_) { |
@@ -381,14 +394,16 @@ void TouchSelectionController::ActivateSelection() { |
start_selection_handle_.reset(new TouchHandle(this, start_orientation_)); |
} else { |
start_selection_handle_->SetEnabled(true); |
- start_selection_handle_->SetOrientation(start_orientation_); |
+ start_selection_handle_->SetOrientation(start_orientation_, viewport_rect_, |
+ start_.edge_bottom()); |
} |
if (!end_selection_handle_) { |
end_selection_handle_.reset(new TouchHandle(this, end_orientation_)); |
} else { |
end_selection_handle_->SetEnabled(true); |
- end_selection_handle_->SetOrientation(end_orientation_); |
+ end_selection_handle_->SetOrientation(end_orientation_, viewport_rect_, |
+ end_.edge_bottom()); |
} |
// As a long press received while a selection is already active may trigger |
@@ -429,19 +444,27 @@ void TouchSelectionController::ResetCachedValuesIfInactive() { |
} |
const gfx::PointF& TouchSelectionController::GetStartPosition() const { |
+ if (start_selection_handle_ && start_selection_handle_->is_inverted()) |
+ return start_.edge_top(); |
return start_.edge_bottom(); |
} |
const gfx::PointF& TouchSelectionController::GetEndPosition() const { |
+ if (end_selection_handle_ && end_selection_handle_->is_inverted()) |
+ return end_.edge_top(); |
return end_.edge_bottom(); |
} |
gfx::Vector2dF TouchSelectionController::GetStartLineOffset() const { |
- return ComputeLineOffsetFromBottom(start_); |
+ DCHECK(start_selection_handle_); |
+ bool compute_from_top = start_selection_handle_->is_inverted(); |
+ return ComputeLineOffsetFromBottom(start_, compute_from_top); |
} |
gfx::Vector2dF TouchSelectionController::GetEndLineOffset() const { |
- return ComputeLineOffsetFromBottom(end_); |
+ DCHECK(end_selection_handle_); |
+ bool compute_from_top = end_selection_handle_->is_inverted(); |
+ return ComputeLineOffsetFromBottom(end_, compute_from_top); |
} |
bool TouchSelectionController::GetStartVisible() const { |