diff options
author | Lluis Sanchez <lluis@xamarin.com> | 2011-10-21 12:48:12 +0400 |
---|---|---|
committer | Lluis Sanchez <lluis@xamarin.com> | 2011-10-21 12:48:12 +0400 |
commit | fb81fb9072261d2d912453c61f5703c50cbfb30f (patch) | |
tree | e663750c7f0427ebea6f3418a8149b9481c5acf0 /main/src/core/MonoDevelop.Ide/MonoDevelop.Components | |
parent | 45ac5f0eb9a8f3d84a851f450a0a94748e0880f5 (diff) |
[Ide] Added support for file filters in FileEntry and FolderEntry
Diffstat (limited to 'main/src/core/MonoDevelop.Ide/MonoDevelop.Components')
4 files changed, 145 insertions, 2 deletions
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Components/BaseFileEntry.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Components/BaseFileEntry.cs index a6f47047f7..2c25e7ac35 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Components/BaseFileEntry.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Components/BaseFileEntry.cs @@ -41,6 +41,7 @@ namespace MonoDevelop.Components { Entry text; Button browse; bool loading; + protected FileFilterSet filterSet = new FileFilterSet (); public event EventHandler PathChanged; @@ -92,6 +93,10 @@ namespace MonoDevelop.Components { } } + public FileFilterSet FileFilters { + get { return filterSet; } + } + void OnButtonClicked (object o, EventArgs args) { string start_in; diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Components/FileEntry.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Components/FileEntry.cs index e342cd034f..f46d1f19eb 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Components/FileEntry.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Components/FileEntry.cs @@ -50,8 +50,8 @@ namespace MonoDevelop.Components { if (start_in != null) fd.InitialFileName = start_in; + fd.SetFilters (filterSet); fd.TransientFor = GetTransientFor (); - if (fd.Run ()) return fd.SelectedFile; else diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Components/FileFilterSet.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Components/FileFilterSet.cs new file mode 100644 index 0000000000..f15d3346b7 --- /dev/null +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Components/FileFilterSet.cs @@ -0,0 +1,138 @@ +// +// FileFilterSet.cs +// +// Author: +// Lluis Sanchez <lluis@xamarin.com> +// +// Copyright (c) 2011 Xamarin Inc +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// 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 MonoDevelop.Components.Extensions; +using Mono.Addins; +using MonoDevelop.Core; + +namespace MonoDevelop.Components +{ + public class FileFilterSet + { + List<SelectFileDialogFilter> filters = new List<SelectFileDialogFilter> (); + + internal FileFilterSet () + { + } + + public SelectFileDialogFilter DefaultFilter { get; set; } + + internal IList<SelectFileDialogFilter> Filters { + get { return filters; } + } + + public SelectFileDialogFilter AddFilter (string label, params string[] patterns) + { + return AddFilter (new SelectFileDialogFilter (label, patterns)); + } + + public SelectFileDialogFilter AddFilter (SelectFileDialogFilter filter) + { + if (useDefaultFilters) + throw new InvalidOperationException ("Cannot mix default filters and custom filters"); + filters.Add (filter); + return filter; + } + + public SelectFileDialogFilter AddAllFilesFilter () + { + return AddFilter (SelectFileDialogFilter.AllFiles); + } + + public bool HasFilters { + get { + return filters.Count > 0; + } + } + + /// <summary> + /// Adds the default file filters registered by MD core and addins. Includes the All Files filter. + /// </summary> + public void AddDefaultFileFilters () + { + if (HasFilters) + throw new InvalidOperationException ("Cannot mix default filters and custom filters"); + if (useDefaultFilters) + throw new InvalidOperationException ("Already called"); + + useDefaultFilters = true; + + foreach (var f in GetDefaultFilters ()) + filters.Add (f); + filters.Add (SelectFileDialogFilter.AllFiles); + + LoadDefaultFilter (); + } + + 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; + } + } + + bool useDefaultFilters; + + ///<summary>Loads last default filter from MD prefs</summary> + 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; + } + } + } + + ///<summary>Saves last default filter to MD prefs, if necessary</summary> + internal void SaveDefaultFilter () + { + if (!useDefaultFilters) + return; + + // 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]); + } + } +} + diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Components/FolderEntry.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Components/FolderEntry.cs index 63e5c2f34e..b01fb9380b 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Components/FolderEntry.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Components/FolderEntry.cs @@ -50,7 +50,7 @@ namespace MonoDevelop.Components { SelectFolderDialog fd = new SelectFolderDialog (name); if (start_in != null) fd.InitialFileName = start_in; - + fd.SetFilters (filterSet); fd.TransientFor = GetTransientFor (); if (fd.Run ()) |