| 
									
										
										
										
											2014-10-31 11:17:05 -07:00
										 |  |  | // Copyright (c) 2013 GitHub, Inc.
 | 
					
						
							| 
									
										
										
										
											2014-04-25 17:49:37 +08:00
										 |  |  | // Use of this source code is governed by the MIT license that can be
 | 
					
						
							| 
									
										
										
										
											2013-05-03 19:31:24 +08:00
										 |  |  | // found in the LICENSE file.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-16 09:13:06 +08:00
										 |  |  | #include <string>
 | 
					
						
							| 
									
										
										
										
											2014-08-06 12:44:02 +08:00
										 |  |  | #include <utility>
 | 
					
						
							| 
									
										
										
										
											2014-03-16 09:13:06 +08:00
										 |  |  | #include <vector>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-16 15:14:44 +08:00
										 |  |  | #include "atom/browser/api/atom_api_window.h"
 | 
					
						
							| 
									
										
										
										
											2014-03-16 08:30:26 +08:00
										 |  |  | #include "atom/browser/native_window.h"
 | 
					
						
							|  |  |  | #include "atom/browser/ui/file_dialog.h"
 | 
					
						
							|  |  |  | #include "atom/browser/ui/message_box.h"
 | 
					
						
							| 
									
										
										
										
											2015-08-07 18:10:19 +08:00
										 |  |  | #include "atom/common/native_mate_converters/callback.h"
 | 
					
						
							| 
									
										
										
										
											2014-04-17 13:45:14 +08:00
										 |  |  | #include "atom/common/native_mate_converters/file_path_converter.h"
 | 
					
						
							| 
									
										
										
										
											2015-01-05 15:08:42 -08:00
										 |  |  | #include "atom/common/native_mate_converters/image_converter.h"
 | 
					
						
							| 
									
										
										
										
											2014-04-16 15:14:44 +08:00
										 |  |  | #include "native_mate/dictionary.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-17 13:45:14 +08:00
										 |  |  | #include "atom/common/node_includes.h"
 | 
					
						
							| 
									
										
										
										
											2013-05-03 19:31:24 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-08-06 12:44:02 +08:00
										 |  |  | namespace mate { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | template<> | 
					
						
							|  |  |  | struct Converter<file_dialog::Filter> { | 
					
						
							|  |  |  |   static bool FromV8(v8::Isolate* isolate, | 
					
						
							| 
									
										
										
										
											2015-05-22 19:11:22 +08:00
										 |  |  |                      v8::Local<v8::Value> val, | 
					
						
							| 
									
										
										
										
											2014-08-06 12:44:02 +08:00
										 |  |  |                      file_dialog::Filter* out) { | 
					
						
							| 
									
										
										
										
											2014-09-09 14:13:21 +08:00
										 |  |  |     mate::Dictionary dict; | 
					
						
							| 
									
										
										
										
											2014-08-06 12:44:02 +08:00
										 |  |  |     if (!ConvertFromV8(isolate, val, &dict)) | 
					
						
							|  |  |  |       return false; | 
					
						
							|  |  |  |     if (!dict.Get("name", &(out->first))) | 
					
						
							|  |  |  |       return false; | 
					
						
							|  |  |  |     if (!dict.Get("extensions", &(out->second))) | 
					
						
							|  |  |  |       return false; | 
					
						
							|  |  |  |     return true; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-07 17:32:58 -08:00
										 |  |  | template<> | 
					
						
							|  |  |  | struct Converter<file_dialog::DialogSettings> { | 
					
						
							|  |  |  |   static bool FromV8(v8::Isolate* isolate, | 
					
						
							|  |  |  |                      v8::Local<v8::Value> val, | 
					
						
							|  |  |  |                      file_dialog::DialogSettings* out) { | 
					
						
							|  |  |  |     mate::Dictionary dict; | 
					
						
							|  |  |  |     if (!ConvertFromV8(isolate, val, &dict)) | 
					
						
							|  |  |  |       return false; | 
					
						
							|  |  |  |     dict.Get("window", &(out->parent_window)); | 
					
						
							|  |  |  |     dict.Get("title", &(out->title)); | 
					
						
							| 
									
										
										
										
											2017-02-09 11:25:05 -08:00
										 |  |  |     dict.Get("message", &(out->message)); | 
					
						
							| 
									
										
										
										
											2017-02-07 17:32:58 -08:00
										 |  |  |     dict.Get("buttonLabel", &(out->button_label)); | 
					
						
							| 
									
										
										
										
											2017-02-09 11:25:05 -08:00
										 |  |  |     dict.Get("nameFieldLabel", &(out->name_field_label)); | 
					
						
							| 
									
										
										
										
											2017-02-07 17:32:58 -08:00
										 |  |  |     dict.Get("defaultPath", &(out->default_path)); | 
					
						
							|  |  |  |     dict.Get("filters", &(out->filters)); | 
					
						
							|  |  |  |     dict.Get("properties", &(out->properties)); | 
					
						
							| 
									
										
										
										
											2017-02-09 11:25:05 -08:00
										 |  |  |     dict.Get("showsTagField", &(out->shows_tag_field)); | 
					
						
							| 
									
										
										
										
											2017-02-07 17:32:58 -08:00
										 |  |  |     return true; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-08-06 12:44:02 +08:00
										 |  |  | }  // namespace mate
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-03 19:31:24 +08:00
										 |  |  | namespace { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-16 15:14:44 +08:00
										 |  |  | void ShowMessageBox(int type, | 
					
						
							|  |  |  |                     const std::vector<std::string>& buttons, | 
					
						
							| 
									
										
										
										
											2016-01-10 15:33:27 -08:00
										 |  |  |                     int default_id, | 
					
						
							| 
									
										
										
										
											2015-07-07 18:26:50 +08:00
										 |  |  |                     int cancel_id, | 
					
						
							| 
									
										
										
										
											2015-07-23 14:16:43 +08:00
										 |  |  |                     int options, | 
					
						
							| 
									
										
										
										
											2015-07-23 15:00:42 +08:00
										 |  |  |                     const std::string& title, | 
					
						
							|  |  |  |                     const std::string& message, | 
					
						
							|  |  |  |                     const std::string& detail, | 
					
						
							| 
									
										
										
										
											2017-02-06 15:35:36 +00:00
										 |  |  |                     const std::string& checkbox_label, | 
					
						
							|  |  |  |                     bool checkbox_checked, | 
					
						
							| 
									
										
										
										
											2015-01-05 15:08:42 -08:00
										 |  |  |                     const gfx::ImageSkia& icon, | 
					
						
							| 
									
										
										
										
											2014-04-24 13:10:04 +08:00
										 |  |  |                     atom::NativeWindow* window, | 
					
						
							| 
									
										
										
										
											2014-04-16 15:14:44 +08:00
										 |  |  |                     mate::Arguments* args) { | 
					
						
							| 
									
										
										
										
											2015-05-22 19:11:22 +08:00
										 |  |  |   v8::Local<v8::Value> peek = args->PeekNext(); | 
					
						
							| 
									
										
										
										
											2014-04-18 17:19:15 +08:00
										 |  |  |   atom::MessageBoxCallback callback; | 
					
						
							| 
									
										
										
										
											2014-06-28 19:49:55 +08:00
										 |  |  |   if (mate::Converter<atom::MessageBoxCallback>::FromV8(args->isolate(), | 
					
						
							| 
									
										
										
										
											2014-04-18 17:19:15 +08:00
										 |  |  |                                                         peek, | 
					
						
							|  |  |  |                                                         &callback)) { | 
					
						
							| 
									
										
										
										
											2017-03-31 20:09:13 +02:00
										 |  |  |     atom::ShowMessageBox(window, static_cast<atom::MessageBoxType>(type), | 
					
						
							|  |  |  |                          buttons, default_id, cancel_id, options, title, | 
					
						
							|  |  |  |                          message, detail, checkbox_label, checkbox_checked, | 
					
						
							|  |  |  |                          icon, callback); | 
					
						
							| 
									
										
										
										
											2013-09-23 14:29:55 +08:00
										 |  |  |   } else { | 
					
						
							| 
									
										
										
										
											2017-03-31 20:09:13 +02:00
										 |  |  |     int chosen = atom::ShowMessageBox( | 
					
						
							|  |  |  |         window, static_cast<atom::MessageBoxType>(type), buttons, default_id, | 
					
						
							|  |  |  |         cancel_id, options, title, message, detail, icon); | 
					
						
							| 
									
										
										
										
											2014-04-16 15:14:44 +08:00
										 |  |  |     args->Return(chosen); | 
					
						
							| 
									
										
										
										
											2013-09-23 14:29:55 +08:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2013-05-03 21:03:26 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-07 17:32:58 -08:00
										 |  |  | void ShowOpenDialog(const file_dialog::DialogSettings& settings, | 
					
						
							| 
									
										
										
										
											2014-04-16 15:14:44 +08:00
										 |  |  |                     mate::Arguments* args) { | 
					
						
							| 
									
										
										
										
											2015-05-22 19:11:22 +08:00
										 |  |  |   v8::Local<v8::Value> peek = args->PeekNext(); | 
					
						
							| 
									
										
										
										
											2014-04-18 17:19:15 +08:00
										 |  |  |   file_dialog::OpenDialogCallback callback; | 
					
						
							| 
									
										
										
										
											2014-06-28 19:49:55 +08:00
										 |  |  |   if (mate::Converter<file_dialog::OpenDialogCallback>::FromV8(args->isolate(), | 
					
						
							| 
									
										
										
										
											2014-04-18 17:19:15 +08:00
										 |  |  |                                                                peek, | 
					
						
							|  |  |  |                                                                &callback)) { | 
					
						
							| 
									
										
										
										
											2017-02-07 17:32:58 -08:00
										 |  |  |     file_dialog::ShowOpenDialog(settings, callback); | 
					
						
							| 
									
										
										
										
											2014-04-16 15:14:44 +08:00
										 |  |  |   } else { | 
					
						
							|  |  |  |     std::vector<base::FilePath> paths; | 
					
						
							| 
									
										
										
										
											2017-02-07 17:32:58 -08:00
										 |  |  |     if (file_dialog::ShowOpenDialog(settings, &paths)) | 
					
						
							| 
									
										
										
										
											2014-04-16 15:14:44 +08:00
										 |  |  |       args->Return(paths); | 
					
						
							| 
									
										
										
										
											2013-09-23 19:23:49 +08:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2013-05-03 19:31:24 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-07 17:32:58 -08:00
										 |  |  | void ShowSaveDialog(const file_dialog::DialogSettings& settings, | 
					
						
							| 
									
										
										
										
											2014-04-16 15:14:44 +08:00
										 |  |  |                     mate::Arguments* args) { | 
					
						
							| 
									
										
										
										
											2015-05-22 19:11:22 +08:00
										 |  |  |   v8::Local<v8::Value> peek = args->PeekNext(); | 
					
						
							| 
									
										
										
										
											2014-04-18 17:19:15 +08:00
										 |  |  |   file_dialog::SaveDialogCallback callback; | 
					
						
							| 
									
										
										
										
											2014-06-28 19:49:55 +08:00
										 |  |  |   if (mate::Converter<file_dialog::SaveDialogCallback>::FromV8(args->isolate(), | 
					
						
							| 
									
										
										
										
											2014-04-18 17:19:15 +08:00
										 |  |  |                                                                peek, | 
					
						
							|  |  |  |                                                                &callback)) { | 
					
						
							| 
									
										
										
										
											2017-02-07 17:32:58 -08:00
										 |  |  |     file_dialog::ShowSaveDialog(settings, callback); | 
					
						
							| 
									
										
										
										
											2014-04-16 15:14:44 +08:00
										 |  |  |   } else { | 
					
						
							| 
									
										
										
										
											2013-09-23 20:08:49 +08:00
										 |  |  |     base::FilePath path; | 
					
						
							| 
									
										
										
										
											2017-02-07 17:32:58 -08:00
										 |  |  |     if (file_dialog::ShowSaveDialog(settings, &path)) | 
					
						
							| 
									
										
										
										
											2014-04-16 15:14:44 +08:00
										 |  |  |       args->Return(path); | 
					
						
							| 
									
										
										
										
											2013-09-23 20:08:49 +08:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2013-05-03 19:31:24 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-22 19:11:22 +08:00
										 |  |  | void Initialize(v8::Local<v8::Object> exports, v8::Local<v8::Value> unused, | 
					
						
							|  |  |  |                 v8::Local<v8::Context> context, void* priv) { | 
					
						
							| 
									
										
										
										
											2014-06-29 20:48:44 +08:00
										 |  |  |   mate::Dictionary dict(context->GetIsolate(), exports); | 
					
						
							| 
									
										
										
										
											2014-04-16 15:14:44 +08:00
										 |  |  |   dict.SetMethod("showMessageBox", &ShowMessageBox); | 
					
						
							| 
									
										
										
										
											2014-11-05 16:04:39 +08:00
										 |  |  |   dict.SetMethod("showErrorBox", &atom::ShowErrorBox); | 
					
						
							| 
									
										
										
										
											2014-04-16 15:14:44 +08:00
										 |  |  |   dict.SetMethod("showOpenDialog", &ShowOpenDialog); | 
					
						
							|  |  |  |   dict.SetMethod("showSaveDialog", &ShowSaveDialog); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2013-05-03 19:31:24 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-16 15:14:44 +08:00
										 |  |  | }  // namespace
 | 
					
						
							| 
									
										
										
										
											2013-05-03 19:31:24 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-29 20:48:44 +08:00
										 |  |  | NODE_MODULE_CONTEXT_AWARE_BUILTIN(atom_browser_dialog, Initialize) |