// Copyright (c) 2013 GitHub, Inc. // Use of this source code is governed by the MIT license that can be // found in the LICENSE file. #ifndef SHELL_BROWSER_API_ATOM_API_MENU_H_ #define SHELL_BROWSER_API_ATOM_API_MENU_H_ #include #include #include "base/callback.h" #include "shell/browser/api/atom_api_top_level_window.h" #include "shell/browser/api/trackable_object.h" #include "shell/browser/ui/atom_menu_model.h" namespace electron { namespace api { class Menu : public mate::TrackableObject, public AtomMenuModel::Delegate, public AtomMenuModel::Observer { public: static mate::WrappableBase* New(mate::Arguments* args); static void BuildPrototype(v8::Isolate* isolate, v8::Local prototype); #if defined(OS_MACOSX) // Set the global menubar. static void SetApplicationMenu(Menu* menu); // Fake sending an action from the application menu. static void SendActionToFirstResponder(const std::string& action); #endif AtomMenuModel* model() const { return model_.get(); } protected: Menu(v8::Isolate* isolate, v8::Local wrapper); ~Menu() override; // mate::Wrappable: void AfterInit(v8::Isolate* isolate) override; // ui::SimpleMenuModel::Delegate: bool IsCommandIdChecked(int command_id) const override; bool IsCommandIdEnabled(int command_id) const override; bool IsCommandIdVisible(int command_id) const override; bool ShouldCommandIdWorkWhenHidden(int command_id) const override; bool GetAcceleratorForCommandIdWithParams( int command_id, bool use_default_accelerator, ui::Accelerator* accelerator) const override; bool ShouldRegisterAcceleratorForCommandId(int command_id) const override; void ExecuteCommand(int command_id, int event_flags) override; void OnMenuWillShow(ui::SimpleMenuModel* source) override; virtual void PopupAt(TopLevelWindow* window, int x, int y, int positioning_item, const base::Closure& callback) = 0; virtual void ClosePopupAt(int32_t window_id) = 0; std::unique_ptr model_; Menu* parent_ = nullptr; // Observable: void OnMenuWillClose() override; void OnMenuWillShow() override; private: void InsertItemAt(int index, int command_id, const base::string16& label); void InsertSeparatorAt(int index); void InsertCheckItemAt(int index, int command_id, const base::string16& label); void InsertRadioItemAt(int index, int command_id, const base::string16& label, int group_id); void InsertSubMenuAt(int index, int command_id, const base::string16& label, Menu* menu); void SetIcon(int index, const gfx::Image& image); void SetSublabel(int index, const base::string16& sublabel); void SetToolTip(int index, const base::string16& toolTip); void SetRole(int index, const base::string16& role); void Clear(); int GetIndexOfCommandId(int command_id); int GetItemCount() const; int GetCommandIdAt(int index) const; base::string16 GetLabelAt(int index) const; base::string16 GetSublabelAt(int index) const; base::string16 GetToolTipAt(int index) const; base::string16 GetAcceleratorTextAt(int index) const; bool IsItemCheckedAt(int index) const; bool IsEnabledAt(int index) const; bool IsVisibleAt(int index) const; bool WorksWhenHiddenAt(int index) const; // Stored delegate methods. base::RepeatingCallback, int)> is_checked_; base::RepeatingCallback, int)> is_enabled_; base::RepeatingCallback, int)> is_visible_; base::RepeatingCallback, int)> works_when_hidden_; base::RepeatingCallback(v8::Local, int, bool)> get_accelerator_; base::RepeatingCallback, int)> should_register_accelerator_; base::RepeatingCallback, v8::Local, int)> execute_command_; base::RepeatingCallback)> menu_will_show_; DISALLOW_COPY_AND_ASSIGN(Menu); }; } // namespace api } // namespace electron namespace mate { template <> struct Converter { static bool FromV8(v8::Isolate* isolate, v8::Local val, electron::AtomMenuModel** out) { // null would be tranfered to NULL. if (val->IsNull()) { *out = nullptr; return true; } electron::api::Menu* menu; if (!Converter::FromV8(isolate, val, &menu)) return false; *out = menu->model(); return true; } }; } // namespace mate namespace gin { template <> struct Converter { static bool FromV8(v8::Isolate* isolate, v8::Local val, electron::AtomMenuModel** out) { return mate::ConvertFromV8(isolate, val, out); } }; // TODO(zcbenz): Remove this after converting Menu to gin::Wrapper. template <> struct Converter { static bool FromV8(v8::Isolate* isolate, v8::Local val, electron::api::Menu** out) { return mate::ConvertFromV8(isolate, val, out); } static v8::Local ToV8(v8::Isolate* isolate, electron::api::Menu* in) { return mate::ConvertToV8(isolate, in); } }; } // namespace gin #endif // SHELL_BROWSER_API_ATOM_API_MENU_H_