diff options
author | Vsevolod Kukol <sevoku@microsoft.com> | 2019-10-11 15:21:10 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-10-11 15:21:10 +0300 |
commit | fa7e042f9916e64e984210460ea389e0dc3f05c8 (patch) | |
tree | 7eef923e58cc6d793078297a50bd6b9138719e42 | |
parent | 2149578d723972003692fdb7ee4b7d57ddcb55a6 (diff) | |
parent | 3d7ecd9efd38fe904109e037c0eb0dfa132adc1c (diff) |
Merge pull request #983 from mono/d16-3-fix989519-nssavepanel-crash-catalinad16-3
[d16-3][Mac] Use static NSSavePanel to avoid crashes on Catalina
-rw-r--r-- | Xwt.XamMac/Xwt.Mac/FileDialogBackend.cs | 57 | ||||
-rw-r--r-- | Xwt.XamMac/Xwt.Mac/OpenFileDialogBackend.cs | 20 | ||||
-rw-r--r-- | Xwt.XamMac/Xwt.Mac/SaveFileDialogBackend.cs | 76 | ||||
-rw-r--r-- | Xwt.XamMac/Xwt.Mac/SelectFolderDialogBackend.cs | 38 |
4 files changed, 82 insertions, 109 deletions
diff --git a/Xwt.XamMac/Xwt.Mac/FileDialogBackend.cs b/Xwt.XamMac/Xwt.Mac/FileDialogBackend.cs index f1e46fbc..074dfff4 100644 --- a/Xwt.XamMac/Xwt.Mac/FileDialogBackend.cs +++ b/Xwt.XamMac/Xwt.Mac/FileDialogBackend.cs @@ -30,54 +30,79 @@ using Xwt.Backends; namespace Xwt.Mac { - public abstract class FileDialogBackend - : NSOpenPanel, IFileDialogBackend + public abstract class FileDialogBackend : IFileDialogBackend { - public FileDialogBackend () - { + NSSavePanel panel; + + protected NSSavePanel Panel { + get { + if (panel == null) { + //TODO: since we use static out-of-proc panels, we should store initial values and reset on Cleanup + panel = GetFilePanel (); + } + return panel; + } } #region IFileDialogBackend implementation public void Initialize (System.Collections.Generic.IEnumerable<FileDialogFilter> filters, bool multiselect, string initialFileName) { - this.AllowsMultipleSelection = multiselect; - this.CanChooseFiles = true; - this.CanChooseDirectories = false; if (!string.IsNullOrEmpty (initialFileName)) - this.DirectoryUrl = new NSUrl (initialFileName,true); - - this.Prompt = Application.TranslationCatalog.GetPluralString ("Select File", "Select Files", multiselect ? 2 : 1); + Panel.DirectoryUrl = new NSUrl (initialFileName, true); + + Panel.Prompt = Application.TranslationCatalog.GetPluralString ("Select File", "Select Files", multiselect ? 2 : 1); + + OnInitialize (filters, multiselect, initialFileName); } + protected virtual void OnInitialize (System.Collections.Generic.IEnumerable<FileDialogFilter> filters, bool multiselect, string initialFileName) + { + } + + protected abstract NSSavePanel GetFilePanel (); + public bool Run (IWindowFrameBackend parent) { - var returnValue = this.RunModal (); + var returnValue = Panel.RunModal (); return returnValue == 1; } public void Cleanup () { + //TODO: restore shared panel properties + } + public string Title { + get { + return Panel.Title; + } + set { + Panel.Title = value; + } } public string FileName { get { - return this.Url == null ? string.Empty : Url.Path; + return Panel.Url == null ? string.Empty : Panel.Url.Path; } } - public string[] FileNames { + public string [] FileNames { get { - return this.Urls.Length == 0 ? new string[0] : this.Urls.Select (x=> x.Path).ToArray (); + var openPanel = Panel as NSOpenPanel; + if (openPanel != null) { + return openPanel.Urls.Length == 0 ? new string [0] : openPanel.Urls.Select (x => x.Path).ToArray (); + } + return new string [] { FileName }; } } public string CurrentFolder { get { - return DirectoryUrl.AbsoluteString; + return Panel.DirectoryUrl.AbsoluteString; } set { - this.DirectoryUrl = new NSUrl (value,true); + Panel.DirectoryUrl = new NSUrl (value, true); } } diff --git a/Xwt.XamMac/Xwt.Mac/OpenFileDialogBackend.cs b/Xwt.XamMac/Xwt.Mac/OpenFileDialogBackend.cs index cab55e65..c69f6092 100644 --- a/Xwt.XamMac/Xwt.Mac/OpenFileDialogBackend.cs +++ b/Xwt.XamMac/Xwt.Mac/OpenFileDialogBackend.cs @@ -23,15 +23,31 @@ // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. -using System; +using System.Collections.Generic; +using AppKit; using Xwt.Backends; namespace Xwt.Mac { public class OpenFileDialogBackend : FileDialogBackend, IOpenFileDialogBackend { - public OpenFileDialogBackend () + protected new NSOpenPanel Panel { + get { + return base.Panel as NSOpenPanel; + } + } + + protected override NSSavePanel GetFilePanel () + { + return NSOpenPanel.OpenPanel; + } + + protected override void OnInitialize (IEnumerable<FileDialogFilter> filters, bool multiselect, string initialFileName) { + base.OnInitialize (filters, multiselect, initialFileName); + Panel.AllowsMultipleSelection = multiselect; + Panel.CanChooseFiles = true; + Panel.CanChooseDirectories = false; } } } diff --git a/Xwt.XamMac/Xwt.Mac/SaveFileDialogBackend.cs b/Xwt.XamMac/Xwt.Mac/SaveFileDialogBackend.cs index e24bbf2e..b22f3cbc 100644 --- a/Xwt.XamMac/Xwt.Mac/SaveFileDialogBackend.cs +++ b/Xwt.XamMac/Xwt.Mac/SaveFileDialogBackend.cs @@ -24,87 +24,25 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. +using System.Collections.Generic;
using AppKit; using Foundation; using Xwt.Backends; namespace Xwt.Mac { - public class SaveFileDialogBackend : NSSavePanel, ISaveFileDialogBackend + public class SaveFileDialogBackend : FileDialogBackend, ISaveFileDialogBackend { - public SaveFileDialogBackend () + protected override NSSavePanel GetFilePanel () { + return NSSavePanel.SavePanel; } - #region IFileDialogBackend implementation - public void Initialize (System.Collections.Generic.IEnumerable<FileDialogFilter> filters, bool multiselect, string initialFileName) + protected override void OnInitialize (IEnumerable<FileDialogFilter> filters, bool multiselect, string initialFileName) { - if (!string.IsNullOrEmpty (initialFileName)) - this.DirectoryUrl = new NSUrl (initialFileName,true); + base.OnInitialize (filters, multiselect, initialFileName); - this.Prompt = Application.TranslationCatalog.GetString("Select File"); + Panel.Prompt = Application.TranslationCatalog.GetString ("Select File"); } - - public bool Run (IWindowFrameBackend parent) - { - var returnValue = this.RunModal (); - return returnValue == 1; - } - - public void Cleanup () - { - - } - - public string FileName { - get { - return this.Url == null ? string.Empty : Url.Path; - } - } - - public string[] FileNames { - get { - return this.Url == null ? new string[0] : new string [1] { Url.Path }; - } - } - - public string CurrentFolder { - get { - return DirectoryUrl.AbsoluteString; - } - set { - this.DirectoryUrl = new NSUrl (value,true); - } - } - - public FileDialogFilter ActiveFilter { - get { - return null; - } - set { - - } - } - - #endregion - - #region IBackend implementation - - public void InitializeBackend (object frontend, ApplicationContext context) - { - - } - - public void EnableEvent (object eventId) - { - - } - - public void DisableEvent (object eventId) - { - - } - - #endregion } }
\ No newline at end of file diff --git a/Xwt.XamMac/Xwt.Mac/SelectFolderDialogBackend.cs b/Xwt.XamMac/Xwt.Mac/SelectFolderDialogBackend.cs index d3d32828..798a8300 100644 --- a/Xwt.XamMac/Xwt.Mac/SelectFolderDialogBackend.cs +++ b/Xwt.XamMac/Xwt.Mac/SelectFolderDialogBackend.cs @@ -24,51 +24,45 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. +using System.Collections.Generic;
using System.Linq; using Xwt.Backends; namespace Xwt.Mac { - public class SelectFolderDialogBackend : FileDialogBackend, ISelectFolderDialogBackend + public class SelectFolderDialogBackend : OpenFileDialogBackend, ISelectFolderDialogBackend { - public SelectFolderDialogBackend () - { - } public void Initialize (bool multiselect) { - this.AllowsMultipleSelection = multiselect; - this.CanChooseFiles = false; - this.CanChooseDirectories = true; - this.CanCreateDirectories = false; - - this.Prompt = Application.TranslationCatalog.GetPluralString("Select Directory", "Select Directories", multiselect ? 2 : 1); - - } + Panel.AllowsMultipleSelection = multiselect; + Panel.CanChooseFiles = false; + Panel.CanChooseDirectories = true; + Panel.CanCreateDirectories = false; - #region ISelectFolderDialogBackend implementation + Panel.Prompt = Application.TranslationCatalog.GetPluralString("Select Directory", "Select Directories", multiselect ? 2 : 1); + } - #region ISelectFolderDialogBackend implementation + protected override void OnInitialize (IEnumerable<FileDialogFilter> filters, bool multiselect, string initialFileName) + { + Initialize (multiselect); + } public bool CanCreateFolders { - get { return CanCreateDirectories; } - set { CanCreateDirectories = value; } + get { return Panel.CanCreateDirectories; } + set { Panel.CanCreateDirectories = value; } } - #endregion - public string Folder { get { - return this.Url.Path; + return FileName; } } public string[] Folders { get { - return this.Urls.Select (x=> x.Path).ToArray (); + return FileNames; } } - - #endregion } } |