/* * Copyright (c) 2007-2008, openmetaverse.org * All rights reserved. * * - Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * - Neither the name of the openmetaverse.org nor the names * of its contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ using System.Collections.Generic; using System.Windows.Forms; namespace OpenMetaverse.GUI { /// /// TreeView control for browsing a client's inventory /// public class InventoryTree : TreeView { private GridClient _Client; /// /// Gets or sets the GridClient associated with this control /// public GridClient Client { get { return _Client; } set { if (value != null) InitializeClient(value); } } /// /// TreeView control for an unspecified client's inventory /// public InventoryTree() { this.BeforeExpand += new TreeViewCancelEventHandler(InventoryTree_BeforeExpand); } /// /// TreeView control for the specified client's inventory /// /// public InventoryTree(GridClient client) { InitializeClient(client); new InventoryTree(); } /// /// Thread-safe method for clearing the TreeView control /// public void ClearNodes() { if (this.InvokeRequired) this.BeginInvoke((MethodInvoker)delegate { ClearNodes(); }); else this.Nodes.Clear(); } /// /// Thread-safe method for collapsing a TreeNode in the control /// /// public void CollapseNode(TreeNode node) { if (this.InvokeRequired) this.BeginInvoke((MethodInvoker)delegate { CollapseNode(node); }); else if (!node.IsExpanded) node.Collapse(); } /// /// Thread-safe method for expanding a TreeNode in the control /// /// public void ExpandNode(TreeNode node) { if (this.InvokeRequired) this.BeginInvoke((MethodInvoker)delegate { ExpandNode(node); }); else if (!node.IsExpanded) node.Expand(); } /// /// Thread-safe method for updating the contents of the specified folder UUID /// /// public void UpdateFolder(UUID folderID) { if (this.InvokeRequired) this.BeginInvoke((MethodInvoker)delegate { UpdateFolder(folderID); }); else { TreeNode node = null; TreeNodeCollection children; if (folderID != Client.Inventory.Store.RootFolder.UUID) { TreeNode[] found = Nodes.Find(folderID.ToString(), true); if (found.Length > 0) { node = found[0]; children = node.Nodes; } else { Logger.Log("Received update for unknown TreeView node " + folderID, Helpers.LogLevel.Warning); return; } } else children = this.Nodes; children.Clear(); List contents = Client.Inventory.Store.GetContents(folderID); foreach (InventoryBase inv in contents) { string key = inv.UUID.ToString(); children.Add(key, inv.Name); children[key].Tag = inv; if (inv is InventoryFolder) children[key].Nodes.Add(null, "Loading..."); } if (node != null) ExpandNode(node); } } private void InitializeClient(GridClient client) { _Client = client; _Client.Inventory.OnFolderUpdated += new InventoryManager.FolderUpdatedCallback(Inventory_OnFolderUpdated); _Client.Network.OnLogin += new NetworkManager.LoginCallback(Network_OnLogin); } private void Inventory_OnFolderUpdated(UUID folderID) { UpdateFolder(folderID); } private void InventoryTree_BeforeExpand(object sender, TreeViewCancelEventArgs e) { UUID folderID; if (e.Node.Name != null && UUID.TryParse(e.Node.Name, out folderID)) _Client.Inventory.RequestFolderContents(folderID, _Client.Self.AgentID, true, true, InventorySortOrder.FoldersByName); } private void Network_OnLogin(LoginStatus login, string message) { if (login == LoginStatus.Success) Client.Inventory.RequestFolderContents(Client.Inventory.Store.RootFolder.UUID, Client.Self.AgentID, true, true, InventorySortOrder.FoldersByName); } } }