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
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
\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
\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
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
--- /dev/null
+// \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
--- /dev/null
+// \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
--- /dev/null
+<?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
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
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
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
return;\r
}\r
\r
- Logger.DebugLog("Inv created:" + obj.Name + ": " + obj.UUID);\r
-\r
lock (attachments)\r
{\r
if (attachments.ContainsKey(obj.UUID))\r
}\r
}\r
\r
- TreeNode parent = findNodeForItem(invRootNode, obj.ParentUUID);\r
+ TreeNode parent = findNodeForItem(obj.ParentUUID);\r
\r
if (parent != null)\r
{\r
return;\r
}\r
\r
- Logger.DebugLog("Inv removed:" + obj.Name);\r
-\r
lock (attachments)\r
{\r
if (attachments.ContainsKey(obj.UUID))\r
}\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
return;\r
}\r
\r
- Logger.DebugLog("Inv updated:" + newObject.Name);\r
-\r
lock (attachments)\r
{\r
if (attachments.ContainsKey(newObject.UUID))\r
}\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
// 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
{\r
parentNode.Nodes.Add(dirNode);\r
}\r
+ lock (UUID2NodeCache)\r
+ {\r
+ UUID2NodeCache.Add(f.UUID, dirNode);\r
+ }\r
return dirNode;\r
}\r
\r
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
};\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
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
}\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
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
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
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
\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
{\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
return;\r
}\r
\r
- Logger.DebugLog("In OnLabelEditTimer()");\r
_EditingNode = true;\r
_EditNode.Text = ItemLabel((InventoryBase)_EditNode.Tag, true);\r
_EditNode.BeginEdit();\r
\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
{\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
<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
<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