// 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 "atom/browser/api/atom_api_dialog.h" #include #include #include "base/bind.h" #include "atom/browser/native_window.h" #include "atom/browser/ui/file_dialog.h" #include "atom/browser/ui/message_box.h" #include "atom/common/v8/node_common.h" #include "atom/common/v8/native_type_conversions.h" namespace atom { namespace api { namespace { template void CallV8Function(const RefCountedV8Function& callback, T arg) { v8::Locker locker(node_isolate); v8::HandleScope handle_scope(node_isolate); v8::Handle value = ToV8Value(arg); callback->NewHandle(node_isolate)->Call( v8::Context::GetCurrent()->Global(), 1, &value); } template void CallV8Function2(const RefCountedV8Function& callback, bool result, T arg) { if (result) return CallV8Function(callback, arg); else return CallV8Function(callback, NULL); } void Initialize(v8::Handle target) { NODE_SET_METHOD(target, "showMessageBox", ShowMessageBox); NODE_SET_METHOD(target, "showOpenDialog", ShowOpenDialog); NODE_SET_METHOD(target, "showSaveDialog", ShowSaveDialog); } } // namespace void ShowMessageBox(const v8::FunctionCallbackInfo& args) { int type; std::vector buttons; std::string title, message, detail; if (!FromV8Arguments(args, &type, &buttons, &title, &message, &detail)) return node::ThrowTypeError("Bad argument"); NativeWindow* native_window = FromV8Value(args[5]); if (!args[6]->IsFunction()) { int chosen = atom::ShowMessageBox( native_window, (MessageBoxType)type, buttons, title, message, detail); args.GetReturnValue().Set(chosen); } else { RefCountedV8Function callback = FromV8Value(args[6]); atom::ShowMessageBox( native_window, (MessageBoxType)type, buttons, title, message, detail, base::Bind(&CallV8Function, callback)); } } void ShowOpenDialog(const v8::FunctionCallbackInfo& args) { std::string title; base::FilePath default_path; int properties; if (!FromV8Arguments(args, &title, &default_path, &properties)) return node::ThrowTypeError("Bad argument"); NativeWindow* native_window = FromV8Value(args[3]); if (!args[4]->IsFunction()) { std::vector paths; if (!file_dialog::ShowOpenDialog(native_window, title, default_path, properties, &paths)) return; v8::Handle result = v8::Array::New(paths.size()); for (size_t i = 0; i < paths.size(); ++i) result->Set(i, ToV8Value(paths[i])); args.GetReturnValue().Set(result); } else { RefCountedV8Function callback = FromV8Value(args[4]); file_dialog::ShowOpenDialog( native_window, title, default_path, properties, base::Bind(&CallV8Function2&>, callback)); } } void ShowSaveDialog(const v8::FunctionCallbackInfo& args) { std::string title; base::FilePath default_path; if (!FromV8Arguments(args, &title, &default_path)) return node::ThrowTypeError("Bad argument"); NativeWindow* native_window = FromV8Value(args[2]); if (!args[3]->IsFunction()) { base::FilePath path; if (file_dialog::ShowSaveDialog(native_window, title, default_path, &path)) args.GetReturnValue().Set(ToV8Value(path)); } else { RefCountedV8Function callback = FromV8Value(args[3]); file_dialog::ShowSaveDialog( native_window, title, default_path, base::Bind(&CallV8Function2, callback)); } } } // namespace api } // namespace atom NODE_MODULE(atom_browser_dialog, atom::api::Initialize)