OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 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 "ui/views/controls/textfield/native_textfield_views.h" | 5 #include "ui/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 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
190 return ui::DragDropTypes::DRAG_COPY | ui::DragDropTypes::DRAG_MOVE; | 190 return ui::DragDropTypes::DRAG_COPY | ui::DragDropTypes::DRAG_MOVE; |
191 } | 191 } |
192 | 192 |
193 int NativeTextfieldViews::OnPerformDrop(const DropTargetEvent& event) { | 193 int NativeTextfieldViews::OnPerformDrop(const DropTargetEvent& event) { |
194 DCHECK(CanDrop(event.data())); | 194 DCHECK(CanDrop(event.data())); |
195 DCHECK(!initiating_drag_ || | 195 DCHECK(!initiating_drag_ || |
196 !GetRenderText()->IsPointInSelection(event.location())); | 196 !GetRenderText()->IsPointInSelection(event.location())); |
197 OnBeforeUserAction(); | 197 OnBeforeUserAction(); |
198 skip_input_method_cancel_composition_ = true; | 198 skip_input_method_cancel_composition_ = true; |
199 | 199 |
200 // TODO(msw): Remove final reference to FindCursorPosition. | 200 gfx::SelectionModel drop_destination_model = |
201 gfx::SelectionModel drop_destination = | |
202 GetRenderText()->FindCursorPosition(event.location()); | 201 GetRenderText()->FindCursorPosition(event.location()); |
203 string16 text; | 202 string16 text; |
204 event.data().GetString(&text); | 203 event.data().GetString(&text); |
205 | 204 |
206 // We'll delete the current selection for a drag and drop within this view. | 205 // We'll delete the current selection for a drag and drop within this view. |
207 bool move = initiating_drag_ && !event.IsControlDown() && | 206 bool move = initiating_drag_ && !event.IsControlDown() && |
208 event.source_operations() & ui::DragDropTypes::DRAG_MOVE; | 207 event.source_operations() & ui::DragDropTypes::DRAG_MOVE; |
209 if (move) { | 208 if (move) { |
210 gfx::SelectionModel selected; | 209 gfx::SelectionModel selected; |
211 model_->GetSelectionModel(&selected); | 210 model_->GetSelectionModel(&selected); |
212 // Adjust the drop destination if it is on or after the current selection. | 211 // Adjust the drop destination if it is on or after the current selection. |
213 size_t max_of_selected_range = std::max(selected.selection_start(), | 212 size_t drop_destination = drop_destination_model.caret_pos(); |
214 selected.selection_end()); | 213 drop_destination -= |
215 size_t min_of_selected_range = std::min(selected.selection_start(), | 214 selected.selection().Intersect(ui::Range(0, drop_destination)).length(); |
216 selected.selection_end()); | 215 model_->DeleteSelectionAndInsertTextAt(text, drop_destination); |
217 size_t selected_range_length = max_of_selected_range - | |
218 min_of_selected_range; | |
219 size_t drop_destination_end = drop_destination.selection_end(); | |
220 if (max_of_selected_range <= drop_destination_end) | |
221 drop_destination_end -= selected_range_length; | |
222 else if (min_of_selected_range <= drop_destination_end) | |
223 drop_destination_end = min_of_selected_range; | |
224 model_->DeleteSelectionAndInsertTextAt(text, drop_destination_end); | |
225 } else { | 216 } else { |
226 model_->MoveCursorTo(drop_destination); | 217 model_->MoveCursorTo(drop_destination_model); |
227 // Drop always inserts text even if the textfield is not in insert mode. | 218 // Drop always inserts text even if the textfield is not in insert mode. |
228 model_->InsertText(text); | 219 model_->InsertText(text); |
229 } | 220 } |
230 skip_input_method_cancel_composition_ = false; | 221 skip_input_method_cancel_composition_ = false; |
231 UpdateAfterChange(true, true); | 222 UpdateAfterChange(true, true); |
232 OnAfterUserAction(); | 223 OnAfterUserAction(); |
233 return move ? ui::DragDropTypes::DRAG_MOVE : ui::DragDropTypes::DRAG_COPY; | 224 return move ? ui::DragDropTypes::DRAG_MOVE : ui::DragDropTypes::DRAG_COPY; |
234 } | 225 } |
235 | 226 |
236 void NativeTextfieldViews::OnDragDone() { | 227 void NativeTextfieldViews::OnDragDone() { |
(...skipping 15 matching lines...) Expand all Loading... |
252 | 243 |
253 void NativeTextfieldViews::OnBlur() { | 244 void NativeTextfieldViews::OnBlur() { |
254 NOTREACHED(); | 245 NOTREACHED(); |
255 } | 246 } |
256 | 247 |
257 void NativeTextfieldViews::SelectRect(const gfx::Point& start, | 248 void NativeTextfieldViews::SelectRect(const gfx::Point& start, |
258 const gfx::Point& end) { | 249 const gfx::Point& end) { |
259 if (GetTextInputType() == ui::TEXT_INPUT_TYPE_NONE) | 250 if (GetTextInputType() == ui::TEXT_INPUT_TYPE_NONE) |
260 return; | 251 return; |
261 | 252 |
262 gfx::SelectionModel start_pos = GetRenderText()->FindCursorPosition(start); | 253 gfx::SelectionModel start_caret = GetRenderText()->FindCursorPosition(start); |
263 gfx::SelectionModel end_pos = GetRenderText()->FindCursorPosition(end); | 254 gfx::SelectionModel end_caret = GetRenderText()->FindCursorPosition(end); |
| 255 gfx::SelectionModel selection( |
| 256 ui::Range(start_caret.caret_pos(), end_caret.caret_pos()), |
| 257 end_caret.caret_affinity()); |
264 | 258 |
265 OnBeforeUserAction(); | 259 OnBeforeUserAction(); |
266 // Merge selection models of "start_pos" and "end_pos" so that | 260 model_->SelectSelectionModel(selection); |
267 // selection start is the value from "start_pos", while selection end, | |
268 // caret position, and caret placement are values from "end_pos". | |
269 if (start_pos.selection_start() == end_pos.selection_end()) | |
270 model_->SelectSelectionModel(end_pos); | |
271 else | |
272 model_->SelectRange(ui::Range(start_pos.selection_start(), | |
273 end_pos.selection_end())); | |
274 | |
275 OnCaretBoundsChanged(); | 261 OnCaretBoundsChanged(); |
276 SchedulePaint(); | 262 SchedulePaint(); |
277 OnAfterUserAction(); | 263 OnAfterUserAction(); |
278 } | 264 } |
279 | 265 |
280 gfx::NativeCursor NativeTextfieldViews::GetCursor(const MouseEvent& event) { | 266 gfx::NativeCursor NativeTextfieldViews::GetCursor(const MouseEvent& event) { |
281 bool in_selection = GetRenderText()->IsPointInSelection(event.location()); | 267 bool in_selection = GetRenderText()->IsPointInSelection(event.location()); |
282 bool drag_event = event.type() == ui::ET_MOUSE_DRAGGED; | 268 bool drag_event = event.type() == ui::ET_MOUSE_DRAGGED; |
283 bool text_cursor = !initiating_drag_ && (drag_event || !in_selection); | 269 bool text_cursor = !initiating_drag_ && (drag_event || !in_selection); |
284 #if defined(USE_AURA) | 270 #if defined(USE_AURA) |
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
471 gfx::NativeView NativeTextfieldViews::GetTestingHandle() const { | 457 gfx::NativeView NativeTextfieldViews::GetTestingHandle() const { |
472 NOTREACHED(); | 458 NOTREACHED(); |
473 return NULL; | 459 return NULL; |
474 } | 460 } |
475 | 461 |
476 bool NativeTextfieldViews::IsIMEComposing() const { | 462 bool NativeTextfieldViews::IsIMEComposing() const { |
477 return model_->HasCompositionText(); | 463 return model_->HasCompositionText(); |
478 } | 464 } |
479 | 465 |
480 void NativeTextfieldViews::GetSelectedRange(ui::Range* range) const { | 466 void NativeTextfieldViews::GetSelectedRange(ui::Range* range) const { |
481 model_->GetSelectedRange(range); | 467 *range = GetRenderText()->selection(); |
482 } | 468 } |
483 | 469 |
484 void NativeTextfieldViews::SelectRange(const ui::Range& range) { | 470 void NativeTextfieldViews::SelectRange(const ui::Range& range) { |
485 model_->SelectRange(range); | 471 model_->SelectRange(range); |
486 OnCaretBoundsChanged(); | 472 OnCaretBoundsChanged(); |
487 SchedulePaint(); | 473 SchedulePaint(); |
488 textfield_->GetWidget()->NotifyAccessibilityEvent( | 474 textfield_->GetWidget()->NotifyAccessibilityEvent( |
489 textfield_, ui::AccessibilityTypes::EVENT_SELECTION_CHANGED, true); | 475 textfield_, ui::AccessibilityTypes::EVENT_SELECTION_CHANGED, true); |
490 } | 476 } |
491 | 477 |
(...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
741 if (!ImeEditingAllowed()) | 727 if (!ImeEditingAllowed()) |
742 return false; | 728 return false; |
743 | 729 |
744 model_->GetCompositionTextRange(range); | 730 model_->GetCompositionTextRange(range); |
745 return true; | 731 return true; |
746 } | 732 } |
747 | 733 |
748 bool NativeTextfieldViews::GetSelectionRange(ui::Range* range) { | 734 bool NativeTextfieldViews::GetSelectionRange(ui::Range* range) { |
749 if (!ImeEditingAllowed()) | 735 if (!ImeEditingAllowed()) |
750 return false; | 736 return false; |
751 | 737 GetSelectedRange(range); |
752 gfx::SelectionModel sel; | |
753 model_->GetSelectionModel(&sel); | |
754 range->set_start(sel.selection_start()); | |
755 range->set_end(sel.selection_end()); | |
756 return true; | 738 return true; |
757 } | 739 } |
758 | 740 |
759 bool NativeTextfieldViews::SetSelectionRange(const ui::Range& range) { | 741 bool NativeTextfieldViews::SetSelectionRange(const ui::Range& range) { |
760 if (!ImeEditingAllowed() || !range.IsValid()) | 742 if (!ImeEditingAllowed() || !range.IsValid()) |
761 return false; | 743 return false; |
762 | 744 |
763 OnBeforeUserAction(); | 745 OnBeforeUserAction(); |
764 SelectRange(range); | 746 SelectRange(range); |
765 OnAfterUserAction(); | 747 OnAfterUserAction(); |
(...skipping 371 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1137 | 1119 |
1138 #if defined(USE_AURA) | 1120 #if defined(USE_AURA) |
1139 // static | 1121 // static |
1140 NativeTextfieldWrapper* NativeTextfieldWrapper::CreateWrapper( | 1122 NativeTextfieldWrapper* NativeTextfieldWrapper::CreateWrapper( |
1141 Textfield* field) { | 1123 Textfield* field) { |
1142 return new NativeTextfieldViews(field); | 1124 return new NativeTextfieldViews(field); |
1143 } | 1125 } |
1144 #endif | 1126 #endif |
1145 | 1127 |
1146 } // namespace views | 1128 } // namespace views |
OLD | NEW |