Index: views/controls/textfield/native_textfield_views.cc |
diff --git a/views/controls/textfield/native_textfield_views.cc b/views/controls/textfield/native_textfield_views.cc |
index a4324be2f68fd7a6998ee266a2e65178d1bd14ab..d70ea3231ab65e6c0c10343dc1301189266b567a 100644 |
--- a/views/controls/textfield/native_textfield_views.cc |
+++ b/views/controls/textfield/native_textfield_views.cc |
@@ -59,7 +59,10 @@ NativeTextfieldViews::NativeTextfieldViews(Textfield* parent) |
text_offset_(0), |
insert_(true), |
is_cursor_visible_(false), |
- ALLOW_THIS_IN_INITIALIZER_LIST(cursor_timer_(this)) { |
+ ALLOW_THIS_IN_INITIALIZER_LIST(cursor_timer_(this)), |
+ last_mouse_press_time_(base::Time::FromInternalValue(0)), |
+ tracking_double_click_(false), |
+ tracking_triple_click_(false) { |
set_border(text_border_); |
// Multiline is not supported. |
@@ -78,7 +81,9 @@ NativeTextfieldViews::~NativeTextfieldViews() { |
bool NativeTextfieldViews::OnMousePressed(const views::MouseEvent& e) { |
textfield_->RequestFocus(); |
- if (e.IsLeftMouseButton()) { |
+ if (DetectAndHandleDoubleAndTripleClick(e)) { |
+ SchedulePaint(); |
+ } else if (e.IsLeftMouseButton()) { |
size_t pos = FindCursorPosition(e.location()); |
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.
|
UpdateCursorBoundsAndTextOffset(); |
@@ -784,6 +789,57 @@ size_t NativeTextfieldViews::FindCursorPosition(const gfx::Point& point) const { |
return left_pos; |
} |
+bool NativeTextfieldViews::DetectAndHandleDoubleAndTripleClick( |
+ const views::MouseEvent& e) { |
+ switch(GetClickAction(e)) { |
+ case SELECT_WORD: |
+ model_->SelectWord(); |
+ return true; |
+ case SELECT_ALL: |
+ model_->SelectAll(); |
+ return true; |
+ case CURSOR_SELECT: |
+ tracking_double_click_ = true; |
+ return false; |
+ default: |
+ return false; |
+ } |
+} |
+ |
+NativeTextfieldViews::ClickAction NativeTextfieldViews::GetClickAction( |
+ const views::MouseEvent& e) { |
+ base::TimeDelta time_delta = e.GetTimeStamp() - last_mouse_press_time_; |
+ gfx::Point location_delta = e.location().Subtract(last_mouse_press_location_); |
+ last_mouse_press_time_ = e.GetTimeStamp(); |
+ last_mouse_press_location_ = e.location(); |
+ if (e.IsOnlyLeftMouseButton()) { |
+ if (!ExceededDragThreshold(location_delta.x(), location_delta.y()) |
+ && time_delta.InMilliseconds() <= GetDoubleClickTimeMS()) { |
+ // Multiple mouse press detected. Check for double or triple. |
+ 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.
|
+ tracking_double_click_ = false; |
+ tracking_triple_click_ = true; |
+ return SELECT_WORD; |
+ } else if (tracking_triple_click_) { |
+ tracking_double_click_ = false; |
+ tracking_triple_click_ = false; |
+ return SELECT_ALL; |
+ } else { |
+ // The 4th click should be treated as a single click. |
+ tracking_double_click_ = true; |
+ tracking_triple_click_ = false; |
+ return CURSOR_SELECT; |
+ } |
+ } else { |
+ // Single mouse press. |
+ tracking_double_click_ = true; |
+ tracking_triple_click_ = false; |
+ return CURSOR_SELECT; |
+ } |
+ } |
+ return NONE; |
+} |
+ |
void NativeTextfieldViews::PropagateTextChange() { |
textfield_->SyncText(); |
Textfield::Controller* controller = textfield_->GetController(); |