Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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/textfield_views_model.h" | 5 #include "views/controls/textfield/textfield_views_model.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "app/clipboard/clipboard.h" | |
| 10 #include "app/clipboard/scoped_clipboard_writer.h" | |
| 9 #include "base/i18n/break_iterator.h" | 11 #include "base/i18n/break_iterator.h" |
| 10 #include "base/logging.h" | 12 #include "base/logging.h" |
| 11 #include "base/utf_string_conversions.h" | 13 #include "base/utf_string_conversions.h" |
| 12 #include "gfx/font.h" | 14 #include "gfx/font.h" |
| 15 #include "views/views_delegate.h" | |
| 13 | 16 |
| 14 namespace views { | 17 namespace views { |
| 15 | 18 |
| 16 TextfieldViewsModel::TextfieldViewsModel() | 19 TextfieldViewsModel::TextfieldViewsModel() |
| 17 : cursor_pos_(0), | 20 : cursor_pos_(0), |
| 18 selection_begin_(0), | 21 selection_begin_(0), |
| 19 is_password_(false) { | 22 is_password_(false) { |
| 20 } | 23 } |
| 21 | 24 |
| 22 TextfieldViewsModel::~TextfieldViewsModel() { | 25 TextfieldViewsModel::~TextfieldViewsModel() { |
| (...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 216 | 219 |
| 217 void TextfieldViewsModel::SelectAll() { | 220 void TextfieldViewsModel::SelectAll() { |
| 218 cursor_pos_ = 0; | 221 cursor_pos_ = 0; |
| 219 selection_begin_ = text_.length(); | 222 selection_begin_ = text_.length(); |
| 220 } | 223 } |
| 221 | 224 |
| 222 void TextfieldViewsModel::ClearSelection() { | 225 void TextfieldViewsModel::ClearSelection() { |
| 223 selection_begin_ = cursor_pos_; | 226 selection_begin_ = cursor_pos_; |
| 224 } | 227 } |
| 225 | 228 |
| 229 bool TextfieldViewsModel::HandleClipboardEvents(app::KeyboardCode key_code) { | |
|
rjkroege
2011/01/05 15:31:22
please remember that cut&paste is also invokable f
varunjain
2011/01/05 16:19:31
Done.
| |
| 230 Clipboard* clipboard = views::ViewsDelegate::views_delegate->GetClipboard(); | |
| 231 bool text_changed = false; | |
| 232 string16 result; | |
| 233 switch (key_code) { | |
| 234 case app::VKEY_C: | |
| 235 if (HasSelection()) { | |
| 236 ScopedClipboardWriter scw(clipboard); | |
| 237 scw.WriteText(GetSelectedText()); | |
| 238 } | |
| 239 break; | |
| 240 case app::VKEY_X: | |
| 241 if (HasSelection()) { | |
| 242 ScopedClipboardWriter scw(clipboard); | |
| 243 scw.WriteText(GetSelectedText()); | |
| 244 DeleteSelection(); | |
| 245 text_changed = true; | |
| 246 } | |
| 247 break; | |
| 248 case app::VKEY_V: | |
| 249 clipboard->ReadText(Clipboard::BUFFER_STANDARD, &result); | |
| 250 if (!result.empty()) { | |
| 251 if (HasSelection()) | |
| 252 DeleteSelection(); | |
| 253 text_.insert(cursor_pos_, result); | |
| 254 cursor_pos_ += result.length(); | |
| 255 ClearSelection(); | |
| 256 text_changed = true; | |
| 257 } | |
| 258 break; | |
| 259 default: | |
| 260 break; | |
| 261 } | |
| 262 return text_changed; | |
| 263 } | |
| 264 | |
| 226 bool TextfieldViewsModel::HasSelection() const { | 265 bool TextfieldViewsModel::HasSelection() const { |
| 227 return selection_begin_ != cursor_pos_; | 266 return selection_begin_ != cursor_pos_; |
| 228 } | 267 } |
| 229 | 268 |
| 230 void TextfieldViewsModel::DeleteSelection() { | 269 void TextfieldViewsModel::DeleteSelection() { |
| 231 DCHECK(HasSelection()); | 270 DCHECK(HasSelection()); |
| 232 size_t n = std::abs(static_cast<long>(cursor_pos_ - selection_begin_)); | 271 size_t n = std::abs(static_cast<long>(cursor_pos_ - selection_begin_)); |
| 233 size_t begin = std::min(cursor_pos_, selection_begin_); | 272 size_t begin = std::min(cursor_pos_, selection_begin_); |
| 234 text_.erase(begin, n); | 273 text_.erase(begin, n); |
| 235 cursor_pos_ = begin; | 274 cursor_pos_ = begin; |
| 236 ClearSelection(); | 275 ClearSelection(); |
| 237 } | 276 } |
| 238 | 277 |
| 239 string16 TextfieldViewsModel::GetVisibleText(size_t begin, size_t end) const { | 278 string16 TextfieldViewsModel::GetVisibleText(size_t begin, size_t end) const { |
| 240 DCHECK(end >= begin); | 279 DCHECK(end >= begin); |
| 241 if (is_password_) { | 280 if (is_password_) { |
| 242 return string16(end - begin, '*'); | 281 return string16(end - begin, '*'); |
| 243 } | 282 } |
| 244 return text_.substr(begin, end - begin); | 283 return text_.substr(begin, end - begin); |
| 245 } | 284 } |
| 246 | 285 |
| 247 } // namespace views | 286 } // namespace views |
| OLD | NEW |