Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 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 #include <set> | 8 #include <set> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| (...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 256 bool NativeTextfieldViews::CanDrop(const OSExchangeData& data) { | 256 bool NativeTextfieldViews::CanDrop(const OSExchangeData& data) { |
| 257 int formats; | 257 int formats; |
| 258 std::set<OSExchangeData::CustomFormat> custom_formats; | 258 std::set<OSExchangeData::CustomFormat> custom_formats; |
| 259 GetDropFormats(&formats, &custom_formats); | 259 GetDropFormats(&formats, &custom_formats); |
| 260 return textfield_->enabled() && !textfield_->read_only() && | 260 return textfield_->enabled() && !textfield_->read_only() && |
| 261 data.HasAnyFormat(formats, custom_formats); | 261 data.HasAnyFormat(formats, custom_formats); |
| 262 } | 262 } |
| 263 | 263 |
| 264 int NativeTextfieldViews::OnDragUpdated(const ui::DropTargetEvent& event) { | 264 int NativeTextfieldViews::OnDragUpdated(const ui::DropTargetEvent& event) { |
| 265 DCHECK(CanDrop(event.data())); | 265 DCHECK(CanDrop(event.data())); |
| 266 bool in_selection = GetRenderText()->IsPointInSelection(event.location()); | 266 |
| 267 const ui::Range& selection = GetRenderText()->selection(); | |
| 268 drop_cursor_position_ = GetRenderText()->FindCursorPosition(event.location()); | |
| 269 bool in_selection = !selection.is_empty() && | |
| 270 GetRenderText()->RangeContainsCaret( | |
| 271 selection, | |
| 272 drop_cursor_position_.caret_pos(), | |
| 273 drop_cursor_position_.caret_affinity()); | |
| 267 is_drop_cursor_visible_ = !in_selection; | 274 is_drop_cursor_visible_ = !in_selection; |
| 268 // TODO(msw): Pan over text when the user drags to the visible text edge. | 275 // TODO(msw): Pan over text when the user drags to the visible text edge. |
| 269 OnCaretBoundsChanged(); | 276 OnCaretBoundsChanged(); |
| 270 SchedulePaint(); | 277 SchedulePaint(); |
| 271 | 278 |
| 272 if (initiating_drag_) { | 279 if (initiating_drag_) { |
| 273 if (in_selection) | 280 if (in_selection) |
| 274 return ui::DragDropTypes::DRAG_NONE; | 281 return ui::DragDropTypes::DRAG_NONE; |
| 275 return event.IsControlDown() ? ui::DragDropTypes::DRAG_COPY : | 282 return event.IsControlDown() ? ui::DragDropTypes::DRAG_COPY : |
| 276 ui::DragDropTypes::DRAG_MOVE; | 283 ui::DragDropTypes::DRAG_MOVE; |
| 277 } | 284 } |
| 278 return ui::DragDropTypes::DRAG_COPY | ui::DragDropTypes::DRAG_MOVE; | 285 return ui::DragDropTypes::DRAG_COPY | ui::DragDropTypes::DRAG_MOVE; |
| 279 } | 286 } |
| 280 | 287 |
| 288 void NativeTextfieldViews::OnDragExited() { | |
| 289 is_drop_cursor_visible_ = false; | |
| 290 SchedulePaint(); | |
| 291 } | |
| 292 | |
| 281 int NativeTextfieldViews::OnPerformDrop(const ui::DropTargetEvent& event) { | 293 int NativeTextfieldViews::OnPerformDrop(const ui::DropTargetEvent& event) { |
| 282 DCHECK(CanDrop(event.data())); | 294 DCHECK(CanDrop(event.data())); |
| 283 | 295 |
| 296 is_drop_cursor_visible_ = false; | |
|
ckocagil
2013/04/16 19:20:25
Added to fix a condition where OnDragDone isn't ca
| |
| 297 | |
| 284 TextfieldController* controller = textfield_->GetController(); | 298 TextfieldController* controller = textfield_->GetController(); |
| 285 if (controller) { | 299 if (controller) { |
| 286 int drag_operation = controller->OnDrop(event.data()); | 300 int drag_operation = controller->OnDrop(event.data()); |
| 287 if (drag_operation != ui::DragDropTypes::DRAG_NONE) | 301 if (drag_operation != ui::DragDropTypes::DRAG_NONE) |
| 288 return drag_operation; | 302 return drag_operation; |
| 289 } | 303 } |
| 290 | 304 |
| 291 DCHECK(!initiating_drag_ || | 305 DCHECK(!initiating_drag_ || |
| 292 !GetRenderText()->IsPointInSelection(event.location())); | 306 !GetRenderText()->IsPointInSelection(event.location())); |
| 293 OnBeforeUserAction(); | 307 OnBeforeUserAction(); |
| (...skipping 780 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1074 | 1088 |
| 1075 void NativeTextfieldViews::RepaintCursor() { | 1089 void NativeTextfieldViews::RepaintCursor() { |
| 1076 gfx::Rect r(GetCaretBounds()); | 1090 gfx::Rect r(GetCaretBounds()); |
| 1077 r.Inset(-1, -1, -1, -1); | 1091 r.Inset(-1, -1, -1, -1); |
| 1078 SchedulePaintInRect(r); | 1092 SchedulePaintInRect(r); |
| 1079 } | 1093 } |
| 1080 | 1094 |
| 1081 void NativeTextfieldViews::PaintTextAndCursor(gfx::Canvas* canvas) { | 1095 void NativeTextfieldViews::PaintTextAndCursor(gfx::Canvas* canvas) { |
| 1082 TRACE_EVENT0("views", "NativeTextfieldViews::PaintTextAndCursor"); | 1096 TRACE_EVENT0("views", "NativeTextfieldViews::PaintTextAndCursor"); |
| 1083 canvas->Save(); | 1097 canvas->Save(); |
| 1084 GetRenderText()->set_cursor_visible(is_drop_cursor_visible_ || | 1098 GetRenderText()->set_cursor_visible(!is_drop_cursor_visible_ && |
| 1085 (is_cursor_visible_ && !model_->HasSelection())); | 1099 is_cursor_visible_ && !model_->HasSelection()); |
| 1086 // Draw the text, cursor, and selection. | 1100 // Draw the text, cursor, and selection. |
| 1087 GetRenderText()->Draw(canvas); | 1101 GetRenderText()->Draw(canvas); |
| 1088 | 1102 |
| 1103 // Draw the detached drop cursor that marks where the text will be dropped. | |
| 1104 if (is_drop_cursor_visible_) | |
| 1105 GetRenderText()->DrawCursor(canvas, drop_cursor_position_); | |
| 1106 | |
| 1089 // Draw placeholder text if needed. | 1107 // Draw placeholder text if needed. |
| 1090 if (model_->GetText().empty() && | 1108 if (model_->GetText().empty() && |
| 1091 !textfield_->placeholder_text().empty()) { | 1109 !textfield_->placeholder_text().empty()) { |
| 1092 canvas->DrawStringInt( | 1110 canvas->DrawStringInt( |
| 1093 textfield_->placeholder_text(), | 1111 textfield_->placeholder_text(), |
| 1094 GetRenderText()->GetFont(), | 1112 GetRenderText()->GetFont(), |
| 1095 textfield_->placeholder_text_color(), | 1113 textfield_->placeholder_text_color(), |
| 1096 GetRenderText()->display_rect()); | 1114 GetRenderText()->display_rect()); |
| 1097 } | 1115 } |
| 1098 canvas->Restore(); | 1116 canvas->Restore(); |
| (...skipping 314 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1413 | 1431 |
| 1414 void NativeTextfieldViews::PlatformGestureEventHandling( | 1432 void NativeTextfieldViews::PlatformGestureEventHandling( |
| 1415 const ui::GestureEvent* event) { | 1433 const ui::GestureEvent* event) { |
| 1416 #if defined(OS_WIN) && defined(USE_AURA) | 1434 #if defined(OS_WIN) && defined(USE_AURA) |
| 1417 if (event->type() == ui::ET_GESTURE_TAP_DOWN && !textfield_->read_only()) | 1435 if (event->type() == ui::ET_GESTURE_TAP_DOWN && !textfield_->read_only()) |
| 1418 base::win::DisplayVirtualKeyboard(); | 1436 base::win::DisplayVirtualKeyboard(); |
| 1419 #endif | 1437 #endif |
| 1420 } | 1438 } |
| 1421 | 1439 |
| 1422 } // namespace views | 1440 } // namespace views |
| OLD | NEW |