Index: views/controls/textfield/native_textfield_views.cc |
=================================================================== |
--- views/controls/textfield/native_textfield_views.cc (revision 95245) |
+++ views/controls/textfield/native_textfield_views.cc (working copy) |
@@ -200,7 +200,7 @@ |
skip_input_method_cancel_composition_ = true; |
// TODO(msw): Remove final reference to FindCursorPosition. |
- size_t drop_destination = |
+ gfx::SelectionModel drop_destination = |
GetRenderText()->FindCursorPosition(event.location()); |
string16 text; |
event.data().GetString(&text); |
@@ -212,13 +212,16 @@ |
ui::Range selected_range; |
model_->GetSelectedRange(&selected_range); |
// Adjust the drop destination if it is on or after the current selection. |
- if (selected_range.GetMax() <= drop_destination) |
- drop_destination -= selected_range.length(); |
- else if (selected_range.GetMin() <= drop_destination) |
- drop_destination = selected_range.GetMin(); |
- model_->DeleteSelectionAndInsertTextAt(text, drop_destination); |
+ if (selected_range.GetMax() <= drop_destination.selection_end()) |
+ drop_destination.set_selection_end( |
+ drop_destination.selection_end() - selected_range.length()); |
+ else if (selected_range.GetMin() <= drop_destination.selection_end()) |
+ drop_destination.set_selection_end(selected_range.GetMin()); |
+ model_->DeleteSelectionAndInsertTextAt(text, |
+ drop_destination.selection_end()); |
} else { |
- model_->MoveCursorTo(drop_destination, false); |
+ drop_destination.set_selection_start(drop_destination.selection_end()); |
+ model_->MoveCursorTo(drop_destination); |
// Drop always inserts text even if the textfield is not in insert mode. |
model_->InsertText(text); |
} |
@@ -251,9 +254,23 @@ |
void NativeTextfieldViews::SelectRect(const gfx::Point& start, |
const gfx::Point& end) { |
- size_t start_pos = GetRenderText()->FindCursorPosition(start); |
- size_t end_pos = GetRenderText()->FindCursorPosition(end); |
- SetSelectionRange(ui::Range(start_pos, end_pos)); |
+ if (GetTextInputType() != ui::TEXT_INPUT_TYPE_NONE) |
+ return; |
+ |
+ gfx::SelectionModel start_pos = GetRenderText()->FindCursorPosition(start); |
+ gfx::SelectionModel end_pos = GetRenderText()->FindCursorPosition(end); |
+ |
+ OnBeforeUserAction(); |
+ // Merge selection models of "start_pos" and "end_pos" so that |
+ // selection start is the value from "start_pos", while selection end, |
+ // caret position, and caret placement are values from "end_pos". |
+ gfx::SelectionModel sel(end_pos); |
+ sel.set_selection_start(start_pos.selection_start()); |
+ model_->SelectSelectionModel(sel); |
+ |
+ OnCaretBoundsChanged(); |
+ SchedulePaint(); |
+ OnAfterUserAction(); |
} |
gfx::NativeCursor NativeTextfieldViews::GetCursor(const MouseEvent& event) { |
@@ -672,9 +689,7 @@ |
} |
gfx::Rect NativeTextfieldViews::GetCaretBounds() { |
- gfx::RenderText* render_text = GetRenderText(); |
- return render_text->GetCursorBounds(render_text->GetCursorPosition(), |
- render_text->insert_mode()); |
+ return GetRenderText()->CursorBounds(); |
} |
bool NativeTextfieldViews::HasCompositionText() { |
@@ -966,9 +981,11 @@ |
if (!touch_selection_controller_.get()) |
return; |
gfx::RenderText* render_text = GetRenderText(); |
- ui::Range range = render_text->GetSelection(); |
- gfx::Rect start_cursor = render_text->GetCursorBounds(range.start(), false); |
- gfx::Rect end_cursor = render_text->GetCursorBounds(range.end(), false); |
+ const gfx::SelectionModel& sel = render_text->selection_model(); |
+ gfx::SelectionModel start_sel(sel.selection_start(), sel.selection_start(), |
+ sel.selection_start(), gfx::SelectionModel::LEADING); |
+ gfx::Rect start_cursor = render_text->GetCursorBounds(start_sel, false); |
+ gfx::Rect end_cursor = render_text->GetCursorBounds(sel, false); |
gfx::Rect display_rect = render_text->display_rect(); |
int total_offset_x = display_rect.x() + render_text->display_offset().x(); |
int total_offset_y = display_rect.y() + render_text->display_offset().y() + |