| 
									
										
										
										
											2013-05-06 20:27:09 +08:00
										 |  |  | // Copyright (c) 2013 GitHub, Inc. All rights reserved.
 | 
					
						
							|  |  |  | // Use of this source code is governed by a BSD-style license that can be
 | 
					
						
							|  |  |  | // found in the LICENSE file.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "browser/api/atom_api_menu.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-13 17:07:25 +08:00
										 |  |  | #include "browser/ui/accelerator_util.h"
 | 
					
						
							| 
									
										
										
										
											2013-09-23 23:00:58 +08:00
										 |  |  | #include "common/v8_conversions.h"
 | 
					
						
							| 
									
										
										
										
											2013-05-14 19:26:16 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-07 00:03:34 +08:00
										 |  |  | #define UNWRAP_MEMNU_AND_CHECK \
 | 
					
						
							|  |  |  |   Menu* self = ObjectWrap::Unwrap<Menu>(args.This()); \ | 
					
						
							|  |  |  |   if (self == NULL) \ | 
					
						
							|  |  |  |     return node::ThrowError("Menu is already destroyed") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-06 20:27:09 +08:00
										 |  |  | namespace atom { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace api { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-07 00:03:34 +08:00
										 |  |  | namespace { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-14 19:26:16 +08:00
										 |  |  | // Call method of delegate object.
 | 
					
						
							|  |  |  | v8::Handle<v8::Value> CallDelegate(v8::Handle<v8::Value> default_value, | 
					
						
							|  |  |  |                                    v8::Handle<v8::Object> menu, | 
					
						
							|  |  |  |                                    const char* method, | 
					
						
							|  |  |  |                                    int command_id) { | 
					
						
							|  |  |  |   v8::HandleScope scope; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   v8::Handle<v8::Value> delegate = menu->Get(v8::String::New("delegate")); | 
					
						
							|  |  |  |   if (!delegate->IsObject()) | 
					
						
							|  |  |  |     return default_value; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   v8::Handle<v8::Function> function = v8::Handle<v8::Function>::Cast( | 
					
						
							|  |  |  |       delegate->ToObject()->Get(v8::String::New(method))); | 
					
						
							|  |  |  |   if (!function->IsFunction()) | 
					
						
							|  |  |  |     return default_value; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-16 15:32:37 +08:00
										 |  |  |   v8::Handle<v8::Value> argv = v8::Integer::New(command_id); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-14 19:26:16 +08:00
										 |  |  |   return scope.Close( | 
					
						
							| 
									
										
										
										
											2013-05-16 15:32:37 +08:00
										 |  |  |       function->Call(v8::Context::GetCurrent()->Global(), 1, &argv)); | 
					
						
							| 
									
										
										
										
											2013-05-14 19:26:16 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-07 00:03:34 +08:00
										 |  |  | }  // namespace
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-06 20:27:09 +08:00
										 |  |  | Menu::Menu(v8::Handle<v8::Object> wrapper) | 
					
						
							|  |  |  |     : EventEmitter(wrapper), | 
					
						
							|  |  |  |       model_(new ui::SimpleMenuModel(this)) { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Menu::~Menu() { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | bool Menu::IsCommandIdChecked(int command_id) const { | 
					
						
							| 
									
										
										
										
											2013-05-16 10:54:37 +08:00
										 |  |  |   v8::HandleScope scope; | 
					
						
							| 
									
										
										
										
											2013-05-14 19:26:16 +08:00
										 |  |  |   return CallDelegate(v8::False(), | 
					
						
							|  |  |  |                       handle(), | 
					
						
							|  |  |  |                       "isCommandIdChecked", | 
					
						
							|  |  |  |                       command_id)->BooleanValue(); | 
					
						
							| 
									
										
										
										
											2013-05-06 20:27:09 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | bool Menu::IsCommandIdEnabled(int command_id) const { | 
					
						
							| 
									
										
										
										
											2013-05-16 10:54:37 +08:00
										 |  |  |   v8::HandleScope scope; | 
					
						
							| 
									
										
										
										
											2013-05-14 19:26:16 +08:00
										 |  |  |   return CallDelegate(v8::True(), | 
					
						
							|  |  |  |                       handle(), | 
					
						
							|  |  |  |                       "isCommandIdEnabled", | 
					
						
							|  |  |  |                       command_id)->BooleanValue(); | 
					
						
							| 
									
										
										
										
											2013-05-06 20:27:09 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-14 16:50:56 +08:00
										 |  |  | bool Menu::IsCommandIdVisible(int command_id) const { | 
					
						
							| 
									
										
										
										
											2013-05-16 10:54:37 +08:00
										 |  |  |   v8::HandleScope scope; | 
					
						
							| 
									
										
										
										
											2013-05-14 19:26:16 +08:00
										 |  |  |   return CallDelegate(v8::True(), | 
					
						
							|  |  |  |                       handle(), | 
					
						
							|  |  |  |                       "isCommandIdVisible", | 
					
						
							|  |  |  |                       command_id)->BooleanValue(); | 
					
						
							| 
									
										
										
										
											2013-05-14 16:50:56 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-06 20:27:09 +08:00
										 |  |  | bool Menu::GetAcceleratorForCommandId(int command_id, | 
					
						
							| 
									
										
										
										
											2013-05-14 19:26:16 +08:00
										 |  |  |                                       ui::Accelerator* accelerator) { | 
					
						
							| 
									
										
										
										
											2013-05-16 10:54:37 +08:00
										 |  |  |   v8::HandleScope scope; | 
					
						
							| 
									
										
										
										
											2013-05-14 21:37:59 +08:00
										 |  |  |   v8::Handle<v8::Value> shortcut = CallDelegate(v8::Undefined(), | 
					
						
							|  |  |  |                                                 handle(), | 
					
						
							|  |  |  |                                                 "getAcceleratorForCommandId", | 
					
						
							|  |  |  |                                                 command_id); | 
					
						
							|  |  |  |   if (shortcut->IsString()) { | 
					
						
							| 
									
										
										
										
											2013-09-24 09:41:54 +08:00
										 |  |  |     std::string shortcut_str = FromV8Value(shortcut); | 
					
						
							| 
									
										
										
										
											2013-05-14 21:37:59 +08:00
										 |  |  |     return accelerator_util::StringToAccelerator(shortcut_str, accelerator); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-06 20:27:09 +08:00
										 |  |  |   return false; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-14 16:50:56 +08:00
										 |  |  | bool Menu::IsItemForCommandIdDynamic(int command_id) const { | 
					
						
							| 
									
										
										
										
											2013-05-16 10:54:37 +08:00
										 |  |  |   v8::HandleScope scope; | 
					
						
							| 
									
										
										
										
											2013-05-14 19:26:16 +08:00
										 |  |  |   return CallDelegate(v8::False(), | 
					
						
							|  |  |  |                       handle(), | 
					
						
							|  |  |  |                       "isItemForCommandIdDynamic", | 
					
						
							|  |  |  |                       command_id)->BooleanValue(); | 
					
						
							| 
									
										
										
										
											2013-05-14 16:50:56 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | string16 Menu::GetLabelForCommandId(int command_id) const { | 
					
						
							| 
									
										
										
										
											2013-05-16 10:54:37 +08:00
										 |  |  |   v8::HandleScope scope; | 
					
						
							| 
									
										
										
										
											2013-09-23 23:00:58 +08:00
										 |  |  |   return FromV8Value(CallDelegate(v8::False(), | 
					
						
							|  |  |  |                                   handle(), | 
					
						
							|  |  |  |                                   "getLabelForCommandId", | 
					
						
							|  |  |  |                                   command_id)); | 
					
						
							| 
									
										
										
										
											2013-05-14 16:50:56 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | string16 Menu::GetSublabelForCommandId(int command_id) const { | 
					
						
							| 
									
										
										
										
											2013-05-16 10:54:37 +08:00
										 |  |  |   v8::HandleScope scope; | 
					
						
							| 
									
										
										
										
											2013-09-23 23:00:58 +08:00
										 |  |  |   return FromV8Value(CallDelegate(v8::False(), | 
					
						
							|  |  |  |                                   handle(), | 
					
						
							|  |  |  |                                   "getSubLabelForCommandId", | 
					
						
							|  |  |  |                                   command_id)); | 
					
						
							| 
									
										
										
										
											2013-05-14 16:50:56 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-06 20:27:09 +08:00
										 |  |  | void Menu::ExecuteCommand(int command_id, int event_flags) { | 
					
						
							| 
									
										
										
										
											2013-05-16 10:54:37 +08:00
										 |  |  |   v8::HandleScope scope; | 
					
						
							| 
									
										
										
										
											2013-05-16 20:06:25 +08:00
										 |  |  |   CallDelegate(v8::False(), handle(), "executeCommand", command_id); | 
					
						
							| 
									
										
										
										
											2013-05-06 20:27:09 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // static
 | 
					
						
							| 
									
										
										
										
											2013-12-10 14:27:25 +08:00
										 |  |  | v8::Handle<v8::Value> Menu::New(const v8::Arguments& args) { | 
					
						
							| 
									
										
										
										
											2013-05-06 20:27:09 +08:00
										 |  |  |   v8::HandleScope scope; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (!args.IsConstructCall()) | 
					
						
							|  |  |  |     return node::ThrowError("Require constructor call"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   Menu::Create(args.This()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return args.This(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-07 00:03:34 +08:00
										 |  |  | // static
 | 
					
						
							| 
									
										
										
										
											2013-12-10 14:27:25 +08:00
										 |  |  | v8::Handle<v8::Value> Menu::InsertItem(const v8::Arguments& args) { | 
					
						
							| 
									
										
										
										
											2013-05-07 00:03:34 +08:00
										 |  |  |   UNWRAP_MEMNU_AND_CHECK; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-09-24 09:41:54 +08:00
										 |  |  |   int index, command_id; | 
					
						
							|  |  |  |   string16 label; | 
					
						
							|  |  |  |   if (!FromV8Arguments(args, &index, &command_id, &label)) | 
					
						
							| 
									
										
										
										
											2013-05-07 00:03:34 +08:00
										 |  |  |     return node::ThrowTypeError("Bad argument"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (index < 0) | 
					
						
							| 
									
										
										
										
											2013-09-24 09:41:54 +08:00
										 |  |  |     self->model_->AddItem(command_id, label); | 
					
						
							| 
									
										
										
										
											2013-05-07 00:03:34 +08:00
										 |  |  |   else | 
					
						
							| 
									
										
										
										
											2013-09-24 09:41:54 +08:00
										 |  |  |     self->model_->InsertItemAt(index, command_id, label); | 
					
						
							| 
									
										
										
										
											2013-05-07 00:03:34 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   return v8::Undefined(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // static
 | 
					
						
							| 
									
										
										
										
											2013-12-10 14:27:25 +08:00
										 |  |  | v8::Handle<v8::Value> Menu::InsertCheckItem(const v8::Arguments& args) { | 
					
						
							| 
									
										
										
										
											2013-05-07 00:03:34 +08:00
										 |  |  |   UNWRAP_MEMNU_AND_CHECK; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-09-24 09:41:54 +08:00
										 |  |  |   int index, command_id; | 
					
						
							|  |  |  |   string16 label; | 
					
						
							|  |  |  |   if (!FromV8Arguments(args, &index, &command_id, &label)) | 
					
						
							| 
									
										
										
										
											2013-05-07 00:03:34 +08:00
										 |  |  |     return node::ThrowTypeError("Bad argument"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (index < 0) | 
					
						
							| 
									
										
										
										
											2013-09-24 09:41:54 +08:00
										 |  |  |     self->model_->AddCheckItem(command_id, label); | 
					
						
							| 
									
										
										
										
											2013-05-07 00:03:34 +08:00
										 |  |  |   else | 
					
						
							| 
									
										
										
										
											2013-09-24 09:41:54 +08:00
										 |  |  |     self->model_->InsertCheckItemAt(index, command_id, label); | 
					
						
							| 
									
										
										
										
											2013-05-07 00:03:34 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   return v8::Undefined(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // static
 | 
					
						
							| 
									
										
										
										
											2013-12-10 14:27:25 +08:00
										 |  |  | v8::Handle<v8::Value> Menu::InsertRadioItem(const v8::Arguments& args) { | 
					
						
							| 
									
										
										
										
											2013-05-07 00:03:34 +08:00
										 |  |  |   UNWRAP_MEMNU_AND_CHECK; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-09-24 09:41:54 +08:00
										 |  |  |   int index, command_id, group_id; | 
					
						
							|  |  |  |   string16 label; | 
					
						
							|  |  |  |   if (!FromV8Arguments(args, &index, &command_id, &label, &group_id)) | 
					
						
							| 
									
										
										
										
											2013-05-07 00:03:34 +08:00
										 |  |  |     return node::ThrowTypeError("Bad argument"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (index < 0) | 
					
						
							| 
									
										
										
										
											2013-09-24 09:41:54 +08:00
										 |  |  |     self->model_->AddRadioItem(command_id, label, group_id); | 
					
						
							| 
									
										
										
										
											2013-05-07 00:03:34 +08:00
										 |  |  |   else | 
					
						
							| 
									
										
										
										
											2013-09-24 09:41:54 +08:00
										 |  |  |     self->model_->InsertRadioItemAt(index, command_id, label, group_id); | 
					
						
							| 
									
										
										
										
											2013-05-07 00:03:34 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   return v8::Undefined(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // static
 | 
					
						
							| 
									
										
										
										
											2013-12-10 14:27:25 +08:00
										 |  |  | v8::Handle<v8::Value> Menu::InsertSeparator(const v8::Arguments& args) { | 
					
						
							| 
									
										
										
										
											2013-05-07 00:03:34 +08:00
										 |  |  |   UNWRAP_MEMNU_AND_CHECK; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-09-24 09:41:54 +08:00
										 |  |  |   int index; | 
					
						
							|  |  |  |   if (!FromV8Arguments(args, &index)) | 
					
						
							| 
									
										
										
										
											2013-05-07 00:03:34 +08:00
										 |  |  |     return node::ThrowTypeError("Bad argument"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (index < 0) | 
					
						
							|  |  |  |     self->model_->AddSeparator(ui::NORMAL_SEPARATOR); | 
					
						
							|  |  |  |   else | 
					
						
							|  |  |  |     self->model_->InsertSeparatorAt(index, ui::NORMAL_SEPARATOR); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return v8::Undefined(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // static
 | 
					
						
							| 
									
										
										
										
											2013-12-10 14:27:25 +08:00
										 |  |  | v8::Handle<v8::Value> Menu::InsertSubMenu(const v8::Arguments& args) { | 
					
						
							| 
									
										
										
										
											2013-05-07 00:03:34 +08:00
										 |  |  |   UNWRAP_MEMNU_AND_CHECK; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-09-24 09:41:54 +08:00
										 |  |  |   int index, command_id; | 
					
						
							|  |  |  |   string16 label; | 
					
						
							|  |  |  |   if (!FromV8Arguments(args, &index, &command_id, &label)) | 
					
						
							| 
									
										
										
										
											2013-05-07 00:03:34 +08:00
										 |  |  |     return node::ThrowTypeError("Bad argument"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   Menu* submenu = ObjectWrap::Unwrap<Menu>(args[3]->ToObject()); | 
					
						
							|  |  |  |   if (!submenu) | 
					
						
							|  |  |  |     return node::ThrowTypeError("The submenu is already destroyed"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (index < 0) | 
					
						
							| 
									
										
										
										
											2013-09-24 09:41:54 +08:00
										 |  |  |     self->model_->AddSubMenu(command_id, label, submenu->model_.get()); | 
					
						
							| 
									
										
										
										
											2013-05-07 00:03:34 +08:00
										 |  |  |   else | 
					
						
							|  |  |  |     self->model_->InsertSubMenuAt( | 
					
						
							| 
									
										
										
										
											2013-09-24 09:41:54 +08:00
										 |  |  |         index, command_id, label, submenu->model_.get()); | 
					
						
							| 
									
										
										
										
											2013-05-07 00:03:34 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   return v8::Undefined(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // static
 | 
					
						
							| 
									
										
										
										
											2013-12-10 14:27:25 +08:00
										 |  |  | v8::Handle<v8::Value> Menu::SetIcon(const v8::Arguments& args) { | 
					
						
							| 
									
										
										
										
											2013-05-07 00:03:34 +08:00
										 |  |  |   UNWRAP_MEMNU_AND_CHECK; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-09-24 09:41:54 +08:00
										 |  |  |   int index; | 
					
						
							|  |  |  |   base::FilePath path; | 
					
						
							|  |  |  |   if (!FromV8Arguments(args, &index, &path)) | 
					
						
							| 
									
										
										
										
											2013-05-07 00:03:34 +08:00
										 |  |  |     return node::ThrowTypeError("Bad argument"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // FIXME use webkit_glue's image decoder here.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return v8::Undefined(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // static
 | 
					
						
							| 
									
										
										
										
											2013-12-10 14:27:25 +08:00
										 |  |  | v8::Handle<v8::Value> Menu::SetSublabel(const v8::Arguments& args) { | 
					
						
							| 
									
										
										
										
											2013-05-07 00:03:34 +08:00
										 |  |  |   UNWRAP_MEMNU_AND_CHECK; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-09-24 09:41:54 +08:00
										 |  |  |   int index; | 
					
						
							|  |  |  |   string16 label; | 
					
						
							|  |  |  |   if (!FromV8Arguments(args, &index, &label)) | 
					
						
							| 
									
										
										
										
											2013-05-07 00:03:34 +08:00
										 |  |  |     return node::ThrowTypeError("Bad argument"); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-09-24 09:41:54 +08:00
										 |  |  |   self->model_->SetSublabel(index, label); | 
					
						
							| 
									
										
										
										
											2013-05-07 00:03:34 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   return v8::Undefined(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // static
 | 
					
						
							| 
									
										
										
										
											2013-12-10 14:27:25 +08:00
										 |  |  | v8::Handle<v8::Value> Menu::Clear(const v8::Arguments& args) { | 
					
						
							| 
									
										
										
										
											2013-05-07 00:03:34 +08:00
										 |  |  |   UNWRAP_MEMNU_AND_CHECK; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   self->model_->Clear(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return v8::Undefined(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // static
 | 
					
						
							| 
									
										
										
										
											2013-12-10 14:27:25 +08:00
										 |  |  | v8::Handle<v8::Value> Menu::GetIndexOfCommandId(const v8::Arguments& args) { | 
					
						
							| 
									
										
										
										
											2013-05-07 00:03:34 +08:00
										 |  |  |   UNWRAP_MEMNU_AND_CHECK; | 
					
						
							| 
									
										
										
										
											2013-05-07 11:43:21 +08:00
										 |  |  |   int index = args[0]->IntegerValue(); | 
					
						
							|  |  |  |   return v8::Integer::New(self->model_->GetIndexOfCommandId(index)); | 
					
						
							| 
									
										
										
										
											2013-05-07 00:03:34 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // static
 | 
					
						
							| 
									
										
										
										
											2013-12-10 14:27:25 +08:00
										 |  |  | v8::Handle<v8::Value> Menu::GetItemCount(const v8::Arguments& args) { | 
					
						
							| 
									
										
										
										
											2013-05-07 00:03:34 +08:00
										 |  |  |   UNWRAP_MEMNU_AND_CHECK; | 
					
						
							|  |  |  |   return v8::Integer::New(self->model_->GetItemCount()); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // static
 | 
					
						
							| 
									
										
										
										
											2013-12-10 14:27:25 +08:00
										 |  |  | v8::Handle<v8::Value> Menu::GetCommandIdAt(const v8::Arguments& args) { | 
					
						
							| 
									
										
										
										
											2013-05-07 00:03:34 +08:00
										 |  |  |   UNWRAP_MEMNU_AND_CHECK; | 
					
						
							| 
									
										
										
										
											2013-05-07 11:43:21 +08:00
										 |  |  |   int index = args[0]->IntegerValue(); | 
					
						
							|  |  |  |   return v8::Integer::New(self->model_->GetCommandIdAt(index)); | 
					
						
							| 
									
										
										
										
											2013-05-07 00:03:34 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // static
 | 
					
						
							| 
									
										
										
										
											2013-12-10 14:27:25 +08:00
										 |  |  | v8::Handle<v8::Value> Menu::GetLabelAt(const v8::Arguments& args) { | 
					
						
							| 
									
										
										
										
											2013-05-07 00:03:34 +08:00
										 |  |  |   UNWRAP_MEMNU_AND_CHECK; | 
					
						
							| 
									
										
										
										
											2013-05-07 11:43:21 +08:00
										 |  |  |   int index = args[0]->IntegerValue(); | 
					
						
							| 
									
										
										
										
											2013-09-23 23:00:58 +08:00
										 |  |  |   return ToV8Value(self->model_->GetLabelAt(index)); | 
					
						
							| 
									
										
										
										
											2013-05-07 00:03:34 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // static
 | 
					
						
							| 
									
										
										
										
											2013-12-10 14:27:25 +08:00
										 |  |  | v8::Handle<v8::Value> Menu::GetSublabelAt(const v8::Arguments& args) { | 
					
						
							| 
									
										
										
										
											2013-05-07 00:03:34 +08:00
										 |  |  |   UNWRAP_MEMNU_AND_CHECK; | 
					
						
							| 
									
										
										
										
											2013-05-07 11:43:21 +08:00
										 |  |  |   int index = args[0]->IntegerValue(); | 
					
						
							| 
									
										
										
										
											2013-09-23 23:00:58 +08:00
										 |  |  |   return ToV8Value(self->model_->GetSublabelAt(index)); | 
					
						
							| 
									
										
										
										
											2013-05-07 00:03:34 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // static
 | 
					
						
							| 
									
										
										
										
											2013-12-10 14:27:25 +08:00
										 |  |  | v8::Handle<v8::Value> Menu::IsItemCheckedAt(const v8::Arguments& args) { | 
					
						
							| 
									
										
										
										
											2013-05-07 00:03:34 +08:00
										 |  |  |   UNWRAP_MEMNU_AND_CHECK; | 
					
						
							| 
									
										
										
										
											2013-05-07 11:43:21 +08:00
										 |  |  |   int index = args[0]->IntegerValue(); | 
					
						
							|  |  |  |   return v8::Boolean::New(self->model_->IsItemCheckedAt(index)); | 
					
						
							| 
									
										
										
										
											2013-05-07 00:03:34 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // static
 | 
					
						
							| 
									
										
										
										
											2013-12-10 14:27:25 +08:00
										 |  |  | v8::Handle<v8::Value> Menu::IsEnabledAt(const v8::Arguments& args) { | 
					
						
							| 
									
										
										
										
											2013-05-07 00:03:34 +08:00
										 |  |  |   UNWRAP_MEMNU_AND_CHECK; | 
					
						
							|  |  |  |   return v8::Boolean::New(self->model_->IsEnabledAt(args[0]->IntegerValue())); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // static
 | 
					
						
							| 
									
										
										
										
											2013-12-10 14:27:25 +08:00
										 |  |  | v8::Handle<v8::Value> Menu::IsVisibleAt(const v8::Arguments& args) { | 
					
						
							| 
									
										
										
										
											2013-05-07 00:03:34 +08:00
										 |  |  |   UNWRAP_MEMNU_AND_CHECK; | 
					
						
							|  |  |  |   return v8::Boolean::New(self->model_->IsVisibleAt(args[0]->IntegerValue())); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-14 16:50:56 +08:00
										 |  |  | // static
 | 
					
						
							| 
									
										
										
										
											2013-12-10 14:27:25 +08:00
										 |  |  | v8::Handle<v8::Value> Menu::Popup(const v8::Arguments& args) { | 
					
						
							| 
									
										
										
										
											2013-05-14 16:50:56 +08:00
										 |  |  |   UNWRAP_MEMNU_AND_CHECK; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-09-24 09:41:54 +08:00
										 |  |  |   atom::NativeWindow* window; | 
					
						
							|  |  |  |   if (!FromV8Arguments(args, &window)) | 
					
						
							|  |  |  |     return node::ThrowTypeError("Bad argument"); | 
					
						
							| 
									
										
										
										
											2013-05-14 16:50:56 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-09-24 09:41:54 +08:00
										 |  |  |   self->Popup(window); | 
					
						
							| 
									
										
										
										
											2013-05-14 16:50:56 +08:00
										 |  |  |   return v8::Undefined(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-06 20:27:09 +08:00
										 |  |  | // static
 | 
					
						
							|  |  |  | void Menu::Initialize(v8::Handle<v8::Object> target) { | 
					
						
							|  |  |  |   v8::HandleScope scope; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   v8::Local<v8::FunctionTemplate> t(v8::FunctionTemplate::New(Menu::New)); | 
					
						
							|  |  |  |   t->InstanceTemplate()->SetInternalFieldCount(1); | 
					
						
							|  |  |  |   t->SetClassName(v8::String::NewSymbol("Menu")); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-07 00:03:34 +08:00
										 |  |  |   NODE_SET_PROTOTYPE_METHOD(t, "insertItem", InsertItem); | 
					
						
							|  |  |  |   NODE_SET_PROTOTYPE_METHOD(t, "insertCheckItem", InsertCheckItem); | 
					
						
							|  |  |  |   NODE_SET_PROTOTYPE_METHOD(t, "insertRadioItem", InsertRadioItem); | 
					
						
							|  |  |  |   NODE_SET_PROTOTYPE_METHOD(t, "insertSeparator", InsertSeparator); | 
					
						
							|  |  |  |   NODE_SET_PROTOTYPE_METHOD(t, "insertSubMenu", InsertSubMenu); | 
					
						
							| 
									
										
										
										
											2013-05-14 16:50:56 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-07 00:03:34 +08:00
										 |  |  |   NODE_SET_PROTOTYPE_METHOD(t, "setIcon", SetIcon); | 
					
						
							|  |  |  |   NODE_SET_PROTOTYPE_METHOD(t, "setSublabel", SetSublabel); | 
					
						
							| 
									
										
										
										
											2013-05-14 16:50:56 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-07 00:03:34 +08:00
										 |  |  |   NODE_SET_PROTOTYPE_METHOD(t, "clear", Clear); | 
					
						
							| 
									
										
										
										
											2013-05-14 16:50:56 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-07 00:03:34 +08:00
										 |  |  |   NODE_SET_PROTOTYPE_METHOD(t, "getIndexOfCommandId", GetIndexOfCommandId); | 
					
						
							|  |  |  |   NODE_SET_PROTOTYPE_METHOD(t, "getItemCount", GetItemCount); | 
					
						
							|  |  |  |   NODE_SET_PROTOTYPE_METHOD(t, "getCommandIdAt", GetCommandIdAt); | 
					
						
							|  |  |  |   NODE_SET_PROTOTYPE_METHOD(t, "getLabelAt", GetLabelAt); | 
					
						
							|  |  |  |   NODE_SET_PROTOTYPE_METHOD(t, "getSublabelAt", GetSublabelAt); | 
					
						
							|  |  |  |   NODE_SET_PROTOTYPE_METHOD(t, "isItemCheckedAt", IsItemCheckedAt); | 
					
						
							|  |  |  |   NODE_SET_PROTOTYPE_METHOD(t, "isEnabledAt", IsEnabledAt); | 
					
						
							|  |  |  |   NODE_SET_PROTOTYPE_METHOD(t, "isVisibleAt", IsVisibleAt); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-14 16:50:56 +08:00
										 |  |  |   NODE_SET_PROTOTYPE_METHOD(t, "popup", Popup); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-02 21:24:21 +08:00
										 |  |  | #if defined(OS_WIN)
 | 
					
						
							|  |  |  |   NODE_SET_PROTOTYPE_METHOD(t, "attachToWindow", AttachToWindow); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-06 20:27:09 +08:00
										 |  |  |   target->Set(v8::String::NewSymbol("Menu"), t->GetFunction()); | 
					
						
							| 
									
										
										
										
											2013-05-16 10:54:37 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-16 20:31:58 +08:00
										 |  |  | #if defined(OS_MACOSX)
 | 
					
						
							| 
									
										
										
										
											2013-05-16 10:54:37 +08:00
										 |  |  |   NODE_SET_METHOD(target, "setApplicationMenu", SetApplicationMenu); | 
					
						
							| 
									
										
										
										
											2013-05-16 17:25:02 +08:00
										 |  |  |   NODE_SET_METHOD( | 
					
						
							|  |  |  |       target, "sendActionToFirstResponder", SendActionToFirstResponder); | 
					
						
							| 
									
										
										
										
											2013-05-16 20:31:58 +08:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2013-05-06 20:27:09 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | }  // namespace api
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | }  // namespace atom
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | NODE_MODULE(atom_browser_menu, atom::api::Menu::Initialize) |