summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorpkasting@chromium.org <pkasting@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-01-29 01:24:05 +0000
committerpkasting@chromium.org <pkasting@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-01-29 01:24:05 +0000
commit185fb4bb614a89d2445925f1fc98b6c54db45ad6 (patch)
treead86ec033998aae00e8f5ef0f8072515645edc42
parent17635d02534099d1934d83db0b2fe77fe1a9ed0a (diff)
downloadchromium_src-185fb4bb614a89d2445925f1fc98b6c54db45ad6.zip
chromium_src-185fb4bb614a89d2445925f1fc98b6c54db45ad6.tar.gz
chromium_src-185fb4bb614a89d2445925f1fc98b6c54db45ad6.tar.bz2
Support dragging within the omnibox dropdown. Original patch by Philippe Beaudoin (see http://codereview.chromium.org/555145 ), r=me.
BUG=13703 TEST=Click and drag the left or middle buttons in the omnibox dropdown. The selection or hover should track your movement and the appropriate entry should be activated on mouse up. git-svn-id: svn://svn.chromium.org/chrome/trunk/src@37477 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--AUTHORS1
-rw-r--r--chrome/browser/views/autocomplete/autocomplete_popup_contents_view.cc166
-rw-r--r--chrome/browser/views/autocomplete/autocomplete_popup_contents_view.h30
3 files changed, 110 insertions, 87 deletions
diff --git a/AUTHORS b/AUTHORS
index 7fe06be..b2ea8f7 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -61,3 +61,4 @@ Kevin Lee Helpingstine <sig11@reprehensible.net>
Bernard Cafarelli <voyageur@gentoo.org>
Vernon Tang <vt@foilhead.net>
Alexander Sulfrian <alexander@sulfrian.net>
+Philippe Beaudoin <philippe.beaudoin@gmail.com>
diff --git a/chrome/browser/views/autocomplete/autocomplete_popup_contents_view.cc b/chrome/browser/views/autocomplete/autocomplete_popup_contents_view.cc
index 006f23d..6d9429e 100644
--- a/chrome/browser/views/autocomplete/autocomplete_popup_contents_view.cc
+++ b/chrome/browser/views/autocomplete/autocomplete_popup_contents_view.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2009 The Chromium Authors. All rights reserved. Use of this
+// Copyright (c) 2010 The Chromium Authors. All rights reserved. Use of this
// source code is governed by a BSD-style license that can be found in the
// LICENSE file.
@@ -124,12 +124,6 @@ class AutocompleteResultView : public views::View {
virtual void Paint(gfx::Canvas* canvas);
virtual void Layout();
virtual gfx::Size GetPreferredSize();
- virtual void OnMouseEntered(const views::MouseEvent& event);
- virtual void OnMouseMoved(const views::MouseEvent& event);
- virtual void OnMouseExited(const views::MouseEvent& event);
- virtual bool OnMousePressed(const views::MouseEvent& event);
- virtual void OnMouseReleased(const views::MouseEvent& event, bool canceled);
- virtual bool OnMouseDragged(const views::MouseEvent& event);
private:
ResultViewState GetState() const;
@@ -386,44 +380,6 @@ gfx::Size AutocompleteResultView::GetPreferredSize() {
return gfx::Size(0, std::max(icon_height, text_height));
}
-void AutocompleteResultView::OnMouseEntered(const views::MouseEvent& event) {
- model_->SetHoveredLine(model_index_);
-}
-
-void AutocompleteResultView::OnMouseMoved(const views::MouseEvent& event) {
- model_->SetHoveredLine(model_index_);
- if (event.IsLeftMouseButton())
- model_->SetSelectedLine(model_index_, false);
-}
-
-void AutocompleteResultView::OnMouseExited(const views::MouseEvent& event) {
- model_->SetHoveredLine(AutocompletePopupModel::kNoMatch);
-}
-
-bool AutocompleteResultView::OnMousePressed(const views::MouseEvent& event) {
- if (event.IsLeftMouseButton() || event.IsMiddleMouseButton()) {
- model_->SetHoveredLine(model_index_);
- if (event.IsLeftMouseButton())
- model_->SetSelectedLine(model_index_, false);
- }
- return true;
-}
-
-void AutocompleteResultView::OnMouseReleased(const views::MouseEvent& event,
- bool canceled) {
- if (canceled)
- return;
- if (event.IsOnlyMiddleMouseButton())
- model_->OpenIndex(model_index_, NEW_BACKGROUND_TAB);
- else if (event.IsOnlyLeftMouseButton())
- model_->OpenIndex(model_index_, CURRENT_TAB);
-}
-
-bool AutocompleteResultView::OnMouseDragged(const views::MouseEvent& event) {
- // TODO(beng): move all message handling into the contents view and override
- // GetViewForPoint.
- return false;
-}
ResultViewState AutocompleteResultView::GetState() const {
if (model_->IsSelectedIndex(model_index_))
@@ -718,34 +674,6 @@ bool AutocompletePopupContentsView::IsHoveredIndex(size_t index) const {
return HasMatchAt(index) ? index == model_->hovered_line() : false;
}
-void AutocompletePopupContentsView::OpenIndex(
- size_t index,
- WindowOpenDisposition disposition) {
- if (!HasMatchAt(index))
- return;
-
- const AutocompleteMatch& match = model_->result().match_at(index);
- // OpenURL() may close the popup, which will clear the result set and, by
- // extension, |match| and its contents. So copy the relevant strings out to
- // make sure they stay alive until the call completes.
- const GURL url(match.destination_url);
- std::wstring keyword;
- const bool is_keyword_hint = model_->GetKeywordForMatch(match, &keyword);
- edit_view_->OpenURL(url, disposition, match.transition, GURL(), index,
- is_keyword_hint ? std::wstring() : keyword);
-}
-
-void AutocompletePopupContentsView::SetHoveredLine(size_t index) {
- if (HasMatchAt(index))
- model_->SetHoveredLine(index);
-}
-
-void AutocompletePopupContentsView::SetSelectedLine(size_t index,
- bool revert_to_default) {
- if (HasMatchAt(index))
- model_->SetSelectedLine(index, revert_to_default);
-}
-
////////////////////////////////////////////////////////////////////////////////
// AutocompletePopupContentsView, AnimationDelegate implementation:
@@ -819,6 +747,65 @@ void AutocompletePopupContentsView::Layout() {
SchedulePaint();
}
+
+void AutocompletePopupContentsView::OnMouseEntered(
+ const views::MouseEvent& event) {
+ model_->SetHoveredLine(GetIndexForPoint(event.location()));
+}
+
+void AutocompletePopupContentsView::OnMouseMoved(
+ const views::MouseEvent& event) {
+ model_->SetHoveredLine(GetIndexForPoint(event.location()));
+}
+
+void AutocompletePopupContentsView::OnMouseExited(
+ const views::MouseEvent& event) {
+ model_->SetHoveredLine(AutocompletePopupModel::kNoMatch);
+}
+
+bool AutocompletePopupContentsView::OnMousePressed(
+ const views::MouseEvent& event) {
+ if (event.IsLeftMouseButton() || event.IsMiddleMouseButton()) {
+ int index = GetIndexForPoint(event.location());
+ model_->SetHoveredLine(index);
+ if (HasMatchAt(index) && event.IsLeftMouseButton())
+ model_->SetSelectedLine(index, false);
+ }
+ return true;
+}
+
+void AutocompletePopupContentsView::OnMouseReleased(
+ const views::MouseEvent& event,
+ bool canceled) {
+ if (canceled)
+ return;
+
+ int index = GetIndexForPoint(event.location());
+ if (event.IsOnlyMiddleMouseButton())
+ OpenIndex(index, NEW_BACKGROUND_TAB);
+ else if (event.IsOnlyLeftMouseButton())
+ OpenIndex(index, CURRENT_TAB);
+}
+
+bool AutocompletePopupContentsView::OnMouseDragged(
+ const views::MouseEvent& event) {
+ if (event.IsLeftMouseButton() || event.IsMiddleMouseButton()) {
+ int index = GetIndexForPoint(event.location());
+ model_->SetHoveredLine(index);
+ if (HasMatchAt(index) && event.IsLeftMouseButton())
+ model_->SetSelectedLine(index, false);
+ }
+ return true;
+}
+
+views::View* AutocompletePopupContentsView::GetViewForPoint(
+ const gfx::Point& /*point*/) {
+ // This View takes control of the mouse events, so it should be considered the
+ // active view for any point inside of it.
+ return this;
+}
+
+
////////////////////////////////////////////////////////////////////////////////
// AutocompletePopupContentsView, private:
@@ -881,6 +868,39 @@ void AutocompletePopupContentsView::MakeCanvasTransparent(
SkXfermode::kDstIn_Mode);
}
+void AutocompletePopupContentsView::OpenIndex(
+ size_t index,
+ WindowOpenDisposition disposition) {
+ if (!HasMatchAt(index))
+ return;
+
+ const AutocompleteMatch& match = model_->result().match_at(index);
+ // OpenURL() may close the popup, which will clear the result set and, by
+ // extension, |match| and its contents. So copy the relevant strings out to
+ // make sure they stay alive until the call completes.
+ const GURL url(match.destination_url);
+ std::wstring keyword;
+ const bool is_keyword_hint = model_->GetKeywordForMatch(match, &keyword);
+ edit_view_->OpenURL(url, disposition, match.transition, GURL(), index,
+ is_keyword_hint ? std::wstring() : keyword);
+}
+
+int AutocompletePopupContentsView::GetIndexForPoint(const gfx::Point& point) {
+ if (!HitTest(point))
+ return AutocompletePopupModel::kNoMatch;
+
+ int nb_match = model_->result().size();
+ DCHECK(nb_match <= GetChildViewCount());
+ for (int i = 0; i < nb_match; ++i) {
+ views::View* child = GetChildViewAt(i);
+ gfx::Point point_in_child_coords(point);
+ View::ConvertPointToView(this, child, &point_in_child_coords);
+ if (child->HitTest(point_in_child_coords))
+ return i;
+ }
+ return AutocompletePopupModel::kNoMatch;
+}
+
// static
AutocompletePopupView* AutocompletePopupView::CreatePopupView(
const gfx::Font& font,
diff --git a/chrome/browser/views/autocomplete/autocomplete_popup_contents_view.h b/chrome/browser/views/autocomplete/autocomplete_popup_contents_view.h
index 3104fd7..856b3b6 100644
--- a/chrome/browser/views/autocomplete/autocomplete_popup_contents_view.h
+++ b/chrome/browser/views/autocomplete/autocomplete_popup_contents_view.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2009 The Chromium Authors. All rights reserved. Use of this
+// Copyright (c) 2010 The Chromium Authors. All rights reserved. Use of this
// source code is governed by a BSD-style license that can be found in the
// LICENSE file.
@@ -33,16 +33,6 @@ class AutocompleteResultViewModel {
// Returns true if the index is hovered.
virtual bool IsHoveredIndex(size_t index) const = 0;
-
- // Called when the line at the specified index should be opened with the
- // provided disposition.
- virtual void OpenIndex(size_t index, WindowOpenDisposition disposition) = 0;
-
- // Called when the line at the specified index should be shown as hovered.
- virtual void SetHoveredLine(size_t index) = 0;
-
- // Called when the line at the specified index should be shown as selected.
- virtual void SetSelectedLine(size_t index, bool revert_to_default) = 0;
};
// A view representing the contents of the autocomplete popup.
@@ -72,9 +62,6 @@ class AutocompletePopupContentsView : public views::View,
// Overridden from AutocompleteResultViewModel:
virtual bool IsSelectedIndex(size_t index) const;
virtual bool IsHoveredIndex(size_t index) const;
- virtual void OpenIndex(size_t index, WindowOpenDisposition disposition);
- virtual void SetHoveredLine(size_t index);
- virtual void SetSelectedLine(size_t index, bool revert_to_default);
// Overridden from AnimationDelegate:
virtual void AnimationProgressed(const Animation* animation);
@@ -85,6 +72,13 @@ class AutocompletePopupContentsView : public views::View,
// We paint our children inside Paint().
}
virtual void Layout();
+ virtual void OnMouseEntered(const views::MouseEvent& event);
+ virtual void OnMouseMoved(const views::MouseEvent& event);
+ virtual void OnMouseExited(const views::MouseEvent& event);
+ virtual bool OnMousePressed(const views::MouseEvent& event);
+ virtual void OnMouseReleased(const views::MouseEvent& event, bool canceled);
+ virtual bool OnMouseDragged(const views::MouseEvent& event);
+ virtual views::View* GetViewForPoint(const gfx::Point& point);
private:
#if defined(OS_WIN)
@@ -109,6 +103,14 @@ class AutocompletePopupContentsView : public views::View,
// Makes the contents of the canvas slightly transparent.
void MakeCanvasTransparent(gfx::Canvas* canvas);
+ // Called when the line at the specified index should be opened with the
+ // provided disposition.
+ void OpenIndex(size_t index, WindowOpenDisposition disposition);
+
+ // Find the index of the match under the given |point|, specified in window
+ // coordinates.
+ int GetIndexForPoint(const gfx::Point& point);
+
// The popup that contains this view.
scoped_ptr<AutocompletePopupClass> popup_;