| Index: views/controls/menu/native_menu_win.h
|
| ===================================================================
|
| --- views/controls/menu/native_menu_win.h (revision 0)
|
| +++ views/controls/menu/native_menu_win.h (revision 0)
|
| @@ -0,0 +1,140 @@
|
| +// Copyright (c) 2009 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.
|
| +
|
| +#ifndef VIEWS_CONTROLS_MENU_NATIVE_MENU_WIN_H_
|
| +#define VIEWS_CONTROLS_MENU_NATIVE_MENU_WIN_H_
|
| +
|
| +#include <vector>
|
| +
|
| +#include "base/scoped_ptr.h"
|
| +#include "views/controls/menu/menu_wrapper.h"
|
| +#include "views/controls/menu/simple_menu_model.h"
|
| +
|
| +namespace views {
|
| +
|
| +class Menu2Delegate;
|
| +class Menu2Model;
|
| +
|
| +// A Windows implementation of MenuWrapper.
|
| +// TODO(beng): rename to MenuWin once the old class is dead.
|
| +class NativeMenuWin : public MenuWrapper {
|
| + public:
|
| + // Construct a NativeMenuWin, with a model and delegate. If |system_menu_for|
|
| + // is non-NULL, the NativeMenuWin wraps the system menu for that window.
|
| + // The caller owns the model and the delegate.
|
| + NativeMenuWin(Menu2Model* model,
|
| + Menu2Delegate* delegate,
|
| + HWND system_menu_for);
|
| + virtual ~NativeMenuWin();
|
| +
|
| + // Overridden from MenuWrapper:
|
| + virtual void RunMenuAt(const gfx::Point& point, int alignment);
|
| + virtual void Rebuild();
|
| + virtual void UpdateStates();
|
| + virtual gfx::NativeMenu GetNativeMenu() const;
|
| +
|
| + private:
|
| + // IMPORTANT: Note about indices.
|
| + // Functions in this class deal in two index spaces:
|
| + // 1. menu_index - the index of an item within the actual Windows
|
| + // native menu.
|
| + // 2. model_index - the index of the item within our model.
|
| + // These two are most often but not always the same value! The
|
| + // notable exception is when this object is used to wrap the
|
| + // Windows System Menu. In this instance, the model indices start
|
| + // at 0, but the insertion index into the existing menu is not.
|
| + // It is important to take this into consideration when editing the
|
| + // code in the functions in this class.
|
| +
|
| + // Returns true if the item at the specified index is a separator.
|
| + bool IsSeparatorItemAt(int menu_index) const;
|
| +
|
| + // Add items. See note above about indices.
|
| + void AddMenuItemAt(int menu_index, int model_index);
|
| + void AddSeparatorItemAt(int menu_index, int model_index);
|
| +
|
| + // Sets the state of the item at the specified index.
|
| + void SetMenuItemState(int menu_index,
|
| + bool enabled,
|
| + bool checked,
|
| + bool is_default);
|
| +
|
| + // Sets the label of the item at the specified index.
|
| + void SetMenuItemLabel(int menu_index,
|
| + int model_index,
|
| + const std::wstring& label);
|
| +
|
| + // Updates the local data structure with the correctly formatted version of
|
| + // |label| at the specified model_index, and adds string data to |mii| if
|
| + // the menu is not owner-draw. That's a mouthful. This function exists because
|
| + // of the peculiarities of the Windows menu API.
|
| + void UpdateMenuItemInfoForString(MENUITEMINFO* mii,
|
| + int model_index,
|
| + const std::wstring& label);
|
| +
|
| + // Returns the NativeMenuWin object that contains an item with the specified
|
| + // command id. This function must only be called from RunMenuAt!
|
| + NativeMenuWin* GetMenuForCommandId(UINT command_id) const;
|
| +
|
| + // Returns the alignment flags to be passed to TrackPopupMenuEx, based on the
|
| + // supplied alignment and the UI text direction.
|
| + UINT GetAlignmentFlags(int alignment) const;
|
| +
|
| + // Resets the native menu stored in |menu_| by destroying any old menu then
|
| + // creating a new empty one.
|
| + void ResetNativeMenu();
|
| +
|
| + // Creates the host window that receives notifications from the menu.
|
| + void CreateHostWindow();
|
| +
|
| + // Our attached model and delegate.
|
| + Menu2Model* model_;
|
| + Menu2Delegate* delegate_;
|
| +
|
| + HMENU menu_;
|
| +
|
| + // True if the contents of menu items in this menu are drawn by the menu host
|
| + // window, rather than Windows.
|
| + bool owner_draw_;
|
| +
|
| + // An object that collects all of the data associated with an individual menu
|
| + // item.
|
| + struct ItemData;
|
| + std::vector<ItemData*> items_;
|
| +
|
| + // The window that receives notifications from the menu.
|
| + class MenuHostWindow;
|
| + scoped_ptr<MenuHostWindow> host_window_;
|
| +
|
| + // The HWND this menu is the system menu for, or NULL if the menu is not a
|
| + // system menu.
|
| + HWND system_menu_for_;
|
| +
|
| + // The index of the first item in the model in the menu.
|
| + int first_item_index_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(NativeMenuWin);
|
| +};
|
| +
|
| +// A SimpleMenuModel subclass that allows the system menu for a window to be
|
| +// wrapped.
|
| +class SystemMenuModel : public SimpleMenuModel {
|
| + public:
|
| + explicit SystemMenuModel(Delegate* delegate);
|
| + virtual ~SystemMenuModel();
|
| +
|
| + // Overridden from Menu2Model:
|
| + virtual int GetFirstItemIndex(gfx::NativeMenu native_menu) const;
|
| +
|
| + protected:
|
| + // Overridden from SimpleMenuModel:
|
| + virtual int FlipIndex(int index) const { return GetItemCount() - index - 1; }
|
| +
|
| + private:
|
| + DISALLOW_COPY_AND_ASSIGN(SystemMenuModel);
|
| +};
|
| +
|
| +} // namespace views
|
| +
|
| +#endif // VIEWS_CONTROLS_MENU_NATIVE_MENU_WIN_H_
|
|
|