11package haxe .ui .backend ;
22
33#if !js
4+ import haxe .ui .containers .dialogs .Dialogs .FileDialogExtensionInfo ;
5+ import haxe .ui .containers .dialogs .Dialogs .SelectedFileInfo ;
46import openfl .events .Event ;
7+ import openfl .filesystem .File ;
58import openfl .net .FileFilter ;
69import openfl .net .FileReference ;
710import openfl .utils .ByteArray ;
11+
12+ using StringTools ;
813#end
914
1015class SaveFileDialogImpl extends SaveFileDialogBase {
@@ -34,26 +39,66 @@ class SaveFileDialogImpl extends SaveFileDialogBase {
3439
3540 #else
3641
37- private var _fr : FileReference = null ;
42+ private var _file : File ;
3843
3944 public override function show () {
40- if (fileInfo == null || (fileInfo .text == null && fileInfo .bytes == null )) {
41- throw " Nothing to write" ;
45+ var extensions = null ;
46+ if (options != null ) {
47+ extensions = options .extensions ;
4248 }
43-
44- var data : Dynamic = fileInfo .text ;
45- if (data == null ) {
46- data = ByteArray .fromBytes (fileInfo .bytes );
49+ var data : Dynamic = null ;
50+ var defaultFilename = null ;
51+ if (fileInfo != null ) {
52+ defaultFilename = fileInfo .name ;
53+ if (fileInfo .text != null ) {
54+ data = fileInfo .text ;
55+ } else if (fileInfo .bytes != null ) {
56+ data = ByteArray .fromBytes (fileInfo .bytes );
57+ }
58+ }
59+
60+ _file = new File ();
61+ _file .addEventListener (Event .SELECT , onSelect , false , 0 , true );
62+ _file .addEventListener (Event .CANCEL , onCancel , false , 0 , true );
63+ if (data != null ) {
64+ _file .save (data , defaultFilename );
65+ } else {
66+ _file .browse (buildFileFilters (extensions ));
4767 }
48- _fr = new FileReference ();
49- _fr .addEventListener (Event .SELECT , onSelect , false , 0 , true );
50- _fr .addEventListener (Event .CANCEL , onCancel , false , 0 , true );
51- _fr .save (data , fileInfo .name );
5268 }
5369
70+ private function buildFileFilters (extensions : Array <FileDialogExtensionInfo >): Array <FileFilter > {
71+ if (extensions == null ) {
72+ return null ;
73+ }
74+
75+ var fileFilters : Array <FileFilter > = [];
76+ for (extension in extensions ) {
77+ var extensionList = extension .extension .split (" ," );
78+ var fileFilterExtensions = " " ;
79+ for (extensionItem in extensionList ) {
80+ extensionItem = extensionItem .trim ();
81+ if (extensionItem .length == 0 ) {
82+ continue ;
83+ }
84+
85+ fileFilterExtensions + = " *." + extensionItem + " ;" ;
86+ }
87+ if (fileFilterExtensions .length != 0 ) {
88+ fileFilters .push (new FileFilter (extension .label , fileFilterExtensions ));
89+ }
90+
91+ }
92+ return fileFilters ;
93+ }
94+
5495 private function onSelect (e : Event ) {
96+ var selectedFileInfo : SelectedFileInfo = {
97+ name : _file .name ,
98+ fullPath : _file .nativePath
99+ }
55100 destroyFileRef ();
56- dialogConfirmed ();
101+ dialogConfirmed (selectedFileInfo );
57102 }
58103
59104 private function onCancel (e : Event ) {
@@ -62,13 +107,13 @@ class SaveFileDialogImpl extends SaveFileDialogBase {
62107 }
63108
64109 private function destroyFileRef () {
65- if (_fr == null ) {
110+ if (_file == null ) {
66111 return ;
67112 }
68113
69- _fr .removeEventListener (Event .SELECT , onSelect );
70- _fr .removeEventListener (Event .CANCEL , onCancel );
71- _fr = null ;
114+ _file .removeEventListener (Event .SELECT , onSelect );
115+ _file .removeEventListener (Event .CANCEL , onCancel );
116+ _file = null ;
72117 }
73118
74119 #end
0 commit comments