Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(17)

Side by Side Diff: views/controls/textfield/native_textfield_views.cc

Issue 6267002: Implement double/triple click functionality in views textfield. (Closed) Base URL: http://git.chromium.org/git/chromium.git@trunk
Patch Set: minor changes Created 9 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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/command_line.h" 9 #include "base/command_line.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
52 const char NativeTextfieldViews::kViewClassName[] = 52 const char NativeTextfieldViews::kViewClassName[] =
53 "views/NativeTextfieldViews"; 53 "views/NativeTextfieldViews";
54 54
55 NativeTextfieldViews::NativeTextfieldViews(Textfield* parent) 55 NativeTextfieldViews::NativeTextfieldViews(Textfield* parent)
56 : textfield_(parent), 56 : textfield_(parent),
57 model_(new TextfieldViewsModel()), 57 model_(new TextfieldViewsModel()),
58 text_border_(new TextfieldBorder()), 58 text_border_(new TextfieldBorder()),
59 text_offset_(0), 59 text_offset_(0),
60 insert_(true), 60 insert_(true),
61 is_cursor_visible_(false), 61 is_cursor_visible_(false),
62 ALLOW_THIS_IN_INITIALIZER_LIST(cursor_timer_(this)) { 62 ALLOW_THIS_IN_INITIALIZER_LIST(cursor_timer_(this)),
63 last_mouse_press_time_(base::Time::FromInternalValue(0)),
64 tracking_double_click_(false),
65 tracking_triple_click_(false) {
63 set_border(text_border_); 66 set_border(text_border_);
64 67
65 // Multiline is not supported. 68 // Multiline is not supported.
66 DCHECK_NE(parent->style(), Textfield::STYLE_MULTILINE); 69 DCHECK_NE(parent->style(), Textfield::STYLE_MULTILINE);
67 // Lowercase is not supported. 70 // Lowercase is not supported.
68 DCHECK_NE(parent->style(), Textfield::STYLE_LOWERCASE); 71 DCHECK_NE(parent->style(), Textfield::STYLE_LOWERCASE);
69 72
70 SetContextMenuController(this); 73 SetContextMenuController(this);
71 } 74 }
72 75
73 NativeTextfieldViews::~NativeTextfieldViews() { 76 NativeTextfieldViews::~NativeTextfieldViews() {
74 } 77 }
75 78
76 //////////////////////////////////////////////////////////////////////////////// 79 ////////////////////////////////////////////////////////////////////////////////
77 // NativeTextfieldViews, View overrides: 80 // NativeTextfieldViews, View overrides:
78 81
79 bool NativeTextfieldViews::OnMousePressed(const views::MouseEvent& e) { 82 bool NativeTextfieldViews::OnMousePressed(const views::MouseEvent& e) {
80 textfield_->RequestFocus(); 83 textfield_->RequestFocus();
81 if (e.IsLeftMouseButton()) { 84 if (DetectAndHandleDoubleAndTripleClick(e)) {
85 SchedulePaint();
86 } else if (e.IsLeftMouseButton()) {
82 size_t pos = FindCursorPosition(e.location()); 87 size_t pos = FindCursorPosition(e.location());
83 if (model_->MoveCursorTo(pos, false)) { 88 if (model_->MoveCursorTo(pos, false)) {
oshima 2011/01/25 19:31:59 It's probably better to move this logic to GetClic
varunjain 2011/01/25 20:10:40 Done.
84 UpdateCursorBoundsAndTextOffset(); 89 UpdateCursorBoundsAndTextOffset();
85 SchedulePaint(); 90 SchedulePaint();
86 } 91 }
87 } 92 }
88 return true; 93 return true;
89 } 94 }
90 95
91 bool NativeTextfieldViews::OnMouseDragged(const views::MouseEvent& e) { 96 bool NativeTextfieldViews::OnMouseDragged(const views::MouseEvent& e) {
92 size_t pos = FindCursorPosition(e.location()); 97 size_t pos = FindCursorPosition(e.location());
93 if (model_->MoveCursorTo(pos, true)) { 98 if (model_->MoveCursorTo(pos, true)) {
(...skipping 683 matching lines...) Expand 10 before | Expand all | Expand 10 after
777 } else if (pivot == x) { 782 } else if (pivot == x) {
778 return pivot_pos; 783 return pivot_pos;
779 } else { 784 } else {
780 right = pivot; 785 right = pivot;
781 right_pos = pivot_pos; 786 right_pos = pivot_pos;
782 } 787 }
783 } 788 }
784 return left_pos; 789 return left_pos;
785 } 790 }
786 791
792 bool NativeTextfieldViews::DetectAndHandleDoubleAndTripleClick(
793 const views::MouseEvent& e) {
794 switch(GetClickAction(e)) {
795 case SELECT_WORD:
796 model_->SelectWord();
797 return true;
798 case SELECT_ALL:
799 model_->SelectAll();
800 return true;
801 case CURSOR_SELECT:
802 tracking_double_click_ = true;
803 return false;
804 default:
805 return false;
806 }
807 }
808
809 NativeTextfieldViews::ClickAction NativeTextfieldViews::GetClickAction(
810 const views::MouseEvent& e) {
811 base::TimeDelta time_delta = e.GetTimeStamp() - last_mouse_press_time_;
812 gfx::Point location_delta = e.location().Subtract(last_mouse_press_location_);
813 last_mouse_press_time_ = e.GetTimeStamp();
814 last_mouse_press_location_ = e.location();
815 if (e.IsOnlyLeftMouseButton()) {
816 if (!ExceededDragThreshold(location_delta.x(), location_delta.y())
817 && time_delta.InMilliseconds() <= GetDoubleClickTimeMS()) {
818 // Multiple mouse press detected. Check for double or triple.
819 if (tracking_double_click_) {
oshima 2011/01/25 19:31:59 can't we make this simple state machine rather tha
varunjain 2011/01/25 20:10:40 Done.
820 tracking_double_click_ = false;
821 tracking_triple_click_ = true;
822 return SELECT_WORD;
823 } else if (tracking_triple_click_) {
824 tracking_double_click_ = false;
825 tracking_triple_click_ = false;
826 return SELECT_ALL;
827 } else {
828 // The 4th click should be treated as a single click.
829 tracking_double_click_ = true;
830 tracking_triple_click_ = false;
831 return CURSOR_SELECT;
832 }
833 } else {
834 // Single mouse press.
835 tracking_double_click_ = true;
836 tracking_triple_click_ = false;
837 return CURSOR_SELECT;
838 }
839 }
840 return NONE;
841 }
842
787 void NativeTextfieldViews::PropagateTextChange() { 843 void NativeTextfieldViews::PropagateTextChange() {
788 textfield_->SyncText(); 844 textfield_->SyncText();
789 Textfield::Controller* controller = textfield_->GetController(); 845 Textfield::Controller* controller = textfield_->GetController();
790 if (controller) 846 if (controller)
791 controller->ContentsChanged(textfield_, GetText()); 847 controller->ContentsChanged(textfield_, GetText());
792 } 848 }
793 849
794 void NativeTextfieldViews::InitContextMenuIfRequired() { 850 void NativeTextfieldViews::InitContextMenuIfRequired() {
795 if (context_menu_menu_.get()) 851 if (context_menu_menu_.get())
796 return; 852 return;
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
853 } 909 }
854 910
855 void NativeTextfieldViews::TextfieldBorder::SetInsets(int top, 911 void NativeTextfieldViews::TextfieldBorder::SetInsets(int top,
856 int left, 912 int left,
857 int bottom, 913 int bottom,
858 int right) { 914 int right) {
859 insets_.Set(top, left, bottom, right); 915 insets_.Set(top, left, bottom, right);
860 } 916 }
861 917
862 } // namespace views 918 } // namespace views
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698