فهرست منبع

ESPTool, DockAreas

jungervin 7 سال پیش
والد
کامیت
0a3ad7ffcf

+ 2 - 2
EsPy/App.config

@@ -71,8 +71,8 @@
             <setting name="PyServerPort" serializeAs="String">
                 <value>5005</value>
             </setting>
-            <setting name="EspFlashMode" serializeAs="String">
-                <value>3</value>
+            <setting name="EspToolDeviceIndex" serializeAs="String">
+                <value>0</value>
             </setting>
         </EsPy.Properties.Settings>
         <EPy.Properties.Settings>

+ 11 - 0
EsPy/Conf/devices.txt

@@ -0,0 +1,11 @@
+# Supported variables
+#
+# $PORT 
+# $BAUDRATE
+# $FIRMWARE
+
+Wemos Mini D1; -p $PORT -b $BAUDRATE write_flash -fm dio -fs detect 0x0000 "$FIRMWARE"
+Node MCU; -p $PORT -b $BAUDRATE write_flash -fm dio -fs detect 0x0000 "$FIRMWARE"
+Sonoff Basic; -p $PORT -b $BAUDRATE write_flash -fm dout -ff 20m -fs detect 0x0000 "$FIRMWARE"
+
+

+ 108 - 0
EsPy/Dialogs/DeviceEditorDialog.Designer.cs

@@ -0,0 +1,108 @@
+namespace EsPy.Dialogs
+{
+    partial class DeviceEditorDialog
+    {
+        /// <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.textBox1 = new System.Windows.Forms.TextBox();
+            this.btnOk = new System.Windows.Forms.Button();
+            this.btnCancel = new System.Windows.Forms.Button();
+            this.btnDefault = new System.Windows.Forms.Button();
+            this.SuspendLayout();
+            // 
+            // textBox1
+            // 
+            this.textBox1.AcceptsReturn = true;
+            this.textBox1.AcceptsTab = true;
+            this.textBox1.Font = new System.Drawing.Font("Courier New", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
+            this.textBox1.Location = new System.Drawing.Point(12, 12);
+            this.textBox1.Multiline = true;
+            this.textBox1.Name = "textBox1";
+            this.textBox1.ScrollBars = System.Windows.Forms.ScrollBars.Both;
+            this.textBox1.Size = new System.Drawing.Size(871, 400);
+            this.textBox1.TabIndex = 0;
+            this.textBox1.WordWrap = false;
+            // 
+            // btnOk
+            // 
+            this.btnOk.Location = new System.Drawing.Point(727, 419);
+            this.btnOk.Name = "btnOk";
+            this.btnOk.Size = new System.Drawing.Size(75, 23);
+            this.btnOk.TabIndex = 1;
+            this.btnOk.Text = "Save";
+            this.btnOk.UseVisualStyleBackColor = true;
+            this.btnOk.Click += new System.EventHandler(this.btnOk_Click);
+            // 
+            // btnCancel
+            // 
+            this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+            this.btnCancel.Location = new System.Drawing.Point(808, 419);
+            this.btnCancel.Name = "btnCancel";
+            this.btnCancel.Size = new System.Drawing.Size(75, 23);
+            this.btnCancel.TabIndex = 2;
+            this.btnCancel.Text = "Cancel";
+            this.btnCancel.UseVisualStyleBackColor = true;
+            // 
+            // btnDefault
+            // 
+            this.btnDefault.Location = new System.Drawing.Point(13, 419);
+            this.btnDefault.Name = "btnDefault";
+            this.btnDefault.Size = new System.Drawing.Size(75, 23);
+            this.btnDefault.TabIndex = 3;
+            this.btnDefault.Text = "Defaults";
+            this.btnDefault.UseVisualStyleBackColor = true;
+            this.btnDefault.Click += new System.EventHandler(this.btnDefault_Click);
+            // 
+            // DeviceEditorDialog
+            // 
+            this.AcceptButton = this.btnOk;
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.CancelButton = this.btnCancel;
+            this.ClientSize = new System.Drawing.Size(895, 453);
+            this.Controls.Add(this.btnDefault);
+            this.Controls.Add(this.btnCancel);
+            this.Controls.Add(this.btnOk);
+            this.Controls.Add(this.textBox1);
+            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
+            this.Name = "DeviceEditorDialog";
+            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+            this.Text = "Devices";
+            this.Load += new System.EventHandler(this.DeviceEditorDialog_Load);
+            this.ResumeLayout(false);
+            this.PerformLayout();
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.TextBox textBox1;
+        private System.Windows.Forms.Button btnOk;
+        private System.Windows.Forms.Button btnCancel;
+        private System.Windows.Forms.Button btnDefault;
+    }
+}

+ 66 - 0
EsPy/Dialogs/DeviceEditorDialog.cs

@@ -0,0 +1,66 @@
+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.Tasks;
+using System.Windows.Forms;
+
+namespace EsPy.Dialogs
+{
+    public partial class DeviceEditorDialog : Form
+    {
+        public DeviceEditorDialog()
+        {
+            InitializeComponent();
+        }
+
+        private void btnDefault_Click(object sender, EventArgs e)
+        {
+            this.textBox1.Text = "";
+            this.textBox1.Text += "# Supported variables:\r\n";
+            this.textBox1.Text += "#     $PORT\r\n";
+            this.textBox1.Text += "#     $BAUDRATE\r\n";
+            this.textBox1.Text += "#     $FIRMWARE\r\n";
+            this.textBox1.Text += "# \r\n";
+            this.textBox1.Text += "# Format (Separated by semicolon!!): \r\n";
+            this.textBox1.Text += "#     Device Name; Parameters\r\n";
+            this.textBox1.Text += "# \r\n";
+            this.textBox1.Text += "\r\n";
+            this.textBox1.Text += "Wemos Mini D1; -p $PORT - b $BAUDRATE write_flash -fm dio - fs detect 0x0000 \"$FIRMWARE\"\r\n";
+            this.textBox1.Text += "Node MCU; -p $PORT - b $BAUDRATE write_flash -fm dio - fs detect 0x0000 \"$FIRMWARE\"\r\n";
+            this.textBox1.Text += "Sonoff Basic; -p $PORT - b $BAUDRATE write_flash -fm dout - ff 20m - fs detect 0x0000 \"$FIRMWARE\"\r\n";
+        }
+
+        private void btnOk_Click(object sender, EventArgs e)
+        {
+            try
+            {
+                File.WriteAllText(Globals.DevicesFile, this.textBox1.Text);
+                this.DialogResult = DialogResult.OK;
+            }
+            catch (Exception ex)
+            {
+                Helpers.ErrorBox(ex.Message);
+            }
+
+        }
+
+        private void DeviceEditorDialog_Load(object sender, EventArgs e)
+        {
+            try
+            {
+                this.textBox1.Text = File.ReadAllText(Globals.DevicesFile);
+                this.textBox1.SelectionStart = this.textBox1.Text.Length;
+            }
+            catch(Exception ex)
+            {
+                Helpers.ErrorBox(ex.Message);
+            }
+        }
+    }
+}

+ 120 - 0
EsPy/Dialogs/DeviceEditorDialog.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>

+ 91 - 60
EsPy/Dialogs/EspToolDialog.Designer.cs

@@ -44,21 +44,24 @@
             this.button1 = new System.Windows.Forms.Button();
             this.label4 = new System.Windows.Forms.Label();
             this.groupBox1 = new System.Windows.Forms.GroupBox();
+            this.label11 = new System.Windows.Forms.Label();
+            this.tbParams = new System.Windows.Forms.TextBox();
             this.label9 = new System.Windows.Forms.Label();
             this.label8 = new System.Windows.Forms.Label();
-            this.FlashMode = new System.Windows.Forms.ComboBox();
+            this.cbDevice = new System.Windows.Forms.ComboBox();
             this.cbPort = new System.Windows.Forms.ComboBox();
             this.label10 = new System.Windows.Forms.Label();
+            this.label13 = new System.Windows.Forms.Label();
             this.cbBaudrate = new System.Windows.Forms.ComboBox();
             this.label7 = new System.Windows.Forms.Label();
             this.label6 = new System.Windows.Forms.Label();
+            this.button2 = new System.Windows.Forms.Button();
             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.label11 = new System.Windows.Forms.Label();
             this.groupBox1.SuspendLayout();
             this.SuspendLayout();
             // 
@@ -76,14 +79,14 @@
             this.tbPython.Location = new System.Drawing.Point(75, 46);
             this.tbPython.Name = "tbPython";
             this.tbPython.Size = new System.Drawing.Size(502, 20);
-            this.tbPython.TabIndex = 1;
+            this.tbPython.TabIndex = 2;
             // 
             // 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.TabIndex = 3;
             this.btnPython.Text = "...";
             this.btnPython.UseVisualStyleBackColor = true;
             this.btnPython.Click += new System.EventHandler(this.btnPython_Click);
@@ -102,14 +105,14 @@
             this.tbEsptool.Location = new System.Drawing.Point(75, 72);
             this.tbEsptool.Name = "tbEsptool";
             this.tbEsptool.Size = new System.Drawing.Size(502, 20);
-            this.tbEsptool.TabIndex = 3;
+            this.tbEsptool.TabIndex = 4;
             // 
             // 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.TabIndex = 5;
             this.btnEsptool.Text = "...";
             this.btnEsptool.UseVisualStyleBackColor = true;
             this.btnEsptool.Click += new System.EventHandler(this.btnEsptool_Click);
@@ -128,14 +131,14 @@
             this.tbFirmware.Location = new System.Drawing.Point(75, 118);
             this.tbFirmware.Name = "tbFirmware";
             this.tbFirmware.Size = new System.Drawing.Size(502, 20);
-            this.tbFirmware.TabIndex = 5;
+            this.tbFirmware.TabIndex = 6;
             // 
             // btnFirmware
             // 
             this.btnFirmware.Location = new System.Drawing.Point(583, 116);
             this.btnFirmware.Name = "btnFirmware";
             this.btnFirmware.Size = new System.Drawing.Size(23, 23);
-            this.btnFirmware.TabIndex = 6;
+            this.btnFirmware.TabIndex = 7;
             this.btnFirmware.Text = "...";
             this.btnFirmware.UseVisualStyleBackColor = true;
             this.btnFirmware.Click += new System.EventHandler(this.btnFirmware_Click);
@@ -143,20 +146,20 @@
             // 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, 244);
+            this.textBox4.Location = new System.Drawing.Point(12, 273);
             this.textBox4.Multiline = true;
             this.textBox4.Name = "textBox4";
             this.textBox4.ScrollBars = System.Windows.Forms.ScrollBars.Both;
-            this.textBox4.Size = new System.Drawing.Size(612, 162);
+            this.textBox4.Size = new System.Drawing.Size(612, 206);
             this.textBox4.TabIndex = 0;
             // 
             // btnErase
             // 
             this.btnErase.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
-            this.btnErase.Location = new System.Drawing.Point(358, 413);
+            this.btnErase.Location = new System.Drawing.Point(364, 486);
             this.btnErase.Name = "btnErase";
             this.btnErase.Size = new System.Drawing.Size(135, 23);
-            this.btnErase.TabIndex = 4;
+            this.btnErase.TabIndex = 3;
             this.btnErase.Text = "1. Erase...";
             this.btnErase.UseVisualStyleBackColor = true;
             this.btnErase.Click += new System.EventHandler(this.Erase_Click);
@@ -164,10 +167,10 @@
             // btnWrite
             // 
             this.btnWrite.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
-            this.btnWrite.Location = new System.Drawing.Point(494, 412);
+            this.btnWrite.Location = new System.Drawing.Point(500, 485);
             this.btnWrite.Name = "btnWrite";
             this.btnWrite.Size = new System.Drawing.Size(124, 23);
-            this.btnWrite.TabIndex = 5;
+            this.btnWrite.TabIndex = 4;
             this.btnWrite.Text = "2. Write...";
             this.btnWrite.UseVisualStyleBackColor = true;
             this.btnWrite.Click += new System.EventHandler(this.btnWrite_Click);
@@ -175,10 +178,10 @@
             // 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(474, 454);
+            this.btnClose.Location = new System.Drawing.Point(480, 527);
             this.btnClose.Name = "btnClose";
             this.btnClose.Size = new System.Drawing.Size(75, 23);
-            this.btnClose.TabIndex = 7;
+            this.btnClose.TabIndex = 5;
             this.btnClose.Text = "OK";
             this.btnClose.UseVisualStyleBackColor = true;
             this.btnClose.Click += new System.EventHandler(this.btnClose_Click);
@@ -187,10 +190,10 @@
             // 
             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(555, 454);
+            this.button1.Location = new System.Drawing.Point(561, 527);
             this.button1.Name = "button1";
             this.button1.Size = new System.Drawing.Size(75, 23);
-            this.button1.TabIndex = 8;
+            this.button1.TabIndex = 6;
             this.button1.Text = "Cancel";
             this.button1.UseVisualStyleBackColor = true;
             // 
@@ -213,11 +216,13 @@
             // groupBox1
             // 
             this.groupBox1.Controls.Add(this.label11);
+            this.groupBox1.Controls.Add(this.tbParams);
             this.groupBox1.Controls.Add(this.label9);
             this.groupBox1.Controls.Add(this.label8);
-            this.groupBox1.Controls.Add(this.FlashMode);
+            this.groupBox1.Controls.Add(this.cbDevice);
             this.groupBox1.Controls.Add(this.cbPort);
             this.groupBox1.Controls.Add(this.label10);
+            this.groupBox1.Controls.Add(this.label13);
             this.groupBox1.Controls.Add(this.cbBaudrate);
             this.groupBox1.Controls.Add(this.label7);
             this.groupBox1.Controls.Add(this.tbPython);
@@ -229,14 +234,33 @@
             this.groupBox1.Controls.Add(this.tbFirmware);
             this.groupBox1.Controls.Add(this.btnPython);
             this.groupBox1.Controls.Add(this.btnEsptool);
+            this.groupBox1.Controls.Add(this.button2);
             this.groupBox1.Controls.Add(this.btnFirmware);
             this.groupBox1.Location = new System.Drawing.Point(12, 59);
             this.groupBox1.Name = "groupBox1";
-            this.groupBox1.Size = new System.Drawing.Size(612, 179);
+            this.groupBox1.Size = new System.Drawing.Size(612, 208);
             this.groupBox1.TabIndex = 11;
             this.groupBox1.TabStop = false;
             this.groupBox1.Text = "Settings";
             // 
+            // label11
+            // 
+            this.label11.Image = global::EsPy.Properties.Resources.info;
+            this.label11.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
+            this.label11.Location = new System.Drawing.Point(465, 144);
+            this.label11.Name = "label11";
+            this.label11.Size = new System.Drawing.Size(119, 23);
+            this.label11.TabIndex = 20;
+            this.label11.Text = "       Edit your own list!";
+            this.label11.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+            // 
+            // tbParams
+            // 
+            this.tbParams.Location = new System.Drawing.Point(75, 181);
+            this.tbParams.Name = "tbParams";
+            this.tbParams.Size = new System.Drawing.Size(531, 20);
+            this.tbParams.TabIndex = 10;
+            // 
             // label9
             // 
             this.label9.Image = global::EsPy.Properties.Resources.Warning;
@@ -258,21 +282,16 @@
             this.label8.TabIndex = 7;
             this.label8.Text = "Default location: YourPython\\Lib\\site-packages\\esptool.py";
             // 
-            // FlashMode
-            // 
-            this.FlashMode.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
-            this.FlashMode.FormattingEnabled = true;
-            this.FlashMode.Items.AddRange(new object[] {
-            "keep",
-            "qio",
-            "qout",
-            "dio",
-            "dout"});
-            this.FlashMode.Location = new System.Drawing.Point(75, 144);
-            this.FlashMode.Name = "FlashMode";
-            this.FlashMode.Size = new System.Drawing.Size(104, 21);
-            this.FlashMode.TabIndex = 0;
-            this.FlashMode.Validating += new System.ComponentModel.CancelEventHandler(this.cbBaudrate_Validating);
+            // cbDevice
+            // 
+            this.cbDevice.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+            this.cbDevice.FormattingEnabled = true;
+            this.cbDevice.Location = new System.Drawing.Point(75, 146);
+            this.cbDevice.Name = "cbDevice";
+            this.cbDevice.Size = new System.Drawing.Size(278, 21);
+            this.cbDevice.TabIndex = 8;
+            this.cbDevice.SelectedIndexChanged += new System.EventHandler(this.cbDevice_SelectedIndexChanged);
+            this.cbDevice.Validating += new System.ComponentModel.CancelEventHandler(this.cbBaudrate_Validating);
             // 
             // cbPort
             // 
@@ -287,11 +306,20 @@
             // label10
             // 
             this.label10.AutoSize = true;
-            this.label10.Location = new System.Drawing.Point(7, 147);
+            this.label10.Location = new System.Drawing.Point(9, 184);
             this.label10.Name = "label10";
-            this.label10.Size = new System.Drawing.Size(62, 13);
+            this.label10.Size = new System.Drawing.Size(60, 13);
             this.label10.TabIndex = 6;
-            this.label10.Text = "Flash Mode";
+            this.label10.Text = "Parameters";
+            // 
+            // label13
+            // 
+            this.label13.AutoSize = true;
+            this.label13.Location = new System.Drawing.Point(28, 149);
+            this.label13.Name = "label13";
+            this.label13.Size = new System.Drawing.Size(41, 13);
+            this.label13.TabIndex = 6;
+            this.label13.Text = "Device";
             // 
             // cbBaudrate
             // 
@@ -310,7 +338,7 @@
             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.TabIndex = 1;
             this.cbBaudrate.Validating += new System.ComponentModel.CancelEventHandler(this.cbBaudrate_Validating);
             // 
             // label7
@@ -331,13 +359,23 @@
             this.label6.TabIndex = 6;
             this.label6.Text = "Baud Rate";
             // 
+            // button2
+            // 
+            this.button2.Location = new System.Drawing.Point(583, 144);
+            this.button2.Name = "button2";
+            this.button2.Size = new System.Drawing.Size(23, 23);
+            this.button2.TabIndex = 9;
+            this.button2.Text = "...";
+            this.button2.UseVisualStyleBackColor = true;
+            this.button2.Click += new System.EventHandler(this.button2_Click);
+            // 
             // 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(18, 412);
+            this.btnMac.Location = new System.Drawing.Point(24, 485);
             this.btnMac.Name = "btnMac";
             this.btnMac.Size = new System.Drawing.Size(74, 23);
-            this.btnMac.TabIndex = 1;
+            this.btnMac.TabIndex = 0;
             this.btnMac.Text = "MAC";
             this.btnMac.UseVisualStyleBackColor = true;
             this.btnMac.Click += new System.EventHandler(this.btnMac_Click);
@@ -345,10 +383,10 @@
             // 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(98, 413);
+            this.btnFlashID.Location = new System.Drawing.Point(104, 486);
             this.btnFlashID.Name = "btnFlashID";
             this.btnFlashID.Size = new System.Drawing.Size(74, 23);
-            this.btnFlashID.TabIndex = 2;
+            this.btnFlashID.TabIndex = 1;
             this.btnFlashID.Text = "Flash ID";
             this.btnFlashID.UseVisualStyleBackColor = true;
             this.btnFlashID.Click += new System.EventHandler(this.btnFlashID_Click);
@@ -356,10 +394,10 @@
             // 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(178, 413);
+            this.btnChipID.Location = new System.Drawing.Point(184, 486);
             this.btnChipID.Name = "btnChipID";
             this.btnChipID.Size = new System.Drawing.Size(74, 23);
-            this.btnChipID.TabIndex = 3;
+            this.btnChipID.TabIndex = 2;
             this.btnChipID.Text = "Chip ID";
             this.btnChipID.UseVisualStyleBackColor = true;
             this.btnChipID.Click += new System.EventHandler(this.btnChipID_Click);
@@ -367,7 +405,7 @@
             // label5
             // 
             this.label5.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
-            this.label5.Location = new System.Drawing.Point(18, 442);
+            this.label5.Location = new System.Drawing.Point(24, 515);
             this.label5.Name = "label5";
             this.label5.Size = new System.Drawing.Size(612, 1);
             this.label5.TabIndex = 15;
@@ -376,7 +414,7 @@
             // linkLabel1
             // 
             this.linkLabel1.AutoSize = true;
-            this.linkLabel1.Location = new System.Drawing.Point(18, 448);
+            this.linkLabel1.Location = new System.Drawing.Point(24, 521);
             this.linkLabel1.Name = "linkLabel1";
             this.linkLabel1.Size = new System.Drawing.Size(180, 13);
             this.linkLabel1.TabIndex = 16;
@@ -387,7 +425,7 @@
             // linkLabel2
             // 
             this.linkLabel2.AutoSize = true;
-            this.linkLabel2.Location = new System.Drawing.Point(18, 467);
+            this.linkLabel2.Location = new System.Drawing.Point(24, 540);
             this.linkLabel2.Name = "linkLabel2";
             this.linkLabel2.Size = new System.Drawing.Size(212, 13);
             this.linkLabel2.TabIndex = 17;
@@ -395,21 +433,11 @@
             this.linkLabel2.Text = "http://micropython.org/download#esp8266";
             this.linkLabel2.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabel2_LinkClicked);
             // 
-            // label11
-            // 
-            this.label11.AutoSize = true;
-            this.label11.ForeColor = System.Drawing.Color.Maroon;
-            this.label11.Location = new System.Drawing.Point(207, 147);
-            this.label11.Name = "label11";
-            this.label11.Size = new System.Drawing.Size(230, 13);
-            this.label11.TabIndex = 19;
-            this.label11.Text = "NodeMCU, Wemos D1: dio. Sonoff Relay: dout";
-            // 
             // EspToolDialog
             // 
             this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
             this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
-            this.ClientSize = new System.Drawing.Size(636, 486);
+            this.ClientSize = new System.Drawing.Size(636, 562);
             this.Controls.Add(this.linkLabel2);
             this.Controls.Add(this.linkLabel1);
             this.Controls.Add(this.label5);
@@ -467,7 +495,10 @@
         private System.Windows.Forms.Label label7;
         private System.Windows.Forms.Label label8;
         private System.Windows.Forms.Label label9;
-        private System.Windows.Forms.ComboBox FlashMode;
+        private System.Windows.Forms.Label label13;
+        private System.Windows.Forms.TextBox tbParams;
+        private System.Windows.Forms.ComboBox cbDevice;
+        private System.Windows.Forms.Button button2;
         private System.Windows.Forms.Label label10;
         private System.Windows.Forms.Label label11;
     }

+ 103 - 45
EsPy/Dialogs/EspToolDialog.cs

@@ -35,7 +35,7 @@ namespace EsPy.Dialogs
                 this.cbPort.Items.AddRange(ports);
             }
 
-            this.FlashMode.SelectedIndex = Properties.Settings.Default.EspFlashMode;
+            //this.FlashMode.SelectedIndex = Properties.Settings.Default.EspFlashMode;
         }
 
         public string PortName
@@ -96,7 +96,7 @@ namespace EsPy.Dialogs
         }
 
 
-       
+
 
         private string Run(string cmd, string args)
         {
@@ -113,9 +113,11 @@ namespace EsPy.Dialogs
                 return "";
             }
 
-            this.textBox4.Text = "Please wait...\r\n";
-            
+
+            string res = ""; // "Please wait...\r\n";
+
             this.Enabled = false;
+            Globals.MainForm.Cursor = Cursors.WaitCursor;
             Application.DoEvents();
 
             try
@@ -134,7 +136,7 @@ namespace EsPy.Dialogs
                 proc.StartInfo = inf;
 
                 proc.Start();
-                string res = "";
+
                 res = proc.StandardOutput.ReadToEnd();
                 res += proc.StandardError.ReadToEnd();
                 proc.WaitForExit();
@@ -148,9 +150,9 @@ namespace EsPy.Dialogs
 
                 for (int i = 1; i < res.Length;)
                 {
-                    if (res[i]  < 10)
-                    {                   
-                        res = res.Remove(i - 1 , 2);
+                    if (res[i] < 10)
+                    {
+                        res = res.Remove(i - 1, 2);
                         i--;
                     }
                     else i++;
@@ -165,35 +167,36 @@ namespace EsPy.Dialogs
             finally
             {
                 this.Enabled = true;
+                Globals.MainForm.Cursor = Cursors.Default;
             }
         }
 
 
-       //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);
-       // }
+        //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)
         {
@@ -229,7 +232,9 @@ namespace EsPy.Dialogs
                 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);
+                    this.textBox4.Text = "Please wait...\r\n\r\n";
+                    Application.DoEvents();
+                    this.textBox4.Text += this.Run(this.tbPython.Text, args);
                 }
             }
         }
@@ -240,6 +245,7 @@ namespace EsPy.Dialogs
             {
                 if (MessageBox.Show("Are you sure? Did you erase the device?", "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);
                     //string args = String.Format("\"{0}\" -p {1} -b {2} write_flash -fm {3} -ff 20m -fs detect 0x0000 \"{4}\"",
                     //    this.tbEsptool.Text,
@@ -248,14 +254,27 @@ namespace EsPy.Dialogs
                     //    this.FlashMode.Text,
                     //    this.tbFirmware.Text);
 
-                    string args = String.Format("\"{0}\" -p {1} -b {2} write_flash -fm {3} -fs detect 0x0000 \"{4}\"",
-                        this.tbEsptool.Text,
-                        this.PortName,
-                        this.BaudRate,
-                        this.FlashMode.Text,
-                        this.tbFirmware.Text);
+                    //string args = String.Format("\"{0}\" -p {1} -b {2} write_flash -fm {3} -fs detect 0x0000 \"{4}\"",
+                    //    this.tbEsptool.Text,
+                    //    this.PortName,
+                    //    this.BaudRate,
+                    //    this.FlashMode.Text,
+                    //    this.tbFirmware.Text);
+
+                    if (this.tbParams.Text.Length > 0)
+                    {
+                        string args = this.tbParams.Text.Replace("$PORT", this.PortName);
+                        args = args.Replace("$BAUDRATE", this.BaudRate.ToString());
+                        args = args.Replace("$FIRMWARE", this.tbFirmware.Text);
+                        args = " \"" + this.tbEsptool.Text + "\" " + args;
+
+                        this.textBox4.Text = args + "\r\n\r\n";
+                        this.textBox4.Text += "Please wait...\r\n\r\n";
+
+                        Application.DoEvents();
+                        this.textBox4.Text += this.Run(this.tbPython.Text, args);
+                    }
 
-                    this.textBox4.Text = this.Run(this.tbPython.Text, args);
                 }
             }
         }
@@ -296,13 +315,13 @@ namespace EsPy.Dialogs
 
         private void btnClose_Click(object sender, EventArgs e)
         {
-            if (this.CheckPaths(false))
+            //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.EspFlashMode = this.FlashMode.SelectedIndex;
+                Properties.Settings.Default.EspToolDeviceIndex = this.cbDevice.SelectedIndex;
                 Properties.Settings.Default.Save();
                 this.DialogResult = DialogResult.OK;
             }
@@ -337,9 +356,48 @@ namespace EsPy.Dialogs
 
         private void EspToolDialog_Load(object sender, EventArgs e)
         {
+            this.cbDevice.Items.Clear();
+            this.tbParams.Text = "";
+
+            Devices d = Devices.LoadFromFile(Globals.DevicesFile);
+            if (d != null)
+            {
+                this.cbDevice.Items.AddRange(d.ToArray());
+                if (this.cbDevice.Items.Count > Properties.Settings.Default.EspToolDeviceIndex)
+                {
+                    this.cbDevice.SelectedIndex = Properties.Settings.Default.EspToolDeviceIndex;
+                }
+            }
+        }
+
+        private void cbDevice_SelectedIndexChanged(object sender, EventArgs e)
+        {
+            if (this.cbDevice.SelectedItem is Device)
+            {
+                this.tbParams.Text = (this.cbDevice.SelectedItem as Device).Cmd;
+            }
         }
 
-      
+        private void button2_Click(object sender, EventArgs e)
+        {
+            DeviceEditorDialog d = new DeviceEditorDialog();
+            if (d.ShowDialog() == DialogResult.OK)
+            {
+                int i = this.cbDevice.SelectedIndex;
+                this.cbDevice.Items.Clear();
+                this.tbParams.Text = "";
 
+                Devices de = Devices.LoadFromFile(Globals.DevicesFile);
+                if (de != null)
+                {
+                    this.cbDevice.Items.AddRange(de.ToArray());
+                    if (this.cbDevice.Items.Count > i)
+                    {
+                        this.cbDevice.SelectedIndex = i;
+                    }
+                }
+            }
+            d.Dispose();
+        }
     }
-}
+}

+ 13 - 0
EsPy/EsPy.csproj

@@ -126,6 +126,12 @@
     <Compile Include="Components\Terminal.cs">
       <SubType>Component</SubType>
     </Compile>
+    <Compile Include="Dialogs\DeviceEditorDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Dialogs\DeviceEditorDialog.Designer.cs">
+      <DependentUpon>DeviceEditorDialog.cs</DependentUpon>
+    </Compile>
     <Compile Include="Dialogs\EspToolDialog.cs">
       <SubType>Form</SubType>
     </Compile>
@@ -208,8 +214,12 @@
     <Compile Include="Utility\BinaryString.cs" />
     <Compile Include="Utility\FileFormat.cs" />
     <Compile Include="Utility\FileFormats.cs" />
+    <Compile Include="Utility\Device.cs" />
     <Compile Include="Utility\Helpers.cs" />
     <Compile Include="Utility\TextHelper.cs" />
+    <Content Include="Conf\devices.txt">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
     <Content Include="Helps\images\esp8266-wemos-d1-mini-pinout.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
@@ -227,6 +237,9 @@
     <EmbeddedResource Include="Components\Terminal.resx">
       <DependentUpon>Terminal.cs</DependentUpon>
     </EmbeddedResource>
+    <EmbeddedResource Include="Dialogs\DeviceEditorDialog.resx">
+      <DependentUpon>DeviceEditorDialog.cs</DependentUpon>
+    </EmbeddedResource>
     <EmbeddedResource Include="Dialogs\EspToolDialog.resx">
       <DependentUpon>EspToolDialog.cs</DependentUpon>
     </EmbeddedResource>

+ 205 - 205
EsPy/Forms/EditorForm.Designer.cs

@@ -32,9 +32,15 @@
             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();
@@ -51,8 +57,16 @@
             this.mnShowWhitespace = new System.Windows.Forms.ToolStripMenuItem();
             this.deviceToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
             this.toolStripMenuItem10 = new System.Windows.Forms.ToolStripSeparator();
+            this.mnRun = new System.Windows.Forms.ToolStripMenuItem();
+            this.mnInterrupt = new System.Windows.Forms.ToolStripMenuItem();
+            this.mnUpload = 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();
@@ -67,32 +81,18 @@
             this.cmShowWhitespace = new System.Windows.Forms.ToolStripMenuItem();
             this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator();
             this.toolStrip1 = new System.Windows.Forms.ToolStrip();
-            this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
-            this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();
-            this.cmUndo = new System.Windows.Forms.ToolStripMenuItem();
-            this.cmRedo = new System.Windows.Forms.ToolStripMenuItem();
-            this.cmCut = new System.Windows.Forms.ToolStripMenuItem();
-            this.cmCopy = new System.Windows.Forms.ToolStripMenuItem();
-            this.cmPaste = new System.Windows.Forms.ToolStripMenuItem();
-            this.mnSave = new System.Windows.Forms.ToolStripMenuItem();
-            this.mnUndo = new System.Windows.Forms.ToolStripMenuItem();
-            this.mnRedo = new System.Windows.Forms.ToolStripMenuItem();
-            this.mnCut = new System.Windows.Forms.ToolStripMenuItem();
-            this.mnCopy = new System.Windows.Forms.ToolStripMenuItem();
-            this.mnPaste = new System.Windows.Forms.ToolStripMenuItem();
-            this.mnRun = new System.Windows.Forms.ToolStripMenuItem();
-            this.mnInterrupt = new System.Windows.Forms.ToolStripMenuItem();
-            this.mnUpload = new System.Windows.Forms.ToolStripMenuItem();
             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.btnRun = new System.Windows.Forms.ToolStripButton();
-            this.btnUpload = new System.Windows.Forms.ToolStripButton();
             this.btnPause = new System.Windows.Forms.ToolStripButton();
             this.toolStripSeparator5 = new System.Windows.Forms.ToolStripSeparator();
+            this.btnUpload = new System.Windows.Forms.ToolStripButton();
             this.scintilla = new EsPy.Components.ExScintilla();
             this.menuStrip1.SuspendLayout();
             this.contextMenuStrip1.SuspendLayout();
@@ -124,6 +124,18 @@
             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.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.S)));
+            this.mnSave.Size = new System.Drawing.Size(138, 22);
+            this.mnSave.Text = "Save";
+            this.mnSave.Click += new System.EventHandler(this.mnSave_Click);
+            // 
             // mnSaveAs
             // 
             this.mnSaveAs.MergeAction = System.Windows.Forms.MergeAction.Replace;
@@ -158,6 +170,28 @@
             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;
@@ -165,6 +199,39 @@
             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;
@@ -308,6 +375,39 @@
             this.toolStripMenuItem10.Name = "toolStripMenuItem10";
             this.toolStripMenuItem10.Size = new System.Drawing.Size(244, 6);
             // 
+            // mnRun
+            // 
+            this.mnRun.Image = global::EsPy.Properties.Resources.play1;
+            this.mnRun.MergeAction = System.Windows.Forms.MergeAction.Insert;
+            this.mnRun.MergeIndex = 3;
+            this.mnRun.Name = "mnRun";
+            this.mnRun.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.R)));
+            this.mnRun.Size = new System.Drawing.Size(247, 22);
+            this.mnRun.Text = "Run";
+            this.mnRun.Click += new System.EventHandler(this.btnRun_Click);
+            // 
+            // mnInterrupt
+            // 
+            this.mnInterrupt.Image = global::EsPy.Properties.Resources.pause;
+            this.mnInterrupt.MergeAction = System.Windows.Forms.MergeAction.Insert;
+            this.mnInterrupt.MergeIndex = 4;
+            this.mnInterrupt.Name = "mnInterrupt";
+            this.mnInterrupt.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.I)));
+            this.mnInterrupt.Size = new System.Drawing.Size(247, 22);
+            this.mnInterrupt.Text = "Interrupt current program";
+            this.mnInterrupt.Click += new System.EventHandler(this.mnInterrupt_Click);
+            // 
+            // mnUpload
+            // 
+            this.mnUpload.Image = global::EsPy.Properties.Resources.upload1;
+            this.mnUpload.MergeAction = System.Windows.Forms.MergeAction.Insert;
+            this.mnUpload.MergeIndex = 5;
+            this.mnUpload.Name = "mnUpload";
+            this.mnUpload.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.U)));
+            this.mnUpload.Size = new System.Drawing.Size(247, 22);
+            this.mnUpload.Text = "Upload";
+            this.mnUpload.Click += new System.EventHandler(this.btnUpload_Click);
+            // 
             // contextMenuStrip1
             // 
             this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
@@ -332,6 +432,30 @@
             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;
@@ -339,6 +463,42 @@
             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;
@@ -478,178 +638,6 @@
             this.toolStrip1.Text = "toolStrip1";
             this.toolStrip1.Visible = false;
             // 
-            // toolStripSeparator1
-            // 
-            this.toolStripSeparator1.Name = "toolStripSeparator1";
-            this.toolStripSeparator1.Size = new System.Drawing.Size(6, 39);
-            this.toolStripSeparator1.Visible = false;
-            // 
-            // toolStripSeparator2
-            // 
-            this.toolStripSeparator2.Name = "toolStripSeparator2";
-            this.toolStripSeparator2.Size = new System.Drawing.Size(6, 39);
-            this.toolStripSeparator2.Visible = false;
-            // 
-            // 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);
-            // 
-            // 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);
-            // 
-            // 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.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.S)));
-            this.mnSave.Size = new System.Drawing.Size(138, 22);
-            this.mnSave.Text = "Save";
-            this.mnSave.Click += new System.EventHandler(this.mnSave_Click);
-            // 
-            // 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);
-            // 
-            // 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);
-            // 
-            // mnRun
-            // 
-            this.mnRun.Image = global::EsPy.Properties.Resources.play1;
-            this.mnRun.MergeAction = System.Windows.Forms.MergeAction.Insert;
-            this.mnRun.MergeIndex = 3;
-            this.mnRun.Name = "mnRun";
-            this.mnRun.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.R)));
-            this.mnRun.Size = new System.Drawing.Size(247, 22);
-            this.mnRun.Text = "Run";
-            this.mnRun.Click += new System.EventHandler(this.btnRun_Click);
-            // 
-            // mnInterrupt
-            // 
-            this.mnInterrupt.Image = global::EsPy.Properties.Resources.pause;
-            this.mnInterrupt.MergeAction = System.Windows.Forms.MergeAction.Insert;
-            this.mnInterrupt.MergeIndex = 4;
-            this.mnInterrupt.Name = "mnInterrupt";
-            this.mnInterrupt.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.I)));
-            this.mnInterrupt.Size = new System.Drawing.Size(247, 22);
-            this.mnInterrupt.Text = "Interrupt current program";
-            this.mnInterrupt.Click += new System.EventHandler(this.mnInterrupt_Click);
-            // 
-            // mnUpload
-            // 
-            this.mnUpload.Image = global::EsPy.Properties.Resources.upload1;
-            this.mnUpload.MergeAction = System.Windows.Forms.MergeAction.Insert;
-            this.mnUpload.MergeIndex = 5;
-            this.mnUpload.Name = "mnUpload";
-            this.mnUpload.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.U)));
-            this.mnUpload.Size = new System.Drawing.Size(247, 22);
-            this.mnUpload.Text = "Upload";
-            this.mnUpload.Click += new System.EventHandler(this.btnUpload_Click);
-            // 
             // btnSave
             // 
             this.btnSave.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
@@ -662,6 +650,12 @@
             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;
@@ -686,6 +680,12 @@
             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;
@@ -730,22 +730,10 @@
             this.btnRun.ImageTransparentColor = System.Drawing.Color.Magenta;
             this.btnRun.Name = "btnRun";
             this.btnRun.Size = new System.Drawing.Size(36, 36);
-            this.btnRun.Text = "Run (Ctrl+R)";
-            this.btnRun.ToolTipText = "Run";
+            this.btnRun.Text = "Run ";
+            this.btnRun.ToolTipText = "Run (Ctrl+R)";
             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);
-            // 
             // btnPause
             // 
             this.btnPause.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
@@ -761,6 +749,18 @@
             this.toolStripSeparator5.Name = "toolStripSeparator5";
             this.toolStripSeparator5.Size = new System.Drawing.Size(6, 39);
             // 
+            // 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;
@@ -775,10 +775,10 @@
             this.scintilla.IndentationGuides = ScintillaNET.IndentView.LookBoth;
             this.scintilla.IndentWidth = 4;
             this.scintilla.Lexer = ScintillaNET.Lexer.Html;
-            this.scintilla.Location = new System.Drawing.Point(0, 24);
+            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, 238);
+            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);

+ 208 - 208
EsPy/Forms/EditorForm.resx

@@ -120,182 +120,36 @@
   <metadata name="menuStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
     <value>17, 17</value>
   </metadata>
-  <metadata name="contextMenuStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>237, 17</value>
-  </metadata>
-  <metadata name="toolStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>132, 17</value>
-  </metadata>
   <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
-  <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">
+  <data name="mnSave.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
         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
-        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
+        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
 </value>
   </data>
-  <data name="cmUndo.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+  <data name="mnUndo.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
         iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
         YQUAAAAJcEhZcwAADrwAAA68AZW8ckkAAAUMSURBVFhH7VV7UFRlFD+EWghLCgEZSGxmavmeMZ0iix72
@@ -323,7 +177,7 @@
         +wrSc2wWtwAAAABJRU5ErkJggg==
 </value>
   </data>
-  <data name="cmRedo.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+  <data name="mnRedo.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
         iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
         YQUAAAAJcEhZcwAADrwAAA68AZW8ckkAAAYjSURBVFhH7VZ3UNRHGF2xVxSxAbEQNUYCggVjg1hOiRhU
@@ -355,7 +209,7 @@
         6TZIYtLZoDISKfHLSGPN91q6jq9ccWtAkyVKxl5FaW8lvgGM/QWioO/KcbNlcgAAAABJRU5ErkJggg==
 </value>
   </data>
-  <data name="cmCut.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+  <data name="mnCut.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
         iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
         YQUAAAAJcEhZcwAADrwAAA68AZW8ckkAAAcZSURBVFhHtVdtTFNnFL5SaEspbSkUyqBQEShTGE7RadRl
@@ -392,7 +246,7 @@
         rkJggg==
 </value>
   </data>
-  <data name="cmCopy.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+  <data name="mnCopy.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
         iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
         YQUAAAAJcEhZcwAADrwAAA68AZW8ckkAAAHHSURBVFhHxZY9asNAEEbdpEyKBFIlZarkACFX8CVc6C4q
@@ -406,7 +260,7 @@
         4xs1dfbZaqs65wAAAABJRU5ErkJggg==
 </value>
   </data>
-  <data name="cmPaste.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+  <data name="mnPaste.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
         iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
         YQUAAAAJcEhZcwAADrwAAA68AZW8ckkAAAWtSURBVFhHrZdrTJNXGMf5sC27JIvbRObmlklBXbIs2Yft
@@ -436,35 +290,10 @@
         3xh0Rfp90OXtXwYWUNZ7xGsc7D5eIF61/Rjw5nNmGcGhLxL2ERDwH08YkhcPOnhVAAAAAElFTkSuQmCC
 </value>
   </data>
-  <data name="mnSave.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-    <value>
-        iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
-        YQUAAAAJcEhZcwAADrwAAA68AZW8ckkAAAUgSURBVFhH7ZdZTNRXFIdpmy4xsU0aTU19EWmfm9hVpeuT
-        QkJqKKvsyC6gTWrEtGVn6CB2tKUVBEWtgCAIlbIPMDMsMwwzwOCgjFDKvlOT2mrE8Ou59w/jjKh/2+Gh
-        D73Jl1wY7jnfPffcO8Hu/2E5XnORpm1xlixucZKAofexWzNWYhKLDs7S5OWU1mOLc/piedsQ5N3jKFGY
-        cOdSIO4UedkOxZEWapFVYYCkQAu2yeWU1oMZNvVMwDejGbu+KMWt+PX4M87OZlgcx4gL2H34Z8hKu3kl
-        llNaDy5gmOR/4Bh2FiMjQ1hYmLMZFufNgFM8ruySiEAzCcjKjdgecoYvvHlzwWZYnG1+2Ug8r8UxMQFF
-        7xSCZC3YsSzgE+CPOnnVv4at5xXwy4HLV1XILBETuDqFfSdasTNUELh16w+b4QL+p/BpfDWOlnQ9XkB5
-        dRqh37WRQD5fePv2XzbD4rxFPbAnoQYZxSICKuM0wrLazU3oExjw0NI+KWw9i/M2Cbgm1UJaLHIETCDi
-        Rw3eDxcE7t1btBkuEJgLt5R6fHNRpAItfTOIOtlhFlhaWrIZFuedoFy4pzYgXUxARQL7c7T4IOIcX7hW
-        R/BuUB48JXJIxASUxhnEnOrEh5GCwMN29E/hAsF58E5vRFqhiICCbsGBPB0JnF9Tgff2ncZeaRNSi8Se
-        4t5pHDytxyfRF/jCtWI7vSvsOyZFTEBumOICnqm1+JgkPoo6z2EVETjH+4PBGnUFRwZd3Z1h+fwNETiD
-        HZx8uBypgH+mEimFIgL1PYLAgxzI0yM2V4eY3E7eI9HUqPuzO/iNiaRry65u+A9q/oaEft+OEHrM2Isa
-        fLyVP+1BMhUCv1WJC9R2TVolDo47BndPN7h5uD4x7l7ucI1Kwe5DpXA+XEa7L4eXpIGLJIsdQY1+wkrA
-        3csNHbpWmAavYWh4AKPjw5icHsfc/Ax+p2+6uYVZTM9OYXJqHKNjwxj41YQegx4e3h6IpurE5GgQnd0O
-        t8QqXpEksQpU6awF2I4GhvpRWVeKyNgo+Ph5c2I/P4h+kxGGq13Q6tvRolZArqgjanFjsJ+vi6JjiaRj
-        OXRGB++0ev4dk1jY83iBys7xVQJDIwOollfwuWtyHT6jN53NDUaWXM2TN1LymoZKNLfIYRq4LghQj0Se
-        1ODLn7rhK21EeJYaiQWPFniOfXBFu1pgZGwIjaoaPvc7quCwub67A+0dKjSrGlAr/4VXoFWtNAsIjapF
-        8sVe+GU08kZNuF+B9UJaYTxFbGAflGvGVgmMTYygRdPE52G0i3DqdDbXdLZB2daI+qYaohqqtibqFzVu
-        DAhHELt8Y6RlRgRkNvEbk3C/Aq8SL7DkbDxPbGYfXFaPIqGo10qANZ22S0hq+ftWy9Kr5FBrW9Ft0Jl7
-        YOXqyq5cpyuo4BWxqMBW4kWWnA0uYO8smXE9Uny3UDmM+GUJFmh6dpLOW4+wqHB4++6FFxEYEriq9Do6
-        EuO1XvQau61kT1T2I1im5G9IfJFhRcCBMAvwI1i3wWGbg1OKaU9c8d0i1TAKlL8JAjOTmJ+fxezcDF21
-        EdqhCdf6+2i3emip5J16DXRdWv6zrqsTLW1Kvk56uQ/pZX043TCIuHwtkqgXDp/VwZ7+/6B8mwnzEbDB
-        qrBp3cbX39jqlDrILBkskIe3pxl3S7w8zPMH/4atW4lhib2T5J79rq+PUy7z7i3Hs8RLxEZiE8EaZS15
-        hXiZsNr5o8bTxDNrzH9t2Nn9DdyzagtK4+JeAAAAAElFTkSuQmCC
-</value>
-  </data>
-  <data name="mnUndo.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+  <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>
         iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
         YQUAAAAJcEhZcwAADrwAAA68AZW8ckkAAAUMSURBVFhH7VV7UFRlFD+EWghLCgEZSGxmavmeMZ0iix72
@@ -492,7 +321,7 @@
         +wrSc2wWtwAAAABJRU5ErkJggg==
 </value>
   </data>
-  <data name="mnRedo.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+  <data name="cmRedo.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
         iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
         YQUAAAAJcEhZcwAADrwAAA68AZW8ckkAAAYjSURBVFhH7VZ3UNRHGF2xVxSxAbEQNUYCggVjg1hOiRhU
@@ -524,7 +353,7 @@
         6TZIYtLZoDISKfHLSGPN91q6jq9ccWtAkyVKxl5FaW8lvgGM/QWioO/KcbNlcgAAAABJRU5ErkJggg==
 </value>
   </data>
-  <data name="mnCut.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+  <data name="cmCut.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
         iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
         YQUAAAAJcEhZcwAADrwAAA68AZW8ckkAAAcZSURBVFhHtVdtTFNnFL5SaEspbSkUyqBQEShTGE7RadRl
@@ -561,7 +390,7 @@
         rkJggg==
 </value>
   </data>
-  <data name="mnCopy.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+  <data name="cmCopy.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
         iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
         YQUAAAAJcEhZcwAADrwAAA68AZW8ckkAAAHHSURBVFhHxZY9asNAEEbdpEyKBFIlZarkACFX8CVc6C4q
@@ -575,7 +404,7 @@
         4xs1dfbZaqs65wAAAABJRU5ErkJggg==
 </value>
   </data>
-  <data name="mnPaste.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+  <data name="cmPaste.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
         iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
         YQUAAAAJcEhZcwAADrwAAA68AZW8ckkAAAWtSURBVFhHrZdrTJNXGMf5sC27JIvbRObmlklBXbIs2Yft
@@ -603,6 +432,177 @@
         zolFgTIBKgpTL4Hav+cTIWCiJ+G29W/spMxXbNG28VbY+mV7y/es/ve0/WnI8H8z9YxUQs8HOlIzCXSw
         JPhuYWpo0/LGNdHe8QXPzd/5/sJ3n76+mzKDbNG28TLxbsQ3y7XJYUGXM8NXdsjDgq4Kfgi6muiC9BmJ
         3xh0Rfp90OXtXwYWUNZ7xGsc7D5eIF61/Rjw5nNmGcGhLxL2ERDwH08YkhcPOnhVAAAAAElFTkSuQmCC
+</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">

+ 17 - 17
EsPy/Forms/TerminalForm.Designer.cs

@@ -276,19 +276,19 @@
             this.toolStripSeparator3,
             this.advancedToolStripMenuItem});
             this.contextMenuStrip1.Name = "contextMenuStrip1";
-            this.contextMenuStrip1.Size = new System.Drawing.Size(145, 248);
+            this.contextMenuStrip1.Size = new System.Drawing.Size(153, 270);
             // 
             // cmSoftReset
             // 
             this.cmSoftReset.Enabled = false;
             this.cmSoftReset.Name = "cmSoftReset";
-            this.cmSoftReset.Size = new System.Drawing.Size(144, 22);
+            this.cmSoftReset.Size = new System.Drawing.Size(152, 22);
             this.cmSoftReset.Text = "Soft reset";
             // 
             // toolStripSeparator5
             // 
             this.toolStripSeparator5.Name = "toolStripSeparator5";
-            this.toolStripSeparator5.Size = new System.Drawing.Size(141, 6);
+            this.toolStripSeparator5.Size = new System.Drawing.Size(149, 6);
             // 
             // cmUndo
             // 
@@ -298,7 +298,7 @@
             this.cmUndo.MergeIndex = 0;
             this.cmUndo.Name = "cmUndo";
             this.cmUndo.ShortcutKeyDisplayString = "Ctrl+Z";
-            this.cmUndo.Size = new System.Drawing.Size(144, 22);
+            this.cmUndo.Size = new System.Drawing.Size(152, 22);
             this.cmUndo.Text = "Undo";
             this.cmUndo.Click += new System.EventHandler(this.mnUndo_Click);
             // 
@@ -310,7 +310,7 @@
             this.cmRedo.MergeIndex = 1;
             this.cmRedo.Name = "cmRedo";
             this.cmRedo.ShortcutKeyDisplayString = "Ctrl+Y";
-            this.cmRedo.Size = new System.Drawing.Size(144, 22);
+            this.cmRedo.Size = new System.Drawing.Size(152, 22);
             this.cmRedo.Text = "Redo";
             this.cmRedo.Click += new System.EventHandler(this.mnRedo_Click);
             // 
@@ -319,7 +319,7 @@
             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);
+            this.toolStripSeparator4.Size = new System.Drawing.Size(149, 6);
             // 
             // cmCut
             // 
@@ -329,7 +329,7 @@
             this.cmCut.MergeIndex = 3;
             this.cmCut.Name = "cmCut";
             this.cmCut.ShortcutKeyDisplayString = "Ctrl+X";
-            this.cmCut.Size = new System.Drawing.Size(144, 22);
+            this.cmCut.Size = new System.Drawing.Size(152, 22);
             this.cmCut.Text = "Cut";
             this.cmCut.Click += new System.EventHandler(this.mnCut_Click);
             // 
@@ -341,7 +341,7 @@
             this.cmCopy.MergeIndex = 4;
             this.cmCopy.Name = "cmCopy";
             this.cmCopy.ShortcutKeyDisplayString = "";
-            this.cmCopy.Size = new System.Drawing.Size(144, 22);
+            this.cmCopy.Size = new System.Drawing.Size(152, 22);
             this.cmCopy.Text = "Copy";
             this.cmCopy.Click += new System.EventHandler(this.mnCopy_Click);
             // 
@@ -353,7 +353,7 @@
             this.cmPaste.MergeIndex = 5;
             this.cmPaste.Name = "cmPaste";
             this.cmPaste.ShortcutKeyDisplayString = "Ctrl+V";
-            this.cmPaste.Size = new System.Drawing.Size(144, 22);
+            this.cmPaste.Size = new System.Drawing.Size(152, 22);
             this.cmPaste.Text = "Paste";
             this.cmPaste.Click += new System.EventHandler(this.mnPaste_Click);
             // 
@@ -364,7 +364,7 @@
             this.cmDelete.MergeIndex = 6;
             this.cmDelete.Name = "cmDelete";
             this.cmDelete.ShortcutKeyDisplayString = "Del";
-            this.cmDelete.Size = new System.Drawing.Size(144, 22);
+            this.cmDelete.Size = new System.Drawing.Size(152, 22);
             this.cmDelete.Text = "Delete";
             this.cmDelete.Click += new System.EventHandler(this.mnDelete_Click);
             // 
@@ -372,14 +372,14 @@
             // 
             this.cmClean.Image = global::EsPy.Properties.Resources.editclear;
             this.cmClean.Name = "cmClean";
-            this.cmClean.Size = new System.Drawing.Size(144, 22);
+            this.cmClean.Size = new System.Drawing.Size(152, 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);
+            this.toolStripSeparator1.Size = new System.Drawing.Size(149, 6);
             // 
             // cmSelectAll
             // 
@@ -388,14 +388,14 @@
             this.cmSelectAll.MergeIndex = 8;
             this.cmSelectAll.Name = "cmSelectAll";
             this.cmSelectAll.ShortcutKeyDisplayString = "";
-            this.cmSelectAll.Size = new System.Drawing.Size(144, 22);
+            this.cmSelectAll.Size = new System.Drawing.Size(152, 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);
+            this.toolStripSeparator3.Size = new System.Drawing.Size(149, 6);
             // 
             // advancedToolStripMenuItem
             // 
@@ -403,7 +403,7 @@
             this.cmShowEOL,
             this.cmShowWhitespace});
             this.advancedToolStripMenuItem.Name = "advancedToolStripMenuItem";
-            this.advancedToolStripMenuItem.Size = new System.Drawing.Size(144, 22);
+            this.advancedToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
             this.advancedToolStripMenuItem.Text = "Advanced";
             // 
             // cmShowEOL
@@ -432,12 +432,12 @@
             this.scintilla.IndentationGuides = ScintillaNET.IndentView.LookForward;
             this.scintilla.IndentWidth = 4;
             this.scintilla.Lexer = ScintillaNET.Lexer.Python;
-            this.scintilla.Location = new System.Drawing.Point(0, 39);
+            this.scintilla.Location = new System.Drawing.Point(0, 0);
             this.scintilla.MouseDwellTime = 500;
             this.scintilla.Name = "scintilla";
             this.scintilla.Port = null;
             this.scintilla.ReadOnly = true;
-            this.scintilla.Size = new System.Drawing.Size(664, 223);
+            this.scintilla.Size = new System.Drawing.Size(664, 262);
             this.scintilla.TabIndex = 2;
             this.scintilla.ViewWhitespace = ScintillaNET.WhitespaceMode.VisibleAlways;
             this.scintilla.UpdateUI += new System.EventHandler<ScintillaNET.UpdateUIEventArgs>(this.terminal_UpdateUI);

+ 1 - 1
EsPy/Forms/TerminalForm.cs

@@ -23,7 +23,7 @@ namespace EsPy.Forms
             InitializeComponent();
             this.HideOnClose = true;
             this.DockAreas =
-                DockAreas.Document |
+                //DockAreas.Document |
                 DockAreas.DockBottom | 
                 DockAreas.DockLeft |
                 DockAreas.DockRight |

+ 5 - 0
EsPy/Globals.cs

@@ -19,6 +19,11 @@ namespace EsPy
     public class Globals
     {
 
+        public static string DevicesFile
+        {
+            get { return Path.Combine(Application.StartupPath, "conf", "devices.txt"); }
+        }
+
         //public static PyClient PyClient = null;
 
         //public static void PyClientStart()

+ 7 - 3
EsPy/MainForm.cs

@@ -255,10 +255,14 @@ namespace EsPy
                 {
                     deserializeDockContent = new DeserializeDockContent(GetContentFromPersistString);
                     dockPanel1.LoadFromXml(configFile, this.deserializeDockContent);
+                    
                 }
                 catch (Exception ex)
                 {
-                    Helpers.ErrorBox(ex.Message);                    
+                    Helpers.ErrorBox(ex.Message + "\r\n\r\n"+ "Plase restart the program!");
+                    this.TerminalForm.Close();
+                    this.Close();
+                    return;
                 }
             }
 
@@ -649,7 +653,7 @@ namespace EsPy
                     this.FPort.PortBusy -= Port_PortBusy;
                     this.FPort.PortFree -= Port_PortFree;
 
-                    foreach (DockContent dc in this.dockPanel1.Documents)
+                    foreach (DockContent dc in this.dockPanel1.Contents)
                     {
                         if (dc is IPort)
                         {
@@ -677,7 +681,7 @@ namespace EsPy
                         //Websocket
                     }
 
-                    foreach (DockContent dc in this.dockPanel1.Documents)
+                    foreach (DockContent dc in this.dockPanel1.Contents)
                     {
                         if (dc is IPort)
                         {

+ 2 - 2
EsPy/Properties/AssemblyInfo.cs

@@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
 // 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.10")]
-[assembly: AssemblyFileVersion("1.0.0.10")]
+[assembly: AssemblyVersion("1.0.0.11")]
+[assembly: AssemblyFileVersion("1.0.0.11")]

+ 4 - 4
EsPy/Properties/Settings.Designer.cs

@@ -253,13 +253,13 @@ namespace EsPy.Properties {
         
         [global::System.Configuration.UserScopedSettingAttribute()]
         [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-        [global::System.Configuration.DefaultSettingValueAttribute("3")]
-        public int EspFlashMode {
+        [global::System.Configuration.DefaultSettingValueAttribute("0")]
+        public int EspToolDeviceIndex {
             get {
-                return ((int)(this["EspFlashMode"]));
+                return ((int)(this["EspToolDeviceIndex"]));
             }
             set {
-                this["EspFlashMode"] = value;
+                this["EspToolDeviceIndex"] = value;
             }
         }
     }

+ 2 - 2
EsPy/Properties/Settings.settings

@@ -59,8 +59,8 @@
     <Setting Name="PyServerPort" Type="System.Int32" Scope="User">
       <Value Profile="(Default)">5005</Value>
     </Setting>
-    <Setting Name="EspFlashMode" Type="System.Int32" Scope="User">
-      <Value Profile="(Default)">3</Value>
+    <Setting Name="EspToolDeviceIndex" Type="System.Int32" Scope="User">
+      <Value Profile="(Default)">0</Value>
     </Setting>
   </Settings>
 </SettingsFile>

+ 10 - 10
EsPy/Units/SerialPort.cs

@@ -43,16 +43,16 @@ namespace EsPy.Units
 
         public void Dispose()
         {
-            if (this.IsOpen)
-            {
-                try
-                {
-                    this.Sync(false);
-                    this.Close();
-                }
-                catch (Exception)
-                { }
-            }
+            //if (this.IsOpen)
+            //{
+            //    try
+            //    {
+            //        this.Sync(false);
+            //        this.Close();
+            //    }
+            //    catch (Exception)
+            //    { }
+            //}
         }
 
         public string PortName

+ 77 - 0
EsPy/Utility/Device.cs

@@ -0,0 +1,77 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace EsPy.Utility
+{
+    public class Device
+    {
+        public string Name = "";
+        public string Cmd = "";
+        public string Comment = "";
+
+        public Device(string name, string cmd, string comment)
+        {
+            this.Name = name;
+            this.Cmd = cmd;
+            this.Comment = comment;
+        }
+
+        public static Device FromString(string text)
+        {
+            text = text.Trim();
+            if(text.Length != 0 && !text.Trim().StartsWith("#") && !text.Trim().StartsWith("/"))
+            {
+                string[] items = text.Split(';');
+
+                if (items.Length == 2)
+                {
+                    return new Device(items[0].Trim(), items[1].Trim(), "");
+                }
+                else if(items.Length == 3)
+                {
+                    return new Device(items[0].Trim(), items[1].Trim(), items[2].Trim());
+                }
+            }
+            return null;
+        }
+
+        public override string ToString()
+        {
+            return this.Name;
+        }
+    }
+
+
+    public class Devices : List<Device>
+    {
+        public static Devices LoadFromFile(string filename)
+        {
+            if (File.Exists(filename))
+            {
+                Devices l = new Devices();
+
+                string[] lines = File.ReadAllLines(filename);
+                foreach (string line in lines)
+                {
+                    if (line.Trim().Length > 0)
+                    {
+                        Device d = Device.FromString(line);
+                        if (d != null)
+                            l.Add(d);
+                    }
+                }
+                return l;
+            }
+            else
+            {
+                Helpers.ErrorBox($"Could not load the devices from {filename}");
+            }
+            return null;
+        }
+
+    }
+}