miniSql

创建
zgc123@gmail.com authored at 11/19/2023 1:40:15 AM
6136600
Tree
0 Parent(s)
Summary: 1 changed files with 126 additions and 0 deletions.
Added +126 -0
Added +126 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/FileEditorResolverService.cs b/minisqlquery-master/src/MiniSqlQuery.Core/FileEditorResolverService.cs
new file mode 100644
index 0000000..c176954
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/FileEditorResolverService.cs
@@ -0,0 +1,126 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+
+#endregion
+
+using System.Collections.Generic;
+using System.IO;
+
+namespace MiniSqlQuery.Core
+{
+    /// <summary>
+    /// 	Given a file name or extention the service will work out the most appropriate editor to use.
+    /// </summary>
+    /// <remarks>
+    /// 	The editors need to be registered using the <see cref = "Register" /> method.
+    /// 	<example>
+    /// 		<code>
+    /// 			IEditor editor = resolver.ResolveEditorInstance("c:\data.sql");
+    /// 			// will resolve to the SQL editor
+    /// 
+    /// 			IEditor editor = resolver.ResolveEditorInstance("c:\foo.txt");
+    /// 			// will resolve to the basic text editor</code>
+    /// 	</example>
+    /// </remarks>
+    public class FileEditorResolverService : IFileEditorResolver
+    {
+        /// <summary>
+        /// 	The extention map of files types to descriptors.
+        /// </summary>
+        private readonly Dictionary<string, FileEditorDescriptor> _extentionMap;
+
+        /// <summary>
+        /// 	The file editor descriptors.
+        /// </summary>
+        private readonly List<FileEditorDescriptor> _fileEditorDescriptors;
+
+        /// <summary>
+        /// 	The application services.
+        /// </summary>
+        private readonly IApplicationServices _services;
+
+        /// <summary>
+        /// 	Initializes a new instance of the <see cref = "FileEditorResolverService" /> class.
+        /// </summary>
+        /// <param name = "services">The application services.</param>
+        public FileEditorResolverService(IApplicationServices services)
+        {
+            _services = services;
+            _extentionMap = new Dictionary<string, FileEditorDescriptor>();
+            _fileEditorDescriptors = new List<FileEditorDescriptor>();
+        }
+
+        /// <summary>
+        /// 	Gets an array of the file descriptiors.
+        /// </summary>
+        /// <returns>An array of <see cref = "FileEditorDescriptor" /> objects.</returns>
+        public FileEditorDescriptor[] GetFileTypes()
+        {
+            return _fileEditorDescriptors.ToArray();
+        }
+
+        /// <summary>
+        /// 	Registers the specified file editor descriptor.
+        /// 	It is recommended to use the <see cref = "IApplicationServices.RegisterEditor{TEditor}" /> method to
+        /// 	set up the container correctly.
+        /// </summary>
+        /// <param name = "fileEditorDescriptor">The file editor descriptor.</param>
+        public void Register(FileEditorDescriptor fileEditorDescriptor)
+        {
+            _fileEditorDescriptors.Add(fileEditorDescriptor);
+            if (fileEditorDescriptor.Extensions == null || fileEditorDescriptor.Extensions.Length == 0)
+            {
+                _extentionMap.Add("*", fileEditorDescriptor);
+            }
+            else
+            {
+                // create a map of all ext to editors
+                foreach (string extention in fileEditorDescriptor.Extensions)
+                {
+                    _extentionMap.Add(extention, fileEditorDescriptor);
+                }
+            }
+        }
+
+        /// <summary>
+        /// 	Resolves the editor instance from the container based on the filename.
+        /// </summary>
+        /// <param name = "filename">The filename.</param>
+        /// <returns>An editor.</returns>
+        public IEditor ResolveEditorInstance(string filename)
+        {
+            string ext = Path.GetExtension(filename);
+            string editorName = ResolveEditorNameByExtension(ext);
+            return _services.Resolve<IEditor>(editorName);
+        }
+
+        /// <summary>
+        /// 	Works out the "name" of the editor to use based on the <paramref name = "extension" />.
+        /// </summary>
+        /// <param name = "extension">The extention ("sql", "txt"/".txt" etc).</param>
+        /// <returns>The name of an editor in the container.</returns>
+        public string ResolveEditorNameByExtension(string extension)
+        {
+            string editorName = _extentionMap["*"].EditorKeyName;
+
+            if (extension != null)
+            {
+                if (extension.StartsWith("."))
+                {
+                    extension = extension.Substring(1);
+                }
+
+                // is there a specific editor for this file type
+                if (_extentionMap.ContainsKey(extension))
+                {
+                    editorName = _extentionMap[extension].EditorKeyName;
+                }
+            }
+
+            return editorName;
+        }
+    }
+}
\ No newline at end of file