OSDN Git Service

* Added scipt viewer in the inventory
authorLatif Khalifa <latifer@streamgrid.net>
Thu, 2 Jul 2009 13:03:46 +0000 (13:03 +0000)
committerLatif Khalifa <latifer@streamgrid.net>
Thu, 2 Jul 2009 13:03:46 +0000 (13:03 +0000)
* First pass at embeddable assets in notecards
* Speed up inventory loading

git-svn-id: https://radegast.googlecode.com/svn/trunk@87 f7a694da-4d33-11de-9ad6-1127a62b9fcd

Radegast/GUI/Consoles/Assets/Notecard.Designer.cs
Radegast/GUI/Consoles/Assets/Notecard.cs
Radegast/GUI/Consoles/Assets/ScriptEditor.Designer.cs [new file with mode: 0644]
Radegast/GUI/Consoles/Assets/ScriptEditor.cs [new file with mode: 0644]
Radegast/GUI/Consoles/Assets/ScriptEditor.resx [new file with mode: 0644]
Radegast/GUI/Consoles/Inventory/InventoryConsole.Designer.cs
Radegast/GUI/Consoles/Inventory/InventoryConsole.cs
Radegast/GUI/Consoles/Inventory/InventoryConsole.resx
Radegast/Radegast.csproj

index c5f014a..c23546e 100644 (file)
@@ -61,9 +61,8 @@
             this.txtName = new System.Windows.Forms.TextBox();\r
             this.txtDesc = new System.Windows.Forms.TextBox();\r
             this.pnlControls = new System.Windows.Forms.Panel();\r
-            this.lblStatus = new System.Windows.Forms.Label();\r
-            this.btnRefresh = new System.Windows.Forms.Button();\r
             this.btnSave = new System.Windows.Forms.Button();\r
+            this.btnRefresh = new System.Windows.Forms.Button();\r
             this.rtbContent = new System.Windows.Forms.RichTextBox();\r
             this.pnlControls.SuspendLayout();\r
             this.SuspendLayout();\r
             // \r
             this.pnlControls.Controls.Add(this.btnSave);\r
             this.pnlControls.Controls.Add(this.btnRefresh);\r
-            this.pnlControls.Controls.Add(this.lblStatus);\r
             this.pnlControls.Dock = System.Windows.Forms.DockStyle.Bottom;\r
             this.pnlControls.Location = new System.Drawing.Point(0, 330);\r
             this.pnlControls.Name = "pnlControls";\r
             this.pnlControls.Size = new System.Drawing.Size(382, 34);\r
             this.pnlControls.TabIndex = 2;\r
             // \r
-            // lblStatus\r
+            // btnSave\r
             // \r
-            this.lblStatus.AutoSize = true;\r
-            this.lblStatus.Location = new System.Drawing.Point(247, 10);\r
-            this.lblStatus.Name = "lblStatus";\r
-            this.lblStatus.Size = new System.Drawing.Size(37, 13);\r
-            this.lblStatus.TabIndex = 0;\r
-            this.lblStatus.Text = "Status";\r
+            this.btnSave.Enabled = false;\r
+            this.btnSave.Location = new System.Drawing.Point(84, 5);\r
+            this.btnSave.Name = "btnSave";\r
+            this.btnSave.Size = new System.Drawing.Size(75, 23);\r
+            this.btnSave.TabIndex = 1;\r
+            this.btnSave.Text = "Save";\r
+            this.btnSave.UseVisualStyleBackColor = true;\r
             // \r
             // btnRefresh\r
             // \r
             this.btnRefresh.UseVisualStyleBackColor = true;\r
             this.btnRefresh.Click += new System.EventHandler(this.btnRefresh_Click);\r
             // \r
-            // btnSave\r
-            // \r
-            this.btnSave.Enabled = false;\r
-            this.btnSave.Location = new System.Drawing.Point(84, 5);\r
-            this.btnSave.Name = "btnSave";\r
-            this.btnSave.Size = new System.Drawing.Size(75, 23);\r
-            this.btnSave.TabIndex = 1;\r
-            this.btnSave.Text = "Save";\r
-            this.btnSave.UseVisualStyleBackColor = true;\r
-            // \r
             // rtbContent\r
             // \r
             this.rtbContent.Dock = System.Windows.Forms.DockStyle.Fill;\r
             this.Name = "Notecard";\r
             this.Size = new System.Drawing.Size(382, 364);\r
             this.pnlControls.ResumeLayout(false);\r
-            this.pnlControls.PerformLayout();\r
             this.ResumeLayout(false);\r
             this.PerformLayout();\r
 \r
         private System.Windows.Forms.TextBox txtDesc;\r
         private System.Windows.Forms.Panel pnlControls;\r
         private System.Windows.Forms.Button btnRefresh;\r
-        private System.Windows.Forms.Label lblStatus;\r
         private System.Windows.Forms.Button btnSave;\r
         private System.Windows.Forms.RichTextBox rtbContent;\r
     }\r
index eb2c991..ba4b955 100644 (file)
@@ -46,6 +46,7 @@ namespace Radegast
         private RadegastInstance instance;\r
         private GridClient client { get { return instance.Client; } }\r
         private InventoryNotecard notecard;\r
+        private UUID requestID;\r
 \r
         public Notecard(RadegastInstance instance, InventoryNotecard notecard)\r
         {\r
@@ -57,12 +58,12 @@ namespace Radegast
 \r
             txtName.Text = notecard.Name;\r
             txtDesc.Text = notecard.Description;\r
-            lblStatus.Text = "Downloading";\r
+            rtbContent.Text = "Loading...";\r
 \r
             // Callbacks\r
             client.Assets.OnAssetReceived += new AssetManager.AssetReceivedCallback(Assets_OnAssetReceived);\r
 \r
-            client.Assets.RequestInventoryAsset(notecard, true);\r
+            requestID = client.Assets.RequestInventoryAsset(notecard, true);\r
         }\r
 \r
         void Notecard_Disposed(object sender, EventArgs e)\r
@@ -72,7 +73,7 @@ namespace Radegast
 \r
         void Assets_OnAssetReceived(AssetDownload transfer, Asset asset)\r
         {\r
-            if (transfer.AssetID != notecard.AssetUUID) return;\r
+            if (requestID != transfer.ID) return;\r
 \r
             if (InvokeRequired)\r
             {\r
@@ -84,23 +85,42 @@ namespace Radegast
                 return;\r
             }\r
 \r
-            if (transfer.Success && asset.AssetType == AssetType.Notecard)\r
+            if (transfer.Success)\r
             {\r
-                lblStatus.Text = "Done";\r
                 AssetNotecard n = (AssetNotecard)asset;\r
                 n.Decode();\r
-                rtbContent.Text = n.BodyText;\r
+                string noteText = string.Empty;\r
+\r
+                for (int i = 0; i < n.BodyText.Length; i++)\r
+                {\r
+                    char c = n.BodyText[i];\r
+\r
+                    if ((int)c == 0xdbc0)\r
+                    {\r
+                        int index = (int)n.BodyText[++i] - 0xdc00;\r
+                        Logger.DebugLog(string.Format("Embedded item index {0}", index));\r
+                        rtbContent.AppendText(noteText);\r
+                        rtbContent.AppendText("http://" + n.EmbeddedItems[index].AssetType.ToString() + "/" + index + "/" + n.EmbeddedItems[index].Name.Replace(" ", "_"));\r
+                        noteText = string.Empty;\r
+                    }\r
+                    else\r
+                    {\r
+                        noteText += c;\r
+                    }\r
+                }\r
+\r
+                rtbContent.AppendText(noteText);\r
             }\r
             else\r
             {\r
-                lblStatus.Text = "Failed";\r
+                rtbContent.Text = "Failed to download notecard.";\r
             }\r
         }\r
 \r
         private void btnRefresh_Click(object sender, EventArgs e)\r
         {\r
-            lblStatus.Text = "Downloading";\r
-            client.Assets.RequestInventoryAsset(notecard, true);\r
+            rtbContent.Text = "Loading...";\r
+            requestID = client.Assets.RequestInventoryAsset(notecard, true);\r
         }\r
     }\r
 }\r
diff --git a/Radegast/GUI/Consoles/Assets/ScriptEditor.Designer.cs b/Radegast/GUI/Consoles/Assets/ScriptEditor.Designer.cs
new file mode 100644 (file)
index 0000000..b5c0729
--- /dev/null
@@ -0,0 +1,116 @@
+// \r
+// Radegast Metaverse Client\r
+// Copyright (c) 2009, Radegast Development Team\r
+// All rights reserved.\r
+// \r
+// Redistribution and use in source and binary forms, with or without\r
+// modification, are permitted provided that the following conditions are met:\r
+// \r
+//     * Redistributions of source code must retain the above copyright notice,\r
+//       this list of conditions and the following disclaimer.\r
+//     * Redistributions in binary form must reproduce the above copyright\r
+//       notice, this list of conditions and the following disclaimer in the\r
+//       documentation and/or other materials provided with the distribution.\r
+//     * Neither the name of the application "Radegast", nor the names of its\r
+//       contributors may be used to endorse or promote products derived from\r
+//       this software without specific prior written permission.\r
+// \r
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"\r
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\r
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\r
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\r
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\r
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\r
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// $Id$\r
+//\r
+namespace Radegast\r
+{\r
+    partial class ScriptEditor\r
+    {\r
+        /// <summary> \r
+        /// Required designer variable.\r
+        /// </summary>\r
+        private System.ComponentModel.IContainer components = null;\r
+\r
+        /// <summary> \r
+        /// Clean up any resources being used.\r
+        /// </summary>\r
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>\r
+        protected override void Dispose(bool disposing)\r
+        {\r
+            if (disposing && (components != null))\r
+            {\r
+                components.Dispose();\r
+            }\r
+            base.Dispose(disposing);\r
+        }\r
+\r
+        #region Component Designer generated code\r
+\r
+        /// <summary> \r
+        /// Required method for Designer support - do not modify \r
+        /// the contents of this method with the code editor.\r
+        /// </summary>\r
+        private void InitializeComponent()\r
+        {\r
+            this.pnlControls = new System.Windows.Forms.Panel();\r
+            this.btnSave = new System.Windows.Forms.Button();\r
+            this.rtbCode = new System.Windows.Forms.RichTextBox();\r
+            this.pnlControls.SuspendLayout();\r
+            this.SuspendLayout();\r
+            // \r
+            // pnlControls\r
+            // \r
+            this.pnlControls.Controls.Add(this.btnSave);\r
+            this.pnlControls.Dock = System.Windows.Forms.DockStyle.Bottom;\r
+            this.pnlControls.Location = new System.Drawing.Point(0, 383);\r
+            this.pnlControls.Name = "pnlControls";\r
+            this.pnlControls.Size = new System.Drawing.Size(408, 31);\r
+            this.pnlControls.TabIndex = 0;\r
+            // \r
+            // btnSave\r
+            // \r
+            this.btnSave.Enabled = false;\r
+            this.btnSave.Location = new System.Drawing.Point(3, 5);\r
+            this.btnSave.Name = "btnSave";\r
+            this.btnSave.Size = new System.Drawing.Size(75, 23);\r
+            this.btnSave.TabIndex = 0;\r
+            this.btnSave.Text = "Save";\r
+            this.btnSave.UseVisualStyleBackColor = true;\r
+            // \r
+            // rtbCode\r
+            // \r
+            this.rtbCode.Dock = System.Windows.Forms.DockStyle.Fill;\r
+            this.rtbCode.Font = new System.Drawing.Font("Courier New", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\r
+            this.rtbCode.Location = new System.Drawing.Point(0, 0);\r
+            this.rtbCode.Name = "rtbCode";\r
+            this.rtbCode.Size = new System.Drawing.Size(408, 383);\r
+            this.rtbCode.TabIndex = 1;\r
+            this.rtbCode.Text = "";\r
+            this.rtbCode.WordWrap = false;\r
+            // \r
+            // ScriptEditor\r
+            // \r
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\r
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r
+            this.Controls.Add(this.rtbCode);\r
+            this.Controls.Add(this.pnlControls);\r
+            this.Name = "ScriptEditor";\r
+            this.Size = new System.Drawing.Size(408, 414);\r
+            this.pnlControls.ResumeLayout(false);\r
+            this.ResumeLayout(false);\r
+\r
+        }\r
+\r
+        #endregion\r
+\r
+        private System.Windows.Forms.Panel pnlControls;\r
+        private System.Windows.Forms.Button btnSave;\r
+        private System.Windows.Forms.RichTextBox rtbCode;\r
+    }\r
+}\r
diff --git a/Radegast/GUI/Consoles/Assets/ScriptEditor.cs b/Radegast/GUI/Consoles/Assets/ScriptEditor.cs
new file mode 100644 (file)
index 0000000..1d1bc28
--- /dev/null
@@ -0,0 +1,93 @@
+// \r
+// Radegast Metaverse Client\r
+// Copyright (c) 2009, Radegast Development Team\r
+// All rights reserved.\r
+// \r
+// Redistribution and use in source and binary forms, with or without\r
+// modification, are permitted provided that the following conditions are met:\r
+// \r
+//     * Redistributions of source code must retain the above copyright notice,\r
+//       this list of conditions and the following disclaimer.\r
+//     * Redistributions in binary form must reproduce the above copyright\r
+//       notice, this list of conditions and the following disclaimer in the\r
+//       documentation and/or other materials provided with the distribution.\r
+//     * Neither the name of the application "Radegast", nor the names of its\r
+//       contributors may be used to endorse or promote products derived from\r
+//       this software without specific prior written permission.\r
+// \r
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"\r
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\r
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\r
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\r
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\r
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\r
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// $Id$\r
+//\r
+using System;\r
+using System.Collections.Generic;\r
+using System.ComponentModel;\r
+using System.Drawing;\r
+using System.Data;\r
+using System.Linq;\r
+using System.Text;\r
+using System.Windows.Forms;\r
+using OpenMetaverse;\r
+using OpenMetaverse.Assets;\r
+\r
+namespace Radegast\r
+{\r
+\r
+    public partial class ScriptEditor : UserControl\r
+    {\r
+        private RadegastInstance instance;\r
+        private GridClient client { get { return instance.Client; } }\r
+        private InventoryLSL script;\r
+        private UUID requestID;\r
+\r
+        public ScriptEditor(RadegastInstance instance, InventoryLSL script)\r
+        {\r
+            InitializeComponent();\r
+            Disposed += new EventHandler(SscriptEditor_Disposed);\r
+\r
+            this.instance = instance;\r
+            this.script = script;\r
+\r
+            // Callbacks\r
+            client.Assets.OnAssetReceived += new AssetManager.AssetReceivedCallback(Assets_OnAssetReceived);\r
+\r
+            // Download script\r
+            requestID = client.Assets.RequestInventoryAsset(script, true);\r
+            rtbCode.Text = "Loading...";\r
+        }\r
+\r
+        void SscriptEditor_Disposed(object sender, EventArgs e)\r
+        {\r
+            client.Assets.OnAssetReceived -= new AssetManager.AssetReceivedCallback(Assets_OnAssetReceived);\r
+        }\r
+\r
+        void Assets_OnAssetReceived(AssetDownload transfer, Asset asset)\r
+        {\r
+            if (transfer.ID != requestID) return;\r
+\r
+            if (InvokeRequired)\r
+            {\r
+                BeginInvoke(new MethodInvoker(delegate() { Assets_OnAssetReceived(transfer, asset); }));\r
+                return;\r
+            }\r
+\r
+            if (!transfer.Success || asset.AssetType != AssetType.LSLText)\r
+            {\r
+                rtbCode.Text = "Failed to download.";\r
+                return;\r
+            }\r
+\r
+            asset.Decode();\r
+            rtbCode.Text = ((AssetScriptText)asset).Source;\r
+        }\r
+    }\r
+}\r
diff --git a/Radegast/GUI/Consoles/Assets/ScriptEditor.resx b/Radegast/GUI/Consoles/Assets/ScriptEditor.resx
new file mode 100644 (file)
index 0000000..ff31a6d
--- /dev/null
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<root>\r
+  <!-- \r
+    Microsoft ResX Schema \r
+    \r
+    Version 2.0\r
+    \r
+    The primary goals of this format is to allow a simple XML format \r
+    that is mostly human readable. The generation and parsing of the \r
+    various data types are done through the TypeConverter classes \r
+    associated with the data types.\r
+    \r
+    Example:\r
+    \r
+    ... ado.net/XML headers & schema ...\r
+    <resheader name="resmimetype">text/microsoft-resx</resheader>\r
+    <resheader name="version">2.0</resheader>\r
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>\r
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>\r
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">\r
+        <value>[base64 mime encoded serialized .NET Framework object]</value>\r
+    </data>\r
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">\r
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r
+        <comment>This is a comment</comment>\r
+    </data>\r
+                \r
+    There are any number of "resheader" rows that contain simple \r
+    name/value pairs.\r
+    \r
+    Each data row contains a name, and value. The row also contains a \r
+    type or mimetype. Type corresponds to a .NET class that support \r
+    text/value conversion through the TypeConverter architecture. \r
+    Classes that don't support this are serialized and stored with the \r
+    mimetype set.\r
+    \r
+    The mimetype is used for serialized objects, and tells the \r
+    ResXResourceReader how to depersist the object. This is currently not \r
+    extensible. For a given mimetype the value must be set accordingly:\r
+    \r
+    Note - application/x-microsoft.net.object.binary.base64 is the format \r
+    that the ResXResourceWriter will generate, however the reader can \r
+    read any of the formats listed below.\r
+    \r
+    mimetype: application/x-microsoft.net.object.binary.base64\r
+    value   : The object must be serialized with \r
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r
+            : and then encoded with base64 encoding.\r
+    \r
+    mimetype: application/x-microsoft.net.object.soap.base64\r
+    value   : The object must be serialized with \r
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r
+            : and then encoded with base64 encoding.\r
+\r
+    mimetype: application/x-microsoft.net.object.bytearray.base64\r
+    value   : The object must be serialized into a byte array \r
+            : using a System.ComponentModel.TypeConverter\r
+            : and then encoded with base64 encoding.\r
+    -->\r
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">\r
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />\r
+    <xsd:element name="root" msdata:IsDataSet="true">\r
+      <xsd:complexType>\r
+        <xsd:choice maxOccurs="unbounded">\r
+          <xsd:element name="metadata">\r
+            <xsd:complexType>\r
+              <xsd:sequence>\r
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />\r
+              </xsd:sequence>\r
+              <xsd:attribute name="name" use="required" type="xsd:string" />\r
+              <xsd:attribute name="type" type="xsd:string" />\r
+              <xsd:attribute name="mimetype" type="xsd:string" />\r
+              <xsd:attribute ref="xml:space" />\r
+            </xsd:complexType>\r
+          </xsd:element>\r
+          <xsd:element name="assembly">\r
+            <xsd:complexType>\r
+              <xsd:attribute name="alias" type="xsd:string" />\r
+              <xsd:attribute name="name" type="xsd:string" />\r
+            </xsd:complexType>\r
+          </xsd:element>\r
+          <xsd:element name="data">\r
+            <xsd:complexType>\r
+              <xsd:sequence>\r
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />\r
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />\r
+              </xsd:sequence>\r
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />\r
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />\r
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />\r
+              <xsd:attribute ref="xml:space" />\r
+            </xsd:complexType>\r
+          </xsd:element>\r
+          <xsd:element name="resheader">\r
+            <xsd:complexType>\r
+              <xsd:sequence>\r
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />\r
+              </xsd:sequence>\r
+              <xsd:attribute name="name" type="xsd:string" use="required" />\r
+            </xsd:complexType>\r
+          </xsd:element>\r
+        </xsd:choice>\r
+      </xsd:complexType>\r
+    </xsd:element>\r
+  </xsd:schema>\r
+  <resheader name="resmimetype">\r
+    <value>text/microsoft-resx</value>\r
+  </resheader>\r
+  <resheader name="version">\r
+    <value>2.0</value>\r
+  </resheader>\r
+  <resheader name="reader">\r
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+  </resheader>\r
+  <resheader name="writer">\r
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+  </resheader>\r
+</root>
\ No newline at end of file
index 505e1d8..3f050a0 100644 (file)
         private void InitializeComponent()\r
         {\r
             this.components = new System.ComponentModel.Container();\r
+            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(InventoryConsole));\r
             this.invTree = new System.Windows.Forms.TreeView();\r
             this.splitContainer1 = new System.Windows.Forms.SplitContainer();\r
+            this.tstripInventory = new System.Windows.Forms.ToolStrip();\r
+            this.tlabelStatus = new System.Windows.Forms.ToolStripLabel();\r
             this.pnlDetail = new System.Windows.Forms.Panel();\r
             this.panel1 = new System.Windows.Forms.Panel();\r
             this.btnProfile = new System.Windows.Forms.Button();\r
             this.lblCreator = new System.Windows.Forms.Label();\r
             this.lblItemName = new System.Windows.Forms.Label();\r
             this.ctxInv = new System.Windows.Forms.ContextMenuStrip(this.components);\r
+            this.tbtnFile = new System.Windows.Forms.ToolStripDropDownButton();\r
+            this.saveAllTToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\r
+            this.tbtbSort = new System.Windows.Forms.ToolStripDropDownButton();\r
+            this.tbtbSortByName = new System.Windows.Forms.ToolStripMenuItem();\r
+            this.tbtnSortByDate = new System.Windows.Forms.ToolStripMenuItem();\r
+            this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripSeparator();\r
+            this.tbtbFoldersByName = new System.Windows.Forms.ToolStripMenuItem();\r
+            this.tbtnSystemFoldersFirst = new System.Windows.Forms.ToolStripMenuItem();\r
             this.splitContainer1.Panel1.SuspendLayout();\r
             this.splitContainer1.Panel2.SuspendLayout();\r
             this.splitContainer1.SuspendLayout();\r
+            this.tstripInventory.SuspendLayout();\r
             this.panel1.SuspendLayout();\r
             this.SuspendLayout();\r
             // \r
             this.invTree.ForeColor = System.Drawing.Color.White;\r
             this.invTree.LabelEdit = true;\r
             this.invTree.LineColor = System.Drawing.Color.White;\r
-            this.invTree.Location = new System.Drawing.Point(0, 0);\r
+            this.invTree.Location = new System.Drawing.Point(0, 25);\r
             this.invTree.Name = "invTree";\r
             this.invTree.ShowRootLines = false;\r
-            this.invTree.Size = new System.Drawing.Size(331, 483);\r
+            this.invTree.Size = new System.Drawing.Size(331, 458);\r
             this.invTree.TabIndex = 0;\r
             this.invTree.AfterLabelEdit += new System.Windows.Forms.NodeLabelEditEventHandler(this.invTree_AfterLabelEdit);\r
             this.invTree.DragDrop += new System.Windows.Forms.DragEventHandler(this.invTree_DragDrop);\r
             // splitContainer1.Panel1\r
             // \r
             this.splitContainer1.Panel1.Controls.Add(this.invTree);\r
+            this.splitContainer1.Panel1.Controls.Add(this.tstripInventory);\r
             // \r
             // splitContainer1.Panel2\r
             // \r
             this.splitContainer1.SplitterDistance = 331;\r
             this.splitContainer1.TabIndex = 1;\r
             // \r
+            // tstripInventory\r
+            // \r
+            this.tstripInventory.GripMargin = new System.Windows.Forms.Padding(0);\r
+            this.tstripInventory.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden;\r
+            this.tstripInventory.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\r
+            this.tlabelStatus,\r
+            this.tbtnFile,\r
+            this.tbtbSort});\r
+            this.tstripInventory.Location = new System.Drawing.Point(0, 0);\r
+            this.tstripInventory.Name = "tstripInventory";\r
+            this.tstripInventory.Size = new System.Drawing.Size(331, 25);\r
+            this.tstripInventory.TabIndex = 1;\r
+            this.tstripInventory.Text = "toolStrip1";\r
+            // \r
+            // tlabelStatus\r
+            // \r
+            this.tlabelStatus.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;\r
+            this.tlabelStatus.Name = "tlabelStatus";\r
+            this.tlabelStatus.Size = new System.Drawing.Size(87, 22);\r
+            this.tlabelStatus.Text = "Downloading...";\r
+            this.tlabelStatus.TextAlign = System.Drawing.ContentAlignment.MiddleRight;\r
+            // \r
             // pnlDetail\r
             // \r
             this.pnlDetail.Dock = System.Windows.Forms.DockStyle.Fill;\r
             this.ctxInv.Size = new System.Drawing.Size(36, 4);\r
             this.ctxInv.Text = "Inventory Folder";\r
             // \r
+            // tbtnFile\r
+            // \r
+            this.tbtnFile.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;\r
+            this.tbtnFile.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {\r
+            this.saveAllTToolStripMenuItem});\r
+            this.tbtnFile.Image = ((System.Drawing.Image)(resources.GetObject("tbtnFile.Image")));\r
+            this.tbtnFile.ImageTransparentColor = System.Drawing.Color.Magenta;\r
+            this.tbtnFile.Name = "tbtnFile";\r
+            this.tbtnFile.Size = new System.Drawing.Size(38, 22);\r
+            this.tbtnFile.Text = "File";\r
+            // \r
+            // saveAllTToolStripMenuItem\r
+            // \r
+            this.saveAllTToolStripMenuItem.Name = "saveAllTToolStripMenuItem";\r
+            this.saveAllTToolStripMenuItem.Size = new System.Drawing.Size(152, 22);\r
+            this.saveAllTToolStripMenuItem.Text = "Save all text";\r
+            this.saveAllTToolStripMenuItem.ToolTipText = "Saves all notecards and scripts to folder on local disk";\r
+            // \r
+            // tbtbSort\r
+            // \r
+            this.tbtbSort.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;\r
+            this.tbtbSort.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {\r
+            this.tbtbSortByName,\r
+            this.tbtnSortByDate,\r
+            this.toolStripMenuItem1,\r
+            this.tbtbFoldersByName,\r
+            this.tbtnSystemFoldersFirst});\r
+            this.tbtbSort.Image = ((System.Drawing.Image)(resources.GetObject("tbtbSort.Image")));\r
+            this.tbtbSort.ImageTransparentColor = System.Drawing.Color.Magenta;\r
+            this.tbtbSort.Name = "tbtbSort";\r
+            this.tbtbSort.Size = new System.Drawing.Size(41, 22);\r
+            this.tbtbSort.Text = "Sort";\r
+            // \r
+            // tbtbSortByName\r
+            // \r
+            this.tbtbSortByName.Name = "tbtbSortByName";\r
+            this.tbtbSortByName.Size = new System.Drawing.Size(199, 22);\r
+            this.tbtbSortByName.Text = "By name";\r
+            // \r
+            // tbtnSortByDate\r
+            // \r
+            this.tbtnSortByDate.Name = "tbtnSortByDate";\r
+            this.tbtnSortByDate.Size = new System.Drawing.Size(199, 22);\r
+            this.tbtnSortByDate.Text = "By date";\r
+            // \r
+            // toolStripMenuItem1\r
+            // \r
+            this.toolStripMenuItem1.Name = "toolStripMenuItem1";\r
+            this.toolStripMenuItem1.Size = new System.Drawing.Size(196, 6);\r
+            // \r
+            // tbtbFoldersByName\r
+            // \r
+            this.tbtbFoldersByName.Name = "tbtbFoldersByName";\r
+            this.tbtbFoldersByName.Size = new System.Drawing.Size(199, 22);\r
+            this.tbtbFoldersByName.Text = "Folders always by name";\r
+            // \r
+            // tbtnSystemFoldersFirst\r
+            // \r
+            this.tbtnSystemFoldersFirst.Name = "tbtnSystemFoldersFirst";\r
+            this.tbtnSystemFoldersFirst.Size = new System.Drawing.Size(199, 22);\r
+            this.tbtnSystemFoldersFirst.Text = "System folders on top";\r
+            // \r
             // InventoryConsole\r
             // \r
             this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\r
             this.Name = "InventoryConsole";\r
             this.Size = new System.Drawing.Size(756, 483);\r
             this.splitContainer1.Panel1.ResumeLayout(false);\r
+            this.splitContainer1.Panel1.PerformLayout();\r
             this.splitContainer1.Panel2.ResumeLayout(false);\r
             this.splitContainer1.ResumeLayout(false);\r
+            this.tstripInventory.ResumeLayout(false);\r
+            this.tstripInventory.PerformLayout();\r
             this.panel1.ResumeLayout(false);\r
             this.panel1.PerformLayout();\r
             this.ResumeLayout(false);\r
         private System.Windows.Forms.Button btnProfile;\r
         private System.Windows.Forms.TextBox txtCreated;\r
         private System.Windows.Forms.Label lblCreated;\r
+        private System.Windows.Forms.ToolStrip tstripInventory;\r
+        private System.Windows.Forms.ToolStripLabel tlabelStatus;\r
+        private System.Windows.Forms.ToolStripDropDownButton tbtnFile;\r
+        private System.Windows.Forms.ToolStripMenuItem saveAllTToolStripMenuItem;\r
+        private System.Windows.Forms.ToolStripDropDownButton tbtbSort;\r
+        private System.Windows.Forms.ToolStripMenuItem tbtbSortByName;\r
+        private System.Windows.Forms.ToolStripMenuItem tbtnSortByDate;\r
+        private System.Windows.Forms.ToolStripSeparator toolStripMenuItem1;\r
+        private System.Windows.Forms.ToolStripMenuItem tbtbFoldersByName;\r
+        private System.Windows.Forms.ToolStripMenuItem tbtnSystemFoldersFirst;\r
     }\r
 }\r
index f510d9a..bffed46 100644 (file)
@@ -77,7 +77,8 @@ namespace Radegast
         private System.Threading.Timer TreeUpdateTimer;\r
         private Queue<InventoryBase> ItemsToAdd = new Queue<InventoryBase>();\r
         private bool TreeUpdateInProgress = false;\r
-\r
+        private Dictionary<UUID, TreeNode> UUID2NodeCache = new Dictionary<UUID, TreeNode>();\r
+        private int updateInterval = 2000;\r
 \r
         #region Construction and disposal\r
         public InventoryConsole(RadegastInstance instance)\r
@@ -92,11 +93,11 @@ namespace Radegast
             invTree.ImageList = frmMain.ResourceImages;\r
             invRootNode = AddDir(null, Inventory.RootFolder);\r
             Inventory.RestoreFromDisk(instance.InventoryCacheFileName);\r
+            AddFolderFromStore(invRootNode, Inventory.RootFolder);\r
             Thread InventoryUpdate = new Thread(new ThreadStart(StartTraverseNodes));\r
             InventoryUpdate.Name = "InventoryUpdate";\r
             InventoryUpdate.IsBackground = true;\r
             InventoryUpdate.Start();\r
-            AddFolderFromStore(invRootNode, Inventory.RootFolder);\r
             invRootNode.Expand();\r
 \r
             invTree.TreeViewNodeSorter = new InvNodeSorter();\r
@@ -221,8 +222,6 @@ namespace Radegast
                 return;\r
             }\r
 \r
-            Logger.DebugLog("Inv created:" + obj.Name + ": " + obj.UUID);\r
-\r
             lock (attachments)\r
             {\r
                 if (attachments.ContainsKey(obj.UUID))\r
@@ -231,7 +230,7 @@ namespace Radegast
                 }\r
             }\r
 \r
-            TreeNode parent = findNodeForItem(invRootNode, obj.ParentUUID);\r
+            TreeNode parent = findNodeForItem(obj.ParentUUID);\r
 \r
             if (parent != null)\r
             {\r
@@ -263,8 +262,6 @@ namespace Radegast
                 return;\r
             }\r
 \r
-            Logger.DebugLog("Inv removed:" + obj.Name);\r
-\r
             lock (attachments)\r
             {\r
                 if (attachments.ContainsKey(obj.UUID))\r
@@ -273,10 +270,10 @@ namespace Radegast
                 }\r
             }\r
 \r
-            TreeNode currentNode = findNodeForItem(invRootNode, obj.UUID);\r
+            TreeNode currentNode = findNodeForItem(obj.UUID);\r
             if (currentNode != null)\r
             {\r
-                currentNode.Remove();\r
+                removeNode(currentNode);\r
             }\r
         }\r
 \r
@@ -292,8 +289,6 @@ namespace Radegast
                 return;\r
             }\r
 \r
-            Logger.DebugLog("Inv updated:" + newObject.Name);\r
-\r
             lock (attachments)\r
             {\r
                 if (attachments.ContainsKey(newObject.UUID))\r
@@ -303,10 +298,10 @@ namespace Radegast
             }\r
 \r
             // Find our current node in the tree\r
-            TreeNode currentNode = findNodeForItem(invRootNode, newObject.UUID);\r
+            TreeNode currentNode = findNodeForItem(newObject.UUID);\r
 \r
             // Find which node should be our parrent\r
-            TreeNode parent = findNodeForItem(invRootNode, newObject.ParentUUID);\r
+            TreeNode parent = findNodeForItem(newObject.ParentUUID);\r
 \r
             if (parent == null) return;\r
 \r
@@ -315,7 +310,7 @@ namespace Radegast
                 // Did we move to a different folder\r
                 if (currentNode.Parent != parent)\r
                 {\r
-                    currentNode.Remove();\r
+                    removeNode(currentNode);\r
                     AddBase(parent, newObject);\r
                 }\r
                 else // Update\r
@@ -419,6 +414,10 @@ namespace Radegast
             {\r
                 parentNode.Nodes.Add(dirNode);\r
             }\r
+            lock (UUID2NodeCache)\r
+            {\r
+                UUID2NodeCache.Add(f.UUID, dirNode);\r
+            }\r
             return dirNode;\r
         }\r
 \r
@@ -442,45 +441,51 @@ namespace Radegast
             itemNode.ImageIndex = img;\r
             itemNode.SelectedImageIndex = img;\r
             parent.Nodes.Add(itemNode);\r
+            lock (UUID2NodeCache)\r
+            {\r
+                UUID2NodeCache.Add(item.UUID, itemNode);\r
+            }\r
             return itemNode;\r
         }\r
 \r
-        TreeNode findNodeForItem(TreeNode startNode, UUID itemID)\r
+        TreeNode findNodeForItem(UUID itemID)\r
         {\r
-            if (((InventoryBase)invRootNode.Tag).UUID == itemID)\r
+            lock (UUID2NodeCache)\r
             {\r
-                return invRootNode;\r
+                if (UUID2NodeCache.ContainsKey(itemID))\r
+                {\r
+                    return UUID2NodeCache[itemID];\r
+                }\r
             }\r
+            return null;\r
+        }\r
 \r
-            foreach (TreeNode node in startNode.Nodes)\r
+        void removeNode(TreeNode node)\r
+        {\r
+            InventoryBase item = (InventoryBase)node.Tag;\r
+            if (item != null)\r
             {\r
-                InventoryBase b = (InventoryBase)node.Tag;\r
-                if (b == null)\r
-                {\r
-                    continue;\r
-                }\r
-                if (b.UUID == itemID)\r
-                {\r
-                    return node;\r
-                }\r
-                else\r
+                lock (UUID2NodeCache)\r
                 {\r
-                    if (node.Nodes.Count > 0)\r
-                    {\r
-                        TreeNode subNode = findNodeForItem(node, itemID);\r
-                        if (subNode != null)\r
-                        {\r
-                            return subNode;\r
-                        }\r
-                    }\r
+                    UUID2NodeCache.Remove(item.UUID);\r
                 }\r
             }\r
-            return null;\r
+            node.Remove();\r
         }\r
 \r
         #endregion\r
 \r
         #region Private methods\r
+        private void UpdateStatus(string text)\r
+        {\r
+            if (InvokeRequired)\r
+            {\r
+                Invoke(new MethodInvoker(delegate() { UpdateStatus(text); }));\r
+                return;\r
+            }\r
+            tlabelStatus.Text = text;\r
+        }\r
+\r
         private void AddFolderFromStore(TreeNode parent, InventoryFolder f)\r
         {\r
             List<InventoryBase> contents = Inventory.GetContents(f);\r
@@ -527,7 +532,6 @@ namespace Radegast
                 };\r
 \r
                 client.Inventory.OnFolderUpdated += callback;\r
-                Logger.Log("Updating folder: " + f.Name, Helpers.LogLevel.Debug, client);\r
                 fetchFolder(f.UUID, f.OwnerID, true);\r
                 gotFolderEvent.WaitOne(30 * 1000, false);\r
                 client.Inventory.OnFolderUpdated -= callback;\r
@@ -542,7 +546,7 @@ namespace Radegast
         private void StartTraverseNodes()\r
         {\r
             TreeUpdateInProgress = true;\r
-            TreeUpdateTimer = new System.Threading.Timer(TreeUpdateTimerTick, null, 10000, System.Threading.Timeout.Infinite);\r
+            TreeUpdateTimer = new System.Threading.Timer(TreeUpdateTimerTick, null, updateInterval, System.Threading.Timeout.Infinite);\r
             TraverseNodes(Inventory.RootNode);\r
             TreeUpdateTimer.Dispose();\r
             TreeUpdateTimer = null;\r
@@ -568,6 +572,7 @@ namespace Radegast
             }\r
             Logger.Log("Finished updating invenory folders, saving cache...", Helpers.LogLevel.Debug, client);\r
             Inventory.SaveToDisk(instance.InventoryCacheFileName);\r
+            UpdateStatus(string.Empty);\r
         }\r
 \r
         private void TreeUpdateTimerTick(Object sender)\r
@@ -587,12 +592,18 @@ namespace Radegast
                 invTree.BeginUpdate();\r
                 while (ItemsToAdd.Count > 0)\r
                 {\r
-                    Exec_OnInventoryObjectAdded(ItemsToAdd.Dequeue());\r
+                    InventoryBase item = ItemsToAdd.Dequeue();\r
+                    TreeNode node = findNodeForItem(item.ParentUUID);\r
+                    if (node != null)\r
+                    {\r
+                        AddBase(node, item);\r
+                    }\r
                 }\r
                 invTree.EndUpdate();\r
+                UpdateStatus(UUID2NodeCache.Count.ToString() + " items");\r
                 if (TreeUpdateTimer != null)\r
                 {\r
-                    TreeUpdateTimer.Change(10000, System.Threading.Timeout.Infinite);\r
+                    TreeUpdateTimer.Change(updateInterval, System.Threading.Timeout.Infinite);\r
                 }\r
             }\r
         }\r
@@ -643,6 +654,12 @@ namespace Radegast
                     pnlDetail.Controls.Add(landmark);\r
                     break;\r
 \r
+                case AssetType.LSLText:\r
+                    ScriptEditor script = new ScriptEditor(instance, (InventoryLSL)item);\r
+                    script.Dock = DockStyle.Fill;\r
+                    pnlDetail.Controls.Add(script);\r
+                    break;\r
+\r
             }\r
         }\r
 \r
@@ -777,7 +794,6 @@ namespace Radegast
                 if (node.Tag is InventoryFolder)\r
                 {\r
                     InventoryFolder folder = (InventoryFolder)node.Tag;\r
-                    fetchFolder(folder.UUID, folder.OwnerID, false);\r
                     ctxInv.Items.Clear();\r
 \r
                     ToolStripMenuItem ctxItem;\r
@@ -960,7 +976,6 @@ namespace Radegast
 \r
                     case "delete_folder":\r
                         client.Inventory.MoveFolder(f.UUID, client.Inventory.FindFolderForType(AssetType.TrashFolder), f.Name);\r
-                        // invTree.SelectedNode.Remove();\r
                         break;\r
 \r
                     case "empty_trash":\r
@@ -998,7 +1013,6 @@ namespace Radegast
                 {\r
                     case "delete_item":\r
                         client.Inventory.MoveItem(item.UUID, client.Inventory.FindFolderForType(AssetType.TrashFolder), item.Name);\r
-                        // invTree.SelectedNode.Remove();\r
                         break;\r
 \r
                     case "rename_item":\r
@@ -1060,7 +1074,6 @@ namespace Radegast
                 return;\r
             }\r
 \r
-            Logger.DebugLog("In OnLabelEditTimer()");\r
             _EditingNode = true;\r
             _EditNode.Text = ItemLabel((InventoryBase)_EditNode.Tag, true);\r
             _EditNode.BeginEdit();\r
@@ -1091,8 +1104,6 @@ namespace Radegast
 \r
         private void invTree_AfterLabelEdit(object sender, NodeLabelEditEventArgs e)\r
         {\r
-            Logger.DebugLog("In invTree_AfterLabelEdit()");\r
-\r
             if (string.IsNullOrEmpty(e.Label))\r
             {\r
                 if (e.Node.Tag is InventoryBase)\r
@@ -1191,13 +1202,11 @@ namespace Radegast
             {\r
                 InventoryItem item = (InventoryItem)sourceNode.Tag;\r
                 client.Inventory.MoveItem(item.UUID, dest.UUID, item.Name);\r
-                // sourceNode.Remove();\r
             }\r
             else if (sourceNode.Tag is InventoryFolder)\r
             {\r
                 InventoryFolder f = (InventoryFolder)sourceNode.Tag;\r
                 client.Inventory.MoveFolder(f.UUID, dest.UUID, f.Name);\r
-                // sourceNode.Remove();\r
             }\r
         }\r
 \r
index c3a9a05..d8d2ad8 100644 (file)
   <resheader name="writer">\r
     <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
   </resheader>\r
+  <metadata name="tstripInventory.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">\r
+    <value>100, 17</value>\r
+  </metadata>\r
+  <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />\r
+  <data name="tbtnFile.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">\r
+    <value>\r
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\r
+        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAgxJREFUOE+lkvtL\r
+        U2EYx+0PEbtpFwnBKPGKiJImGP0gYhIYs1E5GF5gIxkpA00JRSmMEF0ohMh+GaRWYlqabMVcNdS2QpaI\r
+        VqiDIYhk397vA6fXhCjyhYdzeM/5fp7vczkAdeL2cwho7v/wWzT1zcN+Pwhr51uY2/y41PQaF+wzKKiZ\r
+        QvaN58g0jyLd5KEUcQbg+84P/Cm2tncQjW3j68YWIqubCC3FcOJc478BAuGoZM6zvoRnakXEruEIjhc4\r
+        /g5gZop9c+voGAyLbQIfeBZxLL9BA1jzXvuGbWamuKh+GmmVbswE19A59FEBbmoAG7YbsLtm2mZmiml9\r
+        cvabNDwpz6YB7LYBoMXCumkJr7LOmnnHzBQ/9X2Bo2cOibm1GsBREbAQiYmw/8lnuCeWkVzcgnZlnw1j\r
+        3HV/wuNXK6i/9x5Hc6wawDlTXHbLJ+LZUBQPRyKwdQdxutwl1h+NLXHh5Ht1ewBHsiwawCW57HyDAfWR\r
+        dvl0uhZQ1eqX8aVc7EKLqrum651ATLf9OJx5XQM4KmY0xPzZ0hFAiQJnXB0WwME0E3IsL5B17ZlADqWb\r
+        NYDrOepdlcysmTWWOrxqbceRWtaLk0VO1XW72D5Vckd2gMBfq8zdpmUG62NJvKM4+XyziDk24xmfWoGE\r
+        s1c0gHPmbrPTpHNJKOCo2G1mZs20zcwUJ5yp1AB5+8/zEwgF5GMVDxh4AAAAAElFTkSuQmCC\r
+</value>\r
+  </data>\r
+  <data name="tbtbSort.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">\r
+    <value>\r
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\r
+        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAgxJREFUOE+lkvtL\r
+        U2EYx+0PEbtpFwnBKPGKiJImGP0gYhIYs1E5GF5gIxkpA00JRSmMEF0ohMh+GaRWYlqabMVcNdS2QpaI\r
+        VqiDIYhk397vA6fXhCjyhYdzeM/5fp7vczkAdeL2cwho7v/wWzT1zcN+Pwhr51uY2/y41PQaF+wzKKiZ\r
+        QvaN58g0jyLd5KEUcQbg+84P/Cm2tncQjW3j68YWIqubCC3FcOJc478BAuGoZM6zvoRnakXEruEIjhc4\r
+        /g5gZop9c+voGAyLbQIfeBZxLL9BA1jzXvuGbWamuKh+GmmVbswE19A59FEBbmoAG7YbsLtm2mZmiml9\r
+        cvabNDwpz6YB7LYBoMXCumkJr7LOmnnHzBQ/9X2Bo2cOibm1GsBREbAQiYmw/8lnuCeWkVzcgnZlnw1j\r
+        3HV/wuNXK6i/9x5Hc6wawDlTXHbLJ+LZUBQPRyKwdQdxutwl1h+NLXHh5Ht1ewBHsiwawCW57HyDAfWR\r
+        dvl0uhZQ1eqX8aVc7EKLqrum651ATLf9OJx5XQM4KmY0xPzZ0hFAiQJnXB0WwME0E3IsL5B17ZlADqWb\r
+        NYDrOepdlcysmTWWOrxqbceRWtaLk0VO1XW72D5Vckd2gMBfq8zdpmUG62NJvKM4+XyziDk24xmfWoGE\r
+        s1c0gHPmbrPTpHNJKOCo2G1mZs20zcwUJ5yp1AB5+8/zEwgF5GMVDxh4AAAAAElFTkSuQmCC\r
+</value>\r
+  </data>\r
   <metadata name="ctxInv.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">\r
     <value>17, 17</value>\r
   </metadata>\r
index 88ac970..12f9232 100644 (file)
     <Compile Include="GUI\Consoles\Assets\Landmark.Designer.cs">\r
       <DependentUpon>Landmark.cs</DependentUpon>\r
     </Compile>\r
+    <Compile Include="GUI\Consoles\Assets\ScriptEditor.cs">\r
+      <SubType>UserControl</SubType>\r
+    </Compile>\r
+    <Compile Include="GUI\Consoles\Assets\ScriptEditor.Designer.cs">\r
+      <DependentUpon>ScriptEditor.cs</DependentUpon>\r
+    </Compile>\r
     <Compile Include="GUI\Consoles\AttachmentDetail.cs">\r
       <SubType>UserControl</SubType>\r
     </Compile>\r
       <DependentUpon>Landmark.cs</DependentUpon>\r
       <SubType>Designer</SubType>\r
     </EmbeddedResource>\r
+    <EmbeddedResource Include="GUI\Consoles\Assets\ScriptEditor.resx">\r
+      <DependentUpon>ScriptEditor.cs</DependentUpon>\r
+      <SubType>Designer</SubType>\r
+    </EmbeddedResource>\r
     <EmbeddedResource Include="GUI\Consoles\AttachmentDetail.resx">\r
       <SubType>Designer</SubType>\r
       <DependentUpon>AttachmentDetail.cs</DependentUpon>\r