| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "views/controls/textfield/native_textfield_views.h" | 5 #include "views/controls/textfield/native_textfield_views.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
| (...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 219 if (move) { | 219 if (move) { |
| 220 gfx::SelectionModel selected; | 220 gfx::SelectionModel selected; |
| 221 model_->GetSelectionModel(&selected); | 221 model_->GetSelectionModel(&selected); |
| 222 // Adjust the drop destination if it is on or after the current selection. | 222 // Adjust the drop destination if it is on or after the current selection. |
| 223 size_t max_of_selected_range = std::max(selected.selection_start(), | 223 size_t max_of_selected_range = std::max(selected.selection_start(), |
| 224 selected.selection_end()); | 224 selected.selection_end()); |
| 225 size_t min_of_selected_range = std::min(selected.selection_start(), | 225 size_t min_of_selected_range = std::min(selected.selection_start(), |
| 226 selected.selection_end()); | 226 selected.selection_end()); |
| 227 size_t selected_range_length = max_of_selected_range - | 227 size_t selected_range_length = max_of_selected_range - |
| 228 min_of_selected_range; | 228 min_of_selected_range; |
| 229 if (max_of_selected_range <= drop_destination.selection_end()) | 229 size_t drop_destination_end = drop_destination.selection_end(); |
| 230 drop_destination.set_selection_end( | 230 if (max_of_selected_range <= drop_destination_end) |
| 231 drop_destination.selection_end() - selected_range_length); | 231 drop_destination_end -= selected_range_length; |
| 232 else if (min_of_selected_range <= drop_destination.selection_end()) | 232 else if (min_of_selected_range <= drop_destination_end) |
| 233 drop_destination.set_selection_end(min_of_selected_range); | 233 drop_destination_end = min_of_selected_range; |
| 234 model_->DeleteSelectionAndInsertTextAt(text, | 234 model_->DeleteSelectionAndInsertTextAt(text, drop_destination_end); |
| 235 drop_destination.selection_end()); | |
| 236 } else { | 235 } else { |
| 237 drop_destination.set_selection_start(drop_destination.selection_end()); | |
| 238 model_->MoveCursorTo(drop_destination); | 236 model_->MoveCursorTo(drop_destination); |
| 239 // Drop always inserts text even if the textfield is not in insert mode. | 237 // Drop always inserts text even if the textfield is not in insert mode. |
| 240 model_->InsertText(text); | 238 model_->InsertText(text); |
| 241 } | 239 } |
| 242 skip_input_method_cancel_composition_ = false; | 240 skip_input_method_cancel_composition_ = false; |
| 243 UpdateAfterChange(true, true); | 241 UpdateAfterChange(true, true); |
| 244 OnAfterUserAction(); | 242 OnAfterUserAction(); |
| 245 return move ? ui::DragDropTypes::DRAG_MOVE : ui::DragDropTypes::DRAG_COPY; | 243 return move ? ui::DragDropTypes::DRAG_MOVE : ui::DragDropTypes::DRAG_COPY; |
| 246 } | 244 } |
| 247 | 245 |
| (...skipping 23 matching lines...) Expand all Loading... |
| 271 if (GetTextInputType() == ui::TEXT_INPUT_TYPE_NONE) | 269 if (GetTextInputType() == ui::TEXT_INPUT_TYPE_NONE) |
| 272 return; | 270 return; |
| 273 | 271 |
| 274 gfx::SelectionModel start_pos = GetRenderText()->FindCursorPosition(start); | 272 gfx::SelectionModel start_pos = GetRenderText()->FindCursorPosition(start); |
| 275 gfx::SelectionModel end_pos = GetRenderText()->FindCursorPosition(end); | 273 gfx::SelectionModel end_pos = GetRenderText()->FindCursorPosition(end); |
| 276 | 274 |
| 277 OnBeforeUserAction(); | 275 OnBeforeUserAction(); |
| 278 // Merge selection models of "start_pos" and "end_pos" so that | 276 // Merge selection models of "start_pos" and "end_pos" so that |
| 279 // selection start is the value from "start_pos", while selection end, | 277 // selection start is the value from "start_pos", while selection end, |
| 280 // caret position, and caret placement are values from "end_pos". | 278 // caret position, and caret placement are values from "end_pos". |
| 281 gfx::SelectionModel sel(end_pos); | 279 if (start_pos.selection_start() == end_pos.selection_end()) |
| 282 sel.set_selection_start(start_pos.selection_start()); | 280 model_->SelectSelectionModel(end_pos); |
| 283 model_->SelectSelectionModel(sel); | 281 else |
| 282 model_->SelectRange(ui::Range(start_pos.selection_start(), |
| 283 end_pos.selection_end())); |
| 284 | 284 |
| 285 OnCaretBoundsChanged(); | 285 OnCaretBoundsChanged(); |
| 286 SchedulePaint(); | 286 SchedulePaint(); |
| 287 OnAfterUserAction(); | 287 OnAfterUserAction(); |
| 288 } | 288 } |
| 289 | 289 |
| 290 gfx::NativeCursor NativeTextfieldViews::GetCursor(const MouseEvent& event) { | 290 gfx::NativeCursor NativeTextfieldViews::GetCursor(const MouseEvent& event) { |
| 291 bool in_selection = GetRenderText()->IsPointInSelection(event.location()); | 291 bool in_selection = GetRenderText()->IsPointInSelection(event.location()); |
| 292 bool drag_event = event.type() == ui::ET_MOUSE_DRAGGED; | 292 bool drag_event = event.type() == ui::ET_MOUSE_DRAGGED; |
| 293 bool text_cursor = !initiating_drag_ && (drag_event || !in_selection); | 293 bool text_cursor = !initiating_drag_ && (drag_event || !in_selection); |
| (...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 483 | 483 |
| 484 gfx::NativeView NativeTextfieldViews::GetTestingHandle() const { | 484 gfx::NativeView NativeTextfieldViews::GetTestingHandle() const { |
| 485 NOTREACHED(); | 485 NOTREACHED(); |
| 486 return NULL; | 486 return NULL; |
| 487 } | 487 } |
| 488 | 488 |
| 489 bool NativeTextfieldViews::IsIMEComposing() const { | 489 bool NativeTextfieldViews::IsIMEComposing() const { |
| 490 return model_->HasCompositionText(); | 490 return model_->HasCompositionText(); |
| 491 } | 491 } |
| 492 | 492 |
| 493 void NativeTextfieldViews::GetSelectedRange(ui::Range* range) const { |
| 494 model_->GetSelectedRange(range); |
| 495 } |
| 496 |
| 497 void NativeTextfieldViews::SelectRange(const ui::Range& range) { |
| 498 model_->SelectRange(range); |
| 499 OnCaretBoundsChanged(); |
| 500 SchedulePaint(); |
| 501 } |
| 502 |
| 493 void NativeTextfieldViews::GetSelectionModel(gfx::SelectionModel* sel) const { | 503 void NativeTextfieldViews::GetSelectionModel(gfx::SelectionModel* sel) const { |
| 494 model_->GetSelectionModel(sel); | 504 model_->GetSelectionModel(sel); |
| 495 } | 505 } |
| 496 | 506 |
| 497 void NativeTextfieldViews::SelectSelectionModel( | 507 void NativeTextfieldViews::SelectSelectionModel( |
| 498 const gfx::SelectionModel& sel) { | 508 const gfx::SelectionModel& sel) { |
| 499 model_->SelectSelectionModel(sel); | 509 model_->SelectSelectionModel(sel); |
| 500 OnCaretBoundsChanged(); | 510 OnCaretBoundsChanged(); |
| 501 SchedulePaint(); | 511 SchedulePaint(); |
| 502 } | 512 } |
| (...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 751 range->set_start(sel.selection_start()); | 761 range->set_start(sel.selection_start()); |
| 752 range->set_end(sel.selection_end()); | 762 range->set_end(sel.selection_end()); |
| 753 return true; | 763 return true; |
| 754 } | 764 } |
| 755 | 765 |
| 756 bool NativeTextfieldViews::SetSelectionRange(const ui::Range& range) { | 766 bool NativeTextfieldViews::SetSelectionRange(const ui::Range& range) { |
| 757 if (GetTextInputType() != ui::TEXT_INPUT_TYPE_TEXT || !range.IsValid()) | 767 if (GetTextInputType() != ui::TEXT_INPUT_TYPE_TEXT || !range.IsValid()) |
| 758 return false; | 768 return false; |
| 759 | 769 |
| 760 OnBeforeUserAction(); | 770 OnBeforeUserAction(); |
| 761 SelectSelectionModel(gfx::SelectionModel(range.start(), range.end())); | 771 SelectRange(range); |
| 762 OnAfterUserAction(); | 772 OnAfterUserAction(); |
| 763 return true; | 773 return true; |
| 764 } | 774 } |
| 765 | 775 |
| 766 bool NativeTextfieldViews::DeleteRange(const ui::Range& range) { | 776 bool NativeTextfieldViews::DeleteRange(const ui::Range& range) { |
| 767 if (GetTextInputType() != ui::TEXT_INPUT_TYPE_TEXT || range.is_empty()) | 777 if (GetTextInputType() != ui::TEXT_INPUT_TYPE_TEXT || range.is_empty()) |
| 768 return false; | 778 return false; |
| 769 | 779 |
| 770 OnBeforeUserAction(); | 780 OnBeforeUserAction(); |
| 771 gfx::SelectionModel selection(range.start(), range.end()); | 781 model_->SelectRange(range); |
| 772 model_->SelectSelectionModel(selection); | |
| 773 if (model_->HasSelection()) { | 782 if (model_->HasSelection()) { |
| 774 model_->DeleteSelection(); | 783 model_->DeleteSelection(); |
| 775 UpdateAfterChange(true, true); | 784 UpdateAfterChange(true, true); |
| 776 } | 785 } |
| 777 OnAfterUserAction(); | 786 OnAfterUserAction(); |
| 778 return true; | 787 return true; |
| 779 } | 788 } |
| 780 | 789 |
| 781 bool NativeTextfieldViews::GetTextFromRange( | 790 bool NativeTextfieldViews::GetTextFromRange( |
| 782 const ui::Range& range, | 791 const ui::Range& range, |
| (...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1063 | 1072 |
| 1064 #if defined(USE_AURA) | 1073 #if defined(USE_AURA) |
| 1065 // static | 1074 // static |
| 1066 NativeTextfieldWrapper* NativeTextfieldWrapper::CreateWrapper( | 1075 NativeTextfieldWrapper* NativeTextfieldWrapper::CreateWrapper( |
| 1067 Textfield* field) { | 1076 Textfield* field) { |
| 1068 return new NativeTextfieldViews(field); | 1077 return new NativeTextfieldViews(field); |
| 1069 } | 1078 } |
| 1070 #endif | 1079 #endif |
| 1071 | 1080 |
| 1072 } // namespace views | 1081 } // namespace views |
| OLD | NEW |