Browse Source

Add project files.

jungervin 8 years ago
parent
commit
e856a96644
100 changed files with 17210 additions and 0 deletions
  1. 43 0
      EsPy.sln
  2. 231 0
      EsPy/App.config
  3. 741 0
      EsPy/Components/AutocompleteMenu.cs
  4. 266 0
      EsPy/Components/AutocopleteItem.cs
  5. 34 0
      EsPy/Components/Completion/AutoCompletion.cs
  6. 76 0
      EsPy/Components/Completion/CompletionForm.Designer.cs
  7. 65 0
      EsPy/Components/Completion/CompletionForm.cs
  8. 123 0
      EsPy/Components/Completion/CompletionForm.resx
  9. 228 0
      EsPy/Components/Completion/CompletionListBox.cs
  10. 174 0
      EsPy/Components/Completion/CompletionListBox.resx
  11. 58 0
      EsPy/Components/CompletionForm.Designer.cs
  12. 220 0
      EsPy/Components/CompletionForm.cs
  13. 120 0
      EsPy/Components/CompletionForm.resx
  14. 92 0
      EsPy/Components/ExListBox.cs
  15. 126 0
      EsPy/Components/ExListBox.resx
  16. 621 0
      EsPy/Components/ExScintilla.cs
  17. 123 0
      EsPy/Components/ExScintilla.resx
  18. 99 0
      EsPy/Components/Place.cs
  19. 13 0
      EsPy/Components/PyCompletion.cs
  20. 494 0
      EsPy/Components/Terminal.cs
  21. 123 0
      EsPy/Components/Terminal.resx
  22. 7 0
      EsPy/Conf/scilang.xml
  23. 896 0
      EsPy/Conf/scistyles.xml
  24. 116 0
      EsPy/Dialogs/AboutDialog.Designer.cs
  25. 26 0
      EsPy/Dialogs/AboutDialog.cs
  26. 120 0
      EsPy/Dialogs/AboutDialog.resx
  27. 417 0
      EsPy/Dialogs/EspToolDialog.Designer.cs
  28. 308 0
      EsPy/Dialogs/EspToolDialog.cs
  29. 120 0
      EsPy/Dialogs/EspToolDialog.resx
  30. 117 0
      EsPy/Dialogs/FileSavesDialog.Designer.cs
  31. 20 0
      EsPy/Dialogs/FileSavesDialog.cs
  32. 120 0
      EsPy/Dialogs/FileSavesDialog.resx
  33. 104 0
      EsPy/Dialogs/InputDialog.Designer.cs
  34. 25 0
      EsPy/Dialogs/InputDialog.cs
  35. 120 0
      EsPy/Dialogs/InputDialog.resx
  36. 70 0
      EsPy/Dialogs/ProgressDialog.Designer.cs
  37. 122 0
      EsPy/Dialogs/ProgressDialog.cs
  38. 120 0
      EsPy/Dialogs/ProgressDialog.resx
  39. 265 0
      EsPy/Dialogs/PyFileManager.Designer.cs
  40. 317 0
      EsPy/Dialogs/PyFileManager.cs
  41. 205 0
      EsPy/Dialogs/PyFileManager.resx
  42. 127 0
      EsPy/Dialogs/SettingsDialog.Designer.cs
  43. 50 0
      EsPy/Dialogs/SettingsDialog.cs
  44. 120 0
      EsPy/Dialogs/SettingsDialog.resx
  45. 473 0
      EsPy/EsPy.csproj
  46. 14 0
      EsPy/Forms/CodeCompletionList.cs
  47. 804 0
      EsPy/Forms/EditorForm.Designer.cs
  48. 889 0
      EsPy/Forms/EditorForm.cs
  49. 611 0
      EsPy/Forms/EditorForm.resx
  50. 175 0
      EsPy/Forms/ErrorListForm.Designer.cs
  51. 104 0
      EsPy/Forms/ErrorListForm.cs
  52. 178 0
      EsPy/Forms/ErrorListForm.resx
  53. 13 0
      EsPy/Forms/IDeviceChange.cs
  54. 28 0
      EsPy/Forms/IDocument.cs
  55. 14 0
      EsPy/Forms/IForm.cs
  56. 130 0
      EsPy/Forms/Splash.Designer.cs
  57. 37 0
      EsPy/Forms/Splash.cs
  58. 120 0
      EsPy/Forms/Splash.resx
  59. 498 0
      EsPy/Forms/TerminalForm.Designer.cs
  60. 287 0
      EsPy/Forms/TerminalForm.cs
  61. 541 0
      EsPy/Forms/TerminalForm.resx
  62. 91 0
      EsPy/Globals.cs
  63. 34 0
      EsPy/Helps/help.html
  64. BIN
      EsPy/Helps/images/esptool.png
  65. BIN
      EsPy/Helps/images/espy.png
  66. BIN
      EsPy/Helps/images/filemanager.png
  67. 17 0
      EsPy/Lib/apa102.py
  68. 32 0
      EsPy/Lib/dht.py
  69. 27 0
      EsPy/Lib/ds18x20.py
  70. 68 0
      EsPy/Lib/flashbdev.py
  71. 50 0
      EsPy/Lib/inisetup.py
  72. 17 0
      EsPy/Lib/machine.py
  73. 32 0
      EsPy/Lib/neopixel.py
  74. 36 0
      EsPy/Lib/ntptime.py
  75. 46 0
      EsPy/Lib/onewire.py
  76. 33 0
      EsPy/Lib/port_diag.py
  77. 1 0
      EsPy/Lib/upip.py
  78. 1 0
      EsPy/Lib/upip_utarfile.py
  79. 77 0
      EsPy/Lib/webrepl.py
  80. 111 0
      EsPy/Lib/webrepl_setup.py
  81. 74 0
      EsPy/Lib/websocket_helper.py
  82. 768 0
      EsPy/MainForm.Designer.cs
  83. 1019 0
      EsPy/MainForm.cs
  84. 481 0
      EsPy/MainForm.resx
  85. 39 0
      EsPy/Program.cs
  86. 36 0
      EsPy/Properties/AssemblyInfo.cs
  87. 473 0
      EsPy/Properties/Resources.Designer.cs
  88. 244 0
      EsPy/Properties/Resources.resx
  89. 254 0
      EsPy/Properties/Settings.Designer.cs
  90. 63 0
      EsPy/Properties/Settings.settings
  91. 14 0
      EsPy/Python/IText.cs
  92. 39 0
      EsPy/Python/Jedi/BaseDefinition.cs
  93. 15 0
      EsPy/Python/Jedi/CallSignature.cs
  94. 14 0
      EsPy/Python/Jedi/Completion.cs
  95. 15 0
      EsPy/Python/Jedi/CompletionRequest.cs
  96. 13 0
      EsPy/Python/Jedi/DefinedNames.cs
  97. 23 0
      EsPy/Python/Jedi/Definition.cs
  98. 17 0
      EsPy/Python/Jedi/Request.cs
  99. 22 0
      EsPy/Python/Jedi/Script.cs
  100. 16 0
      EsPy/Python/Jedi/SignaturesRequest.cs

+ 43 - 0
EsPy.sln

@@ -0,0 +1,43 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 14
+VisualStudioVersion = 14.0.25420.1
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EsPy", "EsPy\EsPy.csproj", "{F7FBC30C-9014-4169-AC86-4883087EC672}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Any CPU = Debug|Any CPU
+		Debug|x64 = Debug|x64
+		Debug|x86 = Debug|x86
+		Release|Any CPU = Release|Any CPU
+		Release|x64 = Release|x64
+		Release|x86 = Release|x86
+		Signed|Any CPU = Signed|Any CPU
+		Signed|x64 = Signed|x64
+		Signed|x86 = Signed|x86
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{F7FBC30C-9014-4169-AC86-4883087EC672}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{F7FBC30C-9014-4169-AC86-4883087EC672}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{F7FBC30C-9014-4169-AC86-4883087EC672}.Debug|x64.ActiveCfg = Debug|x64
+		{F7FBC30C-9014-4169-AC86-4883087EC672}.Debug|x64.Build.0 = Debug|x64
+		{F7FBC30C-9014-4169-AC86-4883087EC672}.Debug|x86.ActiveCfg = Debug|x86
+		{F7FBC30C-9014-4169-AC86-4883087EC672}.Debug|x86.Build.0 = Debug|x86
+		{F7FBC30C-9014-4169-AC86-4883087EC672}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{F7FBC30C-9014-4169-AC86-4883087EC672}.Release|Any CPU.Build.0 = Release|Any CPU
+		{F7FBC30C-9014-4169-AC86-4883087EC672}.Release|x64.ActiveCfg = Release|x64
+		{F7FBC30C-9014-4169-AC86-4883087EC672}.Release|x64.Build.0 = Release|x64
+		{F7FBC30C-9014-4169-AC86-4883087EC672}.Release|x86.ActiveCfg = Release|x86
+		{F7FBC30C-9014-4169-AC86-4883087EC672}.Release|x86.Build.0 = Release|x86
+		{F7FBC30C-9014-4169-AC86-4883087EC672}.Signed|Any CPU.ActiveCfg = Release|Any CPU
+		{F7FBC30C-9014-4169-AC86-4883087EC672}.Signed|Any CPU.Build.0 = Release|Any CPU
+		{F7FBC30C-9014-4169-AC86-4883087EC672}.Signed|x64.ActiveCfg = Release|x64
+		{F7FBC30C-9014-4169-AC86-4883087EC672}.Signed|x64.Build.0 = Release|x64
+		{F7FBC30C-9014-4169-AC86-4883087EC672}.Signed|x86.ActiveCfg = Release|x86
+		{F7FBC30C-9014-4169-AC86-4883087EC672}.Signed|x86.Build.0 = Release|x86
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+EndGlobal

+ 231 - 0
EsPy/App.config

@@ -0,0 +1,231 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+    <configSections>
+        <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+            <section name="EsPy.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
+            <section name="EPy.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
+            <section name="EspPY.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
+            <section name="EspRade.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
+            <section name="EspIDE.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
+        </sectionGroup>
+    </configSections>
+    <startup> 
+        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6" />
+    </startup>
+    <userSettings>
+        <EsPy.Properties.Settings>
+            <setting name="PortName" serializeAs="String">
+                <value>COMx</value>
+            </setting>
+            <setting name="PyBaudRate" serializeAs="String">
+                <value>115200</value>
+            </setting>
+            <setting name="PyPortBoardType" serializeAs="String">
+                <value />
+            </setting>
+            <setting name="PythonIndent" serializeAs="String">
+                <value>4</value>
+            </setting>
+            <setting name="EolVisible" serializeAs="String">
+                <value>False</value>
+            </setting>
+            <setting name="WhitespaceVisible" serializeAs="String">
+                <value>False</value>
+            </setting>
+            <setting name="TerminalShowEol" serializeAs="String">
+                <value>False</value>
+            </setting>
+            <setting name="TerminalShowWhitespace" serializeAs="String">
+                <value>False</value>
+            </setting>
+            <setting name="MicropythonDocUrl" serializeAs="String">
+                <value>http://docs.micropython.org</value>
+            </setting>
+            <setting name="ProjectsFolder" serializeAs="String">
+                <value />
+            </setting>
+            <setting name="PythonExe" serializeAs="String">
+                <value />
+            </setting>
+            <setting name="EspToolPy" serializeAs="String">
+                <value />
+            </setting>
+            <setting name="FrimwareBin" serializeAs="String">
+                <value />
+            </setting>
+            <setting name="EspToolBaud" serializeAs="String">
+                <value>460800</value>
+            </setting>
+            <setting name="PyPortReadTmeout" serializeAs="String">
+                <value>1000</value>
+            </setting>
+            <setting name="PyPortWriteTimeout" serializeAs="String">
+                <value>1000</value>
+            </setting>
+            <setting name="PyPortLineSeparator" serializeAs="String">
+                <value>\r\n</value>
+            </setting>
+            <setting name="ShowPyServer" serializeAs="String">
+                <value>False</value>
+            </setting>
+            <setting name="PyServerPort" serializeAs="String">
+                <value>5005</value>
+            </setting>
+        </EsPy.Properties.Settings>
+        <EPy.Properties.Settings>
+            <setting name="PortName" serializeAs="String">
+                <value>COMx</value>
+            </setting>
+            <setting name="BaudRate" serializeAs="String">
+                <value>0</value>
+            </setting>
+            <setting name="BoardType" serializeAs="String">
+                <value />
+            </setting>
+            <setting name="PythonIndent" serializeAs="String">
+                <value>4</value>
+            </setting>
+            <setting name="EolVisible" serializeAs="String">
+                <value>False</value>
+            </setting>
+            <setting name="WhitespaceVisible" serializeAs="String">
+                <value>False</value>
+            </setting>
+            <setting name="TerminalShowEol" serializeAs="String">
+                <value>False</value>
+            </setting>
+            <setting name="TerminalShowWhitespace" serializeAs="String">
+                <value>False</value>
+            </setting>
+            <setting name="MicropythonDocUrl" serializeAs="String">
+                <value>http://docs.micropython.org</value>
+            </setting>
+            <setting name="ProjectsFolder" serializeAs="String">
+                <value />
+            </setting>
+            <setting name="PythonExe" serializeAs="String">
+                <value />
+            </setting>
+            <setting name="EspToolPy" serializeAs="String">
+                <value />
+            </setting>
+            <setting name="FrimwareBin" serializeAs="String">
+                <value />
+            </setting>
+            <setting name="EspToolBaud" serializeAs="String">
+                <value>460800</value>
+            </setting>
+        </EPy.Properties.Settings>
+        <EspPY.Properties.Settings>
+            <setting name="PortName" serializeAs="String">
+                <value>COMx</value>
+            </setting>
+            <setting name="BaudRate" serializeAs="String">
+                <value>0</value>
+            </setting>
+            <setting name="BoardType" serializeAs="String">
+                <value />
+            </setting>
+            <setting name="PythonIndent" serializeAs="String">
+                <value>4</value>
+            </setting>
+            <setting name="PythonDir" serializeAs="String">
+                <value />
+            </setting>
+            <setting name="Ampy" serializeAs="String">
+                <value />
+            </setting>
+            <setting name="EspTool" serializeAs="String">
+                <value />
+            </setting>
+            <setting name="EolVisible" serializeAs="String">
+                <value>False</value>
+            </setting>
+            <setting name="WhitespaceVisible" serializeAs="String">
+                <value>False</value>
+            </setting>
+            <setting name="TerminalShowEol" serializeAs="String">
+                <value>False</value>
+            </setting>
+            <setting name="TerminalShowWhitespace" serializeAs="String">
+                <value>0</value>
+            </setting>
+            <setting name="MicropythonDocUrl" serializeAs="String">
+                <value>http://docs.micropython.org</value>
+            </setting>
+        </EspPY.Properties.Settings>
+        <EspRade.Properties.Settings>
+            <setting name="PortName" serializeAs="String">
+                <value />
+            </setting>
+            <setting name="BaudRate" serializeAs="String">
+                <value>0</value>
+            </setting>
+            <setting name="BoardType" serializeAs="String">
+                <value />
+            </setting>
+            <setting name="PythonIndent" serializeAs="String">
+                <value>4</value>
+            </setting>
+            <setting name="PythonDir" serializeAs="String">
+                <value />
+            </setting>
+            <setting name="Ampy" serializeAs="String">
+                <value />
+            </setting>
+            <setting name="EspTool" serializeAs="String">
+                <value />
+            </setting>
+            <setting name="EolVisible" serializeAs="String">
+                <value>False</value>
+            </setting>
+            <setting name="WhitespaceVisible" serializeAs="String">
+                <value>False</value>
+            </setting>
+            <setting name="TerminalShowEol" serializeAs="String">
+                <value>False</value>
+            </setting>
+            <setting name="TerminalShowWhitespace" serializeAs="String">
+                <value>0</value>
+            </setting>
+            <setting name="MicropythonDocUrl" serializeAs="String">
+                <value>http://docs.micropython.org</value>
+            </setting>
+        </EspRade.Properties.Settings>
+        <EspIDE.Properties.Settings>
+            <setting name="PortName" serializeAs="String">
+                <value />
+            </setting>
+            <setting name="BaudRate" serializeAs="String">
+                <value>0</value>
+            </setting>
+            <setting name="BoardType" serializeAs="String">
+                <value />
+            </setting>
+            <setting name="PythonIndent" serializeAs="String">
+                <value>4</value>
+            </setting>
+            <setting name="PythonDir" serializeAs="String">
+                <value />
+            </setting>
+            <setting name="Ampy" serializeAs="String">
+                <value />
+            </setting>
+            <setting name="EspTool" serializeAs="String">
+                <value />
+            </setting>
+        </EspIDE.Properties.Settings>
+    </userSettings>
+  <runtime>
+    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+      <dependentAssembly>
+        <assemblyIdentity name="Microsoft.Scripting" publicKeyToken="7f709c5b713576e1" culture="neutral" />
+        <bindingRedirect oldVersion="0.0.0.0-1.2.0.0" newVersion="1.2.0.0" />
+      </dependentAssembly>
+      <dependentAssembly>
+        <assemblyIdentity name="Microsoft.Dynamic" publicKeyToken="7f709c5b713576e1" culture="neutral" />
+        <bindingRedirect oldVersion="0.0.0.0-1.2.0.0" newVersion="1.2.0.0" />
+      </dependentAssembly>
+    </assemblyBinding>
+  </runtime>
+</configuration>

+ 741 - 0
EsPy/Components/AutocompleteMenu.cs

@@ -0,0 +1,741 @@
+using System;
+using System.Collections.Generic;
+using System.Windows.Forms;
+using System.Drawing;
+using System.ComponentModel;
+using System.Drawing.Drawing2D;
+using System.Text.RegularExpressions;
+using ScintillaNET;
+
+namespace FastColoredTextBoxNS
+{
+    /// <summary>
+    /// Popup menu for autocomplete
+    /// </summary>
+    [Browsable(false)]
+    public class AutocompleteMenu : ToolStripDropDown, IDisposable
+    {
+        AutocompleteListView listView;
+        public ToolStripControlHost host;
+        public Range Fragment { get; internal set; }
+
+        /// <summary>
+        /// Regex pattern for serach fragment around caret
+        /// </summary>
+        public string SearchPattern { get; set; }
+        /// <summary>
+        /// Minimum fragment length for popup
+        /// </summary>
+        public int MinFragmentLength { get; set; }
+        /// <summary>
+        /// User selects item
+        /// </summary>
+        public event EventHandler<SelectingEventArgs> Selecting;
+        /// <summary>
+        /// It fires after item inserting
+        /// </summary>
+        /// 
+
+        public event EventHandler<SelectedEventArgs> Selected;
+        /// <summary>
+        /// Occurs when popup menu is opening
+        /// </summary>
+        public new event EventHandler<CancelEventArgs> Opening;
+        /// <summary>
+        /// Allow TAB for select menu item
+        /// </summary>
+        public bool AllowTabKey { get { return listView.AllowTabKey; } set { listView.AllowTabKey = value; } }
+        /// <summary>
+        /// Interval of menu appear (ms)
+        /// </summary>
+        public int AppearInterval { get { return listView.AppearInterval; } set { listView.AppearInterval = value; } }
+
+        /// <summary>
+        /// Back color of selected item
+        /// </summary>
+        [DefaultValue(typeof(Color), "Orange")]
+        public Color SelectedColor
+        {
+            get { return listView.SelectedColor; }
+            set { listView.SelectedColor = value; }
+        }
+
+        /// <summary>
+        /// Border color of hovered item
+        /// </summary>
+        [DefaultValue(typeof(Color), "Red")]
+        public Color HoveredColor
+        {
+            get { return listView.HoveredColor; }
+            set { listView.HoveredColor = value; }
+        }
+
+        public AutocompleteMenu(Scintilla tb)
+        {
+            // create a new popup and add the list view to it 
+            AutoClose = false;
+            AutoSize = false;
+            Margin = Padding.Empty;
+            Padding = Padding.Empty;
+            BackColor = Color.White;
+            listView = new AutocompleteListView(tb);
+            host = new ToolStripControlHost(listView);
+            host.Margin = new Padding(2, 2, 2, 2);
+            host.Padding = Padding.Empty;
+            host.AutoSize = false;
+            host.AutoToolTip = false;
+            CalcSize();
+            base.Items.Add(host);
+            listView.Parent = this;
+            SearchPattern = @"[\w\.]";
+            MinFragmentLength = 2;
+
+        }
+
+        public new Font Font
+        {
+            get { return listView.Font; }
+            set { listView.Font = value; }
+        }
+
+        new internal void OnOpening(CancelEventArgs args)
+        {
+            if (Opening != null)
+                Opening(this, args);
+        }
+
+        public new void Close()
+        {
+            listView.toolTip.Hide(listView);
+            base.Close();
+        }
+
+        internal void CalcSize()
+        {
+            host.Size = listView.Size;
+            Size = new System.Drawing.Size(listView.Size.Width + 4, listView.Size.Height + 4);
+        }
+
+        public virtual void OnSelecting()
+        {
+            listView.OnSelecting();
+        }
+
+        public void SelectNext(int shift)
+        {
+            listView.SelectNext(shift);
+        }
+
+        internal void OnSelecting(SelectingEventArgs args)
+        {
+            if (Selecting != null)
+                Selecting(this, args);
+        }
+
+        public void OnSelected(SelectedEventArgs args)
+        {
+            if (Selected != null)
+                Selected(this, args);
+        }
+
+        public new AutocompleteListView Items
+        {
+            get { return listView; }
+        }
+
+        /// <summary>
+        /// Shows popup menu immediately
+        /// </summary>
+        /// <param name="forced">If True - MinFragmentLength will be ignored</param>
+        public void Show(bool forced)
+        {
+            Items.DoAutocomplete(forced);
+        }
+
+        /// <summary>
+        /// Minimal size of menu
+        /// </summary>
+        public new Size MinimumSize
+        {
+            get { return Items.MinimumSize; }
+            set { Items.MinimumSize = value; }
+        }
+
+        /// <summary>
+        /// Image list of menu
+        /// </summary>
+        public new ImageList ImageList
+        {
+            get { return Items.ImageList; }
+            set { Items.ImageList = value; }
+        }
+
+        /// <summary>
+        /// Tooltip duration (ms)
+        /// </summary>
+        public int ToolTipDuration
+        {
+            get { return Items.ToolTipDuration; }
+            set { Items.ToolTipDuration = value; }
+        }
+
+        /// <summary>
+        /// Tooltip
+        /// </summary>
+        public ToolTip ToolTip
+        {
+            get { return Items.toolTip; }
+            set { Items.toolTip = value; }
+        }
+
+        protected override void Dispose(bool disposing)
+        {
+            base.Dispose(disposing);
+            if (listView != null && !listView.IsDisposed)
+                listView.Dispose();
+        }
+    }
+
+    [System.ComponentModel.ToolboxItem(false)]
+    public class AutocompleteListView : UserControl
+    {
+        public event EventHandler FocussedItemIndexChanged;
+
+        internal List<AutocompleteItem> visibleItems;
+        IEnumerable<AutocompleteItem> sourceItems = new List<AutocompleteItem>();
+        int focussedItemIndex = 0;
+        int hoveredItemIndex = -1;
+
+        private int ItemHeight
+        {
+            get { return Font.Height + 2; }
+        }
+
+        AutocompleteMenu Menu { get { return Parent as AutocompleteMenu; } }
+        int oldItemCount = 0;
+        Scintilla tb;
+        internal ToolTip toolTip = new ToolTip();
+        System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer();
+
+        internal bool AllowTabKey { get; set; }
+        public ImageList ImageList { get; set; }
+        internal int AppearInterval { get { return timer.Interval; } set { timer.Interval = value; } }
+        internal int ToolTipDuration { get; set; }
+
+        public Color SelectedColor { get; set; }
+        public Color HoveredColor { get; set; }
+        public int FocussedItemIndex
+        {
+            get { return focussedItemIndex; }
+            set
+            {
+                if (focussedItemIndex != value)
+                {
+                    focussedItemIndex = value;
+                    if (FocussedItemIndexChanged != null)
+                        FocussedItemIndexChanged(this, EventArgs.Empty);
+                }
+            }
+        }
+
+        public AutocompleteItem FocussedItem
+        {
+            get
+            {
+                if (FocussedItemIndex >= 0 && focussedItemIndex < visibleItems.Count)
+                    return visibleItems[focussedItemIndex];
+                return null;
+            }
+            set
+            {
+                FocussedItemIndex = visibleItems.IndexOf(value);
+            }
+        }
+
+        internal AutocompleteListView(Scintilla tb)
+        {
+            SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.UserPaint, true);
+            base.Font = new Font(FontFamily.GenericSansSerif, 9);
+            visibleItems = new List<AutocompleteItem>();
+            VerticalScroll.SmallChange = ItemHeight;
+            MaximumSize = new Size(Size.Width, 180);
+            toolTip.ShowAlways = false;
+            AppearInterval = 500;
+            timer.Tick += new EventHandler(timer_Tick);
+            SelectedColor = Color.Orange;
+            HoveredColor = Color.Red;
+            ToolTipDuration = 3000;
+
+            this.tb = tb;
+
+            tb.KeyDown += new KeyEventHandler(tb_KeyDown);
+            //tb.Sele.SelectionChanged += new EventHandler(tb_SelectionChanged);
+            //tb.KeyPressed += new KeyPressEventHandler(tb_KeyPressed);
+
+            Form form = tb.FindForm();
+            if (form != null)
+            {
+                form.LocationChanged += delegate { SafetyClose(); };
+                form.ResizeBegin += delegate { SafetyClose(); };
+                form.FormClosing += delegate { SafetyClose(); };
+                form.LostFocus += delegate { SafetyClose(); };
+            }
+
+            tb.LostFocus += (o, e) =>
+            {
+                if (Menu != null && !Menu.IsDisposed)
+                    if (!Menu.Focused)
+                        SafetyClose();
+            };
+
+            //tb.Scroll += delegate { SafetyClose(); };
+
+            this.VisibleChanged += (o, e) =>
+            {
+                if (this.Visible)
+                    DoSelectedVisible();
+            };
+        }
+
+        void SafetyClose()
+        {
+            if (Menu != null && !Menu.IsDisposed)
+                Menu.Close();
+        }
+
+        void tb_KeyPressed(object sender, KeyPressEventArgs e)
+        {
+            bool backspaceORdel = e.KeyChar == '\b' || e.KeyChar == 0xff;
+
+            /*
+            if (backspaceORdel)
+                prevSelection = tb.Selection.Start;*/
+
+            if (Menu.Visible && !backspaceORdel)
+                DoAutocomplete(false);
+            else
+                ResetTimer(timer);
+        }
+
+        void timer_Tick(object sender, EventArgs e)
+        {
+            timer.Stop();
+            DoAutocomplete(false);
+        }
+
+        void ResetTimer(System.Windows.Forms.Timer timer)
+        {
+            timer.Stop();
+            timer.Start();
+        }
+
+        internal void DoAutocomplete()
+        {
+            DoAutocomplete(false);
+        }
+
+        internal void DoAutocomplete(bool forced)
+        {
+            if (!Menu.Enabled)
+            {
+                Menu.Close();
+                return;
+            }
+
+            visibleItems.Clear();
+            FocussedItemIndex = 0;
+            VerticalScroll.Value = 0;
+            //some magic for update scrolls
+            AutoScrollMinSize -= new Size(1, 0);
+            AutoScrollMinSize += new Size(1, 0);
+            //get fragment around caret
+            Range fragment = tb.Selection.GetFragment(Menu.SearchPattern);
+            string text = fragment.Text;
+            //calc screen point for popup menu
+            Point point = tb.PlaceToPoint(fragment.End);
+            point.Offset(2, tb.CharHeight);
+            //
+            if (forced || (text.Length >= Menu.MinFragmentLength
+                && tb.Selection.IsEmpty /*pops up only if selected range is empty*/
+                && (tb.Selection.Start > fragment.Start || text.Length == 0/*pops up only if caret is after first letter*/)))
+            {
+                Menu.Fragment = fragment;
+                bool foundSelected = false;
+                //build popup menu
+                foreach (var item in sourceItems)
+                {
+                    item.Parent = Menu;
+                    CompareResult res = item.Compare(text);
+                    if (res != CompareResult.Hidden)
+                        visibleItems.Add(item);
+                    if (res == CompareResult.VisibleAndSelected && !foundSelected)
+                    {
+                        foundSelected = true;
+                        FocussedItemIndex = visibleItems.Count - 1;
+                    }
+                }
+
+                if (foundSelected)
+                {
+                    AdjustScroll();
+                    DoSelectedVisible();
+                }
+            }
+
+            //show popup menu
+            if (Count > 0)
+            {
+                if (!Menu.Visible)
+                {
+                    CancelEventArgs args = new CancelEventArgs();
+                    Menu.OnOpening(args);
+                    if (!args.Cancel)
+                        Menu.Show(tb, point);
+                }
+                else
+                    Invalidate();
+            }
+            else
+                Menu.Close();
+        }
+
+        void tb_SelectionChanged(object sender, EventArgs e)
+        {
+            /*
+            FastColoredTextBox tb = sender as FastColoredTextBox;
+            
+            if (Math.Abs(prevSelection.iChar - tb.Selection.Start.iChar) > 1 ||
+                        prevSelection.iLine != tb.Selection.Start.iLine)
+                Menu.Close();
+            prevSelection = tb.Selection.Start;*/
+            if (Menu.Visible)
+            {
+                bool needClose = false;
+
+                if (!tb.Selection.IsEmpty)
+                    needClose = true;
+                else
+                    if (!Menu.Fragment.Contains(tb.Selection.Start))
+                {
+                    if (tb.Selection.Start.iLine == Menu.Fragment.End.iLine && tb.Selection.Start.iChar == Menu.Fragment.End.iChar + 1)
+                    {
+                        //user press key at end of fragment
+                        char c = tb.Selection.CharBeforeStart;
+                        if (!Regex.IsMatch(c.ToString(), Menu.SearchPattern))//check char
+                            needClose = true;
+                    }
+                    else
+                        needClose = true;
+                }
+
+                if (needClose)
+                    Menu.Close();
+            }
+
+        }
+
+        void tb_KeyDown(object sender, KeyEventArgs e)
+        {
+            var tb = sender as FastColoredTextBox;
+
+            if (Menu.Visible)
+                if (ProcessKey(e.KeyCode, e.Modifiers))
+                    e.Handled = true;
+
+            if (!Menu.Visible)
+            {
+                if (tb.HotkeysMapping.ContainsKey(e.KeyData) && tb.HotkeysMapping[e.KeyData] == FCTBAction.AutocompleteMenu)
+                {
+                    DoAutocomplete();
+                    e.Handled = true;
+                }
+                else
+                {
+                    if (e.KeyCode == Keys.Escape && timer.Enabled)
+                        timer.Stop();
+                }
+            }
+        }
+
+        void AdjustScroll()
+        {
+            if (oldItemCount == visibleItems.Count)
+                return;
+
+            int needHeight = ItemHeight * visibleItems.Count + 1;
+            Height = Math.Min(needHeight, MaximumSize.Height);
+            Menu.CalcSize();
+
+            AutoScrollMinSize = new Size(0, needHeight);
+            oldItemCount = visibleItems.Count;
+        }
+
+        protected override void OnPaint(PaintEventArgs e)
+        {
+            AdjustScroll();
+
+            var itemHeight = ItemHeight;
+            int startI = VerticalScroll.Value / itemHeight - 1;
+            int finishI = (VerticalScroll.Value + ClientSize.Height) / itemHeight + 1;
+            startI = Math.Max(startI, 0);
+            finishI = Math.Min(finishI, visibleItems.Count);
+            int y = 0;
+            int leftPadding = 18;
+            for (int i = startI; i < finishI; i++)
+            {
+                y = i * itemHeight - VerticalScroll.Value;
+
+                var item = visibleItems[i];
+
+                if (item.BackColor != Color.Transparent)
+                    using (var brush = new SolidBrush(item.BackColor))
+                        e.Graphics.FillRectangle(brush, 1, y, ClientSize.Width - 1 - 1, itemHeight - 1);
+
+                if (ImageList != null && visibleItems[i].ImageIndex >= 0)
+                    e.Graphics.DrawImage(ImageList.Images[item.ImageIndex], 1, y);
+
+                if (i == FocussedItemIndex)
+                    using (var selectedBrush = new LinearGradientBrush(new Point(0, y - 3), new Point(0, y + itemHeight), Color.Transparent, SelectedColor))
+                    using (var pen = new Pen(SelectedColor))
+                    {
+                        e.Graphics.FillRectangle(selectedBrush, leftPadding, y, ClientSize.Width - 1 - leftPadding, itemHeight - 1);
+                        e.Graphics.DrawRectangle(pen, leftPadding, y, ClientSize.Width - 1 - leftPadding, itemHeight - 1);
+                    }
+
+                if (i == hoveredItemIndex)
+                    using (var pen = new Pen(HoveredColor))
+                        e.Graphics.DrawRectangle(pen, leftPadding, y, ClientSize.Width - 1 - leftPadding, itemHeight - 1);
+
+                using (var brush = new SolidBrush(item.ForeColor != Color.Transparent ? item.ForeColor : ForeColor))
+                    e.Graphics.DrawString(item.ToString(), Font, brush, leftPadding, y);
+            }
+        }
+
+        protected override void OnScroll(ScrollEventArgs se)
+        {
+            base.OnScroll(se);
+            Invalidate();
+        }
+
+        protected override void OnMouseClick(MouseEventArgs e)
+        {
+            base.OnMouseClick(e);
+
+            if (e.Button == System.Windows.Forms.MouseButtons.Left)
+            {
+                FocussedItemIndex = PointToItemIndex(e.Location);
+                DoSelectedVisible();
+                Invalidate();
+            }
+        }
+
+        protected override void OnMouseDoubleClick(MouseEventArgs e)
+        {
+            base.OnMouseDoubleClick(e);
+            FocussedItemIndex = PointToItemIndex(e.Location);
+            Invalidate();
+            OnSelecting();
+        }
+
+        internal virtual void OnSelecting()
+        {
+            if (FocussedItemIndex < 0 || FocussedItemIndex >= visibleItems.Count)
+                return;
+            tb.TextSource.Manager.BeginAutoUndoCommands();
+            try
+            {
+                AutocompleteItem item = FocussedItem;
+                SelectingEventArgs args = new SelectingEventArgs()
+                {
+                    Item = item,
+                    SelectedIndex = FocussedItemIndex
+                };
+
+                Menu.OnSelecting(args);
+
+                if (args.Cancel)
+                {
+                    FocussedItemIndex = args.SelectedIndex;
+                    Invalidate();
+                    return;
+                }
+
+                if (!args.Handled)
+                {
+                    var fragment = Menu.Fragment;
+                    DoAutocomplete(item, fragment);
+                }
+
+                Menu.Close();
+                //
+                SelectedEventArgs args2 = new SelectedEventArgs()
+                {
+                    Item = item,
+                    Tb = Menu.Fragment.tb
+                };
+                item.OnSelected(Menu, args2);
+                Menu.OnSelected(args2);
+            }
+            finally
+            {
+                tb.TextSource.Manager.EndAutoUndoCommands();
+            }
+        }
+
+        private void DoAutocomplete(AutocompleteItem item, Range fragment)
+        {
+            string newText = item.GetTextForReplace();
+
+            //replace text of fragment
+            var tb = fragment.tb;
+
+            tb.BeginAutoUndo();
+            tb.TextSource.Manager.ExecuteCommand(new SelectCommand(tb.TextSource));
+            if (tb.Selection.ColumnSelectionMode)
+            {
+                var start = tb.Selection.Start;
+                var end = tb.Selection.End;
+                start.iChar = fragment.Start.iChar;
+                end.iChar = fragment.End.iChar;
+                tb.Selection.Start = start;
+                tb.Selection.End = end;
+            }
+            else
+            {
+                tb.Selection.Start = fragment.Start;
+                tb.Selection.End = fragment.End;
+            }
+            tb.InsertText(newText);
+            tb.TextSource.Manager.ExecuteCommand(new SelectCommand(tb.TextSource));
+            tb.EndAutoUndo();
+            tb.Focus();
+        }
+
+        int PointToItemIndex(Point p)
+        {
+            return (p.Y + VerticalScroll.Value) / ItemHeight;
+        }
+
+        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
+        {
+            ProcessKey(keyData, Keys.None);
+
+            return base.ProcessCmdKey(ref msg, keyData);
+        }
+
+        private bool ProcessKey(Keys keyData, Keys keyModifiers)
+        {
+            if (keyModifiers == Keys.None)
+                switch (keyData)
+                {
+                    case Keys.Down:
+                        SelectNext(+1);
+                        return true;
+                    case Keys.PageDown:
+                        SelectNext(+10);
+                        return true;
+                    case Keys.Up:
+                        SelectNext(-1);
+                        return true;
+                    case Keys.PageUp:
+                        SelectNext(-10);
+                        return true;
+                    case Keys.Enter:
+                        OnSelecting();
+                        return true;
+                    case Keys.Tab:
+                        if (!AllowTabKey)
+                            break;
+                        OnSelecting();
+                        return true;
+                    case Keys.Escape:
+                        Menu.Close();
+                        return true;
+                }
+
+            return false;
+        }
+
+        public void SelectNext(int shift)
+        {
+            FocussedItemIndex = Math.Max(0, Math.Min(FocussedItemIndex + shift, visibleItems.Count - 1));
+            DoSelectedVisible();
+            //
+            Invalidate();
+        }
+
+        private void DoSelectedVisible()
+        {
+            if (FocussedItem != null)
+                SetToolTip(FocussedItem);
+
+            var y = FocussedItemIndex * ItemHeight - VerticalScroll.Value;
+            if (y < 0)
+                VerticalScroll.Value = FocussedItemIndex * ItemHeight;
+            if (y > ClientSize.Height - ItemHeight)
+                VerticalScroll.Value = Math.Min(VerticalScroll.Maximum, FocussedItemIndex * ItemHeight - ClientSize.Height + ItemHeight);
+            //some magic for update scrolls
+            AutoScrollMinSize -= new Size(1, 0);
+            AutoScrollMinSize += new Size(1, 0);
+        }
+
+        private void SetToolTip(AutocompleteItem autocompleteItem)
+        {
+            var title = autocompleteItem.ToolTipTitle;
+            var text = autocompleteItem.ToolTipText;
+
+            if (string.IsNullOrEmpty(title))
+            {
+                toolTip.ToolTipTitle = null;
+                toolTip.SetToolTip(this, null);
+                return;
+            }
+
+            IWin32Window window = this.Parent ?? this;
+            Point location = new Point((window == this ? Width : Right) + 3, 0);
+
+            if (string.IsNullOrEmpty(text))
+            {
+                toolTip.ToolTipTitle = null;
+                toolTip.Show(title, window, location.X, location.Y, ToolTipDuration);
+            }
+            else
+            {
+                toolTip.ToolTipTitle = title;
+                toolTip.Show(text, window, location.X, location.Y, ToolTipDuration);
+            }
+        }
+
+        public int Count
+        {
+            get { return visibleItems.Count; }
+        }
+
+        public void SetAutocompleteItems(ICollection<string> items)
+        {
+            List<AutocompleteItem> list = new List<AutocompleteItem>(items.Count);
+            foreach (var item in items)
+                list.Add(new AutocompleteItem(item));
+            SetAutocompleteItems(list);
+        }
+
+        public void SetAutocompleteItems(IEnumerable<AutocompleteItem> items)
+        {
+            sourceItems = items;
+        }
+    }
+
+    public class SelectingEventArgs : EventArgs
+    {
+        public AutocompleteItem Item { get; internal set; }
+        public bool Cancel { get; set; }
+        public int SelectedIndex { get; set; }
+        public bool Handled { get; set; }
+    }
+
+    public class SelectedEventArgs : EventArgs
+    {
+        public AutocompleteItem Item { get; internal set; }
+        public FastColoredTextBox Tb { get; set; }
+    }
+}

+ 266 - 0
EsPy/Components/AutocopleteItem.cs

@@ -0,0 +1,266 @@
+using System;
+using System.Drawing;
+using System.Drawing.Printing;
+
+namespace FastColoredTextBoxNS
+{
+    /// <summary>
+    /// Item of autocomplete menu
+    /// </summary>
+    public class AutocompleteItem
+    {
+        public string Text;
+        public int ImageIndex = -1;
+        public object Tag;
+        string toolTipTitle;
+        string toolTipText;
+        string menuText;
+        public AutocompleteMenu Parent { get; internal set; }
+
+
+        public AutocompleteItem()
+        {
+        }
+
+        public AutocompleteItem(string text)
+        {
+            Text = text;
+        }
+
+        public AutocompleteItem(string text, int imageIndex)
+            : this(text)
+        {
+            this.ImageIndex = imageIndex;
+        }
+
+        public AutocompleteItem(string text, int imageIndex, string menuText)
+            : this(text, imageIndex)
+        {
+            this.menuText = menuText;
+        }
+
+        public AutocompleteItem(string text, int imageIndex, string menuText, string toolTipTitle, string toolTipText)
+            : this(text, imageIndex, menuText)
+        {
+            this.toolTipTitle = toolTipTitle;
+            this.toolTipText = toolTipText;
+        }
+
+        /// <summary>
+        /// Returns text for inserting into Textbox
+        /// </summary>
+        public virtual string GetTextForReplace()
+        {
+            return Text;
+        }
+
+        /// <summary>
+        /// Compares fragment text with this item
+        /// </summary>
+        public virtual CompareResult Compare(string fragmentText)
+        {
+            if (Text.StartsWith(fragmentText, StringComparison.InvariantCultureIgnoreCase) &&
+                   Text != fragmentText)
+                return CompareResult.VisibleAndSelected;
+
+            return CompareResult.Hidden;
+        }
+
+        /// <summary>
+        /// Returns text for display into popup menu
+        /// </summary>
+        public override string ToString()
+        {
+            return menuText ?? Text;
+        }
+
+        /// <summary>
+        /// This method is called after item inserted into text
+        /// </summary>
+        public virtual void OnSelected(AutocompleteMenu popupMenu, SelectedEventArgs e)
+        {
+            ;
+        }
+
+        /// <summary>
+        /// Title for tooltip.
+        /// </summary>
+        /// <remarks>Return null for disable tooltip for this item</remarks>
+        public virtual string ToolTipTitle
+        {
+            get { return toolTipTitle; }
+            set { toolTipTitle = value; }
+        }
+
+        /// <summary>
+        /// Tooltip text.
+        /// </summary>
+        /// <remarks>For display tooltip text, ToolTipTitle must be not null</remarks>
+        public virtual string ToolTipText
+        {
+            get { return toolTipText; }
+            set { toolTipText = value; }
+        }
+
+        /// <summary>
+        /// Menu text. This text is displayed in the drop-down menu.
+        /// </summary>
+        public virtual string MenuText
+        {
+            get { return menuText; }
+            set { menuText = value; }
+        }
+
+        /// <summary>
+        /// Fore color of text of item
+        /// </summary>
+        public virtual Color ForeColor
+        {
+            get { return Color.Transparent; }
+            set { throw new NotImplementedException("Override this property to change color"); }
+        }
+
+        /// <summary>
+        /// Back color of item
+        /// </summary>
+        public virtual Color BackColor
+        {
+            get { return Color.Transparent; }
+            set { throw new NotImplementedException("Override this property to change color"); }
+        }
+    }
+
+    public enum CompareResult
+    {
+        /// <summary>
+        /// Item do not appears
+        /// </summary>
+        Hidden,
+        /// <summary>
+        /// Item appears
+        /// </summary>
+        Visible,
+        /// <summary>
+        /// Item appears and will selected
+        /// </summary>
+        VisibleAndSelected
+    }
+
+    /// <summary>
+    /// Autocomplete item for code snippets
+    /// </summary>
+    /// <remarks>Snippet can contain special char ^ for caret position.</remarks>
+    public class SnippetAutocompleteItem : AutocompleteItem
+    {
+        public SnippetAutocompleteItem(string snippet)
+        {
+            Text = snippet.Replace("\r", "");
+            ToolTipTitle = "Code snippet:";
+            ToolTipText = Text;
+        }
+
+        public override string ToString()
+        {
+            return MenuText ?? Text.Replace("\n", " ").Replace("^", "");
+        }
+
+        public override string GetTextForReplace()
+        {
+            return Text;
+        }
+
+        public override void OnSelected(AutocompleteMenu popupMenu, SelectedEventArgs e)
+        {
+            e.Tb.BeginUpdate();
+            e.Tb.Selection.BeginUpdate();
+            //remember places
+            var p1 = popupMenu.Fragment.Start;
+            var p2 = e.Tb.Selection.Start;
+            //do auto indent
+            if (e.Tb.AutoIndent)
+            {
+                for (int iLine = p1.iLine + 1; iLine <= p2.iLine; iLine++)
+                {
+                    e.Tb.Selection.Start = new Place(0, iLine);
+                    e.Tb.DoAutoIndent(iLine);
+                }
+            }
+            e.Tb.Selection.Start = p1;
+            //move caret position right and find char ^
+            while (e.Tb.Selection.CharBeforeStart != '^')
+                if (!e.Tb.Selection.GoRightThroughFolded())
+                    break;
+            //remove char ^
+            e.Tb.Selection.GoLeft(true);
+            e.Tb.InsertText("");
+            //
+            e.Tb.Selection.EndUpdate();
+            e.Tb.EndUpdate();
+        }
+
+        /// <summary>
+        /// Compares fragment text with this item
+        /// </summary>
+        public override CompareResult Compare(string fragmentText)
+        {
+            if (Text.StartsWith(fragmentText, StringComparison.InvariantCultureIgnoreCase) &&
+                   Text != fragmentText)
+                return CompareResult.Visible;
+
+            return CompareResult.Hidden;
+        }
+    }
+
+    /// <summary>
+    /// This autocomplete item appears after dot
+    /// </summary>
+    public class MethodAutocompleteItem : AutocompleteItem
+    {
+        string firstPart;
+        string lowercaseText;
+
+        public MethodAutocompleteItem(string text)
+            : base(text)
+        {
+            lowercaseText = Text.ToLower();
+        }
+
+        public override CompareResult Compare(string fragmentText)
+        {
+            int i = fragmentText.LastIndexOf('.');
+            if (i < 0)
+                return CompareResult.Hidden;
+            string lastPart = fragmentText.Substring(i + 1);
+            firstPart = fragmentText.Substring(0, i);
+
+            if (lastPart == "") return CompareResult.Visible;
+            if (Text.StartsWith(lastPart, StringComparison.InvariantCultureIgnoreCase))
+                return CompareResult.VisibleAndSelected;
+            if (lowercaseText.Contains(lastPart.ToLower()))
+                return CompareResult.Visible;
+
+            return CompareResult.Hidden;
+        }
+
+        public override string GetTextForReplace()
+        {
+            return firstPart + "." + Text;
+        }
+    }
+
+    /// <summary>
+    /// This Item does not check correspondence to current text fragment.
+    /// SuggestItem is intended for dynamic menus.
+    /// </summary>
+    public class SuggestItem : AutocompleteItem
+    {
+        public SuggestItem(string text, int imageIndex) : base(text, imageIndex)
+        {
+        }
+
+        public override CompareResult Compare(string fragmentText)
+        {
+            return CompareResult.Visible;
+        }
+    }
+}

+ 34 - 0
EsPy/Components/Completion/AutoCompletion.cs

@@ -0,0 +1,34 @@
+using ScintillaNET;
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace EsPy.Components.Completion
+{
+    public class AutoCompletion : ToolStripDropDown, IDisposable
+    {
+        public AutoCompletion(Scintilla scintilla)
+        {
+            AutoClose = false;
+            AutoSize = false;
+            Margin = Padding.Empty;
+            Padding = Padding.Empty;
+            BackColor = Color.White;
+            CompletionListBox listView = new CompletionListBox(scintilla);
+            ToolStripControlHost host = new ToolStripControlHost(listView);
+            host.Margin = new Padding(2, 2, 2, 2);
+            host.Padding = Padding.Empty;
+            host.AutoSize = false;
+            host.AutoToolTip = false;
+            //CalcSize();
+            base.Items.Add(host);
+            listView.Parent = this;
+            //SearchPattern = @"[\w\.]";
+            //MinFragmentLength = 2;
+        }
+    }
+}

+ 76 - 0
EsPy/Components/Completion/CompletionForm.Designer.cs

@@ -0,0 +1,76 @@
+namespace EsPy.Components.Completion
+{
+    partial class CompletionForm
+    {
+        /// <summary>
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary>
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Windows Form Designer generated code
+
+        /// <summary>
+        /// Required method for Designer support - do not modify
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.components = new System.ComponentModel.Container();
+            this.imageList1 = new System.Windows.Forms.ImageList(this.components);
+            this.listBox1 = new EsPy.Components.Completion.CompletionListBox();
+            this.SuspendLayout();
+            // 
+            // imageList1
+            // 
+            this.imageList1.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;
+            this.imageList1.ImageSize = new System.Drawing.Size(16, 16);
+            this.imageList1.TransparentColor = System.Drawing.Color.Transparent;
+            // 
+            // listBox1
+            // 
+            this.listBox1.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.listBox1.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed;
+            this.listBox1.FormattingEnabled = true;
+            this.listBox1.ImageList = null;
+            this.listBox1.Location = new System.Drawing.Point(2, 2);
+            this.listBox1.Name = "listBox1";
+            this.listBox1.Size = new System.Drawing.Size(188, 153);
+            this.listBox1.TabIndex = 0;
+            // 
+            // CompletionForm
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.ClientSize = new System.Drawing.Size(192, 157);
+            this.Controls.Add(this.listBox1);
+            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
+            this.KeyPreview = true;
+            this.Name = "CompletionForm";
+            this.Padding = new System.Windows.Forms.Padding(2);
+            this.ShowIcon = false;
+            this.ShowInTaskbar = false;
+            this.StartPosition = System.Windows.Forms.FormStartPosition.Manual;
+            this.Text = "CompletionForm";
+            this.Load += new System.EventHandler(this.CompletionForm_Load);
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+        private System.Windows.Forms.ImageList imageList1;
+        private CompletionListBox listBox1;
+    }
+}

+ 65 - 0
EsPy/Components/Completion/CompletionForm.cs

@@ -0,0 +1,65 @@
+using EsPy.Python;
+using EsPy.Python.Jedi;
+using EsPy.Utility;
+using ScintillaNET;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace EsPy.Components.Completion
+{
+    public partial class CompletionForm : Form
+    {
+        public class CompletionEventArgs : EventArgs
+        {
+            public string Word = "";
+            public CompletionEventArgs(string word)
+            {
+                this.Word = word;
+            }
+        }
+
+        public delegate void SelectedEvent(object sender, CompletionEventArgs e);
+        public delegate void ClosingEvent(object sender, CompletionEventArgs e);
+        public SelectedEvent Selected = null;
+        public ClosingEvent Closing = null;
+
+        public CompletionForm()
+        {
+            InitializeComponent();
+            //this.Capture = true;
+        }
+
+        public Scintilla Scintilla
+        {
+            get { return this.listBox1.Scintilla; }
+            set { this.listBox1.Scintilla = value; }
+        }
+
+        private List<BaseDefinition> FDefinitions = null;
+        public List<BaseDefinition> Definitions
+        {
+            get { return this.FDefinitions; }
+            set
+            {
+                this.listBox1.Items.Clear();
+                this.FDefinitions = value;
+                
+                this.listBox1.Items.AddRange(value.ToArray());
+                this.listBox1.Focus();// .Focused = true; //.SelectedIndex = 0;
+            }
+        }
+
+        public void Home()
+        {
+            
+        }
+      
+    }
+}

+ 123 - 0
EsPy/Components/Completion/CompletionForm.resx

@@ -0,0 +1,123 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="imageList1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+</root>

+ 228 - 0
EsPy/Components/Completion/CompletionListBox.cs

@@ -0,0 +1,228 @@
+using EsPy.Python.Jedi;
+using EsPy.Utility;
+using ScintillaNET;
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+using static EsPy.Utility.TextHelper;
+
+namespace EsPy.Components.Completion
+{
+    public class CompletionListBox : ListBox
+    {
+
+        Form Form = new Form();
+        public CompletionListBox(Scintilla scintilla)
+        {
+            this.InitializeComponent();
+
+            if (scintilla == null)
+                throw new ArgumentNullException();
+
+            this.Scintilla = scintilla;
+            this.DrawMode = DrawMode.OwnerDrawFixed;
+            this.Dock = DockStyle.Fill;
+
+            int word_start_pos = Utility.TextHelper.KeywordStartPosition(this.Scintilla.Text,this.Scintilla.CurrentPosition - 1) + 1;
+            int x = this.Scintilla.PointXFromPosition(word_start_pos);
+            int y = this.Scintilla.PointYFromPosition(word_start_pos);
+            
+            Point p = this.Scintilla.PointToScreen(new Point(x, y));
+            this.Form.Owner = Globals.MainForm;
+            
+            this.Form.FormBorderStyle = FormBorderStyle.None;
+            this.Form.TopLevel = true;this.Form.Show();
+            this.Form.Top = p.Y + (int)(this.Scintilla.Font.Height * 1.2);
+            this.Form.Left = p.X;
+            this.Form.Height = this.Height;
+            this.Form.Controls.Add(this);
+
+            this.Form.Deactivate += Form_Deactivate;
+
+        }
+
+        private void Form_Deactivate(object sender, EventArgs e)
+        {
+            this.Form.Deactivate -= Form_Deactivate;
+            this.Form.Close();
+        }
+
+        protected override void OnDrawItem(System.Windows.Forms.DrawItemEventArgs e)
+        {
+            e.DrawBackground();
+            e.DrawFocusRectangle();
+
+            if (e.Index >= 0)
+            {
+                BaseDefinition item = (BaseDefinition)Items[e.Index];
+                if (item.ImageIndex != -1 && this.imageList1.Images.Count > item.ImageIndex)
+                {
+                    Size image_size = imageList1.ImageSize;
+                    this.imageList1.Draw(e.Graphics, e.Bounds.Left, e.Bounds.Top, item.ImageIndex);
+                    e.Graphics.DrawString(item.Text, e.Font, new SolidBrush(e.ForeColor),
+                        e.Bounds.Left + image_size.Width, e.Bounds.Top);
+                }
+                else
+                {
+                    e.Graphics.DrawString(item.Text, e.Font, new SolidBrush(e.ForeColor),
+                       e.Bounds.Left, e.Bounds.Top);
+                }
+            }
+        }
+
+        private ImageList imageList1;
+
+        //private ImageList FImageList;
+        //public ImageList ImageList
+        //{
+        //    get { return FImageList; }
+        //    set { FImageList = value; }
+        //}
+
+
+
+        public BaseDefinition SelectedDefinition
+        { get { return this.SelectedItem as BaseDefinition; } }
+
+
+        public Words Words
+        { get; set; }
+
+        private void DoFilter()
+        {
+            var defs = this.Definitions.Where(k => k.name.StartsWith(this.Words.Filter)).ToArray();
+
+            this.Items.Clear();
+            this.Items.AddRange(defs);
+
+            for (int i = 0; i < this.Items.Count; i++)
+            {
+
+                if (((this.Items[i] as BaseDefinition).name.StartsWith(Words.Filter)))
+                {
+                    this.SelectedIndex = i;
+                    break;
+                }
+            }
+        }
+
+        private List<BaseDefinition> FDefinitions = null;
+        public List<BaseDefinition> Definitions
+        {
+            get { return this.FDefinitions; }
+            set
+            {
+                this.Items.Clear();
+                this.FDefinitions = value;
+
+                // this.Items.AddRange(value.ToArray());
+                this.DoFilter();
+                this.Focus();// .Focused = true; //.SelectedIndex = 0;
+            }
+        }
+        private void SelectItem(int index)
+        {
+            if (this.Items.Count > 0)
+            {
+                if (index < 0 || index > this.Items.Count - 1)
+                    index = 0;
+
+                if (index < this.Items.Count)
+                    this.SelectedIndex = index;
+            }
+        }
+
+        public void SelectNextItem()
+        {
+            if (this.Items.Count > 0)
+            {
+                if (this.SelectedIndex < 0)
+                {
+                    this.SelectedIndex = 0;
+                    return;
+                }
+                if (this.SelectedIndex < this.Items.Count - 1)
+                    this.SelectedIndex++;
+            }
+        }
+
+        public void SelectPreviousItem()
+        {
+            if (this.Items.Count > 0)
+            {
+                if (this.SelectedIndex < 0)
+                {
+                    this.SelectedIndex = 0;
+                    return;
+                }
+                if (this.SelectedIndex > 0)
+                    this.SelectedIndex--;
+            }
+        }
+
+        public Scintilla Scintilla
+        { get; set; }
+
+        [System.Runtime.InteropServices.DllImport("user32.dll")]
+        private static extern IntPtr PostMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp);
+
+        protected override bool ProcessCmdKey(ref Message msg, Keys key)
+        {
+            const int WM_KEYDOWN = 0x100;
+            const int WM_SYSKEYDOWN = 0x104;
+
+            if (msg.Msg == WM_KEYDOWN || msg.Msg == WM_SYSKEYDOWN)
+            {
+                switch (key)
+                {
+                    case Keys.Up:
+                        this.SelectPreviousItem();
+                        return true;
+
+                    case Keys.Down:
+                        this.SelectNextItem();
+                        return true;
+
+                    case Keys.Escape:
+                        this.Form.Close();
+                        return true;
+
+                    case Keys.Enter:
+                        this.Form.Close();
+                        return true;
+                }
+
+                PostMessage(this.Scintilla.Handle, msg.Msg, msg.WParam, msg.LParam);
+                return true;
+            }
+            return base.ProcessCmdKey(ref msg, key);
+        }
+
+        private void InitializeComponent()
+        {
+            this.components = new System.ComponentModel.Container();
+            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(CompletionListBox));
+            this.imageList1 = new System.Windows.Forms.ImageList(this.components);
+            this.SuspendLayout();
+            // 
+            // imageList1
+            // 
+            this.imageList1.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageList1.ImageStream")));
+            this.imageList1.TransparentColor = System.Drawing.Color.Transparent;
+            this.imageList1.Images.SetKeyName(0, "module.png");
+            this.imageList1.Images.SetKeyName(1, "function.png");
+            // 
+            // CompletionListBox
+            // 
+            this.ItemHeight = 16;
+            this.Size = new System.Drawing.Size(96, 96);
+            this.ResumeLayout(false);
+
+        }
+        private System.ComponentModel.IContainer components;
+    }
+}

+ 174 - 0
EsPy/Components/Completion/CompletionListBox.resx

@@ -0,0 +1,174 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="imageList1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+  <data name="imageList1.ImageStream" mimetype="application/x-microsoft.net.object.binary.base64">
+    <value>
+        AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
+        LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
+        ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAB+
+        CQAAAk1TRnQBSQFMAgEBAgEAAQgBAAEIAQABEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
+        AwABQAMAARADAAEBAQABCAYAAQQYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA
+        AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5
+        AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA
+        AWYDAAGZAwABzAIAATMDAAIzAgABMwFmAgABMwGZAgABMwHMAgABMwH/AgABZgMAAWYBMwIAAmYCAAFm
+        AZkCAAFmAcwCAAFmAf8CAAGZAwABmQEzAgABmQFmAgACmQIAAZkBzAIAAZkB/wIAAcwDAAHMATMCAAHM
+        AWYCAAHMAZkCAALMAgABzAH/AgAB/wFmAgAB/wGZAgAB/wHMAQABMwH/AgAB/wEAATMBAAEzAQABZgEA
+        ATMBAAGZAQABMwEAAcwBAAEzAQAB/wEAAf8BMwIAAzMBAAIzAWYBAAIzAZkBAAIzAcwBAAIzAf8BAAEz
+        AWYCAAEzAWYBMwEAATMCZgEAATMBZgGZAQABMwFmAcwBAAEzAWYB/wEAATMBmQIAATMBmQEzAQABMwGZ
+        AWYBAAEzApkBAAEzAZkBzAEAATMBmQH/AQABMwHMAgABMwHMATMBAAEzAcwBZgEAATMBzAGZAQABMwLM
+        AQABMwHMAf8BAAEzAf8BMwEAATMB/wFmAQABMwH/AZkBAAEzAf8BzAEAATMC/wEAAWYDAAFmAQABMwEA
+        AWYBAAFmAQABZgEAAZkBAAFmAQABzAEAAWYBAAH/AQABZgEzAgABZgIzAQABZgEzAWYBAAFmATMBmQEA
+        AWYBMwHMAQABZgEzAf8BAAJmAgACZgEzAQADZgEAAmYBmQEAAmYBzAEAAWYBmQIAAWYBmQEzAQABZgGZ
+        AWYBAAFmApkBAAFmAZkBzAEAAWYBmQH/AQABZgHMAgABZgHMATMBAAFmAcwBmQEAAWYCzAEAAWYBzAH/
+        AQABZgH/AgABZgH/ATMBAAFmAf8BmQEAAWYB/wHMAQABzAEAAf8BAAH/AQABzAEAApkCAAGZATMBmQEA
+        AZkBAAGZAQABmQEAAcwBAAGZAwABmQIzAQABmQEAAWYBAAGZATMBzAEAAZkBAAH/AQABmQFmAgABmQFm
+        ATMBAAGZATMBZgEAAZkBZgGZAQABmQFmAcwBAAGZATMB/wEAApkBMwEAApkBZgEAA5kBAAKZAcwBAAKZ
+        Af8BAAGZAcwCAAGZAcwBMwEAAWYBzAFmAQABmQHMAZkBAAGZAswBAAGZAcwB/wEAAZkB/wIAAZkB/wEz
+        AQABmQHMAWYBAAGZAf8BmQEAAZkB/wHMAQABmQL/AQABzAMAAZkBAAEzAQABzAEAAWYBAAHMAQABmQEA
+        AcwBAAHMAQABmQEzAgABzAIzAQABzAEzAWYBAAHMATMBmQEAAcwBMwHMAQABzAEzAf8BAAHMAWYCAAHM
+        AWYBMwEAAZkCZgEAAcwBZgGZAQABzAFmAcwBAAGZAWYB/wEAAcwBmQIAAcwBmQEzAQABzAGZAWYBAAHM
+        ApkBAAHMAZkBzAEAAcwBmQH/AQACzAIAAswBMwEAAswBZgEAAswBmQEAA8wBAALMAf8BAAHMAf8CAAHM
+        Af8BMwEAAZkB/wFmAQABzAH/AZkBAAHMAf8BzAEAAcwC/wEAAcwBAAEzAQAB/wEAAWYBAAH/AQABmQEA
+        AcwBMwIAAf8CMwEAAf8BMwFmAQAB/wEzAZkBAAH/ATMBzAEAAf8BMwH/AQAB/wFmAgAB/wFmATMBAAHM
+        AmYBAAH/AWYBmQEAAf8BZgHMAQABzAFmAf8BAAH/AZkCAAH/AZkBMwEAAf8BmQFmAQAB/wKZAQAB/wGZ
+        AcwBAAH/AZkB/wEAAf8BzAIAAf8BzAEzAQAB/wHMAWYBAAH/AcwBmQEAAf8CzAEAAf8BzAH/AQAC/wEz
+        AQABzAH/AWYBAAL/AZkBAAL/AcwBAAJmAf8BAAFmAf8BZgEAAWYC/wEAAf8CZgEAAf8BZgH/AQAC/wFm
+        AQABIQEAAaUBAANfAQADdwEAA4YBAAOWAQADywEAA7IBAAPXAQAD3QEAA+MBAAPqAQAD8QEAA/gBAAHw
+        AfsB/wEAAaQCoAEAA4ADAAH/AgAB/wMAAv8BAAH/AwAB/wEAAf8BAAL/AgAD/0MAAf8B8gH/BQAB/wEH
+        AfAB/wIAARMBDgEHLgAB/wGTASUBbgHwAf8CAAH/AfcCTgHsAfMCAAHzAQAB8ggAAfMjAAH/ARwBLAFN
+        ASYBJQFuAfMB/wGYA04BLQFOAe8BAAH/AQ4B6wIAAfABEgQAARIBbQH0IQABkwZNAe8BBwFUATMDVAEz
+        AXECAAFtAQAB/wEAAeoBBwESAe0B/wESAW0BkgHqAf8gAAF0Ak0DUwFNAZMBmAIzBFUBcgIAAfcBAAEH
+        AQABEgH/AQAB9AHsARIB/wEAAW0B7yAAAXQCUwEsAU0CdQGTAZgEMwFVAeQBlwIAAfABAAH4AQABEgH0
+        AgABkgHvAgABvAHqIAABdAJTA00BUwGuAdMBsgFxA1UBWgGYAgAB9AEAAREBAAHqAbwBAAH/AeoB7AHz
+        AQAB9AESIAABkwSaAXUBkQPZAdMBswGdAeQBlwH0AgAB/wEOAQAB/wHvAW0BAAFtARIB/wHvARIB/wES
+        IAAB/wEaAZoBGgGaAe0G2QGdAZgB/wQAAeoBAAHyAf8B6gGSAf8EAAEHAeoiAAH1ARoBmQG7AtkD2gHZ
+        AfcB/wQAARADAAEPAfQBbQESBAABEgHxJQABuwH+A9kC2gHxBgABvAEAAewDAAHzKwAB7gXaAbQB9AYA
+        Af8BDgFDLwAB/wEJAdsC4QG6AfQIAAHsAQAB8QHvARIuAAH0AQkBuwH/CQAB9AHsAREBDgEHZwABQgFN
+        AT4HAAE+AwABKAMAAUADAAEQAwABAQEAAQEFAAGAFwAD/wEABP8EAAHHAcMBHwH/BAACgQGPAfcGAAGM
+        AfEGAAHEBwABxAGEBgABxAHMBgABxAGEBgABwAGABQABAQHgATwEAAHAAQMBwAE8BAAB+AEHAeMBvwQA
+        AfgBBwHjAf8EAAH4AQ8B8AF/BAAB/gEfAfABfwQABP8EAAs=
+</value>
+  </data>
+  <metadata name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </metadata>
+</root>

+ 58 - 0
EsPy/Components/CompletionForm.Designer.cs

@@ -0,0 +1,58 @@
+namespace EsPy.Components
+{
+    partial class CompletionForm
+    {
+        /// <summary>
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary>
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+       
+
+        #region Windows Form Designer generated code
+
+        /// <summary>
+        /// Required method for Designer support - do not modify
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.listBox = new EsPy.Components.ExListBox();
+            this.SuspendLayout();
+            // 
+            // listBox
+            // 
+            this.listBox.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.listBox.FormattingEnabled = true;
+            this.listBox.Location = new System.Drawing.Point(0, 0);
+            this.listBox.Name = "listBox";
+            this.listBox.Size = new System.Drawing.Size(213, 183);
+            this.listBox.TabIndex = 0;
+            // 
+            // CompletionForm
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.ClientSize = new System.Drawing.Size(213, 183);
+            this.ControlBox = false;
+            this.Controls.Add(this.listBox);
+            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
+            this.Name = "CompletionForm";
+            this.ShowIcon = false;
+            this.ShowInTaskbar = false;
+            this.Text = "CompletionForm";
+            this.Load += new System.EventHandler(this.CompletionForm_Load);
+            this.Shown += new System.EventHandler(this.CompletionForm_Shown);
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+
+        private ExListBox listBox;
+    }
+}

+ 220 - 0
EsPy/Components/CompletionForm.cs

@@ -0,0 +1,220 @@
+using EsPy.Python.Jedi;
+using ScintillaNET;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace EsPy.Components
+{
+    public partial class CompletionForm : Form
+    {
+        public event EventHandler FormDisposing = null;
+        public CompletionForm()
+        {
+            InitializeComponent();
+            //this.Capture = true;
+            this.listBox.SelectedIndexChanged += ListBox_SelectedIndexChanged;
+           
+            
+        }
+
+        protected override bool ShowWithoutActivation
+        {
+            get { return true; }
+        }
+
+        protected override CreateParams CreateParams
+        {
+            get
+            {
+                CreateParams baseParams = base.CreateParams;
+
+                const int WS_EX_NOACTIVATE = 0x08000000;
+                const int WS_EX_TOOLWINDOW = 0x00000080;
+                baseParams.ExStyle |= (int)(WS_EX_NOACTIVATE | WS_EX_TOOLWINDOW);
+
+                return baseParams;
+            }
+        }
+
+        protected override void Dispose(bool disposing)
+        {
+            if (this.ToolTip != null)
+            {
+                this.ToolTip.Dispose();
+            }
+
+            Globals.MainForm.Deactivate -= MainForm_Deactivate;
+            Globals.MainForm.Resize -= MainForm_Resize;
+
+            if (this.FormDisposing != null)
+                this.FormDisposing(this, new EventArgs());
+
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        private Scintilla FScintilla = null;
+        public Scintilla Scintilla
+        {
+            get { return this.FScintilla; }
+            set
+            {
+                this.FScintilla = value;
+                if (this.FScintilla != null)
+                {
+                    this.listBox.Font = this.Scintilla.Font;
+                }
+            }
+        }
+
+        public void Clear()
+        {
+            this.listBox.Items.Clear();
+        }
+
+        public void Add(Completion item)
+        {
+            this.listBox.Items.Add(item);
+        }
+
+        public void AddRange(List<Completion> list)
+        {
+            this.listBox.Items.AddRange(list.ToArray());
+        }
+
+        public int Count
+        { get { return this.listBox.Items.Count; } }
+
+        public int SelectedIndex
+        {
+            get { return this.listBox.SelectedIndex; }
+            set {
+
+                if (this.ToolTip != null)
+                {
+                    this.ToolTip.Dispose();
+                    this.ToolTip = null;
+                }
+                this.listBox.SelectedIndex = value;
+            }
+        }
+
+        //public void Home()
+        //{
+        //    this.SelectedIndex = 0;
+        //}
+
+        //public void End()
+        //{
+        //    this.SelectedIndex = this.listBox.Items.Count - 1;
+        //}
+
+        public BaseDefinition SelectedItem
+        { get { return this.listBox.SelectedItem as BaseDefinition; } }
+
+        public void SelectPrevious()
+        {
+            if (this.SelectedIndex < 0)
+            {
+                this.SelectedIndex = 0;
+            }
+            else if (this.SelectedIndex > 0)
+            {
+                this.SelectedIndex--;
+            }
+        }
+
+        public void SelectNext()
+        {
+            if (this.SelectedIndex < 0)
+            {
+                this.SelectedIndex = 0;
+            }
+            else if (this.SelectedIndex < this.listBox.Items.Count - 1)
+            {
+                this.SelectedIndex++;
+            }
+        }
+
+        //public void PageUp()
+        //{
+
+        //}
+
+        //public void PageDown()
+        //{
+
+        //}
+
+        private ToolTip ToolTip = null;
+        private void ListBox_SelectedIndexChanged(object sender, EventArgs e)
+        {
+            if (this.listBox.SelectedItem != null)
+            {
+                BaseDefinition def = (this.listBox.SelectedItem as BaseDefinition);
+
+                string doc = string.IsNullOrEmpty(def.docstring) ? "No documentation" : def.docstring;
+                string module = string.IsNullOrEmpty(def.module_name) ? "" : "module: " + def.module_name + "\r\n";
+                string type = string.IsNullOrEmpty(def.type) ? "" : def.type + " ";
+                string parm = def.parameters != null ? "(" + string.Join(", ", def.parameters) + ")" : "";
+                string title = type + def.name + parm;
+                if (ToolTip == null)
+                {
+                    //ToolTip.Hide(this);
+                    //ToolTip.Dispose();
+                    this.ToolTip = new ToolTip();
+                }
+                //ToolTip = new ToolTip();
+                if (!ToolTip.Equals(ToolTip.Tag))
+                {
+                    ToolTip.ShowAlways = true;
+                    ToolTip.ToolTipTitle = title;
+                    Point p = this.Scintilla.PointToClient(new Point(this.Right + 2, this.Top + 2));
+                    ToolTip.Tag = this.listBox.SelectedItem;
+                    ToolTip.Show(module + doc, this.Scintilla, p);
+                }
+            }
+            else if (this.ToolTip != null)
+            {
+                this.ToolTip.Dispose();
+                this.ToolTip = null;
+            }
+        }
+
+        //private void listBox_MouseDown(object sender, MouseEventArgs e)
+        //{
+           
+        //}
+
+        private void CompletionForm_Shown(object sender, EventArgs e)
+        {
+            Globals.MainForm.Deactivate += MainForm_Deactivate;
+            Globals.MainForm.Resize += MainForm_Resize;
+        }
+
+        private void MainForm_Resize(object sender, EventArgs e)
+        {
+            this.Close();
+        }
+
+        private void MainForm_Deactivate(object sender, EventArgs e)
+        {
+            this.Close();
+        }
+
+        private void CompletionForm_Load(object sender, EventArgs e)
+        {
+            this.Height = this.listBox.Height + 2;
+        }
+    }
+}

+ 120 - 0
EsPy/Components/CompletionForm.resx

@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>

+ 92 - 0
EsPy/Components/ExListBox.cs

@@ -0,0 +1,92 @@
+using EsPy.Python.Jedi;
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace EsPy.Components
+{
+    public class ExListBox : ListBox
+    {
+        private ImageList imageList1;
+        private System.ComponentModel.IContainer components;
+
+        public class ExListBoxItem
+        {
+            public string Text = "";
+            public int ImageIndex = -1;
+
+            public override string ToString()
+            {
+                return this.Text;
+            }
+            
+        }
+
+        public ExListBox()
+        {
+            this.InitializeComponent();
+            this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
+        }
+
+        protected override void OnDrawItem(DrawItemEventArgs e)
+        {
+            e.DrawBackground();
+            e.DrawFocusRectangle();
+
+            if (e.Index >= 0)
+            {
+                ExListBoxItem item = (ExListBoxItem)Items[e.Index];
+                if (item.ImageIndex != -1 && this.imageList1.Images.Count > item.ImageIndex)
+                {
+                    Size image_size = imageList1.ImageSize;
+                    this.imageList1.Draw(e.Graphics, e.Bounds.Left, e.Bounds.Top, item.ImageIndex);
+                    e.Graphics.DrawString(item.Text, e.Font, new SolidBrush(e.ForeColor),
+                        e.Bounds.Left + image_size.Width, e.Bounds.Top);
+                }
+                else
+                {
+                    e.Graphics.DrawString(item.Text, e.Font, new SolidBrush(e.ForeColor),
+                       e.Bounds.Left, e.Bounds.Top);
+                }
+            }
+        }
+
+        private void InitializeComponent()
+        {
+            this.components = new System.ComponentModel.Container();
+            this.imageList1 = new System.Windows.Forms.ImageList(this.components);
+            this.SuspendLayout();
+            // 
+            // imageList1
+            // 
+            this.imageList1.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;
+            this.imageList1.ImageSize = new System.Drawing.Size(16, 16);
+            this.imageList1.TransparentColor = System.Drawing.Color.Transparent;
+            this.ResumeLayout(false);
+
+        }
+
+        //protected override bool ShowWithoutActivation
+        //{
+        //    get { return true; }
+        //}
+
+        protected override CreateParams CreateParams
+        {
+            get
+            {
+                CreateParams baseParams = base.CreateParams;
+
+                const int WS_EX_NOACTIVATE = 0x08000000;
+                const int WS_EX_TOOLWINDOW = 0x00000080;
+                baseParams.ExStyle |= (int)(WS_EX_NOACTIVATE | WS_EX_TOOLWINDOW);
+
+                return baseParams;
+            }
+        }
+    }
+}

+ 126 - 0
EsPy/Components/ExListBox.resx

@@ -0,0 +1,126 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="imageList1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>28, 34</value>
+  </metadata>
+  <metadata name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </metadata>
+</root>

+ 621 - 0
EsPy/Components/ExScintilla.cs

@@ -0,0 +1,621 @@
+using EsPy.Python;
+using EsPy.Python.Jedi;
+using EsPy.Utility;
+using Newtonsoft.Json;
+using Newtonsoft.Json.Linq;
+using ScintillaNET;
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.IO;
+using System.Linq;
+using System.Runtime.InteropServices;
+using System.Windows.Forms;
+using System.Xml;
+using static EsPy.Utility.TextHelper;
+
+namespace EsPy.Components
+{
+    public class ExScintilla : Scintilla
+    {
+
+        [DllImport("user32.dll")]
+        static extern bool PostMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);
+
+        private const int NUMBER_MARGIN = 1;
+        private const int BOOKMARK_MARGIN = 2;
+        private const int BOOKMARK_MARKER = 2;
+
+        const int WM_KEYDOWN = 0x100;
+        const int WM_SYSKEYDOWN = 0x104;
+        const int WM_LBUTTONDOWN = 0x0201;
+        public string Lang = "";
+        public string CommentLine = "";
+        public string CommentStart = "";
+        public string CommentEnd = "";
+
+        public ExScintilla() : base()
+        {
+            this.InitializeComponent();
+            this.CompletionEnabled = false;
+            this.Completions = new List<Completion>(500);
+            this.MouseDwellTime = 500;
+        }
+
+        public bool CompletionEnabled
+        { get; set; }
+
+        private void InitializeComponent()
+        {
+            this.SuspendLayout();
+            // 
+            // ExScintilla
+            // 
+            this.CharAdded += new System.EventHandler<ScintillaNET.CharAddedEventArgs>(this.ExScintilla_CharAdded);
+            this.Delete += new System.EventHandler<ScintillaNET.ModificationEventArgs>(this.ExScintilla_Delete);
+            this.DwellEnd += new System.EventHandler<ScintillaNET.DwellEventArgs>(this.ExScintilla_DwellEnd);
+            this.Leave += new System.EventHandler(this.ExScintilla_Leave);
+            this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.ExScintilla_MouseDown);
+            this.MouseHover += new System.EventHandler(this.ExScintilla_MouseHover);
+            this.Resize += new System.EventHandler(this.ExScintilla_Resize);
+            this.ResumeLayout(false);
+
+        }
+
+        private CompletionForm FCompletionForm = null;
+        public void HideCompletions()
+        {
+            if (this.FCompletionForm != null)
+            {
+                this.FCompletionForm.Dispose();
+                this.FCompletionForm = null;
+            }
+        }
+
+        public void CompletionFormDisposing(object sender, EventArgs e)
+        {
+            this.FCompletionForm.FormDisposing -= CompletionFormDisposing;
+            this.FCompletionForm = null;
+        }
+
+        public void ShowCompletion()
+        {
+            //this.Capture = true;
+            this.HideCompletions();
+            this.FCompletionForm = new CompletionForm();
+            this.FCompletionForm.FormDisposing += CompletionFormDisposing;
+            this.FCompletionForm.Scintilla = this;
+
+            int word_start_pos = Utility.TextHelper.KeywordStartPosition(this.Text, this.CurrentPosition - 1) + 1;
+            int x = this.PointXFromPosition(word_start_pos);
+            int y = this.PointYFromPosition(word_start_pos);
+
+            this.FCompletionForm.Show();
+
+            Point p = this.PointToScreen(new Point(x, y));
+
+            this.FCompletionForm.TopLevel = true;
+            this.FCompletionForm.TopMost = true;
+            this.FCompletionForm.Top = p.Y + (int)(this.Font.Height * 1.2);
+            this.FCompletionForm.Left = p.X;
+            this.Focus();
+            this.SetFilter(0);
+        }
+
+        private List<Completion> Completions
+        {get; set; }
+
+        private void SetFilter(int dx)
+        {
+            this.FCompletionForm.Clear();
+            Line line = this.Lines[this.CurrentLine];
+            int l = this.CurrentLine + dx;
+            int c = this.CurrentPosition - line.Position;
+
+            Words words = TextHelper.FindWords(line.Text, c + dx);
+            
+            List<Completion> list = this.Completions.Where(k => k.name.ToLower().StartsWith(words.Filter.ToLower())).ToList();
+
+            // Todo: Add/Remove items
+            this.FCompletionForm.AddRange(list);
+
+            if (words.Filter != "" && this.FCompletionForm.Count > 0)
+            {
+                this.FCompletionForm.SelectedIndex = 0;
+            }
+            else
+            {
+                
+            }
+        }
+
+        private void Complete()
+        {
+            
+            if (this.FCompletionForm.SelectedItem != null)
+            {
+                string name = this.FCompletionForm.SelectedItem.name;
+                // prevent Delete & Insert events!!)
+                this.HideCompletions();
+
+                if (name != null)
+                {
+                    Line line = this.Lines[this.CurrentLine];
+                    int l = this.CurrentLine + 1;
+                    int c = this.CurrentPosition - line.Position;
+
+                    Words words = TextHelper.FindWords(line.Text, c);
+
+                    this.DeleteRange(line.Position + words.Pos, words.Filter.Length);
+                    this.InsertText(line.Position + words.Pos, name);
+                    this.GotoPosition(line.Position + words.Pos + name.Length);                    
+                }
+            }
+            else this.HideCompletions();
+        }
+         
+        //protected override void WndProc(ref Message m)
+        //{
+        //    if (this.FCompletionForm != null)
+        //    {
+        //        if (m.Msg == WM_LBUTTONDOWN)
+        //        {
+        //            PostMessage(this.FCompletionForm.Handle, (uint) m.Msg,(int) m.WParam,(int)m.LParam);
+        //            return;
+        //        }
+        //    }
+        //    base.WndProc(ref m);
+        //}
+
+        protected override bool ProcessCmdKey(ref Message msg, Keys key)
+        {
+            if (msg.Msg == WM_KEYDOWN || msg.Msg == WM_SYSKEYDOWN)
+            {
+                switch (key)
+                {
+                    case Keys.Control | Keys.Space:                      
+                        this.FindCompletions();
+                        return true;
+
+                    case Keys.Escape:
+                        this.HideCompletions();
+                        return true;
+
+                    case Keys.Enter:
+                    case Keys.Tab:
+                        if (this.FCompletionForm != null)
+                        {
+                            this.Complete();
+                            return true;
+                        }
+                        break;
+
+                    case Keys.Left:
+
+                        if (this.FCompletionForm != null)
+                        {
+                            int p = this.CurrentPosition - 1;
+                            char c = this.Text[p];
+                            if (c == '.' || char.IsWhiteSpace(c))
+                            {
+                                this.HideCompletions();
+                                
+                            }
+                            else
+                            {
+                                this.SetFilter(-1);
+                            }
+                        }
+                        break;
+
+                    case Keys.Right:
+                        if (this.FCompletionForm != null)
+                        {
+                            int p = this.CurrentPosition ;
+                            char c = this.Text[p];
+                            if (c == '.' || char.IsWhiteSpace(c))
+                            {
+                                this.HideCompletions();
+                            }
+                            else
+                            {
+                                this.SetFilter(1);
+                            }
+                        }
+                        break;
+
+                    case Keys.Up:
+                        if (this.FCompletionForm != null)
+                        {
+                            this.FCompletionForm.SelectPrevious();
+                            return true;
+                        }
+                        break;
+
+                    case Keys.Down:
+                        if (this.FCompletionForm != null)
+                        {
+                            this.FCompletionForm.SelectNext();
+                            return true;
+                        }
+                        break;
+
+                    case Keys.Home:
+                        if (this.FCompletionForm != null)
+                        {
+                            this.HideCompletions();
+                        }
+                        break;
+
+                    case Keys.End:
+                        if (this.FCompletionForm != null)
+                        {
+                            this.HideCompletions();
+                        }
+                        break;
+                }
+            }
+            return base.ProcessCmdKey(ref msg, key);
+        }
+
+        private int CompletionPosition = 0;
+
+        private void FindCompletions()
+        {
+            Line line = this.Lines[this.CurrentLine];
+            int l = this.CurrentLine + 1;
+            int c = this.CurrentPosition - line.Position;
+            Words words = TextHelper.FindWords(line.Text, c);
+            this.CompletionPosition = line.Position + words.Pos;
+            this.FindCompletions(l, c);
+        }
+
+        private void FindCompletions(int line, int column)
+        {
+            if (Globals.PyClient != null && this.Lexer == Lexer.Python && this.CompletionEnabled)
+            {
+                this.HideCompletions();
+                this.Completions.Clear();
+
+                Script script = new Script(this.Text, line, column);
+
+                PyRequest req = new CompletionRequest(script);
+                string json = JsonConvert.SerializeObject(req);
+                try
+                {
+                    JToken token = Globals.PyClient.DoRequest<JToken>(req);
+                    if (token != null && token["completions"] is JArray)
+                    {
+                        JArray items = token["completions"] as JArray;
+                        foreach (JToken t in items)
+                        {
+                            Completion comp = JsonConvert.DeserializeObject<Completion>(t.ToString());
+                            if (comp != null)
+                                this.Completions.Add(comp);
+                        }
+
+                        //Todo: move to Show
+                        if (this.Completions.Count > 0)
+                        {
+                            this.ShowCompletion();
+                        }
+                        else
+                        {
+                            this.CallTipShow(this.CurrentPosition, "No suggestions");
+                        }
+                    }
+                }
+                catch
+                { 
+                    this.CallTipShow(this.CurrentPosition, "Try again**");
+                }
+            }
+        }
+
+        private string GetAttr(XmlNode xnode, string attr)
+        {
+            if (xnode != null && xnode.Attributes[attr] != null && xnode.Attributes[attr].Value != null)
+            {
+                return xnode.Attributes[attr].Value;
+            }
+            return "";
+        }
+
+        private void LoadStyle()
+        {
+            string conf = Path.Combine(Application.StartupPath, "Conf", "scistyles.xml");
+            if (File.Exists(conf))
+            {
+                XmlDocument doc = new XmlDocument();
+                try
+                {
+                    doc.Load(conf);
+                    XmlNode xstyles = doc.SelectSingleNode("Scintilla/LexerStyles");
+                    if (xstyles != null && xstyles.HasChildNodes)
+                    {
+                        foreach (XmlNode xstyle in xstyles.ChildNodes)
+                        {
+                            if (xstyle.Name == "LexerType" && xstyle.Attributes["name"] != null && xstyle.Attributes["name"].Value == this.Lang && xstyle.HasChildNodes)
+                            {
+                                foreach (XmlNode xword in xstyle.ChildNodes)
+                                {
+                                    int id = 0;
+                                    int c = 0;
+                                    if (int.TryParse(this.GetAttr(xword, "styleID"), out id))
+                                    {
+                                        if (int.TryParse(this.GetAttr(xword, "fgColor"), System.Globalization.NumberStyles.HexNumber, null, out c))
+                                            this.Styles[id].ForeColor = Color.FromArgb(c);
+
+                                        if (int.TryParse(this.GetAttr(xword, "bgColor"), System.Globalization.NumberStyles.HexNumber, null, out c))
+                                            this.Styles[id].BackColor = Color.FromArgb(c);
+
+                                        if (this.GetAttr(xword, "fontName") != "")
+                                        {
+                                            this.Styles[id].Font = this.GetAttr(xword, "fontName");
+                                        }
+
+                                        if (int.TryParse(this.GetAttr(xword, "fontStyle"), out c))
+                                        {
+                                            this.Styles[id].Bold = (c & 1) == 1;
+
+                                        }
+                                        if (int.TryParse(this.GetAttr(xword, "fontSize"), out c))
+                                        {
+                                            this.Styles[id].Size = c;
+                                        }
+
+                                        if (this.GetAttr(xstyle, "keywordClass") != "")
+                                        {
+
+                                        }
+
+                                    }
+                                }
+                            }
+
+                        }
+                    }
+                }
+                catch
+                { }
+                finally
+                {
+                    doc = null;
+                }
+            }
+        }
+
+        private void LoadLang()
+        {
+            string conf = Path.Combine(Application.StartupPath, "Conf", "scilang.xml");
+            if (File.Exists(conf))
+            {
+                XmlDocument doc = new XmlDocument();
+                try
+                {
+                    doc.Load(conf);
+                    XmlNode xstyles = doc.SelectSingleNode("Scintilla/Languages");
+                    if (xstyles != null && xstyles.HasChildNodes)
+                    {
+                        foreach (XmlNode xstyle in xstyles.ChildNodes)
+                        {
+                            if (xstyle.Name == "Language" && xstyle.Attributes["name"] != null && xstyle.Attributes["name"].Value == this.Lang && xstyle.HasChildNodes)
+                            {
+                                int id = 0;
+
+                                this.CommentLine = this.GetAttr(xstyle, "commentLine");
+                                this.CommentStart = this.GetAttr(xstyle, "commentStart");
+                                this.CommentEnd = this.GetAttr(xstyle, "commentEnd");
+
+                                foreach (XmlNode xword in xstyle.ChildNodes)
+                                {
+                                    if (xword.Name == "Keywords")
+                                    {
+                                        this.SetKeywords(id++, xword.InnerText);
+                                    }
+                                }
+                                return;
+                            }
+                        }
+                    }
+                }
+                catch
+                { }
+                finally
+                {
+                    doc = null;
+                }
+            }
+        }
+
+        public void SetLang()
+        {
+            this.EolMode = Eol.CrLf;
+            this.StyleResetDefault();
+            this.Styles[Style.Default].Font = "Consolas";
+            this.Styles[Style.Default].Size = 10;
+            this.StyleClearAll(); 
+            this.IndentWidth = 4;
+            this.IndentationGuides = IndentView.LookForward;
+           
+            this.SetProperty("tab.timmy.whinge.level", "1");
+            this.SetProperty("fold", "1");
+
+            this.Margins[0].Width = 42;
+
+            this.Margins[2].Type = MarginType.Symbol;
+            this.Margins[2].Mask = Marker.MaskFolders;
+            this.Margins[2].Sensitive = true;
+            this.Margins[2].Width = 20;
+
+            for (int i = Marker.FolderEnd; i <= Marker.FolderOpen; i++)
+            {
+                this.Markers[i].SetForeColor(SystemColors.ControlLightLight);
+                this.Markers[i].SetBackColor(SystemColors.ControlDark);
+            }
+
+            this.Markers[Marker.Folder].Symbol = MarkerSymbol.BoxPlus;
+            this.Markers[Marker.Folder].SetBackColor(SystemColors.ControlText);
+            this.Markers[Marker.FolderOpen].Symbol = MarkerSymbol.BoxMinus;
+            this.Markers[Marker.FolderEnd].Symbol = MarkerSymbol.BoxPlusConnected;
+            this.Markers[Marker.FolderEnd].SetBackColor(SystemColors.ControlText);
+            this.Markers[Marker.FolderMidTail].Symbol = MarkerSymbol.TCorner;
+            this.Markers[Marker.FolderOpenMid].Symbol = MarkerSymbol.BoxMinusConnected;
+            this.Markers[Marker.FolderSub].Symbol = MarkerSymbol.VLine;
+            this.Markers[Marker.FolderTail].Symbol = MarkerSymbol.LCorner;
+
+            this.AutomaticFold = (AutomaticFold.Show | AutomaticFold.Click | AutomaticFold.Change);
+
+            this.LoadStyle();
+            this.LoadLang();
+        }
+
+        public void SetDefault()
+        {
+            this.EolMode = Eol.CrLf;
+            this.StyleResetDefault();
+            this.Styles[Style.Default].Font = "Consolas";
+            this.Styles[Style.Default].Size = 10;
+            this.StyleClearAll(); // i.e. Apply to all
+            
+          
+            this.SetProperty("tab.timmy.whinge.level", "1");
+            this.SetProperty("fold", "1");
+
+            this.Margins[0].Width = 42;
+
+            this.Margins[2].Type = MarginType.Symbol;
+            this.Margins[2].Mask = Marker.MaskFolders;
+            this.Margins[2].Sensitive = true;
+            this.Margins[2].Width = 20;
+
+            for (int i = Marker.FolderEnd; i <= Marker.FolderOpen; i++)
+            {
+                this.Markers[i].SetForeColor(SystemColors.ControlLightLight);
+                this.Markers[i].SetBackColor(SystemColors.ControlDark);
+            }
+
+            this.Markers[Marker.Folder].Symbol = MarkerSymbol.BoxPlus;
+            this.Markers[Marker.Folder].SetBackColor(SystemColors.ControlText);
+            this.Markers[Marker.FolderOpen].Symbol = MarkerSymbol.BoxMinus;
+            this.Markers[Marker.FolderEnd].Symbol = MarkerSymbol.BoxPlusConnected;
+            this.Markers[Marker.FolderEnd].SetBackColor(SystemColors.ControlText);
+            this.Markers[Marker.FolderMidTail].Symbol = MarkerSymbol.TCorner;
+            this.Markers[Marker.FolderOpenMid].Symbol = MarkerSymbol.BoxMinusConnected;
+            this.Markers[Marker.FolderSub].Symbol = MarkerSymbol.VLine;
+            this.Markers[Marker.FolderTail].Symbol = MarkerSymbol.LCorner;
+
+            this.AutomaticFold = (AutomaticFold.Show | AutomaticFold.Click | AutomaticFold.Change);
+
+        }
+
+        private void ExScintilla_CharAdded(object sender, CharAddedEventArgs e)
+        {
+            var currentPos = this.CurrentPosition;
+            var wordStartPos = this.WordStartPosition(currentPos, true);
+
+            char c = this.Text[this.CurrentPosition-1];
+            // Display the autocompletion list
+            var lenEntered = currentPos - wordStartPos;
+            if (e.Char == ' ' && this.FCompletionForm != null)
+            {
+                this.HideCompletions();
+            }
+            else if (e.Char == '(')
+            {
+                Application.DoEvents();
+                this.FindCompletions();
+
+                if (this.Completions.Count == 1)
+                {
+                    Completion comp = this.Completions[0];
+                }
+            }
+            else if (e.Char == '.')
+            {
+                Application.DoEvents();
+                this.FindCompletions();
+            }
+            else if (this.FCompletionForm == null && lenEntered == 1)
+            {
+                this.FindCompletions();
+            }
+            else if (this.FCompletionForm != null)
+            {
+                this.SetFilter(0);
+            }
+        }
+
+        private void ExScintilla_Delete(object sender, ModificationEventArgs e)
+        {
+            if (this.FCompletionForm != null)
+            {
+                if (e.Text.Contains('.') || e.Text.Contains("(") || e.Text.Contains(")") || this.CurrentPosition < this.CompletionPosition)
+                {
+                    this.HideCompletions();
+                }
+                else
+                {
+                    this.SetFilter(0);
+                }
+            }
+
+        }
+
+        private void ExScintilla_MouseHover(object sender, EventArgs e)
+        {
+           
+        }
+
+        private void ExScintilla_Leave(object sender, EventArgs e)
+        {
+            if (this.FCompletionForm != null && this.FCompletionForm.Visible)
+                this.HideCompletions();
+        }
+
+        private void ExScintilla_MouseDown(object sender, MouseEventArgs e)
+        {
+            if (this.FCompletionForm != null)
+                this.HideCompletions();
+        }
+
+        private void ExScintilla_Resize(object sender, EventArgs e)
+        {
+            if (this.FCompletionForm != null)
+                this.HideCompletions();
+        }
+
+        private void ExScintilla_DwellEnd(object sender, DwellEventArgs e)
+        {
+            // Todo:
+            //if (e.Position > 0)
+            //{
+            //    Line line = this.Lines[this.LineFromPosition(e.Position)];
+            //    int sp = e.Position - line.Position;
+            //    while (sp > 0)
+            //    {
+            //        if (line.Text[sp] == '.' || line.Text[sp] == '_' || char.IsLetterOrDigit(line.Text[sp]))
+            //            sp--;
+            //        else break;
+            //    }
+
+            //    int ep = e.Position - line.Position;
+            //    while (ep < line.Text.Length)
+            //    {
+            //        if (line.Text[ep] == '.' || line.Text[ep] == '_' || char.IsLetterOrDigit(line.Text[ep]))
+            //            ep++;
+            //        else break;
+            //    }
+            //    if (ep > sp)
+            //    {
+            //        string w = line.Text.Substring(sp, ep - sp);
+            //        Console.WriteLine(w);
+
+                    
+            //    }
+            //}
+        }
+    }
+}
+
+    

+ 123 - 0
EsPy/Components/ExScintilla.resx

@@ -0,0 +1,123 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </metadata>
+</root>

+ 99 - 0
EsPy/Components/Place.cs

@@ -0,0 +1,99 @@
+using System;
+
+namespace FastColoredTextBoxNS
+{
+    /// <summary>
+    /// Line index and char index
+    /// </summary>
+    public struct Place : IEquatable<Place>
+    {
+        public int iChar;
+        public int iLine;
+
+        public Place(int iChar, int iLine)
+        {
+            this.iChar = iChar;
+            this.iLine = iLine;
+        }
+
+        public void Offset(int dx, int dy)
+        {
+            iChar += dx;
+            iLine += dy;
+        }
+
+        public bool Equals(Place other)
+        {
+            return iChar == other.iChar && iLine == other.iLine;
+        }
+
+        public override bool Equals(object obj)
+        {
+            return (obj is Place) && Equals((Place)obj);
+        }
+
+        public override int GetHashCode()
+        {
+            return iChar.GetHashCode() ^ iLine.GetHashCode();
+        }
+
+        public static bool operator !=(Place p1, Place p2)
+        {
+            return !p1.Equals(p2);
+        }
+
+        public static bool operator ==(Place p1, Place p2)
+        {
+            return p1.Equals(p2);
+        }
+
+        public static bool operator <(Place p1, Place p2)
+        {
+            if (p1.iLine < p2.iLine) return true;
+            if (p1.iLine > p2.iLine) return false;
+            if (p1.iChar < p2.iChar) return true;
+            return false;
+        }
+
+        public static bool operator <=(Place p1, Place p2)
+        {
+            if (p1.Equals(p2)) return true;
+            if (p1.iLine < p2.iLine) return true;
+            if (p1.iLine > p2.iLine) return false;
+            if (p1.iChar < p2.iChar) return true;
+            return false;
+        }
+
+        public static bool operator >(Place p1, Place p2)
+        {
+            if (p1.iLine > p2.iLine) return true;
+            if (p1.iLine < p2.iLine) return false;
+            if (p1.iChar > p2.iChar) return true;
+            return false;
+        }
+
+        public static bool operator >=(Place p1, Place p2)
+        {
+            if (p1.Equals(p2)) return true;
+            if (p1.iLine > p2.iLine) return true;
+            if (p1.iLine < p2.iLine) return false;
+            if (p1.iChar > p2.iChar) return true;
+            return false;
+        }
+
+        public static Place operator +(Place p1, Place p2)
+        {
+            return new Place(p1.iChar + p2.iChar, p1.iLine + p2.iLine);
+        }
+
+        public static Place Empty
+        {
+            get { return new Place(); }
+        }
+
+        public override string ToString()
+        {
+            return "(" + iChar + "," + iLine + ")";
+        }
+    }
+}

+ 13 - 0
EsPy/Components/PyCompletion.cs

@@ -0,0 +1,13 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace EsPy.Components
+{
+    public class PyCompletion
+    {
+
+    }
+}

+ 494 - 0
EsPy/Components/Terminal.cs

@@ -0,0 +1,494 @@
+using EsPy.Units;
+using ScintillaNET;
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace EsPy.Components
+{
+    public class Terminal : ExScintilla
+    {
+        const int WM_LBUTTONDOWN = 0x0201;
+        const int WM_RBUTTONDOWN = 0x0204;
+        const int WM_KEYDOWN = 0x100;
+        const int WM_SYSKEYDOWN = 0x104;
+
+        int PromptPos = 0;
+        //int ActPos = 0;
+        int BeforeMouse = -1;
+
+        int HistoryPos = 0;
+        public bool HistoryModified = false;
+        public List<string> History = new List<string>();
+
+        public Terminal() : base()
+        {
+            this.Lexer = Lexer.Python;
+            this.Lang = "python";
+            this.SetLang();
+            this.ReadOnly = true;
+        }
+
+        private PySerial FPort = null;
+        public PySerial Port
+        {
+            get { return this.FPort; }
+            set
+            {
+                if (this.FPort != null)
+                {
+                    this.FPort.PortOpen -= FPort_PortOpen;
+                    this.FPort.PortClose -= FPort_PortClose;
+                    this.FPort.DataReceived -= FPort_DataReceived;
+                    this.FPort.ErrorReceived -= FPort_ErrorReceived;
+                    this.FPort.PortBusy -= FPort_PortBusy;
+                    this.FPort.PortFree -= FPort_PortFree;
+                }
+
+                this.FPort = value;
+                if (this.FPort != null)
+                {
+                    this.FPort.PortOpen += FPort_PortOpen;
+                    this.FPort.PortClose += FPort_PortClose;
+                    this.FPort.DataReceived += FPort_DataReceived;
+                    this.FPort.ErrorReceived += FPort_ErrorReceived;
+                    this.FPort.PortBusy += FPort_PortBusy;
+                    this.FPort.PortFree += FPort_PortFree;
+                }
+            }
+        }
+
+        private delegate void UpdateStatusEvent(bool busy);
+        public void UpdateBusy(bool busy)
+        {
+            if (this.InvokeRequired)
+            {
+                this.Invoke(new UpdateStatusEvent(UpdateBusy), new object[] { busy });
+            }
+            else
+            {
+
+            }
+        }
+
+        private void FPort_PortFree(object sender, EventArgs e)
+        {
+            //throw new NotImplementedException();
+        }
+
+        private void FPort_PortBusy(object sender, EventArgs e)
+        {
+            //throw new NotImplementedException();
+        }
+
+        public void Append(string text)
+        {
+            this.GotoPosition(this.TextLength);
+            this.AddText(text);
+            this.GotoPosition(this.TextLength);
+            this.EmptyUndoBuffer();
+        }
+
+        public void Clean()
+        {
+            this.Text = "";
+            if(this.Port != null && this.Port.IsOpen)
+            this.Port.WriteLine("");
+        }
+
+        private void FPort_PortClose(object sender, EventArgs e)
+        {
+        }
+
+        private void FPort_PortOpen(object sender, EventArgs e)
+        {
+        }
+
+        private void FPort_DataReceived(object sender, string data)
+        {
+           
+            this.UpdateTerminal(data, "");
+        }
+
+        private void FPort_ErrorReceived(object sender, string data)
+        {
+            // this.UpdateTerminal(data);
+        }
+
+        public delegate string PreprocessEvent(string text);
+        public PreprocessEvent Preprocess = null;
+
+
+        const int LineLength = 180;
+        char[] Buffer = new char[LineLength]; // new StringBuilder(" ", LineLength);
+        int Cp = 0;
+        char LastChar = (char)0;
+        char LastMode = (char)0;
+        public bool Locked = false;
+
+
+        //public int FindPrompPos()
+        //{
+        //    Line line = this.Lines[this.LineFromPosition(this.CurrentPosition)];
+        //    if()
+        //}
+
+        private char C0 = '\0';
+        private char C1 = '\0';
+        private char C2 = '\0';
+        private char C3 = '\0';
+        private delegate void UpdateTerminalEvent(string data, string message);
+        public void UpdateTerminal(string data, string message)
+        {
+            if (this.Locked)
+                return;
+
+            if (this.InvokeRequired)
+            {
+                this.Invoke(new UpdateTerminalEvent(UpdateTerminal), new object[] { data, message});
+            }
+            else
+            {
+                //if (this.Preprocess != null)
+                //{
+                //   text = this.Preprocess(text);
+                //}
+
+                //http://www.termsys.demon.co.uk/vtansi.htm
+
+                //if (text[0] == '\b' && this.TextLength > 0)
+                //{
+                //    this.DeleteRange(this.TextLength - 1, 1);
+                //}
+
+                if (message != "")
+                {
+                    if (message.Contains("\r\n"))
+                    {
+                        this.AppendText(message);
+                        this.PromptPos = this.TextLength;
+                    }
+                    else
+                    {
+                        this.DeleteRange(this.PromptPos, 100);
+                        this.AppendText(message);
+                    }
+                    //this.PromptPos = this.TextLength;
+                    //this.ActPos = this.PromptPos;
+                    return;
+                }
+
+                //while (this.Lines.Count > 500)
+                //{
+                //    this.DeleteRange(0, this.Lines[0].EndPosition);
+                //}
+
+                string res = this.Text ;
+         
+                for (int i = 0; i < data.Length; i++)
+                {
+                    char c = data[i];
+                    
+                    // Todo: \[K
+                    //this.C0 = this.C1;
+                    //this.C1 = this.C2;
+                    //this.C2 = this.C3;
+                    //this.C3 = c;
+
+                      
+
+                    if (c == '\b' && res.Length >= 1)
+                    {
+                        res = res.Remove(res.Length - 1, 1);
+                    }
+                    else if (this.LastChar == 27)
+                    {
+                        if (c == '[')
+                        {
+                            LastMode = c;
+                            continue;
+                        }
+
+                        if (LastMode == '[' && c == 'K')
+                        {
+                            LastMode = (char)0;
+                            continue;
+                        }
+                    }
+                    else if (c != 27)
+                    {
+                        res += data[i];
+                    }
+
+                    this.LastChar = data[i];
+                }
+
+                //this.AppendText(text);
+                this.Text = res;
+                this.GotoPosition(this.TextLength);
+                //this.ActPos = this.TextLength;
+                Line line = this.Lines[this.CurrentLine];
+                if (line.Text.StartsWith(SerialPort.PROMPT))
+                    this.PromptPos = line.Position + SerialPort.PROMPT.Length;
+                else if (line.Text.StartsWith("... "))
+                    this.PromptPos = this.TextLength;
+                //else //if (line.Text.StartsWith("=== "))
+                //    this.PromptPos = this.TextLength;
+
+                this.PromptPos = Math.Max(this.PromptPos, this.TextLength);
+
+
+                this.EmptyUndoBuffer();
+                this.BeforeMouse = -1;
+            }
+        }
+       
+        private void AddToHistory()
+        {
+            string text = this.Lines[this.CurrentLine].Text;
+
+            if (text.StartsWith(PySerial.PROMPT))
+                text = text.Substring(PySerial.PROMPT.Length, text.Length - PySerial.PROMPT.Length);
+            else if (text.StartsWith(PySerial.DOTS))
+                text = text.Substring(PySerial.DOTS.Length, text.Length - PySerial.DOTS.Length);
+            else return;
+
+            text = text.Trim();
+
+            if (text.Length > 0 && (this.History.Count == 0 || (this.History.Count > 0 && this.History.Last() != text)))
+            {
+                this.History.Add(text);
+                this.HistoryPos = this.History.Count;
+                this.HistoryModified = true;
+                while(this.History.Count > 100)
+                {
+                    this.History.RemoveAt(0);
+                }
+            }
+        }
+
+        public void SaveHistory(string fname)
+        {
+            File.WriteAllText(fname, String.Join("\r\n", this.History));
+            this.HistoryModified = false;
+        }
+
+        public void LoadHistory(string fname)
+        {
+            if (File.Exists(fname))
+            {
+                this.History.Clear();
+                this.History.AddRange(File.ReadAllLines(fname));
+                this.HistoryPos = this.History.Count;
+                this.HistoryModified = false;
+            }
+        }
+
+        private string GetAndRemoveLine(bool history)
+        {
+            Line line = this.Lines[this.CurrentLine];
+            string text = this.GetTextRange(this.PromptPos, this.TextLength - this.PromptPos);
+            //string text = this.GetTextRange(this.PromptPos, this.TextLength - this.PromptPos);
+            //text = this.GetTextRange(line.Position + SerialPort.PROMPT.Length, this.TextLength - line.Position);
+           
+            if (history)
+            {
+                this.AddToHistory();
+            }
+            line = this.Lines[this.CurrentLine];
+            this.DeleteRange(this.PromptPos, this.TextLength);
+            return text;
+        }
+
+        protected override void WndProc(ref Message m)
+        {           
+            if (m.Msg == WM_LBUTTONDOWN || m.Msg == WM_RBUTTONDOWN)
+            {
+                if (this.BeforeMouse == -1)
+                    this.BeforeMouse = this.CurrentPosition;
+            }
+            base.WndProc(ref m);
+        }
+
+        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
+        {
+            Line line = null;
+
+            if (this.BeforeMouse >= 0)
+            {
+               this.GotoPosition (this.BeforeMouse);
+                this.BeforeMouse = -1;
+            }
+
+            //if (this.CurrentPosition < this.ActPos)
+            //    this.CurrentPosition = this.ActPos;
+
+            if (this.CurrentPosition < this.PromptPos)
+                this.CurrentPosition = this.PromptPos;
+
+            // this.ActPos = this.CurrentPosition;
+
+            if (msg.Msg == WM_KEYDOWN || msg.Msg == WM_SYSKEYDOWN)
+            {
+               // if (this.Port is PySerial)
+                {
+                    //PythonSerial port = this.Port as PythonSerial;
+
+                    switch (keyData)
+                    {
+                        case Keys.Control | Keys.V:
+                            if (Clipboard.ContainsText())
+                            {
+                                this.Port.Clean();
+                                this.Port.PasteMode();
+                                this.Port.ReadAllLines();
+                                byte[] buff = Encoding.UTF8.GetBytes(Clipboard.GetText().Replace("\r", ""));
+                                this.Port.Write(buff, 0, buff.Length);
+                                this.Port.SoftReset();
+
+                            }
+                            return true;
+
+                            break;
+
+                        case Keys.Control | Keys.A:
+                            this.Port.EnterRawMode();                            
+                            return true;
+
+                        case Keys.Control | Keys.B:
+                            //this.Port.Write(new byte[] { 2 });
+                            this.Port.LeaveRawMode();
+                            return true;
+
+                        case Keys.Control | Keys.C:
+                            //this.Port.Write(new byte[] { 3 });
+                            this.Port.Interrupt();
+                            return true;
+
+                        case Keys.Control | Keys.D:
+                            //this.Port.Write(new byte[] { 4 });
+                            this.Port.SoftReset();
+                            return true;
+
+                        case Keys.Control | Keys.E:
+                            //this.Port.Write(new byte[] { 5 });
+                            this.Port.PasteMode();
+                            return true;
+
+                        //case Keys.Control | Keys.Tab:
+                        //    this.Port.WriteLine(this.GetLine());
+                        //    this.Port.Write(new byte[] { 9 });
+                        //    return true;
+
+                        case  Keys.Tab:
+                            string l = this.GetAndRemoveLine(false);
+                            this.Port.Write(l);
+                            this.Port.Write(9);
+                            return true;
+                            //break;
+
+                        case Keys.Down:
+                            this.HistoryPos++;
+                            if (this.HistoryPos > this.History.Count)
+                                this.HistoryPos = this.History.Count;
+
+                            if (this.HistoryPos <= 0)
+                                this.HistoryPos = 1;
+
+                            if (this.HistoryPos <= this.History.Count - 1)
+                            {
+
+                                this.DeleteRange(this.PromptPos, this.TextLength);
+                                this.Append(this.History[this.HistoryPos]);
+
+                            }
+                            else
+                            {
+                                line = this.Lines[this.CurrentLine];
+                                this.DeleteRange(this.PromptPos, this.TextLength);
+                            }
+                            return true;
+
+                        case Keys.Up:
+                            this.HistoryPos--;
+                            if (this.HistoryPos < 0)
+                                this.HistoryPos = 0;
+
+                            if (this.HistoryPos >= this.History.Count)
+                                this.HistoryPos = this.History.Count - 1;
+
+                            if (this.HistoryPos >= 0)
+                            {
+                                this.DeleteRange(this.PromptPos, this.TextLength);
+                                this.Append(this.History[this.HistoryPos]);
+                            }
+                            return true;
+
+                        case Keys.Left:
+                            if (this.PromptPos >= this.CurrentPosition)
+                                return true;
+                            break;
+
+                        case Keys.Home:
+                            this.CurrentPosition = this.PromptPos;
+                            return true;
+
+                        //case Keys.End:
+                        //    return true;
+
+                        case Keys.PageDown:
+                            return true;
+
+                        case Keys.PageUp:
+                            return true;
+
+                        case Keys.Back:
+                            if (this.PromptPos == this.CurrentPosition)
+                            {
+                                this.Port.Write(8);
+                                return true;
+                            }
+                            //else if()
+                            break;
+
+                        case Keys.Enter:
+                            this.Port.WriteLine(this.GetAndRemoveLine(true));
+                            return true;
+                        //default:
+                        //    if()
+
+                        //    break;
+                    }
+                }
+            }
+            //KeysConverter kc = new KeysConverter();
+            
+            //string keyChar = kc.ConvertToString(keyData);
+            //if(keyData != Keys.ShiftKey)
+            //    this.Port.Write(keyChar.ToLower());
+            //else 
+           
+            bool res = base.ProcessCmdKey(ref msg, keyData);
+            //this.ActPos = this.CurrentPosition;
+            return res;
+        }
+
+        private void InitializeComponent()
+        {
+            this.SuspendLayout();
+            // 
+            // Terminal
+            // 
+            this.IndentationGuides = ScintillaNET.IndentView.Real;
+            this.IndentWidth = 4;
+            this.Lexer = ScintillaNET.Lexer.Python;
+            this.ResumeLayout(false);
+
+        }
+    }
+}

+ 123 - 0
EsPy/Components/Terminal.resx

@@ -0,0 +1,123 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </metadata>
+</root>

File diff suppressed because it is too large
+ 7 - 0
EsPy/Conf/scilang.xml


+ 896 - 0
EsPy/Conf/scistyles.xml

@@ -0,0 +1,896 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Scintilla>
+  <LexerStyles>
+    <LexerType name="actionscript" desc="ActionScript" ext="">
+      <WordsStyle name="DEFAULT" styleID="11" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="FUNCTION" styleID="20" fgColor="95004A" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" keywordClass="type2" />
+      <WordsStyle name="PREPROCESSOR" styleID="9" fgColor="804000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="INSTRUCTION WORD" styleID="5" fgColor="0000FF" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" keywordClass="instre1" />
+      <WordsStyle name="TYPE WORD" styleID="16" fgColor="8000FF" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" keywordClass="type1" />
+      <WordsStyle name="NUMBER" styleID="4" fgColor="FF8000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="STRING" styleID="6" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="CHARACTER" styleID="7" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="OPERATOR" styleID="10" fgColor="000080" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="VERBATIM" styleID="13" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="REGEX" styleID="14" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="COMMENT" styleID="1" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT LINE" styleID="2" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT DOC" styleID="3" fgColor="008080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT LINE DOC" styleID="15" fgColor="008080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT DOC KEYWORD" styleID="17" fgColor="008080" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="COMMENT DOC KEYWORD ERROR" styleID="18" fgColor="008080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="PREPROCESSOR COMMENT" styleID="23" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="PREPROCESSOR COMMENT DOC" styleID="24" fgColor="008080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+    </LexerType>
+    <LexerType name="ada" desc="ADA" ext="">
+      <WordsStyle name="DEFAULT" styleID="0" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="INSTRUCTION WORD" styleID="1" fgColor="0000FF" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" keywordClass="instre1" />
+      <WordsStyle name="IDENTIFIER" styleID="2" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="NUMBER" styleID="3" fgColor="FF8000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="DELIMITER" styleID="4" fgColor="FF8080" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="CHARACTER" styleID="5" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="STRING" styleID="7" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="LABEL" styleID="9" fgColor="804000" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="COMMENT LINE" styleID="10" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="ILLEGAL" styleID="11" fgColor="FF0000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+    </LexerType>
+    <LexerType name="asp" desc="asp" ext="asp">
+      <WordsStyle name="DEFAULT" styleID="81" fgColor="8000FF" bgColor="C4F9FD" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENTLINE" styleID="82" fgColor="008000" bgColor="C4F9FD" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="NUMBER" styleID="83" fgColor="FF0000" bgColor="C4F9FD" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="WORD" styleID="84" fgColor="000080" bgColor="C4F9FD" fontName="" fontStyle="1" fontSize="" keywordClass="instre1" />
+      <WordsStyle name="STRING" styleID="85" fgColor="808080" bgColor="C4F9FD" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="IDENTIFIER" styleID="86" fgColor="000000" bgColor="C4F9FD" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="ASPSYBOL" styleID="15" fgColor="000000" bgColor="FFFF00" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="SCRIPTTYPE" styleID="16" fgColor="000000" bgColor="FFC000" fontName="" fontStyle="0" fontSize="" />
+    </LexerType>
+    <LexerType name="asm" desc="Assembly" ext="">
+      <WordsStyle name="DEFAULT" styleID="0" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT" styleID="1" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="NUMBER" styleID="2" fgColor="FF8000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="STRING" styleID="3" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="OPERATOR" styleID="4" fgColor="000080" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="IDENTIFIER" styleID="5" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="CPU INSTRUCTION" styleID="6" fgColor="0000FF" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" keywordClass="instre1" />
+      <WordsStyle name="MATH INSTRUCTION" styleID="7" fgColor="0080C0" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" keywordClass="instre2" />
+      <WordsStyle name="REGISTER" styleID="8" fgColor="8080FF" bgColor="FFFFCC" fontName="" fontStyle="1" fontSize="" keywordClass="type1" />
+      <WordsStyle name="DIRECTIVE" styleID="9" fgColor="0080FF" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" keywordClass="type2" />
+      <WordsStyle name="DIRECTIVE OPERAND" styleID="10" fgColor="000080" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" keywordClass="type3" />
+      <WordsStyle name="COMMENT BLOCK" styleID="11" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="CHARACTER" styleID="12" fgColor="808000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="EXT INSTRUCTION" styleID="14" fgColor="804000" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" keywordClass="type4" />
+    </LexerType>
+    <LexerType name="autoit" desc="autoIt" ext="">
+      <WordsStyle name="DEFAULT" styleID="0" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT LINE" styleID="1" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT" styleID="2" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="NUMBER" styleID="3" fgColor="FF8000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="FUNCTION" styleID="4" fgColor="8000FF" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" keywordClass="instre2" />
+      <WordsStyle name="INSTRUCTION WORD" styleID="5" fgColor="0000FF" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" keywordClass="instre1" />
+      <WordsStyle name="MACRO" styleID="6" fgColor="8000FF" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" keywordClass="type1" />
+      <WordsStyle name="STRING" styleID="7" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="OPERATOR" styleID="8" fgColor="000080" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="VARIABLE" styleID="9" fgColor="FF0080" bgColor="FFFFFF" fontName="" fontStyle="2" fontSize="" />
+      <WordsStyle name="SENT" styleID="10" fgColor="8080C0" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" keywordClass="type2" />
+      <WordsStyle name="PREPROCESSOR" styleID="11" fgColor="804000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" keywordClass="type3" />
+      <WordsStyle name="SPECIAL" styleID="12" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" keywordClass="type4" />
+      <WordsStyle name="EXPAND" styleID="13" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" keywordClass="type5" />
+      <WordsStyle name="COMOBJ" styleID="14" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+    </LexerType>
+    <LexerType name="bash" desc="bash" ext="">
+      <WordsStyle name="DEFAULT" styleID="0" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="ERROR" styleID="1" fgColor="FFFFFF" bgColor="FF0000" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="INSTRUCTION WORD" styleID="4" fgColor="0000FF" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" keywordClass="instre1" />
+      <WordsStyle name="NUMBER" styleID="3" fgColor="FF0000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="STRING" styleID="5" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="CHARACTER" styleID="6" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="OPERATOR" styleID="7" fgColor="804000" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="IDENTIFIER" styleID="8" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="SCALAR" styleID="9" fgColor="FF8040" bgColor="FFFFD9" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="COMMENT LINE" styleID="2" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="PARAM" styleID="10" fgColor="008080" bgColor="00FFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="BACKTICKS" styleID="11" fgColor="804040" bgColor="E1FFF3" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="HERE DELIM" styleID="12" fgColor="0000FF" bgColor="FF0000" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="HERE Q" styleID="13" fgColor="FF0000" bgColor="0000FF" fontName="" fontStyle="0" fontSize="" />
+    </LexerType>
+    <LexerType name="batch" desc="Batch" ext="">
+      <WordsStyle name="DEFAULT" styleID="0" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT" styleID="1" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="KEYWORDS" styleID="2" fgColor="0000FF" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" keywordClass="instre1" />
+      <WordsStyle name="LABEL" styleID="3" fgColor="FF0000" bgColor="FFFF80" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="HIDE SYBOL" styleID="4" fgColor="FF00FF" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMAND" styleID="5" fgColor="0080FF" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="VARIABLE" styleID="6" fgColor="FF8000" bgColor="FCFFF0" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="OPERATOR" styleID="7" fgColor="FF0000" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+    </LexerType>
+    <LexerType name="c" desc="C" ext="">
+      <WordsStyle name="PREPROCESSOR" styleID="9" fgColor="804000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="DEFAULT" styleID="11" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="INSTRUCTION WORD" styleID="5" fgColor="0000FF" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" keywordClass="instre1" />
+      <WordsStyle name="TYPE WORD" styleID="16" fgColor="8000FF" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" keywordClass="type1" />
+      <WordsStyle name="NUMBER" styleID="4" fgColor="FF8000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="STRING" styleID="6" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="CHARACTER" styleID="7" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="OPERATOR" styleID="10" fgColor="000080" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="VERBATIM" styleID="13" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="REGEX" styleID="14" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="COMMENT" styleID="1" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT LINE" styleID="2" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT DOC" styleID="3" fgColor="008080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT LINE DOC" styleID="15" fgColor="008080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT DOC KEYWORD" styleID="17" fgColor="008080" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="COMMENT DOC KEYWORD ERROR" styleID="18" fgColor="008080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="PREPROCESSOR COMMENT" styleID="23" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="PREPROCESSOR COMMENT DOC" styleID="24" fgColor="008080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+    </LexerType>
+    <LexerType name="cpp" desc="C++" ext="">
+      <WordsStyle name="PREPROCESSOR" styleID="9" fgColor="804000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="DEFAULT" styleID="11" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="INSTRUCTION WORD" styleID="5" fgColor="0000FF" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" keywordClass="instre1" />
+      <WordsStyle name="TYPE WORD" styleID="16" fgColor="8000FF" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" keywordClass="type1" />
+      <WordsStyle name="NUMBER" styleID="4" fgColor="FF8000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="STRING" styleID="6" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="CHARACTER" styleID="7" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="OPERATOR" styleID="10" fgColor="000080" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="VERBATIM" styleID="13" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="REGEX" styleID="14" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="COMMENT" styleID="1" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT LINE" styleID="2" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT DOC" styleID="3" fgColor="008080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT LINE DOC" styleID="15" fgColor="008080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT DOC KEYWORD" styleID="17" fgColor="008080" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="COMMENT DOC KEYWORD ERROR" styleID="18" fgColor="008080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="PREPROCESSOR COMMENT" styleID="23" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="PREPROCESSOR COMMENT DOC" styleID="24" fgColor="008080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+    </LexerType>
+    <LexerType name="cs" desc="C#" ext="">
+      <WordsStyle name="PREPROCESSOR" styleID="9" fgColor="804000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="DEFAULT" styleID="11" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="INSTRUCTION WORD" styleID="5" fgColor="0000FF" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" keywordClass="instre1" />
+      <WordsStyle name="TYPE WORD" styleID="16" fgColor="8000FF" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" keywordClass="type1" />
+      <WordsStyle name="NUMBER" styleID="4" fgColor="FF8000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="STRING" styleID="6" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="CHARACTER" styleID="7" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="OPERATOR" styleID="10" fgColor="000080" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="VERBATIM" styleID="13" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="REGEX" styleID="14" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="COMMENT" styleID="1" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT LINE" styleID="2" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT DOC" styleID="3" fgColor="008080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT LINE DOC" styleID="15" fgColor="008080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT DOC KEYWORD" styleID="17" fgColor="008080" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="COMMENT DOC KEYWORD ERROR" styleID="18" fgColor="008080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="PREPROCESSOR COMMENT" styleID="23" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="PREPROCESSOR COMMENT DOC" styleID="24" fgColor="008080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+    </LexerType>
+    <LexerType name="caml" desc="Caml" ext="">
+      <WordsStyle name="DEFAULT" styleID="0" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="IDENTIFIER" styleID="1" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="TAGNAME" styleID="2" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="INSTRUCTION WORD" styleID="3" fgColor="0000FF" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" keywordClass="instre1" />
+      <WordsStyle name="BUILIN FUNC &amp; TYPE" styleID="4" fgColor="8000FF" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" keywordClass="instre2" />
+      <WordsStyle name="TYPE" styleID="5" fgColor="8000FF" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" keywordClass="type1" />
+      <WordsStyle name="LINENUM" styleID="6" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="OPERATOR" styleID="7" fgColor="000080" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="NUMBER" styleID="8" fgColor="FF8000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="CHARACTER" styleID="9" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="STRING" styleID="11" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT" styleID="12" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT LINE" styleID="13" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT DOC" styleID="14" fgColor="008080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT LINE DOC" styleID="15" fgColor="008080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+    </LexerType>
+    <LexerType name="cmake" desc="CMakeFile" ext="cmake">
+      <WordsStyle name="DEFAULT" styleID="0" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT" styleID="1" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="STRING D" styleID="2" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="STRING L" styleID="3" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="2" fontSize="" />
+      <WordsStyle name="STRING R" styleID="4" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="4" fontSize="" />
+      <WordsStyle name="COMMAND" styleID="5" fgColor="0000FF" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" keywordClass="instre1" />
+      <WordsStyle name="PARAMETER" styleID="6" fgColor="8000FF" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="VARIABLE" styleID="7" fgColor="FF8040" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="USER DEFINED" styleID="8" fgColor="000080" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" keywordClass="type1" />
+      <WordsStyle name="WHILEDEF" styleID="9" fgColor="0080FF" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="FOREACHDEF" styleID="10" fgColor="008080" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="IFDEF" styleID="11" fgColor="8000FF" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="MACRODEF" styleID="12" fgColor="FF0000" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="STRING VARIABLE" styleID="13" fgColor="808080" bgColor="FEFCF5" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="NUMBER" styleID="14" fgColor="804040" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+    </LexerType>
+    <LexerType name="cobol" desc="COBOL" ext="">
+      <WordsStyle name="PREPROCESSOR" styleID="9" fgColor="804000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="DEFAULT" styleID="11" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="DECLARATION" styleID="5" fgColor="8000FF" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" keywordClass="instre1" />
+      <WordsStyle name="INSTRUCTION WORD" styleID="16" fgColor="0000FF" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" keywordClass="instre2" />
+      <WordsStyle name="KEYWORD" styleID="8" fgColor="0080FF" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" keywordClass="type1" />
+      <WordsStyle name="NUMBER" styleID="4" fgColor="FF8000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="STRING" styleID="6" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="CHARACTER" styleID="7" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="OPERATOR" styleID="10" fgColor="000080" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="COMMENT" styleID="1" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT LINE" styleID="2" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT DOC" styleID="3" fgColor="008080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT LINE DOC" styleID="15" fgColor="008080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT DOC KEYWORD" styleID="17" fgColor="008080" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="COMMENT DOC KEYWORD ERROR" styleID="18" fgColor="008080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+    </LexerType>
+    <LexerType name="coffeescript" desc="CoffeeScript" ext="">
+      <WordsStyle name="PREPROCESSOR" styleID="9" fgColor="804000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="DEFAULT" styleID="11" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="INSTRUCTION WORD" styleID="5" fgColor="0000FF" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" keywordClass="instre1" />
+      <WordsStyle name="TYPE WORD" styleID="16" fgColor="8000FF" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" keywordClass="instre2" />
+      <WordsStyle name="NUMBER" styleID="4" fgColor="FF8000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="STRING" styleID="6" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="CHARACTER" styleID="7" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="OPERATOR" styleID="10" fgColor="000080" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="VERBATIM" styleID="13" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="REGEX" styleID="14" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="COMMENT" styleID="1" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT LINE" styleID="2" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT DOC" styleID="3" fgColor="008080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT LINE DOC" styleID="15" fgColor="008080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT DOC KEYWORD" styleID="17" fgColor="008080" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="COMMENT DOC KEYWORD ERROR" styleID="18" fgColor="008080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="PREDEFINED CONSTANT" styleID="19" fgColor="800000" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" keywordClass="type2" />
+      <WordsStyle name="COMMENT BLOCK" styleID="22" fgColor="008080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="VERBOSE REGEX" styleID="23" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="3" fontSize="" />
+      <WordsStyle name="VERBOSE REGEX COMMENT" styleID="24" fgColor="008080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+    </LexerType>
+    <LexerType name="css" desc="CSS" ext="">
+      <WordsStyle name="DEFAULT" styleID="0" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="TAG" styleID="1" fgColor="0000FF" bgColor="FFFFFF" fontName="Batang" fontStyle="0" fontSize="" />
+      <WordsStyle name="CLASS" styleID="2" fgColor="FF0000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="PSEUDOCLASS" styleID="3" fgColor="FF8000" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="UNKNOWN_PSEUDOCLASS" styleID="4" fgColor="FF8080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="OPERATOR" styleID="5" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="IDENTIFIER" styleID="6" fgColor="8080C0" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" keywordClass="instre1" />
+      <WordsStyle name="UNKNOWN_IDENTIFIER" styleID="7" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="VALUE" styleID="8" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="COMMENT" styleID="9" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="ID" styleID="10" fgColor="0080FF" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="IMPORTANT" styleID="11" fgColor="FF0000" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="DIRECTIVE" styleID="12" fgColor="0080FF" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+    </LexerType>
+    <LexerType name="d" desc="D" ext="">
+      <WordsStyle name="DEFAULT" styleID="0" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="IDENTIFIER" styleID="14" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="INSTRUCTION WORD" styleID="6" fgColor="0000FF" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" keywordClass="instre1" />
+      <WordsStyle name="KEWORD1" styleID="7" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" keywordClass="instre2"/>
+      <WordsStyle name="KEWORD2" styleID="8" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" keywordClass="type1"/>
+      <WordsStyle name="KEWORD3" styleID="9" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" keywordClass="type2"/>
+      <WordsStyle name="KEWORD4" styleID="20" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" keywordClass="type3"/>
+      <WordsStyle name="KEWORD5" styleID="21" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" keywordClass="type4"/>
+      <WordsStyle name="KEWORD6" styleID="22" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" keywordClass="type5"/>
+      <WordsStyle name="NUMBER" styleID="5" fgColor="FF8000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="STRING" styleID="10" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="CHARACTER" styleID="12" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="OPERATOR" styleID="13" fgColor="000080" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="COMMENT" styleID="1" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT LINE" styleID="2" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT DOC" styleID="3" fgColor="008080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT NESTED" styleID="4" fgColor="008080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT LINE DOC" styleID="15" fgColor="008080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT DOC KEYWORD" styleID="16" fgColor="008080" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="COMMENT DOC KEYWORD ERROR" styleID="17" fgColor="008080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="STRING B" styleID="18" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="STRING R" styleID="19" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+    </LexerType>
+    <LexerType name="diff" desc="DIFF" ext="">
+      <WordsStyle name="DEFAULT" styleID="0" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT" styleID="1" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMAND" styleID="2" fgColor="0000FF" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="HEADER" styleID="3" fgColor="8000FF" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="POSITION" styleID="4" fgColor="FF8000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="DELETED" styleID="5" fgColor="808040" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="ADDED" styleID="6" fgColor="0080FF" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+    </LexerType>
+    <LexerType name="gui4cli" desc="GUI4CLI" ext="">
+      <WordsStyle name="DEFAULT" styleID="0" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT LINE" styleID="1" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT" styleID="2" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="GLOBAL" styleID="5" fgColor="0000FF" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" keywordClass="instre1" />
+      <WordsStyle name="EVENT" styleID="5" fgColor="0000FF" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" keywordClass="instre2" />
+      <WordsStyle name="ATTRIBUTE" styleID="16" fgColor="8000FF" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" keywordClass="type1" />
+      <WordsStyle name="CONTROL" styleID="16" fgColor="8000FF" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" keywordClass="type2" />
+      <WordsStyle name="COMMAND" styleID="16" fgColor="8000FF" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" keywordClass="type3" />
+      <WordsStyle name="STRING" styleID="6" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="OPERATOR" styleID="10" fgColor="000080" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+    </LexerType>
+    <LexerType name="nfo" desc="Dos Style" ext="">
+      <WordsStyle name="DEFAULT" styleID="32" fgColor="2E2E2E" bgColor="FFFFFF" />
+    </LexerType>
+    <LexerType name="fortran" desc="Fortran (free form)" ext="">
+      <WordsStyle name="DEFAULT" styleID="0" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT" styleID="1" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="NUMBER" styleID="2" fgColor="FF8000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="STRING" styleID="3" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="STRING2" styleID="4" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="OPERATOR" styleID="6" fgColor="000080" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="IDENTIFIER" styleID="7" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="INSTRUCTION WORD" styleID="8" fgColor="0000FF" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" keywordClass="instre1" />
+      <WordsStyle name="FUNCTION1" styleID="9" fgColor="8000FF" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" keywordClass="instre2" />
+      <WordsStyle name="FUNCTION2" styleID="10" fgColor="0080C0" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" keywordClass="type1" />
+      <WordsStyle name="PREPROCESSOR" styleID="11" fgColor="800000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="OPERATOR2" styleID="12" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="LABEL" styleID="13" fgColor="FFFFFF" bgColor="FF80FF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="CONTINUATION" styleID="14" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+    </LexerType>
+    <LexerType name="fortran77" desc="Fortran (fixed form)" ext="">
+      <WordsStyle name="DEFAULT" styleID="0" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT" styleID="1" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="NUMBER" styleID="2" fgColor="FF8000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="STRING" styleID="3" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="STRING2" styleID="4" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="OPERATOR" styleID="6" fgColor="000080" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="IDENTIFIER" styleID="7" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="INSTRUCTION WORD" styleID="8" fgColor="0000FF" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" keywordClass="instre1" />
+      <WordsStyle name="FUNCTION1" styleID="9" fgColor="8000FF" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" keywordClass="instre2" />
+      <WordsStyle name="FUNCTION2" styleID="10" fgColor="0080C0" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" keywordClass="type1" />
+      <WordsStyle name="PREPROCESSOR" styleID="11" fgColor="800000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="OPERATOR2" styleID="12" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="LABEL" styleID="13" fgColor="FFFFFF" bgColor="FF80FF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="CONTINUATION" styleID="14" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+    </LexerType>
+    <LexerType name="haskell" desc="Haskell" ext="">
+      <WordsStyle name="DEFAULT" styleID="0" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="IDENTIFIER" styleID="1" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="KEYWORD" styleID="2" fgColor="0000FF" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="NUMBER" styleID="3" fgColor="800080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="STRING" styleID="4" fgColor="CA6500" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="CHARACTER" styleID="5" fgColor="CA6500" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="CLASS" styleID="6" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="MODULE" styleID="7" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="CAPITAL" styleID="8" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="DATA" styleID="9" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="IMPORT" styleID="10" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="OPERATOR" styleID="11" fgColor="000080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="INSTANCE" styleID="12" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENTLINE" styleID="13" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENTBLOCK" styleID="14" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENTBLOCK2" styleID="15" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENTBLOCK3" styleID="16" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+    </LexerType>
+    <LexerType name="html" desc="HTML" ext="">
+      <WordsStyle name="DEFAULT" styleID="0" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="COMMENT" styleID="9" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="NUMBER" styleID="5" fgColor="FF0000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="DOUBLESTRING" styleID="6" fgColor="8000FF" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="SINGLESTRING" styleID="7" fgColor="8000FF" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="TAG" styleID="1" fgColor="0000FF" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="TAGEND" styleID="11" fgColor="0000FF" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="TAGUNKNOWN" styleID="2" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="ATTRIBUTE" styleID="3" fgColor="FF0000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="ATTRIBUTEUNKNOWN" styleID="4" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="SGMLDEFAULT" styleID="21" fgColor="000000" bgColor="A6CAF0" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="CDATA" styleID="17" fgColor="FF8000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="VALUE" styleID="19" fgColor="FF8000" bgColor="FEFDE0" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="ENTITY" styleID="10" fgColor="000000" bgColor="FEFDE0" fontName="" fontStyle="2" fontSize="" />
+    </LexerType>
+    <LexerType name="ini" desc="ini file" ext="">
+      <WordsStyle name="DEFAULT" styleID="0" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT" styleID="1" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="SECTION" styleID="2" fgColor="8000FF" bgColor="F2F4FF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="ASSIGNMENT" styleID="3" fgColor="FF0000" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="DEFVAL" styleID="4" fgColor="FF0000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+    </LexerType>
+    <LexerType name="inno" desc="InnoSetup" ext="">
+      <WordsStyle name="DEFAULT" styleID="0" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT" styleID="1" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="KEYWORD" styleID="2" fgColor="0000FF" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" keywordClass="instre2" />
+      <WordsStyle name="PARAMETER" styleID="3" fgColor="FF8000" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" keywordClass="type1" />
+      <WordsStyle name="SECTION" styleID="4" fgColor="000080" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" keywordClass="instre1" />
+      <WordsStyle name="PREPROCESSOR" styleID="5" fgColor="800000" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" keywordClass="type2" />
+      <WordsStyle name="PREPROCESSOR INLINE" styleID="6" fgColor="0000FF" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="COMMENT PASCAL" styleID="7" fgColor="008080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="KEYWORD PASCAL" styleID="8" fgColor="0080C0" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" keywordClass="type3" />
+      <WordsStyle name="KEYWORD USER" styleID="9" fgColor="8080FF" bgColor="FFFFCC" fontName="" fontStyle="1" fontSize="" keywordClass="type4" />
+      <WordsStyle name="STRING DOUBLE" styleID="10" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="STRING SINGLE" styleID="11" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="IDENTIFIER" styleID="12" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+    </LexerType>
+    <LexerType name="java" desc="Java" ext="">
+      <WordsStyle name="PREPROCESSOR" styleID="9" fgColor="804000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="DEFAULT" styleID="11" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="INSTRUCTION WORD" styleID="5" fgColor="0000FF" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" keywordClass="instre1" />
+      <WordsStyle name="TYPE WORD" styleID="16" fgColor="8000FF" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" keywordClass="type1" />
+      <WordsStyle name="NUMBER" styleID="4" fgColor="FF8000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="STRING" styleID="6" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="CHARACTER" styleID="7" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="OPERATOR" styleID="10" fgColor="000080" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="VERBATIM" styleID="13" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="REGEX" styleID="14" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="COMMENT" styleID="1" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT LINE" styleID="2" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT DOC" styleID="3" fgColor="008080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT LINE DOC" styleID="15" fgColor="008080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT DOC KEYWORD" styleID="17" fgColor="008080" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="COMMENT DOC KEYWORD ERROR" styleID="18" fgColor="008080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+    </LexerType>
+    <LexerType name="javascript" desc="JavaScript (embedded)" ext="">
+      <WordsStyle name="DEFAULT" styleID="41" fgColor="000000" bgColor="F2F4FF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="NUMBER" styleID="45" fgColor="FF0000" bgColor="F2F4FF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="WORD" styleID="46" fgColor="000000" bgColor="F2F4FF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="KEYWORD" styleID="47" fgColor="000080" bgColor="F2F4FF" fontName="" fontStyle="3" fontSize="" keywordClass="instre1" />
+      <WordsStyle name="DOUBLESTRING" styleID="48" fgColor="808080" bgColor="F2F4FF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="SINGLESTRING" styleID="49" fgColor="808080" bgColor="F2F4FF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="SYMBOLS" styleID="50" fgColor="000000" bgColor="F2F4FF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="REGEX" styleID="52" fgColor="8000FF" bgColor="F2F4FF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT" styleID="42" fgColor="008000" bgColor="F2F4FF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENTLINE" styleID="43" fgColor="008000" bgColor="F2F4FF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENTDOC" styleID="44" fgColor="008080" bgColor="F2F4FF" fontName="" fontStyle="0" fontSize="" />
+    </LexerType>
+    <LexerType name="javascript.js" desc="JavaScript" ext="">
+      <WordsStyle name="DEFAULT" styleID="11" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="INSTRUCTION WORD" styleID="5" fgColor="0000FF" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" keywordClass="instre1" />
+      <WordsStyle name="TYPE WORD" styleID="16" fgColor="8000FF" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" keywordClass="type1" />
+      <WordsStyle name="WINDOW INSTRUCTION" styleID="19" fgColor="804000" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" keywordClass="instre2" />
+      <WordsStyle name="NUMBER" styleID="4" fgColor="FF8000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="STRING" styleID="6" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="STRINGRAW" styleID="20" fgColor="000080" bgColor="C0C0C0" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="CHARACTER" styleID="7" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="OPERATOR" styleID="10" fgColor="000080" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="VERBATIM" styleID="13" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="REGEX" styleID="14" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="COMMENT" styleID="1" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT LINE" styleID="2" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT DOC" styleID="3" fgColor="008080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT LINE DOC" styleID="15" fgColor="008080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT DOC KEYWORD" styleID="17" fgColor="008080" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="COMMENT DOC KEYWORD ERROR" styleID="18" fgColor="008080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+    </LexerType>
+    <LexerType name="json" desc="JSON" ext="">
+      <WordsStyle name="DEFAULT" styleID="11" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="NUMBER" styleID="4" fgColor="FF8000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="STRING DOUBLE QUOTE" styleID="6" fgColor="800000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="STRING SINGLE QUOTE" styleID="7" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="BOOLEAN NULL" styleID="5" fgColor="0000FF" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" keywordClass="instre1" />
+      <WordsStyle name="OPERATOR" styleID="10" fgColor="8000FF" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+    </LexerType>
+    <LexerType name="kix" desc="KiXtart" ext="">
+      <WordsStyle name="DEFAULT" styleID="31" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT" styleID="1" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="STRING" styleID="2" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="STRING2" styleID="3" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="NUMBER" styleID="4" fgColor="FF8000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="VAR" styleID="5" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="MACRO" styleID="6" fgColor="8000FF" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" keywordClass="instre2" />
+      <WordsStyle name="INSTRUCTION WORD" styleID="7" fgColor="0000FF" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" keywordClass="instre1" />
+      <WordsStyle name="FUNCTION" styleID="8" fgColor="8000FF" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" keywordClass="type1" />
+      <WordsStyle name="OPERATOR" styleID="9" fgColor="000080" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+    </LexerType>
+    <LexerType name="lisp" desc="LISP" ext="">
+      <WordsStyle name="DEFAULT" styleID="0" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENTLINE" styleID="1" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="NUMBER" styleID="2" fgColor="FF8000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="FUNCTION WORD" styleID="3" fgColor="0000FF" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" keywordClass="instre1" />
+      <WordsStyle name="FUNCTION WORD2" styleID="4" fgColor="0000FF" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" keywordClass="instre2" />
+      <WordsStyle name="SYMBOL" styleID="5" fgColor="000080" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="STRING" styleID="6" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="IDENTIFIER" styleID="9" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="OPERATOR" styleID="10" fgColor="0080C0" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" keywordClass="type1" />
+      <WordsStyle name="SPECIAL" styleID="11" fgColor="800000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT" styleID="12" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+    </LexerType>
+    <LexerType name="lua" desc="Lua" ext="">
+      <WordsStyle name="DEFAULT" styleID="0" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT" styleID="1" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT LINE" styleID="2" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT DOC" styleID="3" fgColor="008080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="LITERALSTRING" styleID="8" fgColor="95004A" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="PREPROCESSOR" styleID="9" fgColor="804000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="INSTRUCTION WORD" styleID="5" fgColor="0000FF" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" keywordClass="instre1" />
+      <WordsStyle name="NUMBER" styleID="4" fgColor="FF8000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="STRING" styleID="6" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="CHARACTER" styleID="7" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="OPERATOR" styleID="10" fgColor="000080" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="FUNC1" styleID="13" fgColor="0080C0" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" keywordClass="instre2" />
+      <WordsStyle name="FUNC2" styleID="14" fgColor="8000FF" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" keywordClass="type1" />
+      <WordsStyle name="FUNC3" styleID="15" fgColor="0000A0" bgColor="FFFFFF" fontName="" fontStyle="3" fontSize="" keywordClass="type2" />
+      <WordsStyle name="IDENTIFIER" styleID="11" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="LABEL" styleID="20" fgColor="808000" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+    </LexerType>
+    <LexerType name="makefile" desc="Makefile" ext="">
+      <WordsStyle name="DEFAULT" styleID="0" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT" styleID="1" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="PREPROCESSOR" styleID="2" fgColor="000080" bgColor="C0C0C0" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="IDENTIFIER" styleID="3" fgColor="0000FF" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="OPERATOR" styleID="4" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="TARGET" styleID="5" fgColor="FF0000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="IDEOL" styleID="9" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="2" fontSize="" />
+    </LexerType>
+    <LexerType name="matlab" desc="Matlab" ext="">
+      <WordsStyle name="DEFAULT" styleID="0" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT" styleID="1" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMAND" styleID="2" fgColor="8000FF" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="NUMBER" styleID="3" fgColor="FF8000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="INSTRUCTION WORD" styleID="4" fgColor="0000FF" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" keywordClass="instre1" />
+      <WordsStyle name="STRING" styleID="5" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="OPERATOR" styleID="6" fgColor="000080" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="IDENTIFIER" styleID="7" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="DOUBLE QUOTE STRING" styleID="8" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+    </LexerType>
+    <LexerType name="nsis" desc="NSIS" ext="">
+      <WordsStyle name="DEFAULT" styleID="0" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENTLINE" styleID="1" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="STRING DOUBLE QUOTE" styleID="2" fgColor="808080" bgColor="EEEEEE" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="STRING LEFT QUOTE" styleID="3" fgColor="000080" bgColor="C0C0C0" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="STRING RIGHT QUOTE" styleID="4" fgColor="000000" bgColor="C0C0C0" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="FUNCTION" styleID="5" fgColor="0000FF" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" keywordClass="instre1" />
+      <WordsStyle name="VARIABLE" styleID="6" fgColor="FF8000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" keywordClass="instre2" />
+      <WordsStyle name="LABEL" styleID="7" fgColor="FF0000" bgColor="FFFF80" fontName="" fontStyle="0" fontSize="" keywordClass="type1" />
+      <WordsStyle name="USER DEFINED" styleID="8" fgColor="FDFFEC" bgColor="FF80FF" fontName="" fontStyle="4" fontSize="" keywordClass="type2" />
+      <WordsStyle name="SECTION" styleID="9" fgColor="0000FF" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="SUBSECTION" styleID="10" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="IF DEFINE" styleID="11" fgColor="808040" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="MACRO" styleID="12" fgColor="800000" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="STRING VAR" styleID="13" fgColor="FF8000" bgColor="EFEFEF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="NUMBER" styleID="14" fgColor="FF0000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="SECTION GROUP" styleID="15" fgColor="0000FF" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="PAGE EX" styleID="16" fgColor="0000FF" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="FUNCTION DEFINITIONS" styleID="17" fgColor="0000FF" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="COMMENT" styleID="18" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+    </LexerType>
+    <LexerType name="objc" desc="Objective-C" ext="">
+      <WordsStyle name="DIRECTIVE" styleID="19" fgColor="A001D6" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" keywordClass="instre2" />
+      <WordsStyle name="DEFAULT" styleID="11" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="QUALIFIER" styleID="20" fgColor="95004A" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" keywordClass="type2" />
+      <WordsStyle name="PREPROCESSOR" styleID="9" fgColor="804000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="INSTRUCTION WORD" styleID="5" fgColor="0000FF" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" keywordClass="instre1" />
+      <WordsStyle name="TYPE WORD" styleID="16" fgColor="8000FF" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" keywordClass="type1" />
+      <WordsStyle name="NUMBER" styleID="4" fgColor="FF8000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="STRING" styleID="6" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="CHARACTER" styleID="7" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="OPERATOR" styleID="10" fgColor="000080" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="VERBATIM" styleID="13" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="REGEX" styleID="14" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="COMMENT" styleID="1" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT LINE" styleID="2" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT DOC" styleID="3" fgColor="008080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT LINE DOC" styleID="15" fgColor="008080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT DOC KEYWORD" styleID="17" fgColor="008080" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="COMMENT DOC KEYWORD ERROR" styleID="18" fgColor="008080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+    </LexerType>
+    <LexerType name="pascal" desc="Pascal" ext="">
+      <WordsStyle name="DEFAULT" styleID="0" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="IDENTIFIER" styleID="1" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT" styleID="2" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT LINE" styleID="3" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT DOC" styleID="4" fgColor="008080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="PREPROCESSOR" styleID="5" fgColor="804000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="PREPROCESSOR2" styleID="6" fgColor="804000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="NUMBER" styleID="7" fgColor="FF8000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="HEX NUMBER" styleID="8" fgColor="FF8000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="INSTRUCTION WORD" styleID="9" fgColor="0000FF" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" keywordClass="instre1" />
+      <WordsStyle name="STRING" styleID="10" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="CHARACTER" styleID="12" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="OPERATOR" styleID="13" fgColor="000080" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="ASM" styleID="14" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+    </LexerType>
+    <LexerType name="perl" desc="Perl" ext="">
+      <WordsStyle name="PREPROCESSOR" styleID="9" fgColor="804000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="DEFAULT" styleID="0" fgColor="FF0000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="INSTRUCTION WORD" styleID="5" fgColor="0000FF" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" keywordClass="instre1" />
+      <WordsStyle name="NUMBER" styleID="4" fgColor="FF0000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="STRING" styleID="6" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="CHARACTER" styleID="7" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="OPERATOR" styleID="10" fgColor="000080" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="REGEX" styleID="17" fgColor="8080FF" bgColor="F8FEDE" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT LINE" styleID="2" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="SCALAR" styleID="12" fgColor="FF8000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="ARRAY" styleID="13" fgColor="CF34CF" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="HASH" styleID="14" fgColor="8080C0" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="SYMBOL TABLE" styleID="15" fgColor="FF0000" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="PUNCTUATION" styleID="8" fgColor="804000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="POD" styleID="3" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="ERROR" styleID="1" fgColor="FF80C0" bgColor="FFFFFF" fontName="" fontStyle="3" fontSize="" />
+      <WordsStyle name="LONGQUOTE" styleID="19" fgColor="FF8000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="DATASECTION" styleID="21" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="REGSUBST" styleID="18" fgColor="8080C0" bgColor="FFEEEC" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="BACKTICKS" styleID="20" fgColor="FFFF00" bgColor="808080" fontName="" fontStyle="1" fontSize="" />
+    </LexerType>
+    <LexerType name="php" desc="php" ext="">
+      <WordsStyle name="QUESTION MARK" styleID="18" fgColor="FF0000" bgColor="FDF8E3" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="DEFAULT" styleID="118" fgColor="000000" bgColor="FEFCF5" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="STRING" styleID="119" fgColor="808080" bgColor="FEFCF5" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="STRING VARIABLE" styleID="126" fgColor="808080" bgColor="FEFCF5" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="SIMPLESTRING" styleID="120" fgColor="808080" bgColor="FEFCF5" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="WORD" styleID="121" fgColor="0000FF" bgColor="FEFCF5" fontName="" fontStyle="1" fontSize="" keywordClass="instre1" />
+      <WordsStyle name="NUMBER" styleID="122" fgColor="FF8000" bgColor="FEFCF5" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="VARIABLE" styleID="123" fgColor="000080" bgColor="FEFCF5" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT" styleID="124" fgColor="008000" bgColor="FEFCF5" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENTLINE" styleID="125" fgColor="008000" bgColor="FEFCF5" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="OPERATOR" styleID="127" fgColor="8000FF" bgColor="FEFCF5" fontName="" fontStyle="0" fontSize="" />
+    </LexerType>
+    <LexerType name="postscript" desc="Postscript" ext="">
+      <WordsStyle name="DEFAULT" styleID="0" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT" styleID="1" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="DSC COMMENT" styleID="2" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="DSC VALUE" styleID="3" fgColor="FF0000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="NUMBER" styleID="4" fgColor="FF8000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="Name" styleID="5" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="INSTRUCTION" styleID="6" fgColor="0000FF" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" keywordClass="instre1" />
+      <WordsStyle name="LITERAL" styleID="7" fgColor="0080C0" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="IMMEVAL" styleID="8" fgColor="000080" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="PAREN ARRAY" styleID="9" fgColor="FF00FF" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="PAREN DICT" styleID="10" fgColor="0080FF" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="PAREN PROC" styleID="11" fgColor="000080" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="TEXT" styleID="12" fgColor="808000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="HEX STRING" styleID="13" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="BASE85 STRING" styleID="14" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="BAD STRING CHAR" styleID="15" fgColor="804000" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+    </LexerType>
+    <LexerType name="powershell" desc="PowerShell" ext="">
+      <WordsStyle name="DEFAULT" styleID="0" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT" styleID="1" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="STRING" styleID="2" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="CHARACTER" styleID="3" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="NUMBER" styleID="4" fgColor="FF8000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="VARIABLE" styleID="5" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="OPERATOR" styleID="6" fgColor="000080" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="INSTRUCTION WORD" styleID="8" fgColor="0000FF" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" keywordClass="instre1" />
+      <WordsStyle name="CMDLET" styleID="9" fgColor="8000FF" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" keywordClass="instre2" />
+      <WordsStyle name="ALIAS" styleID="10" fgColor="0080FF" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" keywordClass="type1" />
+      <WordsStyle name="COMMENT STREAM" styleID="13" fgColor="008080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="HERE STRING" styleID="14" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="HERE CHARACTER" styleID="15" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT DOC KEYWORD" styleID="16" fgColor="008080" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" keywordClass="type4" />
+    </LexerType>
+    <LexerType name="props" desc="Properties file" ext="">
+      <WordsStyle name="DEFAULT" styleID="0" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT" styleID="1" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="SECTION" styleID="2" fgColor="8000FF" bgColor="F2F4FF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="ASSIGNMENT" styleID="3" fgColor="FF0000" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="DEFVAL" styleID="4" fgColor="FF0000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+    </LexerType>
+    <LexerType name="python" desc="Python" ext="">
+      <WordsStyle name="DEFAULT" styleID="0" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENTLINE" styleID="1" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="NUMBER" styleID="2" fgColor="FF0000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="STRING" styleID="3" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="CHARACTER" styleID="4" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="KEYWORDS" styleID="5" fgColor="0000FF" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" keywordClass="instre1" />
+      <WordsStyle name="TRIPLE" styleID="6" fgColor="FF8000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="TRIPLEDOUBLE" styleID="7" fgColor="FF8000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="CLASSNAME" styleID="8" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="DEFNAME" styleID="9" fgColor="FF00FF" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="OPERATOR" styleID="10" fgColor="000080" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="IDENTIFIER" styleID="11" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENTBLOCK" styleID="12" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="DECORATOR" styleID="15" fgColor="FF8000" bgColor="FFFFFF" fontName="" fontStyle="2" fontSize="" />
+    </LexerType>
+    <LexerType name="r" desc="R" ext="">
+      <WordsStyle name="DEFAULT" styleID="0" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT" styleID="1" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="INSTRUCTION WORD" styleID="2" fgColor="0000FF" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" keywordClass="instre1" />
+      <WordsStyle name="BASE WORD" styleID="3" fgColor="8000FF" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" keywordClass="instre2" />
+      <WordsStyle name="KEYWORD" styleID="4" fgColor="0080FF" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" keywordClass="type1" />
+      <WordsStyle name="NUMBER" styleID="5" fgColor="FF8000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="STRING" styleID="6" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="STRING2" styleID="7" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="OPERATOR" styleID="8" fgColor="000080" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="INFIX" styleID="10" fgColor="804000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="IDENTIFIER" styleID="9" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+    </LexerType>
+    <LexerType name="rc" desc="RC" ext="">
+      <WordsStyle name="PREPROCESSOR" styleID="9" fgColor="804000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="DEFAULT" styleID="11" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="INSTRUCTION WORD" styleID="5" fgColor="0000FF" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" keywordClass="instre1" />
+      <WordsStyle name="TYPE WORD" styleID="16" fgColor="8000FF" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="NUMBER" styleID="4" fgColor="FF8000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="STRING" styleID="6" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="CHARACTER" styleID="7" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="OPERATOR" styleID="10" fgColor="000080" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="VERBATIM" styleID="13" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="REGEX" styleID="14" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="COMMENT" styleID="1" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT LINE" styleID="2" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT DOC" styleID="3" fgColor="008080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT LINE DOC" styleID="15" fgColor="008080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT DOC KEYWORD" styleID="17" fgColor="008080" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="COMMENT DOC KEYWORD ERROR" styleID="18" fgColor="008080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="PREPROCESSOR COMMENT" styleID="23" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="PREPROCESSOR COMMENT DOC" styleID="24" fgColor="008080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+    </LexerType>
+    <LexerType name="ruby" desc="Ruby" ext="">
+      <WordsStyle name="DEFAULT" styleID="0" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="ERROR" styleID="1" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENTLINE" styleID="2" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="POD" styleID="3" fgColor="004000" bgColor="C0FFC0" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="NUMBER" styleID="4" fgColor="FF8000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="INSTRUCTION" styleID="5" fgColor="0000FF" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" keywordClass="instre1" />
+      <WordsStyle name="STRING" styleID="6" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="CHARACTER" styleID="7" fgColor="808000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="CLASS NAME" styleID="8" fgColor="0080C0" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="DEF NAME" styleID="9" fgColor="8080FF" bgColor="FFFFCC" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="OPERATOR" styleID="10" fgColor="000080" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="IDENTIFIER" styleID="11" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="REGEX" styleID="12" fgColor="0080FF" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="GLOBAL" styleID="13" fgColor="000080" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="SYMBOL" styleID="14" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="MODULE NAME" styleID="15" fgColor="804000" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="INSTANCE VAR" styleID="16" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="CLASS VAR" styleID="17" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="BACKTICKS" styleID="18" fgColor="FFFF00" bgColor="A08080" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="DATA SECTION" styleID="19" fgColor="600000" bgColor="FFF0D8" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="STRING Q" styleID="24" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+    </LexerType>
+    <LexerType name="scheme" desc="Scheme" ext="">
+      <WordsStyle name="DEFAULT" styleID="0" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENTLINE" styleID="1" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="NUMBER" styleID="2" fgColor="FF8000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="FUNCTION WORD" styleID="3" fgColor="0000FF" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" keywordClass="instre1" />
+      <WordsStyle name="FUNCTION WORD2" styleID="4" fgColor="0000FF" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" keywordClass="instre2" />
+      <WordsStyle name="SYMBOL" styleID="5" fgColor="000080" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="STRING" styleID="6" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="IDENTIFIER" styleID="9" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="OPERATOR" styleID="10" fgColor="0080C0" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" keywordClass="type1" />
+      <WordsStyle name="SPECIAL" styleID="11" fgColor="800000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT" styleID="12" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+    </LexerType>
+    <LexerType name="smalltalk" desc="Smalltalk" ext="">
+      <WordsStyle name="DEFAULT" styleID="0" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="STRING" styleID="1" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="NUMBER" styleID="2" fgColor="FF8000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT" styleID="3" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="SYMBOL" styleID="4" fgColor="408080" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="BINARY" styleID="5" fgColor="000080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="BOOL" styleID="6" fgColor="8000FF" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="SELF" styleID="7" fgColor="8080FF" bgColor="FFFFCC" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="SUPER" styleID="8" fgColor="0080FF" bgColor="ECFFEA" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="NIL" styleID="9" fgColor="8080C0" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="GLOBAL" styleID="10" fgColor="800000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="RETURN" styleID="11" fgColor="0000FF" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="SPECIAL" styleID="12" fgColor="808000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="KWS END" styleID="13" fgColor="0080FF" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="ASSIGN" styleID="14" fgColor="FF0000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="CHARACTER" styleID="15" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="SPECIAL SELECTOR" styleID="16" fgColor="FF80C0" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+    </LexerType>
+    <LexerType name="sql" desc="SQL" ext="">
+      <WordsStyle name="KEYWORD" styleID="5" fgColor="0000FF" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" keywordClass="instre1" />
+      <WordsStyle name="NUMBER" styleID="4" fgColor="FF8000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="STRING" styleID="6" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="STRING2" styleID="7" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="OPERATOR" styleID="10" fgColor="000080" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="COMMENT" styleID="1" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT LINE" styleID="2" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+    </LexerType>
+    <LexerType name="tcl" desc="TCL" ext="">
+      <WordsStyle name="DEFAULT" styleID="0" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="MODIFIER" styleID="10" fgColor="804000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="EXPAND" styleID="11" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="INSTRUCTION WORD" styleID="12" fgColor="0000FF" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" keywordClass="instre1" />
+      <WordsStyle name="TYPE WORD" styleID="13" fgColor="8000FF" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" keywordClass="type1" />
+      <WordsStyle name="NUMBER" styleID="3" fgColor="FF8000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="SUB BRACE" styleID="9" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="SUBSTITUTION" styleID="8" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="OPERATOR" styleID="6" fgColor="000080" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="IDENTIFIER" styleID="7" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="WORD IN QUOTE" styleID="4" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="IN QUOTE" styleID="5" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="COMMENT" styleID="1" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT LINE" styleID="2" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT BOX" styleID="17" fgColor="008080" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="BLOCK COMMENT" styleID="18" fgColor="008080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+    </LexerType>
+    <LexerType name="tex" desc="TeX" ext="">
+      <WordsStyle name="DEFAULT" styleID="0" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="SPECIAL" styleID="1" fgColor="FF8000" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="GROUP" styleID="2" fgColor="8000FF" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="SYMBOL" styleID="3" fgColor="800000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMAND" styleID="4" fgColor="0000FF" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="TEXT" styleID="5" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+    </LexerType>
+    <LexerType name="vb" desc="VB / VBS" ext="">
+      <WordsStyle name="DEFAULT" styleID="7" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT" styleID="1" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="NUMBER" styleID="2" fgColor="FF0000" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="WORD" styleID="3" fgColor="0000FF" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" keywordClass="instre1" />
+      <WordsStyle name="STRING" styleID="4" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="PREPROCESSOR" styleID="5" fgColor="FF0000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="OPERATOR" styleID="6" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="DATE" styleID="8" fgColor="00FF00" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+    </LexerType>
+    <LexerType name="verilog" desc="Verilog" ext="">
+      <WordsStyle name="DEFAULT" styleID="0" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="IDENTIFIER" styleID="11" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="TAGNAME" styleID="2" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="INSTRUCTION WORD" styleID="5" fgColor="0000FF" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" keywordClass="instre1" />
+      <WordsStyle name="KEYWORD" styleID="7" fgColor="8000FF" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" keywordClass="type1" />
+      <WordsStyle name="OPERATOR" styleID="10" fgColor="000080" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="NUMBER" styleID="4" fgColor="FF8000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="PREPROCESSOR" styleID="9" fgColor="804000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="STRING" styleID="6" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT" styleID="1" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT LINE" styleID="2" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT LINE BANG" styleID="3" fgColor="008080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="USER" styleID="19" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+    </LexerType>
+    <LexerType name="vhdl" desc="VHDL" ext="">
+      <WordsStyle name="DEFAULT" styleID="0" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT" styleID="1" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="COMMENT LIne" styleID="2" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="NUMBER" styleID="3" fgColor="FF8000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="STRING" styleID="4" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="OPERATOR" styleID="5" fgColor="000080" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="IDENTIFIER" styleID="6" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="INSTRUCTION" styleID="8" fgColor="0000FF" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" keywordClass="instre1" />
+      <WordsStyle name="STD OPERATOR" styleID="9" fgColor="0080C0" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" keywordClass="instre2" />
+      <WordsStyle name="ATTRIBUTE" styleID="10" fgColor="8080FF" bgColor="FFFFCC" fontName="" fontStyle="1" fontSize="" keywordClass="type1" />
+      <WordsStyle name="DIRECTIVE" styleID="9" fgColor="808000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="DIRECTIVE OPERAND" styleID="10" fgColor="000080" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="STD FUNCTION" styleID="11" fgColor="0080FF" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" keywordClass="type2" />
+      <WordsStyle name="STD PACKAGE" styleID="12" fgColor="800000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" keywordClass="type3" />
+      <WordsStyle name="STD TYPE" styleID="13" fgColor="8000FF" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" keywordClass="type4" />
+      <WordsStyle name="USER DEFINE" styleID="14" fgColor="B5E71F" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" keywordClass="type5" />
+    </LexerType>
+    <LexerType name="xml" desc="XML" ext="">
+      <WordsStyle name="XMLSTART" styleID="12" fgColor="FF0000" bgColor="FFFF00" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="XMLEND" styleID="13" fgColor="FF0000" bgColor="FFFF00" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="DEFAULT" styleID="0" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="COMMENT" styleID="9" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="NUMBER" styleID="5" fgColor="FF0000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="DOUBLESTRING" styleID="6" fgColor="8000FF" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="SINGLESTRING" styleID="7" fgColor="8000FF" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="TAG" styleID="1" fgColor="0000FF" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="TAGEND" styleID="11" fgColor="0000FF" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="TAGUNKNOWN" styleID="2" fgColor="0000FF" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="ATTRIBUTE" styleID="3" fgColor="FF0000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="ATTRIBUTEUNKNOWN" styleID="4" fgColor="FF0000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="SGMLDEFAULT" styleID="21" fgColor="000000" bgColor="A6CAF0" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="CDATA" styleID="17" fgColor="FF8000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="ENTITY" styleID="10" fgColor="000000" bgColor="FEFDE0" fontName="" fontStyle="2" fontSize="" />
+    </LexerType>
+    <LexerType name="yaml" desc="YAML" ext="">
+      <WordsStyle name="DEFAULT" styleID="0" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="IDENTIFIER" styleID="2" fgColor="000080" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="COMMENT" styleID="1" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="INSTRUCTION WORD" styleID="3" fgColor="0000FF" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" keywordClass="instre1" />
+      <WordsStyle name="NUMBER" styleID="4" fgColor="FF8040" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="REFERENCE" styleID="5" fgColor="804000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="DOCUMENT" styleID="6" fgColor="0000FF" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="TEXT" styleID="7" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="ERROR" styleID="8" fgColor="FF0000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+    </LexerType>
+    <LexerType name="searchResult" desc="Search result" ext="">
+      <WordsStyle name="Search Header" styleID="1" fgColor="000080" bgColor="BBBBFF" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="File Header" styleID="2" fgColor="008000" bgColor="D5FFD5" fontName="" fontStyle="1" fontSize="" />
+      <WordsStyle name="Line Number" styleID="3" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="Hit Word" styleID="4" fgColor="FF0000" bgColor="FFFFBF" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="Selected Line" styleID="5" fgColor="000080" bgColor="FFFF4F" fontName="" fontStyle="0" fontSize="" />
+      <WordsStyle name="Current line background colour" styleID="6" bgColor="E8E8FF" />
+    </LexerType>
+  </LexerStyles>
+  <GlobalStyles>
+    <!-- Attention : Don't modify the name of styleID="0" -->
+    <WidgetStyle name="Global override" styleID="0" fgColor="FFFF80" bgColor="FF8000" fontName="Courier New" fontStyle="0" fontSize="10" />
+    <WidgetStyle name="Default Style" styleID="32" fgColor="000000" bgColor="FFFFFF" fontName="Courier New" fontStyle="0" fontSize="10" />
+    <WidgetStyle name="Indent guideline style" styleID="37" fgColor="C0C0C0" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+    <WidgetStyle name="Brace highlight style" styleID="34" fgColor="FF0000" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="10" />
+    <WidgetStyle name="Bad brace colour" styleID="35" fgColor="800000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
+    <WidgetStyle name="Current line background colour" styleID="0" bgColor="E8E8FF" />
+    <WidgetStyle name="Selected text colour" styleID="0" bgColor="C0C0C0" />
+    <WidgetStyle name="Caret colour" styleID="2069" fgColor="8000FF" />
+    <WidgetStyle name="Edge colour" styleID="0" fgColor="80FFFF" />
+    <WidgetStyle name="Line number margin" styleID="33" fgColor="808080" bgColor="E4E4E4" fontName="" fontStyle="0" fontSize="" />
+    <WidgetStyle name="Fold" styleID="0" fgColor="808080" bgColor="F3F3F3" />
+    <WidgetStyle name="Fold active" styleID="0" fgColor="FF0000" />
+    <WidgetStyle name="Fold margin" styleID="0" fgColor="FFFFFF" bgColor="E9E9E9" />
+    <WidgetStyle name="White space symbol" styleID="0" fgColor="FFB56A" />
+    <WidgetStyle name="Smart HighLighting" styleID="29" bgColor="00FF00" />
+    <WidgetStyle name="Find Mark Style" styleID="31" bgColor="FF0000" />
+    <WidgetStyle name="Mark Style 1" styleID="25" bgColor="00FFFF" />
+    <WidgetStyle name="Mark Style 2" styleID="24" bgColor="FF8000" />
+    <WidgetStyle name="Mark Style 3" styleID="23" bgColor="FFFF00" />
+    <WidgetStyle name="Mark Style 4" styleID="22" bgColor="8000FF" />
+    <WidgetStyle name="Mark Style 5" styleID="21" bgColor="008000" />
+    <WidgetStyle name="Incremental highlight all" styleID="28" bgColor="0080FF" />
+    <WidgetStyle name="Tags match highlighting" styleID="27" bgColor="8000FF" />
+    <WidgetStyle name="Tags attribute" styleID="26" bgColor="FFFF00" />
+    <WidgetStyle name="Active tab focused indicator" styleID="0" fgColor="FAAA3C" />
+    <WidgetStyle name="Active tab unfocused indicator" styleID="0" fgColor="FFCAB0" />
+    <WidgetStyle name="Active tab text" styleID="0" fgColor="000000" />
+    <WidgetStyle name="Inactive tabs" styleID="0" fgColor="808080" bgColor="C0C0C0" />
+    <WidgetStyle name="URL hovered" styleID="0" fgColor="0000FF" />
+  </GlobalStyles>
+</Scintilla>

+ 116 - 0
EsPy/Dialogs/AboutDialog.Designer.cs

@@ -0,0 +1,116 @@
+namespace EsPy.Dialogs
+{
+    partial class AboutDialog
+    {
+        /// <summary>
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary>
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Windows Form Designer generated code
+
+        /// <summary>
+        /// Required method for Designer support - do not modify
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.button1 = new System.Windows.Forms.Button();
+            this.label1 = new System.Windows.Forms.Label();
+            this.label2 = new System.Windows.Forms.Label();
+            this.label3 = new System.Windows.Forms.Label();
+            this.label4 = new System.Windows.Forms.Label();
+            this.SuspendLayout();
+            // 
+            // button1
+            // 
+            this.button1.DialogResult = System.Windows.Forms.DialogResult.OK;
+            this.button1.Location = new System.Drawing.Point(285, 78);
+            this.button1.Name = "button1";
+            this.button1.Size = new System.Drawing.Size(75, 23);
+            this.button1.TabIndex = 0;
+            this.button1.Text = "Close";
+            this.button1.UseVisualStyleBackColor = true;
+            // 
+            // label1
+            // 
+            this.label1.AutoSize = true;
+            this.label1.Font = new System.Drawing.Font("Arial", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
+            this.label1.Location = new System.Drawing.Point(12, 9);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(321, 22);
+            this.label1.TabIndex = 1;
+            this.label1.Text = "EsPy. An ESP8266 MicroPython IDE";
+            // 
+            // label2
+            // 
+            this.label2.AutoSize = true;
+            this.label2.Location = new System.Drawing.Point(16, 36);
+            this.label2.Name = "label2";
+            this.label2.Size = new System.Drawing.Size(35, 13);
+            this.label2.TabIndex = 3;
+            this.label2.Text = "label2";
+            // 
+            // label3
+            // 
+            this.label3.AutoSize = true;
+            this.label3.Location = new System.Drawing.Point(16, 56);
+            this.label3.Name = "label3";
+            this.label3.Size = new System.Drawing.Size(35, 13);
+            this.label3.TabIndex = 4;
+            this.label3.Text = "label3";
+            // 
+            // label4
+            // 
+            this.label4.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+            this.label4.Location = new System.Drawing.Point(12, 73);
+            this.label4.Name = "label4";
+            this.label4.Size = new System.Drawing.Size(348, 2);
+            this.label4.TabIndex = 5;
+            this.label4.Text = "label4";
+            // 
+            // AboutDialog
+            // 
+            this.AcceptButton = this.button1;
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.ClientSize = new System.Drawing.Size(372, 110);
+            this.Controls.Add(this.label4);
+            this.Controls.Add(this.label3);
+            this.Controls.Add(this.label2);
+            this.Controls.Add(this.label1);
+            this.Controls.Add(this.button1);
+            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
+            this.MaximizeBox = false;
+            this.MinimizeBox = false;
+            this.Name = "AboutDialog";
+            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+            this.Text = "About";
+            this.Load += new System.EventHandler(this.AboutDialog_Load);
+            this.ResumeLayout(false);
+            this.PerformLayout();
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.Button button1;
+        private System.Windows.Forms.Label label1;
+        private System.Windows.Forms.Label label2;
+        private System.Windows.Forms.Label label3;
+        private System.Windows.Forms.Label label4;
+    }
+}

+ 26 - 0
EsPy/Dialogs/AboutDialog.cs

@@ -0,0 +1,26 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace EsPy.Dialogs
+{
+    public partial class AboutDialog : Form
+    {
+        public AboutDialog()
+        {
+            InitializeComponent();
+        }
+
+        private void AboutDialog_Load(object sender, EventArgs e)
+        {
+            this.label2.Text = "v" + Application.ProductVersion;
+            this.label3.Text = "Copyright (c) Jung Ervin 2016";
+        }
+    }
+}

+ 120 - 0
EsPy/Dialogs/AboutDialog.resx

@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>

+ 417 - 0
EsPy/Dialogs/EspToolDialog.Designer.cs

@@ -0,0 +1,417 @@
+namespace EsPy.Dialogs
+{
+    partial class EspToolDialog
+    {
+        /// <summary>
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary>
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Windows Form Designer generated code
+
+        /// <summary>
+        /// Required method for Designer support - do not modify
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.label1 = new System.Windows.Forms.Label();
+            this.tbPython = new System.Windows.Forms.TextBox();
+            this.btnPython = new System.Windows.Forms.Button();
+            this.label2 = new System.Windows.Forms.Label();
+            this.tbEsptool = new System.Windows.Forms.TextBox();
+            this.btnEsptool = new System.Windows.Forms.Button();
+            this.label3 = new System.Windows.Forms.Label();
+            this.tbFirmware = new System.Windows.Forms.TextBox();
+            this.btnFirmware = new System.Windows.Forms.Button();
+            this.textBox4 = new System.Windows.Forms.TextBox();
+            this.btnErase = new System.Windows.Forms.Button();
+            this.btnWrite = new System.Windows.Forms.Button();
+            this.btnClose = new System.Windows.Forms.Button();
+            this.button1 = new System.Windows.Forms.Button();
+            this.btnVerify = new System.Windows.Forms.Button();
+            this.label4 = new System.Windows.Forms.Label();
+            this.groupBox1 = new System.Windows.Forms.GroupBox();
+            this.cbBaudrate = new System.Windows.Forms.ComboBox();
+            this.label6 = new System.Windows.Forms.Label();
+            this.btnMac = new System.Windows.Forms.Button();
+            this.btnFlashID = new System.Windows.Forms.Button();
+            this.btnChipID = new System.Windows.Forms.Button();
+            this.label5 = new System.Windows.Forms.Label();
+            this.linkLabel1 = new System.Windows.Forms.LinkLabel();
+            this.linkLabel2 = new System.Windows.Forms.LinkLabel();
+            this.label7 = new System.Windows.Forms.Label();
+            this.cbPort = new System.Windows.Forms.ComboBox();
+            this.groupBox1.SuspendLayout();
+            this.SuspendLayout();
+            // 
+            // label1
+            // 
+            this.label1.AutoSize = true;
+            this.label1.Location = new System.Drawing.Point(13, 49);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(59, 13);
+            this.label1.TabIndex = 0;
+            this.label1.Text = "python.exe";
+            // 
+            // txtPython
+            // 
+            this.tbPython.Location = new System.Drawing.Point(75, 46);
+            this.tbPython.Name = "txtPython";
+            this.tbPython.Size = new System.Drawing.Size(502, 20);
+            this.tbPython.TabIndex = 1;
+            // 
+            // btnPython
+            // 
+            this.btnPython.Location = new System.Drawing.Point(583, 44);
+            this.btnPython.Name = "btnPython";
+            this.btnPython.Size = new System.Drawing.Size(23, 23);
+            this.btnPython.TabIndex = 2;
+            this.btnPython.Text = "...";
+            this.btnPython.UseVisualStyleBackColor = true;
+            this.btnPython.Click += new System.EventHandler(this.btnPython_Click);
+            // 
+            // label2
+            // 
+            this.label2.AutoSize = true;
+            this.label2.Location = new System.Drawing.Point(17, 75);
+            this.label2.Name = "label2";
+            this.label2.Size = new System.Drawing.Size(55, 13);
+            this.label2.TabIndex = 0;
+            this.label2.Text = "esptool.py";
+            // 
+            // txtEsptool
+            // 
+            this.tbEsptool.Location = new System.Drawing.Point(75, 72);
+            this.tbEsptool.Name = "txtEsptool";
+            this.tbEsptool.Size = new System.Drawing.Size(502, 20);
+            this.tbEsptool.TabIndex = 3;
+            // 
+            // btnEsptool
+            // 
+            this.btnEsptool.Location = new System.Drawing.Point(583, 70);
+            this.btnEsptool.Name = "btnEsptool";
+            this.btnEsptool.Size = new System.Drawing.Size(23, 23);
+            this.btnEsptool.TabIndex = 4;
+            this.btnEsptool.Text = "...";
+            this.btnEsptool.UseVisualStyleBackColor = true;
+            this.btnEsptool.Click += new System.EventHandler(this.btnEsptool_Click);
+            // 
+            // label3
+            // 
+            this.label3.AutoSize = true;
+            this.label3.Location = new System.Drawing.Point(9, 101);
+            this.label3.Name = "label3";
+            this.label3.Size = new System.Drawing.Size(63, 13);
+            this.label3.TabIndex = 0;
+            this.label3.Text = "frimware.bin";
+            // 
+            // txtFirmware
+            // 
+            this.tbFirmware.Location = new System.Drawing.Point(75, 98);
+            this.tbFirmware.Name = "txtFirmware";
+            this.tbFirmware.Size = new System.Drawing.Size(502, 20);
+            this.tbFirmware.TabIndex = 5;
+            // 
+            // btnFirmware
+            // 
+            this.btnFirmware.Location = new System.Drawing.Point(583, 96);
+            this.btnFirmware.Name = "btnFirmware";
+            this.btnFirmware.Size = new System.Drawing.Size(23, 23);
+            this.btnFirmware.TabIndex = 6;
+            this.btnFirmware.Text = "...";
+            this.btnFirmware.UseVisualStyleBackColor = true;
+            this.btnFirmware.Click += new System.EventHandler(this.btnFirmware_Click);
+            // 
+            // textBox4
+            // 
+            this.textBox4.Font = new System.Drawing.Font("Courier New", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
+            this.textBox4.Location = new System.Drawing.Point(12, 182);
+            this.textBox4.Multiline = true;
+            this.textBox4.Name = "textBox4";
+            this.textBox4.ScrollBars = System.Windows.Forms.ScrollBars.Both;
+            this.textBox4.Size = new System.Drawing.Size(606, 157);
+            this.textBox4.TabIndex = 0;
+            // 
+            // btnErase
+            // 
+            this.btnErase.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
+            this.btnErase.Location = new System.Drawing.Point(306, 346);
+            this.btnErase.Name = "btnErase";
+            this.btnErase.Size = new System.Drawing.Size(100, 23);
+            this.btnErase.TabIndex = 4;
+            this.btnErase.Text = "1. Erase...";
+            this.btnErase.UseVisualStyleBackColor = true;
+            this.btnErase.Click += new System.EventHandler(this.Erase_Click);
+            // 
+            // btnWrite
+            // 
+            this.btnWrite.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
+            this.btnWrite.Location = new System.Drawing.Point(412, 346);
+            this.btnWrite.Name = "btnWrite";
+            this.btnWrite.Size = new System.Drawing.Size(100, 23);
+            this.btnWrite.TabIndex = 5;
+            this.btnWrite.Text = "2. Write + Verify...";
+            this.btnWrite.UseVisualStyleBackColor = true;
+            this.btnWrite.Click += new System.EventHandler(this.btnWrite_Click);
+            // 
+            // btnClose
+            // 
+            this.btnClose.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
+            this.btnClose.Location = new System.Drawing.Point(468, 387);
+            this.btnClose.Name = "btnClose";
+            this.btnClose.Size = new System.Drawing.Size(75, 23);
+            this.btnClose.TabIndex = 7;
+            this.btnClose.Text = "OK";
+            this.btnClose.UseVisualStyleBackColor = true;
+            this.btnClose.Click += new System.EventHandler(this.btnClose_Click);
+            // 
+            // button1
+            // 
+            this.button1.DialogResult = System.Windows.Forms.DialogResult.OK;
+            this.button1.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
+            this.button1.Location = new System.Drawing.Point(549, 387);
+            this.button1.Name = "button1";
+            this.button1.Size = new System.Drawing.Size(75, 23);
+            this.button1.TabIndex = 8;
+            this.button1.Text = "Cancel";
+            this.button1.UseVisualStyleBackColor = true;
+            // 
+            // btnVerify
+            // 
+            this.btnVerify.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
+            this.btnVerify.Location = new System.Drawing.Point(518, 345);
+            this.btnVerify.Name = "btnVerify";
+            this.btnVerify.Size = new System.Drawing.Size(100, 23);
+            this.btnVerify.TabIndex = 6;
+            this.btnVerify.Text = "Verify";
+            this.btnVerify.UseVisualStyleBackColor = true;
+            this.btnVerify.Click += new System.EventHandler(this.btnVerify_Click);
+            // 
+            // label4
+            // 
+            this.label4.BackColor = System.Drawing.Color.DarkRed;
+            this.label4.Dock = System.Windows.Forms.DockStyle.Top;
+            this.label4.Font = new System.Drawing.Font("Arial Rounded MT Bold", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.label4.ForeColor = System.Drawing.Color.White;
+            this.label4.Image = global::EsPy.Properties.Resources.eraseflash1;
+            this.label4.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
+            this.label4.Location = new System.Drawing.Point(0, 0);
+            this.label4.Name = "label4";
+            this.label4.Padding = new System.Windows.Forms.Padding(5);
+            this.label4.Size = new System.Drawing.Size(636, 46);
+            this.label4.TabIndex = 10;
+            this.label4.Text = "         esptool";
+            this.label4.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+            // 
+            // groupBox1
+            // 
+            this.groupBox1.Controls.Add(this.cbPort);
+            this.groupBox1.Controls.Add(this.cbBaudrate);
+            this.groupBox1.Controls.Add(this.label7);
+            this.groupBox1.Controls.Add(this.tbPython);
+            this.groupBox1.Controls.Add(this.label6);
+            this.groupBox1.Controls.Add(this.label1);
+            this.groupBox1.Controls.Add(this.label2);
+            this.groupBox1.Controls.Add(this.tbEsptool);
+            this.groupBox1.Controls.Add(this.label3);
+            this.groupBox1.Controls.Add(this.tbFirmware);
+            this.groupBox1.Controls.Add(this.btnPython);
+            this.groupBox1.Controls.Add(this.btnEsptool);
+            this.groupBox1.Controls.Add(this.btnFirmware);
+            this.groupBox1.Location = new System.Drawing.Point(12, 49);
+            this.groupBox1.Name = "groupBox1";
+            this.groupBox1.Size = new System.Drawing.Size(612, 127);
+            this.groupBox1.TabIndex = 11;
+            this.groupBox1.TabStop = false;
+            this.groupBox1.Text = "Settings";
+            // 
+            // cbBaudrate
+            // 
+            this.cbBaudrate.FormattingEnabled = true;
+            this.cbBaudrate.Items.AddRange(new object[] {
+            "9600",
+            "14400",
+            "19200",
+            "28800",
+            "38400",
+            "57600",
+            "115200",
+            "230400",
+            "460800",
+            "921600"});
+            this.cbBaudrate.Location = new System.Drawing.Point(249, 19);
+            this.cbBaudrate.Name = "cbBaudrate";
+            this.cbBaudrate.Size = new System.Drawing.Size(104, 21);
+            this.cbBaudrate.TabIndex = 0;
+            this.cbBaudrate.Validating += new System.ComponentModel.CancelEventHandler(this.cbBaudrate_Validating);
+            // 
+            // label6
+            // 
+            this.label6.AutoSize = true;
+            this.label6.Location = new System.Drawing.Point(185, 22);
+            this.label6.Name = "label6";
+            this.label6.Size = new System.Drawing.Size(58, 13);
+            this.label6.TabIndex = 6;
+            this.label6.Text = "Baud Rate";
+            // 
+            // btnMac
+            // 
+            this.btnMac.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
+            this.btnMac.Location = new System.Drawing.Point(12, 345);
+            this.btnMac.Name = "btnMac";
+            this.btnMac.Size = new System.Drawing.Size(74, 23);
+            this.btnMac.TabIndex = 1;
+            this.btnMac.Text = "MAC";
+            this.btnMac.UseVisualStyleBackColor = true;
+            this.btnMac.Click += new System.EventHandler(this.btnMac_Click);
+            // 
+            // btnFlashID
+            // 
+            this.btnFlashID.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
+            this.btnFlashID.Location = new System.Drawing.Point(92, 346);
+            this.btnFlashID.Name = "btnFlashID";
+            this.btnFlashID.Size = new System.Drawing.Size(74, 23);
+            this.btnFlashID.TabIndex = 2;
+            this.btnFlashID.Text = "Flash ID";
+            this.btnFlashID.UseVisualStyleBackColor = true;
+            this.btnFlashID.Click += new System.EventHandler(this.btnFlashID_Click);
+            // 
+            // btnChipID
+            // 
+            this.btnChipID.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
+            this.btnChipID.Location = new System.Drawing.Point(172, 346);
+            this.btnChipID.Name = "btnChipID";
+            this.btnChipID.Size = new System.Drawing.Size(74, 23);
+            this.btnChipID.TabIndex = 3;
+            this.btnChipID.Text = "Chip ID";
+            this.btnChipID.UseVisualStyleBackColor = true;
+            this.btnChipID.Click += new System.EventHandler(this.btnChipID_Click);
+            // 
+            // label5
+            // 
+            this.label5.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+            this.label5.Location = new System.Drawing.Point(12, 375);
+            this.label5.Name = "label5";
+            this.label5.Size = new System.Drawing.Size(612, 1);
+            this.label5.TabIndex = 15;
+            this.label5.Text = "label5";
+            // 
+            // linkLabel1
+            // 
+            this.linkLabel1.AutoSize = true;
+            this.linkLabel1.Location = new System.Drawing.Point(12, 381);
+            this.linkLabel1.Name = "linkLabel1";
+            this.linkLabel1.Size = new System.Drawing.Size(180, 13);
+            this.linkLabel1.TabIndex = 16;
+            this.linkLabel1.TabStop = true;
+            this.linkLabel1.Text = "https://github.com/espressif/esptool";
+            this.linkLabel1.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabel1_LinkClicked);
+            // 
+            // linkLabel2
+            // 
+            this.linkLabel2.AutoSize = true;
+            this.linkLabel2.Location = new System.Drawing.Point(12, 400);
+            this.linkLabel2.Name = "linkLabel2";
+            this.linkLabel2.Size = new System.Drawing.Size(212, 13);
+            this.linkLabel2.TabIndex = 17;
+            this.linkLabel2.TabStop = true;
+            this.linkLabel2.Text = "http://micropython.org/download#esp8266";
+            this.linkLabel2.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabel2_LinkClicked);
+            // 
+            // label7
+            // 
+            this.label7.AutoSize = true;
+            this.label7.Location = new System.Drawing.Point(14, 22);
+            this.label7.Name = "label7";
+            this.label7.Size = new System.Drawing.Size(55, 13);
+            this.label7.TabIndex = 6;
+            this.label7.Text = "Serial Port";
+            // 
+            // cbPort
+            // 
+            this.cbPort.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+            this.cbPort.FormattingEnabled = true;
+            this.cbPort.Location = new System.Drawing.Point(75, 19);
+            this.cbPort.Name = "cbPort";
+            this.cbPort.Size = new System.Drawing.Size(104, 21);
+            this.cbPort.TabIndex = 0;
+            this.cbPort.Validating += new System.ComponentModel.CancelEventHandler(this.cbBaudrate_Validating);
+            // 
+            // EspToolDialog
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.ClientSize = new System.Drawing.Size(636, 422);
+            this.Controls.Add(this.linkLabel2);
+            this.Controls.Add(this.linkLabel1);
+            this.Controls.Add(this.label5);
+            this.Controls.Add(this.btnChipID);
+            this.Controls.Add(this.btnFlashID);
+            this.Controls.Add(this.btnMac);
+            this.Controls.Add(this.groupBox1);
+            this.Controls.Add(this.label4);
+            this.Controls.Add(this.button1);
+            this.Controls.Add(this.btnClose);
+            this.Controls.Add(this.btnVerify);
+            this.Controls.Add(this.btnWrite);
+            this.Controls.Add(this.btnErase);
+            this.Controls.Add(this.textBox4);
+            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
+            this.MaximizeBox = false;
+            this.MinimizeBox = false;
+            this.Name = "EspToolDialog";
+            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+            this.Text = "esptool";
+            this.Load += new System.EventHandler(this.EspToolDialog_Load);
+            this.groupBox1.ResumeLayout(false);
+            this.groupBox1.PerformLayout();
+            this.ResumeLayout(false);
+            this.PerformLayout();
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.Label label1;
+        private System.Windows.Forms.TextBox tbPython;
+        private System.Windows.Forms.Button btnPython;
+        private System.Windows.Forms.Label label2;
+        private System.Windows.Forms.TextBox tbEsptool;
+        private System.Windows.Forms.Button btnEsptool;
+        private System.Windows.Forms.Label label3;
+        private System.Windows.Forms.TextBox tbFirmware;
+        private System.Windows.Forms.Button btnFirmware;
+        private System.Windows.Forms.TextBox textBox4;
+        private System.Windows.Forms.Button btnErase;
+        private System.Windows.Forms.Button btnWrite;
+        private System.Windows.Forms.Button btnClose;
+        private System.Windows.Forms.Button button1;
+        private System.Windows.Forms.Button btnVerify;
+        private System.Windows.Forms.Label label4;
+        private System.Windows.Forms.GroupBox groupBox1;
+        private System.Windows.Forms.Button btnMac;
+        private System.Windows.Forms.Button btnFlashID;
+        private System.Windows.Forms.Button btnChipID;
+        private System.Windows.Forms.Label label5;
+        private System.Windows.Forms.Label label6;
+        private System.Windows.Forms.ComboBox cbBaudrate;
+        private System.Windows.Forms.LinkLabel linkLabel1;
+        private System.Windows.Forms.LinkLabel linkLabel2;
+        private System.Windows.Forms.ComboBox cbPort;
+        private System.Windows.Forms.Label label7;
+    }
+}

+ 308 - 0
EsPy/Dialogs/EspToolDialog.cs

@@ -0,0 +1,308 @@
+using EsPy.Utility;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Diagnostics;
+using System.Drawing;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace EsPy.Dialogs
+{
+    public partial class EspToolDialog : Form
+    {
+        public EspToolDialog()
+        {
+            InitializeComponent();
+
+            this.BaudRate = Properties.Settings.Default.EspToolBaud;
+            this.cbBaudrate.Text = this.BaudRate.ToString();
+            this.tbPython.Text = Properties.Settings.Default.PythonExe;
+            if (tbPython.Text == "")
+                this.tbPython.Text = Helpers.GetPythonPath();
+
+            this.tbEsptool.Text = Properties.Settings.Default.EspToolPy;
+            this.tbFirmware.Text = Properties.Settings.Default.FrimwareBin;
+
+            string[] ports = System.IO.Ports.SerialPort.GetPortNames();
+            if (ports != null)
+            {
+                this.cbPort.Items.AddRange(ports);
+            }
+        }
+
+        public string PortName
+        {
+            get
+            {
+                if (this.cbPort.SelectedItem != null)
+                    return this.cbPort.SelectedItem.ToString();
+
+                return "";
+            }
+            set
+            {
+                this.cbPort.Text = value;
+            }
+        }
+
+        private void btnPython_Click(object sender, EventArgs e)
+        {
+            OpenFileDialog d = new OpenFileDialog();
+            d.Filter = "python.exe|python.exe";
+            if (this.tbPython.Text != "" && Directory.Exists(Path.GetDirectoryName(this.tbPython.Text)))
+                d.InitialDirectory = Path.GetDirectoryName(this.tbPython.Text);
+
+            if (d.ShowDialog() == DialogResult.OK)
+            {
+                this.tbPython.Text = d.FileName;
+            }
+            d.Dispose();
+        }
+
+        private void btnEsptool_Click(object sender, EventArgs e)
+        {
+            OpenFileDialog d = new OpenFileDialog();
+            d.Filter = "esptool.py|esptool.py";
+            if (this.tbEsptool.Text != "" && Directory.Exists(Path.GetDirectoryName(this.tbEsptool.Text)))
+                d.InitialDirectory = Path.GetDirectoryName(this.tbEsptool.Text);
+
+            if (d.ShowDialog() == DialogResult.OK)
+            {
+                this.tbEsptool.Text = d.FileName;
+            }
+            d.Dispose();
+        }
+
+        private void btnFirmware_Click(object sender, EventArgs e)
+        {
+            OpenFileDialog d = new OpenFileDialog();
+            d.Filter = "firmware.bin|*.bin";
+            if (this.tbFirmware.Text != "" && Directory.Exists(Path.GetDirectoryName(this.tbFirmware.Text)))
+                d.InitialDirectory = Path.GetDirectoryName(this.tbFirmware.Text);
+
+            if (d.ShowDialog() == DialogResult.OK)
+            {
+                this.tbFirmware.Text = d.FileName;
+            }
+            d.Dispose();
+        }
+
+         private string Run(string cmd, string args)
+        {
+            this.textBox4.Text = "Please wait...\r\n";
+            
+            this.Enabled = false;
+            Application.DoEvents();
+
+            try
+            {
+                System.Diagnostics.ProcessStartInfo inf = new System.Diagnostics.ProcessStartInfo(
+                    cmd, "" + args);
+                inf.RedirectStandardOutput = true;
+                inf.RedirectStandardError = true;
+
+                inf.UseShellExecute = false;
+                inf.CreateNoWindow = true;
+
+                System.Diagnostics.Process proc = new System.Diagnostics.Process();
+                //proc.OutputDataReceived += Proc_OutputDataReceived;
+                //proc.ErrorDataReceived += Proc_ErrorDataReceived;
+                proc.StartInfo = inf;
+
+                proc.Start();
+                string res = "";
+                res = proc.StandardOutput.ReadToEnd();
+                res += proc.StandardError.ReadToEnd();
+                proc.WaitForExit();
+                while (!proc.HasExited)
+                {
+                    Thread.Sleep(100);
+                }
+
+                proc.Close();
+                proc.Dispose();
+
+                for (int i = 1; i < res.Length;)
+                {
+                    if (res[i]  < 10)
+                    {                   
+                        res = res.Remove(i - 1 , 2);
+                        i--;
+                    }
+                    else i++;
+                }
+
+                return res;
+            }
+            catch (Exception e)
+            {
+                return e.Message;
+            }
+            finally
+            {
+                this.Enabled = true;
+            }
+        }
+
+
+       //public delegate void DataReceivedEventHandler(string data);
+       // private void UpdateUI(string data)
+       // {
+       //     if (this.InvokeRequired)
+       //     {
+       //         this.Invoke(new DataReceivedEventHandler(this.UpdateUI), new object[] { data });
+       //     }
+       //     else
+       //     {
+       //         if (data != null)
+       //         {
+       //             this.textBox4.Text = data;
+       //             this.textBox4.Invalidate();
+       //         }
+       //     }
+       // }
+       // private void Proc_ErrorDataReceived(object sender, System.Diagnostics.DataReceivedEventArgs e)
+       // {
+       //     this.UpdateUI(e.Data);
+       // }
+
+       // private void Proc_OutputDataReceived(object sender, System.Diagnostics.DataReceivedEventArgs e)
+       // {
+       //     this.UpdateUI(e.Data);
+       // }
+
+        private void btnMac_Click(object sender, EventArgs e)
+        {
+            if (this.CheckPaths(false))
+            {
+                string args = String.Format("{0} -p {1} -b {2} read_mac", this.tbEsptool.Text, this.PortName, this.BaudRate);
+                this.textBox4.Text = this.Run(this.tbPython.Text, args);
+            }
+        }
+
+        private void btnFlashID_Click(object sender, EventArgs e)
+        {
+            if (this.CheckPaths(false))
+            {
+                string args = String.Format("{0} -p {1} -b {2} flash_id", this.tbEsptool.Text, this.PortName, this.BaudRate);
+                this.textBox4.Text = this.Run(this.tbPython.Text, args);
+            }
+        }
+
+        private void btnChipID_Click(object sender, EventArgs e)
+        {
+            if (this.CheckPaths(false))
+            {
+                string args = String.Format("{0} -p {1} -b {2} chip_id", this.tbEsptool.Text, this.PortName, this.BaudRate);
+                this.textBox4.Text = this.Run(this.tbPython.Text, args);
+            }
+        }
+
+        private void Erase_Click(object sender, EventArgs e)
+        {
+            if (this.CheckPaths(false))
+            {
+                if (MessageBox.Show("Are you sure?", "Warning", MessageBoxButtons.YesNo, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button2) == DialogResult.Yes)
+                {
+                    string args = String.Format("{0} -p {1} -b {2} erase_flash", this.tbEsptool.Text, this.PortName, this.BaudRate);
+                    this.textBox4.Text = this.Run(this.tbPython.Text, args);
+                }
+            }
+        }
+
+        private void btnWrite_Click(object sender, EventArgs e)
+        {
+            if (this.CheckPaths())
+            {
+                if (MessageBox.Show("Are you sure?", "Warning", MessageBoxButtons.YesNo, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button2) == DialogResult.Yes)
+                {
+                    string args = String.Format("{0} -p {1} -b {2} write_flash --verify --flash_size=detect 0 {3}", this.tbEsptool.Text, this.PortName, this.BaudRate, this.tbFirmware.Text);
+                    this.textBox4.Text = this.Run(this.tbPython.Text, args);
+                }
+            }
+        }
+
+        private void btnVerify_Click(object sender, EventArgs e)
+        {
+            if (this.CheckPaths())
+            {
+                string args = String.Format("{0} -p {1} -b {2} verify_flash 0x40000 {3}", this.tbEsptool.Text, this.PortName, this.BaudRate, this.tbFirmware.Text);
+                this.textBox4.Text = this.Run(this.tbPython.Text, args);
+            }
+        }
+
+        private int BaudRate
+        { get; set; }
+
+        private bool CheckPaths(bool firmware = true)
+        {
+            string err = "";
+
+            if (!File.Exists(this.tbPython.Text))
+                err += "python.exe does not exists!\r\n";
+
+            if (!File.Exists(this.tbEsptool.Text))
+                err += "esptool.py does not exists!\r\n";
+
+            if (firmware && !File.Exists(this.tbFirmware.Text))
+                err += "firmware.bin does not exists!\r\n";
+
+            if (err != "")
+            {
+                Helpers.ErrorBox(err);
+                return false;
+            }
+            return true;
+        }
+
+        private void btnClose_Click(object sender, EventArgs e)
+        {
+            if (this.CheckPaths(false))
+            {
+                Properties.Settings.Default.PythonExe = this.tbPython.Text;
+                Properties.Settings.Default.EspToolPy = this.tbEsptool.Text;
+                Properties.Settings.Default.FrimwareBin = this.tbFirmware.Text;
+                Properties.Settings.Default.EspToolBaud = this.BaudRate;
+                Properties.Settings.Default.Save();
+                this.DialogResult = DialogResult.OK;
+            }
+        }
+
+        private void cbBaudrate_Validating(object sender, CancelEventArgs e)
+        {
+            int baud = 0;
+            if (!int.TryParse(this.cbBaudrate.Text, out baud))
+            {
+                this.cbBaudrate.BackColor = Color.Red;
+                this.cbBaudrate.ForeColor = Color.White;
+                Helpers.ErrorBox("Baud rate has invalid value!\r\n");
+                e.Cancel = true;
+            }
+
+            this.cbBaudrate.BackColor = Color.White;
+            this.cbBaudrate.ForeColor = Color.Black;
+
+            this.BaudRate = baud;
+        }
+
+        private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
+        {
+            Process.Start(this.linkLabel1.Text);
+        }
+
+        private void linkLabel2_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
+        {
+            Process.Start(linkLabel2.Text);
+        }
+
+        private void EspToolDialog_Load(object sender, EventArgs e)
+        {
+        }
+    }
+}

+ 120 - 0
EsPy/Dialogs/EspToolDialog.resx

@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>

+ 117 - 0
EsPy/Dialogs/FileSavesDialog.Designer.cs

@@ -0,0 +1,117 @@
+namespace EsPy.Dialogs
+{
+    partial class FileSavesDialog
+    {
+        /// <summary>
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary>
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Windows Form Designer generated code
+
+        /// <summary>
+        /// Required method for Designer support - do not modify
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.button1 = new System.Windows.Forms.Button();
+            this.button2 = new System.Windows.Forms.Button();
+            this.button3 = new System.Windows.Forms.Button();
+            this.listBox1 = new System.Windows.Forms.ListBox();
+            this.label1 = new System.Windows.Forms.Label();
+            this.SuspendLayout();
+            // 
+            // button1
+            // 
+            this.button1.DialogResult = System.Windows.Forms.DialogResult.Yes;
+            this.button1.Location = new System.Drawing.Point(221, 216);
+            this.button1.Name = "button1";
+            this.button1.Size = new System.Drawing.Size(75, 23);
+            this.button1.TabIndex = 1;
+            this.button1.Text = "Yes";
+            this.button1.UseVisualStyleBackColor = true;
+            // 
+            // button2
+            // 
+            this.button2.DialogResult = System.Windows.Forms.DialogResult.No;
+            this.button2.Location = new System.Drawing.Point(303, 216);
+            this.button2.Name = "button2";
+            this.button2.Size = new System.Drawing.Size(75, 23);
+            this.button2.TabIndex = 2;
+            this.button2.Text = "No";
+            this.button2.UseVisualStyleBackColor = true;
+            // 
+            // button3
+            // 
+            this.button3.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+            this.button3.Location = new System.Drawing.Point(385, 216);
+            this.button3.Name = "button3";
+            this.button3.Size = new System.Drawing.Size(75, 23);
+            this.button3.TabIndex = 3;
+            this.button3.Text = "Cancel";
+            this.button3.UseVisualStyleBackColor = true;
+            // 
+            // listBox1
+            // 
+            this.listBox1.Enabled = false;
+            this.listBox1.FormattingEnabled = true;
+            this.listBox1.Location = new System.Drawing.Point(12, 37);
+            this.listBox1.Name = "listBox1";
+            this.listBox1.Size = new System.Drawing.Size(448, 173);
+            this.listBox1.TabIndex = 4;
+            // 
+            // label1
+            // 
+            this.label1.Image = global::EsPy.Properties.Resources.Warning;
+            this.label1.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
+            this.label1.Location = new System.Drawing.Point(12, 9);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(448, 25);
+            this.label1.TabIndex = 5;
+            this.label1.Text = "      Wolud you like to save the following items?";
+            this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+            // 
+            // FileSavesDialog
+            // 
+            this.AcceptButton = this.button1;
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.CancelButton = this.button3;
+            this.ClientSize = new System.Drawing.Size(472, 248);
+            this.Controls.Add(this.label1);
+            this.Controls.Add(this.listBox1);
+            this.Controls.Add(this.button3);
+            this.Controls.Add(this.button2);
+            this.Controls.Add(this.button1);
+            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
+            this.MaximizeBox = false;
+            this.MinimizeBox = false;
+            this.Name = "FileSavesDialog";
+            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+            this.Text = "Unsaved Files";
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+        private System.Windows.Forms.Button button1;
+        private System.Windows.Forms.Button button2;
+        private System.Windows.Forms.Button button3;
+        public System.Windows.Forms.ListBox listBox1;
+        private System.Windows.Forms.Label label1;
+    }
+}

+ 20 - 0
EsPy/Dialogs/FileSavesDialog.cs

@@ -0,0 +1,20 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace EsPy.Dialogs
+{
+    public partial class FileSavesDialog : Form
+    {
+        public FileSavesDialog()
+        {
+            InitializeComponent();
+        }
+    }
+}

+ 120 - 0
EsPy/Dialogs/FileSavesDialog.resx

@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>

+ 104 - 0
EsPy/Dialogs/InputDialog.Designer.cs

@@ -0,0 +1,104 @@
+namespace EsPy.Dialogs
+{
+    partial class InputDialog
+    {
+        /// <summary>
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary>
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Windows Form Designer generated code
+
+        /// <summary>
+        /// Required method for Designer support - do not modify
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.label1 = new System.Windows.Forms.Label();
+            this.textBox1 = new System.Windows.Forms.TextBox();
+            this.button1 = new System.Windows.Forms.Button();
+            this.button2 = new System.Windows.Forms.Button();
+            this.SuspendLayout();
+            // 
+            // label1
+            // 
+            this.label1.AutoSize = true;
+            this.label1.Location = new System.Drawing.Point(12, 9);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(35, 13);
+            this.label1.TabIndex = 0;
+            this.label1.Text = "label1";
+            // 
+            // textBox1
+            // 
+            this.textBox1.Location = new System.Drawing.Point(12, 25);
+            this.textBox1.Name = "textBox1";
+            this.textBox1.Size = new System.Drawing.Size(389, 20);
+            this.textBox1.TabIndex = 1;
+            this.textBox1.TextChanged += new System.EventHandler(this.textBox1_TextChanged);
+            // 
+            // button1
+            // 
+            this.button1.DialogResult = System.Windows.Forms.DialogResult.OK;
+            this.button1.Enabled = false;
+            this.button1.Location = new System.Drawing.Point(245, 51);
+            this.button1.Name = "button1";
+            this.button1.Size = new System.Drawing.Size(75, 23);
+            this.button1.TabIndex = 2;
+            this.button1.Text = "OK";
+            this.button1.UseVisualStyleBackColor = true;
+            // 
+            // button2
+            // 
+            this.button2.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+            this.button2.Location = new System.Drawing.Point(326, 51);
+            this.button2.Name = "button2";
+            this.button2.Size = new System.Drawing.Size(75, 23);
+            this.button2.TabIndex = 3;
+            this.button2.Text = "Cancel";
+            this.button2.UseVisualStyleBackColor = true;
+            // 
+            // InputDialog
+            // 
+            this.AcceptButton = this.button1;
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.CancelButton = this.button2;
+            this.ClientSize = new System.Drawing.Size(415, 84);
+            this.Controls.Add(this.button2);
+            this.Controls.Add(this.button1);
+            this.Controls.Add(this.textBox1);
+            this.Controls.Add(this.label1);
+            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
+            this.MaximizeBox = false;
+            this.MinimizeBox = false;
+            this.Name = "InputDialog";
+            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+            this.Text = "ImputDialog";
+            this.ResumeLayout(false);
+            this.PerformLayout();
+
+        }
+
+        #endregion
+
+        public System.Windows.Forms.Label label1;
+        public System.Windows.Forms.TextBox textBox1;
+        private System.Windows.Forms.Button button1;
+        private System.Windows.Forms.Button button2;
+    }
+}

+ 25 - 0
EsPy/Dialogs/InputDialog.cs

@@ -0,0 +1,25 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace EsPy.Dialogs
+{
+    public partial class InputDialog : Form
+    {
+        public InputDialog()
+        {
+            InitializeComponent();
+        }
+
+        private void textBox1_TextChanged(object sender, EventArgs e)
+        {
+            this.button1.Enabled = this.textBox1.Text.Length > 0;
+        }
+    }
+}

+ 120 - 0
EsPy/Dialogs/InputDialog.resx

@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>

+ 70 - 0
EsPy/Dialogs/ProgressDialog.Designer.cs

@@ -0,0 +1,70 @@
+namespace EsPy.Dialogs
+{
+    partial class ProgressDialog
+    {
+        /// <summary>
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary>
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+      
+
+        #region Windows Form Designer generated code
+
+        /// <summary>
+        /// Required method for Designer support - do not modify
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.progressBar1 = new System.Windows.Forms.ProgressBar();
+            this.label1 = new System.Windows.Forms.Label();
+            this.SuspendLayout();
+            // 
+            // progressBar1
+            // 
+            this.progressBar1.Location = new System.Drawing.Point(12, 26);
+            this.progressBar1.Name = "progressBar1";
+            this.progressBar1.Size = new System.Drawing.Size(311, 13);
+            this.progressBar1.TabIndex = 0;
+            // 
+            // label1
+            // 
+            this.label1.AutoSize = true;
+            this.label1.Location = new System.Drawing.Point(13, 7);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(35, 13);
+            this.label1.TabIndex = 1;
+            this.label1.Text = "label1";
+            // 
+            // ProgressDialog
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.ClientSize = new System.Drawing.Size(337, 51);
+            this.ControlBox = false;
+            this.Controls.Add(this.label1);
+            this.Controls.Add(this.progressBar1);
+            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow;
+            this.MaximizeBox = false;
+            this.MinimizeBox = false;
+            this.Name = "ProgressDialog";
+            this.ShowIcon = false;
+            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
+            this.Text = "Progress";
+            this.Shown += new System.EventHandler(this.ProgressDialog_Shown);
+            this.ResumeLayout(false);
+            this.PerformLayout();
+
+        }
+
+        #endregion
+
+        public System.Windows.Forms.ProgressBar progressBar1;
+        public System.Windows.Forms.Label label1;
+    }
+}

+ 122 - 0
EsPy/Dialogs/ProgressDialog.cs

@@ -0,0 +1,122 @@
+using EsPy.Units;
+using EsPy.Utility;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace EsPy.Dialogs
+{
+    public partial class ProgressDialog : Form, IDisposable
+    {
+        public enum Modes { Upload, Download};
+
+        public ProgressDialog()
+        {
+            InitializeComponent();
+        }
+
+        protected override void Dispose(bool disposing)
+        {
+            if (this.Port != null)
+                this.Port = null;
+
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        private Modes FMode = Modes.Upload;
+        public Modes Mode
+        { get { return this.FMode; }
+            set
+            {
+                this.FMode = value;
+                this.Text = value.ToString();
+            }
+        }
+
+        private string FFileName = "";
+        public string FileName
+        {
+            get { return this.FFileName; }
+            set
+            {
+                this.FFileName = value;
+                this.label1.Text = value;
+            }
+        }
+
+        public byte[] Buffer
+        { get; set; }
+
+        private PySerial FPort = null;
+        public PySerial Port
+        {
+            get { return this.FPort; }
+            set
+            {
+                if (this.FPort != null)
+                {
+                    this.FPort.FileProgress -= Port_FileProgress;
+                }
+
+                this.FPort = value;
+                if(this.FPort != null)
+                {
+                    this.FPort.FileProgress += Port_FileProgress;
+                }
+            }
+        }
+
+        private void Port_FileProgress(object sender, FileProgressEventArgs e)
+        {
+            this.label1.Text = e.FName + ": " + e.Bytes.ToString() + " / " + e.Size.ToString();
+            this.progressBar1.Maximum = e.Size;
+            if (e.Bytes > e.Size)
+                e.Bytes = e.Size;
+            this.progressBar1.Value = e.Bytes;
+            this.progressBar1.Invalidate();
+            Application.DoEvents();
+        }
+
+        private void ProgressDialog_Shown(object sender, EventArgs e)
+        {
+            ResultStatus res = null;
+            DialogResult dres = DialogResult.Abort;
+            try
+            {
+                if (this.Mode == Modes.Upload)
+                {
+                    res = this.Port.Upload(this.FileName, this.Buffer);
+                    if (res.Result == ResultStatus.Statuses.Success) ;
+                        dres = DialogResult.OK;
+                }
+                else
+                {
+                    res = this.Port.Download(this.FileName);
+                    if (res.Result == ResultStatus.Statuses.Success)
+                    {
+                        this.Buffer = res.Data as Byte[];
+                        dres = DialogResult.OK;
+                    }
+                }
+            }
+            catch (Exception ex)
+            {
+                Helpers.ErrorBox(ex);
+            }
+            finally
+            {
+                this.DialogResult = dres;
+            }
+        }
+    }
+}

+ 120 - 0
EsPy/Dialogs/ProgressDialog.resx

@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>

+ 265 - 0
EsPy/Dialogs/PyFileManager.Designer.cs

@@ -0,0 +1,265 @@
+namespace EsPy.Dialogs
+{
+    partial class PyFileManager
+    {
+        /// <summary>
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary>
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Windows Form Designer generated code
+
+        /// <summary>
+        /// Required method for Designer support - do not modify
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.components = new System.ComponentModel.Container();
+            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(PyFileManager));
+            this.label1 = new System.Windows.Forms.Label();
+            this.listView1 = new System.Windows.Forms.ListView();
+            this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+            this.columnHeader2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+            this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components);
+            this.downloadToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+            this.uploadToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+            this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripSeparator();
+            this.makeDirToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+            this.toolStripMenuItem2 = new System.Windows.Forms.ToolStripSeparator();
+            this.deleteToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+            this.imageList1 = new System.Windows.Forms.ImageList(this.components);
+            this.btnUpload = new System.Windows.Forms.Button();
+            this.btnClose = new System.Windows.Forms.Button();
+            this.btnDownload = new System.Windows.Forms.Button();
+            this.Path = new System.Windows.Forms.Label();
+            this.btnDelete = new System.Windows.Forms.Button();
+            this.btnMkDir = new System.Windows.Forms.Button();
+            this.btnRename = new System.Windows.Forms.Button();
+            this.contextMenuStrip1.SuspendLayout();
+            this.SuspendLayout();
+            // 
+            // label1
+            // 
+            this.label1.AutoSize = true;
+            this.label1.Location = new System.Drawing.Point(12, 9);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(32, 13);
+            this.label1.TabIndex = 0;
+            this.label1.Text = "Path:";
+            // 
+            // listView1
+            // 
+            this.listView1.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+            this.columnHeader1,
+            this.columnHeader2});
+            this.listView1.ContextMenuStrip = this.contextMenuStrip1;
+            this.listView1.FullRowSelect = true;
+            this.listView1.HideSelection = false;
+            this.listView1.Location = new System.Drawing.Point(12, 25);
+            this.listView1.Name = "listView1";
+            this.listView1.Size = new System.Drawing.Size(564, 230);
+            this.listView1.SmallImageList = this.imageList1;
+            this.listView1.TabIndex = 0;
+            this.listView1.UseCompatibleStateImageBehavior = false;
+            this.listView1.View = System.Windows.Forms.View.Details;
+            this.listView1.DoubleClick += new System.EventHandler(this.listView1_DoubleClick);
+            this.listView1.KeyDown += new System.Windows.Forms.KeyEventHandler(this.listView1_KeyDown);
+            // 
+            // columnHeader1
+            // 
+            this.columnHeader1.Text = "File Name";
+            this.columnHeader1.Width = 200;
+            // 
+            // columnHeader2
+            // 
+            this.columnHeader2.Text = "Size";
+            this.columnHeader2.Width = 80;
+            // 
+            // contextMenuStrip1
+            // 
+            this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.downloadToolStripMenuItem,
+            this.uploadToolStripMenuItem,
+            this.toolStripMenuItem1,
+            this.makeDirToolStripMenuItem,
+            this.toolStripMenuItem2,
+            this.deleteToolStripMenuItem});
+            this.contextMenuStrip1.Name = "contextMenuStrip1";
+            this.contextMenuStrip1.Size = new System.Drawing.Size(138, 104);
+            // 
+            // downloadToolStripMenuItem
+            // 
+            this.downloadToolStripMenuItem.Name = "downloadToolStripMenuItem";
+            this.downloadToolStripMenuItem.Size = new System.Drawing.Size(137, 22);
+            this.downloadToolStripMenuItem.Text = "Download...";
+            // 
+            // uploadToolStripMenuItem
+            // 
+            this.uploadToolStripMenuItem.Name = "uploadToolStripMenuItem";
+            this.uploadToolStripMenuItem.Size = new System.Drawing.Size(137, 22);
+            this.uploadToolStripMenuItem.Text = "Upload...";
+            // 
+            // toolStripMenuItem1
+            // 
+            this.toolStripMenuItem1.Name = "toolStripMenuItem1";
+            this.toolStripMenuItem1.Size = new System.Drawing.Size(134, 6);
+            // 
+            // makeDirToolStripMenuItem
+            // 
+            this.makeDirToolStripMenuItem.Name = "makeDirToolStripMenuItem";
+            this.makeDirToolStripMenuItem.Size = new System.Drawing.Size(137, 22);
+            this.makeDirToolStripMenuItem.Text = "Make Dir...";
+            // 
+            // toolStripMenuItem2
+            // 
+            this.toolStripMenuItem2.Name = "toolStripMenuItem2";
+            this.toolStripMenuItem2.Size = new System.Drawing.Size(134, 6);
+            // 
+            // deleteToolStripMenuItem
+            // 
+            this.deleteToolStripMenuItem.Name = "deleteToolStripMenuItem";
+            this.deleteToolStripMenuItem.Size = new System.Drawing.Size(137, 22);
+            this.deleteToolStripMenuItem.Text = "Delete...";
+            // 
+            // imageList1
+            // 
+            this.imageList1.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageList1.ImageStream")));
+            this.imageList1.TransparentColor = System.Drawing.Color.Transparent;
+            this.imageList1.Images.SetKeyName(0, "goprevious.png");
+            this.imageList1.Images.SetKeyName(1, "sdcard.png");
+            this.imageList1.Images.SetKeyName(2, "folder16.png");
+            this.imageList1.Images.SetKeyName(3, "file16.png");
+            // 
+            // btnUpload
+            // 
+            this.btnUpload.Location = new System.Drawing.Point(392, 261);
+            this.btnUpload.Name = "btnUpload";
+            this.btnUpload.Size = new System.Drawing.Size(89, 23);
+            this.btnUpload.TabIndex = 5;
+            this.btnUpload.Text = "Upload...";
+            this.btnUpload.UseVisualStyleBackColor = true;
+            this.btnUpload.Click += new System.EventHandler(this.btnUpload_Click);
+            // 
+            // btnClose
+            // 
+            this.btnClose.DialogResult = System.Windows.Forms.DialogResult.OK;
+            this.btnClose.Location = new System.Drawing.Point(487, 261);
+            this.btnClose.Name = "btnClose";
+            this.btnClose.Size = new System.Drawing.Size(89, 23);
+            this.btnClose.TabIndex = 6;
+            this.btnClose.Text = "Close";
+            this.btnClose.UseVisualStyleBackColor = true;
+            // 
+            // btnDownload
+            // 
+            this.btnDownload.Location = new System.Drawing.Point(297, 261);
+            this.btnDownload.Name = "btnDownload";
+            this.btnDownload.Size = new System.Drawing.Size(89, 22);
+            this.btnDownload.TabIndex = 4;
+            this.btnDownload.Text = "Download...";
+            this.btnDownload.UseVisualStyleBackColor = true;
+            this.btnDownload.Click += new System.EventHandler(this.btnDownload_Click);
+            // 
+            // Path
+            // 
+            this.Path.AutoSize = true;
+            this.Path.Location = new System.Drawing.Point(53, 9);
+            this.Path.Name = "Path";
+            this.Path.Size = new System.Drawing.Size(10, 13);
+            this.Path.TabIndex = 0;
+            this.Path.Text = ".";
+            // 
+            // btnDelete
+            // 
+            this.btnDelete.Location = new System.Drawing.Point(202, 261);
+            this.btnDelete.Name = "btnDelete";
+            this.btnDelete.Size = new System.Drawing.Size(89, 22);
+            this.btnDelete.TabIndex = 3;
+            this.btnDelete.Text = "Delete...";
+            this.btnDelete.UseVisualStyleBackColor = true;
+            this.btnDelete.Click += new System.EventHandler(this.btnDelete_Click);
+            // 
+            // btnMkDir
+            // 
+            this.btnMkDir.Location = new System.Drawing.Point(107, 261);
+            this.btnMkDir.Name = "btnMkDir";
+            this.btnMkDir.Size = new System.Drawing.Size(89, 23);
+            this.btnMkDir.TabIndex = 2;
+            this.btnMkDir.Text = "MkDir...";
+            this.btnMkDir.UseVisualStyleBackColor = true;
+            this.btnMkDir.Click += new System.EventHandler(this.bntMkDir_Click);
+            // 
+            // btnRename
+            // 
+            this.btnRename.Location = new System.Drawing.Point(12, 261);
+            this.btnRename.Name = "btnRename";
+            this.btnRename.Size = new System.Drawing.Size(89, 23);
+            this.btnRename.TabIndex = 1;
+            this.btnRename.Text = "Rename... ";
+            this.btnRename.UseVisualStyleBackColor = true;
+            this.btnRename.Click += new System.EventHandler(this.btnRename_Click);
+            // 
+            // PyFileManager
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.ClientSize = new System.Drawing.Size(587, 293);
+            this.Controls.Add(this.btnClose);
+            this.Controls.Add(this.btnRename);
+            this.Controls.Add(this.btnMkDir);
+            this.Controls.Add(this.btnDelete);
+            this.Controls.Add(this.btnUpload);
+            this.Controls.Add(this.btnDownload);
+            this.Controls.Add(this.listView1);
+            this.Controls.Add(this.Path);
+            this.Controls.Add(this.label1);
+            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
+            this.MaximizeBox = false;
+            this.MinimizeBox = false;
+            this.Name = "PyFileManager";
+            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+            this.Text = "File Manager";
+            this.Load += new System.EventHandler(this.PyFileManager_Load);
+            this.contextMenuStrip1.ResumeLayout(false);
+            this.ResumeLayout(false);
+            this.PerformLayout();
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.Label label1;
+        private System.Windows.Forms.ListView listView1;
+        private System.Windows.Forms.Button btnDownload;
+        private System.Windows.Forms.Button btnUpload;
+        private System.Windows.Forms.Button btnClose;
+        private System.Windows.Forms.ColumnHeader columnHeader1;
+        private System.Windows.Forms.ColumnHeader columnHeader2;
+        private System.Windows.Forms.ImageList imageList1;
+        private System.Windows.Forms.Label Path;
+        private System.Windows.Forms.ContextMenuStrip contextMenuStrip1;
+        private System.Windows.Forms.ToolStripMenuItem downloadToolStripMenuItem;
+        private System.Windows.Forms.ToolStripMenuItem uploadToolStripMenuItem;
+        private System.Windows.Forms.ToolStripSeparator toolStripMenuItem1;
+        private System.Windows.Forms.ToolStripMenuItem makeDirToolStripMenuItem;
+        private System.Windows.Forms.ToolStripSeparator toolStripMenuItem2;
+        private System.Windows.Forms.ToolStripMenuItem deleteToolStripMenuItem;
+        private System.Windows.Forms.Button btnDelete;
+        private System.Windows.Forms.Button btnMkDir;
+        private System.Windows.Forms.Button btnRename;
+    }
+}

+ 317 - 0
EsPy/Dialogs/PyFileManager.cs

@@ -0,0 +1,317 @@
+using EsPy.Units;
+using EsPy.Utility;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace EsPy.Dialogs
+{
+    public partial class PyFileManager : Form
+    {
+        public PyFileManager()
+        {
+            InitializeComponent();
+        }
+
+        public PySerial Port
+        { get; set; }
+   
+
+        private List<PyFile> Files = null;
+        private void Fill()
+        {
+            this.listView1.Items.Clear();
+
+            if (this.Port != null && this.Port.IsOpen)
+            {
+                
+                ListViewItem item = new ListViewItem();
+                ResultStatus cwd = this.Port.Cwd();
+                if (cwd.Result == ResultStatus.Statuses.Success)
+                {
+                    this.Path.Text = cwd.ToString().Replace("'", "");
+                    if (Path.Text == "")
+                        this.Path.Text = "/";
+                }
+                else
+                {
+                    Helpers.ErrorBox(cwd);
+                    return;
+                }
+
+                ResultStatus files = this.Port.Ls();
+
+                if (files.Result == ResultStatus.Statuses.Success)
+                {
+                    if (this.Path.Text != "/")
+                    {
+                        item.Text = "..";
+                        item.SubItems.Add("");
+                        item.ImageIndex = 0;
+                        listView1.Items.Add(item);
+
+                    }
+
+
+                    this.Files = files.Data as List<PyFile>;
+                    foreach (PyFile f in this.Files)
+                    {
+                        item = new ListViewItem();
+
+                        item.Text = f.FileName;
+                        
+                        if (f.IsDir)
+                        {
+                            item.ImageIndex = 2;
+                            item.SubItems.Add("Folder");
+                        }
+                        else if (f.IsFile)
+                        {
+                            item.ImageIndex = 3;
+                            item.SubItems.Add(f.FileSize.ToString());
+                        }
+
+                        this.listView1.Items.Add(item);
+                        item.Tag = f;
+                    }
+
+                    if (listView1.Items.Count > 0)
+                    {
+                        this.listView1.Items[0].Selected = true;
+                        this.listView1.Items[0].Focused = true;
+                    }
+                    //this.listView1.Columns[1].Width = -2;
+                    
+                }
+                else
+                {
+                    Helpers.ErrorBox(files);
+                }
+            }
+        }
+        
+      
+        private void PyFileManager_Load(object sender, EventArgs e)
+        {
+            this.Fill();
+        }
+
+        private void listView1_DoubleClick(object sender, EventArgs e)
+        {
+            if (this.listView1.SelectedItems != null && this.listView1.SelectedItems.Count > 0)
+            {
+                string path = "";
+                if (this.listView1.SelectedItems[0].Tag is PyFile)
+                {
+                    PyFile f = this.listView1.SelectedItems[0].Tag as PyFile;
+                    if (f.IsDir)
+                    {
+                        path = f.FileName;
+                    }
+                }
+                else
+                {
+                    path = this.listView1.SelectedItems[0].Text;
+                }
+
+                if (path != "")
+                {
+                    ResultStatus res = this.Port.Cd(path);
+                    if (res.Result == ResultStatus.Statuses.Error)
+                        Helpers.ErrorBox(res);
+                    else
+                        this.Fill();
+                }
+
+            }
+        }
+
+        private void bntMkDir_Click(object sender, EventArgs e)
+        {
+            InputDialog d = new InputDialog();
+            d.Text = "MkDir";
+            d.label1.Text = "Directory name:";
+            if (d.ShowDialog() == DialogResult.OK)
+            {
+                ResultStatus res = this.Port.MkDir(d.textBox1.Text);
+                if (res.Result == ResultStatus.Statuses.Error)
+                    Helpers.ErrorBox(res);
+                else
+                    this.Fill();
+            }
+            d.Dispose();
+        }
+
+        private void btnRename_Click(object sender, EventArgs e)
+        {
+            if (this.listView1.SelectedItems.Count > 0)
+            {
+                PyFile f = this.listView1.SelectedItems[0].Tag as PyFile;
+                if (f != null)
+                {
+                    int i = this.listView1.SelectedItems[0].Index;
+                    InputDialog d = new InputDialog();
+                    d.Text = "Rename";
+                    d.label1.Text = "New name:";
+                    if (d.ShowDialog() == DialogResult.OK)
+                    {
+                        ResultStatus res = this.Port.Rename(f.FileName, d.textBox1.Text);
+                        if (res.Result == ResultStatus.Statuses.Error)
+                           Helpers.ErrorBox(res);
+                        else
+                        {
+                            this.Fill();
+
+                            foreach (ListViewItem item in this.listView1.Items)
+                            {
+                                item.Selected = (item.Tag is PyFile && (item.Tag as PyFile).FileName == d.textBox1.Text);
+                            }
+                        }
+                    }
+                    d.Dispose();
+                }
+            }
+        }
+
+        private void btnDelete_Click(object sender, EventArgs e)
+        {
+            if (this.listView1.SelectedItems.Count > 0)
+            {
+                PyFile f = this.listView1.SelectedItems[0].Tag as PyFile;
+                if (f != null)
+                {
+                    ResultStatus res = null;
+                    if (MessageBox.Show("Are you sure?", "Delete",MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
+                    {
+                        if (f.IsDir)
+                        {
+                            res = this.Port.RmDir(f.FileName);
+                        }
+                        else if (f.IsFile)
+                        {
+                            res = this.Port.Remove(f.FileName);
+                        }
+                        else
+                        {
+                            MessageBox.Show("Unknow type!");
+                            return;
+                        }
+                        if (res.Result == ResultStatus.Statuses.Success)
+                        {
+                            this.Fill();
+                        }
+                        else
+                        {
+                            Helpers.ErrorBox(res);
+                        }
+                    }
+                    
+                }
+            }
+        }
+
+        //ProgressDialog ProgressDialog = null;
+        //private void Port_FileProgress(object sender, FileProgressEventArgs e)
+        //{
+        //    this.ProgressDialog.label1.Text = e.FName + ": " + e.Bytes.ToString() + " / " + e.Size.ToString();
+        //    this.ProgressDialog.progressBar1.Maximum = e.Size;
+        //    this.ProgressDialog.progressBar1.Value = e.Bytes;
+        //    Application.DoEvents();
+        //}
+
+        //private void Port_BeginFileProgress(object sender, FileProgressEventArgs e)
+        //{
+        //    if (ProgressDialog == null)
+        //        this.ProgressDialog = new ProgressDialog();
+        //    this.Port_FileProgress(sender, e);
+        //    this.ProgressDialog.Show();
+        //    Application.DoEvents();
+        //}   
+
+        //private void Port_EndFileProgress(object sender, FileProgressEventArgs e)
+        //{
+        //    Application.DoEvents();
+        //    this.ProgressDialog.Dispose();
+        //    this.ProgressDialog = null;
+        //}
+
+        private void btnUpload_Click(object sender, EventArgs e)
+        {
+            OpenFileDialog d = new OpenFileDialog();
+            if (d.ShowDialog() == DialogResult.OK)
+            {
+               try
+                {
+                    byte[] buff = File.ReadAllBytes(d.FileName);
+
+                    ProgressDialog p = new ProgressDialog();
+                    p.Port = this.Port;
+                    p.Mode = ProgressDialog.Modes.Upload;
+                    p.FileName = System.IO.Path.GetFileName(d.FileName);
+                    p.Buffer = buff;
+                    if(p.ShowDialog() == DialogResult.OK)
+                        this.Fill();
+                    p.Dispose();
+                }
+                catch (Exception ex)
+                {
+                    Helpers.ErrorBox(ex);
+                }
+            }
+        }
+
+        private void btnDownload_Click(object sender, EventArgs e)
+        {
+            if (this.listView1.SelectedItems != null && this.listView1.SelectedItems.Count > 0)
+            {
+                if (this.listView1.SelectedItems[0].Tag is PyFile)
+                {
+                    PyFile f = this.listView1.SelectedItems[0].Tag as PyFile;
+                    if (f.IsFile)
+                    {
+                        ProgressDialog p = new ProgressDialog();
+                        p.Port = this.Port;
+                        p.Mode = ProgressDialog.Modes.Download;
+                        p.FileName = System.IO.Path.GetFileName(f.FileName);
+
+                        if (p.ShowDialog() == DialogResult.OK)
+                        {
+                            SaveFileDialog d = new SaveFileDialog();
+                            d.FileName = f.FileName;                         
+                            if (d.ShowDialog() == DialogResult.OK)
+                            {
+                                try
+                                {
+                                    File.WriteAllBytes(d.FileName, p.Buffer);
+                                }
+                                catch (Exception ex)
+                                {
+                                    Helpers.ErrorBox(ex);
+                                }
+                                d.Dispose();
+                            }
+                            p.Dispose();
+                        }
+                    }
+                }
+            }
+        }
+
+        private void listView1_KeyDown(object sender, KeyEventArgs e)
+        {
+            if (e.KeyCode == Keys.Enter)
+            {
+                this.listView1_DoubleClick(this, null);
+                e.Handled = true;
+            }
+        }
+    }
+}

+ 205 - 0
EsPy/Dialogs/PyFileManager.resx

@@ -0,0 +1,205 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="contextMenuStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>127, 17</value>
+  </metadata>
+  <metadata name="imageList1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+  <data name="imageList1.ImageStream" mimetype="application/x-microsoft.net.object.binary.base64">
+    <value>
+        AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
+        LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
+        ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADu
+        DwAAAk1TRnQBSQFMAgEBBAEAATABAAEwAQABEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA
+        AwABIAMAAQEBAAEgBgABIP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8AYgADBwEJAxABFgMT
+        ARoDEwEaAxMBGgMTARoDEwEaAxMBGgMTARoDEwEaAxMBGgMTARoDEwEaAxMBGgMQARYDBwEJAVgCWwG8
+        AWIBkQGlAe8BYgGRAaUB7wFiAZEBpQHvAWIBkQGlAe8BYgGRAaUB7wFiAZEBpQHvAWIBkQGlAe8BYgGR
+        AaUB7wFiAZEBpQHvAWIBkQGlAe8BYgGRAaUB7wFiAZEBpQHvAWIBkQGlAe8BYgGRAaUB7wFXAloBtwgA
+        AxoBJANQAZ8DUgGoA1IBqANSAagDUgGoA1IBqANSAagDUgGoA1IBqANQAZ0DGAEhSAADDQESAx8BLANU
+        AbkDQQHnA0EB5wNBAecDQQHnA0EB5wNBAecDQQHnA0EB5wNBAecDQQHnA1QBuQMfASwDDQESAVwBrgHR
+        AfgBYAHMAv8BYAHMAv8BYAHMAv8BYAHMAv8BYAHMAv8BYAHMAv8BYAHMAv8BYAHMAv8BYAHMAv8BYAHM
+        Av8BYAHMAv8BYAHMAv8BYAHMAv8BYAHMAv8BWgGgAb4B9QgAA1ABowMSARkgAAMUARwDUAGdHAADBgEI
+        AwoEDQESASIBggFRAfcDDQESAwsBDwMHAQkDAAEBFAADUAHbA14B/wNZAf8DWQH/A1kB/wNZAf8DWQH/
+        A1kB/wNZAf8DWQH/A14B/wNQAdsIAAFgAcwC/wFgAcwC/wFgAcwC/wFgAcwC/wFgAcwC/wFgAcwC/wFg
+        AcwC/wFgAcwC/wFgAcwC/wFgAcwC/wFgAcwC/wFgAcwC/wFgAcwC/wFgAcwC/wFgAcwC/wFgAbsB3wH8
+        CAADUwGsKAADUgGoFAADBAEGAwsBDwMSARgDKQE+AUQBpQF0AfoBhQHlAbUB/wMbASYDGAEiAxQBGwMO
+        ARMDBwEKEAADVQHOA1wB/wLQAcQB/wLzAeQB/wLzAeQB/wLzAeQB/wLzAeQB/wLzAeQB/wLzAeQB/wLQ
+        AcQB/wNcAf8DVQHOCAABYAHMAv8BYAHMAv8BYAHMAv8BYAHMAv8BYAHMAv8BYAHMAv8BYAHMAv8BYAHM
+        Av8BYAHMAv8BYAHMAv8BYAHMAv8BYAHMAv8BYAHMAv8BYAHMAv8BYAHMAv8BYAG7Ad8B/AgAA1MBrAQA
+        AyABLwNTAawDUwGsA1MBrANTAawDUwGsA1MBrAMfASwEAANSAagQAAMCAQMDCgEOAxIBGQFDAUoBRgGE
+        AWcByQGYAf8BEwHEAWkB/wGFAeQBtAH/AyYBOgMiATIDHAEoAxUBHQMOARMDBgEIDAADVgHJA14B/wL1
+        AeYB/wLqAdwB/wLqAdwB/wLqAdwB/wLqAdwB/wLqAdwB/wLqAdwB/wL1AeYB/wNeAf8DVgHJCAABYAHM
+        Av8BYAHMAv8BYAHMAv8BYAHMAv8BYAHMAv8BYAHMAv8BYAHMAv8BYAHMAv8BYAHMAv8BYAHMAv8BYAHM
+        Av8BYAHMAv8BYAHMAv8BYAHMAv8BYAHMAv8BYAG7Ad8B/AgAA1MBrCgAA1IBqBAAAwMBBAMLAQ8BMgFn
+        AU0B1QF1Ac4BogH/AQoBtAFeAf8BDQG8AWMB/wGDAd8BsQH/AYMB3QGwAf8BggHZAa0B/wGAAdUBqgH/
+        AX0BzwGmAf8BAgFxATgB/wMHAQkMAAM7AWMDUgHjAvcB6wH/Au0B4gH/Au0B4gH/Au0B4gH/Au0B4gH/
+        Au0B4gH/Au0B4gH/AvcB6wH/A2EB/wNWAcUIAAFgAcwC/wFgAcwC/wFgAcwC/wFgAcwC/wFgAcwC/wFg
+        AcwC/wFgAcwC/wFgAcwC/wFgAcwC/wFgAcwC/wFgAcwC/wFgAcwC/wFgAcwC/wFgAcwC/wFgAcwC/wFg
+        AbsB3wH8CAADUwGsBAADEQEXAzQBVAM0AVQDNAFUAzQBVAM0AVQDNAFUAxABFQQAA1IBqBQAARYBcQFC
+        AfUBXQHAAY8B/wEGAaUBVAH/AQkBrgFaAf8BCgG0AV4B/wELAbcBYAH/AQsBtQFfAf8BCQGvAVsB/wEH
+        AacBVQH/AQQBngFPAf8BAgFxATgB/wMCAQMQAANVAcEC+QHvAf8C8QHoAf8C8QHoAf8C8QHoAf8C8QHo
+        Af8C8QHoAf8C8QHoAf8C+QHvAf8DZQH/A1UBwQgAAWABzAL/AWABzAL/AWABzAL/AWABzAL/AWABzAL/
+        AWABzAL/AWABzAL/AWABzAL/AWABzAL/AWABzAL/AWABzAL/AWABzAL/AWABzAL/AWABzAL/AWABzAL/
+        AWABuwHfAfwIAANTAawEAAMSARkDNQFYAzUBWAM1AVgDNQFYAzUBWAM1AVgDEQEXBAADUgGoEAABMwGL
+        AVoB9wFiAcABkQH/AUkBtQF9Af8BSwG6AYQB/wFLAb8BhgH/ASYBtQFsAf8BCQGuAVkB/wEIAawBWAH/
+        AQcBqAFVAf8BBQGhAVEB/wEMAZ0BUgH/AQIBcQE4Af8UAANWAb4C+wH0Af8C9QHvAf8C9QHvAf8C9QHv
+        Af8C9QHvAf8C9QHvAf8C9QHvAf8C+wH0Af8DaAH/A1YBvggAAWABzAL/AWABzAL/AWABzAL/AWABzAL/
+        AWABzAL/AWABzAL/AWABzAL/AWABzAL/AWABzAL/AWABzAL/AWABzAL/AWABzAL/AWABzAL/AWABzAL/
+        AWABzAL/AWABuwHfAfwIAANTAawoAANSAagQAAE7AT4BPAFoAYwBywGrAf8BWQG8AYsB/wFYAbwBigH/
+        AVgBvwGMAf8BVgHAAYwB/wFRAb8BiAH/AUkBvAGDAf8BQgG3AXsB/wE4Aa8BcQH/AS8BqwFrAf8BCgFy
+        ATwB+hQAA1YBuwL9AfgB/wL5AfUB/wL5AfUB/wL5AfUB/wL5AfUB/wL5AfUB/wL5AfUB/wL9AfgB/wNX
+        Ad0DOAFeCAABYAHMAv8BYAHMAv8BYAHMAv8BYAHMAv8BYAHMAv8BYAHMAv8BYAHMAv8BYAHMAv8BYAHM
+        Av8BYAHMAv8BYAHMAv8BYAHMAv8BYAHMAv8BYAHMAv8BYAHMAv8BYAG7Ad8B/AgAA1MBrAQAAyABLgNS
+        AagDUgGoA1IBqANSAagDUgGoA1IBqAMeASsEAANSAagUAAMYASIBZgGtAYgB+gF0AccBngH/AWUBwQGT
+        Af8BYAG/AZAB/wFZAb0BjAH/AVEBuQGGAf8BSQG1AX0B/wE/AbEBdgH/ATUBrQFvAf8BEAFuAT0B9xQA
+        A1YBuAL+AfwB/wL8AfoB/wL8AfoB/wL8AfoB/wL8AfoB/wL8AfoB/wL8AfoB/wL+AfwB/wNWAbgMAAFg
+        AcwC/wFgAcwC/wFgAcwC/wFgAcwC/wFgAcwC/wFgAcwC/wFgAcwC/wFgAcwC/wFgAcwC/wFgAcwC/wFg
+        AcwC/wFgAcwC/wFgAcwC/wFgAcwC/wFgAcwC/wFgAbsB3wH8CAADUwGsKAADUgGoGAADAQECATcBiwFi
+        AfcBlQHUAbQB/wFqAcMBlwH/AaoB3AHDAf8BAgFxATgB/wECAXEBOAH/AQIBcQE4Af8BAgFxATgB/wEC
+        AXEBOAH/EAADNwFbA1kB2gLgAd8D/wH+A/8B/gP/Af4D/wH+A/8B/gP/Af4B/wLgAd8B/wNZAdoDNwFb
+        CAABYAHMAv8BYAHMAv8BYAHMAv8BYAHMAv8BYAHMAv8BYAHMAv8BYAHMAv8BYAHMAv8BYAHMAv8BYAHM
+        Av8BYAHMAv8BYAHMAv8BYAHMAv8BYAHMAv8BYAHMAv8BWgG9AesB/QgAA1MBrCgAA1IBqCAAASABcwFI
+        Ae4BpwHbAcEB/wGrAd0BxAH/JAADVAGyA3YB/wNtAf8DbQH/A20B/wNtAf8DbQH/A20B/wNtAf8DbQH/
+        A4QB/wNUAbIIAAFfAcoB/AH/AWABzAL/AWABzAL/AWABzAL/AWABzAL/AWABzAL/AWABzAL/AWABzAL/
+        AWABzAL/AWABzAL/AWABzAL/AWABzAL/AWABzAL/AWABzAL/AWABzAL/AWUBvAHuAf4IAANTAawYAAMR
+        ARcDNAFUAzQBVAM0AVQDUgGoJAABQgFeAVABtAGsAdwBwwH/JAADUwGwA3gB/wNvAf8DbwH/A28B/wNv
+        Af8DbwH/A28B/wNvAf8DhgH/A1MBsAM1AVgIAAFYAb4B7QH/AXYB0gH9Af8BgwHWAv8BgwHWAv8BgwHW
+        Av8BgwHWAv8BgwHWAv8BgwHWAv8BgwHWAv8BgwHWAv8BgwHWAv8BgwHWAv8BgwHWAv8BgwHWAv8BdgHS
+        Af0B/wFeAa8B3wH+CAADUwGsGAADNQFYA0sBkAM3AVoDUAHXAzEBTygAATQBNgE1AVYkAANTAa4DhAH/
+        A3kB/wN5Af8DeQH/A3kB/wN5Af8DeQH/A4gB/wNTAa4DNQFYDAABTAGjAcwB/wHLAeQB8AH/AeoB9AH5
+        Af8B6gH0AfkB/wHqAfQB+QH/AeoB9AH5Af8B6gH0AfkB/wHqAfQB+QH/AeoB9AH5Af8B6gH0AfkB/wHq
+        AfQB+QH/AeoB9AH5Af8B6gH0AfkB/wHqAfQB+QH/AckB4gHvAf8BVgGGAaEB9QgAA1MBrBgAAzUBWAM1
+        AVYDTgGZAzMBUlQAA0YBgQNTAawDUwGsA1MBrANTAawDUwGsA1MBrANTAawDUwGsAzUBVhAAAUYBkQG7
+        AfwBTAGjAcwB/wFPAaQBzQH/AU8BpAHNAf8BTwGkAc0B/wFJAZIBuwH8AVgBfwGRAe8BWAF/AZEB7wFY
+        AX8BkQHvAVgBfwGRAe8BWAF/AZEB7wFYAX8BkQHvAVgBfwGRAe8BWAF/AZEB7wFYAX8BkQHvAVUBWQFa
+        AboIAANQAaMDEgEYFAADNQFYA1EB1QMzAVKQAAFZAV8BYgHJAUwBowHMAf8BTAGjAcwB/wFMAaMBzAH/
+        AUwBowHMAf8BWQFeAWEBxzAAAxsBJgNQAaMDUwGsA1MBrANTAawDUwGsA1MBrANTAawDMQFPFAABQgFN
+        AT4HAAE+AwABKAMAAUADAAEgAwABAQEAAQEGAAEBFgAD/4EAAv8EAAHAAQMC/wQAAc8B8wH4AQcBwAED
+        AgAB3wH7AeABAwHAAQMCAAHQAQsBwAEBAcABAwIAAd8B+wHAAQEBwAEDAgAB0AELAeABAQHgAQMCAAHQ
+        AQsBwAEDAeABAwIAAd8B+wHAAQMB4AEDAgAB0AELAeABAwHgAQcCAAHfAfsB8AEDAcABAwIAAd8B+wH8
+        AX8BwAEDAgAB3wGDAf4BfwHAAQMCAAHfAYMB/wF/AcABBwIAAd8BhwL/AcABDwIAAc8BjwT/AQMB/wHA
+        AR8L
+</value>
+  </data>
+  <metadata name="$this.TrayHeight" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>53</value>
+  </metadata>
+</root>

+ 127 - 0
EsPy/Dialogs/SettingsDialog.Designer.cs

@@ -0,0 +1,127 @@
+namespace EsPy.Dialogs
+{
+    partial class SettingsDialog
+    {
+        /// <summary>
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary>
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Windows Form Designer generated code
+
+        /// <summary>
+        /// Required method for Designer support - do not modify
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.label1 = new System.Windows.Forms.Label();
+            this.tbPythonPath = new System.Windows.Forms.TextBox();
+            this.btnPythonPath = new System.Windows.Forms.Button();
+            this.button2 = new System.Windows.Forms.Button();
+            this.button3 = new System.Windows.Forms.Button();
+            this.ShowServer = new System.Windows.Forms.CheckBox();
+            this.SuspendLayout();
+            // 
+            // label1
+            // 
+            this.label1.AutoSize = true;
+            this.label1.Location = new System.Drawing.Point(13, 13);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(43, 13);
+            this.label1.TabIndex = 0;
+            this.label1.Text = "Python:";
+            // 
+            // tbPythonPath
+            // 
+            this.tbPythonPath.Location = new System.Drawing.Point(16, 30);
+            this.tbPythonPath.Name = "tbPythonPath";
+            this.tbPythonPath.Size = new System.Drawing.Size(503, 20);
+            this.tbPythonPath.TabIndex = 0;
+            // 
+            // btnPythonPath
+            // 
+            this.btnPythonPath.Location = new System.Drawing.Point(525, 28);
+            this.btnPythonPath.Name = "btnPythonPath";
+            this.btnPythonPath.Size = new System.Drawing.Size(25, 23);
+            this.btnPythonPath.TabIndex = 1;
+            this.btnPythonPath.Text = "...";
+            this.btnPythonPath.UseVisualStyleBackColor = true;
+            this.btnPythonPath.Click += new System.EventHandler(this.btnPythonPath_Click);
+            // 
+            // button2
+            // 
+            this.button2.Location = new System.Drawing.Point(393, 227);
+            this.button2.Name = "button2";
+            this.button2.Size = new System.Drawing.Size(75, 23);
+            this.button2.TabIndex = 3;
+            this.button2.Text = "OK";
+            this.button2.UseVisualStyleBackColor = true;
+            this.button2.Click += new System.EventHandler(this.btnOK_Click);
+            // 
+            // button3
+            // 
+            this.button3.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+            this.button3.Location = new System.Drawing.Point(475, 227);
+            this.button3.Name = "button3";
+            this.button3.Size = new System.Drawing.Size(75, 23);
+            this.button3.TabIndex = 4;
+            this.button3.Text = "Cancel";
+            this.button3.UseVisualStyleBackColor = true;
+            // 
+            // ShowServer
+            // 
+            this.ShowServer.AutoSize = true;
+            this.ShowServer.Location = new System.Drawing.Point(16, 184);
+            this.ShowServer.Name = "ShowServer";
+            this.ShowServer.Size = new System.Drawing.Size(186, 17);
+            this.ShowServer.TabIndex = 2;
+            this.ShowServer.Text = "Show Py Server (Restart required)";
+            this.ShowServer.UseVisualStyleBackColor = true;
+            // 
+            // SettingsDialog
+            // 
+            this.AcceptButton = this.button2;
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.ClientSize = new System.Drawing.Size(562, 262);
+            this.Controls.Add(this.ShowServer);
+            this.Controls.Add(this.button3);
+            this.Controls.Add(this.button2);
+            this.Controls.Add(this.btnPythonPath);
+            this.Controls.Add(this.tbPythonPath);
+            this.Controls.Add(this.label1);
+            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
+            this.MaximizeBox = false;
+            this.MinimizeBox = false;
+            this.Name = "SettingsDialog";
+            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+            this.Text = "Settings";
+            this.ResumeLayout(false);
+            this.PerformLayout();
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.Label label1;
+        private System.Windows.Forms.TextBox tbPythonPath;
+        private System.Windows.Forms.Button btnPythonPath;
+        private System.Windows.Forms.Button button2;
+        private System.Windows.Forms.Button button3;
+        private System.Windows.Forms.CheckBox ShowServer;
+    }
+}

+ 50 - 0
EsPy/Dialogs/SettingsDialog.cs

@@ -0,0 +1,50 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Diagnostics;
+using System.Drawing;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace EsPy.Dialogs
+{
+    public partial class SettingsDialog : Form
+    {
+        public SettingsDialog()
+        {
+            InitializeComponent();
+            this.tbPythonPath.Text = Properties.Settings.Default.PythonExe;
+            this.ShowServer.Checked = Properties.Settings.Default.ShowPyServer;
+        }
+
+        private void btnPythonPath_Click(object sender, EventArgs e)
+        {
+            OpenFileDialog d = new OpenFileDialog();
+            d.Filter = "python.exe|python.exe";
+            if (d.ShowDialog() == DialogResult.OK)
+            {
+                this.tbPythonPath.Text = d.FileName;
+            }
+        }
+
+        private void btnOK_Click(object sender, EventArgs e)
+        {
+            Properties.Settings.Default.PythonExe = tbPythonPath.Text;
+            Properties.Settings.Default.ShowPyServer = this.ShowServer.Checked;
+            this.DialogResult = DialogResult.OK;
+        }
+
+        private void button1_Click(object sender, EventArgs e)
+        {
+            string bat = Path.Combine(Application.StartupPath, "pip.bat");
+            if (File.Exists(bat))
+            {
+                Process.Start(bat);
+            }
+        }
+    }
+}

+ 120 - 0
EsPy/Dialogs/SettingsDialog.resx

@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>

+ 473 - 0
EsPy/EsPy.csproj

@@ -0,0 +1,473 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProjectGuid>{F7FBC30C-9014-4169-AC86-4883087EC672}</ProjectGuid>
+    <OutputType>WinExe</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>EsPy</RootNamespace>
+    <AssemblyName>EsPy</AssemblyName>
+    <TargetFrameworkVersion>v4.6</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
+    <TargetFrameworkProfile />
+    <NuGetPackageImportStamp>
+    </NuGetPackageImportStamp>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <PlatformTarget>x86</PlatformTarget>
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\x64\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>true</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
+    <OutputPath>bin\x64\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>true</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\x86\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>true</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
+    <OutputPath>bin\x86\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>true</Prefer32Bit>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="Newtonsoft.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
+      <HintPath>..\packages\Newtonsoft.Json.9.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
+      <Private>True</Private>
+    </Reference>
+    <Reference Include="ScintillaNET, Version=3.5.10.0, Culture=neutral, processorArchitecture=MSIL">
+      <HintPath>..\packages\jacobslusser.ScintillaNET.3.5.10\lib\net40\ScintillaNET.dll</HintPath>
+      <Private>True</Private>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="Microsoft.CSharp" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Deployment" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Net.Http" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml" />
+    <Reference Include="WeifenLuo.WinFormsUI.Docking, Version=2.11.0.0, Culture=neutral, PublicKeyToken=5cded1a1a0a7b481, processorArchitecture=MSIL">
+      <HintPath>..\packages\DockPanelSuite.2.11.0-beta2\lib\net40\WeifenLuo.WinFormsUI.Docking.dll</HintPath>
+      <Private>True</Private>
+    </Reference>
+    <Reference Include="WeifenLuo.WinFormsUI.Docking.ThemeVS2015, Version=2.11.0.0, Culture=neutral, PublicKeyToken=5cded1a1a0a7b481, processorArchitecture=MSIL">
+      <HintPath>..\packages\DockPanelSuite.ThemeVS2015.2.11.0-beta2\lib\net40\WeifenLuo.WinFormsUI.Docking.ThemeVS2015.dll</HintPath>
+      <Private>True</Private>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Components\CompletionForm.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Components\CompletionForm.Designer.cs">
+      <DependentUpon>CompletionForm.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Components\ExListBox.cs">
+      <SubType>Component</SubType>
+    </Compile>
+    <Compile Include="Components\ExScintilla.cs">
+      <SubType>Component</SubType>
+    </Compile>
+    <Compile Include="Components\Terminal.cs">
+      <SubType>Component</SubType>
+    </Compile>
+    <Compile Include="Dialogs\EspToolDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Dialogs\EspToolDialog.Designer.cs">
+      <DependentUpon>EspToolDialog.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Dialogs\FileSavesDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Dialogs\FileSavesDialog.Designer.cs">
+      <DependentUpon>FileSavesDialog.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Dialogs\InputDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Dialogs\InputDialog.Designer.cs">
+      <DependentUpon>InputDialog.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Dialogs\ProgressDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Dialogs\ProgressDialog.Designer.cs">
+      <DependentUpon>ProgressDialog.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Dialogs\PyFileManager.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Dialogs\PyFileManager.Designer.cs">
+      <DependentUpon>PyFileManager.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Dialogs\SettingsDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Dialogs\SettingsDialog.Designer.cs">
+      <DependentUpon>SettingsDialog.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Forms\EditorForm.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Forms\EditorForm.Designer.cs">
+      <DependentUpon>EditorForm.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Forms\ErrorListForm.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Forms\ErrorListForm.Designer.cs">
+      <DependentUpon>ErrorListForm.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Forms\IDeviceChange.cs" />
+    <Compile Include="Forms\IDocument.cs" />
+    <Compile Include="Forms\IForm.cs" />
+    <Compile Include="Forms\Splash.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Forms\Splash.Designer.cs">
+      <DependentUpon>Splash.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Forms\TerminalForm.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Forms\TerminalForm.Designer.cs">
+      <DependentUpon>TerminalForm.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Globals.cs" />
+    <Compile Include="MainForm.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="MainForm.Designer.cs">
+      <DependentUpon>MainForm.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Program.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="Python\Jedi\BaseDefinition.cs" />
+    <Compile Include="Python\Jedi\Completion.cs" />
+    <Compile Include="Python\Jedi\CompletionRequest.cs" />
+    <Compile Include="Python\Jedi\Request.cs" />
+    <Compile Include="Python\Jedi\Script.cs" />
+    <Compile Include="Python\PyClient.cs" />
+    <Compile Include="Python\PyRequest.cs" />
+    <Compile Include="Units\IPort.cs" />
+    <Compile Include="Units\PySerial.cs" />
+    <Compile Include="Units\PySerialEvents.cs" />
+    <Compile Include="Units\ResultStatus.cs" />
+    <Compile Include="Units\PyFile.cs" />
+    <Compile Include="Units\SerialPort.cs" />
+    <Compile Include="Utility\BinaryString.cs" />
+    <Compile Include="Utility\FileFormat.cs" />
+    <Compile Include="Utility\FileFormats.cs" />
+    <Compile Include="Utility\Helpers.cs" />
+    <Compile Include="Utility\Py.cs" />
+    <Compile Include="Utility\TextHelper.cs" />
+    <None Include="pip.bat">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Resources\error16.png" />
+    <None Include="Resources\info.png" />
+    <None Include="Resources\compile.png" />
+    <None Include="Resources\kservices.png" />
+    <None Include="Resources\syntax.png" />
+    <Content Include="Lib\apa102.py">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <Content Include="Lib\dht.py">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <Content Include="Lib\ds18x20.py">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <Content Include="Lib\flashbdev.py" />
+    <Content Include="Lib\inisetup.py" />
+    <Content Include="Lib\machine.py">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <Content Include="Lib\neopixel.py" />
+    <Content Include="Lib\ntptime.py" />
+    <Content Include="Lib\onewire.py">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <Content Include="Lib\port_diag.py" />
+    <Content Include="Lib\upip.py" />
+    <Content Include="Lib\upip_utarfile.py" />
+    <Content Include="Lib\webrepl.py" />
+    <Content Include="Lib\webrepl_setup.py" />
+    <Content Include="Lib\websocket_helper.py" />
+    <Content Include="Scripts\PyHost.py">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <EmbeddedResource Include="Components\CompletionForm.resx">
+      <DependentUpon>CompletionForm.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Components\ExListBox.resx">
+      <DependentUpon>ExListBox.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Components\ExScintilla.resx">
+      <DependentUpon>ExScintilla.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Components\Terminal.resx">
+      <DependentUpon>Terminal.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Dialogs\EspToolDialog.resx">
+      <DependentUpon>EspToolDialog.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Dialogs\FileSavesDialog.resx">
+      <DependentUpon>FileSavesDialog.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Dialogs\InputDialog.resx">
+      <DependentUpon>InputDialog.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Dialogs\ProgressDialog.resx">
+      <DependentUpon>ProgressDialog.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Dialogs\PyFileManager.resx">
+      <DependentUpon>PyFileManager.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Dialogs\SettingsDialog.resx">
+      <DependentUpon>SettingsDialog.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Forms\EditorForm.resx">
+      <DependentUpon>EditorForm.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Forms\ErrorListForm.resx">
+      <DependentUpon>ErrorListForm.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Forms\Splash.resx">
+      <DependentUpon>Splash.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Forms\TerminalForm.resx">
+      <DependentUpon>TerminalForm.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="MainForm.resx">
+      <DependentUpon>MainForm.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Properties\Resources.resx">
+      <Generator>ResXFileCodeGenerator</Generator>
+      <LastGenOutput>Resources.Designer.cs</LastGenOutput>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <Compile Include="Properties\Resources.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DependentUpon>Resources.resx</DependentUpon>
+      <DesignTime>True</DesignTime>
+    </Compile>
+    <None Include="packages.config">
+      <SubType>Designer</SubType>
+    </None>
+    <None Include="Properties\Settings.settings">
+      <Generator>SettingsSingleFileGenerator</Generator>
+      <LastGenOutput>Settings.Designer.cs</LastGenOutput>
+    </None>
+    <Compile Include="Properties\Settings.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DependentUpon>Settings.settings</DependentUpon>
+      <DesignTimeSharedInput>True</DesignTimeSharedInput>
+    </Compile>
+    <Content Include="Helps\images\esptool.png" />
+    <Content Include="Helps\images\espy.png" />
+    <Content Include="Helps\images\filemanager.png" />
+    <None Include="Resources\cpu.png" />
+    <None Include="Resources\splash.png" />
+    <None Include="Resources\Warning.png" />
+    <Content Include="Conf\scilang.xml">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
+    <Content Include="Conf\scistyles.xml">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+      <SubType>Designer</SubType>
+    </Content>
+    <Content Include="Helps\help.html">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
+    <None Include="Resources\drivecd.png" />
+    <None Include="Resources\drivenetwork.png" />
+    <None Include="Resources\harddisk.png" />
+    <None Include="Resources\hdd.png" />
+    <None Include="Resources\sdcard.png" />
+    <None Include="Resources\USB.png" />
+    <None Include="Resources\filemanager.png" />
+    <Content Include="Tools\webrepl\.gitignore">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <Content Include="Tools\webrepl\LICENSE">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <Content Include="Tools\webrepl\README.md">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="App.config" />
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="Tools\webrepl\FileSaver.js">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <Content Include="Tools\webrepl\term.js">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <Content Include="Tools\webrepl\webrepl.html">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <Content Include="Tools\webrepl\webrepl_cli.py">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <Content Include="Tools\webrepl\websocket_helper.py">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <None Include="Resources\gonext.png" />
+    <None Include="Resources\goprevious.png" />
+    <None Include="Resources\gohome.png" />
+    <None Include="Resources\bulletred.png" />
+    <None Include="Resources\bulletgrey.png" />
+    <None Include="Resources\bulletgreen.png" />
+    <None Include="Resources\saveall.png" />
+    <None Include="Resources\play1.png" />
+    <None Include="Resources\upload1.png" />
+    <None Include="Resources\command.png" />
+    <None Include="Resources\update.png" />
+    <None Include="Resources\play.png" />
+    <None Include="Resources\upload.png" />
+    <None Include="Resources\writeflash.png" />
+    <None Include="Resources\eraseflash1.png" />
+    <None Include="Resources\flash.png" />
+    <None Include="Resources\eraseflash.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\connect.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\disconnect.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\documentnew.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\documentopen.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\documentsave.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\documentssaveas.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\editcopy.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\editcut.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\editfind.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\editpaste.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\editredo.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\editreplace.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\editundo.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\port.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\download.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\editclear.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include=".NETFramework,Version=v4.6">
+      <Visible>False</Visible>
+      <ProductName>Microsoft .NET Framework 4.6 %28x86 and x64%29</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <ItemGroup>
+    <Folder Include="bin\" />
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>

+ 14 - 0
EsPy/Forms/CodeCompletionList.cs

@@ -0,0 +1,14 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace EsPy.Forms
+{
+    public class CodeCompletionList : Form
+    {
+
+    }
+}

+ 804 - 0
EsPy/Forms/EditorForm.Designer.cs

@@ -0,0 +1,804 @@
+namespace EsPy.Forms
+{
+    partial class EditorForm
+    {
+        /// <summary>
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary>
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Windows Form Designer generated code
+
+        /// <summary>
+        /// Required method for Designer support - do not modify
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.components = new System.ComponentModel.Container();
+            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(EditorForm));
+            this.menuStrip1 = new System.Windows.Forms.MenuStrip();
+            this.FileMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+            this.mnSave = new System.Windows.Forms.ToolStripMenuItem();
+            this.mnSaveAs = new System.Windows.Forms.ToolStripMenuItem();
+            this.mnEdit = new System.Windows.Forms.ToolStripMenuItem();
+            this.mnUndo = new System.Windows.Forms.ToolStripMenuItem();
+            this.mnRedo = new System.Windows.Forms.ToolStripMenuItem();
+            this.toolStripMenuItem2 = new System.Windows.Forms.ToolStripSeparator();
+            this.mnCut = new System.Windows.Forms.ToolStripMenuItem();
+            this.mnCopy = new System.Windows.Forms.ToolStripMenuItem();
+            this.mnPaste = new System.Windows.Forms.ToolStripMenuItem();
+            this.mnDelete = new System.Windows.Forms.ToolStripMenuItem();
+            this.toolStripMenuItem3 = new System.Windows.Forms.ToolStripSeparator();
+            this.mnSelectAll = new System.Windows.Forms.ToolStripMenuItem();
+            this.toolStripMenuItem7 = new System.Windows.Forms.ToolStripSeparator();
+            this.mnFind = new System.Windows.Forms.ToolStripMenuItem();
+            this.mnReplace = new System.Windows.Forms.ToolStripMenuItem();
+            this.toolStripMenuItem8 = new System.Windows.Forms.ToolStripSeparator();
+            this.mnComment = new System.Windows.Forms.ToolStripMenuItem();
+            this.mnUncommet = new System.Windows.Forms.ToolStripMenuItem();
+            this.toolStripMenuItem6 = new System.Windows.Forms.ToolStripSeparator();
+            this.mnView = new System.Windows.Forms.ToolStripMenuItem();
+            this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripSeparator();
+            this.mnShowEol = new System.Windows.Forms.ToolStripMenuItem();
+            this.mnShowWhitespace = new System.Windows.Forms.ToolStripMenuItem();
+            this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components);
+            this.cmUndo = new System.Windows.Forms.ToolStripMenuItem();
+            this.cmRedo = new System.Windows.Forms.ToolStripMenuItem();
+            this.toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator();
+            this.cmCut = new System.Windows.Forms.ToolStripMenuItem();
+            this.cmCopy = new System.Windows.Forms.ToolStripMenuItem();
+            this.cmPaste = new System.Windows.Forms.ToolStripMenuItem();
+            this.cmDelete = new System.Windows.Forms.ToolStripMenuItem();
+            this.cmSelectAll = new System.Windows.Forms.ToolStripMenuItem();
+            this.cmFind = new System.Windows.Forms.ToolStripMenuItem();
+            this.cmReplace = new System.Windows.Forms.ToolStripMenuItem();
+            this.toolStripMenuItem4 = new System.Windows.Forms.ToolStripSeparator();
+            this.btnHelp = new System.Windows.Forms.ToolStripMenuItem();
+            this.toolStripMenuItem5 = new System.Windows.Forms.ToolStripSeparator();
+            this.cmComment = new System.Windows.Forms.ToolStripMenuItem();
+            this.cmUncomment = new System.Windows.Forms.ToolStripMenuItem();
+            this.toolStripMenuItem9 = new System.Windows.Forms.ToolStripSeparator();
+            this.cmShowEOL = new System.Windows.Forms.ToolStripMenuItem();
+            this.cmShowWhitespace = new System.Windows.Forms.ToolStripMenuItem();
+            this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator();
+            this.toolStrip1 = new System.Windows.Forms.ToolStrip();
+            this.btnSave = new System.Windows.Forms.ToolStripButton();
+            this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
+            this.btnUndo = new System.Windows.Forms.ToolStripButton();
+            this.btnRedo = new System.Windows.Forms.ToolStripButton();
+            this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();
+            this.btnCut = new System.Windows.Forms.ToolStripButton();
+            this.btnCopy = new System.Windows.Forms.ToolStripButton();
+            this.btnPaste = new System.Windows.Forms.ToolStripButton();
+            this.btnPylint = new System.Windows.Forms.ToolStripButton();
+            this.btnRun = new System.Windows.Forms.ToolStripButton();
+            this.btnUpload = new System.Windows.Forms.ToolStripButton();
+            this.scintilla = new EsPy.Components.ExScintilla();
+            this.menuStrip1.SuspendLayout();
+            this.contextMenuStrip1.SuspendLayout();
+            this.toolStrip1.SuspendLayout();
+            this.SuspendLayout();
+            // 
+            // menuStrip1
+            // 
+            this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.FileMenuItem,
+            this.mnEdit,
+            this.mnView});
+            this.menuStrip1.Location = new System.Drawing.Point(0, 0);
+            this.menuStrip1.Name = "menuStrip1";
+            this.menuStrip1.Size = new System.Drawing.Size(636, 24);
+            this.menuStrip1.TabIndex = 0;
+            this.menuStrip1.Text = "menuStrip1";
+            this.menuStrip1.Visible = false;
+            // 
+            // FileMenuItem
+            // 
+            this.FileMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.mnSave,
+            this.mnSaveAs});
+            this.FileMenuItem.MergeAction = System.Windows.Forms.MergeAction.MatchOnly;
+            this.FileMenuItem.MergeIndex = 0;
+            this.FileMenuItem.Name = "FileMenuItem";
+            this.FileMenuItem.Size = new System.Drawing.Size(37, 20);
+            this.FileMenuItem.Text = "&File";
+            // 
+            // mnSave
+            // 
+            this.mnSave.Enabled = false;
+            this.mnSave.Image = ((System.Drawing.Image)(resources.GetObject("mnSave.Image")));
+            this.mnSave.MergeAction = System.Windows.Forms.MergeAction.Replace;
+            this.mnSave.MergeIndex = 3;
+            this.mnSave.Name = "mnSave";
+            this.mnSave.Size = new System.Drawing.Size(121, 22);
+            this.mnSave.Text = "Save";
+            this.mnSave.Click += new System.EventHandler(this.mnSave_Click);
+            // 
+            // mnSaveAs
+            // 
+            this.mnSaveAs.MergeAction = System.Windows.Forms.MergeAction.Replace;
+            this.mnSaveAs.MergeIndex = 4;
+            this.mnSaveAs.Name = "mnSaveAs";
+            this.mnSaveAs.Size = new System.Drawing.Size(121, 22);
+            this.mnSaveAs.Text = "Save as...";
+            this.mnSaveAs.Click += new System.EventHandler(this.mnSaveAs_Click);
+            // 
+            // mnEdit
+            // 
+            this.mnEdit.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.mnUndo,
+            this.mnRedo,
+            this.toolStripMenuItem2,
+            this.mnCut,
+            this.mnCopy,
+            this.mnPaste,
+            this.mnDelete,
+            this.toolStripMenuItem3,
+            this.mnSelectAll,
+            this.toolStripMenuItem7,
+            this.mnFind,
+            this.mnReplace,
+            this.toolStripMenuItem8,
+            this.mnComment,
+            this.mnUncommet,
+            this.toolStripMenuItem6});
+            this.mnEdit.MergeAction = System.Windows.Forms.MergeAction.MatchOnly;
+            this.mnEdit.MergeIndex = 1;
+            this.mnEdit.Name = "mnEdit";
+            this.mnEdit.Size = new System.Drawing.Size(39, 20);
+            this.mnEdit.Text = "&Edit";
+            // 
+            // mnUndo
+            // 
+            this.mnUndo.Image = ((System.Drawing.Image)(resources.GetObject("mnUndo.Image")));
+            this.mnUndo.MergeAction = System.Windows.Forms.MergeAction.Insert;
+            this.mnUndo.MergeIndex = 0;
+            this.mnUndo.Name = "mnUndo";
+            this.mnUndo.ShortcutKeyDisplayString = "Ctrl+Z";
+            this.mnUndo.Size = new System.Drawing.Size(183, 22);
+            this.mnUndo.Text = "Undo";
+            this.mnUndo.Click += new System.EventHandler(this.mnUndo_Click);
+            // 
+            // mnRedo
+            // 
+            this.mnRedo.Image = ((System.Drawing.Image)(resources.GetObject("mnRedo.Image")));
+            this.mnRedo.MergeAction = System.Windows.Forms.MergeAction.Insert;
+            this.mnRedo.MergeIndex = 1;
+            this.mnRedo.Name = "mnRedo";
+            this.mnRedo.ShortcutKeyDisplayString = "Ctrl+Y";
+            this.mnRedo.Size = new System.Drawing.Size(183, 22);
+            this.mnRedo.Text = "Redo";
+            this.mnRedo.Click += new System.EventHandler(this.mnRedo_Click);
+            // 
+            // toolStripMenuItem2
+            // 
+            this.toolStripMenuItem2.MergeAction = System.Windows.Forms.MergeAction.Insert;
+            this.toolStripMenuItem2.MergeIndex = 2;
+            this.toolStripMenuItem2.Name = "toolStripMenuItem2";
+            this.toolStripMenuItem2.Size = new System.Drawing.Size(180, 6);
+            // 
+            // mnCut
+            // 
+            this.mnCut.Image = ((System.Drawing.Image)(resources.GetObject("mnCut.Image")));
+            this.mnCut.MergeAction = System.Windows.Forms.MergeAction.Insert;
+            this.mnCut.MergeIndex = 3;
+            this.mnCut.Name = "mnCut";
+            this.mnCut.ShortcutKeyDisplayString = "Ctrl+X";
+            this.mnCut.Size = new System.Drawing.Size(183, 22);
+            this.mnCut.Text = "Cut";
+            this.mnCut.Click += new System.EventHandler(this.mnCut_Click);
+            // 
+            // mnCopy
+            // 
+            this.mnCopy.Image = ((System.Drawing.Image)(resources.GetObject("mnCopy.Image")));
+            this.mnCopy.MergeAction = System.Windows.Forms.MergeAction.Insert;
+            this.mnCopy.MergeIndex = 4;
+            this.mnCopy.Name = "mnCopy";
+            this.mnCopy.ShortcutKeyDisplayString = "Ctrl+C";
+            this.mnCopy.Size = new System.Drawing.Size(183, 22);
+            this.mnCopy.Text = "Copy";
+            this.mnCopy.Click += new System.EventHandler(this.mnCopy_Click);
+            // 
+            // mnPaste
+            // 
+            this.mnPaste.Image = ((System.Drawing.Image)(resources.GetObject("mnPaste.Image")));
+            this.mnPaste.MergeAction = System.Windows.Forms.MergeAction.Insert;
+            this.mnPaste.MergeIndex = 5;
+            this.mnPaste.Name = "mnPaste";
+            this.mnPaste.ShortcutKeyDisplayString = "Ctrl+V";
+            this.mnPaste.Size = new System.Drawing.Size(183, 22);
+            this.mnPaste.Text = "Paste";
+            this.mnPaste.Click += new System.EventHandler(this.mnPaste_Click);
+            // 
+            // mnDelete
+            // 
+            this.mnDelete.MergeAction = System.Windows.Forms.MergeAction.Insert;
+            this.mnDelete.MergeIndex = 6;
+            this.mnDelete.Name = "mnDelete";
+            this.mnDelete.ShortcutKeyDisplayString = "Del";
+            this.mnDelete.Size = new System.Drawing.Size(183, 22);
+            this.mnDelete.Text = "Delete";
+            this.mnDelete.Click += new System.EventHandler(this.mnDelete_Click);
+            // 
+            // toolStripMenuItem3
+            // 
+            this.toolStripMenuItem3.MergeAction = System.Windows.Forms.MergeAction.Insert;
+            this.toolStripMenuItem3.MergeIndex = 7;
+            this.toolStripMenuItem3.Name = "toolStripMenuItem3";
+            this.toolStripMenuItem3.Size = new System.Drawing.Size(180, 6);
+            // 
+            // mnSelectAll
+            // 
+            this.mnSelectAll.MergeAction = System.Windows.Forms.MergeAction.Insert;
+            this.mnSelectAll.MergeIndex = 8;
+            this.mnSelectAll.Name = "mnSelectAll";
+            this.mnSelectAll.ShortcutKeyDisplayString = "Ctrl+A";
+            this.mnSelectAll.Size = new System.Drawing.Size(183, 22);
+            this.mnSelectAll.Text = "Select All";
+            this.mnSelectAll.Click += new System.EventHandler(this.mnSelectAll_Click);
+            // 
+            // toolStripMenuItem7
+            // 
+            this.toolStripMenuItem7.MergeAction = System.Windows.Forms.MergeAction.Insert;
+            this.toolStripMenuItem7.MergeIndex = 9;
+            this.toolStripMenuItem7.Name = "toolStripMenuItem7";
+            this.toolStripMenuItem7.Size = new System.Drawing.Size(180, 6);
+            // 
+            // mnFind
+            // 
+            this.mnFind.Enabled = false;
+            this.mnFind.MergeAction = System.Windows.Forms.MergeAction.Insert;
+            this.mnFind.MergeIndex = 10;
+            this.mnFind.Name = "mnFind";
+            this.mnFind.ShortcutKeyDisplayString = "Ctrl+F";
+            this.mnFind.Size = new System.Drawing.Size(183, 22);
+            this.mnFind.Text = "Find...";
+            this.mnFind.Click += new System.EventHandler(this.mnFind_Click);
+            // 
+            // mnReplace
+            // 
+            this.mnReplace.Enabled = false;
+            this.mnReplace.MergeAction = System.Windows.Forms.MergeAction.Insert;
+            this.mnReplace.MergeIndex = 11;
+            this.mnReplace.Name = "mnReplace";
+            this.mnReplace.ShortcutKeyDisplayString = "Ctrl+H";
+            this.mnReplace.Size = new System.Drawing.Size(183, 22);
+            this.mnReplace.Text = "Replace...";
+            this.mnReplace.Click += new System.EventHandler(this.mnReplace_Click);
+            // 
+            // toolStripMenuItem8
+            // 
+            this.toolStripMenuItem8.MergeAction = System.Windows.Forms.MergeAction.Insert;
+            this.toolStripMenuItem8.MergeIndex = 12;
+            this.toolStripMenuItem8.Name = "toolStripMenuItem8";
+            this.toolStripMenuItem8.Size = new System.Drawing.Size(180, 6);
+            // 
+            // mnComment
+            // 
+            this.mnComment.MergeAction = System.Windows.Forms.MergeAction.Insert;
+            this.mnComment.MergeIndex = 13;
+            this.mnComment.Name = "mnComment";
+            this.mnComment.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.K)));
+            this.mnComment.Size = new System.Drawing.Size(183, 22);
+            this.mnComment.Text = "Comment";
+            // 
+            // mnUncommet
+            // 
+            this.mnUncommet.MergeAction = System.Windows.Forms.MergeAction.Insert;
+            this.mnUncommet.MergeIndex = 14;
+            this.mnUncommet.Name = "mnUncommet";
+            this.mnUncommet.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.U)));
+            this.mnUncommet.Size = new System.Drawing.Size(183, 22);
+            this.mnUncommet.Text = "Uncomment";
+            // 
+            // toolStripMenuItem6
+            // 
+            this.toolStripMenuItem6.MergeAction = System.Windows.Forms.MergeAction.Insert;
+            this.toolStripMenuItem6.MergeIndex = 15;
+            this.toolStripMenuItem6.Name = "toolStripMenuItem6";
+            this.toolStripMenuItem6.Size = new System.Drawing.Size(180, 6);
+            // 
+            // mnView
+            // 
+            this.mnView.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.toolStripMenuItem1,
+            this.mnShowEol,
+            this.mnShowWhitespace});
+            this.mnView.MergeAction = System.Windows.Forms.MergeAction.MatchOnly;
+            this.mnView.MergeIndex = 0;
+            this.mnView.Name = "mnView";
+            this.mnView.Size = new System.Drawing.Size(44, 20);
+            this.mnView.Text = "&View";
+            // 
+            // toolStripMenuItem1
+            // 
+            this.toolStripMenuItem1.MergeIndex = 2;
+            this.toolStripMenuItem1.Name = "toolStripMenuItem1";
+            this.toolStripMenuItem1.Size = new System.Drawing.Size(164, 6);
+            // 
+            // mnShowEol
+            // 
+            this.mnShowEol.MergeIndex = 3;
+            this.mnShowEol.Name = "mnShowEol";
+            this.mnShowEol.Size = new System.Drawing.Size(167, 22);
+            this.mnShowEol.Text = "Show EOL";
+            this.mnShowEol.Click += new System.EventHandler(this.mnShowEOL_Click);
+            // 
+            // mnShowWhitespace
+            // 
+            this.mnShowWhitespace.MergeIndex = 4;
+            this.mnShowWhitespace.Name = "mnShowWhitespace";
+            this.mnShowWhitespace.Size = new System.Drawing.Size(167, 22);
+            this.mnShowWhitespace.Text = "Show Whitespace";
+            this.mnShowWhitespace.Click += new System.EventHandler(this.mnShowWhitespace_Click);
+            // 
+            // contextMenuStrip1
+            // 
+            this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.cmUndo,
+            this.cmRedo,
+            this.toolStripSeparator4,
+            this.cmCut,
+            this.cmCopy,
+            this.cmPaste,
+            this.cmDelete,
+            this.cmSelectAll,
+            this.cmFind,
+            this.cmReplace,
+            this.toolStripMenuItem4,
+            this.btnHelp,
+            this.toolStripMenuItem5,
+            this.cmComment,
+            this.cmUncomment,
+            this.toolStripMenuItem9,
+            this.cmShowEOL,
+            this.cmShowWhitespace});
+            this.contextMenuStrip1.Name = "contextMenuStrip1";
+            this.contextMenuStrip1.Size = new System.Drawing.Size(184, 336);
+            // 
+            // cmUndo
+            // 
+            this.cmUndo.Enabled = false;
+            this.cmUndo.Image = ((System.Drawing.Image)(resources.GetObject("cmUndo.Image")));
+            this.cmUndo.MergeAction = System.Windows.Forms.MergeAction.Insert;
+            this.cmUndo.MergeIndex = 0;
+            this.cmUndo.Name = "cmUndo";
+            this.cmUndo.ShortcutKeyDisplayString = "Ctrl+Z";
+            this.cmUndo.Size = new System.Drawing.Size(183, 22);
+            this.cmUndo.Text = "Undo";
+            this.cmUndo.Click += new System.EventHandler(this.mnUndo_Click);
+            // 
+            // cmRedo
+            // 
+            this.cmRedo.Enabled = false;
+            this.cmRedo.Image = ((System.Drawing.Image)(resources.GetObject("cmRedo.Image")));
+            this.cmRedo.MergeAction = System.Windows.Forms.MergeAction.Insert;
+            this.cmRedo.MergeIndex = 1;
+            this.cmRedo.Name = "cmRedo";
+            this.cmRedo.ShortcutKeyDisplayString = "Ctrl+Y";
+            this.cmRedo.Size = new System.Drawing.Size(183, 22);
+            this.cmRedo.Text = "Redo";
+            this.cmRedo.Click += new System.EventHandler(this.mnRedo_Click);
+            // 
+            // toolStripSeparator4
+            // 
+            this.toolStripSeparator4.MergeAction = System.Windows.Forms.MergeAction.Insert;
+            this.toolStripSeparator4.MergeIndex = 2;
+            this.toolStripSeparator4.Name = "toolStripSeparator4";
+            this.toolStripSeparator4.Size = new System.Drawing.Size(180, 6);
+            // 
+            // cmCut
+            // 
+            this.cmCut.Enabled = false;
+            this.cmCut.Image = ((System.Drawing.Image)(resources.GetObject("cmCut.Image")));
+            this.cmCut.MergeAction = System.Windows.Forms.MergeAction.Insert;
+            this.cmCut.MergeIndex = 3;
+            this.cmCut.Name = "cmCut";
+            this.cmCut.ShortcutKeyDisplayString = "Ctrl+X";
+            this.cmCut.Size = new System.Drawing.Size(183, 22);
+            this.cmCut.Text = "Cut";
+            this.cmCut.Click += new System.EventHandler(this.mnCut_Click);
+            // 
+            // cmCopy
+            // 
+            this.cmCopy.Enabled = false;
+            this.cmCopy.Image = ((System.Drawing.Image)(resources.GetObject("cmCopy.Image")));
+            this.cmCopy.MergeAction = System.Windows.Forms.MergeAction.Insert;
+            this.cmCopy.MergeIndex = 4;
+            this.cmCopy.Name = "cmCopy";
+            this.cmCopy.ShortcutKeyDisplayString = "Ctrl+C";
+            this.cmCopy.Size = new System.Drawing.Size(183, 22);
+            this.cmCopy.Text = "Copy";
+            this.cmCopy.Click += new System.EventHandler(this.mnCopy_Click);
+            // 
+            // cmPaste
+            // 
+            this.cmPaste.Enabled = false;
+            this.cmPaste.Image = ((System.Drawing.Image)(resources.GetObject("cmPaste.Image")));
+            this.cmPaste.MergeAction = System.Windows.Forms.MergeAction.Insert;
+            this.cmPaste.MergeIndex = 5;
+            this.cmPaste.Name = "cmPaste";
+            this.cmPaste.ShortcutKeyDisplayString = "Ctrl+V";
+            this.cmPaste.Size = new System.Drawing.Size(183, 22);
+            this.cmPaste.Text = "Paste";
+            this.cmPaste.Click += new System.EventHandler(this.mnPaste_Click);
+            // 
+            // cmDelete
+            // 
+            this.cmDelete.Enabled = false;
+            this.cmDelete.MergeAction = System.Windows.Forms.MergeAction.Insert;
+            this.cmDelete.MergeIndex = 6;
+            this.cmDelete.Name = "cmDelete";
+            this.cmDelete.ShortcutKeyDisplayString = "Del";
+            this.cmDelete.Size = new System.Drawing.Size(183, 22);
+            this.cmDelete.Text = "Delete";
+            this.cmDelete.Click += new System.EventHandler(this.mnDelete_Click);
+            // 
+            // cmSelectAll
+            // 
+            this.cmSelectAll.Enabled = false;
+            this.cmSelectAll.MergeAction = System.Windows.Forms.MergeAction.Insert;
+            this.cmSelectAll.MergeIndex = 8;
+            this.cmSelectAll.Name = "cmSelectAll";
+            this.cmSelectAll.ShortcutKeyDisplayString = "Ctrl+A";
+            this.cmSelectAll.Size = new System.Drawing.Size(183, 22);
+            this.cmSelectAll.Text = "Select All";
+            this.cmSelectAll.Click += new System.EventHandler(this.mnSelectAll_Click);
+            // 
+            // cmFind
+            // 
+            this.cmFind.Enabled = false;
+            this.cmFind.MergeAction = System.Windows.Forms.MergeAction.Insert;
+            this.cmFind.MergeIndex = 10;
+            this.cmFind.Name = "cmFind";
+            this.cmFind.ShortcutKeyDisplayString = "Ctrl+F";
+            this.cmFind.Size = new System.Drawing.Size(183, 22);
+            this.cmFind.Text = "Find...";
+            this.cmFind.Click += new System.EventHandler(this.mnFind_Click);
+            // 
+            // cmReplace
+            // 
+            this.cmReplace.Enabled = false;
+            this.cmReplace.MergeAction = System.Windows.Forms.MergeAction.Insert;
+            this.cmReplace.MergeIndex = 11;
+            this.cmReplace.Name = "cmReplace";
+            this.cmReplace.ShortcutKeyDisplayString = "Ctrl+H";
+            this.cmReplace.Size = new System.Drawing.Size(183, 22);
+            this.cmReplace.Text = "Replace...";
+            this.cmReplace.Click += new System.EventHandler(this.mnReplace_Click);
+            // 
+            // toolStripMenuItem4
+            // 
+            this.toolStripMenuItem4.MergeAction = System.Windows.Forms.MergeAction.Insert;
+            this.toolStripMenuItem4.MergeIndex = 12;
+            this.toolStripMenuItem4.Name = "toolStripMenuItem4";
+            this.toolStripMenuItem4.Size = new System.Drawing.Size(180, 6);
+            // 
+            // btnHelp
+            // 
+            this.btnHelp.Name = "btnHelp";
+            this.btnHelp.ShortcutKeys = System.Windows.Forms.Keys.F1;
+            this.btnHelp.Size = new System.Drawing.Size(183, 22);
+            this.btnHelp.Text = "dir()";
+            this.btnHelp.Click += new System.EventHandler(this.btnHelp_Click);
+            // 
+            // toolStripMenuItem5
+            // 
+            this.toolStripMenuItem5.Name = "toolStripMenuItem5";
+            this.toolStripMenuItem5.Size = new System.Drawing.Size(180, 6);
+            // 
+            // cmComment
+            // 
+            this.cmComment.MergeAction = System.Windows.Forms.MergeAction.Insert;
+            this.cmComment.MergeIndex = 13;
+            this.cmComment.Name = "cmComment";
+            this.cmComment.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.K)));
+            this.cmComment.Size = new System.Drawing.Size(183, 22);
+            this.cmComment.Text = "Comment";
+            this.cmComment.Click += new System.EventHandler(this.mnComment_Click);
+            // 
+            // cmUncomment
+            // 
+            this.cmUncomment.MergeAction = System.Windows.Forms.MergeAction.Insert;
+            this.cmUncomment.MergeIndex = 14;
+            this.cmUncomment.Name = "cmUncomment";
+            this.cmUncomment.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.U)));
+            this.cmUncomment.Size = new System.Drawing.Size(183, 22);
+            this.cmUncomment.Text = "Uncomment";
+            this.cmUncomment.Click += new System.EventHandler(this.mnUncommet_Click);
+            // 
+            // toolStripMenuItem9
+            // 
+            this.toolStripMenuItem9.MergeAction = System.Windows.Forms.MergeAction.Insert;
+            this.toolStripMenuItem9.MergeIndex = 15;
+            this.toolStripMenuItem9.Name = "toolStripMenuItem9";
+            this.toolStripMenuItem9.Size = new System.Drawing.Size(180, 6);
+            // 
+            // cmShowEOL
+            // 
+            this.cmShowEOL.MergeAction = System.Windows.Forms.MergeAction.Insert;
+            this.cmShowEOL.MergeIndex = 16;
+            this.cmShowEOL.Name = "cmShowEOL";
+            this.cmShowEOL.Size = new System.Drawing.Size(183, 22);
+            this.cmShowEOL.Text = "Show EOL";
+            this.cmShowEOL.Click += new System.EventHandler(this.mnShowEOL_Click);
+            // 
+            // cmShowWhitespace
+            // 
+            this.cmShowWhitespace.MergeAction = System.Windows.Forms.MergeAction.Insert;
+            this.cmShowWhitespace.MergeIndex = 17;
+            this.cmShowWhitespace.Name = "cmShowWhitespace";
+            this.cmShowWhitespace.Size = new System.Drawing.Size(183, 22);
+            this.cmShowWhitespace.Text = "Show Whitespace";
+            this.cmShowWhitespace.Click += new System.EventHandler(this.mnShowWhitespace_Click);
+            // 
+            // toolStripSeparator3
+            // 
+            this.toolStripSeparator3.Name = "toolStripSeparator3";
+            this.toolStripSeparator3.Size = new System.Drawing.Size(6, 39);
+            // 
+            // toolStrip1
+            // 
+            this.toolStrip1.ContextMenuStrip = this.contextMenuStrip1;
+            this.toolStrip1.ImageScalingSize = new System.Drawing.Size(32, 32);
+            this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.btnSave,
+            this.toolStripSeparator1,
+            this.btnUndo,
+            this.btnRedo,
+            this.toolStripSeparator2,
+            this.btnCut,
+            this.btnCopy,
+            this.btnPaste,
+            this.toolStripSeparator3,
+            this.btnPylint,
+            this.btnRun,
+            this.btnUpload});
+            this.toolStrip1.Location = new System.Drawing.Point(0, 0);
+            this.toolStrip1.Name = "toolStrip1";
+            this.toolStrip1.Size = new System.Drawing.Size(636, 39);
+            this.toolStrip1.TabIndex = 1;
+            this.toolStrip1.Text = "toolStrip1";
+            this.toolStrip1.Visible = false;
+            // 
+            // btnSave
+            // 
+            this.btnSave.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+            this.btnSave.Enabled = false;
+            this.btnSave.Image = ((System.Drawing.Image)(resources.GetObject("btnSave.Image")));
+            this.btnSave.ImageTransparentColor = System.Drawing.Color.Magenta;
+            this.btnSave.MergeAction = System.Windows.Forms.MergeAction.Replace;
+            this.btnSave.Name = "btnSave";
+            this.btnSave.Size = new System.Drawing.Size(36, 36);
+            this.btnSave.Text = "Save";
+            this.btnSave.Click += new System.EventHandler(this.mnSave_Click);
+            // 
+            // toolStripSeparator1
+            // 
+            this.toolStripSeparator1.Name = "toolStripSeparator1";
+            this.toolStripSeparator1.Size = new System.Drawing.Size(6, 39);
+            this.toolStripSeparator1.Visible = false;
+            // 
+            // btnUndo
+            // 
+            this.btnUndo.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+            this.btnUndo.Enabled = false;
+            this.btnUndo.Image = ((System.Drawing.Image)(resources.GetObject("btnUndo.Image")));
+            this.btnUndo.ImageTransparentColor = System.Drawing.Color.Magenta;
+            this.btnUndo.MergeAction = System.Windows.Forms.MergeAction.Replace;
+            this.btnUndo.Name = "btnUndo";
+            this.btnUndo.Size = new System.Drawing.Size(36, 36);
+            this.btnUndo.Text = "Undo";
+            this.btnUndo.Click += new System.EventHandler(this.mnUndo_Click);
+            // 
+            // btnRedo
+            // 
+            this.btnRedo.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+            this.btnRedo.Enabled = false;
+            this.btnRedo.Image = ((System.Drawing.Image)(resources.GetObject("btnRedo.Image")));
+            this.btnRedo.ImageTransparentColor = System.Drawing.Color.Magenta;
+            this.btnRedo.MergeAction = System.Windows.Forms.MergeAction.Replace;
+            this.btnRedo.Name = "btnRedo";
+            this.btnRedo.Size = new System.Drawing.Size(36, 36);
+            this.btnRedo.Text = "Redo";
+            this.btnRedo.Click += new System.EventHandler(this.mnRedo_Click);
+            // 
+            // toolStripSeparator2
+            // 
+            this.toolStripSeparator2.Name = "toolStripSeparator2";
+            this.toolStripSeparator2.Size = new System.Drawing.Size(6, 39);
+            this.toolStripSeparator2.Visible = false;
+            // 
+            // btnCut
+            // 
+            this.btnCut.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+            this.btnCut.Enabled = false;
+            this.btnCut.Image = ((System.Drawing.Image)(resources.GetObject("btnCut.Image")));
+            this.btnCut.ImageTransparentColor = System.Drawing.Color.Magenta;
+            this.btnCut.MergeAction = System.Windows.Forms.MergeAction.Replace;
+            this.btnCut.Name = "btnCut";
+            this.btnCut.Size = new System.Drawing.Size(36, 36);
+            this.btnCut.Text = "Cut";
+            this.btnCut.Click += new System.EventHandler(this.mnCut_Click);
+            // 
+            // btnCopy
+            // 
+            this.btnCopy.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+            this.btnCopy.Enabled = false;
+            this.btnCopy.Image = ((System.Drawing.Image)(resources.GetObject("btnCopy.Image")));
+            this.btnCopy.ImageTransparentColor = System.Drawing.Color.Magenta;
+            this.btnCopy.MergeAction = System.Windows.Forms.MergeAction.Replace;
+            this.btnCopy.Name = "btnCopy";
+            this.btnCopy.Size = new System.Drawing.Size(36, 36);
+            this.btnCopy.Text = "Copy";
+            this.btnCopy.Click += new System.EventHandler(this.mnCopy_Click);
+            // 
+            // btnPaste
+            // 
+            this.btnPaste.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+            this.btnPaste.Enabled = false;
+            this.btnPaste.Image = ((System.Drawing.Image)(resources.GetObject("btnPaste.Image")));
+            this.btnPaste.ImageTransparentColor = System.Drawing.Color.Magenta;
+            this.btnPaste.MergeAction = System.Windows.Forms.MergeAction.Replace;
+            this.btnPaste.Name = "btnPaste";
+            this.btnPaste.Size = new System.Drawing.Size(36, 36);
+            this.btnPaste.Text = "Paste";
+            this.btnPaste.Click += new System.EventHandler(this.mnPaste_Click);
+            // 
+            // btnPylint
+            // 
+            this.btnPylint.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+            this.btnPylint.Enabled = false;
+            this.btnPylint.Image = global::EsPy.Properties.Resources.syntax;
+            this.btnPylint.ImageTransparentColor = System.Drawing.Color.Magenta;
+            this.btnPylint.Name = "btnPylint";
+            this.btnPylint.Size = new System.Drawing.Size(36, 36);
+            this.btnPylint.Text = "Pylint";
+            this.btnPylint.Click += new System.EventHandler(this.btnPylint_Click);
+            // 
+            // btnRun
+            // 
+            this.btnRun.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+            this.btnRun.Enabled = false;
+            this.btnRun.Image = global::EsPy.Properties.Resources.play1;
+            this.btnRun.ImageTransparentColor = System.Drawing.Color.Magenta;
+            this.btnRun.Name = "btnRun";
+            this.btnRun.Size = new System.Drawing.Size(36, 36);
+            this.btnRun.Text = "Run";
+            this.btnRun.ToolTipText = "Run";
+            this.btnRun.Click += new System.EventHandler(this.btnRun_Click);
+            // 
+            // btnUpload
+            // 
+            this.btnUpload.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+            this.btnUpload.Enabled = false;
+            this.btnUpload.Image = global::EsPy.Properties.Resources.upload1;
+            this.btnUpload.ImageTransparentColor = System.Drawing.Color.Magenta;
+            this.btnUpload.Name = "btnUpload";
+            this.btnUpload.Size = new System.Drawing.Size(36, 36);
+            this.btnUpload.Text = "Upload";
+            this.btnUpload.ToolTipText = "Upload to the current directory";
+            this.btnUpload.Click += new System.EventHandler(this.btnUpload_Click);
+            // 
+            // scintilla
+            // 
+            this.scintilla.AutoCAutoHide = false;
+            this.scintilla.AutoCChooseSingle = true;
+            this.scintilla.AutomaticFold = ((ScintillaNET.AutomaticFold)(((ScintillaNET.AutomaticFold.Show | ScintillaNET.AutomaticFold.Click) 
+            | ScintillaNET.AutomaticFold.Change)));
+            this.scintilla.CaretLineBackColorAlpha = 128;
+            this.scintilla.CompletionEnabled = false;
+            this.scintilla.ContextMenuStrip = this.contextMenuStrip1;
+            this.scintilla.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.scintilla.EdgeColumn = 80;
+            this.scintilla.EdgeMode = ScintillaNET.EdgeMode.Line;
+            this.scintilla.IndentationGuides = ScintillaNET.IndentView.LookBoth;
+            this.scintilla.IndentWidth = 4;
+            this.scintilla.Lexer = ScintillaNET.Lexer.Html;
+            this.scintilla.Location = new System.Drawing.Point(0, 39);
+            this.scintilla.MouseDwellTime = 500;
+            this.scintilla.Name = "scintilla";
+            this.scintilla.Size = new System.Drawing.Size(636, 223);
+            this.scintilla.TabIndex = 2;
+            this.scintilla.SavePointLeft += new System.EventHandler<System.EventArgs>(this.scintilla_SavePointLeft);
+            this.scintilla.SavePointReached += new System.EventHandler<System.EventArgs>(this.scintilla_SavePointReached);
+            this.scintilla.UpdateUI += new System.EventHandler<ScintillaNET.UpdateUIEventArgs>(this.UpdateUI);
+            this.scintilla.MouseDown += new System.Windows.Forms.MouseEventHandler(this.scintilla_MouseDown);
+            // 
+            // EditorForm
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.ClientSize = new System.Drawing.Size(636, 262);
+            this.Controls.Add(this.scintilla);
+            this.Controls.Add(this.menuStrip1);
+            this.Controls.Add(this.toolStrip1);
+            this.MainMenuStrip = this.menuStrip1;
+            this.Name = "EditorForm";
+            this.Text = "EditorForm";
+            this.Load += new System.EventHandler(this.EditorForm_Load);
+            this.menuStrip1.ResumeLayout(false);
+            this.menuStrip1.PerformLayout();
+            this.contextMenuStrip1.ResumeLayout(false);
+            this.toolStrip1.ResumeLayout(false);
+            this.toolStrip1.PerformLayout();
+            this.ResumeLayout(false);
+            this.PerformLayout();
+
+        }
+
+        #endregion
+        private System.Windows.Forms.ToolStripMenuItem FileMenuItem;
+        private System.Windows.Forms.ToolStripMenuItem mnSave;
+        private System.Windows.Forms.ToolStripMenuItem mnSaveAs;
+        private System.Windows.Forms.ToolStripMenuItem mnEdit;
+        private System.Windows.Forms.ToolStripMenuItem mnUndo;
+        private System.Windows.Forms.ToolStripMenuItem mnRedo;
+        private System.Windows.Forms.ToolStripSeparator toolStripMenuItem2;
+        private System.Windows.Forms.ToolStripMenuItem mnCut;
+        private System.Windows.Forms.ToolStripMenuItem mnCopy;
+        private System.Windows.Forms.ToolStripMenuItem mnPaste;
+        private System.Windows.Forms.ToolStripMenuItem mnDelete;
+        private System.Windows.Forms.ToolStripSeparator toolStripMenuItem3;
+        private System.Windows.Forms.ToolStripMenuItem mnSelectAll;
+        private System.Windows.Forms.ToolStripSeparator toolStripMenuItem7;
+        private System.Windows.Forms.ToolStripMenuItem mnFind;
+        private System.Windows.Forms.ToolStripMenuItem mnReplace;
+        private System.Windows.Forms.ToolStripSeparator toolStripMenuItem8;
+        private System.Windows.Forms.ToolStripMenuItem cmUndo;
+        private System.Windows.Forms.ToolStripMenuItem cmRedo;
+        private System.Windows.Forms.ToolStripSeparator toolStripSeparator4;
+        private System.Windows.Forms.ToolStripMenuItem cmCut;
+        private System.Windows.Forms.ToolStripMenuItem cmCopy;
+        private System.Windows.Forms.ToolStripMenuItem cmPaste;
+        private System.Windows.Forms.ToolStripMenuItem cmDelete;
+        private System.Windows.Forms.ToolStripMenuItem cmSelectAll;
+        private System.Windows.Forms.ToolStripMenuItem cmFind;
+        private System.Windows.Forms.ToolStripMenuItem cmReplace;
+        protected System.Windows.Forms.MenuStrip menuStrip1;
+        protected System.Windows.Forms.ContextMenuStrip contextMenuStrip1;
+        public Components.ExScintilla scintilla;
+        private System.Windows.Forms.ToolStripButton btnSave;
+        private System.Windows.Forms.ToolStripSeparator toolStripSeparator3;
+        private System.Windows.Forms.ToolStripButton btnUpload;
+        private System.Windows.Forms.ToolStripButton btnRun;
+        protected System.Windows.Forms.ToolStrip toolStrip1;
+        private System.Windows.Forms.ToolStripSeparator toolStripSeparator1;
+        private System.Windows.Forms.ToolStripButton btnUndo;
+        private System.Windows.Forms.ToolStripButton btnRedo;
+        private System.Windows.Forms.ToolStripSeparator toolStripSeparator2;
+        private System.Windows.Forms.ToolStripButton btnCut;
+        private System.Windows.Forms.ToolStripButton btnCopy;
+        private System.Windows.Forms.ToolStripButton btnPaste;
+        private System.Windows.Forms.ToolStripMenuItem mnView;
+        private System.Windows.Forms.ToolStripSeparator toolStripMenuItem1;
+        private System.Windows.Forms.ToolStripMenuItem mnShowEol;
+        private System.Windows.Forms.ToolStripMenuItem mnShowWhitespace;
+        private System.Windows.Forms.ToolStripSeparator toolStripMenuItem4;
+        private System.Windows.Forms.ToolStripMenuItem mnComment;
+        private System.Windows.Forms.ToolStripMenuItem mnUncommet;
+        private System.Windows.Forms.ToolStripSeparator toolStripMenuItem6;
+        private System.Windows.Forms.ToolStripMenuItem cmComment;
+        private System.Windows.Forms.ToolStripMenuItem cmUncomment;
+        private System.Windows.Forms.ToolStripSeparator toolStripMenuItem9;
+        private System.Windows.Forms.ToolStripMenuItem cmShowEOL;
+        private System.Windows.Forms.ToolStripMenuItem cmShowWhitespace;
+        private System.Windows.Forms.ToolStripMenuItem btnHelp;
+        private System.Windows.Forms.ToolStripSeparator toolStripMenuItem5;
+        private System.Windows.Forms.ToolStripButton btnPylint;
+    }
+}

+ 889 - 0
EsPy/Forms/EditorForm.cs

@@ -0,0 +1,889 @@
+using EsPy.Components;
+
+using EsPy.Dialogs;
+using EsPy.Python;
+using EsPy.Python.Jedi;
+
+using EsPy.Units;
+using EsPy.Utility;
+using Newtonsoft.Json;
+using Newtonsoft.Json.Linq;
+using ScintillaNET;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Diagnostics;
+using System.Drawing;
+using System.IO;
+using System.Linq;
+using System.Net;
+using System.Reflection;
+using System.Text;
+using System.Text.RegularExpressions;
+using System.Threading;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+using WeifenLuo.WinFormsUI.Docking;
+using static EsPy.Utility.TextHelper;
+
+namespace EsPy.Forms
+{
+    public partial class EditorForm : DockContent, IDocument, IPort //, INotifyPropertyChanged
+    {
+
+        [System.Runtime.InteropServices.DllImport("user32.dll")]
+        private static extern IntPtr PostMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp);
+
+        private EditorForm()
+        {
+            InitializeComponent();
+            this.Text = "new";
+            this.HideOnClose = false;
+            this.DockAreas = DockAreas.Document;
+            this.EOLVisible = Properties.Settings.Default.EolVisible;
+            this.WhitespaceVisible = Properties.Settings.Default.WhitespaceVisible;
+            this.scintilla.CompletionEnabled = true;
+        }
+
+        public EditorForm(MainForm main_form) : this()
+        {
+            this.Port = main_form.Port;
+        }
+
+        public Lexer Lexer
+        {
+            get { return this.scintilla.Lexer; }
+            set
+            {
+                this.scintilla.Lexer = value;
+            }
+        }
+
+        private bool IsRunnable
+        { get { return this.Port != null && this.Port.IsOpen && !this.Port.Busy && this.scintilla.Lexer == Lexer.Python; } }
+
+        private PySerial FPort = null;
+        public PySerial Port
+        {
+            get { return this.FPort; }
+            set
+            {
+                if (this.FPort != null)
+                {
+                    this.FPort.PortOpen -= Port_PortOpen;
+                    this.FPort.PortClose -= Port_PortClose;
+                    this.FPort.PortBusy -= Port_PortBusy;
+                    this.FPort.PortFree -= Port_PortFree;
+                }
+
+                this.FPort = value;
+
+                if (this.FPort != null)
+                {
+                    this.FPort.PortOpen += Port_PortOpen;
+                    this.FPort.PortClose += Port_PortClose;
+                    this.FPort.PortBusy += Port_PortBusy;
+                    this.FPort.PortFree += Port_PortFree;
+                }
+                this.UpdateUI();
+            }
+        }
+
+        private delegate void UpdateStatusEvent(bool busy);
+        public void UpdateBusy(bool busy)
+        {
+            if (this.InvokeRequired)
+            {
+                this.Invoke(new UpdateStatusEvent(UpdateBusy), new object[] { busy });
+            }
+            else
+            {
+                this.btnUpload.Enabled = !busy;
+                this.btnRun.Enabled = !busy && this.IsRunnable;
+            }
+        }
+
+        private void Port_PortFree(object sender, EventArgs e)
+        {
+            this.UpdateBusy(false);
+        }
+
+        private void Port_PortBusy(object sender, EventArgs e)
+        {
+            this.UpdateBusy(true);
+        }
+
+        private void Port_PortClose(object sender, EventArgs e)
+        {
+            this.btnUpload.Enabled =
+                 this.btnRun.Enabled = false;
+        }
+
+        private void Port_PortOpen(object sender, EventArgs e)
+        {
+            this.UpdateUI();
+        }
+
+        protected override string GetPersistString()
+        {
+            if (this.FileName != null)
+                return String.Format("{0},{1},{2}",
+                    GetType().ToString(),
+                    this.FileName,
+                    this.scintilla.CurrentPosition
+                    );
+
+            return GetType().ToString();
+        }
+
+        public bool CanPaste
+        { get; set; }
+
+        public ToolStrip ToolStrip
+        { get { return this.toolStrip1; } }
+
+        public ToolStrip MenuStrip
+        { get { return this.menuStrip1; } }
+
+        public void LoadFromFile(string fname)
+        {
+            this.FileName = fname;
+            this.scintilla.Text = File.ReadAllText(fname);
+            this.scintilla.GotoPosition(this.scintilla.TextLength);
+            this.scintilla.SetSavePoint();
+            this.scintilla.EmptyUndoBuffer();
+        }
+
+        public string Source
+        { get { return this.scintilla.Text; } }
+
+        public bool Modified
+        { get { return this.scintilla.Modified; } }
+
+        public bool CanSave
+        { get { return true; } }
+
+        public static FileFormats EditorFileFormats
+        {
+            get
+            {
+                FileFormats ff = new FileFormats();
+                ff.Add(FileFormat.Python);
+                ff.Add(FileFormat.Html);
+                ff.Add(FileFormat.Css);
+                ff.Add(FileFormat.Js);
+                ff.Add(FileFormat.Json);
+                ff.Add(FileFormat.Xml);
+                ff.Add(FileFormat.Txt);
+                ff.Add(FileFormat.All);
+                ff.DefaultExt = FileFormat.Python.DefaultExt;
+                return ff;
+            }
+        }
+
+        private string FFileName = null;
+        public string FileName
+        {
+            get { return FFileName; }
+            set
+            {
+
+                this.FFileName = value;
+                this.ToolTipText = value;
+                this.Text = Path.GetFileName(this.FFileName);
+                string ext = Path.GetExtension(this.FFileName).ToLower();
+
+                FileFormat ff = EditorForm.EditorFileFormats.Find(ext);
+                if (ff != null)
+                {
+                    this.scintilla.Lexer = ff.Lexer;
+                    //this.scintilla.LexerLanguage = ff.Language.ToLower() == "html" ? "hypertext" : ff.Language.ToLower();
+                    this.scintilla.Lang = ff.Language.ToLower();
+                    this.scintilla.SetLang();
+                }
+                else
+                {
+                    this.scintilla.Lexer = Lexer.Null;
+                    this.scintilla.LexerLanguage = "";
+                }
+
+                this.mnComment.Enabled =
+                    this.mnUncommet.Enabled =
+                    this.cmComment.Enabled =
+                    this.cmUncomment.Enabled = this.scintilla.CommentLine != "" || (this.scintilla.CommentStart != "" && this.scintilla.CommentEnd != null);
+            }
+        }
+
+        private string ShortFileName
+        { get { return Path.GetFileName(this.FileName); } }
+
+        public void SaveToFile(string fname)
+        {
+            File.WriteAllText(this.FileName, this.scintilla.Text);
+            this.scintilla.SetSavePoint();
+        }
+
+        public DialogResult Save()
+        {
+            if (this.FileName == null)
+            {
+                return this.SaveAs();
+            }
+            else
+            {
+                this.SaveToFile(this.FileName);
+                this.scintilla.SetSavePoint();
+                this.UpdateUI();
+            }
+            return DialogResult.OK;
+        }
+
+        public DialogResult SaveAs()
+        {
+            SaveFileDialog d = new SaveFileDialog();
+            d.Filter = EditorForm.EditorFileFormats.Filters;
+            d.DefaultExt = Path.GetExtension(this.FileName);
+            d.FilterIndex = EditorForm.EditorFileFormats.FindIndex("." + d.DefaultExt);
+            d.FileName = this.ShortFileName;
+            DialogResult res = d.ShowDialog();
+            if (res == DialogResult.OK)
+            {
+                this.FileName = d.FileName;
+                this.SaveToFile(this.FileName);
+                this.scintilla.SetSavePoint();
+                this.UpdateUI();
+            }
+            return res;
+        }
+
+        private void mnSave_Click(object sender, EventArgs e)
+        {
+            if (Helpers.QuestionBox("Would you like to save changes?") == DialogResult.Yes)
+            {
+                this.Save();
+            }
+        }
+
+        private void mnSaveAs_Click(object sender, EventArgs e)
+        {
+            this.SaveAs();
+        }
+
+        private void btnRun_Click(object sender, EventArgs e)
+        {
+            string text = "";
+
+            if (this.scintilla.SelectionEnd - this.scintilla.SelectionStart > 0)
+            {
+                int sl = this.scintilla.LineFromPosition(this.scintilla.SelectionStart);
+                int el = this.scintilla.LineFromPosition(this.scintilla.SelectionEnd);
+                for (int i = sl; i <= el; i++)
+                {
+                    text += this.scintilla.Lines[i].Text;
+                }
+            }
+            else
+            {
+                text = this.scintilla.Text;
+            }
+
+            this.Port.Interrupt();
+            this.Port.Interrupt();
+            this.Port.PasteMode();
+            this.Port.ReadAllLines();
+            byte[] buff = Encoding.UTF8.GetBytes(text.Replace("\r", ""));
+            this.Port.Write(buff, 0, buff.Length);
+            this.Port.SoftReset();
+        }
+
+        private void mnUndo_Click(object sender, EventArgs e)
+        {
+            this.scintilla.Undo();
+        }
+
+        private void mnRedo_Click(object sender, EventArgs e)
+        {
+            this.scintilla.Redo();
+        }
+
+        private void mnCut_Click(object sender, EventArgs e)
+        {
+            this.scintilla.Cut();
+        }
+
+        private void mnCopy_Click(object sender, EventArgs e)
+        {
+            this.scintilla.Copy();
+        }
+
+        private void mnPaste_Click(object sender, EventArgs e)
+        {
+            this.scintilla.Paste();
+        }
+
+        private void mnDelete_Click(object sender, EventArgs e)
+        {
+            this.scintilla.DeleteRange(this.scintilla.SelectionStart, this.scintilla.SelectionEnd);
+        }
+
+        private void mnSelectAll_Click(object sender, EventArgs e)
+        {
+            this.scintilla.SelectAll();
+        }
+
+        private void mnFind_Click(object sender, EventArgs e)
+        {
+
+        }
+
+        private void mnReplace_Click(object sender, EventArgs e)
+        {
+
+        }
+
+        private void EditorForm_Load(object sender, EventArgs e)
+        {
+
+        }
+
+        private void EditorForm_FormClosing(object sender, FormClosingEventArgs e)
+        {
+            if (e.CloseReason == CloseReason.UserClosing)
+            {
+                if (this.scintilla.Modified)
+                {
+                    DialogResult res = MessageBox.Show("Would you like to save the changes?", "Question", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);
+                    if (res == DialogResult.Cancel)
+                    {
+                        e.Cancel = true;
+                        return;
+                    }
+
+                    if (res == DialogResult.Yes)
+                    {
+                        if (this.Save() != DialogResult.OK)
+                        {
+                            e.Cancel = true;
+                            return;
+                        }
+                    }
+                }
+                this.Port = null;
+            }
+        }
+
+        public void UpdateUI()
+        {
+
+            this.btnUpload.Enabled = this.Port != null
+                && this.Port.IsOpen && !this.Port.Busy;
+
+            this.btnRun.Enabled = this.IsRunnable;
+
+            this.scintilla.Margins[0].Width = this.scintilla.TextWidth(Style.LineNumber, " " + (this.scintilla.Lines.Count + 1).ToString());
+
+            this.mnSave.Enabled =
+              this.btnSave.Enabled = this.scintilla.Modified;
+
+            this.mnSelectAll.Enabled =
+                this.cmSelectAll.Enabled =
+                this.btnPylint.Enabled = this.scintilla.TextLength > 0;
+
+            this.mnFind.Enabled =
+                this.cmFind.Enabled =
+                this.mnReplace.Enabled =
+                this.cmReplace.Enabled = false;
+
+            this.mnUndo.Enabled =
+                this.cmUndo.Enabled =
+                this.btnUndo.Enabled = this.scintilla.CanUndo;
+
+            this.mnRedo.Enabled =
+                this.cmRedo.Enabled =
+                this.btnRedo.Enabled = this.scintilla.CanRedo;
+
+            this.btnPaste.Enabled =
+                  this.mnPaste.Enabled =
+                  this.cmPaste.Enabled = this.CanPaste;
+
+            this.mnCut.Enabled =
+                this.mnCopy.Enabled =
+                this.mnDelete.Enabled =
+                this.cmCut.Enabled =
+                this.cmCopy.Enabled =
+                this.cmDelete.Enabled =
+                this.btnCut.Enabled =
+                this.btnCopy.Enabled =
+                this.scintilla.SelectionEnd > this.scintilla.SelectionStart;
+        }
+
+        private void UpdateUI(object sender, UpdateUIEventArgs e)
+        {
+            this.UpdateUI();
+        }
+
+        private void mnShowEOL_Click(object sender, EventArgs e)
+        {
+            bool visible = !this.EOLVisible;
+            Properties.Settings.Default.EolVisible = visible;
+            foreach (Form form in Application.OpenForms)
+            {
+                if (form is EditorForm)
+                    (form as EditorForm).EOLVisible = visible;
+            }
+        }
+
+        private void mnShowWhitespace_Click(object sender, EventArgs e)
+        {
+            bool visible = !this.WhitespaceVisible;
+            Properties.Settings.Default.WhitespaceVisible = visible;
+            foreach (Form form in Application.OpenForms)
+            {
+                if (form is EditorForm)
+                    (form as EditorForm).WhitespaceVisible = visible;
+            }
+        }
+
+        public bool EOLVisible
+        {
+            get { return this.scintilla.ViewEol; }
+            set
+            {
+                this.scintilla.ViewEol = value;
+
+                this.mnShowEol.Checked = value;
+                this.cmShowEOL.Checked = value;
+            }
+        }
+
+        public bool WhitespaceVisible
+        {
+            get { return this.scintilla.ViewWhitespace == WhitespaceMode.VisibleAlways; }
+            set
+            {
+                if (value)
+                    this.scintilla.ViewWhitespace = WhitespaceMode.VisibleAlways;
+                else
+                    this.scintilla.ViewWhitespace = WhitespaceMode.Invisible;
+
+                this.mnShowWhitespace.Checked = value;
+                this.cmShowWhitespace.Checked = value;
+            }
+        }
+
+        private void mnComment_Click(object sender, EventArgs e)
+        {
+            int ss = this.scintilla.SelectionStart;
+            int se = this.scintilla.SelectionEnd;
+            bool selected = se > ss;
+
+            string cs = this.scintilla.CommentLine;
+            string ce = "";
+            if (cs == "")
+            {
+                cs = this.scintilla.CommentStart;
+                ce = this.scintilla.CommentEnd;
+            }
+
+            int ls = this.scintilla.LineFromPosition(ss);
+            int le = this.scintilla.LineFromPosition(se);
+            for (int i = le; i >= ls; i--)
+            {
+                Line line = this.scintilla.Lines[i];
+                int end = line.EndPosition;
+
+                int j = line.Position;
+                for (; j < line.EndPosition; j++)
+                {
+                    if (scintilla.Text[j] == '\r' || this.scintilla.Text[j] == '\n')
+                        break;
+                }
+                if (j > line.Position)
+                {
+                    this.scintilla.InsertText(j, ce);
+                    this.scintilla.InsertText(line.Position, cs);
+                    se += ce.Length + cs.Length;
+                }
+
+            }
+
+            if (selected)
+            {
+                this.scintilla.SelectionStart = ss;
+                this.scintilla.SelectionEnd = se;
+                this.scintilla.CurrentPosition = se;
+            }
+            else this.scintilla.GotoPosition(se);
+        }
+
+        private void mnUncommet_Click(object sender, EventArgs e)
+        {
+            int ss = this.scintilla.SelectionStart;
+            int se = this.scintilla.SelectionEnd;
+            bool selected = se > ss;
+
+            int ls = this.scintilla.LineFromPosition(ss);
+            int le = this.scintilla.LineFromPosition(se);
+
+            string cs = this.scintilla.CommentLine;
+            string ce = "";
+            if (cs == "")
+            {
+                cs = this.scintilla.CommentStart;
+                ce = this.scintilla.CommentEnd;
+            }
+
+            for (int i = ls; i <= le; i++)
+            {
+                Line line = this.scintilla.Lines[i];
+
+                int ep = line.EndPosition - ce.Length;
+                for (; ep > line.Position; ep--)
+                {
+                    if (scintilla.Text.Substring(ep, ce.Length) == ce)
+                    {
+                        scintilla.DeleteRange(ep, ce.Length);
+                        se -= ce.Length;
+                        break;
+                    }
+                }
+
+                for (int sp = line.Position; sp < line.EndPosition - cs.Length; sp++)
+                {
+                    if (scintilla.Text.Substring(sp, cs.Length) == cs)
+                    {
+                        scintilla.DeleteRange(sp, cs.Length);
+                        se -= cs.Length;
+
+                    }
+                }
+            }
+            this.scintilla.SelectionStart = ss;
+            this.scintilla.SelectionEnd = se;
+            this.scintilla.CurrentPosition = se;
+        }
+
+        public void ActiveContentChanged()
+        {
+            this.scintilla.Focus();
+        }
+
+        private void scintilla_MouseDown(object sender, MouseEventArgs e)
+        {
+            if (e.Button == MouseButtons.Right)
+                this.scintilla.Focus();
+        }
+
+        private void scintilla_SavePointLeft(object sender, EventArgs e)
+        {
+            this.Text = this.ShortFileName + "*";
+        }
+
+        private void scintilla_SavePointReached(object sender, EventArgs e)
+        {
+            this.Text = this.ShortFileName;
+        }
+
+        private void btnUpload_Click(object sender, EventArgs e)
+        {
+            Globals.Terminal.Locked = true;
+            this.Port.Sync(true);
+            this.Port.Clean();
+
+            ProgressDialog d = new ProgressDialog();
+            d.Port = this.Port;
+            d.Mode = ProgressDialog.Modes.Upload;
+            d.FileName = this.ShortFileName;
+            d.Buffer = Encoding.UTF8.GetBytes(this.scintilla.Text);
+            d.ShowDialog();
+            d.Dispose();
+
+            this.Port.Clean();
+            this.Port.Sync(false);
+            Globals.Terminal.Locked = false;
+        }
+
+        private void btnHelp_Click(object sender, EventArgs e)
+        {
+            if (this.Port != null)
+            {
+                string text = this.scintilla.SelectedText;
+                if (text == "")
+                    text = this.scintilla.GetWordFromPosition(this.scintilla.CurrentPosition);
+
+                this.Port.Dir(text);
+            }
+        }
+
+
+        //private Line CurrentLine
+        //{ get { return this.scintilla.Lines[this.scintilla.CurrentLine]; } }
+        //private string GetWholeWord(int pos)
+        //{
+        //    string res = "";
+        //    for (int i = this.CurrentLine.Position; i < this.scintilla.CurrentLine; i++)
+        //    {
+        //        char c = this.CurrentLine.Text[i];
+        //        if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == '.' || c == '_')
+        //        {
+        //            res += c;
+        //        }
+        //    }
+        //    return res;
+        //}
+
+        //private ToolTip FTooltip = null;
+        //private ToolTip Tooltip
+        //{ get { return this.FTooltip; }
+        //    set
+        //    {
+        //        if (this.FTooltip != null)
+        //        {
+        //            this.FTooltip.Dispose();
+        //            this.FTooltip = null;
+        //        }
+
+        //        this.FTooltip = value;
+        //        if (this.FTooltip != null)
+        //        {
+        //            //this.FTooltip.Cap
+        //        }
+        //    }
+        //}
+
+        //private CompletionForm FCompletionForm = null;
+        //private CompletionForm CompletionForm
+        //{ get { return this.FCompletionForm; }
+
+        //    set
+        //    {
+        //        if (this.FCompletionForm != null)
+        //        {
+        //            this.FCompletionForm.Dispose();
+        //            this.FCompletionForm = null;
+        //        }
+
+        //        this.FCompletionForm = value;                
+        //    }
+        //}
+
+
+        //public void ShowCompletions(List<BaseDefinition> list, Words words)
+        //{
+            
+        //    //if (this.CompletionForm != null)
+        //    //{
+        //    //    this.CompletionForm.Dispose();
+        //    //    this.CompletionForm = null;
+        //    //}
+        //    //this.CompletionForm = new CompletionListBox(this.scintilla);
+        //    //this.CompletionForm.Words = words;
+        //    //this.CompletionForm.Definitions = list;
+        //    //this.CompletionForm.Show();
+        //    ////AutoCompletion ac = new AutoCompletion(this.scintilla);
+        //    ////ac.Show();
+        //}
+
+        //private CompletionListBox CompletionForm = null;
+        //protected override bool ProcessCmdKey(ref Message msg, Keys key)
+        //{
+        //    const int WM_KEYDOWN = 0x100;
+        //    const int WM_SYSKEYDOWN = 0x104;
+
+        //    if (this.scintilla.CallTipActive && this.CompletionForm == null)
+        //    {
+        //        this.scintilla.CallTipCancel();
+
+        //    }
+
+        //    if (msg.Msg == WM_KEYDOWN || msg.Msg == WM_SYSKEYDOWN)
+        //    {
+        //        if (key == (Keys.Control | Keys.Space))
+        //        {
+        //            this.Completions("");
+        //            return true;
+        //        }
+        //    }
+
+        //    return base.ProcessCmdKey(ref msg, key);
+        //    //if (this.Port != null)
+        //    {
+        //        if (msg.Msg == WM_KEYDOWN || msg.Msg == WM_SYSKEYDOWN)
+        //        {
+        //            if (key == (Keys.Control | Keys.Space))
+        //            {
+        //                this.Completions("");
+        //                return true;
+        //            }
+
+        //            switch (key)
+        //            {
+                        
+        //                case Keys.Up:
+        //                    if (this.CompletionForm.Visible)
+        //                    {
+        //                        this.CompletionForm.SelectPreviousItem();
+        //                        return true;
+        //                    }
+        //                    break;
+
+        //                case Keys.Down:
+        //                    if (this.CompletionForm.Visible)
+        //                    {
+        //                        this.CompletionForm.SelectNextItem();
+        //                        return true;
+        //                    }
+        //                    break;
+
+        //                case Keys.Enter:
+        //                case Keys.Tab:
+        //                    BaseDefinition def = this.CompletionForm.SelectedDefinition;
+        //                    string insert = "";
+        //                    if (def is Completion)
+        //                    {
+        //                        insert = (def as Completion).complete;
+        //                    }
+        //                    this.scintilla.InsertText(this.scintilla.CurrentPosition, insert);
+        //                    this.scintilla.GotoPosition(this.scintilla.CurrentPosition + insert.Length);
+        //                    this.CompletionForm.Hide();
+        //                    return true;
+
+        //                case Keys.Escape:
+        //                    this.CompletionForm.Hide();
+        //                    return true;
+        //            }
+        //        }
+        //    }
+
+        //    return base.ProcessCmdKey(ref msg, key);
+        //}
+
+               
+
+        //private void Completions(string pattern)
+        //{
+        //    Line line = this.scintilla.Lines[this.scintilla.CurrentLine];
+        //    int l = this.scintilla.CurrentLine + 1;
+        //    int c = this.scintilla.CurrentPosition - line.Position;
+
+        //    Words words = TextHelper.FindWords(line.Text, c-1);
+        //    c = Math.Min(words.Pos+1, c);
+
+        //    Console.WriteLine($"WORD: {words.Word} FILTER: {words.Filter} COLUMN:{words.Pos}");
+
+        //    Script script = new Script(this.scintilla.Text, l, c);
+
+        //    PyRequest req = new CompletionRequest(script);
+        //    string json = JsonConvert.SerializeObject(req);
+        //    try
+        //    {
+        //        string res = Globals.PyClient.GetJedi(json);
+        //        File.WriteAllText("log.txt", res);
+
+        //        JToken token = JObject.Parse(res);
+
+        //        if (token != null && token["completions"] is JArray)
+        //        {
+        //            JArray items = token["completions"] as JArray;
+        //            List<BaseDefinition> list = new List<BaseDefinition>();
+
+        //            foreach (JToken t in items)
+        //            {
+        //                BaseDefinition def = JsonConvert.DeserializeObject<Completion>(t.ToString());
+
+        //                if (def != null)
+        //                    list.Add(def);
+        //            }
+
+        //            if (list.Count > 0)
+        //            {
+        //                this.ShowCompletions(list, words);
+
+        //                //this.scintilla.AutoCComplete();
+
+        //                //string words = "";
+        //                //string sep = "";
+
+        //                //foreach (BaseDefinition def in list)
+        //                //{
+        //                //    words += sep + def.name;
+        //                //    sep = " ";
+        //                //}
+
+        //                //this.scintilla.AutoCShow(1, words);
+
+        //            }
+        //            else
+        //            {
+        //                //this.scintilla.AutoC
+        //                //this.scintilla.AutoCMaxHeight = 12;
+        //                //this.scintilla.AutoCMaxWidth = 48;
+        //                //this.scintilla.CallTipSetPosition(true);
+        //                this.scintilla.CallTipShow(this.scintilla.CurrentPosition, "No suggestions");
+        //            }
+        //        }
+        //    }
+        //    catch (Exception ex)
+        //    {
+        //        Helpers.ErrorBox(ex);
+        //    }
+        //}
+
+        ////private void scintilla_CharAdded(object sender, CharAddedEventArgs e)
+        ////{
+        ////    var currentPos = scintilla.CurrentPosition;
+        ////    var wordStartPos = scintilla.WordStartPosition(currentPos, true);
+
+        ////    var lenEntered = currentPos - wordStartPos;
+        ////    if (lenEntered > 0 && this.CompletionForm == null)
+        ////    {
+        ////        if(this.CompletionForm == null)
+        ////            this.Completions("");
+        ////    }
+
+        ////}
+
+        private void btnPylint_Click(object sender, EventArgs e)
+        {
+            Globals.MainForm.btnSaveAll_Click(this, null);
+            if (Globals.ErrorListForm != null)
+            {
+                int exitcode = 0;
+                string res = Utility.Py.Run("pylint", "" + this.FileName, out exitcode);
+                if (exitcode > 0)
+                {
+                    Globals.ErrorListForm.MkList(res, this.FileName);
+                    Globals.ErrorListForm.Show(Globals.MainForm.dockPanel1);
+                }
+                else
+                {
+                    Helpers.ErrorBox(exitcode, res);
+                }
+            }
+        }
+
+
+        //public void UIStateChanged(object sender, UIChangedEventArgs e)
+        //{
+        //    this.scintilla.HideCompletions();
+        //}
+
+        //private void scintilla_MouseHover(object sender, EventArgs e)
+        //{
+        //    this.scintilla.CallTipCancel();
+
+        //    //string text = this.scintilla.C
+        //    //this.scintilla.CallTipShow(this.scintilla.CurrentPosition, "Loading");
+        //}
+
+        //private void scintilla_Click(object sender, EventArgs e)
+        //{
+        //    if (this.CompletionForm != null)
+        //    {
+        //        this.CompletionForm.Dispose();
+        //        this.CompletionForm = null;
+        //    }
+        //}
+    }
+}

+ 611 - 0
EsPy/Forms/EditorForm.resx

@@ -0,0 +1,611 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="menuStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="mnSave.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        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
+</value>
+  </data>
+  <data name="mnUndo.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        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
+        +wrSc2wWtwAAAABJRU5ErkJggg==
+</value>
+  </data>
+  <data name="mnRedo.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        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
+</value>
+  </data>
+  <data name="mnCut.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        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
+        rkJggg==
+</value>
+  </data>
+  <data name="mnCopy.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAJcEhZcwAADrwAAA68AZW8ckkAAAHHSURBVFhHxZY9asNAEEbdpEyKBFIlZarkACFX8CVc6C4q
+        3fkGBjfGWGC3KexCTQqFgAIp3BtjcOV/bebbZMWyUuKdkcAfPAyLNPM0HpAadsbjsZIQRdF7EAR3VOLi
+        p5IwKMbNfD5Xk8lEDQaDtNlsPlAZuYREYL/fqzRNtUS/3/+sJCERQDCF1WpVXaJMAGdxHLOYTqfYi49W
+        q3VPZf1F/hLgRrwXdQmI96IuAUS0F26z17cvscByudS/LIk6J4DGi8VCzWYzlSRJLkFtbolyiToF7KzX
+        ay2DWtTmibjUDd24zar8BWUZjUYQeCaudUM3PhOAFAc7nU4HAi/EjW7oxkegSsIw9BPIskyDJzirAHAF
+        3BGfwo63wPF4zDnLBExzPMFZBA6HQ445s/eCg7kP8RbAy8TgCkhB2AJ4AnNm7wUXtsBut8txBdwRn0Ik
+        sNlscsyZvRdcIIF4C+DlYTBn9l5wgQTiLWDHFSgb83+wBIbDoer1eqrb7eYYAXsvuEACOSlAuSIeCVyk
+        MQL2XnCBBOIjgC8VSOACjRHYbrdiOBMopGwvpBEJYC/a7ba+uQ6oJE+AUtiLiqAWanqnsBcVQa3fr+JG
+        4xs1dfbZaqs65wAAAABJRU5ErkJggg==
+</value>
+  </data>
+  <data name="mnPaste.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        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
+</value>
+  </data>
+  <metadata name="contextMenuStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>237, 17</value>
+  </metadata>
+  <data name="cmUndo.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        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
+        +wrSc2wWtwAAAABJRU5ErkJggg==
+</value>
+  </data>
+  <data name="cmRedo.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        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
+</value>
+  </data>
+  <data name="cmCut.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        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
+        rkJggg==
+</value>
+  </data>
+  <data name="cmCopy.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAJcEhZcwAADrwAAA68AZW8ckkAAAHHSURBVFhHxZY9asNAEEbdpEyKBFIlZarkACFX8CVc6C4q
+        3fkGBjfGWGC3KexCTQqFgAIp3BtjcOV/bebbZMWyUuKdkcAfPAyLNPM0HpAadsbjsZIQRdF7EAR3VOLi
+        p5IwKMbNfD5Xk8lEDQaDtNlsPlAZuYREYL/fqzRNtUS/3/+sJCERQDCF1WpVXaJMAGdxHLOYTqfYi49W
+        q3VPZf1F/hLgRrwXdQmI96IuAUS0F26z17cvscByudS/LIk6J4DGi8VCzWYzlSRJLkFtbolyiToF7KzX
+        ay2DWtTmibjUDd24zar8BWUZjUYQeCaudUM3PhOAFAc7nU4HAi/EjW7oxkegSsIw9BPIskyDJzirAHAF
+        3BGfwo63wPF4zDnLBExzPMFZBA6HQ445s/eCg7kP8RbAy8TgCkhB2AJ4AnNm7wUXtsBut8txBdwRn0Ik
+        sNlscsyZvRdcIIF4C+DlYTBn9l5wgQTiLWDHFSgb83+wBIbDoer1eqrb7eYYAXsvuEACOSlAuSIeCVyk
+        MQL2XnCBBOIjgC8VSOACjRHYbrdiOBMopGwvpBEJYC/a7ba+uQ6oJE+AUtiLiqAWanqnsBcVQa3fr+JG
+        4xs1dfbZaqs65wAAAABJRU5ErkJggg==
+</value>
+  </data>
+  <data name="cmPaste.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        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
+</value>
+  </data>
+  <metadata name="toolStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>132, 17</value>
+  </metadata>
+  <data name="btnSave.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        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
+</value>
+  </data>
+  <data name="btnUndo.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        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
+        RK5CYII=
+</value>
+  </data>
+  <data name="btnRedo.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        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
+</value>
+  </data>
+  <data name="btnCut.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        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
+</value>
+  </data>
+  <data name="btnCopy.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHHSURBVFhHxZY9asNAEEbdpEyKBFIlZarkACFX8CVc6C4q
+        3fkGBjfGWGC3KexCTQqFgAIp3BtjcOV/bebbZMWyUuKdkcAfPAyLNPM0HpAadsbjsZIQRdF7EAR3VOLi
+        p5IwKMbNfD5Xk8lEDQaDtNlsPlAZuYREYL/fqzRNtUS/3/+sJCERQDCF1WpVXaJMAGdxHLOYTqfYi49W
+        q3VPZf1F/hLgRrwXdQmI96IuAUS0F26z17cvscByudS/LIk6J4DGi8VCzWYzlSRJLkFtbolyiToF7KzX
+        ay2DWtTmibjUDd24zar8BWUZjUYQeCaudUM3PhOAFAc7nU4HAi/EjW7oxkegSsIw9BPIskyDJzirAHAF
+        3BGfwo63wPF4zDnLBExzPMFZBA6HQ445s/eCg7kP8RbAy8TgCkhB2AJ4AnNm7wUXtsBut8txBdwRn0Ik
+        sNlscsyZvRdcIIF4C+DlYTBn9l5wgQTiLWDHFSgb83+wBIbDoer1eqrb7eYYAXsvuEACOSlAuSIeCVyk
+        MQL2XnCBBOIjgC8VSOACjRHYbrdiOBMopGwvpBEJYC/a7ba+uQ6oJE+AUtiLiqAWanqnsBcVQa3fr+JG
+        4xs1dfbZaqs65wAAAABJRU5ErkJggg==
+</value>
+  </data>
+  <data name="btnPaste.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        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
+</value>
+  </data>
+  <metadata name="$this.TrayHeight" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>41</value>
+  </metadata>
+</root>

+ 175 - 0
EsPy/Forms/ErrorListForm.Designer.cs

@@ -0,0 +1,175 @@
+namespace EsPy.Forms
+{
+    partial class ErrorListForm
+    {
+        /// <summary>
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary>
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Windows Form Designer generated code
+
+        /// <summary>
+        /// Required method for Designer support - do not modify
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.components = new System.ComponentModel.Container();
+            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ErrorListForm));
+            this.toolStrip1 = new System.Windows.Forms.ToolStrip();
+            this.btnErrors = new System.Windows.Forms.ToolStripButton();
+            this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
+            this.btnWarnings = new System.Windows.Forms.ToolStripButton();
+            this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();
+            this.btnMessages = new System.Windows.Forms.ToolStripButton();
+            this.listView1 = new System.Windows.Forms.ListView();
+            this.imageList1 = new System.Windows.Forms.ImageList(this.components);
+            this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+            this.columnHeader2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+            this.columnHeader3 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+            this.toolStrip1.SuspendLayout();
+            this.SuspendLayout();
+            // 
+            // toolStrip1
+            // 
+            this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.btnErrors,
+            this.toolStripSeparator1,
+            this.btnWarnings,
+            this.toolStripSeparator2,
+            this.btnMessages});
+            this.toolStrip1.Location = new System.Drawing.Point(0, 0);
+            this.toolStrip1.Name = "toolStrip1";
+            this.toolStrip1.Size = new System.Drawing.Size(666, 25);
+            this.toolStrip1.TabIndex = 0;
+            this.toolStrip1.Text = "toolStrip1";
+            // 
+            // btnErrors
+            // 
+            this.btnErrors.Checked = true;
+            this.btnErrors.CheckState = System.Windows.Forms.CheckState.Checked;
+            this.btnErrors.Image = global::EsPy.Properties.Resources.error16;
+            this.btnErrors.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
+            this.btnErrors.ImageTransparentColor = System.Drawing.Color.Magenta;
+            this.btnErrors.Name = "btnErrors";
+            this.btnErrors.Size = new System.Drawing.Size(57, 22);
+            this.btnErrors.Text = "Errors";
+            // 
+            // toolStripSeparator1
+            // 
+            this.toolStripSeparator1.Name = "toolStripSeparator1";
+            this.toolStripSeparator1.Size = new System.Drawing.Size(6, 25);
+            // 
+            // btnWarnings
+            // 
+            this.btnWarnings.Checked = true;
+            this.btnWarnings.CheckState = System.Windows.Forms.CheckState.Checked;
+            this.btnWarnings.Image = global::EsPy.Properties.Resources.Warning;
+            this.btnWarnings.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
+            this.btnWarnings.ImageTransparentColor = System.Drawing.Color.Magenta;
+            this.btnWarnings.Name = "btnWarnings";
+            this.btnWarnings.Size = new System.Drawing.Size(77, 22);
+            this.btnWarnings.Text = "Warnings";
+            // 
+            // toolStripSeparator2
+            // 
+            this.toolStripSeparator2.Name = "toolStripSeparator2";
+            this.toolStripSeparator2.Size = new System.Drawing.Size(6, 25);
+            // 
+            // btnMessages
+            // 
+            this.btnMessages.Checked = true;
+            this.btnMessages.CheckState = System.Windows.Forms.CheckState.Checked;
+            this.btnMessages.Image = global::EsPy.Properties.Resources.info;
+            this.btnMessages.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
+            this.btnMessages.ImageTransparentColor = System.Drawing.Color.Magenta;
+            this.btnMessages.Name = "btnMessages";
+            this.btnMessages.Size = new System.Drawing.Size(78, 22);
+            this.btnMessages.Text = "Messages";
+            // 
+            // listView1
+            // 
+            this.listView1.AutoArrange = false;
+            this.listView1.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+            this.columnHeader1,
+            this.columnHeader2,
+            this.columnHeader3});
+            this.listView1.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.listView1.FullRowSelect = true;
+            this.listView1.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable;
+            this.listView1.Location = new System.Drawing.Point(0, 25);
+            this.listView1.Name = "listView1";
+            this.listView1.Size = new System.Drawing.Size(666, 174);
+            this.listView1.SmallImageList = this.imageList1;
+            this.listView1.TabIndex = 1;
+            this.listView1.UseCompatibleStateImageBehavior = false;
+            this.listView1.View = System.Windows.Forms.View.Details;
+            this.listView1.DoubleClick += new System.EventHandler(this.listView1_DoubleClick);
+            // 
+            // imageList1
+            // 
+            this.imageList1.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageList1.ImageStream")));
+            this.imageList1.TransparentColor = System.Drawing.Color.Transparent;
+            this.imageList1.Images.SetKeyName(0, "error16.png");
+            this.imageList1.Images.SetKeyName(1, "Warning.png");
+            this.imageList1.Images.SetKeyName(2, "info.png");
+            // 
+            // columnHeader1
+            // 
+            this.columnHeader1.Text = "";
+            this.columnHeader1.Width = 30;
+            // 
+            // columnHeader2
+            // 
+            this.columnHeader2.Text = "Message";
+            this.columnHeader2.Width = 540;
+            // 
+            // columnHeader3
+            // 
+            this.columnHeader3.Text = "Module";
+            // 
+            // ErrorListForm
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.ClientSize = new System.Drawing.Size(666, 199);
+            this.Controls.Add(this.listView1);
+            this.Controls.Add(this.toolStrip1);
+            this.Name = "ErrorListForm";
+            this.Text = "Error List";
+            this.toolStrip1.ResumeLayout(false);
+            this.toolStrip1.PerformLayout();
+            this.ResumeLayout(false);
+            this.PerformLayout();
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.ToolStrip toolStrip1;
+        private System.Windows.Forms.ListView listView1;
+        private System.Windows.Forms.ToolStripButton btnErrors;
+        private System.Windows.Forms.ToolStripSeparator toolStripSeparator1;
+        private System.Windows.Forms.ToolStripButton btnWarnings;
+        private System.Windows.Forms.ToolStripSeparator toolStripSeparator2;
+        private System.Windows.Forms.ToolStripButton btnMessages;
+        private System.Windows.Forms.ImageList imageList1;
+        private System.Windows.Forms.ColumnHeader columnHeader1;
+        private System.Windows.Forms.ColumnHeader columnHeader2;
+        private System.Windows.Forms.ColumnHeader columnHeader3;
+    }
+}

+ 104 - 0
EsPy/Forms/ErrorListForm.cs

@@ -0,0 +1,104 @@
+using ScintillaNET;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+using WeifenLuo.WinFormsUI.Docking;
+
+namespace EsPy.Forms
+{
+    public partial class ErrorListForm : DockContent
+    {
+        public ErrorListForm()
+        {
+            InitializeComponent();
+            this.DockAreas = DockAreas.DockBottom | DockAreas.DockLeft | DockAreas.DockRight | DockAreas.DockTop
+               | DockAreas.Document;
+                   
+            this.HideOnClose = true;
+        }
+
+        public void MkList(string list, string filename)
+        {
+            this.listView1.Items.Clear();
+            string[] lines = list.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.None);
+            string module = "";
+            for(int i = 0; i < lines.Length-1; i++)
+            {
+                if (lines[i + 1] == "")
+                    return;
+
+                string line = lines[i];
+                if (line.StartsWith("************* Module "))
+                {
+                    module = line.Remove(0, "************* Module ".Length) + ".py";
+                    continue;
+                }
+
+                ErrorItem ei = new ErrorItem(filename, line);
+                ListViewItem item = new ListViewItem();
+                if (ei.MsgType == "E" || ei.MsgType == "F")
+                    item.ImageIndex = 0;
+                else item.ImageIndex = 1;
+                item.SubItems.Add(ei.Desc);
+                item.SubItems.Add(Path.GetFileName(ei.FileName));
+                item.Tag = ei;
+                this.listView1.Items.Add(item);
+
+
+            }
+            this.listView1.Columns[1].Width = -2; // .AutoResizeColumn(1, -2);
+            //this.listView1.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent );
+        }
+
+        private void listView1_DoubleClick(object sender, EventArgs e)
+        {
+            if (this.listView1.SelectedItems.Count > 0)
+            {
+                ErrorItem ei = (this.listView1.SelectedItems[0].Tag as ErrorItem);
+
+                IDocument doc = Globals.MainForm.FindDocument(ei.FileName);
+                if(doc == null)
+                    doc =Globals.MainForm.OpenFromFile(ei.FileName, EditorForm.EditorFileFormats);
+
+                if (doc != null)
+
+                if (doc is EditorForm)
+                {
+                        //(doc as EditorForm).Show(Globals.MainForm.dockPanel1);
+
+                        Scintilla s = (doc as EditorForm).scintilla;
+                    Line line = s.Lines[ei.Line-1];
+                        
+                    s.GotoPosition(line.Position + ei.Column);
+                        s.Focus();
+                }
+            }
+        }
+    }
+
+    public class ErrorItem
+    {
+        public string FileName = "";
+        public string MsgType = "";
+        public int Line = 0;
+        public int Column = 0;
+        public string Desc = "";
+
+        public ErrorItem(string filename, string line)
+        {
+            this.FileName = filename;
+            this.MsgType = line.Substring(0, 1);
+            int.TryParse(line.Substring(2, 3), out this.Line);
+            int.TryParse(line.Substring(6, 2), out this.Column);
+            this.Desc = line.Substring(10, line.Length - 10);
+        }
+
+    }
+}

+ 178 - 0
EsPy/Forms/ErrorListForm.resx

@@ -0,0 +1,178 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="toolStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+  <metadata name="imageList1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>122, 17</value>
+  </metadata>
+  <data name="imageList1.ImageStream" mimetype="application/x-microsoft.net.object.binary.base64">
+    <value>
+        AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
+        LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
+        ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAABU
+        CgAAAk1TRnQBSQFMAgEBAwEAAQgBAAEIAQABEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
+        AwABQAMAARADAAEBAQABCAYAAQQYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA
+        AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5
+        AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA
+        AWYDAAGZAwABzAIAATMDAAIzAgABMwFmAgABMwGZAgABMwHMAgABMwH/AgABZgMAAWYBMwIAAmYCAAFm
+        AZkCAAFmAcwCAAFmAf8CAAGZAwABmQEzAgABmQFmAgACmQIAAZkBzAIAAZkB/wIAAcwDAAHMATMCAAHM
+        AWYCAAHMAZkCAALMAgABzAH/AgAB/wFmAgAB/wGZAgAB/wHMAQABMwH/AgAB/wEAATMBAAEzAQABZgEA
+        ATMBAAGZAQABMwEAAcwBAAEzAQAB/wEAAf8BMwIAAzMBAAIzAWYBAAIzAZkBAAIzAcwBAAIzAf8BAAEz
+        AWYCAAEzAWYBMwEAATMCZgEAATMBZgGZAQABMwFmAcwBAAEzAWYB/wEAATMBmQIAATMBmQEzAQABMwGZ
+        AWYBAAEzApkBAAEzAZkBzAEAATMBmQH/AQABMwHMAgABMwHMATMBAAEzAcwBZgEAATMBzAGZAQABMwLM
+        AQABMwHMAf8BAAEzAf8BMwEAATMB/wFmAQABMwH/AZkBAAEzAf8BzAEAATMC/wEAAWYDAAFmAQABMwEA
+        AWYBAAFmAQABZgEAAZkBAAFmAQABzAEAAWYBAAH/AQABZgEzAgABZgIzAQABZgEzAWYBAAFmATMBmQEA
+        AWYBMwHMAQABZgEzAf8BAAJmAgACZgEzAQADZgEAAmYBmQEAAmYBzAEAAWYBmQIAAWYBmQEzAQABZgGZ
+        AWYBAAFmApkBAAFmAZkBzAEAAWYBmQH/AQABZgHMAgABZgHMATMBAAFmAcwBmQEAAWYCzAEAAWYBzAH/
+        AQABZgH/AgABZgH/ATMBAAFmAf8BmQEAAWYB/wHMAQABzAEAAf8BAAH/AQABzAEAApkCAAGZATMBmQEA
+        AZkBAAGZAQABmQEAAcwBAAGZAwABmQIzAQABmQEAAWYBAAGZATMBzAEAAZkBAAH/AQABmQFmAgABmQFm
+        ATMBAAGZATMBZgEAAZkBZgGZAQABmQFmAcwBAAGZATMB/wEAApkBMwEAApkBZgEAA5kBAAKZAcwBAAKZ
+        Af8BAAGZAcwCAAGZAcwBMwEAAWYBzAFmAQABmQHMAZkBAAGZAswBAAGZAcwB/wEAAZkB/wIAAZkB/wEz
+        AQABmQHMAWYBAAGZAf8BmQEAAZkB/wHMAQABmQL/AQABzAMAAZkBAAEzAQABzAEAAWYBAAHMAQABmQEA
+        AcwBAAHMAQABmQEzAgABzAIzAQABzAEzAWYBAAHMATMBmQEAAcwBMwHMAQABzAEzAf8BAAHMAWYCAAHM
+        AWYBMwEAAZkCZgEAAcwBZgGZAQABzAFmAcwBAAGZAWYB/wEAAcwBmQIAAcwBmQEzAQABzAGZAWYBAAHM
+        ApkBAAHMAZkBzAEAAcwBmQH/AQACzAIAAswBMwEAAswBZgEAAswBmQEAA8wBAALMAf8BAAHMAf8CAAHM
+        Af8BMwEAAZkB/wFmAQABzAH/AZkBAAHMAf8BzAEAAcwC/wEAAcwBAAEzAQAB/wEAAWYBAAH/AQABmQEA
+        AcwBMwIAAf8CMwEAAf8BMwFmAQAB/wEzAZkBAAH/ATMBzAEAAf8BMwH/AQAB/wFmAgAB/wFmATMBAAHM
+        AmYBAAH/AWYBmQEAAf8BZgHMAQABzAFmAf8BAAH/AZkCAAH/AZkBMwEAAf8BmQFmAQAB/wKZAQAB/wGZ
+        AcwBAAH/AZkB/wEAAf8BzAIAAf8BzAEzAQAB/wHMAWYBAAH/AcwBmQEAAf8CzAEAAf8BzAH/AQAC/wEz
+        AQABzAH/AWYBAAL/AZkBAAL/AcwBAAJmAf8BAAFmAf8BZgEAAWYC/wEAAf8CZgEAAf8BZgH/AQAC/wFm
+        AQABIQEAAaUBAANfAQADdwEAA4YBAAOWAQADywEAA7IBAAPXAQAD3QEAA+MBAAPqAQAD8QEAA/gBAAHw
+        AfsB/wEAAaQCoAEAA4ADAAH/AgAB/wMAAv8BAAH/AwAB/wEAAf8BAAL/AgAD/wYAAf8B9QLzAfUB/xkA
+        AQkBtASsAbQBCRgAARsBbwRGAW8B8wQAAe8O7AHvAgAB9AGzBKwBigOsAbMB9BQAAf8BmQFGBhcBRgGZ
+        Af8CAAH3AfUN/wH3AQAB9AGzBKwFigGsAa0B9BMAARoJFwFGARoCAAHwAQcBmgQ4ARUBUQH7AV4C5QHD
+        AQcB8AEAAbMErATwA4oBrAG0EgAB/wFGAhcBRgQXAUYCFwFGAf8CAAGSAfYBWQM4ARUB6gL7AV4B5QH2
+        AewBAAEZBqwBGgHwAYoCrAKKAawBCREAARoDFwHzAXQCFwF0AfMDFwEaAgAB8wEHAZoFOAP7AaABBwH0
+        AQAB1QasARsBGgGKA6wBigGsAbQRAAFvAxcBlAH0AnQB9AGUAxcBdAMAAe8BGwFZAjgBEAETATgB+wFe
+        ARsB7wIAB6wCGwGKBKwBigGsEQABbwQXAZMC9AGTBBcBbwMAAf8B9wHDAVgBWQEOAUMCOAHDAZIB/wIA
+        B6wCGwGKBKwBigGsEQABbwQXAZMC9AGTBBcBbwQAAfAB8wJYAg4BegHlAfMBBwMAB6wCGwGKBawBihEA
+        AZMDFwGTAfQClAH0AXQDFwGUBQAB9wEbAVICEAFZARsB9wQAAdMDzQKsAxsHrBEAAfQDFwHzAZQCFwGU
+        AfMDFwH1BQAB8gG8AXkBDwEQAZoBvAHyBAAB1QTNA6wCigWsAbQSAAEWChcBkwcAAe8B9AFYAVkB9AH3
+        BQABGQLTA80BrAIbAYoFrAEJEgAB/wFvCBcBbwH/BwAB/wG8AXQBegG8AfQGAAHUAtMDzQIbBawBtBQA
+        Af8BlAYXAZQB/wkAAQcC8QEHBwAB9AHUAtMCzQasAbMB9BYAAfQBGgKUARoB9QsAAf8B9wGSAf8IAAH0
+        AdQC0wHNBawBswH0NgABGQHVAdMBzQKsAbQBGRQAAUIBTQE+BwABPgMAASgDAAFAAwABEAMAAQEBAAEB
+        BQABgBcAA/8BAAH4AR8C/wHwAQ8CAAHwAQ8CAAHAAQMCAAHAAQMCAAGAAQECAAHAAQMCAAGAAQECAAGA
+        AQEBgAEBBAABgAEBAYABAQQAAYABAQHAAQMEAAGAAQEBwAEDBAABgAEBAeABBwQAAYABAQHwAQ8EAAGA
+        AQEB8AEPBAABwAEDAfgBHwQAAcABAwH4AR8BgAEBAgAB4AEHAfwBPwGAAQECAAH4AR8B/AE/AcABAwIA
+        BP8B8AEPAgAL
+</value>
+  </data>
+</root>

+ 13 - 0
EsPy/Forms/IDeviceChange.cs

@@ -0,0 +1,13 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace EsPy.Forms
+{
+    public interface IDeviceChange
+    {
+        void UpdateDevices();
+    }
+}

+ 28 - 0
EsPy/Forms/IDocument.cs

@@ -0,0 +1,28 @@
+using System.Windows.Forms;
+
+namespace EsPy.Forms
+{
+    public interface IDocument : IForm
+    {
+        string FileName
+        { get; }
+
+        bool CanSave
+        { get; }
+
+        bool Modified
+        { get; }
+
+        bool CanPaste
+        { get; set; }
+
+        string Source
+        { get; }
+
+        void LoadFromFile(string fanme);
+        DialogResult Save();
+        DialogResult SaveAs();
+
+        void UpdateUI();       
+    }
+}

+ 14 - 0
EsPy/Forms/IForm.cs

@@ -0,0 +1,14 @@
+using System.Windows.Forms;
+
+namespace EsPy.Forms
+{
+    public interface IForm
+    {
+        ToolStrip ToolStrip
+        { get; }
+
+        ToolStrip MenuStrip
+        { get; }
+
+    }
+}

+ 130 - 0
EsPy/Forms/Splash.Designer.cs

@@ -0,0 +1,130 @@
+namespace EsPy.Forms
+{
+    partial class Splash
+    {
+        /// <summary>
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary>
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Windows Form Designer generated code
+
+        /// <summary>
+        /// Required method for Designer support - do not modify
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.label1 = new System.Windows.Forms.Label();
+            this.label2 = new System.Windows.Forms.Label();
+            this.label3 = new System.Windows.Forms.Label();
+            this.button1 = new System.Windows.Forms.Button();
+            this.linkLabel1 = new System.Windows.Forms.LinkLabel();
+            this.SuspendLayout();
+            // 
+            // label1
+            // 
+            this.label1.AutoSize = true;
+            this.label1.Font = new System.Drawing.Font("Arial", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
+            this.label1.ForeColor = System.Drawing.Color.WhiteSmoke;
+            this.label1.Location = new System.Drawing.Point(8, 9);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(50, 37);
+            this.label1.TabIndex = 0;
+            this.label1.Text = "---";
+            // 
+            // label2
+            // 
+            this.label2.AutoSize = true;
+            this.label2.Font = new System.Drawing.Font("Arial", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
+            this.label2.ForeColor = System.Drawing.Color.WhiteSmoke;
+            this.label2.Location = new System.Drawing.Point(12, 131);
+            this.label2.Name = "label2";
+            this.label2.Size = new System.Drawing.Size(23, 15);
+            this.label2.TabIndex = 0;
+            this.label2.Text = "----";
+            // 
+            // label3
+            // 
+            this.label3.AutoSize = true;
+            this.label3.Font = new System.Drawing.Font("Arial", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
+            this.label3.ForeColor = System.Drawing.Color.WhiteSmoke;
+            this.label3.Location = new System.Drawing.Point(12, 55);
+            this.label3.Name = "label3";
+            this.label3.Size = new System.Drawing.Size(141, 15);
+            this.label3.TabIndex = 0;
+            this.label3.Text = "Copyright (c) Jung Ervin";
+            // 
+            // button1
+            // 
+            this.button1.DialogResult = System.Windows.Forms.DialogResult.OK;
+            this.button1.Location = new System.Drawing.Point(441, 122);
+            this.button1.Name = "button1";
+            this.button1.Size = new System.Drawing.Size(75, 23);
+            this.button1.TabIndex = 1;
+            this.button1.Text = "Close";
+            this.button1.UseVisualStyleBackColor = true;
+            // 
+            // linkLabel1
+            // 
+            this.linkLabel1.ActiveLinkColor = System.Drawing.Color.Gold;
+            this.linkLabel1.AutoSize = true;
+            this.linkLabel1.Font = new System.Drawing.Font("Arial", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
+            this.linkLabel1.LinkColor = System.Drawing.Color.Yellow;
+            this.linkLabel1.Location = new System.Drawing.Point(12, 83);
+            this.linkLabel1.Name = "linkLabel1";
+            this.linkLabel1.Size = new System.Drawing.Size(194, 15);
+            this.linkLabel1.TabIndex = 2;
+            this.linkLabel1.TabStop = true;
+            this.linkLabel1.Text = "https://github.com/jungervin/EsPy";
+            this.linkLabel1.VisitedLinkColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(0)))));
+            this.linkLabel1.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabel1_LinkClicked);
+            // 
+            // Splash
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64)))));
+            this.ClientSize = new System.Drawing.Size(528, 154);
+            this.ControlBox = false;
+            this.Controls.Add(this.linkLabel1);
+            this.Controls.Add(this.button1);
+            this.Controls.Add(this.label3);
+            this.Controls.Add(this.label2);
+            this.Controls.Add(this.label1);
+            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
+            this.MaximizeBox = false;
+            this.MinimizeBox = false;
+            this.Name = "Splash";
+            this.ShowIcon = false;
+            this.ShowInTaskbar = false;
+            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
+            this.Text = "Splash";
+            this.Load += new System.EventHandler(this.Splash_Load);
+            this.ResumeLayout(false);
+            this.PerformLayout();
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.Label label1;
+        private System.Windows.Forms.Label label3;
+        public System.Windows.Forms.Label label2;
+        private System.Windows.Forms.Button button1;
+        private System.Windows.Forms.LinkLabel linkLabel1;
+    }
+}

+ 37 - 0
EsPy/Forms/Splash.cs

@@ -0,0 +1,37 @@
+using EsPy.Python;
+using Newtonsoft.Json.Linq;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Diagnostics;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace EsPy.Forms
+{
+    public partial class Splash : Form
+    {
+        public Splash()
+        {
+            InitializeComponent();
+        }
+
+        private void Splash_Load(object sender, EventArgs e)
+        {
+            this.button1.Visible = 
+                linkLabel1.Visible = Modal;
+            this.label2.Visible = !Modal;
+            this.label1.Text = Application.ProductName + " v" + Application.ProductVersion;
+        }
+
+        private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
+        {
+            Process.Start(this.linkLabel1.Text);
+        }
+    }
+}

+ 120 - 0
EsPy/Forms/Splash.resx

@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>

+ 498 - 0
EsPy/Forms/TerminalForm.Designer.cs

@@ -0,0 +1,498 @@
+namespace EsPy.Forms
+{
+    partial class TerminalForm
+    {
+        /// <summary>
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+         
+
+        #region Windows Form Designer generated code
+
+        /// <summary>
+        /// Required method for Designer support - do not modify
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.components = new System.ComponentModel.Container();
+            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(TerminalForm));
+            this.menuStrip1 = new System.Windows.Forms.MenuStrip();
+            this.mnEdit = new System.Windows.Forms.ToolStripMenuItem();
+            this.mnUndo = new System.Windows.Forms.ToolStripMenuItem();
+            this.mnRedo = new System.Windows.Forms.ToolStripMenuItem();
+            this.toolStripMenuItem2 = new System.Windows.Forms.ToolStripSeparator();
+            this.mnCut = new System.Windows.Forms.ToolStripMenuItem();
+            this.mnCopy = new System.Windows.Forms.ToolStripMenuItem();
+            this.mnPaste = new System.Windows.Forms.ToolStripMenuItem();
+            this.mnDelete = new System.Windows.Forms.ToolStripMenuItem();
+            this.mnClean = new System.Windows.Forms.ToolStripMenuItem();
+            this.toolStripMenuItem3 = new System.Windows.Forms.ToolStripSeparator();
+            this.mnSelectAll = new System.Windows.Forms.ToolStripMenuItem();
+            this.toolStripMenuItem7 = new System.Windows.Forms.ToolStripSeparator();
+            this.mnView = new System.Windows.Forms.ToolStripMenuItem();
+            this.toolStripMenuItem4 = new System.Windows.Forms.ToolStripSeparator();
+            this.mnShowEol = new System.Windows.Forms.ToolStripMenuItem();
+            this.mnShowWhitespace = new System.Windows.Forms.ToolStripMenuItem();
+            this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();
+            this.toolStrip1 = new System.Windows.Forms.ToolStrip();
+            this.osToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+            this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components);
+            this.cmSoftReset = new System.Windows.Forms.ToolStripMenuItem();
+            this.toolStripSeparator5 = new System.Windows.Forms.ToolStripSeparator();
+            this.cmUndo = new System.Windows.Forms.ToolStripMenuItem();
+            this.cmRedo = new System.Windows.Forms.ToolStripMenuItem();
+            this.toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator();
+            this.cmCut = new System.Windows.Forms.ToolStripMenuItem();
+            this.cmCopy = new System.Windows.Forms.ToolStripMenuItem();
+            this.cmPaste = new System.Windows.Forms.ToolStripMenuItem();
+            this.cmDelete = new System.Windows.Forms.ToolStripMenuItem();
+            this.cmClean = new System.Windows.Forms.ToolStripMenuItem();
+            this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
+            this.cmSelectAll = new System.Windows.Forms.ToolStripMenuItem();
+            this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator();
+            this.advancedToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+            this.cmShowEOL = new System.Windows.Forms.ToolStripMenuItem();
+            this.cmShowWhitespace = new System.Windows.Forms.ToolStripMenuItem();
+            this.scintilla = new EsPy.Components.Terminal();
+            this.menuStrip1.SuspendLayout();
+            this.toolStrip1.SuspendLayout();
+            this.contextMenuStrip1.SuspendLayout();
+            this.SuspendLayout();
+            // 
+            // menuStrip1
+            // 
+            this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.mnEdit,
+            this.mnView});
+            this.menuStrip1.Location = new System.Drawing.Point(0, 0);
+            this.menuStrip1.Name = "menuStrip1";
+            this.menuStrip1.Size = new System.Drawing.Size(664, 24);
+            this.menuStrip1.TabIndex = 0;
+            this.menuStrip1.Text = "menuStrip1";
+            this.menuStrip1.Visible = false;
+            // 
+            // mnEdit
+            // 
+            this.mnEdit.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.mnUndo,
+            this.mnRedo,
+            this.toolStripMenuItem2,
+            this.mnCut,
+            this.mnCopy,
+            this.mnPaste,
+            this.mnDelete,
+            this.mnClean,
+            this.toolStripMenuItem3,
+            this.mnSelectAll,
+            this.toolStripMenuItem7});
+            this.mnEdit.MergeAction = System.Windows.Forms.MergeAction.MatchOnly;
+            this.mnEdit.Name = "mnEdit";
+            this.mnEdit.Size = new System.Drawing.Size(39, 20);
+            this.mnEdit.Text = "&Edit";
+            // 
+            // mnUndo
+            // 
+            this.mnUndo.Image = ((System.Drawing.Image)(resources.GetObject("mnUndo.Image")));
+            this.mnUndo.MergeAction = System.Windows.Forms.MergeAction.Insert;
+            this.mnUndo.MergeIndex = 0;
+            this.mnUndo.Name = "mnUndo";
+            this.mnUndo.ShortcutKeyDisplayString = "Ctrl+Z";
+            this.mnUndo.Size = new System.Drawing.Size(152, 22);
+            this.mnUndo.Text = "Undo";
+            // 
+            // mnRedo
+            // 
+            this.mnRedo.Image = ((System.Drawing.Image)(resources.GetObject("mnRedo.Image")));
+            this.mnRedo.MergeAction = System.Windows.Forms.MergeAction.Insert;
+            this.mnRedo.MergeIndex = 1;
+            this.mnRedo.Name = "mnRedo";
+            this.mnRedo.ShortcutKeyDisplayString = "Ctrl+Y";
+            this.mnRedo.Size = new System.Drawing.Size(152, 22);
+            this.mnRedo.Text = "Redo";
+            // 
+            // toolStripMenuItem2
+            // 
+            this.toolStripMenuItem2.MergeAction = System.Windows.Forms.MergeAction.Insert;
+            this.toolStripMenuItem2.MergeIndex = 2;
+            this.toolStripMenuItem2.Name = "toolStripMenuItem2";
+            this.toolStripMenuItem2.Size = new System.Drawing.Size(149, 6);
+            // 
+            // mnCut
+            // 
+            this.mnCut.Image = ((System.Drawing.Image)(resources.GetObject("mnCut.Image")));
+            this.mnCut.MergeAction = System.Windows.Forms.MergeAction.Insert;
+            this.mnCut.MergeIndex = 3;
+            this.mnCut.Name = "mnCut";
+            this.mnCut.ShortcutKeyDisplayString = "Ctrl+X";
+            this.mnCut.Size = new System.Drawing.Size(152, 22);
+            this.mnCut.Text = "Cut";
+            // 
+            // mnCopy
+            // 
+            this.mnCopy.Image = ((System.Drawing.Image)(resources.GetObject("mnCopy.Image")));
+            this.mnCopy.MergeAction = System.Windows.Forms.MergeAction.Insert;
+            this.mnCopy.MergeIndex = 4;
+            this.mnCopy.Name = "mnCopy";
+            this.mnCopy.ShortcutKeyDisplayString = "";
+            this.mnCopy.Size = new System.Drawing.Size(152, 22);
+            this.mnCopy.Text = "Copy";
+            // 
+            // mnPaste
+            // 
+            this.mnPaste.Enabled = false;
+            this.mnPaste.Image = ((System.Drawing.Image)(resources.GetObject("mnPaste.Image")));
+            this.mnPaste.MergeAction = System.Windows.Forms.MergeAction.Insert;
+            this.mnPaste.MergeIndex = 5;
+            this.mnPaste.Name = "mnPaste";
+            this.mnPaste.ShortcutKeyDisplayString = "Ctrl+V";
+            this.mnPaste.Size = new System.Drawing.Size(152, 22);
+            this.mnPaste.Text = "Paste";
+            // 
+            // mnDelete
+            // 
+            this.mnDelete.MergeAction = System.Windows.Forms.MergeAction.Insert;
+            this.mnDelete.MergeIndex = 6;
+            this.mnDelete.Name = "mnDelete";
+            this.mnDelete.ShortcutKeyDisplayString = "Del";
+            this.mnDelete.Size = new System.Drawing.Size(152, 22);
+            this.mnDelete.Text = "Delete";
+            // 
+            // mnClean
+            // 
+            this.mnClean.Image = ((System.Drawing.Image)(resources.GetObject("mnClean.Image")));
+            this.mnClean.MergeAction = System.Windows.Forms.MergeAction.Insert;
+            this.mnClean.MergeIndex = 7;
+            this.mnClean.Name = "mnClean";
+            this.mnClean.Size = new System.Drawing.Size(152, 22);
+            this.mnClean.Text = "Clean";
+            this.mnClean.Click += new System.EventHandler(this.mnClean_Click);
+            // 
+            // toolStripMenuItem3
+            // 
+            this.toolStripMenuItem3.MergeAction = System.Windows.Forms.MergeAction.Insert;
+            this.toolStripMenuItem3.MergeIndex = 8;
+            this.toolStripMenuItem3.Name = "toolStripMenuItem3";
+            this.toolStripMenuItem3.Size = new System.Drawing.Size(149, 6);
+            // 
+            // mnSelectAll
+            // 
+            this.mnSelectAll.MergeAction = System.Windows.Forms.MergeAction.Insert;
+            this.mnSelectAll.MergeIndex = 9;
+            this.mnSelectAll.Name = "mnSelectAll";
+            this.mnSelectAll.ShortcutKeyDisplayString = "";
+            this.mnSelectAll.Size = new System.Drawing.Size(152, 22);
+            this.mnSelectAll.Text = "Select All";
+            // 
+            // toolStripMenuItem7
+            // 
+            this.toolStripMenuItem7.MergeAction = System.Windows.Forms.MergeAction.Insert;
+            this.toolStripMenuItem7.MergeIndex = 10;
+            this.toolStripMenuItem7.Name = "toolStripMenuItem7";
+            this.toolStripMenuItem7.Size = new System.Drawing.Size(149, 6);
+            // 
+            // mnView
+            // 
+            this.mnView.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.toolStripMenuItem4,
+            this.mnShowEol,
+            this.mnShowWhitespace});
+            this.mnView.MergeAction = System.Windows.Forms.MergeAction.MatchOnly;
+            this.mnView.Name = "mnView";
+            this.mnView.Size = new System.Drawing.Size(44, 20);
+            this.mnView.Text = "&View";
+            // 
+            // toolStripMenuItem4
+            // 
+            this.toolStripMenuItem4.Name = "toolStripMenuItem4";
+            this.toolStripMenuItem4.Size = new System.Drawing.Size(164, 6);
+            // 
+            // mnShowEol
+            // 
+            this.mnShowEol.Name = "mnShowEol";
+            this.mnShowEol.Size = new System.Drawing.Size(167, 22);
+            this.mnShowEol.Text = "Show EOL";
+            this.mnShowEol.Click += new System.EventHandler(this.mnShowEol_Click);
+            // 
+            // mnShowWhitespace
+            // 
+            this.mnShowWhitespace.Name = "mnShowWhitespace";
+            this.mnShowWhitespace.Size = new System.Drawing.Size(167, 22);
+            this.mnShowWhitespace.Text = "Show Whitespace";
+            this.mnShowWhitespace.Click += new System.EventHandler(this.mnShowWhitespace_Click);
+            // 
+            // toolStripSeparator2
+            // 
+            this.toolStripSeparator2.Name = "toolStripSeparator2";
+            this.toolStripSeparator2.Size = new System.Drawing.Size(6, 25);
+            // 
+            // toolStrip1
+            // 
+            this.toolStrip1.ImageScalingSize = new System.Drawing.Size(32, 32);
+            this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.toolStripSeparator2});
+            this.toolStrip1.Location = new System.Drawing.Point(0, 0);
+            this.toolStrip1.Name = "toolStrip1";
+            this.toolStrip1.Size = new System.Drawing.Size(664, 25);
+            this.toolStrip1.TabIndex = 1;
+            this.toolStrip1.Text = "toolStrip1";
+            this.toolStrip1.Visible = false;
+            // 
+            // osToolStripMenuItem
+            // 
+            this.osToolStripMenuItem.Name = "osToolStripMenuItem";
+            this.osToolStripMenuItem.Size = new System.Drawing.Size(117, 22);
+            this.osToolStripMenuItem.Text = "os";
+            // 
+            // contextMenuStrip1
+            // 
+            this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.cmSoftReset,
+            this.toolStripSeparator5,
+            this.cmUndo,
+            this.cmRedo,
+            this.toolStripSeparator4,
+            this.cmCut,
+            this.cmCopy,
+            this.cmPaste,
+            this.cmDelete,
+            this.cmClean,
+            this.toolStripSeparator1,
+            this.cmSelectAll,
+            this.toolStripSeparator3,
+            this.advancedToolStripMenuItem});
+            this.contextMenuStrip1.Name = "contextMenuStrip1";
+            this.contextMenuStrip1.Size = new System.Drawing.Size(145, 248);
+            // 
+            // cmSoftReset
+            // 
+            this.cmSoftReset.Enabled = false;
+            this.cmSoftReset.Name = "cmSoftReset";
+            this.cmSoftReset.Size = new System.Drawing.Size(144, 22);
+            this.cmSoftReset.Text = "Soft reset";
+            // 
+            // toolStripSeparator5
+            // 
+            this.toolStripSeparator5.Name = "toolStripSeparator5";
+            this.toolStripSeparator5.Size = new System.Drawing.Size(141, 6);
+            // 
+            // cmUndo
+            // 
+            this.cmUndo.Enabled = false;
+            this.cmUndo.Image = ((System.Drawing.Image)(resources.GetObject("cmUndo.Image")));
+            this.cmUndo.MergeAction = System.Windows.Forms.MergeAction.Insert;
+            this.cmUndo.MergeIndex = 0;
+            this.cmUndo.Name = "cmUndo";
+            this.cmUndo.ShortcutKeyDisplayString = "Ctrl+Z";
+            this.cmUndo.Size = new System.Drawing.Size(144, 22);
+            this.cmUndo.Text = "Undo";
+            this.cmUndo.Click += new System.EventHandler(this.mnUndo_Click);
+            // 
+            // cmRedo
+            // 
+            this.cmRedo.Enabled = false;
+            this.cmRedo.Image = ((System.Drawing.Image)(resources.GetObject("cmRedo.Image")));
+            this.cmRedo.MergeAction = System.Windows.Forms.MergeAction.Insert;
+            this.cmRedo.MergeIndex = 1;
+            this.cmRedo.Name = "cmRedo";
+            this.cmRedo.ShortcutKeyDisplayString = "Ctrl+Y";
+            this.cmRedo.Size = new System.Drawing.Size(144, 22);
+            this.cmRedo.Text = "Redo";
+            this.cmRedo.Click += new System.EventHandler(this.mnRedo_Click);
+            // 
+            // toolStripSeparator4
+            // 
+            this.toolStripSeparator4.MergeAction = System.Windows.Forms.MergeAction.Insert;
+            this.toolStripSeparator4.MergeIndex = 2;
+            this.toolStripSeparator4.Name = "toolStripSeparator4";
+            this.toolStripSeparator4.Size = new System.Drawing.Size(141, 6);
+            // 
+            // cmCut
+            // 
+            this.cmCut.Enabled = false;
+            this.cmCut.Image = ((System.Drawing.Image)(resources.GetObject("cmCut.Image")));
+            this.cmCut.MergeAction = System.Windows.Forms.MergeAction.Insert;
+            this.cmCut.MergeIndex = 3;
+            this.cmCut.Name = "cmCut";
+            this.cmCut.ShortcutKeyDisplayString = "Ctrl+X";
+            this.cmCut.Size = new System.Drawing.Size(144, 22);
+            this.cmCut.Text = "Cut";
+            this.cmCut.Click += new System.EventHandler(this.mnCut_Click);
+            // 
+            // cmCopy
+            // 
+            this.cmCopy.Enabled = false;
+            this.cmCopy.Image = ((System.Drawing.Image)(resources.GetObject("cmCopy.Image")));
+            this.cmCopy.MergeAction = System.Windows.Forms.MergeAction.Insert;
+            this.cmCopy.MergeIndex = 4;
+            this.cmCopy.Name = "cmCopy";
+            this.cmCopy.ShortcutKeyDisplayString = "";
+            this.cmCopy.Size = new System.Drawing.Size(144, 22);
+            this.cmCopy.Text = "Copy";
+            this.cmCopy.Click += new System.EventHandler(this.mnCopy_Click);
+            // 
+            // cmPaste
+            // 
+            this.cmPaste.Enabled = false;
+            this.cmPaste.Image = ((System.Drawing.Image)(resources.GetObject("cmPaste.Image")));
+            this.cmPaste.MergeAction = System.Windows.Forms.MergeAction.Insert;
+            this.cmPaste.MergeIndex = 5;
+            this.cmPaste.Name = "cmPaste";
+            this.cmPaste.ShortcutKeyDisplayString = "Ctrl+V";
+            this.cmPaste.Size = new System.Drawing.Size(144, 22);
+            this.cmPaste.Text = "Paste";
+            this.cmPaste.Click += new System.EventHandler(this.mnPaste_Click);
+            // 
+            // cmDelete
+            // 
+            this.cmDelete.Enabled = false;
+            this.cmDelete.MergeAction = System.Windows.Forms.MergeAction.Insert;
+            this.cmDelete.MergeIndex = 6;
+            this.cmDelete.Name = "cmDelete";
+            this.cmDelete.ShortcutKeyDisplayString = "Del";
+            this.cmDelete.Size = new System.Drawing.Size(144, 22);
+            this.cmDelete.Text = "Delete";
+            this.cmDelete.Click += new System.EventHandler(this.mnDelete_Click);
+            // 
+            // cmClean
+            // 
+            this.cmClean.Image = global::EsPy.Properties.Resources.editclear;
+            this.cmClean.Name = "cmClean";
+            this.cmClean.Size = new System.Drawing.Size(144, 22);
+            this.cmClean.Text = "Clean";
+            this.cmClean.Click += new System.EventHandler(this.mnClean_Click);
+            // 
+            // toolStripSeparator1
+            // 
+            this.toolStripSeparator1.Name = "toolStripSeparator1";
+            this.toolStripSeparator1.Size = new System.Drawing.Size(141, 6);
+            // 
+            // cmSelectAll
+            // 
+            this.cmSelectAll.Enabled = false;
+            this.cmSelectAll.MergeAction = System.Windows.Forms.MergeAction.Insert;
+            this.cmSelectAll.MergeIndex = 8;
+            this.cmSelectAll.Name = "cmSelectAll";
+            this.cmSelectAll.ShortcutKeyDisplayString = "";
+            this.cmSelectAll.Size = new System.Drawing.Size(144, 22);
+            this.cmSelectAll.Text = "Select All";
+            this.cmSelectAll.Click += new System.EventHandler(this.mnSelectAll_Click);
+            // 
+            // toolStripSeparator3
+            // 
+            this.toolStripSeparator3.Name = "toolStripSeparator3";
+            this.toolStripSeparator3.Size = new System.Drawing.Size(141, 6);
+            // 
+            // advancedToolStripMenuItem
+            // 
+            this.advancedToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.cmShowEOL,
+            this.cmShowWhitespace});
+            this.advancedToolStripMenuItem.Name = "advancedToolStripMenuItem";
+            this.advancedToolStripMenuItem.Size = new System.Drawing.Size(144, 22);
+            this.advancedToolStripMenuItem.Text = "Advanced";
+            // 
+            // cmShowEOL
+            // 
+            this.cmShowEOL.Name = "cmShowEOL";
+            this.cmShowEOL.Size = new System.Drawing.Size(167, 22);
+            this.cmShowEOL.Text = "Show EOL";
+            this.cmShowEOL.Click += new System.EventHandler(this.mnShowEol_Click);
+            // 
+            // cmShowWhitespace
+            // 
+            this.cmShowWhitespace.Name = "cmShowWhitespace";
+            this.cmShowWhitespace.Size = new System.Drawing.Size(167, 22);
+            this.cmShowWhitespace.Text = "Show Whitespace";
+            this.cmShowWhitespace.Click += new System.EventHandler(this.mnShowWhitespace_Click);
+            // 
+            // scintilla
+            // 
+            this.scintilla.AutoCAutoHide = false;
+            this.scintilla.AutoCChooseSingle = true;
+            this.scintilla.AutomaticFold = ((ScintillaNET.AutomaticFold)(((ScintillaNET.AutomaticFold.Show | ScintillaNET.AutomaticFold.Click) 
+            | ScintillaNET.AutomaticFold.Change)));
+            this.scintilla.ContextMenuStrip = this.contextMenuStrip1;
+            this.scintilla.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.scintilla.EolMode = ScintillaNET.Eol.Cr;
+            this.scintilla.IndentationGuides = ScintillaNET.IndentView.LookForward;
+            this.scintilla.IndentWidth = 4;
+            this.scintilla.Lexer = ScintillaNET.Lexer.Python;
+            this.scintilla.Location = new System.Drawing.Point(0, 24);
+            this.scintilla.Name = "scintilla";
+            this.scintilla.Port = null;
+            this.scintilla.ReadOnly = true;
+            this.scintilla.Size = new System.Drawing.Size(664, 238);
+            this.scintilla.TabIndex = 2;
+            this.scintilla.ViewWhitespace = ScintillaNET.WhitespaceMode.VisibleAlways;
+            this.scintilla.UpdateUI += new System.EventHandler<ScintillaNET.UpdateUIEventArgs>(this.terminal_UpdateUI);
+            // 
+            // TerminalForm
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.ClientSize = new System.Drawing.Size(664, 262);
+            this.Controls.Add(this.scintilla);
+            this.Controls.Add(this.menuStrip1);
+            this.Controls.Add(this.toolStrip1);
+            this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+            this.KeyPreview = true;
+            this.MainMenuStrip = this.menuStrip1;
+            this.Name = "TerminalForm";
+            this.Text = "Terminal";
+            this.Activated += new System.EventHandler(this.TerminalForm_Activated);
+            this.Load += new System.EventHandler(this.TerminalForm_Load);
+            this.menuStrip1.ResumeLayout(false);
+            this.menuStrip1.PerformLayout();
+            this.toolStrip1.ResumeLayout(false);
+            this.toolStrip1.PerformLayout();
+            this.contextMenuStrip1.ResumeLayout(false);
+            this.ResumeLayout(false);
+            this.PerformLayout();
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.MenuStrip menuStrip1;
+        private System.Windows.Forms.ToolStripSeparator toolStripSeparator2;
+        private System.Windows.Forms.ToolStrip toolStrip1;
+        public Components.Terminal scintilla;
+        private System.Windows.Forms.ToolStripMenuItem mnEdit;
+        private System.Windows.Forms.ToolStripMenuItem mnUndo;
+        private System.Windows.Forms.ToolStripMenuItem mnRedo;
+        private System.Windows.Forms.ToolStripSeparator toolStripMenuItem2;
+        private System.Windows.Forms.ToolStripMenuItem mnCut;
+        private System.Windows.Forms.ToolStripMenuItem mnCopy;
+        private System.Windows.Forms.ToolStripMenuItem mnPaste;
+        private System.Windows.Forms.ToolStripMenuItem mnDelete;
+        private System.Windows.Forms.ToolStripSeparator toolStripMenuItem3;
+        private System.Windows.Forms.ToolStripMenuItem mnSelectAll;
+        private System.Windows.Forms.ToolStripSeparator toolStripMenuItem7;
+        private System.Windows.Forms.ToolStripMenuItem mnClean;
+        private System.Windows.Forms.ToolStripMenuItem osToolStripMenuItem;
+        private System.Windows.Forms.ToolStripMenuItem mnView;
+        private System.Windows.Forms.ToolStripMenuItem mnShowEol;
+        private System.Windows.Forms.ToolStripMenuItem mnShowWhitespace;
+        private System.Windows.Forms.ToolStripSeparator toolStripMenuItem4;
+        protected System.Windows.Forms.ContextMenuStrip contextMenuStrip1;
+        private System.Windows.Forms.ToolStripMenuItem cmSoftReset;
+        private System.Windows.Forms.ToolStripSeparator toolStripSeparator5;
+        private System.Windows.Forms.ToolStripMenuItem cmUndo;
+        private System.Windows.Forms.ToolStripMenuItem cmRedo;
+        private System.Windows.Forms.ToolStripSeparator toolStripSeparator4;
+        private System.Windows.Forms.ToolStripMenuItem cmCut;
+        private System.Windows.Forms.ToolStripMenuItem cmCopy;
+        private System.Windows.Forms.ToolStripMenuItem cmPaste;
+        private System.Windows.Forms.ToolStripMenuItem cmDelete;
+        private System.Windows.Forms.ToolStripMenuItem cmClean;
+        private System.Windows.Forms.ToolStripSeparator toolStripSeparator1;
+        private System.Windows.Forms.ToolStripMenuItem cmSelectAll;
+        private System.Windows.Forms.ToolStripSeparator toolStripSeparator3;
+        private System.Windows.Forms.ToolStripMenuItem advancedToolStripMenuItem;
+        private System.Windows.Forms.ToolStripMenuItem cmShowEOL;
+        private System.Windows.Forms.ToolStripMenuItem cmShowWhitespace;
+    }
+}

+ 287 - 0
EsPy/Forms/TerminalForm.cs

@@ -0,0 +1,287 @@
+using EsPy.Units;
+using EsPy.Utility;
+using ScintillaNET;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+using System.Xml;
+using WeifenLuo.WinFormsUI.Docking;
+
+namespace EsPy.Forms
+{
+    public partial class TerminalForm : DockContent, IForm, IPort, IDisposable
+    {
+        public TerminalForm()
+        {
+            InitializeComponent();
+            this.HideOnClose = true;
+            this.DockAreas = DockAreas.Document 
+                | DockAreas.DockBottom 
+                | DockAreas.DockLeft
+                | DockAreas.DockRight
+                | DockAreas.DockTop;
+            this.scintilla.ReadOnly = true;
+            //this.scintilla.Preprocess += new Components.Terminal.PreprocessEvent(TerminalPreprocess);
+            
+            this.ViewEOL = Properties.Settings.Default.TerminalShowEol;
+            this.ViewWhitespace = Properties.Settings.Default.TerminalShowWhitespace;
+            this.scintilla.SetLang();
+        }
+
+        /// <summary>
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                try
+                {
+                    if (this.scintilla.HistoryModified)
+                        this.scintilla.SaveHistory(this.HistoryFile);
+                    this.Port = null;
+                }
+                catch
+                { }
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        public PySerial Port
+        {
+            get { return this.scintilla.Port; }
+            set
+            {
+                if (this.scintilla.Port != null)
+                {
+                    this.scintilla.Port.PortOpen -= Port_PortOpen;
+                    this.scintilla.Port.PortClose -= Port_PortClose;
+                    this.scintilla.Port.DataReceived -= Port_DataReceived;
+                    this.scintilla.Port.ErrorReceived -= Port_ErrorReceived;
+                    this.scintilla.Port.PortBusy -= Port_PortBusy;
+                    this.scintilla.Port.PortFree -= Port_PortFree;
+                }
+
+                if (value != null)
+                {
+                    value.PortOpen += Port_PortOpen;
+                    value.PortClose += Port_PortClose;
+                    value.DataReceived += Port_DataReceived;
+                    value.ErrorReceived += Port_ErrorReceived;
+                    value.PortBusy += Port_PortBusy;
+                    value.PortFree += Port_PortFree;
+                }
+                this.scintilla.Port = value;
+            }
+        }
+
+        private delegate void UpdateStatusEvent(bool busy);
+        public void UpdateBusy(bool busy)
+        {
+            if (this.InvokeRequired)
+            {
+                this.Invoke(new UpdateStatusEvent(UpdateBusy), new object[] { busy });
+            }
+            else
+            {
+
+            }
+        }
+        private void Port_PortFree(object sender, EventArgs e)
+        {
+            //throw new NotImplementedException();
+        }
+
+        private void Port_PortBusy(object sender, EventArgs e)
+        {
+            //throw new NotImplementedException();
+        }
+
+        private void Port_ErrorReceived(object sender, string data)
+        {
+
+        }
+
+        private void Port_DataReceived(object sender, string data)
+        {
+
+        }
+
+        private void Port_PortClose(object sender, EventArgs e)
+        {
+            this.scintilla.Append("\nDisconnected.\r\n");
+            this.scintilla.ReadOnly = true;
+        }
+
+        private void Port_PortOpen(object sender, EventArgs e)
+        {
+            this.scintilla.ReadOnly = false;
+            this.scintilla.Append($"{this.Port.PortName} {this.Port.BaudRate } Connected...\r\n");
+            this.scintilla.Append("Press CTRL + D or Soft Reset Button on the Toolbar\r\n");
+        }
+
+        public ToolStrip ToolStrip
+        { get { return this.toolStrip1; } }
+
+        public ToolStrip MenuStrip
+        { get { return this.menuStrip1; } }
+
+        private void bntClean_Click(object sender, EventArgs e)
+        {
+            this.scintilla.Clean();
+        }
+
+        private string HistoryFile
+        { get { return Path.Combine(Application.StartupPath, "history.txt"); } }
+
+        private void TerminalForm_Load(object sender, EventArgs e)
+        {
+            this.scintilla.LoadHistory(this.HistoryFile);
+        }
+
+        private void UpdateUI()
+        {
+            this.scintilla.Margins[0].Width = this.scintilla.TextWidth(Style.LineNumber, " " + (this.scintilla.Lines.Count + 1).ToString());
+
+            this.cmSoftReset.Enabled = this.Port != null && this.Port.IsOpen;
+
+            this.mnClean.Enabled =
+                this.cmClean.Enabled =
+                this.mnSelectAll.Enabled =
+                this.cmSelectAll.Enabled = this.scintilla.TextLength > 0;
+
+            this.mnUndo.Enabled =
+                this.cmUndo.Enabled = this.scintilla.CanUndo;
+
+            this.mnRedo.Enabled =
+                this.cmRedo.Enabled = this.scintilla.CanRedo;
+
+            this.mnCut.Enabled =
+                this.mnCopy.Enabled =
+                this.mnDelete.Enabled =
+                this.cmCut.Enabled =
+                this.cmCopy.Enabled =
+                this.cmDelete.Enabled = this.scintilla.SelectionEnd > this.scintilla.SelectionStart;
+        }
+
+        private void terminal_UpdateUI(object sender, UpdateUIEventArgs e)
+        {
+            this.UpdateUI();
+        }
+
+        private void cmSoftReset_Click(object sender, EventArgs e)
+        {
+            this.Port.SoftReset();
+        }
+
+        private void mnUndo_Click(object sender, EventArgs e)
+        {
+            this.scintilla.Undo();
+        }
+
+        private void mnRedo_Click(object sender, EventArgs e)
+        {
+            this.scintilla.Redo();
+        }
+
+        private void mnCut_Click(object sender, EventArgs e)
+        {
+            this.scintilla.Cut();
+        }
+
+        private void mnCopy_Click(object sender, EventArgs e)
+        {
+            this.scintilla.Copy();
+        }
+
+        private void mnPaste_Click(object sender, EventArgs e)
+        {
+            this.scintilla.Paste();
+        }
+
+        private void mnDelete_Click(object sender, EventArgs e)
+        {
+            this.scintilla.DeleteRange(this.scintilla.SelectionStart, this.scintilla.SelectionEnd);
+        }
+
+        private void mnSelectAll_Click(object sender, EventArgs e)
+        {
+            this.scintilla.SelectAll();
+        }
+
+        private void mnClean_Click(object sender, EventArgs e)
+        {
+            this.scintilla.Clean();
+        }
+
+        private void SendCommand(object sender, EventArgs e)
+        {
+            ToolStripMenuItem c = sender as ToolStripMenuItem;
+            if (c != null && c.Tag != null)
+            {
+                string[] lines = c.Tag.ToString().Split(';');
+                foreach (string line in lines)
+                {
+                    this.Port.WriteLine(line);
+                }
+            }
+        }
+
+        public bool ViewEOL
+        {
+            get { return this.scintilla.ViewEol; }
+            set
+            {
+
+                this.scintilla.ViewEol = value;
+                Properties.Settings.Default.TerminalShowEol = value;
+                this.mnShowEol.Checked = value;
+                this.cmShowEOL.Checked = value;
+            }
+        }
+
+        public bool ViewWhitespace
+        {
+            get { return this.scintilla.ViewWhitespace == WhitespaceMode.VisibleAlways; }
+            set
+            {
+                if (value)
+                    this.scintilla.ViewWhitespace = WhitespaceMode.VisibleAlways;
+                else this.scintilla.ViewWhitespace = WhitespaceMode.Invisible;
+
+                Properties.Settings.Default.TerminalShowWhitespace = value;
+                this.mnShowWhitespace.Checked = value;
+                this.cmShowWhitespace.Checked = value;
+            }
+        }
+
+        private void mnShowEol_Click(object sender, EventArgs e)
+        {
+            this.ViewEOL = !this.ViewEOL;
+        }
+
+        private void mnShowWhitespace_Click(object sender, EventArgs e)
+        {
+            this.ViewWhitespace = !this.ViewWhitespace;
+        }
+
+        private void TerminalForm_Activated(object sender, EventArgs e)
+        {
+            this.scintilla.Focus();
+        }
+
+        //public void UIStateChanged(object sender, UIChangedEventArgs e)
+        //{
+        //    //throw new NotImplementedException();
+        //}
+    }
+}

+ 541 - 0
EsPy/Forms/TerminalForm.resx

@@ -0,0 +1,541 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="menuStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="mnUndo.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        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
+        +wrSc2wWtwAAAABJRU5ErkJggg==
+</value>
+  </data>
+  <data name="mnRedo.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        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
+</value>
+  </data>
+  <data name="mnCut.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        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
+        rkJggg==
+</value>
+  </data>
+  <data name="mnCopy.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAJcEhZcwAADrwAAA68AZW8ckkAAAHHSURBVFhHxZY9asNAEEbdpEyKBFIlZarkACFX8CVc6C4q
+        3fkGBjfGWGC3KexCTQqFgAIp3BtjcOV/bebbZMWyUuKdkcAfPAyLNPM0HpAadsbjsZIQRdF7EAR3VOLi
+        p5IwKMbNfD5Xk8lEDQaDtNlsPlAZuYREYL/fqzRNtUS/3/+sJCERQDCF1WpVXaJMAGdxHLOYTqfYi49W
+        q3VPZf1F/hLgRrwXdQmI96IuAUS0F26z17cvscByudS/LIk6J4DGi8VCzWYzlSRJLkFtbolyiToF7KzX
+        ay2DWtTmibjUDd24zar8BWUZjUYQeCaudUM3PhOAFAc7nU4HAi/EjW7oxkegSsIw9BPIskyDJzirAHAF
+        3BGfwo63wPF4zDnLBExzPMFZBA6HQ445s/eCg7kP8RbAy8TgCkhB2AJ4AnNm7wUXtsBut8txBdwRn0Ik
+        sNlscsyZvRdcIIF4C+DlYTBn9l5wgQTiLWDHFSgb83+wBIbDoer1eqrb7eYYAXsvuEACOSlAuSIeCVyk
+        MQL2XnCBBOIjgC8VSOACjRHYbrdiOBMopGwvpBEJYC/a7ba+uQ6oJE+AUtiLiqAWanqnsBcVQa3fr+JG
+        4xs1dfbZaqs65wAAAABJRU5ErkJggg==
+</value>
+  </data>
+  <data name="mnPaste.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        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
+</value>
+  </data>
+  <data name="mnClean.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        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
+        YgONHK09AAAAAElFTkSuQmCC
+</value>
+  </data>
+  <metadata name="toolStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>132, 17</value>
+  </metadata>
+  <metadata name="contextMenuStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>364, 18</value>
+  </metadata>
+  <data name="cmUndo.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        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
+        +wrSc2wWtwAAAABJRU5ErkJggg==
+</value>
+  </data>
+  <data name="cmRedo.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        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
+</value>
+  </data>
+  <data name="cmCut.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        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
+        rkJggg==
+</value>
+  </data>
+  <data name="cmCopy.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAJcEhZcwAADrwAAA68AZW8ckkAAAHHSURBVFhHxZY9asNAEEbdpEyKBFIlZarkACFX8CVc6C4q
+        3fkGBjfGWGC3KexCTQqFgAIp3BtjcOV/bebbZMWyUuKdkcAfPAyLNPM0HpAadsbjsZIQRdF7EAR3VOLi
+        p5IwKMbNfD5Xk8lEDQaDtNlsPlAZuYREYL/fqzRNtUS/3/+sJCERQDCF1WpVXaJMAGdxHLOYTqfYi49W
+        q3VPZf1F/hLgRrwXdQmI96IuAUS0F26z17cvscByudS/LIk6J4DGi8VCzWYzlSRJLkFtbolyiToF7KzX
+        ay2DWtTmibjUDd24zar8BWUZjUYQeCaudUM3PhOAFAc7nU4HAi/EjW7oxkegSsIw9BPIskyDJzirAHAF
+        3BGfwo63wPF4zDnLBExzPMFZBA6HQ445s/eCg7kP8RbAy8TgCkhB2AJ4AnNm7wUXtsBut8txBdwRn0Ik
+        sNlscsyZvRdcIIF4C+DlYTBn9l5wgQTiLWDHFSgb83+wBIbDoer1eqrb7eYYAXsvuEACOSlAuSIeCVyk
+        MQL2XnCBBOIjgC8VSOACjRHYbrdiOBMopGwvpBEJYC/a7ba+uQ6oJE+AUtiLiqAWanqnsBcVQa3fr+JG
+        4xs1dfbZaqs65wAAAABJRU5ErkJggg==
+</value>
+  </data>
+  <data name="cmPaste.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        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
+</value>
+  </data>
+  <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        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
+        AAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AAAAAAAAAAAAAAAAAAAAAAAAAAANAAAALnJy
+        csG7urn/3t3b/9zb2f/c29j/3NvY/9zb2P/c29j/3NvY/9zb2P/c29n/3t3b/7u6uf9ycnLBAAAALgAA
+        AA0AAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD///8AAAAAAAAAAAQAAAANAAAAEgAA
+        ACB2dnbBtre0/9TS0P/Rzsz/0M3L/9DNy//Qzcv/0M3L/9DNy//Qzcv/0M3L/9DNy//Rzsz/1NLQ/7a3
+        tP92dnbBAAAAIAAAABIAAAANAAAABAAAAAAAAAAA////AP///wD///8A////AP///wAAAAAAAAAADQAA
+        ACsAAAA7AAAAP4ODg//T0M7/ycjG/8fGxP/HxsT/x8bE/8fGxP/HxsT/x8bE/8fGxP/HxsT/x8bE/8fG
+        xP/JyMb/09DO/4ODg/8AAAA/AAAAOwAAACsAAAANAAAAAAAAAAD///8A////AP///wD///8A////AAAA
+        AAAAAAAVeXl5xYWFhf9rbGy5gYKC/87Ny//Bv73/wb+9/8G/vf/Bv73/wb+9/8G/vf/Bv73/wb+9/8G/
+        vf/Bv73/wb+9/8G/vf/Ozcv/goKC/2xsbbmGhob/eXl5xQAAABUAAAAAAAAAAP///wD///8A////AP//
+        /wD///8AAAAAAAAAABaEhIT/29rX/7Ctq/+AgID/zcvK/7q5t/+6ubf/urm3/7q5t/+6ubf/urm3/7q5
+        t/+6ubf/urm3/7q5t/+6ubf/urm3/83Lyv+AgYH/pqSh/9HPzf+FhYX/AAAAFgAAAAAAAAAA////AP//
+        /wD///8A////AP///wAAAAAAAAAAFoODg//Y19T/raqo/39/gP/LzMn/s7Gv/7SysP+0srD/tLKw/7Sy
+        sP+0srD/tLKw/7SysP+0srD/tLKw/7SysP+zsa//y8zJ/4CAgP+kop//zszK/4SEhP8AAAAWAAAAAAAA
+        AAD///8A////AP///wD///8A////AAAAAAAAAAAWg4OD/9fW1P+sqqj/f3+A/8zLyv+sqqj/rqyq/66s
+        qv+urKr/rqyq/66sqv+urKr/rqyq/66sqv+urKr/rqyq/6yqqP/My8r/gICA/6Shn//OzMn/g4SE/wAA
+        ABYAAAAAAAAAAP///wD///8A////AP///wD///8AAAAAAAAAABaDg4P/19bU/6yqqP9/f4D/zc3K/6Si
+        oP+lo6H/pqSi/6akov+mpKL/pqSi/6akov+mpKL/pqSi/6akov+lo6H/pKKg/87Nyv+AgIH/pKGf/87M
+        yf+DhIT/AAAAFgAAAAAAAAAA////AP///wD///8A////AP///wAAAAAGAAAAIoSEhP/Y19X/raup/3+A
+        gP/Qzs3/m5mX/52amP+dm5n/nZuZ/52bmf+dm5n/nZuZ/52bmf+dm5n/nZuZ/52amP+bmZf/0M7N/4CB
+        gf+koqD/z83K/4SEhf8AAAAiAAAABgAAAAD///8A////AP///wD///8A////AAAAAAsAAAAnh4eG/93b
+        2P+yr6z/g4OD/9va2P/Z2Nb/2dfV/9nX1f/Z1tX/2dbV/9nX1f/Z19X/2dfV/9rX1f/a19X/2tfV/9nY
+        1v/b2tj/hIOD/6mlov/U0M3/iIeH/wAAACcAAAALAAAAAP///wD///8A////AP///wD///8AAAAABnd2
+        dv93c3D/dm5q/3Zva/91cm//c3Bt/3NsaP9xaGP/b2Zi/21lYv9tZWL/bmVi/3BmYv9xZ2L/cmdi/3No
+        Yv9zaWP/c2xo/3Nvbf92cW7/d29q/3Zwa/93dHL/eHd2/wAAAAYAAAAA////AP///wD///8A////AP//
+        /wAAAAAAAAAAAAAAABY1yv//Q5fb/wAAABYAAAAWPpTa/2TW//974f//o/H//5Xs//+H5f//ed///2vZ
+        //9d0///TMz//13U//8/ldn/AAAAFgAAABY2yv//Qpfc/wAAABYAAAAAAAAAAAAAAAD///8A////AP//
+        /wD///8A////AAAAAAAAAAAAAAAAFTzE//9Jk9D/AAAAFgAAABVCkdD/leL//3jZ//+g6v//kuT//4Td
+        //922P//aNH//1vM//9Kxf//keD//0ORz/8AAAAVAAAAFj3E//9Jk9H/AAAAFQAAAAAAAAAAAAAAAP//
+        /wD///8A////AP///wD///8AAAAAAAAAAAAAAAANP8H//0yPyf8AAAARAAAADUSQzv+47///0Pb//+L+
+        ///b+///1fj//872///I8///wvD//7rt//+17f//RJDN/wAAAA0AAAARP8H//0yPyf8AAAANAAAAAAAA
+        AAAAAAAA////AP///wD///8A////AP///wAAAAAAAAAAAAAAAAQ+uvm3P8D//wAAAAYAAAAERZDKtEOQ
+        zv8/jsz/Po3M/z6NzP8+jcz/P43M/0COzP9Bjsz/Qo/M/0SRzv9GkMq0AAAABAAAAAZAv///Prv5twAA
+        AAQAAAAAAAAAAAAAAAD///8A////AP/4H///+B////gf///4H///+B////AP///wD///8A////AP///A
+        A///wAP//8AD///AA///wAP//4AB//8AAP/+AAB//gAAf/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AA
+        AA/gAAAH4AAAB+AAAAf4AAAf+AAAH/gAAB/4AAAf
+</value>
+  </data>
+</root>

+ 91 - 0
EsPy/Globals.cs

@@ -0,0 +1,91 @@
+using EsPy.Components;
+using EsPy.Forms;
+using EsPy.Python;
+using EsPy.Utility;
+using Microsoft.Win32;
+using Newtonsoft.Json.Linq;
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Net;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace EsPy
+{
+    public class Globals
+    {
+
+        public static PyClient PyClient = null;
+
+        public static void PyClientStart()
+        {
+           PyClient = new PyClient(new IPAddress(new byte[] { 127, 0, 0, 1 }),
+                Properties.Settings.Default.PyServerPort);
+
+            try
+            {
+                Task t = new Task(() =>
+                {     
+                    Splash s = new Splash();
+                    s.TopMost = true;
+                    s.Show();
+                    Application.DoEvents();
+                    s.label2.Text = "Connecting...";                  
+                    Application.DoEvents();
+                    Thread.Sleep(2000);
+                    if (Globals.PyClient.Start())
+                    {
+                        s.label2.Text = "Connected!";
+                    }
+                    else
+                    {
+                        s.label2.Text = "Could not connect!";
+                        PyClient = null;
+                    }
+                    Application.DoEvents();
+                    Thread.Sleep(2000);
+                    s.Close();
+                    s.Dispose();
+
+                    string python = Helpers.GetPythonPath();
+                    if (python == "")
+                    {
+                        string msg = "Python path is not configured or python.exe does not exists!!\r\n\r\nPlease set the %PATH% variable!";
+                        MessageBox.Show( msg, "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
+                    }
+                   
+                });
+
+                t.Start();
+            }
+            catch (Exception ee)
+            {
+                PyClient = null;
+            }
+        }
+
+        //public static string PythonExe
+        //{ get { return Properties.Settings.Default.PythonExe; } }
+
+        //public static bool PythonExists
+        //{
+        //    get { return File.Exists(PythonExe); }
+        //}
+
+        public static MainForm MainForm
+            {get; internal set; }
+
+        public static TerminalForm TerminalForm
+        { get { return MainForm.TerminalForm; } }
+
+        public static Terminal Terminal
+        { get { return MainForm.TerminalForm.scintilla; }  }
+
+        public static ErrorListForm ErrorListForm
+        { get { return MainForm.ErrorListForm; } }
+    }
+}

+ 34 - 0
EsPy/Helps/help.html

@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+
+<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
+<head>
+    <meta charset="utf-8" />
+    <title>Help</title>
+</head>
+<body>
+    <h3>MicroPython</h3>
+    <ul>
+        <li><a href="http://micropython.org/">Home</a></li>
+        <li><a href="http://micropython.org/download#esp8266">Firmware for ESP8266 boards </a></li>
+    </ul>
+    <h3>MicroPython documentation</h3>
+    <ul>
+        <li><a href="http://docs.micropython.org">Latest</a></li>
+        <li><a href="http://docs.micropython.org/en/latest/esp8266/">Miropython ESP8266</a></li>
+    </ul>
+    <h3>Esp Tools</h3>
+    <p>Requirement:<br />
+     Python2.7<br />
+    python -m pip install --upgarde pip<br />
+    python -m pip install esptool</p>
+    <ul>
+        <li><a href="https://github.com/espressif/esptool">ESP8266 ROM Bootloader utility (esptool)</a></li>
+    </ul>
+
+    <h3>Samples</h3>
+    <ul>
+       <li><href ="https://github.com/dhylands/upy-examples">upy-samples</a></li>
+        <li><a href="https://github.com/peterhinch/micropython-samples">micropython-samples</a></li>
+    </ul>
+</body>
+</html>

BIN
EsPy/Helps/images/esptool.png


BIN
EsPy/Helps/images/espy.png


BIN
EsPy/Helps/images/filemanager.png


+ 17 - 0
EsPy/Lib/apa102.py

@@ -0,0 +1,17 @@
+# APA102 driver for MicroPython on ESP8266
+# MIT license; Copyright (c) 2016 Robert Foss, Daniel Busch
+
+from esp import apa102_write
+from neopixel import NeoPixel
+
+
+class APA102(NeoPixel):
+    ORDER = (0, 1, 2, 3)
+
+    def __init__(self, clock_pin, data_pin, n, bpp=4):
+        super().__init__(data_pin, n, bpp)
+        self.clock_pin = clock_pin
+        self.clock_pin.init(clock_pin.OUT)
+
+    def write(self):
+        apa102_write(self.clock_pin, self.pin, self.buf)

+ 32 - 0
EsPy/Lib/dht.py

@@ -0,0 +1,32 @@
+# DHT11/DHT22 driver for MicroPython on ESP8266
+# MIT license; Copyright (c) 2016 Damien P. George
+
+import esp
+
+class DHTBase:
+    def __init__(self, pin):
+        self.pin = pin
+        self.buf = bytearray(5)
+
+    def measure(self):
+        buf = self.buf
+        esp.dht_readinto(self.pin, buf)
+        if (buf[0] + buf[1] + buf[2] + buf[3]) & 0xff != buf[4]:
+            raise Exception("checksum error")
+
+class DHT11(DHTBase):
+    def humidity(self):
+        return self.buf[0]
+
+    def temperature(self):
+        return self.buf[2]
+
+class DHT22(DHTBase):
+    def humidity(self):
+        return (self.buf[0] << 8 | self.buf[1]) * 0.1
+
+    def temperature(self):
+        t = ((self.buf[2] & 0x7f) << 8 | self.buf[3]) * 0.1
+        if self.buf[2] & 0x80:
+            t = -t
+        return t

+ 27 - 0
EsPy/Lib/ds18x20.py

@@ -0,0 +1,27 @@
+# DS18x20 temperature sensor driver for MicroPython.
+# MIT license; Copyright (c) 2016 Damien P. George
+
+from micropython import const
+
+_CONVERT = const(0x44)
+_RD_SCRATCH = const(0xbe)
+_WR_SCRATCH = const(0x4e)
+
+class DS18X20:
+    def __init__(self, onewire):
+        pass
+    
+    def scan(self):
+        pass
+
+    def convert_temp(self):
+        pass
+
+    def read_scratch(self, rom):
+        pass
+
+    def write_scratch(self, rom, buf):
+        pass
+
+    def read_temp(self, rom):
+        pass

+ 68 - 0
EsPy/Lib/flashbdev.py

@@ -0,0 +1,68 @@
+import esp
+
+class FlashBdev:
+
+    SEC_SIZE = 4096
+    START_SEC = esp.flash_user_start() // SEC_SIZE
+    NUM_BLK = 0x6b
+
+    def __init__(self, blocks=NUM_BLK):
+        self.blocks = blocks
+
+    def readblocks(self, n, buf):
+        #print("readblocks(%s, %x(%d))" % (n, id(buf), len(buf)))
+        esp.flash_read((n + self.START_SEC) * self.SEC_SIZE, buf)
+
+    def writeblocks(self, n, buf):
+        #print("writeblocks(%s, %x(%d))" % (n, id(buf), len(buf)))
+        #assert len(buf) <= self.SEC_SIZE, len(buf)
+        esp.flash_erase(n + self.START_SEC)
+        esp.flash_write((n + self.START_SEC) * self.SEC_SIZE, buf)
+
+    def ioctl(self, op, arg):
+        #print("ioctl(%d, %r)" % (op, arg))
+        if op == 4:  # BP_IOCTL_SEC_COUNT
+            return self.blocks
+        if op == 5:  # BP_IOCTL_SEC_SIZE
+            return self.SEC_SIZE
+
+def set_bl_flash_size(real_size):
+    if real_size == 256*1024:
+        code = 1
+    elif real_size == 512*1024:
+        code = 0
+    elif real_size == 1024*1024:
+        code = 2
+    elif real_size == 2048*1024:
+        code = 3
+    elif real_size == 4096*1024:
+        code = 4
+    else:
+        code = 2
+    buf = bytearray(4096)
+    esp.flash_read(0, buf)
+    buf[3] = (buf[3] & 0xf) | (code << 4)
+    esp.flash_erase(0)
+    esp.flash_write(0, buf)
+
+# If bootloader size ID doesn't correspond to real Flash size,
+# fix bootloader value and reboot.
+size = esp.flash_id() >> 16
+# Check that it looks like realistic power of 2 for flash sizes
+# commonly used with esp8266
+if 22 >= size >= 18:
+    size = 1 << size
+    if size != esp.flash_size():
+        import machine
+        import time
+        print("Bootloader Flash size appear to have been set incorrectly, trying to fix")
+        set_bl_flash_size(size)
+        machine.reset()
+        while 1: time.sleep(1)
+
+size = esp.flash_size()
+if size < 1024*1024:
+    bdev = None
+else:
+    # 20K at the flash end is reserved for SDK params storage
+    bdev = FlashBdev((size - 20480) // FlashBdev.SEC_SIZE - FlashBdev.START_SEC)

+ 50 - 0
EsPy/Lib/inisetup.py

@@ -0,0 +1,50 @@
+import uos
+import network
+from flashbdev import bdev
+
+def wifi():
+    import ubinascii
+    ap_if = network.WLAN(network.AP_IF)
+    essid = b"MicroPython-%s" % ubinascii.hexlify(ap_if.config("mac")[-3:])
+    ap_if.config(essid=essid, authmode=network.AUTH_WPA_WPA2_PSK, password=b"micropythoN")
+
+def check_bootsec():
+    buf = bytearray(bdev.SEC_SIZE)
+    bdev.readblocks(0, buf)
+    empty = True
+    for b in buf:
+        if b != 0xff:
+            empty = False
+            break
+    if empty:
+        return True
+    fs_corrupted()
+
+def fs_corrupted():
+    import time
+    while 1:
+        print("""\
+FAT filesystem appears to be corrupted. If you had important data there, you
+may want to make a flash snapshot to try to recover it. Otherwise, perform
+factory reprogramming of MicroPython firmware (completely erase flash, followed
+by firmware programming).
+""")
+        time.sleep(3)
+
+def setup():
+    check_bootsec()
+    print("Performing initial setup")
+    wifi()
+    uos.VfsFat.mkfs(bdev)
+    vfs = uos.VfsFat(bdev, "")
+    with open("/boot.py", "w") as f:
+        f.write("""\
+# This file is executed on every boot (including wake-boot from deepsleep)
+#import esp
+#esp.osdebug(None)
+import gc
+#import webrepl
+#webrepl.start()
+gc.collect()
+""")
+    return vfs

+ 17 - 0
EsPy/Lib/machine.py

@@ -0,0 +1,17 @@
+class Pin:
+    #init', 'value', 'low', 'high', 'irq', 'IN', 'OUT', 'OPEN_DRAIN', 'PULL_UP', 'IRQ_RISING', 'IRQ_FALLING'
+
+    def __init__(self, pin_id):
+        pass
+
+    def value(value):
+        pass
+
+    def low():
+        pass
+
+    def high():
+        pass
+
+    def irq():
+        pass

+ 32 - 0
EsPy/Lib/neopixel.py

@@ -0,0 +1,32 @@
+# NeoPixel driver for MicroPython on ESP8266
+# MIT license; Copyright (c) 2016 Damien P. George
+
+from esp import neopixel_write
+
+
+class NeoPixel:
+    ORDER = (1, 0, 2, 3)
+
+    def __init__(self, pin, n, bpp=3):
+        self.pin = pin
+        self.n = n
+        self.bpp = bpp
+        self.buf = bytearray(n * bpp)
+        self.pin.init(pin.OUT)
+
+    def __setitem__(self, index, val):
+        offset = index * self.bpp
+        for i in range(self.bpp):
+            self.buf[offset + self.ORDER[i]] = val[i]
+
+    def __getitem__(self, index):
+        offset = index * self.bpp
+        return tuple(self.buf[offset + self.ORDER[i]]
+                     for i in range(self.bpp))
+
+    def fill(self, color):
+        for i in range(self.n):
+            self[i] = color
+
+    def write(self):
+        neopixel_write(self.pin, self.buf, True)

+ 36 - 0
EsPy/Lib/ntptime.py

@@ -0,0 +1,36 @@
+try:
+    import usocket as socket
+except:
+    import socket
+try:
+    import ustruct as struct
+except:
+    import struct
+
+# (date(2000, 1, 1) - date(1900, 1, 1)).days * 24*60*60
+NTP_DELTA = 3155673600
+
+host = "pool.ntp.org"
+
+def time():
+    NTP_QUERY = bytearray(48)
+    NTP_QUERY[0] = 0x1b
+    addr = socket.getaddrinfo(host, 123)[0][-1]
+    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
+    s.settimeout(1)
+    res = s.sendto(NTP_QUERY, addr)
+    msg = s.recv(48)
+    s.close()
+    val = struct.unpack("!I", msg[40:44])[0]
+    return val - NTP_DELTA
+
+# There's currently no timezone support in MicroPython, so
+# utime.localtime() will return UTC time (as if it was .gmtime())
+def settime():
+    t = time()
+    import machine
+    import utime
+    tm = utime.localtime(t)
+    tm = tm[0:3] + (0,) + tm[3:6] + (0,)
+    machine.RTC().datetime(tm)
+    print(utime.localtime())

+ 46 - 0
EsPy/Lib/onewire.py

@@ -0,0 +1,46 @@
+from micropython import const
+import _onewire as _ow
+
+class OneWireError(Exception):
+    pass
+
+class OneWire:
+    SEARCH_ROM = const(0xf0)
+    MATCH_ROM = const(0x55)
+    SKIP_ROM = const(0xcc)
+
+    def __init__(self, pin):
+        pass
+    
+    def reset(self, required=False):
+        pass
+
+    def readbit(self):
+        pass
+
+    def readbyte(self):
+        pass
+
+    def readinto(self, buf):
+        pass
+
+    def writebit(self, value):
+        pass
+
+    def writebyte(self, value):
+        pass
+
+    def write(self, buf):
+        pass
+
+    def select_rom(self, rom):
+        pass
+
+    def scan(self):
+        pass
+
+    def _search_rom(self, l_rom, diff):
+        pass
+
+    def crc8(self, data):
+        pass

+ 33 - 0
EsPy/Lib/port_diag.py

@@ -0,0 +1,33 @@
+import esp
+import uctypes
+import network
+import lwip
+
+
+def main():
+
+    ROM = uctypes.bytearray_at(0x40200000, 16)
+    fid = esp.flash_id()
+
+    print("FlashROM:")
+    print("Flash ID: %x (Vendor: %x Device: %x)" % (fid, fid & 0xff, fid & 0xff00 | fid >> 16))
+
+    print("Flash bootloader data:")
+    SZ_MAP = {0: "512KB", 1: "256KB", 2: "1MB", 3: "2MB", 4: "4MB"}
+    FREQ_MAP = {0: "40MHZ", 1: "26MHZ", 2: "20MHz", 0xf: "80MHz"}
+    print("Byte @2: %02x" % ROM[2])
+    print("Byte @3: %02x (Flash size: %s Flash freq: %s)" % (ROM[3], SZ_MAP.get(ROM[3] >> 4, "?"), FREQ_MAP.get(ROM[3] & 0xf)))
+    print("Firmware checksum:")
+    print(esp.check_fw())
+
+    print("\nNetworking:")
+    print("STA ifconfig:", network.WLAN(network.STA_IF).ifconfig())
+    print("AP ifconfig:", network.WLAN(network.AP_IF).ifconfig())
+    print("Free WiFi driver buffers of type:")
+    for i, comm in enumerate(("1,2 TX", "4 Mngmt TX(len: 0x41-0x100)", "5 Mngmt TX (len: 0-0x40)", "7", "8 RX")):
+        print("%d: %d (%s)" % (i, esp.esf_free_bufs(i), comm))
+    print("lwIP PCBs:")
+    lwip.print_pcbs()
+
+
+main()

+ 1 - 0
EsPy/Lib/upip.py

@@ -0,0 +1 @@
+../../tools/upip.py

+ 1 - 0
EsPy/Lib/upip_utarfile.py

@@ -0,0 +1 @@
+../../tools/upip_utarfile.py

+ 77 - 0
EsPy/Lib/webrepl.py

@@ -0,0 +1,77 @@
+# This module should be imported from REPL, not run from command line.
+import socket
+import uos
+import network
+import websocket
+import websocket_helper
+import _webrepl
+
+listen_s = None
+client_s = None
+
+def setup_conn(port, accept_handler):
+    global listen_s
+    listen_s = socket.socket()
+    listen_s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
+
+    ai = socket.getaddrinfo("0.0.0.0", port)
+    addr = ai[0][4]
+
+    listen_s.bind(addr)
+    listen_s.listen(1)
+    if accept_handler:
+        listen_s.setsockopt(socket.SOL_SOCKET, 20, accept_handler)
+    for i in (network.AP_IF, network.STA_IF):
+        iface = network.WLAN(i)
+        if iface.active():
+            print("WebREPL daemon started on ws://%s:%d" % (iface.ifconfig()[0], port))
+    return listen_s
+
+
+def accept_conn(listen_sock):
+    global client_s
+    cl, remote_addr = listen_sock.accept()
+    if uos.dupterm():
+        print("\nConcurrent WebREPL connection from", remote_addr, "rejected")
+        cl.close()
+        return
+    print("\nWebREPL connection from:", remote_addr)
+    client_s = cl
+    websocket_helper.server_handshake(cl)
+    ws = websocket.websocket(cl, True)
+    ws = _webrepl._webrepl(ws)
+    cl.setblocking(False)
+    # notify REPL on socket incoming data
+    cl.setsockopt(socket.SOL_SOCKET, 20, uos.dupterm_notify)
+    uos.dupterm(ws)
+
+
+def stop():
+    global listen_s, client_s
+    uos.dupterm(None)
+    if client_s:
+        client_s.close()
+    if listen_s:
+        listen_s.close()
+
+
+def start(port=8266, password=None):
+    stop()
+    if password is None:
+        try:
+            import webrepl_cfg
+            _webrepl.password(webrepl_cfg.PASS)
+            setup_conn(port, accept_conn)
+            print("Started webrepl in normal mode")
+        except:
+            print("WebREPL is not configured, run 'import webrepl_setup'")
+    else:
+        _webrepl.password(password)
+        setup_conn(port, accept_conn)
+        print("Started webrepl in manual override mode")
+
+
+def start_foreground(port=8266):
+    stop()
+    s = setup_conn(port, None)
+    accept_conn(s)

+ 111 - 0
EsPy/Lib/webrepl_setup.py

@@ -0,0 +1,111 @@
+import sys
+#import uos as os
+import os
+import machine
+
+RC = "./boot.py"
+CONFIG = "./webrepl_cfg.py"
+
+def input_choice(prompt, choices):
+    while 1:
+        resp = input(prompt)
+        if resp in choices:
+            return resp
+
+def getpass(prompt):
+    return input(prompt)
+
+def input_pass():
+    while 1:
+        passwd1 = getpass("New password: ")
+        if len(passwd1) < 4:
+            print("Password too short")
+            continue
+        elif len(passwd1) > 9:
+            print("Password too long")
+            continue
+        passwd2 = getpass("Confirm password: ")
+        if passwd1 == passwd2:
+            return passwd1
+        print("Passwords do not match")
+
+
+def exists(fname):
+    try:
+        with open(fname):
+            pass
+        return True
+    except OSError:
+        return False
+
+def copy_stream(s_in, s_out):
+    buf = bytearray(64)
+    while 1:
+        sz = s_in.readinto(buf)
+        s_out.write(buf, sz)
+
+
+def get_daemon_status():
+    with open(RC) as f:
+        for l in f:
+            if "webrepl" in l:
+                if l.startswith("#"):
+                    return False
+                return True
+        return None
+
+def add_daemon():
+    with open(RC) as old_f, open(RC + ".tmp", "w") as new_f:
+        new_f.write("import webrepl\nwebrepl.start()\n")
+        copy_stream(old_f, new_f)
+
+def change_daemon(action):
+    LINES = ("import webrepl", "webrepl.start()")
+    with open(RC) as old_f, open(RC + ".tmp", "w") as new_f:
+        for l in old_f:
+            for patt in LINES:
+                if patt in l:
+                    if action and l.startswith("#"):
+                        l = l[1:]
+                    elif not action and not l.startswith("#"):
+                        l = "#" + l
+            new_f.write(l)
+    # FatFs rename() is not POSIX compliant, will raise OSError if
+    # dest file exists.
+    os.remove(RC)
+    os.rename(RC + ".tmp", RC)
+
+
+def main():
+    status = get_daemon_status()
+
+    print("WebREPL daemon auto-start status:", "enabled" if status else "disabled")
+    print("\nWould you like to (E)nable or (D)isable it running on boot?")
+    print("(Empty line to quit)")
+    resp = input("> ").upper()
+
+    if resp == "E":
+        if exists(CONFIG):
+            resp2 = input_choice("Would you like to change WebREPL password? (y/n) ", ("y", "n", ""))
+        else:
+            print("To enable WebREPL, you must set password for it")
+            resp2 = "y"
+
+        if resp2 == "y":
+            passwd = input_pass()
+            with open(CONFIG, "w") as f:
+                f.write("PASS = %r\n" % passwd)
+
+
+    if resp not in ("D", "E") or (resp == "D" and not status) or (resp == "E" and status):
+        print("No further action required")
+        sys.exit()
+
+    change_daemon(resp == "E")
+
+    print("Changes will be activated after reboot")
+    resp = input_choice("Would you like to reboot now? (y/n) ", ("y", "n", ""))
+    if resp == "y":
+        machine.reset()
+
+main()

+ 74 - 0
EsPy/Lib/websocket_helper.py

@@ -0,0 +1,74 @@
+import sys
+try:
+    import ubinascii as binascii
+except:
+    import binascii
+try:
+    import uhashlib as hashlib
+except:
+    import hashlib
+
+DEBUG = 0
+
+def server_handshake(sock):
+    clr = sock.makefile("rwb", 0)
+    l = clr.readline()
+    #sys.stdout.write(repr(l))
+
+    webkey = None
+
+    while 1:
+        l = clr.readline()
+        if not l:
+            raise OSError("EOF in headers")
+        if l == b"\r\n":
+            break
+    #    sys.stdout.write(l)
+        h, v = [x.strip() for x in l.split(b":", 1)]
+        if DEBUG:
+            print((h, v))
+        if h == b'Sec-WebSocket-Key':
+            webkey = v
+
+    if not webkey:
+        raise OSError("Not a websocket request")
+
+    if DEBUG:
+        print("Sec-WebSocket-Key:", webkey, len(webkey))
+
+    d = hashlib.sha1(webkey)
+    d.update(b"258EAFA5-E914-47DA-95CA-C5AB0DC85B11")
+    respkey = d.digest()
+    respkey = binascii.b2a_base64(respkey)[:-1]
+    if DEBUG:
+        print("respkey:", respkey)
+
+    sock.send(b"""\
+HTTP/1.1 101 Switching Protocols\r
+Upgrade: websocket\r
+Connection: Upgrade\r
+Sec-WebSocket-Accept: """)
+    sock.send(respkey)
+    sock.send("\r\n\r\n")
+
+
+# Very simplified client handshake, works for MicroPython's
+# websocket server implementation, but probably not for other
+# servers.
+def client_handshake(sock):
+    cl = sock.makefile("rwb", 0)
+    cl.write(b"""\
+GET / HTTP/1.1\r
+Host: echo.websocket.org\r
+Connection: Upgrade\r
+Upgrade: websocket\r
+Sec-WebSocket-Key: foo\r
+\r
+""")
+    l = cl.readline()
+#    print(l)
+    while 1:
+        l = cl.readline()
+        if l == b"\r\n":
+            break
+#        sys.stdout.write(l)

+ 768 - 0
EsPy/MainForm.Designer.cs

@@ -0,0 +1,768 @@
+namespace EsPy
+{
+    partial class MainForm
+    {
+        /// <summary>
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary>
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Windows Form Designer generated code
+
+        /// <summary>
+        /// Required method for Designer support - do not modify
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.components = new System.ComponentModel.Container();
+            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm));
+            this.menuStrip1 = new System.Windows.Forms.MenuStrip();
+            this.mnFile = new System.Windows.Forms.ToolStripMenuItem();
+            this.mnNew = new System.Windows.Forms.ToolStripMenuItem();
+            this.mnNewPython = new System.Windows.Forms.ToolStripMenuItem();
+            this.mnNewHtml = new System.Windows.Forms.ToolStripMenuItem();
+            this.mnNewCss = new System.Windows.Forms.ToolStripMenuItem();
+            this.mnNewJs = new System.Windows.Forms.ToolStripMenuItem();
+            this.mnNewJson = new System.Windows.Forms.ToolStripMenuItem();
+            this.mnNewTxt = new System.Windows.Forms.ToolStripMenuItem();
+            this.mnNewOther = new System.Windows.Forms.ToolStripMenuItem();
+            this.mnOpen = new System.Windows.Forms.ToolStripMenuItem();
+            this.toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator();
+            this.mnSave = new System.Windows.Forms.ToolStripMenuItem();
+            this.mnSaveAs = new System.Windows.Forms.ToolStripMenuItem();
+            this.mnSaveAll = new System.Windows.Forms.ToolStripMenuItem();
+            this.toolStripMenuItem2 = new System.Windows.Forms.ToolStripSeparator();
+            this.exitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+            this.mnEdit = new System.Windows.Forms.ToolStripMenuItem();
+            this.settingsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+            this.mnView = new System.Windows.Forms.ToolStripMenuItem();
+            this.mnTerminal = new System.Windows.Forms.ToolStripMenuItem();
+            this.mnErrorList = new System.Windows.Forms.ToolStripMenuItem();
+            this.mnDevice = new System.Windows.Forms.ToolStripMenuItem();
+            this.mnPorts = new System.Windows.Forms.ToolStripMenuItem();
+            this.mnFileManager = new System.Windows.Forms.ToolStripMenuItem();
+            this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator();
+            this.mnEspTool = new System.Windows.Forms.ToolStripMenuItem();
+            this.mnTools = new System.Windows.Forms.ToolStripMenuItem();
+            this.mnWebREPL = new System.Windows.Forms.ToolStripMenuItem();
+            this.mnHelp = new System.Windows.Forms.ToolStripMenuItem();
+            this.mnViewHelp = new System.Windows.Forms.ToolStripMenuItem();
+            this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripSeparator();
+            this.mnAbout = new System.Windows.Forms.ToolStripMenuItem();
+            this.toolStrip1 = new System.Windows.Forms.ToolStrip();
+            this.btnNew = new System.Windows.Forms.ToolStripDropDownButton();
+            this.btnNewPython = new System.Windows.Forms.ToolStripMenuItem();
+            this.btnNewHtml = new System.Windows.Forms.ToolStripMenuItem();
+            this.btnNewCss = new System.Windows.Forms.ToolStripMenuItem();
+            this.btnNewJs = new System.Windows.Forms.ToolStripMenuItem();
+            this.btnNewJson = new System.Windows.Forms.ToolStripMenuItem();
+            this.btnNewText = new System.Windows.Forms.ToolStripMenuItem();
+            this.btnNewOther = new System.Windows.Forms.ToolStripMenuItem();
+            this.btnOpen = new System.Windows.Forms.ToolStripButton();
+            this.btnSave = new System.Windows.Forms.ToolStripButton();
+            this.btnSaveAll = new System.Windows.Forms.ToolStripButton();
+            this.toolStripSeparator5 = new System.Windows.Forms.ToolStripSeparator();
+            this.btnUndo = new System.Windows.Forms.ToolStripButton();
+            this.btnRedo = new System.Windows.Forms.ToolStripButton();
+            this.toolStripSeparator6 = new System.Windows.Forms.ToolStripSeparator();
+            this.btnCut = new System.Windows.Forms.ToolStripButton();
+            this.btnCopy = new System.Windows.Forms.ToolStripButton();
+            this.btnPaste = new System.Windows.Forms.ToolStripButton();
+            this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();
+            this.btnConnect = new System.Windows.Forms.ToolStripButton();
+            this.btnDisconnect = new System.Windows.Forms.ToolStripButton();
+            this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
+            this.btnReset = new System.Windows.Forms.ToolStripButton();
+            this.toolStripSeparator7 = new System.Windows.Forms.ToolStripSeparator();
+            this.btnFileManager = new System.Windows.Forms.ToolStripButton();
+            this.statusStrip1 = new System.Windows.Forms.StatusStrip();
+            this.toolStripStatusLabel4 = new System.Windows.Forms.ToolStripStatusLabel();
+            this.toolStripStatusLabel2 = new System.Windows.Forms.ToolStripStatusLabel();
+            this.dockPanel1 = new WeifenLuo.WinFormsUI.Docking.DockPanel();
+            this.vS2015BlueTheme1 = new WeifenLuo.WinFormsUI.Docking.VS2015BlueTheme();
+            this.vS2015DarkTheme1 = new WeifenLuo.WinFormsUI.Docking.VS2015DarkTheme();
+            this.vS2015LightTheme1 = new WeifenLuo.WinFormsUI.Docking.VS2015LightTheme();
+            this.visualStudioToolStripExtender1 = new WeifenLuo.WinFormsUI.Docking.VisualStudioToolStripExtender(this.components);
+            this.menuStrip1.SuspendLayout();
+            this.toolStrip1.SuspendLayout();
+            this.statusStrip1.SuspendLayout();
+            this.SuspendLayout();
+            // 
+            // menuStrip1
+            // 
+            this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.mnFile,
+            this.mnEdit,
+            this.mnView,
+            this.mnDevice,
+            this.mnTools,
+            this.mnHelp});
+            this.menuStrip1.Location = new System.Drawing.Point(0, 0);
+            this.menuStrip1.Name = "menuStrip1";
+            this.menuStrip1.Size = new System.Drawing.Size(522, 24);
+            this.menuStrip1.TabIndex = 0;
+            this.menuStrip1.Text = "menuStrip1";
+            // 
+            // mnFile
+            // 
+            this.mnFile.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.mnNew,
+            this.mnOpen,
+            this.toolStripSeparator4,
+            this.mnSave,
+            this.mnSaveAs,
+            this.mnSaveAll,
+            this.toolStripMenuItem2,
+            this.exitToolStripMenuItem});
+            this.mnFile.Name = "mnFile";
+            this.mnFile.Size = new System.Drawing.Size(37, 20);
+            this.mnFile.Text = "&File";
+            // 
+            // mnNew
+            // 
+            this.mnNew.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.mnNewPython,
+            this.mnNewHtml,
+            this.mnNewCss,
+            this.mnNewJs,
+            this.mnNewJson,
+            this.mnNewTxt,
+            this.mnNewOther});
+            this.mnNew.Image = ((System.Drawing.Image)(resources.GetObject("mnNew.Image")));
+            this.mnNew.Name = "mnNew";
+            this.mnNew.Size = new System.Drawing.Size(121, 22);
+            this.mnNew.Text = "New";
+            // 
+            // mnNewPython
+            // 
+            this.mnNewPython.Name = "mnNewPython";
+            this.mnNewPython.Size = new System.Drawing.Size(134, 22);
+            this.mnNewPython.Tag = ".py";
+            this.mnNewPython.Text = "Python...";
+            this.mnNewPython.Click += new System.EventHandler(this.mnNewPython_Click);
+            // 
+            // mnNewHtml
+            // 
+            this.mnNewHtml.Name = "mnNewHtml";
+            this.mnNewHtml.Size = new System.Drawing.Size(134, 22);
+            this.mnNewHtml.Tag = ".html";
+            this.mnNewHtml.Text = "HTML...";
+            this.mnNewHtml.Click += new System.EventHandler(this.mnNewHtml_Click);
+            // 
+            // mnNewCss
+            // 
+            this.mnNewCss.Name = "mnNewCss";
+            this.mnNewCss.Size = new System.Drawing.Size(134, 22);
+            this.mnNewCss.Tag = ".css";
+            this.mnNewCss.Text = "Css...";
+            this.mnNewCss.Click += new System.EventHandler(this.mnNewCss_Click);
+            // 
+            // mnNewJs
+            // 
+            this.mnNewJs.Name = "mnNewJs";
+            this.mnNewJs.Size = new System.Drawing.Size(134, 22);
+            this.mnNewJs.Tag = ".js";
+            this.mnNewJs.Text = "Javascript...";
+            this.mnNewJs.Click += new System.EventHandler(this.mnNewJs_Click);
+            // 
+            // mnNewJson
+            // 
+            this.mnNewJson.Name = "mnNewJson";
+            this.mnNewJson.Size = new System.Drawing.Size(134, 22);
+            this.mnNewJson.Tag = ".json";
+            this.mnNewJson.Text = "JSON...";
+            this.mnNewJson.Click += new System.EventHandler(this.mnNewJson_Click);
+            // 
+            // mnNewTxt
+            // 
+            this.mnNewTxt.Name = "mnNewTxt";
+            this.mnNewTxt.Size = new System.Drawing.Size(134, 22);
+            this.mnNewTxt.Text = "Text...";
+            this.mnNewTxt.Click += new System.EventHandler(this.mnNewTxt_Click);
+            // 
+            // mnNewOther
+            // 
+            this.mnNewOther.Name = "mnNewOther";
+            this.mnNewOther.Size = new System.Drawing.Size(134, 22);
+            this.mnNewOther.Text = "Other...";
+            this.mnNewOther.Click += new System.EventHandler(this.mnNewOther_Click);
+            // 
+            // mnOpen
+            // 
+            this.mnOpen.Image = ((System.Drawing.Image)(resources.GetObject("mnOpen.Image")));
+            this.mnOpen.Name = "mnOpen";
+            this.mnOpen.Size = new System.Drawing.Size(121, 22);
+            this.mnOpen.Text = "Open...";
+            this.mnOpen.Click += new System.EventHandler(this.mnOpen_Click);
+            // 
+            // toolStripSeparator4
+            // 
+            this.toolStripSeparator4.Name = "toolStripSeparator4";
+            this.toolStripSeparator4.Size = new System.Drawing.Size(118, 6);
+            // 
+            // mnSave
+            // 
+            this.mnSave.Enabled = false;
+            this.mnSave.Name = "mnSave";
+            this.mnSave.Size = new System.Drawing.Size(121, 22);
+            this.mnSave.Text = "Save";
+            this.mnSave.Click += new System.EventHandler(this.mnSave_Click);
+            // 
+            // mnSaveAs
+            // 
+            this.mnSaveAs.Enabled = false;
+            this.mnSaveAs.Name = "mnSaveAs";
+            this.mnSaveAs.Size = new System.Drawing.Size(121, 22);
+            this.mnSaveAs.Text = "Save as...";
+            this.mnSaveAs.Click += new System.EventHandler(this.mnSaveAs_Click);
+            // 
+            // mnSaveAll
+            // 
+            this.mnSaveAll.Image = global::EsPy.Properties.Resources.saveall;
+            this.mnSaveAll.Name = "mnSaveAll";
+            this.mnSaveAll.Size = new System.Drawing.Size(121, 22);
+            this.mnSaveAll.Text = "Save all";
+            this.mnSaveAll.Click += new System.EventHandler(this.mnSaveAll_Click);
+            // 
+            // toolStripMenuItem2
+            // 
+            this.toolStripMenuItem2.Name = "toolStripMenuItem2";
+            this.toolStripMenuItem2.Size = new System.Drawing.Size(118, 6);
+            // 
+            // exitToolStripMenuItem
+            // 
+            this.exitToolStripMenuItem.Name = "exitToolStripMenuItem";
+            this.exitToolStripMenuItem.Size = new System.Drawing.Size(121, 22);
+            this.exitToolStripMenuItem.Text = "Exit";
+            // 
+            // mnEdit
+            // 
+            this.mnEdit.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.settingsToolStripMenuItem});
+            this.mnEdit.Name = "mnEdit";
+            this.mnEdit.Size = new System.Drawing.Size(39, 20);
+            this.mnEdit.Text = "&Edit";
+            // 
+            // settingsToolStripMenuItem
+            // 
+            this.settingsToolStripMenuItem.Enabled = false;
+            this.settingsToolStripMenuItem.MergeIndex = 20;
+            this.settingsToolStripMenuItem.Name = "settingsToolStripMenuItem";
+            this.settingsToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
+            this.settingsToolStripMenuItem.Text = "Settings...";
+            this.settingsToolStripMenuItem.Click += new System.EventHandler(this.settingsToolStripMenuItem_Click);
+            // 
+            // mnView
+            // 
+            this.mnView.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.mnTerminal,
+            this.mnErrorList});
+            this.mnView.Name = "mnView";
+            this.mnView.Size = new System.Drawing.Size(44, 20);
+            this.mnView.Text = "&View";
+            this.mnView.DropDownOpening += new System.EventHandler(this.btnView_DropDownOpening);
+            // 
+            // mnTerminal
+            // 
+            this.mnTerminal.Name = "mnTerminal";
+            this.mnTerminal.Size = new System.Drawing.Size(121, 22);
+            this.mnTerminal.Text = "Terminal";
+            this.mnTerminal.Click += new System.EventHandler(this.mnTerminal_Click);
+            // 
+            // mnErrorList
+            // 
+            this.mnErrorList.Name = "mnErrorList";
+            this.mnErrorList.Size = new System.Drawing.Size(121, 22);
+            this.mnErrorList.Text = "Error List";
+            this.mnErrorList.Click += new System.EventHandler(this.mnErrorList_Click);
+            // 
+            // mnDevice
+            // 
+            this.mnDevice.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.mnPorts,
+            this.mnFileManager,
+            this.toolStripSeparator3,
+            this.mnEspTool});
+            this.mnDevice.Name = "mnDevice";
+            this.mnDevice.Size = new System.Drawing.Size(54, 20);
+            this.mnDevice.Text = "Device";
+            this.mnDevice.DropDownOpening += new System.EventHandler(this.mnDevice_DropDownOpening);
+            // 
+            // mnPorts
+            // 
+            this.mnPorts.Image = global::EsPy.Properties.Resources.port;
+            this.mnPorts.Name = "mnPorts";
+            this.mnPorts.Size = new System.Drawing.Size(148, 22);
+            this.mnPorts.Text = "Ports";
+            // 
+            // mnFileManager
+            // 
+            this.mnFileManager.Enabled = false;
+            this.mnFileManager.Image = global::EsPy.Properties.Resources.filemanager;
+            this.mnFileManager.Name = "mnFileManager";
+            this.mnFileManager.Size = new System.Drawing.Size(148, 22);
+            this.mnFileManager.Text = "Filemanager...";
+            this.mnFileManager.Click += new System.EventHandler(this.mnFileManager_Click);
+            // 
+            // toolStripSeparator3
+            // 
+            this.toolStripSeparator3.Name = "toolStripSeparator3";
+            this.toolStripSeparator3.Size = new System.Drawing.Size(145, 6);
+            // 
+            // mnEspTool
+            // 
+            this.mnEspTool.Enabled = false;
+            this.mnEspTool.Name = "mnEspTool";
+            this.mnEspTool.Size = new System.Drawing.Size(148, 22);
+            this.mnEspTool.Text = "EspTool...";
+            this.mnEspTool.Click += new System.EventHandler(this.btnFlashing_Click);
+            // 
+            // mnTools
+            // 
+            this.mnTools.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.mnWebREPL});
+            this.mnTools.Name = "mnTools";
+            this.mnTools.Size = new System.Drawing.Size(48, 20);
+            this.mnTools.Text = "Tools";
+            // 
+            // mnWebREPL
+            // 
+            this.mnWebREPL.Name = "mnWebREPL";
+            this.mnWebREPL.Size = new System.Drawing.Size(124, 22);
+            this.mnWebREPL.Text = "WebREPL";
+            this.mnWebREPL.Click += new System.EventHandler(this.mnWebREPL_Click);
+            // 
+            // mnHelp
+            // 
+            this.mnHelp.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.mnViewHelp,
+            this.toolStripMenuItem1,
+            this.mnAbout});
+            this.mnHelp.Name = "mnHelp";
+            this.mnHelp.Size = new System.Drawing.Size(44, 20);
+            this.mnHelp.Text = "Help";
+            // 
+            // mnViewHelp
+            // 
+            this.mnViewHelp.Name = "mnViewHelp";
+            this.mnViewHelp.Size = new System.Drawing.Size(127, 22);
+            this.mnViewHelp.Text = "View Help";
+            this.mnViewHelp.Click += new System.EventHandler(this.mnViewHelp_Click);
+            // 
+            // toolStripMenuItem1
+            // 
+            this.toolStripMenuItem1.Name = "toolStripMenuItem1";
+            this.toolStripMenuItem1.Size = new System.Drawing.Size(124, 6);
+            // 
+            // mnAbout
+            // 
+            this.mnAbout.Name = "mnAbout";
+            this.mnAbout.Size = new System.Drawing.Size(127, 22);
+            this.mnAbout.Text = "About";
+            this.mnAbout.Click += new System.EventHandler(this.mnAbout_Click);
+            // 
+            // toolStrip1
+            // 
+            this.toolStrip1.ImageScalingSize = new System.Drawing.Size(24, 24);
+            this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.btnNew,
+            this.btnOpen,
+            this.btnSave,
+            this.btnSaveAll,
+            this.toolStripSeparator5,
+            this.btnUndo,
+            this.btnRedo,
+            this.toolStripSeparator6,
+            this.btnCut,
+            this.btnCopy,
+            this.btnPaste,
+            this.toolStripSeparator2,
+            this.btnConnect,
+            this.btnDisconnect,
+            this.toolStripSeparator1,
+            this.btnReset,
+            this.toolStripSeparator7,
+            this.btnFileManager});
+            this.toolStrip1.Location = new System.Drawing.Point(0, 24);
+            this.toolStrip1.Name = "toolStrip1";
+            this.toolStrip1.Size = new System.Drawing.Size(522, 31);
+            this.toolStrip1.TabIndex = 1;
+            this.toolStrip1.Text = "toolStrip1";
+            // 
+            // btnNew
+            // 
+            this.btnNew.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+            this.btnNew.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.btnNewPython,
+            this.btnNewHtml,
+            this.btnNewCss,
+            this.btnNewJs,
+            this.btnNewJson,
+            this.btnNewText,
+            this.btnNewOther});
+            this.btnNew.Image = ((System.Drawing.Image)(resources.GetObject("btnNew.Image")));
+            this.btnNew.ImageTransparentColor = System.Drawing.Color.Magenta;
+            this.btnNew.Name = "btnNew";
+            this.btnNew.Size = new System.Drawing.Size(37, 28);
+            this.btnNew.Text = "New File";
+            // 
+            // btnNewPython
+            // 
+            this.btnNewPython.Name = "btnNewPython";
+            this.btnNewPython.Size = new System.Drawing.Size(134, 22);
+            this.btnNewPython.Tag = ".py";
+            this.btnNewPython.Text = "Python...";
+            this.btnNewPython.Click += new System.EventHandler(this.mnNewPython_Click);
+            // 
+            // btnNewHtml
+            // 
+            this.btnNewHtml.Name = "btnNewHtml";
+            this.btnNewHtml.Size = new System.Drawing.Size(134, 22);
+            this.btnNewHtml.Tag = ".html";
+            this.btnNewHtml.Text = "HTML...";
+            this.btnNewHtml.Click += new System.EventHandler(this.mnNewHtml_Click);
+            // 
+            // btnNewCss
+            // 
+            this.btnNewCss.Name = "btnNewCss";
+            this.btnNewCss.Size = new System.Drawing.Size(134, 22);
+            this.btnNewCss.Tag = ".css";
+            this.btnNewCss.Text = "Css...";
+            this.btnNewCss.Click += new System.EventHandler(this.mnNewCss_Click);
+            // 
+            // btnNewJs
+            // 
+            this.btnNewJs.Name = "btnNewJs";
+            this.btnNewJs.Size = new System.Drawing.Size(134, 22);
+            this.btnNewJs.Tag = ".js";
+            this.btnNewJs.Text = "Javascript...";
+            this.btnNewJs.Click += new System.EventHandler(this.mnNewJs_Click);
+            // 
+            // btnNewJson
+            // 
+            this.btnNewJson.Name = "btnNewJson";
+            this.btnNewJson.Size = new System.Drawing.Size(134, 22);
+            this.btnNewJson.Tag = ".json";
+            this.btnNewJson.Text = "JSON...";
+            this.btnNewJson.Click += new System.EventHandler(this.mnNewJson_Click);
+            // 
+            // btnNewText
+            // 
+            this.btnNewText.Name = "btnNewText";
+            this.btnNewText.Size = new System.Drawing.Size(134, 22);
+            this.btnNewText.Text = "Text...";
+            this.btnNewText.Click += new System.EventHandler(this.mnNewTxt_Click);
+            // 
+            // btnNewOther
+            // 
+            this.btnNewOther.Name = "btnNewOther";
+            this.btnNewOther.Size = new System.Drawing.Size(134, 22);
+            this.btnNewOther.Text = "Other...";
+            this.btnNewOther.Click += new System.EventHandler(this.mnNewOther_Click);
+            // 
+            // btnOpen
+            // 
+            this.btnOpen.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+            this.btnOpen.Image = ((System.Drawing.Image)(resources.GetObject("btnOpen.Image")));
+            this.btnOpen.ImageTransparentColor = System.Drawing.Color.Magenta;
+            this.btnOpen.Name = "btnOpen";
+            this.btnOpen.Size = new System.Drawing.Size(28, 28);
+            this.btnOpen.Text = "Open...";
+            this.btnOpen.ToolTipText = "Open a File...";
+            this.btnOpen.Click += new System.EventHandler(this.mnOpen_Click);
+            // 
+            // btnSave
+            // 
+            this.btnSave.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+            this.btnSave.Enabled = false;
+            this.btnSave.Image = ((System.Drawing.Image)(resources.GetObject("btnSave.Image")));
+            this.btnSave.ImageTransparentColor = System.Drawing.Color.Magenta;
+            this.btnSave.Name = "btnSave";
+            this.btnSave.Size = new System.Drawing.Size(28, 28);
+            this.btnSave.Text = "Save";
+            // 
+            // btnSaveAll
+            // 
+            this.btnSaveAll.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+            this.btnSaveAll.Image = global::EsPy.Properties.Resources.saveall;
+            this.btnSaveAll.ImageTransparentColor = System.Drawing.Color.Magenta;
+            this.btnSaveAll.Name = "btnSaveAll";
+            this.btnSaveAll.Size = new System.Drawing.Size(28, 28);
+            this.btnSaveAll.Text = "Save All";
+            this.btnSaveAll.Click += new System.EventHandler(this.btnSaveAll_Click);
+            // 
+            // toolStripSeparator5
+            // 
+            this.toolStripSeparator5.Name = "toolStripSeparator5";
+            this.toolStripSeparator5.Size = new System.Drawing.Size(6, 31);
+            // 
+            // btnUndo
+            // 
+            this.btnUndo.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+            this.btnUndo.Enabled = false;
+            this.btnUndo.Image = ((System.Drawing.Image)(resources.GetObject("btnUndo.Image")));
+            this.btnUndo.ImageTransparentColor = System.Drawing.Color.Magenta;
+            this.btnUndo.Name = "btnUndo";
+            this.btnUndo.Size = new System.Drawing.Size(28, 28);
+            this.btnUndo.Text = "Undo";
+            // 
+            // btnRedo
+            // 
+            this.btnRedo.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+            this.btnRedo.Enabled = false;
+            this.btnRedo.Image = ((System.Drawing.Image)(resources.GetObject("btnRedo.Image")));
+            this.btnRedo.ImageTransparentColor = System.Drawing.Color.Magenta;
+            this.btnRedo.Name = "btnRedo";
+            this.btnRedo.Size = new System.Drawing.Size(28, 28);
+            this.btnRedo.Text = "Redo";
+            // 
+            // toolStripSeparator6
+            // 
+            this.toolStripSeparator6.Name = "toolStripSeparator6";
+            this.toolStripSeparator6.Size = new System.Drawing.Size(6, 31);
+            // 
+            // btnCut
+            // 
+            this.btnCut.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+            this.btnCut.Enabled = false;
+            this.btnCut.Image = ((System.Drawing.Image)(resources.GetObject("btnCut.Image")));
+            this.btnCut.ImageTransparentColor = System.Drawing.Color.Magenta;
+            this.btnCut.Name = "btnCut";
+            this.btnCut.Size = new System.Drawing.Size(28, 28);
+            this.btnCut.Text = "Cut";
+            // 
+            // btnCopy
+            // 
+            this.btnCopy.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+            this.btnCopy.Enabled = false;
+            this.btnCopy.Image = ((System.Drawing.Image)(resources.GetObject("btnCopy.Image")));
+            this.btnCopy.ImageTransparentColor = System.Drawing.Color.Magenta;
+            this.btnCopy.Name = "btnCopy";
+            this.btnCopy.Size = new System.Drawing.Size(28, 28);
+            this.btnCopy.Text = "Copy";
+            // 
+            // btnPaste
+            // 
+            this.btnPaste.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+            this.btnPaste.Enabled = false;
+            this.btnPaste.Image = ((System.Drawing.Image)(resources.GetObject("btnPaste.Image")));
+            this.btnPaste.ImageTransparentColor = System.Drawing.Color.Magenta;
+            this.btnPaste.Name = "btnPaste";
+            this.btnPaste.Size = new System.Drawing.Size(28, 28);
+            this.btnPaste.Text = "Paste";
+            // 
+            // toolStripSeparator2
+            // 
+            this.toolStripSeparator2.Name = "toolStripSeparator2";
+            this.toolStripSeparator2.Size = new System.Drawing.Size(6, 31);
+            // 
+            // btnConnect
+            // 
+            this.btnConnect.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+            this.btnConnect.Enabled = false;
+            this.btnConnect.Image = ((System.Drawing.Image)(resources.GetObject("btnConnect.Image")));
+            this.btnConnect.ImageTransparentColor = System.Drawing.Color.Magenta;
+            this.btnConnect.Name = "btnConnect";
+            this.btnConnect.Size = new System.Drawing.Size(28, 28);
+            this.btnConnect.Text = "Connect";
+            this.btnConnect.Click += new System.EventHandler(this.btnConnect_Click);
+            // 
+            // btnDisconnect
+            // 
+            this.btnDisconnect.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+            this.btnDisconnect.Enabled = false;
+            this.btnDisconnect.Image = ((System.Drawing.Image)(resources.GetObject("btnDisconnect.Image")));
+            this.btnDisconnect.ImageTransparentColor = System.Drawing.Color.Magenta;
+            this.btnDisconnect.Name = "btnDisconnect";
+            this.btnDisconnect.Size = new System.Drawing.Size(28, 28);
+            this.btnDisconnect.Text = "Disconnect";
+            this.btnDisconnect.Click += new System.EventHandler(this.btnDisconnect_Click);
+            // 
+            // toolStripSeparator1
+            // 
+            this.toolStripSeparator1.Name = "toolStripSeparator1";
+            this.toolStripSeparator1.Size = new System.Drawing.Size(6, 31);
+            // 
+            // btnReset
+            // 
+            this.btnReset.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+            this.btnReset.Enabled = false;
+            this.btnReset.Image = global::EsPy.Properties.Resources.update;
+            this.btnReset.ImageTransparentColor = System.Drawing.Color.Magenta;
+            this.btnReset.Name = "btnReset";
+            this.btnReset.Size = new System.Drawing.Size(28, 28);
+            this.btnReset.Text = "Soft reset";
+            this.btnReset.Click += new System.EventHandler(this.btnReset_Click);
+            // 
+            // toolStripSeparator7
+            // 
+            this.toolStripSeparator7.Name = "toolStripSeparator7";
+            this.toolStripSeparator7.Size = new System.Drawing.Size(6, 31);
+            // 
+            // btnFileManager
+            // 
+            this.btnFileManager.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+            this.btnFileManager.Enabled = false;
+            this.btnFileManager.Image = global::EsPy.Properties.Resources.filemanager;
+            this.btnFileManager.ImageTransparentColor = System.Drawing.Color.Magenta;
+            this.btnFileManager.Name = "btnFileManager";
+            this.btnFileManager.Size = new System.Drawing.Size(28, 28);
+            this.btnFileManager.Text = "File Manager";
+            this.btnFileManager.Click += new System.EventHandler(this.mnFileManager_Click);
+            // 
+            // statusStrip1
+            // 
+            this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.toolStripStatusLabel4,
+            this.toolStripStatusLabel2});
+            this.statusStrip1.Location = new System.Drawing.Point(0, 398);
+            this.statusStrip1.Name = "statusStrip1";
+            this.statusStrip1.Size = new System.Drawing.Size(522, 22);
+            this.statusStrip1.TabIndex = 2;
+            this.statusStrip1.Text = "statusStrip1";
+            // 
+            // toolStripStatusLabel4
+            // 
+            this.toolStripStatusLabel4.Name = "toolStripStatusLabel4";
+            this.toolStripStatusLabel4.Size = new System.Drawing.Size(32, 17);
+            this.toolStripStatusLabel4.Text = "Port:";
+            this.toolStripStatusLabel4.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+            // 
+            // toolStripStatusLabel2
+            // 
+            this.toolStripStatusLabel2.AutoSize = false;
+            this.toolStripStatusLabel2.Name = "toolStripStatusLabel2";
+            this.toolStripStatusLabel2.Size = new System.Drawing.Size(60, 17);
+            this.toolStripStatusLabel2.Text = "---";
+            this.toolStripStatusLabel2.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+            // 
+            // dockPanel1
+            // 
+            this.dockPanel1.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.dockPanel1.DockBackColor = System.Drawing.SystemColors.ControlDarkDark;
+            this.dockPanel1.DocumentStyle = WeifenLuo.WinFormsUI.Docking.DocumentStyle.DockingWindow;
+            this.dockPanel1.Location = new System.Drawing.Point(0, 55);
+            this.dockPanel1.Name = "dockPanel1";
+            this.dockPanel1.Size = new System.Drawing.Size(522, 343);
+            this.dockPanel1.TabIndex = 3;
+            this.dockPanel1.ActiveDocumentChanged += new System.EventHandler(this.dockPanel1_ActiveDocumentChanged);
+            this.dockPanel1.ActiveContentChanged += new System.EventHandler(this.dockPanel1_ActiveContentChanged);
+            // 
+            // visualStudioToolStripExtender1
+            // 
+            this.visualStudioToolStripExtender1.DefaultRenderer = null;
+            // 
+            // MainForm
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.ClientSize = new System.Drawing.Size(522, 420);
+            this.Controls.Add(this.dockPanel1);
+            this.Controls.Add(this.statusStrip1);
+            this.Controls.Add(this.toolStrip1);
+            this.Controls.Add(this.menuStrip1);
+            this.IsMdiContainer = true;
+            this.MainMenuStrip = this.menuStrip1;
+            this.Name = "MainForm";
+            this.Text = "MainForm";
+            this.WindowState = System.Windows.Forms.FormWindowState.Maximized;
+            this.Deactivate += new System.EventHandler(this.MainForm_Deactivate);
+            this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.MainForm_FormClosing);
+            this.Load += new System.EventHandler(this.MainForm_Load);
+            this.menuStrip1.ResumeLayout(false);
+            this.menuStrip1.PerformLayout();
+            this.toolStrip1.ResumeLayout(false);
+            this.toolStrip1.PerformLayout();
+            this.statusStrip1.ResumeLayout(false);
+            this.statusStrip1.PerformLayout();
+            this.ResumeLayout(false);
+            this.PerformLayout();
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.MenuStrip menuStrip1;
+        private System.Windows.Forms.ToolStripMenuItem mnFile;
+        private System.Windows.Forms.ToolStripMenuItem mnEdit;
+        private System.Windows.Forms.ToolStripMenuItem mnView;
+        private System.Windows.Forms.ToolStrip toolStrip1;
+        private System.Windows.Forms.StatusStrip statusStrip1;
+        private WeifenLuo.WinFormsUI.Docking.VS2015BlueTheme vS2015BlueTheme1;
+        private WeifenLuo.WinFormsUI.Docking.VS2015DarkTheme vS2015DarkTheme1;
+        private WeifenLuo.WinFormsUI.Docking.VS2015LightTheme vS2015LightTheme1;
+        private WeifenLuo.WinFormsUI.Docking.VisualStudioToolStripExtender visualStudioToolStripExtender1;
+        private System.Windows.Forms.ToolStripMenuItem mnTerminal;
+        private System.Windows.Forms.ToolStripMenuItem mnNew;
+        private System.Windows.Forms.ToolStripMenuItem mnNewPython;
+        private System.Windows.Forms.ToolStripMenuItem settingsToolStripMenuItem;
+        private System.Windows.Forms.ToolStripButton btnOpen;
+        private System.Windows.Forms.ToolStripMenuItem mnOpen;
+        private System.Windows.Forms.ToolStripDropDownButton btnNew;
+        private System.Windows.Forms.ToolStripButton btnConnect;
+        private System.Windows.Forms.ToolStripButton btnDisconnect;
+        private System.Windows.Forms.ToolStripMenuItem mnHelp;
+        private System.Windows.Forms.ToolStripMenuItem mnViewHelp;
+        private System.Windows.Forms.ToolStripSeparator toolStripMenuItem1;
+        private System.Windows.Forms.ToolStripMenuItem mnAbout;
+        private System.Windows.Forms.ToolStripButton btnReset;
+        private System.Windows.Forms.ToolStripMenuItem mnTools;
+        private System.Windows.Forms.ToolStripSeparator toolStripSeparator4;
+        private System.Windows.Forms.ToolStripMenuItem mnSave;
+        private System.Windows.Forms.ToolStripMenuItem mnSaveAs;
+        private System.Windows.Forms.ToolStripMenuItem mnSaveAll;
+        private System.Windows.Forms.ToolStripSeparator toolStripMenuItem2;
+        private System.Windows.Forms.ToolStripMenuItem exitToolStripMenuItem;
+        private System.Windows.Forms.ToolStripSeparator toolStripSeparator2;
+        private System.Windows.Forms.ToolStripButton btnSave;
+        private System.Windows.Forms.ToolStripSeparator toolStripSeparator5;
+        private System.Windows.Forms.ToolStripButton btnUndo;
+        private System.Windows.Forms.ToolStripButton btnRedo;
+        private System.Windows.Forms.ToolStripSeparator toolStripSeparator6;
+        private System.Windows.Forms.ToolStripButton btnCut;
+        private System.Windows.Forms.ToolStripButton btnCopy;
+        private System.Windows.Forms.ToolStripButton btnPaste;
+        private System.Windows.Forms.ToolStripMenuItem mnDevice;
+        private System.Windows.Forms.ToolStripMenuItem mnPorts;
+        private System.Windows.Forms.ToolStripSeparator toolStripSeparator1;
+        private System.Windows.Forms.ToolStripButton btnSaveAll;
+        private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel2;
+        private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel4;
+        private System.Windows.Forms.ToolStripMenuItem mnNewHtml;
+        private System.Windows.Forms.ToolStripMenuItem mnNewCss;
+        private System.Windows.Forms.ToolStripMenuItem mnNewJs;
+        private System.Windows.Forms.ToolStripMenuItem mnNewJson;
+        private System.Windows.Forms.ToolStripMenuItem mnNewTxt;
+        private System.Windows.Forms.ToolStripMenuItem mnNewOther;
+        private System.Windows.Forms.ToolStripMenuItem mnFileManager;
+        private System.Windows.Forms.ToolStripMenuItem mnWebREPL;
+        private System.Windows.Forms.ToolStripSeparator toolStripSeparator3;
+        private System.Windows.Forms.ToolStripMenuItem mnEspTool;
+        private System.Windows.Forms.ToolStripMenuItem btnNewPython;
+        private System.Windows.Forms.ToolStripMenuItem btnNewHtml;
+        private System.Windows.Forms.ToolStripMenuItem btnNewCss;
+        private System.Windows.Forms.ToolStripMenuItem btnNewJs;
+        private System.Windows.Forms.ToolStripMenuItem btnNewJson;
+        private System.Windows.Forms.ToolStripMenuItem btnNewText;
+        private System.Windows.Forms.ToolStripMenuItem btnNewOther;
+        private System.Windows.Forms.ToolStripButton btnFileManager;
+        private System.Windows.Forms.ToolStripSeparator toolStripSeparator7;
+        private System.Windows.Forms.ToolStripMenuItem mnErrorList;
+        public WeifenLuo.WinFormsUI.Docking.DockPanel dockPanel1;
+    }
+}
+

+ 1019 - 0
EsPy/MainForm.cs

@@ -0,0 +1,1019 @@
+using EsPy.Dialogs;
+using EsPy.Forms;
+using EsPy.Units;
+using EsPy.Utility;
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.IO;
+using System.Linq;
+using System.Runtime.InteropServices;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+using WeifenLuo.WinFormsUI.Docking;
+
+namespace EsPy
+{
+    public partial class MainForm : Form, IDeviceChange
+    {
+        [DllImport("User32.dll")]
+        protected static extern int SetClipboardViewer(int hWndNewViewer);
+
+        [DllImport("User32.dll", CharSet = CharSet.Auto)]
+        public static extern bool ChangeClipboardChain(IntPtr hWndRemove, IntPtr hWndNewNext);
+
+        [DllImport("user32.dll", CharSet = CharSet.Auto)]
+        public static extern int SendMessage(IntPtr hwnd, int wMsg, IntPtr wParam, IntPtr lParam);
+        IntPtr ClipboardViewer;
+
+        FileSystemWatcher FileSystemWatcher = null;
+
+        private DeserializeDockContent deserializeDockContent;
+        public TerminalForm TerminalForm = null;
+        public ErrorListForm ErrorListForm = null;
+        public MainForm()
+        {
+            InitializeComponent();
+            Globals.MainForm = this;
+
+            Globals.PyClientStart();
+
+            AutoScaleMode = AutoScaleMode.Dpi;
+
+            this.Text = Application.ProductName + " " + Application.ProductVersion;
+            this.SetSchema(this, null);
+
+            ClipboardViewer = (IntPtr)SetClipboardViewer((int)this.Handle);
+
+
+            this.FileSystemWatcher = new FileSystemWatcher();
+            this.FileSystemWatcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite 
+               | NotifyFilters.FileName | NotifyFilters.DirectoryName;
+
+            //this.FileSystemWatcher.Filter = "*.py";
+
+            //// Add event handlers.
+            //this.FileSystemWatcher.Changed += FileSystemWatcher_Changed;
+            //this.FileSystemWatcher.Created += FileSystemWatcher_Changed;
+            //this.FileSystemWatcher.Deleted += FileSystemWatcher_Changed;
+            //this.FileSystemWatcher.Renamed += FileSystemWatcher_Changed;
+
+            //// Begin watching.
+            //this.FileSystemWatcher.EnableRaisingEvents = true;
+
+            this.AllowDrop = true;
+            
+            this.DragEnter += MainForm_DragEnter;
+            this.DragDrop += MainForm_DragDrop;
+            this.DragOver += MainForm_DragOver;
+
+            
+
+        }
+
+        private void MainForm_DragOver(object sender, DragEventArgs e)
+        {
+        
+        }
+
+        private void MainForm_DragDrop(object sender, DragEventArgs e)
+        {
+            if (e.Data.GetDataPresent(DataFormats.FileDrop))
+            {
+                object data = e.Data.GetData(DataFormats.FileDrop);
+                if (data != null)
+                {
+                    string[] files = (string[])data;
+                    foreach (string file in files)
+                    {
+                        IDocument doc = this.OpenFromFile(file, EditorForm.EditorFileFormats);
+                        if (doc != null)
+                        {
+                            (doc as DockContent).Show(this.dockPanel1);
+                        }
+                    }
+                }
+            }
+            else if (e.Data.GetDataPresent(DataFormats.Text))
+            {
+                if (e.Effect == DragDropEffects.Copy)
+                {
+
+                }
+                else if (e.Effect == DragDropEffects.Move)
+                {
+
+                }
+            }
+        }
+
+        private void MainForm_DragEnter(object sender, DragEventArgs e)
+        {
+            if (e.Data.GetDataPresent(DataFormats.FileDrop))
+            {
+                string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
+                foreach (string file in files)
+                {
+                    if (EditorForm.EditorFileFormats.Find(Path.GetExtension(file)) != null)
+                        e.Effect = DragDropEffects.All;
+                    else e.Effect = DragDropEffects.None;
+                }
+                return;
+            }
+            //else if (e.Data.GetDataPresent(DataFormats.Text))
+            //{
+            //    e.Effect = DragDropEffects.All;
+            //}
+            else
+            {
+                e.Effect = DragDropEffects.None;
+            }
+            
+        }
+
+        private void FileSystemWatcher_Changed(object sender, FileSystemEventArgs e)
+        {
+            foreach (IDocument doc in Application.OpenForms)
+            {
+                if (doc is IDocument && (doc as IDocument).FileName == e.FullPath)
+                {
+
+                    if (e.ChangeType == WatcherChangeTypes.Changed)
+                    {
+                        if (MessageBox.Show($"{e.FullPath}\r\n\r\nhas been modified by another program!\r\nWould you like reload it?", "Question", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1) == DialogResult.Yes)
+                        {
+                            (doc as IDocument).LoadFromFile(e.FullPath);
+                        }
+                    }
+                }
+            }
+        }
+
+        protected override void WndProc(ref System.Windows.Forms.Message m)
+        {
+            // defined in winuser.h
+            const int WM_DRAWCLIPBOARD = 0x308;
+            const int WM_CHANGECBCHAIN = 0x030D;
+            const int WM_DEVICECHANGE = 0x219;
+            switch (m.Msg)
+            {
+                case WM_DRAWCLIPBOARD:
+                    DisplayClipboardData();
+                    SendMessage(ClipboardViewer, m.Msg, m.WParam, m.LParam);
+                    break;
+
+                case WM_CHANGECBCHAIN:
+                    if (m.WParam == ClipboardViewer)
+                        ClipboardViewer = m.LParam;
+                    else
+                        SendMessage(ClipboardViewer, m.Msg, m.WParam, m.LParam);
+                    break;
+                case WM_DEVICECHANGE:
+                    foreach (Form form in Application.OpenForms)
+                    {
+                        if (form is IDeviceChange)
+                        {
+                            (form as IDeviceChange).UpdateDevices();
+                        }
+                    }
+                    this.UpdateDevices();
+
+                    break;
+                default:
+                    base.WndProc(ref m);
+                    break;
+            }
+        }
+
+        public void UpdateDevices()
+        {
+           this.mnDevice.HideDropDown();
+            if (!this.ComportIsExists)
+            {
+                this.Port = null;
+                this.btnConnect.Enabled =
+                    this.mnFileManager.Enabled =
+                    this.btnDisconnect.Enabled =
+                    this.btnReset.Enabled =
+                    this.btnFileManager.Enabled = false;
+
+            }
+            else
+            {
+                this.mnPorts.Enabled = true;
+                this.btnConnect.Enabled = true;
+            }
+            this.mnPorts.Enabled = true;
+        }
+
+        private void DisplayClipboardData()
+        {
+            try
+            {
+                IDataObject iData = new DataObject();
+                iData = System.Windows.Forms.Clipboard.GetDataObject();
+
+                if (this.dockPanel1.ActiveDocument != null && this.dockPanel1.ActiveDocument is IDocument)
+                {
+                    IDocument doc = this.dockPanel1.ActiveDocument as IDocument;
+                    doc.CanPaste = iData.GetDataPresent(DataFormats.Text); //&& doc.CanPaste;
+                }
+            }
+            catch (Exception e)
+            {
+                MessageBox.Show(e.ToString());
+            }
+        }
+
+        private string DockPanelConfigFile
+        { get { return Path.Combine(Path.GetDirectoryName(Application.ExecutablePath), "DockPanel.config"); } }
+
+        private string CurretPortName
+        {
+            get { return Properties.Settings.Default.PortName; }
+            set
+            {
+                Properties.Settings.Default.PortName = value ?? "";
+                this.toolStripStatusLabel2.Text = value ?? "Unknown";
+            }
+        }
+
+        private void MainForm_Load(object sender, EventArgs e)
+        {
+            //this.TerminalForm.PortOpen += TerminalForm_PortOpen;
+            //this.TerminalForm.PortClose += TerminalForm_PortClose;
+            
+            string configFile = this.DockPanelConfigFile;
+            if (!File.Exists(configFile))
+            {
+
+            }
+            else
+            {
+                deserializeDockContent = new DeserializeDockContent(GetContentFromPersistString);
+                dockPanel1.LoadFromXml(configFile, this.deserializeDockContent);
+            }
+
+            this.CurretPortName = Properties.Settings.Default.PortName;
+
+            if (this.TerminalForm == null)
+            {
+                this.TerminalForm = new TerminalForm();
+                this.TerminalForm.Show(this.dockPanel1);
+            }
+
+            if (this.ErrorListForm == null)
+            {
+                this.ErrorListForm = new ErrorListForm();
+                this.ErrorListForm.Show(this.dockPanel1);
+            }
+            //if (!this.ComportIsExists)
+            //{
+            //    this.btnConnect.Enabled = false;
+            //    MessageBox.Show($"Serialport \"{this.CurretPortName}\" does not exists!", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
+            //}
+            //else
+            //{
+               this.btnConnect.Enabled = true;
+            //}
+               
+            this.UpdateUI();
+
+        }
+
+       
+        private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
+        {
+            List<IDocument> docs = new List<IDocument>();
+            List<string> files = new List<string>();
+            
+            foreach (DockContent dc in this.dockPanel1.Documents)
+            {
+                if (dc is IDocument)
+                {
+                    IDocument d = dc as IDocument;
+                    if (d.Modified)
+                    {
+                        if(d.FileName == null || d.Modified)
+                        {
+                            docs.Add(d);
+                            files.Add(d.FileName ?? "New");
+                        }
+                    }
+                }
+            }
+
+            if (docs.Count > 0)
+            {
+                FileSavesDialog d = new FileSavesDialog();
+                d.listBox1.Items.AddRange(files.ToArray());
+                DialogResult res = d.ShowDialog();
+                
+                if (res == DialogResult.Yes)
+                {
+                    foreach (IDocument dd in docs)
+                    {
+                        dd.Save();
+                    }
+                }
+                else if (res == DialogResult.Cancel)
+                {
+                    e.Cancel = true;
+                    return;
+                }
+            }
+
+            string configFile = this.DockPanelConfigFile;
+            dockPanel1.SaveAsXml(configFile);        
+
+            Properties.Settings.Default.Save();
+
+            if (this.Port != null)
+            {
+                try
+                {
+                    this.Port.Close();
+                    this.Port = null;
+                }
+                catch(Exception ex)
+                {
+                    Helpers.ErrorBox(ex);
+                }
+            }
+
+            if (Globals.PyClient != null)
+                Globals.PyClient.Stop();
+        }
+
+        private bool CanConnect
+        {
+            get
+            {
+                return !String.IsNullOrEmpty(this.CurretPortName);
+            }
+        }
+
+        private void UpdateUI()
+        {
+  
+            this.mnTerminal.Enabled = this.TerminalForm == null;
+        }
+
+        private void SetSchema(object sender, System.EventArgs e)
+        {
+            if (true)
+            {
+                this.dockPanel1.Theme = this.vS2015BlueTheme1;
+                this.EnableVSRenderer(VisualStudioToolStripExtender.VsVersion.Vs2015, vS2015BlueTheme1);
+            }      
+
+            if (dockPanel1.Theme.ColorPalette != null)
+            {
+                statusStrip1.BackColor = dockPanel1.Theme.ColorPalette.MainWindowStatusBarDefault.Background;
+                statusStrip1.ForeColor = dockPanel1.Theme.ColorPalette.MainWindowStatusBarDefault.HighlightText;
+            }
+        }
+
+        private void EnableVSRenderer(VisualStudioToolStripExtender.VsVersion version, ThemeBase theme)
+        {
+            visualStudioToolStripExtender1.SetStyle(menuStrip1, version, theme);
+            visualStudioToolStripExtender1.SetStyle(toolStrip1, version, theme);
+            visualStudioToolStripExtender1.SetStyle(statusStrip1, version, theme);
+        }
+
+        private void mnTerminal_Click(object sender, EventArgs e)
+        {
+            this.TerminalForm.Show(this.dockPanel1);
+            this.UpdateUI();
+        }
+
+        private IDockContent GetContentFromPersistString(string persistString)
+        {
+            string[] items = persistString.Split(',');
+
+            persistString = items[0];
+
+            if (persistString == typeof(TerminalForm).ToString())
+            {
+                if (this.TerminalForm != null)
+                    return this.TerminalForm;
+                this.TerminalForm = new TerminalForm();
+                this.TerminalForm.IsHidden = false;
+                return this.TerminalForm;
+            }
+            else if (persistString == typeof(ErrorListForm).ToString())
+            {
+                if (this.ErrorListForm != null)
+                    return this.ErrorListForm;
+                this.ErrorListForm = new ErrorListForm();
+                this.ErrorListForm.IsHidden = false;
+                return this.ErrorListForm;
+            }
+
+            else if (persistString == typeof(EditorForm).ToString())
+            {
+                if (items.Length == 3 && File.Exists(items[1]))
+                {                    
+                    if (this.FindDocument(items[1]) == null)
+                    {
+                        EditorForm editor = new EditorForm(this);
+                        editor.LoadFromFile(items[1]);                   
+                        editor.scintilla.GotoPosition(int.Parse(items[2]));
+                        editor.scintilla.SetSavePoint();
+                        editor.IsHidden = false;
+                        editor.Focus();
+                        return editor;
+                    }
+                    return null;
+                }
+                else return null;
+            }
+            return null;
+        }
+
+        private void dockPanel1_ActiveContentChanged(object sender, EventArgs e)
+        {
+            ToolStripManager.RevertMerge(this.menuStrip1);
+            ToolStripManager.RevertMerge(this.toolStrip1);
+            if (this.dockPanel1.ActiveContent != null)
+            {
+
+                if (this.dockPanel1.ActiveContent is IForm)
+                {
+                    IForm form = this.dockPanel1.ActiveContent as IForm;
+                    if (form.ToolStrip != null)
+                        ToolStripManager.Merge(form.ToolStrip, this.toolStrip1);
+                    if (form.MenuStrip != null)
+                        ToolStripManager.Merge(form.MenuStrip, this.menuStrip1);
+
+                }
+            }
+            this.UpdateUI();
+        }
+        private void dockPanel1_ActiveDocumentChanged(object sender, EventArgs e)
+        {
+            ToolStripManager.RevertMerge(this.menuStrip1);
+            ToolStripManager.RevertMerge(this.toolStrip1);
+            if (this.dockPanel1.ActiveContent is IDocument)
+            {
+                IDocument doc = this.dockPanel1.ActiveDocument as IDocument;
+                doc.CanPaste = Clipboard.ContainsText();
+                doc.UpdateUI();
+                IDocument form = this.dockPanel1.ActiveDocument as IDocument;
+                if (form.ToolStrip != null)
+                    ToolStripManager.Merge(form.ToolStrip, this.toolStrip1);
+                if (form.MenuStrip != null)
+                    ToolStripManager.Merge(form.MenuStrip, this.menuStrip1);
+            }
+            //else if (this.dockPanel1.ActiveContent != null)
+            //{
+               
+            //    if (this.dockPanel1.ActiveContent is IForm)
+            //    {
+            //        IForm form = this.dockPanel1.ActiveContent as IForm;
+            //        if (form.ToolStrip != null)
+            //            ToolStripManager.Merge(form.ToolStrip, this.toolStrip1);
+            //        if (form.MenuStrip != null)
+            //            ToolStripManager.Merge(form.MenuStrip, this.menuStrip1);
+                    
+            //    }
+            //}
+            this.UpdateUI();
+        }
+        
+       public IDocument FindDocument(string fname)
+        {
+            foreach (DockContent dc in this.dockPanel1.Documents)
+            {
+                if (dc is IDocument)
+                {
+                    if ((dc as IDocument).FileName == fname)
+                        return dc as IDocument;
+                }
+            }
+            return null;
+        }
+
+        private void mnOpen_Click(object sender, EventArgs e)
+        {
+            FileFormats ff = EditorForm.EditorFileFormats;
+            IDocument[] items = this.OpenFromFile(ff);
+            if (items != null)
+            {
+                foreach (DockContent item in items)
+                {
+                    item.Show(this.dockPanel1);
+                }
+            }
+        }
+
+        public IDocument OpenFromFile(string path, FileFormats file_formats)
+        {
+            string ext = Path.GetExtension(path).ToLower();
+            foreach (FileFormat format in file_formats)
+            {
+                string[] items = format.Filter.Split('|')[1].Split(';');
+
+                foreach (string item in items)
+                {
+                    if (item.Remove(0, 1) == ext)
+                    {
+                        foreach (DockContent dc in this.dockPanel1.Documents)
+                        {
+                            if (dc is IDocument)
+                            {
+                                IDocument d = dc as IDocument;
+                                if (d.FileName == path)
+                                {
+                                    if (MessageBox.Show($"{path} already exists!\r\n\r\nWould you like reload it?", "Warning", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes)
+                                    {
+                                        d.LoadFromFile(path);
+                                        return d;
+                                    }
+                                }
+                            }
+                        }
+                        IDocument doc = (IDocument)Activator.CreateInstance(format.EditorType, new object[] { this });
+                        doc.LoadFromFile(path);
+                        return doc;
+                    }
+                }
+            }
+            return null;
+        }
+
+        public IDocument[] OpenFromFile(FileFormats file_formats)
+        {
+            List<IDocument> list = new List<IDocument>();
+            OpenFileDialog d = new OpenFileDialog();
+            d.DefaultExt = file_formats.DefaultExt;
+            d.Filter = file_formats.Filters;
+            //d.FilterIndex = file_formats.Count;
+            d.Multiselect = true;
+
+            if (d.ShowDialog() == DialogResult.OK)
+            {
+                foreach (string path in d.FileNames)
+                {
+                    IDocument item = null;
+                    try
+                    {
+                        item = OpenFromFile(path, file_formats);
+                        if (item != null)
+                        {
+                            list.Add(item);
+                        }
+
+                    }
+                    catch(Exception ex)
+                    {
+                        if (item != null && item is IDisposable)
+                        {
+                            (item as IDisposable).Dispose();
+                        }
+                        item = null;
+                    }
+                }
+                return list.ToArray();
+            }
+            return null;
+        }
+
+        private void NewFile(FileFormat ff)
+        {
+            SaveFileDialog d = new SaveFileDialog();
+            d.DefaultExt = ff.DefaultExt;
+            d.Filter = ff.Filter;
+            if (d.ShowDialog() == DialogResult.OK)
+            {
+                IDocument doc = this.FindDocument(d.FileName);
+                if (doc != null)
+                {
+
+                }
+                else
+                {
+                    doc = (IDocument)Activator.CreateInstance(ff.EditorType, new object[] { this });
+                }
+                File.WriteAllText(d.FileName, "");
+                doc.LoadFromFile(d.FileName);
+                (doc as DockContent).Show(this.dockPanel1);
+            }
+        }
+
+        private void mnNewPython_Click(object sender, EventArgs e)
+        {
+            NewFile(FileFormat.Python);
+        }
+
+        private void mnNewHtml_Click(object sender, EventArgs e)
+        {
+            NewFile(FileFormat.Html);
+        }
+
+        private void mnNewCss_Click(object sender, EventArgs e)
+        {
+            NewFile(FileFormat.Css);
+        }
+
+        private void mnNewJs_Click(object sender, EventArgs e)
+        {
+            NewFile(FileFormat.Js);
+        }
+
+        private void mnNewJson_Click(object sender, EventArgs e)
+        {
+            NewFile(FileFormat.Json);
+        }
+
+        private void mnNewTxt_Click(object sender, EventArgs e)
+        {
+            NewFile(FileFormat.Txt);
+        }
+
+        private void mnNewOther_Click(object sender, EventArgs e)
+        {
+            NewFile(FileFormat.All);
+        }
+
+        private PySerial FPort = null;
+
+        public PySerial Port
+        {
+            get { return this.FPort; }
+            private set
+            {
+                if (this.FPort != null)
+                {
+                   // if(this.Port.IsOpen)
+                        this.Port.Close();
+
+                    this.FPort.PortOpen -= Port_PortOpen;
+                    this.FPort.PortClose -= Port_PortClose;
+                    this.FPort.DataReceived -= Port_DataReceived;
+                    this.FPort.ErrorReceived -= Port_ErrorReceived;
+                    this.FPort.PortBusy -= Port_PortBusy;
+                    this.FPort.PortFree -= Port_PortFree;
+
+                    foreach (DockContent dc in this.dockPanel1.Documents)
+                    {
+                        if (dc is IPort)
+                        {
+                            (dc as IPort).Port = null;
+                        }
+                    }
+                    this.FPort = null;
+                }
+
+                this.FPort = value;
+                if (this.FPort != null)
+                {
+                    if (this.FPort is SerialPort)
+                    {
+                        this.FPort.PortName = this.CurretPortName;
+                        this.FPort.PortOpen += Port_PortOpen;
+                        this.FPort.PortClose += Port_PortClose;
+                        this.FPort.DataReceived += Port_DataReceived;
+                        this.FPort.ErrorReceived += Port_ErrorReceived;
+                        this.FPort.PortBusy += Port_PortBusy;
+                        this.FPort.PortFree += Port_PortFree;
+                    }
+                    else
+                    {
+                        //Websocket
+                    }
+
+                    foreach (DockContent dc in this.dockPanel1.Documents)
+                    {
+                        if (dc is IPort)
+                        {
+                            (dc as IPort).Port = this.Port;
+                        }
+                    }
+                }
+            }
+        }
+
+        private Color ColorFree = Color.FromArgb(255, 0, 122, 204);
+        private Color ColorBusy = Color.DarkOrange;
+
+        private delegate void UpdateStatusEvent(bool busy);
+        public void UpdateBusy(bool busy)
+        {
+            if (this.InvokeRequired)
+            {
+                this.Invoke(new UpdateStatusEvent(UpdateBusy), new object[] { busy });
+            }
+            else
+            {
+                if(busy)
+                    this.statusStrip1.BackColor = this.ColorBusy;
+                else this.statusStrip1.BackColor = this.ColorFree;
+
+                this.mnFileManager.Enabled =
+                    this.btnFileManager.Enabled = !busy;
+            }
+        }
+
+        private void Port_PortFree(object sender, EventArgs e)
+        {
+            this.UpdateBusy(false);
+        }
+
+        private void Port_PortBusy(object sender, EventArgs e)
+        {
+            this.UpdateBusy(true);
+           // this.UpdateBusy(false);
+        }
+
+        private void btnConnect_Click(object sender, EventArgs e)
+        {
+            if (!CanConnect)
+            {
+                Helpers.ErrorBox("Internal error at connecting!");
+                return;
+            }
+
+            if (!this.ComportIsExists)
+            {
+                this.btnConnect.Enabled = false;
+                MessageBox.Show($"Serialport \"{this.CurretPortName}\" does not exists!", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
+                return;
+            }
+
+            try
+                {
+                this.Port = new PySerial();
+                this.Port.BaudRate = Properties.Settings.Default.PyBaudRate;
+                this.Port.LineSeparator = "\r\n"; // Properties.Settings.Default.PyPortLineSeparator;
+                this.Port.WriteTimeout = Properties.Settings.Default.PyPortWriteTimeout;
+                this.Port.ReadTimeout = Properties.Settings.Default.PyPortReadTmeout;
+                this.Port.Open();
+            }
+            catch (Exception ex)
+            {
+                this.Port = null;
+                Helpers.ErrorBox(ex.Message);
+            }
+        }
+
+        private void btnDisconnect_Click(object sender, EventArgs e)
+        {
+            if (this.Port != null)
+            {
+                try
+                {
+                    this.Port.Close();
+                }
+                catch (Exception ex)
+                {
+                    Helpers.ErrorBox(ex);
+                }
+                finally
+                {
+                    this.Port = null;
+                }
+            }
+        }
+
+        private void Port_ErrorReceived(object sender, string data)
+        {
+        }
+
+        private void Port_DataReceived(object sender, string data)
+        {
+        }
+
+        private void Port_PortOpen(object sender, EventArgs e)
+        {
+            this.mnPorts.Enabled = 
+                this.btnConnect.Enabled = false;
+
+            this.mnFileManager.Enabled =
+               this.btnFileManager.Enabled =
+                this.btnReset.Enabled =
+                this.btnDisconnect.Enabled = true;
+        }
+
+        private void Port_PortClose(object sender, EventArgs e)
+        {
+            this.mnPorts.Enabled =
+                this.btnConnect.Enabled = true;
+
+            this.mnFileManager.Enabled =
+               this.btnFileManager.Enabled =
+                this.btnReset.Enabled =
+                this.btnDisconnect.Enabled = false;
+
+            this.statusStrip1.BackColor = this.ColorFree;
+        }
+      
+        private void btnReset_Click(object sender, EventArgs e)
+        {
+            this.Port.SoftReset();
+        }
+
+        private void mnSave_Click(object sender, EventArgs e)
+        {
+            if (this.dockPanel1.ActiveContent is IDocument)
+            {
+                (this.dockPanel1.ActiveContent as IDocument).Save();
+            }
+        }
+
+        private void mnSaveAs_Click(object sender, EventArgs e)
+        {
+            if (this.dockPanel1.ActiveContent is IDocument)
+            {
+                (this.dockPanel1.ActiveContent as IDocument).SaveAs();
+            }
+        }
+
+        private void mnSaveAll_Click(object sender, EventArgs e)
+        {
+            foreach (DockContent dc in this.dockPanel1.Documents)
+            {
+                if (dc is IDockDragSource)
+                {
+                    IDocument d = dc as IDocument;
+                    if (d.Modified)
+                    {
+                        d.Save();
+                    }
+                }
+            }
+        }
+
+        private void mnDevice_DropDownOpening(object sender, EventArgs e)
+        {
+            foreach (ToolStripItem mi in this.mnPorts.DropDownItems)
+            {
+                if(mi is ToolStripMenuItem)
+                    mi.Click -= Port_Click;
+            }
+            mnPorts.DropDownItems.Clear();
+
+            mnPorts.DropDownItems.Clear();
+
+            string[] ports = System.IO.Ports.SerialPort.GetPortNames();
+            if (ports != null && ports.Length > 0)
+            {
+                foreach (string port in ports)
+                {
+                    ToolStripMenuItem mi = new ToolStripMenuItem();
+                    mi.Text = port;
+                    mi.Tag = port;
+                    mi.Click += Port_Click;
+                    if (this.CurretPortName != null && this.CurretPortName == port)
+                    {
+                        mi.Checked = true;
+                    }
+
+                    this.mnPorts.DropDownItems.Add(mi);
+                }
+            }
+            else
+            {
+                ToolStripMenuItem mi = new ToolStripMenuItem();
+                mi.Text = "empty";
+                mi.Enabled = false;
+                this.mnPorts.DropDownItems.Add(mi);
+            }
+
+            this.mnEspTool.Enabled = this.Port == null && this.ComportIsExists;
+        }
+
+        private bool ComportIsExists
+        {
+            get
+            {
+                foreach (string port in System.IO.Ports.SerialPort.GetPortNames())
+                {
+                    if (this.CurretPortName == port)
+                        return true;
+                }
+                return false;
+            }
+        }
+
+        private void Port_Click(object sender, EventArgs e)
+        {
+            this.CurretPortName = (sender as ToolStripMenuItem).Tag.ToString();
+            this.btnConnect.Enabled = this.ComportIsExists;
+            this.UpdateUI();
+        }
+
+        public void btnSaveAll_Click(object sender, EventArgs e)
+        {
+            foreach (DockContent dc in this.dockPanel1.Documents)
+            {
+                if (dc is IDocument)
+                {
+                    IDocument doc = dc as IDocument;
+                    if (doc.CanSave && doc.Modified)
+                    {
+                        doc.Save();
+                    }
+                }
+            }
+        }
+
+        private void btnView_DropDownOpening(object sender, EventArgs e)
+        {
+            this.mnTerminal.Enabled = this.TerminalForm.DockState == DockState.Hidden;
+        }
+
+        private void mnViewHelp_Click(object sender, EventArgs e)
+        {
+            string p = Path.Combine(Application.StartupPath, "Helps", "help.html");
+            if (File.Exists(p))
+                System.Diagnostics.Process.Start(p);
+            else MessageBox.Show("Help file does not exits!", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
+        }
+
+        private void mnWebREPL_Click(object sender, EventArgs e)
+        {
+            string p = Path.Combine(Application.StartupPath, "Tools", "webrepl", "webrepl.html");
+            if (File.Exists(p))
+                System.Diagnostics.Process.Start(p);
+            else MessageBox.Show("Help file does not exits!", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
+
+        }
+
+        private void btnFlashing_Click(object sender, EventArgs e)
+        {
+            if (this.ComportIsExists)
+            {
+                EspToolDialog d = new EspToolDialog();
+                d.PortName = this.CurretPortName;
+                d.ShowDialog();
+                d.Dispose();
+            }
+        }
+
+        private void mnFileManager_Click(object sender, EventArgs e)
+        {
+            if (this.Port != null)
+            {
+                Globals.Terminal.Locked = true;
+                this.Port.Sync(true);
+                this.Port.Clean();
+                PyFileManager d = new PyFileManager();
+                d.Port = this.Port;
+                d.ShowDialog();
+                d.Dispose();
+                this.Port.Clean();
+                this.Port.Sync(false);
+                Globals.Terminal.Locked = false;
+            }
+        }
+
+        private void mnAbout_Click(object sender, EventArgs e)
+        {
+            Splash s = new Splash();
+            s.ShowDialog();
+            s.Dispose();
+
+            //AboutDialog d = new AboutDialog();
+            //d.ShowDialog();
+            //d.Dispose();
+        }
+
+        private void mnErrorList_Click(object sender, EventArgs e)
+        {
+            if (this.ErrorListForm != null)
+                this.ErrorListForm.Show(this.dockPanel1);
+        }
+
+        private void MainForm_Deactivate(object sender, EventArgs e)
+        {
+            //UIChangedEventArgs ee = new UIChangedEventArgs();
+
+            //ee.ChangedReson = UIChangedEventArgs.UIChangedReasons.FocusLost;
+
+            //lock (this)
+            //{
+            //    foreach (DockContent dc in this.dockPanel1.Contents)
+            //    {
+            //        if (dc is IForm)
+            //        {
+            //            (dc as IForm).UIStateChanged(this, ee);
+            //        }
+            //    }
+            //}
+        }
+
+        private void settingsToolStripMenuItem_Click(object sender, EventArgs e)
+        {
+            SettingsDialog d = new SettingsDialog();
+            d.ShowDialog();
+            d.Dispose();
+        }
+
+       
+    }
+}

+ 481 - 0
EsPy/MainForm.resx

@@ -0,0 +1,481 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="menuStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="mnNew.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        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
+</value>
+  </data>
+  <data name="mnOpen.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        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
+        Le21IgAAAABJRU5ErkJggg==
+</value>
+  </data>
+  <metadata name="toolStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>132, 17</value>
+  </metadata>
+  <data name="btnNew.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        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
+</value>
+  </data>
+  <data name="btnOpen.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        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
+        LQAAAABJRU5ErkJggg==
+</value>
+  </data>
+  <data name="btnSave.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        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
+</value>
+  </data>
+  <data name="btnUndo.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAT+SURBVFhH7VV7UFRlFD+EWghLCgEZqJCZj1LMydEpkuhh
+        D0kbkKDxgSYJ6BRmY03TY23Kmsn4s2aiEASMUiBmZ4pI4Q7P5c3CrAS4y7KwKxCPXXZ5SGJf51zupcu2
+        67DUMP3Rb+Y3d+75vnt+v3O+x4X/MRdUZIBvdSboytLhOSE0f6jKgOB2bqNWrY6eLD8Hu4Xw/KA6G8I1
+        VduN44NfMI4LvTmvBmq/hwRjffTg+EAyGzEenl8DjXkup/tbk0bHBz5nI4YDaOAIGjg1PwbqcxZlGbvl
+        v/Pi1xLQwCE2ik+O+/Bm6TnYz3GwQJj670OV78HJ5fI/xvvPsNGeN9BAIlb/ChpIZBRv47YYG34K0qoU
+        sku1F+FUSSZsFj79ZyhNBZ9mhX/rddN3bOy3j9ho70k0kCR04CCzdr/MGxrr+4CN4dhIzwk2eHUf05cH
+        96hyIU1IMzco02FjW9FDHRPmLBQ5gTyOfB3Fj2L1cWhgP7N27WHmq2vY4BVXNqgGnkMti5ml8xlm6jzG
+        mhQ+11T5sFVIOXtUZUJAyy8ru68PpU6JGeOnqqYn7vwRQyyKR7ChX72mhW3JG+mKYeqS9eY6BYQIqWeH
+        8m9AVpcv49edbzkKUst5YcM+FI+6pbiUFn04a+ceGGjMhkAh/ezRkLsgR62WT1L7rd0xyGi+7ab2ILti
+        jmjSRjJ14fJKIa1zqM9xTenTHZ2gTlj1u3DN10qSu7Bh7RbkNow/yExtgZKxv0jf6Jp336i+COFCWueA
+        R+sTXfWzVhKSJja1+vE3YSv3tL6rPlLb3fTC8LA+AQ1tnTGPaDXEsfpcKBRSOo/aC/CmQfm4yaILm05K
+        BtTq2MkKvIjK02BTRRrsVOV5nzXWPmag5ZIasOieZI0K0OAdsUxI6TzqLsBBfc3DfRb9zhkGbK9iNBOp
+        4dZcoeMoGqClai2C3qKz8IgwbW6o+RZ2aUvWG/jN6MAAoTITYnubI/rNmg28AXP7fUxTDMN4bYcKU+YO
+        5XkIaeNWd9KV7MgAoTHP+9KwfmopzJpg1sJBX1mqk3eCIyizYV1LYaBGpwq7UZoGL2LIReA0lFnwtll/
+        kjdAy0F7oDId/IVhp3Ab0hVJf7yFyEXI29M+hUDleVd9wZcQhe93UEwgjS8s/hri1eq9k0Mt7ngrRrKG
+        PCjA+KxBoqIgJSWBxUh3pIdAWcwT4IdPT4EygTTmXpbhcWSo4zheXKtYLxc6gZtzL8apkBmdsoUoTFWQ
+        qBuSRCkxiSxBLkV6Ib2Rd0lI70QaW1r3Q0C5pXOHyaqLtTbmL7mMMcrHdwdJRv4GW3GqmKq5E0nCoqAv
+        8m4knel7JKR3ivtlnYaIrprtdf0dzzc3F3iXvfsqrMI4FUIFUUftmqCA2HJRXKyaxH2Q1HISos20HLkS
+        GYSkn80KZMCxl2BzRY4sxaDeltukkOW+Fs2LUxHURTIhdoKKpaKnITVATqUGqK1Uva0BEiUTxBXvHIZH
+        L2fAW6oC+Lg4A+TxEbAa47RkogEqzKEB2hz2lkBqQtoJfhnc3MA/YgesTX4fwn5OhUM/psCBr+QQ4uHB
+        G5aK2y7BDHERZMK2E6IRSsLvB09P8LrXD3yjnoIVSYmw7rMk2JT8HmyI2wNB9y/jhcmweDJEYYeV24No
+        ROyI1AwlJJIpe6QxmicVpYJmJWwPZIY+FA1RMiIltkdRjObTd7c89/8BAPwJMgkE0j+v7dEAAAAASUVO
+        RK5CYII=
+</value>
+  </data>
+  <data name="btnRedo.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        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
+</value>
+  </data>
+  <data name="btnCut.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        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
+</value>
+  </data>
+  <data name="btnCopy.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHHSURBVFhHxZY9asNAEEbdpEyKBFIlZarkACFX8CVc6C4q
+        3fkGBjfGWGC3KexCTQqFgAIp3BtjcOV/bebbZMWyUuKdkcAfPAyLNPM0HpAadsbjsZIQRdF7EAR3VOLi
+        p5IwKMbNfD5Xk8lEDQaDtNlsPlAZuYREYL/fqzRNtUS/3/+sJCERQDCF1WpVXaJMAGdxHLOYTqfYi49W
+        q3VPZf1F/hLgRrwXdQmI96IuAUS0F26z17cvscByudS/LIk6J4DGi8VCzWYzlSRJLkFtbolyiToF7KzX
+        ay2DWtTmibjUDd24zar8BWUZjUYQeCaudUM3PhOAFAc7nU4HAi/EjW7oxkegSsIw9BPIskyDJzirAHAF
+        3BGfwo63wPF4zDnLBExzPMFZBA6HQ445s/eCg7kP8RbAy8TgCkhB2AJ4AnNm7wUXtsBut8txBdwRn0Ik
+        sNlscsyZvRdcIIF4C+DlYTBn9l5wgQTiLWDHFSgb83+wBIbDoer1eqrb7eYYAXsvuEACOSlAuSIeCVyk
+        MQL2XnCBBOIjgC8VSOACjRHYbrdiOBMopGwvpBEJYC/a7ba+uQ6oJE+AUtiLiqAWanqnsBcVQa3fr+JG
+        4xs1dfbZaqs65wAAAABJRU5ErkJggg==
+</value>
+  </data>
+  <data name="btnPaste.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        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
+</value>
+  </data>
+  <data name="btnConnect.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        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
+</value>
+  </data>
+  <data name="btnDisconnect.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAOVSURBVFhHzVdJTFNRFCUx6cYYwqYrVy7dumDFShM1canG
+        CLqQaDAEEsUF0CijFBCFSgFBQgiTgIhACFhKJYwyCRpHWEAEwYCAlFmm6zu3/bWF/vbT4nCSk77//nv3
+        nPf+va//+/wDqLIe5VFZWUWJaB+wdP15qHSZ2STR0GTiX9F/yHLbe6iC9O0kx3Sdnj59HqbevteU9kDH
+        FHOOCfrybC+hOqk1UscEyRImIN5saqHqmjrSpqTBwBHM5QgegoXB1rFtyujfckmMg3hhUSnFJ2phQG0J
+        4xlY/OmbhS+l/eZxtI2jm5Ty6qdLYtztmHiI+wv6cSQP4Ydg2YNE+oFtSu6yBH8+tE5x7SuyxH2ME/O9
+        3n6490cwndje+70bFNu2wsGL361SdMuiU+Ke1YBX2w/A/WHBAARM7V4nrdiFqJeLLJDdv0Q3m+Z3Ef37
+        ZQBwMJHYscrbHCGEcJ3SaabQhlkHom8/DKiKiooIFO2DgjYTd1qXSSO2GmK4jjbNUnDttI249tYAizca
+        jFReWUUajWaXiUjTAt0ymulq3TSLhdZPUdCzSSbaezFgq3O0QXvx3McFkgEkpMPjuGH4QeGNc3S5+hvP
+        D6yaoHMVX/lXqYHfdS6Itoy4fT07mMBjCKn/TherJln0bPm4JK7oDOA6R42jzPJ75viw2SEeIAhBCEtw
+        MIHHcKVmik5ndk1axZ3N2QVefeMIsWMYQJmlN09wEBlx2cTEYwi07oLoc3sAsXj10Bal922SYcRyht/r
+        WecyizGMSyuxD+Q2Ma1zlG99yfsNShGrBmuGNzlAUucal1l07Sg/DjEWBpQkJoRBt1sPqBE8d3CNEsSK
+        JZZ9sJz1sW3LXGZhNSNjuFaYmGhLhtyCDaT3rPBq7Zk/aDnHo8VxizK79uSj0sTcE9hAQvsSn+s7qetZ
+        ZhM4aFBm5wveukpMj8AGIk1mijDOO+XdjgU2Ef5ijsvsTOaAs8T0GGwAp5grRpksfzjX62e4zE7o++0T
+        0yuoc/LyOXiICO6KYQ0zPA41fqHSdsS6LTNXUEFcentFwODaKbfEOKu4ojp3BT99Tq7D2ysCXxJbLEer
+        8ClBxXXuCuqMh1n8zi69vcbEJdpW6IxiDjIfyae4zuWggnhHVzdpU9MoISmZxUU/Vndchvuyagm+hcXF
+        dRAXbUkUAlgd/rud0etV2wPfaEcF8bkkie6rgDvgKxUm8K3210T/A/j4/AL4qk04ynJxkQAAAABJRU5E
+        rkJggg==
+</value>
+  </data>
+  <metadata name="statusStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>237, 17</value>
+  </metadata>
+  <metadata name="vS2015BlueTheme1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>353, 17</value>
+  </metadata>
+  <metadata name="vS2015DarkTheme1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>511, 17</value>
+  </metadata>
+  <metadata name="vS2015LightTheme1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>671, 17</value>
+  </metadata>
+  <metadata name="visualStudioToolStripExtender1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 56</value>
+  </metadata>
+  <metadata name="$this.TrayHeight" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>78</value>
+  </metadata>
+</root>

+ 39 - 0
EsPy/Program.cs

@@ -0,0 +1,39 @@
+using EsPy.Utility;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace EsPy
+{
+    static class Program
+    {
+        /// <summary>
+        /// The main entry point for the application.
+        /// </summary>
+        [STAThread]
+        static void Main()
+        {
+            Application.ThreadException += new ThreadExceptionEventHandler(UnhandledThreadException);
+            Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
+            AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
+
+            Application.EnableVisualStyles();
+            Application.SetCompatibleTextRenderingDefault(false);
+            Application.Run(new MainForm());
+        }
+
+        public static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
+        {
+            Helpers.ErrorBox(e.ExceptionObject.ToString());
+           
+        }
+
+        public static void UnhandledThreadException(object sender, ThreadExceptionEventArgs e)
+        {
+            Helpers.ErrorBox(e.Exception);
+        }
+    }
+}

+ 36 - 0
EsPy/Properties/AssemblyInfo.cs

@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("EsPy")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("EsPy")]
+[assembly: AssemblyCopyright("Copyright (c) Jung Ervin 2016")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("f7fbc30c-9014-4169-ac86-4883087ec672")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.4")]
+[assembly: AssemblyFileVersion("1.0.0.4")]

+ 473 - 0
EsPy/Properties/Resources.Designer.cs

@@ -0,0 +1,473 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:4.0.30319.42000
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace EsPy.Properties {
+    using System;
+    
+    
+    /// <summary>
+    ///   A strongly-typed resource class, for looking up localized strings, etc.
+    /// </summary>
+    // This class was auto-generated by the StronglyTypedResourceBuilder
+    // class via a tool like ResGen or Visual Studio.
+    // To add or remove a member, edit your .ResX file then rerun ResGen
+    // with the /str option, or rebuild your VS project.
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    internal class Resources {
+        
+        private static global::System.Resources.ResourceManager resourceMan;
+        
+        private static global::System.Globalization.CultureInfo resourceCulture;
+        
+        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+        internal Resources() {
+        }
+        
+        /// <summary>
+        ///   Returns the cached ResourceManager instance used by this class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Resources.ResourceManager ResourceManager {
+            get {
+                if (object.ReferenceEquals(resourceMan, null)) {
+                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("EsPy.Properties.Resources", typeof(Resources).Assembly);
+                    resourceMan = temp;
+                }
+                return resourceMan;
+            }
+        }
+        
+        /// <summary>
+        ///   Overrides the current thread's CurrentUICulture property for all
+        ///   resource lookups using this strongly typed resource class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Globalization.CultureInfo Culture {
+            get {
+                return resourceCulture;
+            }
+            set {
+                resourceCulture = value;
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        internal static System.Drawing.Bitmap command {
+            get {
+                object obj = ResourceManager.GetObject("command", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        internal static System.Drawing.Bitmap connect {
+            get {
+                object obj = ResourceManager.GetObject("connect", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        internal static System.Drawing.Bitmap cpu {
+            get {
+                object obj = ResourceManager.GetObject("cpu", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        internal static System.Drawing.Bitmap disconnect {
+            get {
+                object obj = ResourceManager.GetObject("disconnect", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        internal static System.Drawing.Bitmap documentnew {
+            get {
+                object obj = ResourceManager.GetObject("documentnew", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        internal static System.Drawing.Bitmap documentopen {
+            get {
+                object obj = ResourceManager.GetObject("documentopen", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        internal static System.Drawing.Bitmap documentsave {
+            get {
+                object obj = ResourceManager.GetObject("documentsave", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        internal static System.Drawing.Bitmap documentssaveas {
+            get {
+                object obj = ResourceManager.GetObject("documentssaveas", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        internal static System.Drawing.Bitmap download {
+            get {
+                object obj = ResourceManager.GetObject("download", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        internal static System.Drawing.Bitmap drive {
+            get {
+                object obj = ResourceManager.GetObject("drive", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        internal static System.Drawing.Bitmap drivecd {
+            get {
+                object obj = ResourceManager.GetObject("drivecd", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        internal static System.Drawing.Bitmap drivenetwork {
+            get {
+                object obj = ResourceManager.GetObject("drivenetwork", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        internal static System.Drawing.Bitmap editclear {
+            get {
+                object obj = ResourceManager.GetObject("editclear", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        internal static System.Drawing.Bitmap editcopy {
+            get {
+                object obj = ResourceManager.GetObject("editcopy", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        internal static System.Drawing.Bitmap editcut {
+            get {
+                object obj = ResourceManager.GetObject("editcut", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        internal static System.Drawing.Bitmap editfind {
+            get {
+                object obj = ResourceManager.GetObject("editfind", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        internal static System.Drawing.Bitmap editpaste {
+            get {
+                object obj = ResourceManager.GetObject("editpaste", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        internal static System.Drawing.Bitmap editredo {
+            get {
+                object obj = ResourceManager.GetObject("editredo", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        internal static System.Drawing.Bitmap editreplace {
+            get {
+                object obj = ResourceManager.GetObject("editreplace", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        internal static System.Drawing.Bitmap editundo {
+            get {
+                object obj = ResourceManager.GetObject("editundo", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        internal static System.Drawing.Bitmap eraseflash {
+            get {
+                object obj = ResourceManager.GetObject("eraseflash", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        internal static System.Drawing.Bitmap eraseflash1 {
+            get {
+                object obj = ResourceManager.GetObject("eraseflash1", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        internal static System.Drawing.Bitmap error16 {
+            get {
+                object obj = ResourceManager.GetObject("error16", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        internal static System.Drawing.Bitmap filemanager {
+            get {
+                object obj = ResourceManager.GetObject("filemanager", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        internal static System.Drawing.Bitmap flash {
+            get {
+                object obj = ResourceManager.GetObject("flash", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        internal static System.Drawing.Bitmap gohome {
+            get {
+                object obj = ResourceManager.GetObject("gohome", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        internal static System.Drawing.Bitmap gonext {
+            get {
+                object obj = ResourceManager.GetObject("gonext", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        internal static System.Drawing.Bitmap goprevious {
+            get {
+                object obj = ResourceManager.GetObject("goprevious", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        internal static System.Drawing.Bitmap hdd {
+            get {
+                object obj = ResourceManager.GetObject("hdd", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        internal static System.Drawing.Bitmap info {
+            get {
+                object obj = ResourceManager.GetObject("info", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        internal static System.Drawing.Bitmap play {
+            get {
+                object obj = ResourceManager.GetObject("play", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        internal static System.Drawing.Bitmap play1 {
+            get {
+                object obj = ResourceManager.GetObject("play1", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        internal static System.Drawing.Bitmap port {
+            get {
+                object obj = ResourceManager.GetObject("port", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        internal static System.Drawing.Bitmap saveall {
+            get {
+                object obj = ResourceManager.GetObject("saveall", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        internal static System.Drawing.Bitmap sdcard {
+            get {
+                object obj = ResourceManager.GetObject("sdcard", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        internal static System.Drawing.Bitmap syntax {
+            get {
+                object obj = ResourceManager.GetObject("syntax", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        internal static System.Drawing.Bitmap update {
+            get {
+                object obj = ResourceManager.GetObject("update", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        internal static System.Drawing.Bitmap upload {
+            get {
+                object obj = ResourceManager.GetObject("upload", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        internal static System.Drawing.Bitmap upload1 {
+            get {
+                object obj = ResourceManager.GetObject("upload1", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        internal static System.Drawing.Bitmap USB {
+            get {
+                object obj = ResourceManager.GetObject("USB", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        internal static System.Drawing.Bitmap Warning {
+            get {
+                object obj = ResourceManager.GetObject("Warning", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+    }
+}

+ 244 - 0
EsPy/Properties/Resources.resx

@@ -0,0 +1,244 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+  <data name="eraseflash1" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\eraseflash1.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="gohome" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\gohome.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="gonext" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\gonext.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="USB" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\USB.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="drivecd" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\drivecd.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="drive" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\harddisk.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="editfind" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\editfind.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="play" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\play.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="update" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\update.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="command" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\command.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="upload" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\upload.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="editclear" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\editclear.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="upload1" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\upload1.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="saveall" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\saveall.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="editreplace" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\editreplace.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="hdd" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\hdd.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="documentssaveas" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\documentssaveas.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Warning" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\Warning.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="editpaste" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\editpaste.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="port" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\port.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="info" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\info.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="connect" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\connect.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="documentsave" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\documentsave.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="documentopen" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\documentopen.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="goprevious" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\goprevious.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="disconnect" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\disconnect.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="editcut" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\editcut.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="download" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\download.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="play1" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\play1.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="sdcard" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\sdcard.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="cpu" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\cpu.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="eraseflash" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\eraseflash.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="editcopy" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\editcopy.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="editredo" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\editredo.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="error16" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\error16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="filemanager" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\filemanager.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="editundo" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\editundo.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="flash" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\flash.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="documentnew" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\documentnew.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="drivenetwork" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\drivenetwork.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="syntax" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\syntax.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+</root>

+ 254 - 0
EsPy/Properties/Settings.Designer.cs

@@ -0,0 +1,254 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:4.0.30319.42000
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace EsPy.Properties {
+    
+    
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "14.0.0.0")]
+    internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
+        
+        private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
+        
+        public static Settings Default {
+            get {
+                return defaultInstance;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("COMx")]
+        public string PortName {
+            get {
+                return ((string)(this["PortName"]));
+            }
+            set {
+                this["PortName"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("115200")]
+        public int PyBaudRate {
+            get {
+                return ((int)(this["PyBaudRate"]));
+            }
+            set {
+                this["PyBaudRate"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("")]
+        public string PyPortBoardType {
+            get {
+                return ((string)(this["PyPortBoardType"]));
+            }
+            set {
+                this["PyPortBoardType"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("4")]
+        public int PythonIndent {
+            get {
+                return ((int)(this["PythonIndent"]));
+            }
+            set {
+                this["PythonIndent"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("False")]
+        public bool EolVisible {
+            get {
+                return ((bool)(this["EolVisible"]));
+            }
+            set {
+                this["EolVisible"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("False")]
+        public bool WhitespaceVisible {
+            get {
+                return ((bool)(this["WhitespaceVisible"]));
+            }
+            set {
+                this["WhitespaceVisible"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("False")]
+        public bool TerminalShowEol {
+            get {
+                return ((bool)(this["TerminalShowEol"]));
+            }
+            set {
+                this["TerminalShowEol"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("False")]
+        public bool TerminalShowWhitespace {
+            get {
+                return ((bool)(this["TerminalShowWhitespace"]));
+            }
+            set {
+                this["TerminalShowWhitespace"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("http://docs.micropython.org")]
+        public string MicropythonDocUrl {
+            get {
+                return ((string)(this["MicropythonDocUrl"]));
+            }
+            set {
+                this["MicropythonDocUrl"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("")]
+        public string ProjectsFolder {
+            get {
+                return ((string)(this["ProjectsFolder"]));
+            }
+            set {
+                this["ProjectsFolder"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("")]
+        public string PythonExe {
+            get {
+                return ((string)(this["PythonExe"]));
+            }
+            set {
+                this["PythonExe"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("")]
+        public string EspToolPy {
+            get {
+                return ((string)(this["EspToolPy"]));
+            }
+            set {
+                this["EspToolPy"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("")]
+        public string FrimwareBin {
+            get {
+                return ((string)(this["FrimwareBin"]));
+            }
+            set {
+                this["FrimwareBin"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("460800")]
+        public int EspToolBaud {
+            get {
+                return ((int)(this["EspToolBaud"]));
+            }
+            set {
+                this["EspToolBaud"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("1000")]
+        public int PyPortReadTmeout {
+            get {
+                return ((int)(this["PyPortReadTmeout"]));
+            }
+            set {
+                this["PyPortReadTmeout"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("1000")]
+        public int PyPortWriteTimeout {
+            get {
+                return ((int)(this["PyPortWriteTimeout"]));
+            }
+            set {
+                this["PyPortWriteTimeout"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("\\r\\n")]
+        public string PyPortLineSeparator {
+            get {
+                return ((string)(this["PyPortLineSeparator"]));
+            }
+            set {
+                this["PyPortLineSeparator"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("False")]
+        public bool ShowPyServer {
+            get {
+                return ((bool)(this["ShowPyServer"]));
+            }
+            set {
+                this["ShowPyServer"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("5005")]
+        public int PyServerPort {
+            get {
+                return ((int)(this["PyServerPort"]));
+            }
+            set {
+                this["PyServerPort"] = value;
+            }
+        }
+    }
+}

+ 63 - 0
EsPy/Properties/Settings.settings

@@ -0,0 +1,63 @@
+<?xml version='1.0' encoding='utf-8'?>
+<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="EsPy.Properties" GeneratedClassName="Settings">
+  <Profiles />
+  <Settings>
+    <Setting Name="PortName" Type="System.String" Scope="User">
+      <Value Profile="(Default)">COMx</Value>
+    </Setting>
+    <Setting Name="PyBaudRate" Type="System.Int32" Scope="User">
+      <Value Profile="(Default)">115200</Value>
+    </Setting>
+    <Setting Name="PyPortBoardType" Type="System.String" Scope="User">
+      <Value Profile="(Default)" />
+    </Setting>
+    <Setting Name="PythonIndent" Type="System.Int32" Scope="User">
+      <Value Profile="(Default)">4</Value>
+    </Setting>
+    <Setting Name="EolVisible" Type="System.Boolean" Scope="User">
+      <Value Profile="(Default)">False</Value>
+    </Setting>
+    <Setting Name="WhitespaceVisible" Type="System.Boolean" Scope="User">
+      <Value Profile="(Default)">False</Value>
+    </Setting>
+    <Setting Name="TerminalShowEol" Type="System.Boolean" Scope="User">
+      <Value Profile="(Default)">False</Value>
+    </Setting>
+    <Setting Name="TerminalShowWhitespace" Type="System.Boolean" Scope="User">
+      <Value Profile="(Default)">False</Value>
+    </Setting>
+    <Setting Name="MicropythonDocUrl" Type="System.String" Scope="User">
+      <Value Profile="(Default)">http://docs.micropython.org</Value>
+    </Setting>
+    <Setting Name="ProjectsFolder" Type="System.String" Scope="User">
+      <Value Profile="(Default)" />
+    </Setting>
+    <Setting Name="PythonExe" Type="System.String" Scope="User">
+      <Value Profile="(Default)" />
+    </Setting>
+    <Setting Name="EspToolPy" Type="System.String" Scope="User">
+      <Value Profile="(Default)" />
+    </Setting>
+    <Setting Name="FrimwareBin" Type="System.String" Scope="User">
+      <Value Profile="(Default)" />
+    </Setting>
+    <Setting Name="EspToolBaud" Type="System.Int32" Scope="User">
+      <Value Profile="(Default)">460800</Value>
+    </Setting>
+    <Setting Name="PyPortReadTmeout" Type="System.Int32" Scope="User">
+      <Value Profile="(Default)">1000</Value>
+    </Setting>
+    <Setting Name="PyPortWriteTimeout" Type="System.Int32" Scope="User">
+      <Value Profile="(Default)">1000</Value>
+    </Setting>
+    <Setting Name="PyPortLineSeparator" Type="System.String" Scope="User">
+      <Value Profile="(Default)">\r\n</Value>
+    </Setting>
+    <Setting Name="ShowPyServer" Type="System.Boolean" Scope="User">
+      <Value Profile="(Default)">False</Value>
+    </Setting>
+    <Setting Name="PyServerPort" Type="System.Int32" Scope="User">
+      <Value Profile="(Default)">5005</Value>
+    </Setting>
+  </Settings>
+</SettingsFile>

+ 14 - 0
EsPy/Python/IText.cs

@@ -0,0 +1,14 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace EsPy.Python
+{
+    public interface IText
+    {
+        string Text
+        { get; }
+    }
+}

+ 39 - 0
EsPy/Python/Jedi/BaseDefinition.cs

@@ -0,0 +1,39 @@
+using EsPy.Components;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace EsPy.Python.Jedi
+{
+    public class BaseDefinition : ExListBox.ExListBoxItem
+    {
+        public int ImageIndex = 1;
+        public string module_path = null;
+        public string name = null;
+        public string type = null;
+        public string module_name = null;
+        public string in_builtin_module = null;
+        public string line = null;
+        public string column = null;
+        public string doc = null;
+        public string docstring = null;
+        public string description = null;
+        public string full_name = null;
+        public string[] parameters = null;
+
+        public virtual string Text
+        {
+            get
+            {
+                return name;
+            }
+        }
+
+        public override string ToString()
+        {
+            return this.name ?? "no suggestion";
+        }
+    }
+}

+ 15 - 0
EsPy/Python/Jedi/CallSignature.cs

@@ -0,0 +1,15 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace EsPy.Python.Jedi
+{
+    public class CallSignature : BaseDefinition
+    {
+        public string index = null;
+        public string bracket_start = null;
+
+    }
+}

+ 14 - 0
EsPy/Python/Jedi/Completion.cs

@@ -0,0 +1,14 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace EsPy.Python.Jedi
+{ 
+    public class Completion : BaseDefinition
+    {
+        public string complete = "";
+        public string name_with_symbols = "";    
+    }
+}

+ 15 - 0
EsPy/Python/Jedi/CompletionRequest.cs

@@ -0,0 +1,15 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace EsPy.Python.Jedi
+{
+    public class CompletionRequest : Request
+    {
+        
+        public CompletionRequest(Script script) : base("completion", script)
+        { }
+    }
+}

+ 13 - 0
EsPy/Python/Jedi/DefinedNames.cs

@@ -0,0 +1,13 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace EsPy.Python.Jedi
+{
+    public class DefinedNames
+    {
+        public List<Definition> Definitions = null;
+    }
+}

+ 23 - 0
EsPy/Python/Jedi/Definition.cs

@@ -0,0 +1,23 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace EsPy.Python.Jedi
+{
+    public class Definition : BaseDefinition
+    {
+        public string desc_with_module = null;
+        public DefinedNames defined_names = null;
+        public bool? is_definition = null;
+
+        public string Text
+        {
+            get
+            {
+                return name;
+            }
+        }
+    }
+}

+ 17 - 0
EsPy/Python/Jedi/Request.cs

@@ -0,0 +1,17 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace EsPy.Python.Jedi
+{
+    public class Request : PyRequest
+    {
+        public Script Script = null;
+        public Request(string method, Script script) : base("jedi", method)
+        {
+            this.Script = script;
+        }
+    }
+}

+ 22 - 0
EsPy/Python/Jedi/Script.cs

@@ -0,0 +1,22 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace EsPy.Python.Jedi
+{
+    public class Script
+    {
+        public int Line = 0;
+        public int Column = 0;
+        public string Source = "";
+
+        public Script(string source, int line, int column) 
+        {
+            this.Source = source;
+            this.Line = line;
+            this.Column = column;
+        }
+    }
+}

+ 16 - 0
EsPy/Python/Jedi/SignaturesRequest.cs

@@ -0,0 +1,16 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace EsPy.Python.Jedi
+{
+    public class SignaturesRequest : Request
+    {
+        public SignaturesRequest(Script script) : base("signature", script)
+        {
+
+        }
+    }
+}

Some files were not shown because too many files changed in this diff