Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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/menu/native_menu_win.h" | 5 #include "views/controls/menu/native_menu_win.h" |
| 6 | 6 |
| 7 #include "app/l10n_util.h" | 7 #include "app/l10n_util.h" |
| 8 #include "app/l10n_util_win.h" | 8 #include "app/l10n_util_win.h" |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "base/message_loop.h" | 10 #include "base/message_loop.h" |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 81 wcex.cbSize = sizeof(WNDCLASSEX); | 81 wcex.cbSize = sizeof(WNDCLASSEX); |
| 82 wcex.style = CS_DBLCLKS; | 82 wcex.style = CS_DBLCLKS; |
| 83 wcex.lpfnWndProc = &MenuHostWindowProc; | 83 wcex.lpfnWndProc = &MenuHostWindowProc; |
| 84 wcex.hbrBackground = reinterpret_cast<HBRUSH>(COLOR_WINDOW+1); | 84 wcex.hbrBackground = reinterpret_cast<HBRUSH>(COLOR_WINDOW+1); |
| 85 wcex.lpszClassName = kWindowClassName; | 85 wcex.lpszClassName = kWindowClassName; |
| 86 ATOM clazz = RegisterClassEx(&wcex); | 86 ATOM clazz = RegisterClassEx(&wcex); |
| 87 DCHECK(clazz); | 87 DCHECK(clazz); |
| 88 registered = true; | 88 registered = true; |
| 89 } | 89 } |
| 90 | 90 |
| 91 NativeMenuWin* GetNativeMenuWinFromHMENU(HMENU hmenu) const { | |
| 92 MENUINFO mi = {0}; | |
| 93 mi.cbSize = sizeof(mi); | |
| 94 mi.fMask = MIM_MENUDATA | MIM_STYLE; | |
| 95 GetMenuInfo(hmenu, &mi); | |
| 96 return reinterpret_cast<NativeMenuWin*>(mi.dwMenuData); | |
| 97 } | |
| 98 | |
| 91 // Converts the WPARAM value passed to WM_MENUSELECT into an index | 99 // Converts the WPARAM value passed to WM_MENUSELECT into an index |
| 92 // corresponding to the menu item that was selected. | 100 // corresponding to the menu item that was selected. |
| 93 int GetMenuItemIndexFromWPARAM(HMENU menu, WPARAM w_param) const { | 101 int GetMenuItemIndexFromWPARAM(HMENU menu, WPARAM w_param) const { |
| 94 int count = GetMenuItemCount(menu); | 102 int count = GetMenuItemCount(menu); |
| 95 // For normal command menu items, Windows passes a command id as the LOWORD | 103 // For normal command menu items, Windows passes a command id as the LOWORD |
| 96 // of WPARAM for WM_MENUSELECT. We need to walk forward through the menu | 104 // of WPARAM for WM_MENUSELECT. We need to walk forward through the menu |
| 97 // items to find an item with a matching ID. Ugh! | 105 // items to find an item with a matching ID. Ugh! |
| 98 for (int i = 0; i < count; ++i) { | 106 for (int i = 0; i < count; ++i) { |
| 99 MENUITEMINFO mii = {0}; | 107 MENUITEMINFO mii = {0}; |
| 100 mii.cbSize = sizeof(mii); | 108 mii.cbSize = sizeof(mii); |
| 101 mii.fMask = MIIM_ID; | 109 mii.fMask = MIIM_ID; |
| 102 GetMenuItemInfo(menu, i, MF_BYPOSITION, &mii); | 110 GetMenuItemInfo(menu, i, MF_BYPOSITION, &mii); |
| 103 if (mii.wID == w_param) | 111 if (mii.wID == w_param) |
| 104 return i; | 112 return i; |
| 105 } | 113 } |
| 106 // If we didn't find a matching command ID, this means a submenu has been | 114 // If we didn't find a matching command ID, this means a submenu has been |
| 107 // selected instead, and rather than passing a command ID in | 115 // selected instead, and rather than passing a command ID in |
| 108 // LOWORD(w_param), Windows has actually passed us a position, so we just | 116 // LOWORD(w_param), Windows has actually passed us a position, so we just |
| 109 // return it. | 117 // return it. |
| 110 return w_param; | 118 return w_param; |
| 111 } | 119 } |
| 112 | 120 |
| 113 NativeMenuWin::ItemData* GetItemData(ULONG_PTR item_data) { | 121 NativeMenuWin::ItemData* GetItemData(ULONG_PTR item_data) { |
| 114 return reinterpret_cast<NativeMenuWin::ItemData*>(item_data); | 122 return reinterpret_cast<NativeMenuWin::ItemData*>(item_data); |
| 115 } | 123 } |
| 116 | 124 |
| 117 // Called when the user selects a specific item. | 125 // Called when the user selects a specific item. |
| 118 void OnMenuCommand(int position, HMENU menu) { | 126 void OnMenuCommand(int position, HMENU menu) { |
| 119 parent_->model_->ActivatedAt(position); | 127 NativeMenuWin* intergoat = GetNativeMenuWinFromHMENU(menu); |
|
asargent_no_longer_on_chrome
2011/01/20 19:56:57
Does the name "intergoat" actually mean something
jam
2011/01/20 20:24:30
I think it's an inside joke :) This is just resur
| |
| 128 ui::MenuModel* model = intergoat->model_; | |
| 129 model->ActivatedAt(position); | |
| 120 } | 130 } |
| 121 | 131 |
| 122 // Called as the user moves their mouse or arrows through the contents of the | 132 // Called as the user moves their mouse or arrows through the contents of the |
| 123 // menu. | 133 // menu. |
| 124 void OnMenuSelect(WPARAM w_param, HMENU menu) { | 134 void OnMenuSelect(WPARAM w_param, HMENU menu) { |
| 135 if (!menu) | |
| 136 return; // menu is null when closing on XP. | |
| 137 | |
| 125 int position = GetMenuItemIndexFromWPARAM(menu, w_param); | 138 int position = GetMenuItemIndexFromWPARAM(menu, w_param); |
| 126 if (position >= 0) | 139 if (position >= 0) |
| 127 parent_->model_->HighlightChangedTo(position); | 140 GetNativeMenuWinFromHMENU(menu)->model_->HighlightChangedTo(position); |
| 128 } | 141 } |
| 129 | 142 |
| 130 // Called by Windows to measure the size of an owner-drawn menu item. | 143 // Called by Windows to measure the size of an owner-drawn menu item. |
| 131 void OnMeasureItem(WPARAM w_param, MEASUREITEMSTRUCT* measure_item_struct) { | 144 void OnMeasureItem(WPARAM w_param, MEASUREITEMSTRUCT* measure_item_struct) { |
| 132 NativeMenuWin::ItemData* data = GetItemData(measure_item_struct->itemData); | 145 NativeMenuWin::ItemData* data = GetItemData(measure_item_struct->itemData); |
| 133 if (data) { | 146 if (data) { |
| 134 gfx::Font font; | 147 gfx::Font font; |
| 135 measure_item_struct->itemWidth = font.GetStringWidth(data->label) + | 148 measure_item_struct->itemWidth = font.GetStringWidth(data->label) + |
| 136 kIconWidth + kItemLeftMargin + kItemRightMargin - | 149 kIconWidth + kItemLeftMargin + kItemRightMargin - |
| 137 GetSystemMetrics(SM_CXMENUCHECK); | 150 GetSystemMetrics(SM_CXMENUCHECK); |
| (...skipping 493 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 631 | 644 |
| 632 //////////////////////////////////////////////////////////////////////////////// | 645 //////////////////////////////////////////////////////////////////////////////// |
| 633 // MenuWrapper, public: | 646 // MenuWrapper, public: |
| 634 | 647 |
| 635 // static | 648 // static |
| 636 MenuWrapper* MenuWrapper::CreateWrapper(Menu2* menu) { | 649 MenuWrapper* MenuWrapper::CreateWrapper(Menu2* menu) { |
| 637 return new NativeMenuWin(menu->model(), NULL); | 650 return new NativeMenuWin(menu->model(), NULL); |
| 638 } | 651 } |
| 639 | 652 |
| 640 } // namespace views | 653 } // namespace views |
| OLD | NEW |