| 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 "chrome/browser/autocomplete/autocomplete_edit_view_win.h" | 5 #include "chrome/browser/autocomplete/autocomplete_edit_view_win.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <locale> | 8 #include <locale> |
| 9 #include <string> | 9 #include <string> |
| 10 | 10 |
| (...skipping 22 matching lines...) Expand all Loading... |
| 33 #include "chrome/browser/search_engines/template_url_model.h" | 33 #include "chrome/browser/search_engines/template_url_model.h" |
| 34 #include "chrome/browser/tab_contents/tab_contents.h" | 34 #include "chrome/browser/tab_contents/tab_contents.h" |
| 35 #include "chrome/browser/ui/views/location_bar/location_bar_view.h" | 35 #include "chrome/browser/ui/views/location_bar/location_bar_view.h" |
| 36 #include "chrome/common/notification_service.h" | 36 #include "chrome/common/notification_service.h" |
| 37 #include "googleurl/src/url_util.h" | 37 #include "googleurl/src/url_util.h" |
| 38 #include "grit/generated_resources.h" | 38 #include "grit/generated_resources.h" |
| 39 #include "net/base/escape.h" | 39 #include "net/base/escape.h" |
| 40 #include "skia/ext/skia_utils_win.h" | 40 #include "skia/ext/skia_utils_win.h" |
| 41 #include "ui/base/clipboard/clipboard.h" | 41 #include "ui/base/clipboard/clipboard.h" |
| 42 #include "ui/base/clipboard/scoped_clipboard_writer.h" | 42 #include "ui/base/clipboard/scoped_clipboard_writer.h" |
| 43 #include "ui/base/dragdrop/drag_drop_types.h" |
| 43 #include "ui/base/dragdrop/drag_source.h" | 44 #include "ui/base/dragdrop/drag_source.h" |
| 44 #include "ui/base/dragdrop/drop_target.h" | 45 #include "ui/base/dragdrop/drop_target.h" |
| 45 #include "ui/base/dragdrop/os_exchange_data.h" | 46 #include "ui/base/dragdrop/os_exchange_data.h" |
| 46 #include "ui/base/dragdrop/os_exchange_data_provider_win.h" | 47 #include "ui/base/dragdrop/os_exchange_data_provider_win.h" |
| 47 #include "ui/base/keycodes/keyboard_codes.h" | 48 #include "ui/base/keycodes/keyboard_codes.h" |
| 48 #include "ui/base/l10n/l10n_util.h" | 49 #include "ui/base/l10n/l10n_util.h" |
| 49 #include "ui/base/l10n/l10n_util_win.h" | 50 #include "ui/base/l10n/l10n_util_win.h" |
| 50 #include "ui/gfx/canvas.h" | 51 #include "ui/gfx/canvas.h" |
| 51 #include "ui/gfx/canvas_skia.h" | 52 #include "ui/gfx/canvas_skia.h" |
| 52 #include "views/controls/textfield/native_textfield_win.h" | 53 #include "views/controls/textfield/native_textfield_win.h" |
| 53 #include "views/drag_utils.h" | 54 #include "views/drag_utils.h" |
| 54 #include "views/events/event_utils_win.h" | 55 #include "views/events/event_utils_win.h" |
| 55 #include "views/focus/focus_util_win.h" | 56 #include "views/focus/focus_util_win.h" |
| 56 #include "views/widget/widget.h" | 57 #include "views/widget/widget.h" |
| 57 | 58 |
| 58 #pragma comment(lib, "oleacc.lib") // Needed for accessibility support. | 59 #pragma comment(lib, "oleacc.lib") // Needed for accessibility support. |
| 59 #pragma comment(lib, "riched20.lib") // Needed for the richedit control. | 60 #pragma comment(lib, "riched20.lib") // Needed for the richedit control. |
| 60 | 61 |
| 61 /////////////////////////////////////////////////////////////////////////////// | 62 /////////////////////////////////////////////////////////////////////////////// |
| 62 // AutocompleteEditModel | 63 // AutocompleteEditModel |
| 63 | 64 |
| 64 namespace { | 65 namespace { |
| 65 | 66 |
| 67 // A helper method for determining a valid DROPEFFECT given the allowed |
| 68 // DROPEFFECTS. We prefer copy over link. |
| 69 DWORD CopyOrLinkDropEffect(DWORD effect) { |
| 70 if (effect & DROPEFFECT_COPY) |
| 71 return DROPEFFECT_COPY; |
| 72 if (effect & DROPEFFECT_LINK) |
| 73 return DROPEFFECT_LINK; |
| 74 return DROPEFFECT_NONE; |
| 75 } |
| 76 |
| 77 // A helper method for determining a valid drag operation given the allowed |
| 78 // operation. We prefer copy over link. |
| 79 int CopyOrLinkDragOperation(int drag_operation) { |
| 80 if (drag_operation & ui::DragDropTypes::DRAG_COPY) |
| 81 return ui::DragDropTypes::DRAG_COPY; |
| 82 if (drag_operation & ui::DragDropTypes::DRAG_LINK) |
| 83 return ui::DragDropTypes::DRAG_LINK; |
| 84 return ui::DragDropTypes::DRAG_NONE; |
| 85 } |
| 86 |
| 87 // The AutocompleteEditState struct contains enough information about the |
| 88 // AutocompleteEditModel and AutocompleteEditViewWin to save/restore a user's |
| 89 // typing, caret position, etc. across tab changes. We explicitly don't |
| 90 // preserve things like whether the popup was open as this might be weird. |
| 91 struct AutocompleteEditState { |
| 92 AutocompleteEditState(const AutocompleteEditModel::State model_state, |
| 93 const AutocompleteEditViewWin::State view_state) |
| 94 : model_state(model_state), |
| 95 view_state(view_state) { |
| 96 } |
| 97 |
| 98 const AutocompleteEditModel::State model_state; |
| 99 const AutocompleteEditViewWin::State view_state; |
| 100 }; |
| 101 |
| 102 // Returns true if the current point is far enough from the origin that it |
| 103 // would be considered a drag. |
| 104 bool IsDrag(const POINT& origin, const POINT& current) { |
| 105 return views::View::ExceededDragThreshold(current.x - origin.x, |
| 106 current.y - origin.y); |
| 107 } |
| 108 |
| 109 } // namespace |
| 110 |
| 66 // EditDropTarget is the IDropTarget implementation installed on | 111 // EditDropTarget is the IDropTarget implementation installed on |
| 67 // AutocompleteEditViewWin. EditDropTarget prefers URL over plain text. A drop | 112 // AutocompleteEditViewWin. EditDropTarget prefers URL over plain text. A drop |
| 68 // of a URL replaces all the text of the edit and navigates immediately to the | 113 // of a URL replaces all the text of the edit and navigates immediately to the |
| 69 // URL. A drop of plain text from the same edit either copies or moves the | 114 // URL. A drop of plain text from the same edit either copies or moves the |
| 70 // selected text, and a drop of plain text from a source other than the edit | 115 // selected text, and a drop of plain text from a source other than the edit |
| 71 // does a paste and go. | 116 // does a paste and go. |
| 72 class EditDropTarget : public ui::DropTarget { | 117 class AutocompleteEditViewWin::EditDropTarget : public ui::DropTarget { |
| 73 public: | 118 public: |
| 74 explicit EditDropTarget(AutocompleteEditViewWin* edit); | 119 explicit EditDropTarget(AutocompleteEditViewWin* edit); |
| 75 | 120 |
| 76 protected: | 121 protected: |
| 77 virtual DWORD OnDragEnter(IDataObject* data_object, | 122 virtual DWORD OnDragEnter(IDataObject* data_object, |
| 78 DWORD key_state, | 123 DWORD key_state, |
| 79 POINT cursor_position, | 124 POINT cursor_position, |
| 80 DWORD effect); | 125 DWORD effect); |
| 81 virtual DWORD OnDragOver(IDataObject* data_object, | 126 virtual DWORD OnDragOver(IDataObject* data_object, |
| 82 DWORD key_state, | 127 DWORD key_state, |
| (...skipping 19 matching lines...) Expand all Loading... |
| 102 // If true, the drag session contains a URL. | 147 // If true, the drag session contains a URL. |
| 103 bool drag_has_url_; | 148 bool drag_has_url_; |
| 104 | 149 |
| 105 // If true, the drag session contains a string. If drag_has_url_ is true, | 150 // If true, the drag session contains a string. If drag_has_url_ is true, |
| 106 // this is false regardless of whether the clipboard has a string. | 151 // this is false regardless of whether the clipboard has a string. |
| 107 bool drag_has_string_; | 152 bool drag_has_string_; |
| 108 | 153 |
| 109 DISALLOW_COPY_AND_ASSIGN(EditDropTarget); | 154 DISALLOW_COPY_AND_ASSIGN(EditDropTarget); |
| 110 }; | 155 }; |
| 111 | 156 |
| 112 // A helper method for determining a valid DROPEFFECT given the allowed | 157 AutocompleteEditViewWin::EditDropTarget::EditDropTarget( |
| 113 // DROPEFFECTS. We prefer copy over link. | 158 AutocompleteEditViewWin* edit) |
| 114 DWORD CopyOrLinkDropEffect(DWORD effect) { | |
| 115 if (effect & DROPEFFECT_COPY) | |
| 116 return DROPEFFECT_COPY; | |
| 117 if (effect & DROPEFFECT_LINK) | |
| 118 return DROPEFFECT_LINK; | |
| 119 return DROPEFFECT_NONE; | |
| 120 } | |
| 121 | |
| 122 EditDropTarget::EditDropTarget(AutocompleteEditViewWin* edit) | |
| 123 : ui::DropTarget(edit->m_hWnd), | 159 : ui::DropTarget(edit->m_hWnd), |
| 124 edit_(edit), | 160 edit_(edit), |
| 125 drag_has_url_(false), | 161 drag_has_url_(false), |
| 126 drag_has_string_(false) { | 162 drag_has_string_(false) { |
| 127 } | 163 } |
| 128 | 164 |
| 129 DWORD EditDropTarget::OnDragEnter(IDataObject* data_object, | 165 DWORD AutocompleteEditViewWin::EditDropTarget::OnDragEnter( |
| 130 DWORD key_state, | 166 IDataObject* data_object, |
| 131 POINT cursor_position, | 167 DWORD key_state, |
| 132 DWORD effect) { | 168 POINT cursor_position, |
| 169 DWORD effect) { |
| 133 ui::OSExchangeData os_data(new ui::OSExchangeDataProviderWin(data_object)); | 170 ui::OSExchangeData os_data(new ui::OSExchangeDataProviderWin(data_object)); |
| 134 drag_has_url_ = os_data.HasURL(); | 171 drag_has_url_ = os_data.HasURL(); |
| 135 drag_has_string_ = !drag_has_url_ && os_data.HasString(); | 172 drag_has_string_ = !drag_has_url_ && os_data.HasString(); |
| 136 if (drag_has_url_) { | 173 if (drag_has_url_) { |
| 137 if (edit_->in_drag()) { | 174 if (edit_->in_drag()) { |
| 138 // The edit we're associated with originated the drag. No point in | 175 // The edit we're associated with originated the drag. No point in |
| 139 // allowing the user to drop back on us. | 176 // allowing the user to drop back on us. |
| 140 drag_has_url_ = false; | 177 drag_has_url_ = false; |
| 141 } | 178 } |
| 142 // NOTE: it would be nice to visually show all the text is going to | 179 // NOTE: it would be nice to visually show all the text is going to |
| 143 // be replaced by selecting all, but this caused painting problems. In | 180 // be replaced by selecting all, but this caused painting problems. In |
| 144 // particular the flashing caret would appear outside the edit! For now | 181 // particular the flashing caret would appear outside the edit! For now |
| 145 // we stick with no visual indicator other than that shown own the mouse | 182 // we stick with no visual indicator other than that shown own the mouse |
| 146 // cursor. | 183 // cursor. |
| 147 } | 184 } |
| 148 return OnDragOver(data_object, key_state, cursor_position, effect); | 185 return OnDragOver(data_object, key_state, cursor_position, effect); |
| 149 } | 186 } |
| 150 | 187 |
| 151 DWORD EditDropTarget::OnDragOver(IDataObject* data_object, | 188 DWORD AutocompleteEditViewWin::EditDropTarget::OnDragOver( |
| 152 DWORD key_state, | 189 IDataObject* data_object, |
| 153 POINT cursor_position, | 190 DWORD key_state, |
| 154 DWORD effect) { | 191 POINT cursor_position, |
| 192 DWORD effect) { |
| 155 if (drag_has_url_) | 193 if (drag_has_url_) |
| 156 return CopyOrLinkDropEffect(effect); | 194 return CopyOrLinkDropEffect(effect); |
| 157 | 195 |
| 158 if (drag_has_string_) { | 196 if (drag_has_string_) { |
| 159 UpdateDropHighlightPosition(cursor_position); | 197 UpdateDropHighlightPosition(cursor_position); |
| 160 if (edit_->drop_highlight_position() == -1 && edit_->in_drag()) | 198 if (edit_->drop_highlight_position() == -1 && edit_->in_drag()) |
| 161 return DROPEFFECT_NONE; | 199 return DROPEFFECT_NONE; |
| 162 if (edit_->in_drag()) { | 200 if (edit_->in_drag()) { |
| 163 // The edit we're associated with originated the drag. Do the normal drag | 201 // The edit we're associated with originated the drag. Do the normal drag |
| 164 // behavior. | 202 // behavior. |
| 165 DCHECK((effect & DROPEFFECT_COPY) && (effect & DROPEFFECT_MOVE)); | 203 DCHECK((effect & DROPEFFECT_COPY) && (effect & DROPEFFECT_MOVE)); |
| 166 return (key_state & MK_CONTROL) ? DROPEFFECT_COPY : DROPEFFECT_MOVE; | 204 return (key_state & MK_CONTROL) ? DROPEFFECT_COPY : DROPEFFECT_MOVE; |
| 167 } | 205 } |
| 168 // Our edit didn't originate the drag, only allow link or copy. | 206 // Our edit didn't originate the drag, only allow link or copy. |
| 169 return CopyOrLinkDropEffect(effect); | 207 return CopyOrLinkDropEffect(effect); |
| 170 } | 208 } |
| 171 | 209 |
| 172 return DROPEFFECT_NONE; | 210 return DROPEFFECT_NONE; |
| 173 } | 211 } |
| 174 | 212 |
| 175 void EditDropTarget::OnDragLeave(IDataObject* data_object) { | 213 void AutocompleteEditViewWin::EditDropTarget::OnDragLeave( |
| 214 IDataObject* data_object) { |
| 176 ResetDropHighlights(); | 215 ResetDropHighlights(); |
| 177 } | 216 } |
| 178 | 217 |
| 179 DWORD EditDropTarget::OnDrop(IDataObject* data_object, | 218 DWORD AutocompleteEditViewWin::EditDropTarget::OnDrop( |
| 180 DWORD key_state, | 219 IDataObject* data_object, |
| 181 POINT cursor_position, | 220 DWORD key_state, |
| 182 DWORD effect) { | 221 POINT cursor_position, |
| 222 DWORD effect) { |
| 223 effect = OnDragOver(data_object, key_state, cursor_position, effect); |
| 224 |
| 183 ui::OSExchangeData os_data(new ui::OSExchangeDataProviderWin(data_object)); | 225 ui::OSExchangeData os_data(new ui::OSExchangeDataProviderWin(data_object)); |
| 226 views::DropTargetEvent event(os_data, cursor_position.x, cursor_position.y, |
| 227 ui::DragDropTypes::DropEffectToDragOperation(effect)); |
| 184 | 228 |
| 185 if (drag_has_url_) { | 229 int drag_operation = edit_->OnPerformDropImpl(event, edit_->in_drag()); |
| 186 GURL url; | |
| 187 string16 title; | |
| 188 if (os_data.GetURLAndTitle(&url, &title)) { | |
| 189 edit_->SetUserText(UTF8ToWide(url.spec())); | |
| 190 edit_->model()->AcceptInput(CURRENT_TAB, true); | |
| 191 return CopyOrLinkDropEffect(effect); | |
| 192 } | |
| 193 } else if (drag_has_string_) { | |
| 194 int string_drop_position = edit_->drop_highlight_position(); | |
| 195 string16 text; | |
| 196 if ((string_drop_position != -1 || !edit_->in_drag()) && | |
| 197 os_data.GetString(&text)) { | |
| 198 DCHECK(string_drop_position == -1 || | |
| 199 ((string_drop_position >= 0) && | |
| 200 (string_drop_position <= edit_->GetTextLength()))); | |
| 201 const DWORD drop_operation = | |
| 202 OnDragOver(data_object, key_state, cursor_position, effect); | |
| 203 if (edit_->in_drag()) { | |
| 204 if (drop_operation == DROPEFFECT_MOVE) | |
| 205 edit_->MoveSelectedText(string_drop_position); | |
| 206 else | |
| 207 edit_->InsertText(string_drop_position, text); | |
| 208 } else { | |
| 209 edit_->PasteAndGo(CollapseWhitespace(text, true)); | |
| 210 } | |
| 211 ResetDropHighlights(); | |
| 212 return drop_operation; | |
| 213 } | |
| 214 } | |
| 215 | 230 |
| 216 ResetDropHighlights(); | 231 if (!drag_has_url_) |
| 232 ResetDropHighlights(); |
| 217 | 233 |
| 218 return DROPEFFECT_NONE; | 234 return ui::DragDropTypes::DragOperationToDropEffect(drag_operation); |
| 219 } | 235 } |
| 220 | 236 |
| 221 void EditDropTarget::UpdateDropHighlightPosition( | 237 void AutocompleteEditViewWin::EditDropTarget::UpdateDropHighlightPosition( |
| 222 const POINT& cursor_screen_position) { | 238 const POINT& cursor_screen_position) { |
| 223 if (drag_has_string_) { | 239 if (drag_has_string_) { |
| 224 POINT client_position = cursor_screen_position; | 240 POINT client_position = cursor_screen_position; |
| 225 ScreenToClient(edit_->m_hWnd, &client_position); | 241 ::ScreenToClient(edit_->m_hWnd, &client_position); |
| 226 int drop_position = edit_->CharFromPos(client_position); | 242 int drop_position = edit_->CharFromPos(client_position); |
| 227 if (edit_->in_drag()) { | 243 if (edit_->in_drag()) { |
| 228 // Our edit originated the drag, don't allow a drop if over the selected | 244 // Our edit originated the drag, don't allow a drop if over the selected |
| 229 // region. | 245 // region. |
| 230 LONG sel_start, sel_end; | 246 LONG sel_start, sel_end; |
| 231 edit_->GetSel(sel_start, sel_end); | 247 edit_->GetSel(sel_start, sel_end); |
| 232 if ((sel_start != sel_end) && (drop_position >= sel_start) && | 248 if ((sel_start != sel_end) && (drop_position >= sel_start) && |
| 233 (drop_position <= sel_end)) | 249 (drop_position <= sel_end)) |
| 234 drop_position = -1; | 250 drop_position = -1; |
| 235 } else { | 251 } else { |
| 236 // A drop from a source other than the edit replaces all the text, so | 252 // A drop from a source other than the edit replaces all the text, so |
| 237 // we don't show the drop location. See comment in OnDragEnter as to why | 253 // we don't show the drop location. See comment in OnDragEnter as to why |
| 238 // we don't try and select all here. | 254 // we don't try and select all here. |
| 239 drop_position = -1; | 255 drop_position = -1; |
| 240 } | 256 } |
| 241 edit_->SetDropHighlightPosition(drop_position); | 257 edit_->SetDropHighlightPosition(drop_position); |
| 242 } | 258 } |
| 243 } | 259 } |
| 244 | 260 |
| 245 void EditDropTarget::ResetDropHighlights() { | 261 void AutocompleteEditViewWin::EditDropTarget::ResetDropHighlights() { |
| 246 if (drag_has_string_) | 262 if (drag_has_string_) |
| 247 edit_->SetDropHighlightPosition(-1); | 263 edit_->SetDropHighlightPosition(-1); |
| 248 } | 264 } |
| 249 | 265 |
| 250 // The AutocompleteEditState struct contains enough information about the | |
| 251 // AutocompleteEditModel and AutocompleteEditViewWin to save/restore a user's | |
| 252 // typing, caret position, etc. across tab changes. We explicitly don't | |
| 253 // preserve things like whether the popup was open as this might be weird. | |
| 254 struct AutocompleteEditState { | |
| 255 AutocompleteEditState(const AutocompleteEditModel::State model_state, | |
| 256 const AutocompleteEditViewWin::State view_state) | |
| 257 : model_state(model_state), | |
| 258 view_state(view_state) { | |
| 259 } | |
| 260 | |
| 261 const AutocompleteEditModel::State model_state; | |
| 262 const AutocompleteEditViewWin::State view_state; | |
| 263 }; | |
| 264 | |
| 265 // Returns true if the current point is far enough from the origin that it | |
| 266 // would be considered a drag. | |
| 267 bool IsDrag(const POINT& origin, const POINT& current) { | |
| 268 // The CXDRAG and CYDRAG system metrics describe the width and height of a | |
| 269 // rectangle around the origin position, inside of which motion is not | |
| 270 // considered a drag. | |
| 271 return (abs(current.x - origin.x) > (GetSystemMetrics(SM_CXDRAG) / 2)) || | |
| 272 (abs(current.y - origin.y) > (GetSystemMetrics(SM_CYDRAG) / 2)); | |
| 273 } | |
| 274 | |
| 275 } // namespace | |
| 276 | 266 |
| 277 /////////////////////////////////////////////////////////////////////////////// | 267 /////////////////////////////////////////////////////////////////////////////// |
| 278 // Helper classes | 268 // Helper classes |
| 279 | 269 |
| 280 AutocompleteEditViewWin::ScopedFreeze::ScopedFreeze( | 270 AutocompleteEditViewWin::ScopedFreeze::ScopedFreeze( |
| 281 AutocompleteEditViewWin* edit, | 271 AutocompleteEditViewWin* edit, |
| 282 ITextDocument* text_object_model) | 272 ITextDocument* text_object_model) |
| 283 : edit_(edit), | 273 : edit_(edit), |
| 284 text_object_model_(text_object_model) { | 274 text_object_model_(text_object_model) { |
| 285 // Freeze the screen. | 275 // Freeze the screen. |
| (...skipping 670 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 956 } | 946 } |
| 957 | 947 |
| 958 views::View* AutocompleteEditViewWin::AddToView(views::View* parent) { | 948 views::View* AutocompleteEditViewWin::AddToView(views::View* parent) { |
| 959 views::NativeViewHost* host = new views::NativeViewHost; | 949 views::NativeViewHost* host = new views::NativeViewHost; |
| 960 parent->AddChildView(host); | 950 parent->AddChildView(host); |
| 961 host->set_focus_view(parent); | 951 host->set_focus_view(parent); |
| 962 host->Attach(GetNativeView()); | 952 host->Attach(GetNativeView()); |
| 963 return host; | 953 return host; |
| 964 } | 954 } |
| 965 | 955 |
| 956 int AutocompleteEditViewWin::OnPerformDrop( |
| 957 const views::DropTargetEvent& event) { |
| 958 return OnPerformDropImpl(event, false); |
| 959 } |
| 960 |
| 961 int AutocompleteEditViewWin::OnPerformDropImpl( |
| 962 const views::DropTargetEvent& event, |
| 963 bool in_drag) { |
| 964 const ui::OSExchangeData& data = event.data(); |
| 965 |
| 966 if (data.HasURL()) { |
| 967 GURL url; |
| 968 string16 title; |
| 969 if (data.GetURLAndTitle(&url, &title)) { |
| 970 SetUserText(UTF8ToWide(url.spec())); |
| 971 model()->AcceptInput(CURRENT_TAB, true); |
| 972 return CopyOrLinkDragOperation(event.source_operations()); |
| 973 } |
| 974 } else if (data.HasString()) { |
| 975 int string_drop_position = drop_highlight_position(); |
| 976 string16 text; |
| 977 if ((string_drop_position != -1 || !in_drag) && data.GetString(&text)) { |
| 978 DCHECK(string_drop_position == -1 || |
| 979 ((string_drop_position >= 0) && |
| 980 (string_drop_position <= GetTextLength()))); |
| 981 if (in_drag) { |
| 982 if (event.source_operations()== ui::DragDropTypes::DRAG_MOVE) |
| 983 MoveSelectedText(string_drop_position); |
| 984 else |
| 985 InsertText(string_drop_position, text); |
| 986 } else { |
| 987 PasteAndGo(CollapseWhitespace(text, true)); |
| 988 } |
| 989 return CopyOrLinkDragOperation(event.source_operations()); |
| 990 } |
| 991 } |
| 992 |
| 993 return ui::DragDropTypes::DRAG_NONE; |
| 994 } |
| 995 |
| 966 void AutocompleteEditViewWin::PasteAndGo(const string16& text) { | 996 void AutocompleteEditViewWin::PasteAndGo(const string16& text) { |
| 967 if (CanPasteAndGo(text)) | 997 if (CanPasteAndGo(text)) |
| 968 model_->PasteAndGo(); | 998 model_->PasteAndGo(); |
| 969 } | 999 } |
| 970 | 1000 |
| 971 bool AutocompleteEditViewWin::SkipDefaultKeyEventProcessing( | 1001 bool AutocompleteEditViewWin::SkipDefaultKeyEventProcessing( |
| 972 const views::KeyEvent& e) { | 1002 const views::KeyEvent& e) { |
| 973 ui::KeyboardCode key = e.key_code(); | 1003 ui::KeyboardCode key = e.key_code(); |
| 974 // We don't process ALT + numpad digit as accelerators, they are used for | 1004 // We don't process ALT + numpad digit as accelerators, they are used for |
| 975 // entering special characters. We do translate alt-home. | 1005 // entering special characters. We do translate alt-home. |
| (...skipping 1607 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2583 // PosFromChar(i) might return 0 when i is greater than 1. | 2613 // PosFromChar(i) might return 0 when i is greater than 1. |
| 2584 return font_.GetStringWidth(text) + GetHorizontalMargin(); | 2614 return font_.GetStringWidth(text) + GetHorizontalMargin(); |
| 2585 } | 2615 } |
| 2586 | 2616 |
| 2587 bool AutocompleteEditViewWin::IsCaretAtEnd() const { | 2617 bool AutocompleteEditViewWin::IsCaretAtEnd() const { |
| 2588 long length = GetTextLength(); | 2618 long length = GetTextLength(); |
| 2589 CHARRANGE sel; | 2619 CHARRANGE sel; |
| 2590 GetSelection(sel); | 2620 GetSelection(sel); |
| 2591 return sel.cpMin == sel.cpMax && sel.cpMin == length; | 2621 return sel.cpMin == sel.cpMax && sel.cpMin == length; |
| 2592 } | 2622 } |
| OLD | NEW |