Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/xwt.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVsevolod Kukol <sevoku@microsoft.com>2019-10-11 15:21:10 +0300
committerGitHub <noreply@github.com>2019-10-11 15:21:10 +0300
commitfa7e042f9916e64e984210460ea389e0dc3f05c8 (patch)
tree7eef923e58cc6d793078297a50bd6b9138719e42
parent2149578d723972003692fdb7ee4b7d57ddcb55a6 (diff)
parent3d7ecd9efd38fe904109e037c0eb0dfa132adc1c (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.cs57
-rw-r--r--Xwt.XamMac/Xwt.Mac/OpenFileDialogBackend.cs20
-rw-r--r--Xwt.XamMac/Xwt.Mac/SaveFileDialogBackend.cs76
-rw-r--r--Xwt.XamMac/Xwt.Mac/SelectFolderDialogBackend.cs38
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
}
}