using System.Windows.Forms; using System.ComponentModel; using System.Collections; using Com.Piwigo.Uploader.DTO; namespace Com.Piwigo.Uploader { public partial class DataTreeView : TreeView { private object _DataSource; private CurrencyManager _CurrManager; [Category("Data")] [RefreshProperties(RefreshProperties.Repaint)] [TypeConverter("System.Windows.Forms.Design.DataSourceConverter")] public object DataSource { get { return _DataSource; } set { if (value == null) { if (_CurrManager != null) { _CurrManager.ListChanged -= new ListChangedEventHandler(_CurrManager_ListChanged); _CurrManager = null; } } else { if (value is IList) { _DataSource = value; if (this.BindingContext == null) { this.BindingContext = new System.Windows.Forms.BindingContext(); } _CurrManager = this.BindingContext[value] as CurrencyManager; _CurrManager.ListChanged += new ListChangedEventHandler(_CurrManager_ListChanged); } else if (value is IListSource) { IListSource myListSource = value as IListSource; if (myListSource.ContainsListCollection) { throw new System.Exception("Invalid DataSource"); } else { _DataSource = value; if (this.BindingContext == null) { this.BindingContext = new System.Windows.Forms.BindingContext(); } _CurrManager = this.BindingContext[value] as CurrencyManager; _CurrManager.ListChanged += new ListChangedEventHandler(_CurrManager_ListChanged); } } else { throw new System.Exception("Invalid DataSource"); } } } } public DataTreeView() { InitializeComponent(); } void _CurrManager_ListChanged(object sender, ListChangedEventArgs e) { switch (e.ListChangedType) { case ListChangedType.ItemAdded: case ListChangedType.ItemChanged: case ListChangedType.ItemDeleted: case ListChangedType.ItemMoved: case ListChangedType.Reset: BuildAlbumTree(_CurrManager.List as LocalAlbumList); break; case ListChangedType.PropertyDescriptorAdded: case ListChangedType.PropertyDescriptorChanged: case ListChangedType.PropertyDescriptorDeleted: default: break; } } private static TreeNode buildAlbumToNode(LocalAlbum aAlbum) { System.Windows.Forms.TreeNode aNode = new System.Windows.Forms.TreeNode(aAlbum.Name, 1, 1); aNode.ToolTipText = aAlbum.LocalDir; aNode.Tag = aAlbum; foreach (LocalImage Img in aAlbum.LocalImages) { System.Windows.Forms.TreeNode imgNode = new System.Windows.Forms.TreeNode(Img.Name, 2, 2); imgNode.ToolTipText = Img.LocalFile; imgNode.Tag = Img; aNode.Nodes.Add(imgNode); } foreach (LocalAlbum Alb in aAlbum.SubAlbums) { aNode.Nodes.Add(buildAlbumToNode(Alb)); } return aNode; } private void BuildAlbumTree(LocalAlbumList lstAlbum) { if (this.Nodes.Count > 0) { this.Nodes.Clear(); } TreeNode root = new TreeNode("Albums", 0, 0); this.Nodes.Add(root); if (lstAlbum != null) { foreach (LocalAlbum Alb in lstAlbum) { root.Nodes.Add(buildAlbumToNode(Alb)); } } } } }