/// <summary> /// Adds an item in the collection and in the TreeListView /// </summary> /// <param name="value"></param> /// <returns></returns> public virtual TreeListViewItem Add(string value) { TreeListViewItem item = new TreeListViewItem(value); Add(item); return(item); }
internal void RemoveAtInternal(int index) { if (TreeListView != null) { if (TreeListView.InvokeRequired) { throw(new Exception("Invoke required")); } } TreeListViewItem item = this[index]; if (this[index].Visible && this.TreeListView != null) { item.Hide(); } List.RemoveAt(index); item.SetParent(null); // Redraw parent if no more children if (Count == 0 && TreeListView != null && Parent != null) { Parent.Redraw(); } // Redraw new last item if (Count > 0 && TreeListView != null && index == Count) { this[index - 1].Redraw(); } OnItemRemoved(new TreeListViewEventArgs(item, TreeListViewAction.Unknown)); }
/// <summary> /// Adds an item in the collection and in the TreeListView /// </summary> /// <param name="value"></param> /// <param name="imageindex"></param> /// <returns></returns> public virtual TreeListViewItem Add(string value, int imageindex) { TreeListViewItem item = new TreeListViewItem(value, imageindex); Add(item); return(item); }
private bool ListViewContains(TreeListViewItem item) { if (TreeListView == null) { return(false); } if (TreeListView.InvokeRequired) { throw(new Exception("Invoke required")); } ListView listview = (ListView)TreeListView; ListViewItem listviewitem = (ListViewItem)item; try{ foreach (ListViewItem temp in listview.Items) { if (temp == listviewitem) { return(true); } } } catch {} return(false); }
/// <summary> /// 改变行背景色 /// </summary> /// <param name="item"></param> /// <param name="c"></param> private void changeColor(TreeListViewItem item, Color c) { for (int j = 0; j < item.SubItems.Count; j++) { item.SubItems[j].BackColor = c; } }
/// <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) { if (TreeListView != null) { if (TreeListView.InvokeRequired) { throw(new Exception("Invoke required")); } } // Do not add the item if the collection owns a TreeListView recursively // and the item already owns a TreeListView if (TreeListView != null && item.ListView != null) { throw(new Exception("The Item is already in a TreeListView")); } int index = GetInsertCollectionIndex(item); if (index == -1) { return(-1); } if (Parent != null) { item.SetParent(Parent); } item.Items.Comparer = this.Comparer; int treelistviewindex = GetInsertTreeListViewIndex(item, index); // Insert in the ListView if (treelistviewindex > -1) { ListView listview = (ListView)TreeListView; listview.Items.Insert(treelistviewindex, (ListViewItem)item); if (item.IsExpanded) { item.Expand(); } item.SetIndentation(); } // Insert in this collection if (index > -1) { List.Insert(index, item); } if (index > -1) { OnItemAdded(new TreeListViewEventArgs(item, TreeListViewAction.Unknown)); } if (Count == 1 && TreeListView != null && Parent != null) { if (Parent.Visible) { Parent.Redraw(); } } return(index); }
/// <summary> /// Compare two TreeListViewItems /// </summary> /// <param name="x"></param> /// <param name="y"></param> /// <returns></returns> public int Compare(object x, object y) { if (!(x is TreeListViewItem)) { return(0); } if (!(y is TreeListViewItem)) { return(0); } TreeListViewItem lvi1 = (TreeListViewItem)x; string str1 = lvi1.SubItems[Column].Text; TreeListViewItem lvi2 = (TreeListViewItem)y; string str2 = lvi2.SubItems[Column].Text; /*if (SortOrder == SortOrder.Ascending) * { * if (lvi1.isfolder && lvi2.isfolder == false) * return -1; * else if (lvi1.isfolder==false && lvi1.isfolder) * return 1; * } * else if (SortOrder == SortOrder.Descending) * { * if (lvi1.isfolder && lvi2.isfolder == false) * return 1; * else if (lvi1.isfolder == false && lvi1.isfolder) * return -1; * } */ if (Regex.IsMatch(str1, "^[0-9]+.*[KMGTP]B$") && Regex.IsMatch(str2, "^[0-9]+.*[KMGTP]B$")) { if (SortOrder == SortOrder.Ascending) { return(lvi1.nodeSize.kb.CompareTo(lvi2.nodeSize.kb)); } else { return(lvi2.nodeSize.kb.CompareTo(lvi1.nodeSize.kb)); } } else { if (SortOrder == SortOrder.Ascending) { return(String.Compare(str1, str2)); } else { return(String.Compare(str2, str1)); } } }
private void buttonRemove_Click(object sender, System.EventArgs e) { if (treeView1.SelectedNode == null) { return; } TreeListViewItem item = (TreeListViewItem)treeView1.SelectedNode.Tag; item.Remove(); treeView1.SelectedNode.Remove(); }
/// <summary> /// Check if this node is one of the parents of an item (recursively) /// </summary> /// <param name="item"></param> /// <returns></returns> public bool IsAParentOf(TreeListViewItem item) { TreeListViewItem[] parents = item.ParentsInHierarch; foreach (TreeListViewItem parent in parents) { if (parent == this) { return(true); } } return(false); }
/// <summary> /// 查找指定主键值的节点(假定主键为第一个隐藏列) /// </summary> public System.Windows.Forms.TreeListViewItem FindNodeByKey(string ID) { foreach (System.Windows.Forms.TreeListViewItem root in TreeListView.Items) { System.Windows.Forms.TreeListViewItem n = FindNodeByKey(root, ID); if (n != null) { return(n); } } return(null); }
private void AddChildren(TreeNode node) { TreeListViewItem tlvitem = (TreeListViewItem)node.Tag; foreach (TreeListViewItem item in tlvitem.Items) { TreeNode child = new TreeNode(item.Text); child.Tag = item; node.Nodes.Add(child); AddChildren(child); child.Expand(); } }
private int GetInsertTreeListViewIndex(TreeListViewItem item, int collectionindex) { if (TreeListView == null) { return(-1); } if (TreeListView.InvokeRequired) { throw(new Exception("Invoke required")); } if (Owner != null) { int a = 0; a++; } int index = -1; // First level item (no parent) if (Owner != null && collectionindex != -1) { if (collectionindex == 0) { index = 0; } else { index = this[collectionindex - 1].LastChildIndexInListView + 1; } } else if (Parent != null && collectionindex != -1) { if (!Parent.Visible || !Parent.IsExpanded) { index = -1; } else { if (collectionindex == 0) { index = Parent.Index + 1; } else { index = Parent.Items[collectionindex - 1].LastChildIndexInListView + 1; } } } return(index); }
public static void camelcase(Form1.IncrementStatusDel incrementStatus, ref TreeListView change, TreeListViewItem fromthis) { for (int a = 0; a < fromthis.Items.Count; a++) { String s = StringExtras.ToCamelCase(fromthis.Items[a].Text, true, null); TreeListViewItem TLVI = getItemByName(change, fromthis.Items[a].fullPath); if (TLVI != null) TLVI.Text = s; fromthis.Items[a].Text = s; incrementStatus(); camelcase(incrementStatus, ref change, fromthis.Items[a]); } }
/// <summary> /// Remove an item from the collection and the TreeListView /// </summary> /// <param name="item"></param> public virtual void Remove(TreeListViewItem item) { TreeListView treelistview = this.TreeListView; if (treelistview != null) { treelistview.BeginUpdate(); } RemoveInternal(item); if (treelistview != null) { treelistview.EndUpdate(); } }
/// <summary> /// [递归]按树向上搜索第一个具有“下一个兄弟结点”的父级结点 /// </summary> private TreeListViewItem getParentHasNextSibling() { TreeListViewItem node = null; if (Parent != null) { node = Parent.NextSibling; if (node != null) { return(Parent); } return(Parent.getParentHasNextSibling()); } return(null); }
/// <summary> /// 从指定节点及其下级中查找指定主键值的节点(假定主键为第一个隐藏列) /// </summary> public System.Windows.Forms.TreeListViewItem FindNodeByKey(System.Windows.Forms.TreeListViewItem node, string ID) { if (node.SubItems[node.ListView.Columns.Count].Text == ID) { return(node); } foreach (System.Windows.Forms.TreeListViewItem tln in node.Items) { System.Windows.Forms.TreeListViewItem n = FindNodeByKey(tln, ID); if (n != null) { return(n); } } return(null); }
/// <summary> /// 绑定指定行的子级 /// </summary> public void BindChildren(System.Windows.Forms.TreeListViewItem node, DataRow dr) { DataTable dt = dr.Table; string strParentSqlValue = Apq.Data.SqlClient.Common.ConvertToSqlON(dr[Key]); DataRow[] drs = dt.Select(Parent + " = " + strParentSqlValue); if (!Apq.Convert.LikeDBNull(drs) && drs.Length > 0) { foreach (DataRow drChild in drs) { System.Windows.Forms.TreeListViewItem n = new System.Windows.Forms.TreeListViewItem(); node.Items.Add(n); BindRow(n, drChild); BindChildren(n, drChild); } } }
/// <summary> /// 绑定数据表 /// </summary> public void BindDataTable(DataTable dt) { TreeListView.Items.Clear(); // 记录下需要添加的列 List <string> hCols = GetHiddenColumns(dt); List <DataRow> Roots = Apq.Data.DataTable.GetRootRows(dt, Key, Parent); foreach (DataRow dr in Roots) { System.Windows.Forms.TreeListViewItem node = new System.Windows.Forms.TreeListViewItem(); TreeListView.Items.Add(node); BindRow(node, dr); BindChildren(node, dr); } }
public static void BaseCopy(TreeListViewItem from, ref TreeListViewItem to) { to = (TreeListViewItem)from.Clone(); to.fullPath = from.fullPath; to.Name = from.fullPath; to.nodeSize = from.nodeSize; to.isfolder = from.isfolder; to.rating = from.rating; while (to.SubItems.Count < 4) { to.SubItems.Add(""); } to.SubItems[1].Text = to.nodeSize.getSizeString(); to.SubItems[2].Text = to.fullPath; if (to.rating > -1) to.SubItems[3].Text = to.rating.ToString(); }
internal void RemoveInternal(TreeListViewItem item) { if (TreeListView != null) { if (TreeListView.InvokeRequired) { throw(new Exception("Invoke required")); } } int index = GetIndexOf(item); if (index == -1) { return; } RemoveAtInternal(index); }
/// <summary> /// Transforms the collection to an array /// </summary> public TreeListViewItem[] ToArray() { if (TreeListView != null) { if (TreeListView.InvokeRequired) { throw(new Exception("Invoke required")); } } int size = this.Count; TreeListViewItem[] eltsArray = new TreeListViewItem[size]; for (int i = 0; i < size; i++) { eltsArray[i] = this[i]; } return(eltsArray); }
private int GetInsertCollectionIndex(TreeListViewItem item) { if (TreeListView != null) { if (TreeListView.InvokeRequired) { throw(new Exception("Invoke required")); } } int index = -1; if (!_sortable) { index = Count; } else if (!Contains(item) && !ListViewContains(item)) { switch (SortOrder) { // No sortorder -> at the end of the collection case System.Windows.Forms.SortOrder.None: index = this.Count; break; default: for (int i = 0; i < this.Count; i++) { // Change the index for the compare if the order is descending int indexcompare = i; int comp = Comparer.Compare(item, this[indexcompare]); if (comp <= 0) { index = indexcompare; break; } } index = index == -1 ? this.Count : index; break; } } return(index); }
public static void AddNode(TreeListViewItem TLVI, ref TreeListView sendto) { var parenttree = new List<TreeListViewItem>(); TreeListViewItem curr = TLVI; while (curr != null) { parenttree.Add(curr); curr = curr.Parent; } //initial folder TreeListViewItem pop = parenttree[parenttree.Count - 1]; TreeListViewItem createin = treelistviewfuncs.getItemByText(sendto, pop.Text); if (createin == null) { var create = new TreeListViewItem(); treelistviewfuncs.BaseCopy(pop, ref create); sendto.Items.Add(create); createin = treelistviewfuncs.getItemByText(sendto, pop.Text); } parenttree.RemoveAt(parenttree.Count - 1); while (parenttree.Count > 0) { pop = parenttree[parenttree.Count - 1]; TreeListViewItem pop2 = treelistviewfuncs.getItemByText(createin, pop.Text); if (pop2 == null) { var create = new TreeListViewItem(); treelistviewfuncs.BaseCopy(pop, ref create); createin.Items.Add(create); createin = treelistviewfuncs.getItemByText(createin, pop.Text); } else createin = pop2; parenttree.RemoveAt(parenttree.Count - 1); } }
/// <summary> /// Gets the index of an item in the collection /// </summary> /// <param name="item"></param> /// <returns></returns> public int GetIndexOf(TreeListViewItem item) { if (TreeListView != null) { if (TreeListView.InvokeRequired) { throw(new Exception("Invoke required")); } } int index = -1; for (int i = 0; i < this.Count; i++) { if (this[i] == item) { index = i; break; } } return(index); }
/// <summary> /// 绑定指定行到指定节点 /// </summary> public void BindRow(System.Windows.Forms.TreeListViewItem node, DataRow dr) { DataTableMapping dtm = GetTableMapping(dr.Table); for (int i = 0; i < TreeListView.Columns.Count; i++) { string nodeHeaderName = TreeListView.Columns[i].Text; int cmIndex = dtm.ColumnMappings.IndexOf(nodeHeaderName); if (cmIndex > -1) { DataColumnMapping dcm = dtm.ColumnMappings[cmIndex]; string dsColumnName = dcm.DataSetColumn; if (dr.Table.Columns.Contains(dsColumnName)) { string str = Apq.Convert.ChangeType <string>(dr[dsColumnName], string.Empty); if (i == 0) { node.Text = str; } else { node.SubItems.Add(str); } } else { if (i > 0) { node.SubItems.Add(string.Empty); } } } } // 添加隐藏数据 foreach (string ColName in _HiddenColNames) { string str = Apq.Convert.ChangeType <string>(dr[ColName], string.Empty); node.SubItems.Add(str); } }
/// <summary> /// Returns true if this collection contains an item /// </summary> /// <param name="item"></param> /// <returns></returns> public virtual bool Contains(TreeListViewItem item) { if (TreeListView != null) { if (TreeListView.InvokeRequired) { throw(new Exception("Invoke required")); } } bool res = false; foreach (TreeListViewItem elt in this) { if (item == elt) { res = true; break; } } return(res); }
/// <summary> /// Compare two TreeListViewItems /// </summary> /// <param name="x"></param> /// <param name="y"></param> /// <returns></returns> public int Compare(object x, object y) { TreeListViewItem a = (TreeListViewItem)x; TreeListViewItem b = (TreeListViewItem)y; int res = 1; if (Column < a.SubItems.Count && Column < b.SubItems.Count) { res = string.CompareOrdinal(a.SubItems[Column].Text.ToUpper(), b.SubItems[Column].Text.ToUpper()); } switch (SortOrder) { case SortOrder.Ascending: return(res); case SortOrder.Descending: return(-res); default: return(1); } }
/// <summary> /// Remove an item from the collection and the TreeListView /// </summary> /// <param name="item"></param> public virtual void Remove(TreeListViewItem item) { TreeListView treelistview = this.TreeListView; if(treelistview != null) treelistview.BeginUpdate(); RemoveInternal(item); if(treelistview != null) treelistview.EndUpdate(); }
/// <summary> /// Returns true if the specified item is in the collection /// </summary> /// <param name="item"></param> /// <returns></returns> public bool Contains(TreeListViewItem item) { return(base.Contains((ListViewItem) item)); }
/// <summary> /// Creates a new instance of TreeListViewLabelEditEventArgs /// </summary> /// <param name="item"></param> /// <param name="column"></param> /// <param name="label"></param> public TreeListViewLabelEditEventArgs(TreeListViewItem item, int column, string label) : base() { _item = item; _colindex = column; _label = label; }
/// <summary> /// Create a new instance of TreeListViewCancelEvent arguments /// </summary> /// <param name="item"></param> /// <param name="action"></param> public TreeListViewCancelEventArgs(TreeListViewItem item, TreeListViewAction action) : base(item, action) { }
/// <summary> /// Create a collection within a TreeListViewItem /// </summary> /// <param name="parent"></param> public TreeListViewItemCollection(TreeListViewItem parent) { _parent = parent; }
private int GetInsertCollectionIndex(TreeListViewItem item) { if(TreeListView != null) if(TreeListView.InvokeRequired) throw(new Exception("Invoke required")); int index = -1; if(!_sortable) index = Count; else if(!Contains(item) && !ListViewContains(item)) { switch(SortOrder) { // No sortorder -> at the end of the collection case System.Windows.Forms.SortOrder.None: index = this.Count; break; default: for(int i = 0 ; i < this.Count ; i++) { // Change the index for the compare if the order is descending int indexcompare = i; int comp = Comparer.Compare(item, this[indexcompare]); if(comp <= 0) { index = indexcompare; break; } } index = index == -1 ? this.Count : index; break; } } return(index); }
/// <summary> /// expand all nodes from this item to the top /// </summary> /// <param name="TLVI"></param> public void Expand(TreeListViewItem TLVI) { BeginUpdate(); SelectedItems.Clear(); TLVI.Selected = true; while (TLVI != null) { TreeListViewCancelEventArgs e = new TreeListViewCancelEventArgs( TLVI, TreeListViewAction.Expand); RaiseBeforeExpand(e); TLVI = TLVI.Parent; } EndUpdate(); }
private int GetInsertTreeListViewIndex(TreeListViewItem item, int collectionindex) { if(TreeListView == null) return(-1); if(TreeListView.InvokeRequired) throw(new Exception("Invoke required")); if(Owner != null) { int a = 0; a++; } int index = -1; // First level item (no parent) if(Owner != null && collectionindex != -1) { if(collectionindex == 0) index = 0; else index = this[collectionindex - 1].LastChildIndexInListView + 1; } else if(Parent != null && collectionindex != -1) { if(!Parent.Visible || !Parent.IsExpanded) index = -1; else { if(collectionindex == 0) index = Parent.Index + 1; else index = Parent.Items[collectionindex - 1].LastChildIndexInListView + 1; } } return(index); }
internal void SetParent(TreeListViewItem parent) { _parent = parent; }
/// <summary> /// Returns true if the specified item is in the collection /// </summary> /// <param name="item"></param> /// <returns></returns> public bool Contains(TreeListViewItem item) { return(base.Contains((ListViewItem)item)); }
/// <summary> /// Index of an item /// </summary> /// <param name="item"></param> /// <returns></returns> public int IndexOf(TreeListViewItem item) { return(base.IndexOf((ListViewItem)item)); }
//from file to tree public static void DeserializeTreeListView(Form1.IncrementStatusDel incrementStatus, TreeListView TreeListView, string fileName) { XmlTextReader reader = null; try { // disabling re-drawing of TreeListView till all nodes are added TreeListView.BeginUpdate(); reader = new XmlTextReader(fileName); TreeListViewItem parentNode = null; while (reader.Read()) { if (reader.NodeType == XmlNodeType.Element) { if (reader.Name == XmlNodeTag) { TreeListViewItem newNode = new TreeListViewItem(); bool isEmptyElement = reader.IsEmptyElement; // loading node attributes int attributeCount = reader.AttributeCount; if (attributeCount > 0) { for (int i = 0; i < attributeCount; i++) { reader.MoveToAttribute(i); SetAttributeValue(newNode, reader.Name, reader.Value); } } newNode.SubItems.Add(newNode.nodeSize.getSizeString()); newNode.SubItems.Add(newNode.fullPath); newNode.Name = newNode.fullPath; incrementStatus(true); // add new node to Parent Node or TreeListView if (parentNode != null) parentNode.Items.Add(newNode); else TreeListView.Items.Add(newNode); // making current node 'ParentNode' if its not empty if (!isEmptyElement) { parentNode = newNode; } } } // moving up to in TreeListView if end tag is encountered else if (reader.NodeType == XmlNodeType.EndElement) { if (reader.Name == XmlNodeTag) { parentNode = parentNode.Parent; } } } } finally { // enabling redrawing of TreeListView after all nodes are added TreeListView.EndUpdate(); reader.Close(); } }
private static void SetAttributeValue(TreeListViewItem node, string propertyName, string value) { if (propertyName == XmlNodeFullPath) { node.fullPath = value; } else if (propertyName == XmlNodeSizeAtt) { node.nodeSize.kb = long.Parse(value); } else if (propertyName == XmlNodeIsFolderAtt) { node.isfolder = bool.Parse(value); } else if (propertyName == XmlNodeRelativePath) { node.Text = value; } else if (propertyName == XmlNodeRating) { node.rating = int.Parse(value); } }
/// <summary> /// Transforms the collection to an array /// </summary> public TreeListViewItem[] ToArray() { if(TreeListView != null) if(TreeListView.InvokeRequired) throw(new Exception("Invoke required")); int size = this.Count; TreeListViewItem[] eltsArray = new TreeListViewItem[size]; for(int i = 0 ; i < size ; i++) eltsArray[i] = this[i]; return(eltsArray); }
internal void RemoveInternal(TreeListViewItem item) { if(TreeListView != null) if(TreeListView.InvokeRequired) throw(new Exception("Invoke required")); int index = GetIndexOf(item); if(index == -1) return; RemoveAtInternal(index); }
/// <summary> /// WndProc /// </summary> /// <param name="m"></param> protected override void WndProc(ref System.Windows.Forms.Message m) { #region View messages if(false) { string val; val = Enum.GetName(typeof(APIsEnums.ListViewMessages), (APIsEnums.ListViewMessages) m.Msg); if(val != "" && val != null) Debug.WriteLine(val); else { val = Enum.GetName(typeof(APIsEnums.WindowMessages), (APIsEnums.WindowMessages) m.Msg); if(val != "" && val != null) Debug.WriteLine(val); } if(val != "" && val != null) Debug.WriteLine(m.Msg.ToString()); if(val == "LBUTTONDOWN") { int a= 0; a++; } } #endregion TreeListViewItem item = null; Rectangle rec; switch((APIsEnums.WindowMessages) m.Msg) { #region NOTIFY case APIsEnums.WindowMessages.NOTIFY: case (APIsEnums.WindowMessages) APIsEnums.ReflectedMessages.NOTIFY: APIsStructs.NMHDR nmhdr = (APIsStructs.NMHDR) m.GetLParam(typeof(APIsStructs.NMHDR)); APIsStructs.NMHEADER nmheader =(APIsStructs.NMHEADER) m.GetLParam(typeof(APIsStructs.NMHEADER)); switch((APIsEnums.ListViewNotifications) nmhdr.code) { #region APIsEnums.ListViewNotifications.MARQUEEBEGIN case APIsEnums.ListViewNotifications.MARQUEEBEGIN: if((MouseButtons & MouseButtons.Left) != MouseButtons.Left) m.Result = (IntPtr)1; else _hasMarquee = true; break; #endregion #region APIsEnums.ListViewNotifications.ITEMCHANGING case APIsEnums.ListViewNotifications.ITEMCHANGING: APIsStructs.NMLISTVIEW nmlistview = (APIsStructs.NMLISTVIEW) m.GetLParam(typeof(APIsStructs.NMLISTVIEW)); if(nmlistview.iItem < 0) break; if((item = GetTreeListViewItemFromIndex(nmlistview.iItem)) == null) break; bool cancel = false; if(nmlistview.Select) { if(_selectionMark == null) _selectionMark = item; else if(!_selectionMark.Visible) _selectionMark = item; if(HasMarquee) item.Focused = true; } else if(nmlistview.UnSelect && HasMarquee) { if(item.NextVisibleItem != null) if(item.NextVisibleItem.Selected) item.NextVisibleItem.Focused = true; if(item.PrevVisibleItem != null) if(item.PrevVisibleItem.Selected) item.PrevVisibleItem.Focused = true; } #region Select after dbl click // Disable the selection after a double click (normaly, if the control scrolls after // a collapse, the new item under the cursor is automatically selected...) if(_dblclicktime.AddMilliseconds(500).CompareTo(DateTime.Now) > 0 && (nmlistview.Select || nmlistview.Focus) && FocusedItem != item) cancel = true; #endregion #region Wrong Level Select if(((APIsEnums.ListViewItemStates)nmlistview.uNewState & APIsEnums.ListViewItemStates.SELECTED) == APIsEnums.ListViewItemStates.SELECTED && MultiSelect) if(SelectedIndices.Count > 0) if(GetTreeListViewItemFromIndex(nmlistview.iItem).Parent != SelectedItems[0].Parent) cancel = true; #endregion #region Check during selection // Disable check boxes check when : // - the Marquee selection tool is being used // - the Ctrl or Shift keys are down bool state = (nmlistview.uChanged & (uint)APIsEnums.ListViewItemFlags.STATE) == (uint)APIsEnums.ListViewItemFlags.STATE; bool ctrlKeyDown = (ModifierKeys & Keys.Control) == Keys.Control; bool shiftKeyDown = (ModifierKeys & Keys.Shift) == Keys.Shift; if((nmlistview.Check || nmlistview.UnCheck) && (HasMarquee || ctrlKeyDown || shiftKeyDown)) { // MessageBox.Show(this, // "uChanged = " + nmlistview->uChanged.ToString() + "\n\n" + // "uOld = " + nmlistview->uOldState.ToString() + "\n" + // "uNew = " + nmlistview->uChanged.ToString() + "\n\n" + // "OldCheck : " + (oldCheck ? "true" : "false") + "\n" + // "NewCheck : " + (newCheck ? "true" : "false")); cancel = true; } #endregion if(cancel) { m.Result = (IntPtr)1; return; } break; #endregion #region APIsEnums.ListViewNotifications.BEGINLABELEDIT case APIsEnums.ListViewNotifications.BEGINLABELEDIT: // Cancel label edit if the message is sent just after a double click if(_lastdoubleclick.AddMilliseconds(450) > DateTime.Now) { Message canceledit = Message.Create(Handle, (int) APIsEnums.ListViewMessages.CANCELEDITLABEL, IntPtr.Zero, IntPtr.Zero); WndProc(ref canceledit); m.Result = (IntPtr) 1; return; } item = _lastitemclicked.Item; item.EnsureVisible(); // Add subitems if needed while(item.SubItems.Count-1 < _lastitemclicked.ColumnIndex) item.SubItems.Add(""); TreeListViewBeforeLabelEditEventArgs beforeed = new TreeListViewBeforeLabelEditEventArgs( FocusedItem, _lastitemclicked.ColumnIndex, item.SubItems[_lastitemclicked.ColumnIndex].Text); OnBeforeLabelEdit(beforeed); if(beforeed.Cancel) { Message canceledit = Message.Create(Handle, (int) APIsEnums.ListViewMessages.CANCELEDITLABEL, IntPtr.Zero, IntPtr.Zero); WndProc(ref canceledit); m.Result = (IntPtr) 1; return; } _inedit = true; // Get edit handle Message mess = Message.Create(Handle, (int)APIsEnums.ListViewMessages.GETEDITCONTROL, IntPtr.Zero, IntPtr.Zero); WndProc(ref mess); IntPtr edithandle = mess.Result; _customedit = new CustomEdit(edithandle, this, beforeed.Editor); _editeditem = new EditItemInformations( FocusedItem, beforeed.ColumnIndex, FocusedItem.SubItems[beforeed.ColumnIndex].Text); m.Result = IntPtr.Zero; return; #endregion #region APIsEnums.ListViewNotifications.ENDLABELEDIT case APIsEnums.ListViewNotifications.ENDLABELEDIT: if(_customedit != null) _customedit.HideEditControl(); _customedit = null; _inedit = false; _editeditem = new EditItemInformations(); m.Result = IntPtr.Zero; return; #endregion #region CUSTOMDRAW case (APIsEnums.ListViewNotifications) APIsEnums.NotificationMessages.CUSTOMDRAW: base.WndProc(ref m); CustomDraw(ref m); return; #endregion #region BEGINSCROLL case APIsEnums.ListViewNotifications.BEGINSCROLL: _updating = true; break; #endregion #region ENDSCROLL case APIsEnums.ListViewNotifications.ENDSCROLL: _updating = false; // Disable display bug with vertical lines (slow...) // if(ShowPlusMinus) // { // DrawPlusMinusItemsLines(); // DrawPlusMinusItems(); // } break; #endregion #region APIsEnums.HeaderControlNotifications.BEGINDRAG case (APIsEnums.ListViewNotifications) APIsEnums.HeaderControlNotifications.BEGINDRAG: nmheader =(APIsStructs.NMHEADER) m.GetLParam(typeof(APIsStructs.NMHEADER)); if(nmheader.iItem == 0) { m.Result = (IntPtr)1; return; } break; #endregion #region APIsEnums.HeaderControlNotifications.ENDDRAG case (APIsEnums.ListViewNotifications) APIsEnums.HeaderControlNotifications.ENDDRAG: nmheader =(APIsStructs.NMHEADER) m.GetLParam(typeof(APIsStructs.NMHEADER)); // Get mouse position in header coordinates IntPtr headerHandle = (IntPtr) APIsUser32.SendMessage(Handle, (int) APIsEnums.ListViewMessages.GETHEADER, IntPtr.Zero, IntPtr.Zero); APIsStructs.POINTAPI pointapi = new APIsStructs.POINTAPI(MousePosition); APIsUser32.ScreenToClient(headerHandle, ref pointapi); // HeaderItem Rect APIsStructs.RECT headerItemRect = new APIsStructs.RECT(); APIsUser32.SendMessage(headerHandle, (int)APIsEnums.HeaderControlMessages.GETITEMRECT, 0, ref headerItemRect); int headerItemWidth = headerItemRect.right - headerItemRect.left; // Cancel the drag operation if the first column is moved // or destination is the first column if(pointapi.x <= headerItemRect.left + headerItemWidth / 2 || nmheader.iItem == 0) { m.Result = (IntPtr)1; return; } break; #endregion #region APIsEnums.HeaderControlNotifications.TRACK / ENDTRACK // case (APIsEnums.ListViewNotifications)APIsEnums.HeaderControlNotifications.TRACK: case (APIsEnums.ListViewNotifications)APIsEnums.HeaderControlNotifications.ENDTRACK: Invalidate(); break; #endregion } break; #endregion #region LBUTTONDOWN // Cancel the click on checkboxes if the item is not "checkable" case APIsEnums.WindowMessages.LBUTTONDOWN: if(Columns.Count == 0) break; // Set the clickeditem and column int colclicked = GetColumnAt(MousePosition); if(colclicked == -1) colclicked = 0; item = GetItemAtFullRow(PointToClient(MousePosition)); _lastitemclicked = new EditItemInformations(item, colclicked, ""); if(_selectionMark == null || !_selectionMark.Visible) _selectionMark = item; if(((APIsEnums.KeyStatesMasks)(int)m.WParam & APIsEnums.KeyStatesMasks.SHIFT) != APIsEnums.KeyStatesMasks.SHIFT && !(((APIsEnums.KeyStatesMasks)(int)m.WParam & APIsEnums.KeyStatesMasks.CONTROL) == APIsEnums.KeyStatesMasks.CONTROL && item.Parent != _selectionMark.Parent)) _selectionMark = item; // Get where the mouse has clicked APIsStructs.LVHITTESTINFO lvhittest = new APIsStructs.LVHITTESTINFO(); lvhittest.pt = new APIsStructs.POINTAPI(PointToClient(MousePosition)); APIsUser32.SendMessage(Handle, (Int32) APIsEnums.ListViewMessages.HITTEST, 0, ref lvhittest); if(item == null) break; // Plus / Minus click if(item.GetBounds(TreeListViewItemBoundsPortion.PlusMinus).Contains(PointToClient(MousePosition)) && ShowPlusMinus && item.Items.Count > 0 && Columns[0].Width > (item.Level+1)*SystemInformation.SmallIconSize.Width) { Focus(); if(item.IsExpanded) item.Collapse(); else item.Expand(); OnMouseDown(new MouseEventArgs(MouseButtons.Left, 1, PointToClient(MousePosition).X, PointToClient(MousePosition).Y, 0)); return; } // Cancel mouse click if multiselection on a wrong item if(SelectedIndices.Count > 0 && (((APIsEnums.KeyStatesMasks)(int)m.WParam & APIsEnums.KeyStatesMasks.SHIFT) == APIsEnums.KeyStatesMasks.SHIFT || ((APIsEnums.KeyStatesMasks)(int)m.WParam & APIsEnums.KeyStatesMasks.CONTROL) == APIsEnums.KeyStatesMasks.CONTROL) && MultiSelect) { if(_selectionMark.Parent == item.Parent && ((APIsEnums.KeyStatesMasks)(int)m.WParam & APIsEnums.KeyStatesMasks.SHIFT) == APIsEnums.KeyStatesMasks.SHIFT) { _updating = true; SetSelectedItemsRange(item, _selectionMark); // Prevent all item at the wrong level of being selected m.WParam = (IntPtr) APIsEnums.KeyStatesMasks.CONTROL; base.WndProc(ref m); item.Selected = true; _updating = false; DrawSelectedItemsFocusCues(); return; } } break; #endregion #region LBUTTONDBLCLK // Disable this notification to remove the auto-check when // the user double-click on an item and append the expand / collapse function case APIsEnums.WindowMessages.LBUTTONDBLCLK: _lastdoubleclick = DateTime.Now; if(FocusedItem != null) { item = FocusedItem; bool doExpColl = false; 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) { _dblclicktime = DateTime.Now; Cursor = Cursors.WaitCursor; BeginUpdate(); if(item.IsExpanded) item.Collapse(); else item.Expand(); EndUpdate(); Cursor = Cursors.Default; } } OnDoubleClick(new EventArgs()); return; #endregion #region MOUSEMOVE case APIsEnums.WindowMessages.MOUSEMOVE: if((MouseButtons & MouseButtons.Left) != MouseButtons.Left && HasMarquee) _hasMarquee = false; break; #endregion #region UNICHAR, CHAR, KEYDOWN case APIsEnums.WindowMessages.UNICHAR: case APIsEnums.WindowMessages.CHAR: CharPressed((char) m.WParam); return; case APIsEnums.WindowMessages.KEYDOWN: OnKeyDown(new KeyEventArgs((Keys)(int) m.WParam)); return; #endregion #region PAINT case APIsEnums.WindowMessages.PAINT: if(InEdit && EditedItem.Item != null) { APIsStructs.RECT rect = new APIsStructs.RECT( EditedItem.Item.GetBounds(ItemBoundsPortion.Entire)); APIsUser32.ValidateRect(Handle, ref rect); } base.WndProc(ref m); DrawIntermediateStateItems(); DrawSelectedItemsFocusCues(); return; #endregion #region VSCROLL, HSCROLL, ENSUREVISIBLE case APIsEnums.WindowMessages.VSCROLL: case APIsEnums.WindowMessages.HSCROLL: case (APIsEnums.WindowMessages)APIsEnums.ListViewMessages.ENSUREVISIBLE: if(!Scrollable) { m.Result = (IntPtr)0; return; } break; #endregion } base.WndProc(ref m); }
/// <summary> /// Create a collection within a TreeListViewItem /// </summary> /// <param name="parent"></param> public TreeListViewItemCollection(TreeListViewItem parent) { _parent = parent; }
private void SetSelectedItemsRange(TreeListViewItem item1, TreeListViewItem item2) { if(InvokeRequired) throw(new Exception("Invoke required")); if(item1 == null || item2 == null) return; if(!item1.Visible || !item2.Visible) return; if(item1.Parent != item2.Parent) return; TreeListViewItemCollection items = item1.Container; int index1 = items.GetIndexOf(item1); int index2 = items.GetIndexOf(item2); ListViewItem[] selItems = new ListViewItem[base.SelectedItems.Count]; base.SelectedItems.CopyTo(selItems, 0); foreach(ListViewItem selItem in selItems) { int selItemIndex = items.GetIndexOf((TreeListViewItem)selItem); if(selItemIndex < Math.Min(index1, index2) || selItemIndex > Math.Max(index1, index2)) selItem.Selected = false; } for(int i = Math.Min(index1, index2); i <= Math.Max(index1, index2); i++) if(!items[i].Selected) items[i].Selected = true; }
private bool ListViewContains(TreeListViewItem item) { if(TreeListView == null) return(false); if(TreeListView.InvokeRequired) throw(new Exception("Invoke required")); ListView listview = (ListView) TreeListView; ListViewItem listviewitem = (ListViewItem) item; try{ foreach(ListViewItem temp in listview.Items) if(temp == listviewitem) return(true);} catch{} return(false); }
internal void ExpandInternal() { if (IsInATreeListView) { if (ListView.InvokeRequired) { throw(new Exception("Invoke Required")); } } TreeListViewItem selItem = null; if (TreeListView != null) { selItem = TreeListView.FocusedItem; } // Must set ListView.checkDirection to CheckDirection.None. // Forbid recursively checking. CheckDirection oldDirection = CheckDirection.All; if (ListView != null) { oldDirection = ListView._checkDirection; ListView._checkDirection = CheckDirection.None; } // 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 (Visible) { 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(); } } } // The item wasn't expanded -> raise an event if (Visible && !_isexpanded && IsInATreeListView) { this._isexpanded = true; TreeListViewEventArgs e = new TreeListViewEventArgs( this, TreeListViewAction.Expand); ListView.RaiseAfterExpand(e); if (AfterExpand != null) { AfterExpand(this); } } this._isexpanded = true; // Reset ListView.checkDirection if (IsInATreeListView) { ListView._checkDirection = oldDirection; } if (TreeListView != null && selItem != null) { if (selItem.Visible) { selItem.Focused = true; } } }
/// <summary> /// Raises the KeyDown event /// </summary> /// <param name="e"></param> protected override void OnKeyDown(KeyEventArgs e) { Keys key = e.KeyCode; if(FocusedItem == null) { if(base.Items.Count > 0 && (key == Keys.Down || key == Keys.Up || key == Keys.Left || key == Keys.Right)) { base.Items[0].Selected = true; base.Items[0].Focused = true; base.Items[0].EnsureVisible(); } base.OnKeyDown(e); return; } TreeListViewItem item = FocusedItem; switch(key) { case Keys.Down: if(item.NextVisibleItem != null) { TreeListViewItem nextitem = item.NextVisibleItem; if((Control.ModifierKeys & Keys.Shift) == Keys.Shift && MultiSelect) { if(item.Parent != nextitem.Parent && item.Selected) { while((nextitem = nextitem.NextVisibleItem) != null) if(nextitem.Parent == item.Parent) break; } if(nextitem != null) SetSelectedItemsRange(_selectionMark, nextitem); else nextitem = item.NextVisibleItem; } else if((Control.ModifierKeys & Keys.Control) != Keys.Control) { SetSelectedItemsRange(nextitem, nextitem); _selectionMark = nextitem; } nextitem.Focused = true; nextitem.EnsureVisible(); } break; case Keys.Up: if(item.PrevVisibleItem != null) { TreeListViewItem previtem = item.PrevVisibleItem; if((Control.ModifierKeys & Keys.Shift) == Keys.Shift && MultiSelect) { if(item.Parent != previtem.Parent && item.Selected) { while((previtem = previtem.PrevVisibleItem) != null) if(previtem.Parent == item.Parent) break; } if(previtem != null) SetSelectedItemsRange(_selectionMark, previtem); else previtem = item.PrevVisibleItem; } else if((Control.ModifierKeys & Keys.Control) != Keys.Control) { SetSelectedItemsRange(previtem, previtem); _selectionMark = previtem; } previtem.Focused = true; previtem.EnsureVisible(); } break; case Keys.Enter: base.SelectedItems.Clear(); if(item.IsExpanded) item.Collapse(); else item.Expand(); item.Selected = true; item.EnsureVisible(); break; case Keys.Left: if(item.IsExpanded) { base.SelectedItems.Clear(); item.Selected = true; item.Collapse(); item.EnsureVisible(); } else if(item.Parent != null) { base.SelectedItems.Clear(); item.Parent.Selected = true; item.Parent.Focused = true; item.Parent.EnsureVisible(); } break; case Keys.Right: if(item.Items.Count == 0) break; if(!item.IsExpanded) { base.SelectedItems.Clear(); item.Selected = true; item.Expand(); item.EnsureVisible(); } else { base.SelectedItems.Clear(); item.Items[item.Items.Count-1].Selected = true; item.Items[item.Items.Count-1].Focused = true; item.Items[item.Items.Count-1].EnsureVisible(); } break; case Keys.Space: if(base.CheckBoxes) item.Checked = !item.Checked; break; } base.OnKeyDown(e); }
internal void CollapseInternal() { if (IsInATreeListView) { if (ListView.InvokeRequired) { throw(new Exception("Invoke Required")); } } TreeListViewItem selItem = null; if (TreeListView != null) { selItem = TreeListView.FocusedItem; } // The item was expanded -> raise an event if (Visible && _isexpanded && ListView != null) { TreeListViewCancelEventArgs e = new TreeListViewCancelEventArgs( this, TreeListViewAction.Collapse); ListView.RaiseBeforeCollapse(e); if (e.Cancel) { return; } } // Collapse if (this.Visible) { foreach (TreeListViewItem item in Items) { item.Hide(); } } // The item was expanded -> raise an event if (Visible && _isexpanded && IsInATreeListView) { this._isexpanded = false; TreeListViewEventArgs e = new TreeListViewEventArgs( this, TreeListViewAction.Collapse); ListView.RaiseAfterCollapse(e); if (AfterCollapse != null) { AfterCollapse(this); } } this._isexpanded = false; if (IsInATreeListView && selItem != null) { if (selItem.Visible) { selItem.Focused = true; } else { ListView listview = (ListView)TreeListView; listview.SelectedItems.Clear(); TreeListViewItem[] items = selItem.ParentsInHierarch; for (int i = items.Length - 1; i >= 0; i--) { if (items[i].Visible) { items[i].Focused = true; break; } } } } }
/// <summary> /// Creates a new instance of EditItemInformations /// </summary> /// <param name="item"></param> /// <param name="column"></param> /// <param name="label"></param> public EditItemInformations(TreeListViewItem item, int column, string label) { _item = item; _colindex = column; _label = label; CreationTime = DateTime.Now; }
/// <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) { if(TreeListView != null) if(TreeListView.InvokeRequired) throw(new Exception("Invoke required")); // Do not add the item if the collection owns a TreeListView recursively // and the item already owns a TreeListView if(TreeListView != null && item.ListView != null) throw(new Exception("The Item is already in a TreeListView")); int index = GetInsertCollectionIndex(item); if(index == -1) return(-1); if(Parent != null) item.SetParent(Parent); item.Items.Comparer = this.Comparer; int treelistviewindex = GetInsertTreeListViewIndex(item, index); // Insert in the ListView if(treelistviewindex > -1) { ListView listview = (ListView) TreeListView; listview.Items.Insert(treelistviewindex, (ListViewItem) item); if(item.IsExpanded) item.Expand(); item.SetIndentation(); } // Insert in this collection if(index > -1) List.Insert(index, item); if(index > -1) OnItemAdded(new TreeListViewEventArgs(item, TreeListViewAction.Unknown)); if(Count == 1 && TreeListView != null && Parent != null) if(Parent.Visible) Parent.Redraw(); return(index); }
/// <summary> /// Creates a new instance of TreeListViewBeforeLabelEditEventArgs /// </summary> /// <param name="item"></param> /// <param name="column"></param> /// <param name="label"></param> public TreeListViewBeforeLabelEditEventArgs(TreeListViewItem item, int column, string label) : base(item, column, label) { }
/// <summary> /// Adds an item in the collection and in the TreeListView /// </summary> /// <param name="value"></param> /// <param name="imageindex"></param> /// <returns></returns> public virtual TreeListViewItem Add(string value, int imageindex) { TreeListViewItem item = new TreeListViewItem(value, imageindex); Add(item); return(item); }
/// <summary> /// Create a new instance of TreeListViewEvent arguments /// </summary> /// <param name="item"></param> /// <param name="action"></param> public TreeListViewEventArgs(TreeListViewItem item, TreeListViewAction action) { _item = item; _action = action; }
/// <summary> /// Adds an item in the collection and in the TreeListView /// </summary> /// <param name="value"></param> /// <returns></returns> public virtual TreeListViewItem Add(string value) { TreeListViewItem item = new TreeListViewItem(value); Add(item); return(item); }
/// <summary> /// Get SubItem rectangle /// </summary> /// <param name="item"></param> /// <param name="column"></param> /// <returns></returns> public Rectangle GetSubItemRect(TreeListViewItem item, int column) { ListViewItem lvitem = (ListViewItem) item; return GetSubItemRect(lvitem.Index, column); }
/// <summary> /// Returns true if this collection contains an item /// </summary> /// <param name="item"></param> /// <returns></returns> public virtual bool Contains(TreeListViewItem item) { if(TreeListView != null) if(TreeListView.InvokeRequired) throw(new Exception("Invoke required")); bool res = false; foreach(TreeListViewItem elt in this) if(item == elt) { res = true; break; } return(res); }
/// <summary> /// Index of an item /// </summary> /// <param name="item"></param> /// <returns></returns> public int IndexOf(TreeListViewItem item) { return(base.IndexOf((ListViewItem) item)); }
/// <summary> /// Gets the index of an item in the collection /// </summary> /// <param name="item"></param> /// <returns></returns> public int GetIndexOf(TreeListViewItem item) { if(TreeListView != null) if(TreeListView.InvokeRequired) throw(new Exception("Invoke required")); int index = -1; for(int i = 0 ; i < this.Count ; i++) if(this[i] == item) {index = i; break;} return(index); }