OLD | NEW |
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 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 "chrome/views/chrome_menu.h" | 5 #include "chrome/views/chrome_menu.h" |
6 | 6 |
7 #include <windows.h> | 7 #include <windows.h> |
8 #include <uxtheme.h> | 8 #include <uxtheme.h> |
9 #include <Vssym32.h> | 9 #include <Vssym32.h> |
10 | 10 |
(...skipping 1717 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1728 return; | 1728 return; |
1729 | 1729 |
1730 if (possible_drag_) { | 1730 if (possible_drag_) { |
1731 if (ChromeViews::View::ExceededDragThreshold(event.x() - press_x_, | 1731 if (ChromeViews::View::ExceededDragThreshold(event.x() - press_x_, |
1732 event.y() - press_y_)) { | 1732 event.y() - press_y_)) { |
1733 MenuItemView* item = state_.item; | 1733 MenuItemView* item = state_.item; |
1734 DCHECK(item); | 1734 DCHECK(item); |
1735 // Points are in the coordinates of the submenu, need to map to that of | 1735 // Points are in the coordinates of the submenu, need to map to that of |
1736 // the selected item. Additionally source may not be the parent of | 1736 // the selected item. Additionally source may not be the parent of |
1737 // the selected item, so need to map to screen first then to item. | 1737 // the selected item, so need to map to screen first then to item. |
1738 CPoint press_loc(press_x_, press_y_); | 1738 gfx::Point press_loc(press_x_, press_y_); |
1739 View::ConvertPointToScreen(source->GetScrollViewContainer(), &press_loc); | 1739 View::ConvertPointToScreen(source->GetScrollViewContainer(), &press_loc); |
1740 View::ConvertPointToView(NULL, item, &press_loc); | 1740 View::ConvertPointToView(NULL, item, &press_loc); |
1741 CPoint drag_loc(event.x(), event.y()); | 1741 gfx::Point drag_loc(event.location()); |
1742 View::ConvertPointToScreen(source->GetScrollViewContainer(), &drag_loc); | 1742 View::ConvertPointToScreen(source->GetScrollViewContainer(), &drag_loc); |
1743 View::ConvertPointToView(NULL, item, &drag_loc); | 1743 View::ConvertPointToView(NULL, item, &drag_loc); |
1744 in_drag_ = true; | 1744 in_drag_ = true; |
1745 ChromeCanvas canvas(item->width(), item->height(), false); | 1745 ChromeCanvas canvas(item->width(), item->height(), false); |
1746 item->Paint(&canvas, true); | 1746 item->Paint(&canvas, true); |
1747 | 1747 |
1748 scoped_refptr<OSExchangeData> data(new OSExchangeData); | 1748 scoped_refptr<OSExchangeData> data(new OSExchangeData); |
1749 item->GetDelegate()->WriteDragData(item, data.get()); | 1749 item->GetDelegate()->WriteDragData(item, data.get()); |
1750 drag_utils::SetDragImageOnDataObject(canvas, item->width(), | 1750 drag_utils::SetDragImageOnDataObject(canvas, item->width(), |
1751 item->height(), press_loc.x, | 1751 item->height(), press_loc.x(), |
1752 press_loc.y, data); | 1752 press_loc.y(), data); |
1753 | 1753 |
1754 scoped_refptr<BaseDragSource> drag_source(new BaseDragSource); | 1754 scoped_refptr<BaseDragSource> drag_source(new BaseDragSource); |
1755 int drag_ops = item->GetDelegate()->GetDragOperations(item); | 1755 int drag_ops = item->GetDelegate()->GetDragOperations(item); |
1756 DWORD effects; | 1756 DWORD effects; |
1757 StopScrolling(); | 1757 StopScrolling(); |
1758 DoDragDrop(data, drag_source, | 1758 DoDragDrop(data, drag_source, |
1759 DragDropTypes::DragOperationToDropEffect(drag_ops), | 1759 DragDropTypes::DragOperationToDropEffect(drag_ops), |
1760 &effects); | 1760 &effects); |
1761 if (GetActiveInstance() == this) { | 1761 if (GetActiveInstance() == this) { |
1762 if (showing_ ) { | 1762 if (showing_ ) { |
(...skipping 27 matching lines...) Expand all Loading... |
1790 MenuPart part = | 1790 MenuPart part = |
1791 GetMenuPartByScreenCoordinate(source, event.x(), event.y()); | 1791 GetMenuPartByScreenCoordinate(source, event.x(), event.y()); |
1792 any_menu_contains_mouse_ = (part.type == MenuPart::MENU_ITEM); | 1792 any_menu_contains_mouse_ = (part.type == MenuPart::MENU_ITEM); |
1793 if (event.IsRightMouseButton() && (part.type == MenuPart::MENU_ITEM && | 1793 if (event.IsRightMouseButton() && (part.type == MenuPart::MENU_ITEM && |
1794 part.menu)) { | 1794 part.menu)) { |
1795 // Set the selection immediately, making sure the submenu is only open | 1795 // Set the selection immediately, making sure the submenu is only open |
1796 // if it already was. | 1796 // if it already was. |
1797 bool open_submenu = (state_.item == pending_state_.item && | 1797 bool open_submenu = (state_.item == pending_state_.item && |
1798 state_.submenu_open); | 1798 state_.submenu_open); |
1799 SetSelection(pending_state_.item, open_submenu, true); | 1799 SetSelection(pending_state_.item, open_submenu, true); |
1800 CPoint loc(event.x(), event.y()); | 1800 gfx::Point loc(event.location()); |
1801 View::ConvertPointToScreen(source->GetScrollViewContainer(), &loc); | 1801 View::ConvertPointToScreen(source->GetScrollViewContainer(), &loc); |
1802 | 1802 |
1803 // If we open a context menu just return now | 1803 // If we open a context menu just return now |
1804 if (part.menu->GetDelegate()->ShowContextMenu( | 1804 if (part.menu->GetDelegate()->ShowContextMenu( |
1805 part.menu, part.menu->GetCommand(), loc.x, loc.y, true)) | 1805 part.menu, part.menu->GetCommand(), loc.x(), loc.y(), true)) |
1806 return; | 1806 return; |
1807 } | 1807 } |
1808 | 1808 |
1809 if (!part.is_scroll() && part.menu && !part.menu->HasSubmenu()) { | 1809 if (!part.is_scroll() && part.menu && !part.menu->HasSubmenu()) { |
1810 if (part.menu->GetDelegate()->IsTriggerableEvent(event)) { | 1810 if (part.menu->GetDelegate()->IsTriggerableEvent(event)) { |
1811 Accept(part.menu, event.GetFlags()); | 1811 Accept(part.menu, event.GetFlags()); |
1812 return; | 1812 return; |
1813 } | 1813 } |
1814 } else if (part.type == MenuPart::MENU_ITEM) { | 1814 } else if (part.type == MenuPart::MENU_ITEM) { |
1815 // User either clicked on empty space, or a menu that has children. | 1815 // User either clicked on empty space, or a menu that has children. |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1860 | 1860 |
1861 void MenuController::OnDragEntered(SubmenuView* source, | 1861 void MenuController::OnDragEntered(SubmenuView* source, |
1862 const DropTargetEvent& event) { | 1862 const DropTargetEvent& event) { |
1863 valid_drop_coordinates_ = false; | 1863 valid_drop_coordinates_ = false; |
1864 } | 1864 } |
1865 | 1865 |
1866 int MenuController::OnDragUpdated(SubmenuView* source, | 1866 int MenuController::OnDragUpdated(SubmenuView* source, |
1867 const DropTargetEvent& event) { | 1867 const DropTargetEvent& event) { |
1868 StopCancelAllTimer(); | 1868 StopCancelAllTimer(); |
1869 | 1869 |
1870 CPoint screen_loc(event.x(), event.y()); | 1870 gfx::Point screen_loc(event.location()); |
1871 View::ConvertPointToScreen(source, &screen_loc); | 1871 View::ConvertPointToScreen(source, &screen_loc); |
1872 if (valid_drop_coordinates_ && screen_loc.x == drop_x_ && | 1872 if (valid_drop_coordinates_ && screen_loc.x() == drop_x_ && |
1873 screen_loc.y == drop_y_) { | 1873 screen_loc.y() == drop_y_) { |
1874 return last_drop_operation_; | 1874 return last_drop_operation_; |
1875 } | 1875 } |
1876 drop_x_ = screen_loc.x; | 1876 drop_x_ = screen_loc.x(); |
1877 drop_y_ = screen_loc.y; | 1877 drop_y_ = screen_loc.y(); |
1878 valid_drop_coordinates_ = true; | 1878 valid_drop_coordinates_ = true; |
1879 | 1879 |
1880 MenuItemView* menu_item = GetMenuItemAt(source, event.x(), event.y()); | 1880 MenuItemView* menu_item = GetMenuItemAt(source, event.x(), event.y()); |
1881 bool over_empty_menu = false; | 1881 bool over_empty_menu = false; |
1882 if (!menu_item) { | 1882 if (!menu_item) { |
1883 // See if we're over an empty menu. | 1883 // See if we're over an empty menu. |
1884 menu_item = GetEmptyMenuItemAt(source, event.x(), event.y()); | 1884 menu_item = GetEmptyMenuItemAt(source, event.x(), event.y()); |
1885 if (menu_item) | 1885 if (menu_item) |
1886 over_empty_menu = true; | 1886 over_empty_menu = true; |
1887 } | 1887 } |
1888 MenuDelegate::DropPosition drop_position = MenuDelegate::DROP_NONE; | 1888 MenuDelegate::DropPosition drop_position = MenuDelegate::DROP_NONE; |
1889 int drop_operation = DragDropTypes::DRAG_NONE; | 1889 int drop_operation = DragDropTypes::DRAG_NONE; |
1890 if (menu_item) { | 1890 if (menu_item) { |
1891 CPoint menu_item_loc(event.x(), event.y()); | 1891 gfx::Point menu_item_loc(event.location()); |
1892 View::ConvertPointToView(source, menu_item, &menu_item_loc); | 1892 View::ConvertPointToView(source, menu_item, &menu_item_loc); |
1893 MenuItemView* query_menu_item; | 1893 MenuItemView* query_menu_item; |
1894 if (!over_empty_menu) { | 1894 if (!over_empty_menu) { |
1895 int menu_item_height = menu_item->height(); | 1895 int menu_item_height = menu_item->height(); |
1896 if (menu_item->HasSubmenu() && | 1896 if (menu_item->HasSubmenu() && |
1897 (menu_item_loc.y > MenuItemView::kDropBetweenPixels && | 1897 (menu_item_loc.y() > MenuItemView::kDropBetweenPixels && |
1898 menu_item_loc.y < (menu_item_height - | 1898 menu_item_loc.y() < (menu_item_height - |
1899 MenuItemView::kDropBetweenPixels))) { | 1899 MenuItemView::kDropBetweenPixels))) { |
1900 drop_position = MenuDelegate::DROP_ON; | 1900 drop_position = MenuDelegate::DROP_ON; |
1901 } else if (menu_item_loc.y < menu_item_height / 2) { | 1901 } else if (menu_item_loc.y() < menu_item_height / 2) { |
1902 drop_position = MenuDelegate::DROP_BEFORE; | 1902 drop_position = MenuDelegate::DROP_BEFORE; |
1903 } else { | 1903 } else { |
1904 drop_position = MenuDelegate::DROP_AFTER; | 1904 drop_position = MenuDelegate::DROP_AFTER; |
1905 } | 1905 } |
1906 query_menu_item = menu_item; | 1906 query_menu_item = menu_item; |
1907 } else { | 1907 } else { |
1908 query_menu_item = menu_item->GetParentMenuItem(); | 1908 query_menu_item = menu_item->GetParentMenuItem(); |
1909 drop_position = MenuDelegate::DROP_ON; | 1909 drop_position = MenuDelegate::DROP_ON; |
1910 } | 1910 } |
1911 drop_operation = menu_item->GetDelegate()->GetDropOperation( | 1911 drop_operation = menu_item->GetDelegate()->GetDropOperation( |
(...skipping 271 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2183 } | 2183 } |
2184 return false; | 2184 return false; |
2185 } | 2185 } |
2186 | 2186 |
2187 MenuController::MenuPart MenuController::GetMenuPartByScreenCoordinate( | 2187 MenuController::MenuPart MenuController::GetMenuPartByScreenCoordinate( |
2188 SubmenuView* source, | 2188 SubmenuView* source, |
2189 int source_x, | 2189 int source_x, |
2190 int source_y) { | 2190 int source_y) { |
2191 MenuPart part; | 2191 MenuPart part; |
2192 | 2192 |
2193 CPoint screen_loc(source_x, source_y); | 2193 gfx::Point screen_loc(source_x, source_y); |
2194 View::ConvertPointToScreen(source->GetScrollViewContainer(), &screen_loc); | 2194 View::ConvertPointToScreen(source->GetScrollViewContainer(), &screen_loc); |
2195 | 2195 |
2196 MenuItemView* item = state_.item; | 2196 MenuItemView* item = state_.item; |
2197 while (item) { | 2197 while (item) { |
2198 if (item->HasSubmenu() && item->GetSubmenu()->IsShowing() && | 2198 if (item->HasSubmenu() && item->GetSubmenu()->IsShowing() && |
2199 GetMenuPartByScreenCoordinateImpl(item->GetSubmenu(), screen_loc, | 2199 GetMenuPartByScreenCoordinateImpl(item->GetSubmenu(), screen_loc, |
2200 &part)) { | 2200 &part)) { |
2201 return part; | 2201 return part; |
2202 } | 2202 } |
2203 item = item->GetParentMenuItem(); | 2203 item = item->GetParentMenuItem(); |
2204 } | 2204 } |
2205 | 2205 |
2206 return part; | 2206 return part; |
2207 } | 2207 } |
2208 | 2208 |
2209 bool MenuController::GetMenuPartByScreenCoordinateImpl( | 2209 bool MenuController::GetMenuPartByScreenCoordinateImpl( |
2210 SubmenuView* menu, | 2210 SubmenuView* menu, |
2211 const CPoint& screen_loc, | 2211 const gfx::Point& screen_loc, |
2212 MenuPart* part) { | 2212 MenuPart* part) { |
2213 // Is the mouse over the scroll buttons? | 2213 // Is the mouse over the scroll buttons? |
2214 CPoint scroll_view_loc = screen_loc; | 2214 gfx::Point scroll_view_loc = screen_loc; |
2215 View* scroll_view_container = menu->GetScrollViewContainer(); | 2215 View* scroll_view_container = menu->GetScrollViewContainer(); |
2216 View::ConvertPointToView(NULL, scroll_view_container, &scroll_view_loc); | 2216 View::ConvertPointToView(NULL, scroll_view_container, &scroll_view_loc); |
2217 if (scroll_view_loc.x < 0 || | 2217 if (scroll_view_loc.x() < 0 || |
2218 scroll_view_loc.x >= scroll_view_container->width() || | 2218 scroll_view_loc.x() >= scroll_view_container->width() || |
2219 scroll_view_loc.y < 0 || | 2219 scroll_view_loc.y() < 0 || |
2220 scroll_view_loc.y >= scroll_view_container->height()) { | 2220 scroll_view_loc.y() >= scroll_view_container->height()) { |
2221 // Point isn't contained in menu. | 2221 // Point isn't contained in menu. |
2222 return false; | 2222 return false; |
2223 } | 2223 } |
2224 if (IsScrollButtonAt(menu, scroll_view_loc.x, scroll_view_loc.y, | 2224 if (IsScrollButtonAt(menu, scroll_view_loc.x(), scroll_view_loc.y(), |
2225 &(part->type))) { | 2225 &(part->type))) { |
2226 part->submenu = menu; | 2226 part->submenu = menu; |
2227 return true; | 2227 return true; |
2228 } | 2228 } |
2229 | 2229 |
2230 // Not over the scroll button. Check the actual menu. | 2230 // Not over the scroll button. Check the actual menu. |
2231 if (DoesSubmenuContainLocation(menu, screen_loc)) { | 2231 if (DoesSubmenuContainLocation(menu, screen_loc)) { |
2232 CPoint menu_loc = screen_loc; | 2232 gfx::Point menu_loc = screen_loc; |
2233 View::ConvertPointToView(NULL, menu, &menu_loc); | 2233 View::ConvertPointToView(NULL, menu, &menu_loc); |
2234 part->menu = GetMenuItemAt(menu, menu_loc.x, menu_loc.y); | 2234 part->menu = GetMenuItemAt(menu, menu_loc.x(), menu_loc.y()); |
2235 part->type = MenuPart::MENU_ITEM; | 2235 part->type = MenuPart::MENU_ITEM; |
2236 return true; | 2236 return true; |
2237 } | 2237 } |
2238 | 2238 |
2239 // While the mouse isn't over a menu item or the scroll buttons of menu, it | 2239 // While the mouse isn't over a menu item or the scroll buttons of menu, it |
2240 // is contained by menu and so we return true. If we didn't return true other | 2240 // is contained by menu and so we return true. If we didn't return true other |
2241 // menus would be searched, even though they are likely obscured by us. | 2241 // menus would be searched, even though they are likely obscured by us. |
2242 return true; | 2242 return true; |
2243 } | 2243 } |
2244 | 2244 |
2245 bool MenuController::DoesSubmenuContainLocation(SubmenuView* submenu, | 2245 bool MenuController::DoesSubmenuContainLocation(SubmenuView* submenu, |
2246 const CPoint& screen_loc) { | 2246 const gfx::Point& screen_loc) { |
2247 CPoint view_loc = screen_loc; | 2247 gfx::Point view_loc = screen_loc; |
2248 View::ConvertPointToView(NULL, submenu, &view_loc); | 2248 View::ConvertPointToView(NULL, submenu, &view_loc); |
2249 gfx::Rect vis_rect = submenu->GetVisibleBounds(); | 2249 gfx::Rect vis_rect = submenu->GetVisibleBounds(); |
2250 return vis_rect.Contains(view_loc.x, view_loc.y); | 2250 return vis_rect.Contains(view_loc.x(), view_loc.y()); |
2251 } | 2251 } |
2252 | 2252 |
2253 void MenuController::CommitPendingSelection() { | 2253 void MenuController::CommitPendingSelection() { |
2254 StopShowTimer(); | 2254 StopShowTimer(); |
2255 | 2255 |
2256 size_t paths_differ_at = 0; | 2256 size_t paths_differ_at = 0; |
2257 std::vector<MenuItemView*> current_path; | 2257 std::vector<MenuItemView*> current_path; |
2258 std::vector<MenuItemView*> new_path; | 2258 std::vector<MenuItemView*> new_path; |
2259 BuildPathsAndCalculateDiff(state_.item, pending_state_.item, ¤t_path, | 2259 BuildPathsAndCalculateDiff(state_.item, pending_state_.item, ¤t_path, |
2260 &new_path, &paths_differ_at); | 2260 &new_path, &paths_differ_at); |
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2448 static_cast<LONG>(state_.monitor_bounds.bottom() - y)); | 2448 static_cast<LONG>(state_.monitor_bounds.bottom() - y)); |
2449 } else { | 2449 } else { |
2450 pref.cy = std::min(pref.cy, static_cast<LONG>( | 2450 pref.cy = std::min(pref.cy, static_cast<LONG>( |
2451 state_.initial_bounds.y() - state_.monitor_bounds.y())); | 2451 state_.initial_bounds.y() - state_.monitor_bounds.y())); |
2452 y = state_.initial_bounds.y() - pref.cy; | 2452 y = state_.initial_bounds.y() - pref.cy; |
2453 } | 2453 } |
2454 } | 2454 } |
2455 } else { | 2455 } else { |
2456 // Not the first menu; position it relative to the bounds of the menu | 2456 // Not the first menu; position it relative to the bounds of the menu |
2457 // item. | 2457 // item. |
2458 CPoint item_loc(0, 0); | 2458 gfx::Point item_loc; |
2459 View::ConvertPointToScreen(item, &item_loc); | 2459 View::ConvertPointToScreen(item, &item_loc); |
2460 | 2460 |
2461 // We must make sure we take into account the UI layout. If the layout is | 2461 // We must make sure we take into account the UI layout. If the layout is |
2462 // RTL, then a 'leading' menu is positioned to the left of the parent menu | 2462 // RTL, then a 'leading' menu is positioned to the left of the parent menu |
2463 // item and not to the right. | 2463 // item and not to the right. |
2464 bool layout_is_rtl = item->UILayoutIsRightToLeft(); | 2464 bool layout_is_rtl = item->UILayoutIsRightToLeft(); |
2465 bool create_on_the_right = (prefer_leading && !layout_is_rtl) || | 2465 bool create_on_the_right = (prefer_leading && !layout_is_rtl) || |
2466 (!prefer_leading && layout_is_rtl); | 2466 (!prefer_leading && layout_is_rtl); |
2467 | 2467 |
2468 if (create_on_the_right) { | 2468 if (create_on_the_right) { |
2469 x = item_loc.x + item->width() - kSubmenuHorizontalInset; | 2469 x = item_loc.x() + item->width() - kSubmenuHorizontalInset; |
2470 if (state_.monitor_bounds.width() != 0 && | 2470 if (state_.monitor_bounds.width() != 0 && |
2471 x + pref.cx > state_.monitor_bounds.right()) { | 2471 x + pref.cx > state_.monitor_bounds.right()) { |
2472 if (layout_is_rtl) | 2472 if (layout_is_rtl) |
2473 *is_leading = true; | 2473 *is_leading = true; |
2474 else | 2474 else |
2475 *is_leading = false; | 2475 *is_leading = false; |
2476 x = item_loc.x - pref.cx + kSubmenuHorizontalInset; | 2476 x = item_loc.x() - pref.cx + kSubmenuHorizontalInset; |
2477 } | 2477 } |
2478 } else { | 2478 } else { |
2479 x = item_loc.x - pref.cx + kSubmenuHorizontalInset; | 2479 x = item_loc.x() - pref.cx + kSubmenuHorizontalInset; |
2480 if (state_.monitor_bounds.width() != 0 && x < state_.monitor_bounds.x()) { | 2480 if (state_.monitor_bounds.width() != 0 && x < state_.monitor_bounds.x()) { |
2481 if (layout_is_rtl) | 2481 if (layout_is_rtl) |
2482 *is_leading = false; | 2482 *is_leading = false; |
2483 else | 2483 else |
2484 *is_leading = true; | 2484 *is_leading = true; |
2485 x = item_loc.x + item->width() - kSubmenuHorizontalInset; | 2485 x = item_loc.x() + item->width() - kSubmenuHorizontalInset; |
2486 } | 2486 } |
2487 } | 2487 } |
2488 y = item_loc.y - kSubmenuBorderSize; | 2488 y = item_loc.y() - kSubmenuBorderSize; |
2489 if (state_.monitor_bounds.width() != 0) { | 2489 if (state_.monitor_bounds.width() != 0) { |
2490 pref.cy = std::min(pref.cy, | 2490 pref.cy = std::min(pref.cy, |
2491 static_cast<LONG>(state_.monitor_bounds.height())); | 2491 static_cast<LONG>(state_.monitor_bounds.height())); |
2492 if (y + pref.cy > state_.monitor_bounds.bottom()) | 2492 if (y + pref.cy > state_.monitor_bounds.bottom()) |
2493 y = state_.monitor_bounds.bottom() - pref.cy; | 2493 y = state_.monitor_bounds.bottom() - pref.cy; |
2494 if (y < state_.monitor_bounds.y()) | 2494 if (y < state_.monitor_bounds.y()) |
2495 y = state_.monitor_bounds.y(); | 2495 y = state_.monitor_bounds.y(); |
2496 } | 2496 } |
2497 } | 2497 } |
2498 | 2498 |
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2629 SetSelection(submenu->GetMenuItemAt(first_match), false, false); | 2629 SetSelection(submenu->GetMenuItemAt(first_match), false, false); |
2630 } else { | 2630 } else { |
2631 SetSelection(submenu->GetMenuItemAt(next_match), false, false); | 2631 SetSelection(submenu->GetMenuItemAt(next_match), false, false); |
2632 } | 2632 } |
2633 } | 2633 } |
2634 return false; | 2634 return false; |
2635 } | 2635 } |
2636 | 2636 |
2637 void MenuController::RepostEvent(SubmenuView* source, | 2637 void MenuController::RepostEvent(SubmenuView* source, |
2638 const MouseEvent& event) { | 2638 const MouseEvent& event) { |
2639 CPoint screen_loc(event.x(), event.y()); | 2639 gfx::Point screen_loc(event.location()); |
2640 View::ConvertPointToScreen(source->GetScrollViewContainer(), &screen_loc); | 2640 View::ConvertPointToScreen(source->GetScrollViewContainer(), &screen_loc); |
2641 HWND window = WindowFromPoint(screen_loc); | 2641 HWND window = WindowFromPoint(screen_loc.ToPOINT()); |
2642 if (window) { | 2642 if (window) { |
2643 #ifdef DEBUG_MENU | 2643 #ifdef DEBUG_MENU |
2644 DLOG(INFO) << "RepostEvent on press"; | 2644 DLOG(INFO) << "RepostEvent on press"; |
2645 #endif | 2645 #endif |
2646 | 2646 |
2647 // Release the capture. | 2647 // Release the capture. |
2648 SubmenuView* submenu = state_.item->GetRootMenuItem()->GetSubmenu(); | 2648 SubmenuView* submenu = state_.item->GetRootMenuItem()->GetSubmenu(); |
2649 submenu->ReleaseCapture(); | 2649 submenu->ReleaseCapture(); |
2650 | 2650 |
2651 if (submenu->host() && submenu->host()->GetHWND() && | 2651 if (submenu->host() && submenu->host()->GetHWND() && |
2652 GetWindowThreadProcessId(submenu->host()->GetHWND(), NULL) != | 2652 GetWindowThreadProcessId(submenu->host()->GetHWND(), NULL) != |
2653 GetWindowThreadProcessId(window, NULL)) { | 2653 GetWindowThreadProcessId(window, NULL)) { |
2654 // Even though we have mouse capture, windows generates a mouse event | 2654 // Even though we have mouse capture, windows generates a mouse event |
2655 // if the other window is in a separate thread. Don't generate an event in | 2655 // if the other window is in a separate thread. Don't generate an event in |
2656 // this case else the target window can get double events leading to bad | 2656 // this case else the target window can get double events leading to bad |
2657 // behavior. | 2657 // behavior. |
2658 return; | 2658 return; |
2659 } | 2659 } |
2660 | 2660 |
2661 // Convert the coordinates to the target window. | 2661 // Convert the coordinates to the target window. |
2662 RECT window_bounds; | 2662 RECT window_bounds; |
2663 GetWindowRect(window, &window_bounds); | 2663 GetWindowRect(window, &window_bounds); |
2664 int window_x = screen_loc.x - window_bounds.left; | 2664 int window_x = screen_loc.x() - window_bounds.left; |
2665 int window_y = screen_loc.y - window_bounds.top; | 2665 int window_y = screen_loc.y() - window_bounds.top; |
2666 | 2666 |
2667 // Determine whether the click was in the client area or not. | 2667 // Determine whether the click was in the client area or not. |
2668 // NOTE: WM_NCHITTEST coordinates are relative to the screen. | 2668 // NOTE: WM_NCHITTEST coordinates are relative to the screen. |
2669 LRESULT nc_hit_result = SendMessage(window, WM_NCHITTEST, 0, | 2669 LRESULT nc_hit_result = SendMessage(window, WM_NCHITTEST, 0, |
2670 MAKELPARAM(screen_loc.x, screen_loc.y)); | 2670 MAKELPARAM(screen_loc.x(), |
| 2671 screen_loc.y())); |
2671 const bool in_client_area = (nc_hit_result == HTCLIENT); | 2672 const bool in_client_area = (nc_hit_result == HTCLIENT); |
2672 | 2673 |
2673 // TODO(sky): this isn't right. The event to generate should correspond | 2674 // TODO(sky): this isn't right. The event to generate should correspond |
2674 // with the event we just got. MouseEvent only tells us what is down, | 2675 // with the event we just got. MouseEvent only tells us what is down, |
2675 // which may differ. Need to add ability to get changed button from | 2676 // which may differ. Need to add ability to get changed button from |
2676 // MouseEvent. | 2677 // MouseEvent. |
2677 int event_type; | 2678 int event_type; |
2678 if (event.IsLeftMouseButton()) | 2679 if (event.IsLeftMouseButton()) |
2679 event_type = in_client_area ? WM_LBUTTONDOWN : WM_NCLBUTTONDOWN; | 2680 event_type = in_client_area ? WM_LBUTTONDOWN : WM_NCLBUTTONDOWN; |
2680 else if (event.IsMiddleMouseButton()) | 2681 else if (event.IsMiddleMouseButton()) |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2722 scroll_task_.reset(new MenuScrollTask()); | 2723 scroll_task_.reset(new MenuScrollTask()); |
2723 scroll_task_->Update(part); | 2724 scroll_task_->Update(part); |
2724 } | 2725 } |
2725 | 2726 |
2726 void MenuController::StopScrolling() { | 2727 void MenuController::StopScrolling() { |
2727 scroll_task_.reset(NULL); | 2728 scroll_task_.reset(NULL); |
2728 } | 2729 } |
2729 | 2730 |
2730 } // namespace ChromeViews | 2731 } // namespace ChromeViews |
2731 | 2732 |
OLD | NEW |