/// <summary> /// Expand /// </summary> public void Expand() { // The item wasn't expanded -> raise an event if (Visible && !_isexpanded && ListView != null) { TreeListViewCancelEventArgs e = new TreeListViewCancelEventArgs( this, TreeListViewAction.Expand); ListView.RaiseBeforeExpand(e); if (e.Cancel) { return; } } if (this.Visible) { Items.ReadWriteLock.AcquireReaderLock(-1); for (int i = Items.Count - 1; i >= 0; i--) { TreeListViewItem item = this.Items[i]; if (!item.Visible) { ListView LView = this.ListView; LView.Items.Insert( this.Index + 1, item); item.SetIndentation(); } if (item.IsExpanded) { item.Expand(); } } Items.ReadWriteLock.ReleaseReaderLock(); } // The item wasn't expanded -> raise an event if (Visible && !_isexpanded && ListView != null) { this._isexpanded = true; TreeListViewEventArgs e = new TreeListViewEventArgs( this, TreeListViewAction.Expand); ListView.RaiseAfterExpand(e); if (AfterExpand != null) { AfterExpand(this); } } this._isexpanded = true; }
/// <summary> /// Adds an item in the collection and in the TreeListView /// </summary> /// <param name="item"></param> /// <returns>Index of the item in the collection</returns> public virtual int Add(TreeListViewItem item) { int index = GetInsertCollectionIndex(item); if (index == -1) { return(-1); } if (Parent != null) { item.SetParent(Parent); } item.Items.Comparer = this.Comparer; ReadWriteLock.AcquireWriterLock(-1); int treelistviewindex = GetInsertTreeListViewIndex(item); // Insert in the ListView if (treelistviewindex > -1) { ListView listview = (ListView)TreeListView; InsertListViewItem insert = new InsertListViewItem(listview.Items.Insert); if (listview.InvokeRequired) { listview.Invoke(insert, new object[] { treelistviewindex, (ListViewItem)item }); } else { listview.Items.Insert(treelistviewindex, (ListViewItem)item); } if (item.IsExpanded) { item.Expand(); } item.SetIndentation(); } // Insert in this collection if (index > -1) { List.Insert(index, item); } ReadWriteLock.ReleaseWriterLock(); return(index); }
/// <summary> /// WndProc /// </summary> /// <param name="m"></param> protected override void WndProc(ref System.Windows.Forms.Message m) { TreeListViewItem item = null; switch ((WM_MESSAGE)m.Msg) { // Disable this notification to remove the auto-check when // the user double-click on an item case WM_MESSAGE.WM_LBUTTONDBLCLK: if (this.SelectedIndices.Count > 0) { item = this.SelectedItems[0]; bool doExpColl = false; Rectangle rec; switch (ExpandMethod) { case TreeListViewExpandMethod.IconDbleClick: rec = item.GetBounds(ItemBoundsPortion.Icon); if (rec.Contains(PointToClient(MousePosition))) { doExpColl = true; } break; case TreeListViewExpandMethod.ItemOnlyDbleClick: rec = item.GetBounds(ItemBoundsPortion.ItemOnly); if (rec.Contains(PointToClient(MousePosition))) { doExpColl = true; } break; case TreeListViewExpandMethod.EntireItemDbleClick: rec = item.GetBounds(ItemBoundsPortion.Entire); if (rec.Contains(PointToClient(MousePosition))) { doExpColl = true; } break; default: break; } if (doExpColl) { FindForm().Cursor = Cursors.WaitCursor; BeginUpdate(); if (item.IsExpanded) { item.Collapse(); } else { item.Expand(); } EndUpdate(); FindForm().Cursor = Cursors.Default; } } return; case WM_MESSAGE.WM_KEYDOWN: if (this.SelectedIndices.Count == 0) { break; } item = this.SelectedItems[0]; if (item == null) { break; } switch ((Keys)(int)m.WParam) { case Keys.Enter: break; case Keys.Left: this.BeginUpdate(); if (item.IsExpanded) { item.Collapse(); } else if (item.Parent != null) { item.Parent.Selected = true; item.Parent.Focused = true; } this.EndUpdate(); break; case Keys.Right: if (item.Items.Count == 0) { break; } this.BeginUpdate(); if (!item.IsExpanded) { item.Expand(); } else { item.Items[item.Items.Count - 1].Selected = true; item.Items[item.Items.Count - 1].Focused = true; } this.EndUpdate(); break; } return; } base.WndProc(ref m); }