diff options
author | Michael Hutchinson <mhutchinson@novell.com> | 2010-05-26 08:38:41 +0400 |
---|---|---|
committer | Michael Hutchinson <mhutchinson@novell.com> | 2010-05-26 08:38:41 +0400 |
commit | aff4eaad355c3a17d112ae75a0f446f3efe8c24a (patch) | |
tree | f0e2ce38db32ab7c017ee3446d4299867c6c9376 /main | |
parent | caf9a9d46b965d8633efa7f96ad0699be5393cc6 (diff) |
* src/core/MonoDevelop.Ide/MonoDevelop.Ide.Commands/FileCommands.cs:
* src/core/MonoDevelop.Ide/MonoDevelop.Ide.Projects/AddFileDialog.cs:
* src/core/MonoDevelop.Ide/MonoDevelop.Components/SelectFileDialog.cs:
* src/core/MonoDevelop.Ide/MonoDevelop.Components/SelectFolderDialog.cs:
* src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Dialogs/OpenFileDialog.cs:
* src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Dialogs/FileSelectorDialog.cs:
* src/core/MonoDevelop.Ide/MonoDevelop.Components.Extensions/ISelectFileDialog.cs:
Improved the platform dialog abstractions. Unified and tidied code,
factored code from OpenFileDialog, improved support for file
filters.
* src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/Document.cs: Use
platform dialog for OpenFile.
svn path=/trunk/monodevelop/; revision=157929
Diffstat (limited to 'main')
9 files changed, 227 insertions, 137 deletions
diff --git a/main/src/core/MonoDevelop.Ide/ChangeLog b/main/src/core/MonoDevelop.Ide/ChangeLog index 8826c34ac5..7ed57ed93e 100644 --- a/main/src/core/MonoDevelop.Ide/ChangeLog +++ b/main/src/core/MonoDevelop.Ide/ChangeLog @@ -1,3 +1,19 @@ +2010-05-26 Michael Hutchinson <mhutchinson@novell.com> + + * MonoDevelop.Ide.Commands/FileCommands.cs: + * MonoDevelop.Ide.Projects/AddFileDialog.cs: + * MonoDevelop.Components/SelectFileDialog.cs: + * MonoDevelop.Components/SelectFolderDialog.cs: + * MonoDevelop.Ide.Gui.Dialogs/OpenFileDialog.cs: + * MonoDevelop.Ide.Gui.Dialogs/FileSelectorDialog.cs: + * MonoDevelop.Components.Extensions/ISelectFileDialog.cs: + Improved the platform dialog abstractions. Unified and + tidied code, factored code from OpenFileDialog, improved + support for file filters. + + * MonoDevelop.Ide.Gui/Document.cs: Use platform dialog for + OpenFile. + 2010-05-26 Mike Krüger <mkrueger@novell.com> * MonoDevelop.Ide.NavigateToDialog/SearchResult.cs: diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Components.Extensions/ISelectFileDialog.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Components.Extensions/ISelectFileDialog.cs index 507366f902..66a376b8bf 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Components.Extensions/ISelectFileDialog.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Components.Extensions/ISelectFileDialog.cs @@ -48,13 +48,14 @@ namespace MonoDevelop.Components.Extensions { List<SelectFileDialogFilter> filters = new List<SelectFileDialogFilter> (); public Gtk.FileChooserAction Action { get; set; } - public List<SelectFileDialogFilter> Filters { get { return filters; } } + public IList<SelectFileDialogFilter> Filters { get { return filters; } } public FilePath CurrentFolder { get; set; } public bool SelectMultiple { get; set; } public FilePath[] SelectedFiles { get; set; } - public FilePath InitialFileName { get; set; } - } - + public string InitialFileName { get; set; } + public SelectFileDialogFilter DefaultFilter { get; set; } + } + /// <summary> /// Filter option to be displayed in file selector dialogs. /// </summary> @@ -129,49 +130,44 @@ namespace MonoDevelop.Components.Extensions set { data.InitialFileName = value; } } - public void AddFilter (string label, params string[] patterns) - { - AddFilter (new SelectFileDialogFilter (label, patterns)); + /// <summary> + /// File filters that allow the user to choose the kinds of files the dialog displays. + /// </summary> + public IList<SelectFileDialogFilter> Filters { + get { return data.Filters; } } - public void AddFilter (SelectFileDialogFilter filter) - { - data.Filters.Add (filter); + /// <summary> + /// The default file filter. If there is only one, the user will not have a choice of file types. + /// </summary> + public SelectFileDialogFilter DefaultFilter { + get { return data.DefaultFilter; } + set { data.DefaultFilter = value; } } - public void AddAllFilesFilter () + #region File filter utilities + + public SelectFileDialogFilter AddFilter (string label, params string[] patterns) { - AddFilter (GettextCatalog.GetString ("All Files"), "*.*"); + return AddFilter (new SelectFileDialogFilter (label, patterns)); } - /// <summary> - /// Runs the default implementation of the dialog. - /// </summary> - protected bool RunDefault () + public SelectFileDialogFilter AddFilter (SelectFileDialogFilter filter) { - FileSelector fdiag = new FileSelector (data.Title, data.Action) { - SelectMultiple = data.SelectMultiple, - TransientFor = data.TransientFor, - }; - if (!data.CurrentFolder.IsNullOrEmpty) - fdiag.SetCurrentFolder (data.CurrentFolder); - if (!data.InitialFileName.IsNullOrEmpty) - fdiag.SetFilename (data.InitialFileName); - - foreach (var filter in GetGtkFileFilters ()) - fdiag.AddFilter (filter); - - try { - int result = MessageService.RunCustomDialog (fdiag, data.TransientFor ?? MessageService.RootWindow); - data.SelectedFiles = fdiag.Filenames.ToFilePathArray (); - return result == (int) Gtk.ResponseType.Ok; - } finally { - fdiag.Destroy (); - } + data.Filters.Add (filter); + return filter; } - protected IEnumerable<Gtk.FileFilter> GetGtkFileFilters () + public SelectFileDialogFilter AddAllFilesFilter () { + return AddFilter (GettextCatalog.GetString ("All Files"), "*"); + } + + void SetGtkFileFilters (FileSelector fdiag) + { + var list = new List<Gtk.FileFilter> (); + Gtk.FileFilter defaultGtkFilter = null; + foreach (var filter in data.Filters) { var gf = new Gtk.FileFilter (); if (!string.IsNullOrEmpty (filter.Name)) @@ -182,7 +178,78 @@ namespace MonoDevelop.Components.Extensions if (filter.MimeTypes != null) foreach (var mimetype in filter.MimeTypes) gf.AddMimeType (mimetype); - yield return gf; + list.Add (gf); + if (filter == DefaultFilter) + defaultGtkFilter = gf; + } + + foreach (var filter in list) + fdiag.AddFilter (filter); + + if (defaultGtkFilter != null) + fdiag.Filter = defaultGtkFilter; + + fdiag.Destroyed += CaptureDefaultFilter; + } + + [GLib.ConnectBefore] + void CaptureDefaultFilter (object sender, EventArgs e) + { + + } + + #endregion + + /// <summary> + /// Utility method to populate a GTK FileSelector from the data properties. + /// </summary> + internal void SetDefaultProperties (FileSelector fdiag) + { + fdiag.Title = Title; + fdiag.Action = Action; + fdiag.LocalOnly = true; + fdiag.SelectMultiple = SelectMultiple; + fdiag.TransientFor = TransientFor; + + if (!CurrentFolder.IsNullOrEmpty) + fdiag.SetCurrentFolder (CurrentFolder); + if (!string.IsNullOrEmpty (InitialFileName)) + fdiag.CurrentName = InitialFileName; + + if (!CurrentFolder.IsNullOrEmpty && !string.IsNullOrEmpty (InitialFileName)) { + var checkName = data.CurrentFolder.Combine (InitialFileName); + if (System.IO.File.Exists (checkName)) + fdiag.SetFilename (checkName); + } + + SetGtkFileFilters (fdiag); + } + + internal void GetDefaultProperties (FileSelector fdiag) + { + data.SelectedFiles = fdiag.Filenames.ToFilePathArray (); + var currentFilter = fdiag.Filter; + if (currentFilter != null) { + var name = fdiag.Filter.Name; + var def = data.Filters.Where (f => f.Name == name).FirstOrDefault (); + if (def != null) + DefaultFilter = def; + } + } + + /// <summary> + /// Runs the default implementation of the dialog. + /// </summary> + protected bool RunDefault () + { + var fdiag = new FileSelector (); + SetDefaultProperties (fdiag); + try { + int result = MessageService.RunCustomDialog (fdiag, data.TransientFor ?? MessageService.RootWindow); + GetDefaultProperties (fdiag); + return result == (int) Gtk.ResponseType.Ok; + } finally { + fdiag.Destroy (); } } } diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Components/SelectFileDialog.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Components/SelectFileDialog.cs index 5dd33e32d6..624ad5081b 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Components/SelectFileDialog.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Components/SelectFileDialog.cs @@ -50,6 +50,12 @@ namespace MonoDevelop.Components Action = action; } + /// <summary> + /// Shows the dialog + /// </summary> + /// <returns> + /// True if the user clicked OK. + /// </returns> public bool Run () { if (Handler != null) diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Components/SelectFolderDialog.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Components/SelectFolderDialog.cs index 9322a12811..f0e21f59e5 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Components/SelectFolderDialog.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Components/SelectFolderDialog.cs @@ -25,7 +25,9 @@ // THE SOFTWARE. using System; -using MonoDevelop.Components.Extensions;
+using MonoDevelop.Components.Extensions; +using MonoDevelop.Ide; +using MonoDevelop.Core;
namespace MonoDevelop.Components
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Commands/FileCommands.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Commands/FileCommands.cs index c0b7752a9d..fed2719956 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Commands/FileCommands.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Commands/FileCommands.cs @@ -78,7 +78,7 @@ namespace MonoDevelop.Ide.Commands { protected override void Run () { - var dlg = new OpenFileDialog (GettextCatalog.GetString ("File to Open")) { + var dlg = new OpenFileDialog (GettextCatalog.GetString ("File to Open"), Gtk.FileChooserAction.Open) { TransientFor = IdeApp.Workbench.RootWindow, ShowEncodingSelector = true, ShowViewerSelector = true, diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Dialogs/FileSelectorDialog.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Dialogs/FileSelectorDialog.cs index a279cffcdb..558df5ca64 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Dialogs/FileSelectorDialog.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Dialogs/FileSelectorDialog.cs @@ -62,50 +62,6 @@ namespace MonoDevelop.Ide.Gui.Dialogs { LocalOnly = true; - ArrayList filters = new ArrayList (); - filters.AddRange (AddinManager.GetExtensionObjects ("/MonoDevelop/Ide/ProjectFileFilters")); - try - { - filters.AddRange (AddinManager.GetExtensionObjects ("/MonoDevelop/Ide/FileFilters")); - } - catch - { - //nothing there.. - } - - filterPairs = new Hashtable (); - foreach (string filterStr in filters) - { - string[] parts = filterStr.Split ('|'); - Gtk.FileFilter filter = new Gtk.FileFilter (); - filter.Name = parts[0]; - filterPairs[parts[0]] = parts[1]; - foreach (string ext in parts[1].Split (';')) - { - filter.AddPattern (ext); - } - AddFilter (filter); - } - - //Add All Files - Gtk.FileFilter allFilter = new Gtk.FileFilter (); - allFilter.Name = GettextCatalog.GetString ("All Files"); - allFilter.AddPattern ("*"); - filterPairs[GettextCatalog.GetString ("All Files")] = ("*"); - AddFilter (allFilter); - - // Load last used filter - string lastPattern = (string)PropertyService.Get ("Monodevelop.FileSelector.LastPattern", "*"); - foreach (FileFilter filter in this.Filters) - { - string pattern = filterPairs[filter.Name] as string; - if (! String.IsNullOrEmpty (pattern) && pattern == lastPattern) - { - this.Filter = filter; - break; - } - } - // Add the text encoding selector Table table = new Table (2, 2, false); table.RowSpacing = 6; @@ -313,16 +269,6 @@ namespace MonoDevelop.Ide.Gui.Dialogs UpdateExtraWidgets (); FillViewers (); } - - protected override void OnDestroyed () - { - // Save active filter - string pattern = filterPairs[this.Filter.Name] as string; - if (pattern != null) - PropertyService.Set ("Monodevelop.FileSelector.LastPattern", pattern); - - base.OnDestroyed (); - } } } diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Dialogs/OpenFileDialog.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Dialogs/OpenFileDialog.cs index 6df4dd6051..12c855d27d 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Dialogs/OpenFileDialog.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Dialogs/OpenFileDialog.cs @@ -28,6 +28,8 @@ using System; using MonoDevelop.Core; using MonoDevelop.Ide.Extensions; using MonoDevelop.Components.Extensions; +using System.Collections.Generic; +using Mono.Addins; namespace MonoDevelop.Ide.Gui.Dialogs
{ @@ -40,9 +42,14 @@ namespace MonoDevelop.Ide.Gui.Dialogs { } - public OpenFileDialog (string title) + public OpenFileDialog (string title) : this (title, Gtk.FileChooserAction.Save) + { + } + + public OpenFileDialog (string title, Gtk.FileChooserAction action) { Title = title; + Action = action; } /// <summary> @@ -92,33 +99,32 @@ namespace MonoDevelop.Ide.Gui.Dialogs public bool Run () { if (Handler != null) - Handler.Run (data); + return Handler.Run (data); + else + return RunDefault (); + } + + bool RunDefault () + { + var win = new FileSelectorDialog (Title, Action); + win.Encoding = Encoding; + win.ShowEncodingSelector = ShowEncodingSelector; + win.ShowViewerSelector = ShowViewerSelector; + + //FIXME: should these be optional? they were hardcoded into the dialog - at least they're factored out now + AddDefaultFileFilters (); + LoadDefaultFilter (); - var win = new FileSelectorDialog (data.Title, data.Action) { - Encoding = data.Encoding, - ShowEncodingSelector = data.ShowEncodingSelector, - ShowViewerSelector = data.ShowViewerSelector, - }; - foreach (var filter in GetGtkFileFilters ()) - win.AddFilter (filter); + SetDefaultProperties (win); try { var result = MessageService.RunCustomDialog (win, TransientFor ?? MessageService.RootWindow); if (result == (int) Gtk.ResponseType.Ok) { + GetDefaultProperties (win); data.Encoding = win.Encoding; data.CloseCurrentWorkspace = win.CloseCurrentWorkspace; - data.SelectedFiles = win.Filenames.ToFilePathArray (); data.SelectedViewer = win.SelectedViewer; - - //handle certain strange cases in the GTK file dialog - if (string.IsNullOrEmpty (SelectedFile)) { - if (win.Uri != null) - MessageService.ShowError (GettextCatalog.GetString ("Only local files can be opened.")); - else - MessageService.ShowError (GettextCatalog.GetString ("The provided file could not be loaded.")); - return false; - } - + SaveDefaultFilter (); return true; } else return false; @@ -126,5 +132,56 @@ namespace MonoDevelop.Ide.Gui.Dialogs win.Destroy (); } } + + /// <summary> + /// Adds the default file filters registered by MD core and addins. Includes the All Files filter. + /// </summary> + void AddDefaultFileFilters () + { + foreach (var f in GetDefaultFilters ()) + data.Filters.Add (f); + AddAllFilesFilter (); + } + + //loads last default filter from MD prefs + void LoadDefaultFilter () + { + // Load last used filter pattern + var lastPattern = PropertyService.Get ("Monodevelop.FileSelector.LastPattern", "*"); + foreach (var filter in Filters) { + if (filter.Patterns != null && filter.Patterns.Contains (lastPattern)) { + DefaultFilter = filter; + break; + } + } + } + + //saves last default filter to MD prefs + void SaveDefaultFilter () + { + // Save active filter + //it may be null if e.g. SetSelectedFile was used + if (DefaultFilter != null && DefaultFilter.Patterns != null && DefaultFilter.Patterns.Count > 0) + PropertyService.Set ("Monodevelop.FileSelector.LastPattern", DefaultFilter.Patterns[0]); + } + + static IEnumerable<SelectFileDialogFilter> GetDefaultFilters () + { + foreach (var f in ParseFilters (AddinManager.GetExtensionObjects ("/MonoDevelop/Ide/ProjectFileFilters"))) + yield return f; + foreach (var f in ParseFilters (AddinManager.GetExtensionObjects ("/MonoDevelop/Ide/FileFilters"))) + yield return f; + } + + static IEnumerable<SelectFileDialogFilter> ParseFilters (System.Collections.IEnumerable filterStrings) + { + if (filterStrings == null) + yield break; + foreach (string filterStr in filterStrings) { + var parts = filterStr.Split ('|'); + var f = new SelectFileDialogFilter (parts[0], parts[1].Split (';')); + yield return f; + } + } }
}
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/Document.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/Document.cs index 13f8f70772..fc74a59e59 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/Document.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/Document.cs @@ -274,25 +274,24 @@ namespace MonoDevelop.Ide.Gui } if (filename == null) { - FileSelectorDialog fdiag = new FileSelectorDialog (GettextCatalog.GetString ("Save as..."), Gtk.FileChooserAction.Save); - try { - if (Window.ViewContent.IsUntitled) - fdiag.CurrentName = Window.ViewContent.UntitledName; - else { - fdiag.SetCurrentFolder (Path.GetDirectoryName (Window.ViewContent.ContentName)); - fdiag.CurrentName = Path.GetFileName (Window.ViewContent.ContentName); - } - fdiag.Encoding = encoding; - fdiag.ShowEncodingSelector = (tbuffer != null); - fdiag.TransientFor = IdeApp.Workbench.RootWindow; - int response = fdiag.Run (); - filename = fdiag.Filename; - encoding = fdiag.Encoding; - if (response != (int)Gtk.ResponseType.Ok) - return; - } finally { - fdiag.Destroy (); + var dlg = new OpenFileDialog (GettextCatalog.GetString ("Save as..."), FileChooserAction.Save) { + TransientFor = IdeApp.Workbench.RootWindow, + Encoding = encoding, + ShowEncodingSelector = (tbuffer != null), + }; + + if (Window.ViewContent.IsUntitled) + dlg.InitialFileName = Window.ViewContent.UntitledName; + else { + dlg.CurrentFolder = Path.GetDirectoryName (Window.ViewContent.ContentName); + dlg.InitialFileName = Path.GetFileName (Window.ViewContent.ContentName); } + + if (!dlg.Run ()) + return; + + filename = dlg.SelectedFile; + encoding = dlg.Encoding; } if (!FileService.IsValidPath (filename)) { diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Projects/AddFileDialog.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Projects/AddFileDialog.cs index 4fe47e8428..150d92ea08 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Projects/AddFileDialog.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Projects/AddFileDialog.cs @@ -42,6 +42,7 @@ namespace MonoDevelop.Ide.Projects public AddFileDialog (string title)
{ Title = title; + Action = FileChooserAction.Open; data.SelectMultiple = true;
} @@ -72,9 +73,6 @@ namespace MonoDevelop.Ide.Projects return Handler.Run (data); FileSelector fdiag = new FileSelector (data.Title); - fdiag.SetCurrentFolder (data.CurrentFolder); - fdiag.SelectMultiple = data.SelectMultiple; - fdiag.TransientFor = data.TransientFor; //add a combo that can be used to override the default build action ComboBox combo = new ComboBox (data.BuildActions ?? new string[0]); @@ -93,14 +91,13 @@ namespace MonoDevelop.Ide.Projects box.PackStart (combo, false, false, 4); box.ShowAll (); - foreach (var filter in GetGtkFileFilters ()) - fdiag.AddFilter (filter); + SetDefaultProperties (fdiag); int result; try { result = MessageService.RunCustomDialog (fdiag, data.TransientFor ?? MessageService.RootWindow); - data.SelectedFiles = fdiag.Filenames.ToFilePathArray (); + GetDefaultProperties (fdiag); if (check.Active) data.OverrideAction = combo.ActiveText; else |