summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsky@google.com <sky@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2008-12-02 23:17:53 +0000
committersky@google.com <sky@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2008-12-02 23:17:53 +0000
commit1af53b4341c2946f628cffcb1cdfcb3ce5091702 (patch)
tree75f76a9142389bdaa0b708218ab7989fd0a48430
parenta0287cbdc1a56a27bf0eb29671942e44c8da599e (diff)
downloadchromium_src-1af53b4341c2946f628cffcb1cdfcb3ce5091702.zip
chromium_src-1af53b4341c2946f628cffcb1cdfcb3ce5091702.tar.gz
chromium_src-1af53b4341c2946f628cffcb1cdfcb3ce5091702.tar.bz2
Fixes context menu behavior of table view. In particular when running
in an RTL locale and right clicking on the icon some times the scrollbar context menu would appear. I've fixed it by subclassing the context menu handling and getting the location from the position of the mouse. BUG=4752 TEST=see bug, but also make sure this doesn't regress 4750 Review URL: http://codereview.chromium.org/13055 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@6252 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/views/table_view.cc58
-rw-r--r--chrome/views/table_view.h3
2 files changed, 43 insertions, 18 deletions
diff --git a/chrome/views/table_view.cc b/chrome/views/table_view.cc
index 52ed457..73f456f1 100644
--- a/chrome/views/table_view.cc
+++ b/chrome/views/table_view.cc
@@ -559,6 +559,46 @@ LRESULT CALLBACK TableView::TableWndProc(HWND window,
static int mouse_down_x, mouse_down_y;
switch (message) {
+ case WM_CONTEXTMENU: {
+ // This addresses two problems seen with context menus in right to left
+ // locales:
+ // 1. The mouse coordinates in the l_param were occasionally wrong in
+ // weird ways. This is most often seen when right clicking on the
+ // list-view twice in a row.
+ // 2. Right clicking on the icon would show the scrollbar menu.
+ //
+ // As a work around this uses the position of the cursor and ignores
+ // the position supplied in the l_param.
+ if (table_view->UILayoutIsRightToLeft() &&
+ (GET_X_LPARAM(l_param) != -1 || GET_Y_LPARAM(l_param) != -1)) {
+ CPoint screen_point;
+ GetCursorPos(&screen_point);
+ CPoint table_point = screen_point;
+ CRect client_rect;
+ if (ScreenToClient(window, &table_point) &&
+ GetClientRect(window, &client_rect) &&
+ client_rect.PtInRect(table_point)) {
+ // The point is over the client area of the table, handle it ourself.
+ // But first select the row if it isn't already selected.
+ LVHITTESTINFO hit_info = {0};
+ hit_info.pt.x = table_point.x;
+ hit_info.pt.y = table_point.y;
+ int view_index = ListView_HitTest(window, &hit_info);
+ if (view_index != -1) {
+ int model_index = table_view->view_to_model(view_index);
+ if (!table_view->IsItemSelected(model_index))
+ table_view->Select(model_index);
+ }
+ table_view->OnContextMenu(screen_point);
+ return 0; // So that default processing doesn't occur.
+ }
+ }
+ // else case: default handling is fine, so break and let the default
+ // handler service the request (which will likely calls us back with
+ // OnContextMenu).
+ break;
+ }
+
case WM_CANCELMODE: {
if (in_mouse_down) {
in_mouse_down = false;
@@ -1060,6 +1100,9 @@ LRESULT TableView::OnNotify(int w_param, LPNMHDR hdr) {
break;
}
+ case LVN_MARQUEEBEGIN: // We don't want the marque selection.
+ return 1;
+
default:
break;
}
@@ -1076,21 +1119,6 @@ void TableView::OnDestroy() {
}
}
-void TableView::OnContextMenu(const CPoint& location) {
- if (!GetContextMenuController())
- return;
-
- if (!UILayoutIsRightToLeft() || (location.x == -1 && location.y == -1)) {
- NativeControl::OnContextMenu(location);
- return;
- }
- // For some reason context menu gestures when rtl have the wrong coordinates;
- // get the position of the cursor and use it.
- CPoint cursor_point;
- GetCursorPos(&cursor_point);
- NativeControl::OnContextMenu(cursor_point);
-}
-
// Returns result, unless ascending is false in which case -result is returned.
static int SwapCompareResult(int result, bool ascending) {
return ascending ? result : -result;
diff --git a/chrome/views/table_view.h b/chrome/views/table_view.h
index 69ad4d4..b02ec24 100644
--- a/chrome/views/table_view.h
+++ b/chrome/views/table_view.h
@@ -472,9 +472,6 @@ class TableView : public NativeControl,
// Overriden to destroy the image list.
virtual void OnDestroy();
- // Overriden to work around bug when RTL.
- virtual void OnContextMenu(const CPoint& location);
-
// Used to sort the two rows. Returns a value < 0, == 0 or > 0 indicating
// whether the row2 comes before row1, row2 is the same as row1 or row1 comes
// after row2. This invokes CompareValues on the model with the sorted column.