//------------------------------------------------------------------------------------- /// <summary> /// Рисует элементы дерева /// </summary> /// <param name="g"></param> /// <param name="treeView"></param> /// <param name="item"></param> /// <param name="r">Ссылка на прямоугольник ячейки. После рисования, он будет изменен!!!!</param> ///// <param name="indentWithoutButton">Определяет, будет ли отступ вместо кнопки, если кнопки нет.</param> public void DrawTreeElements(Graphics g, SimTreeGridView treeView, ITreeItem item, ref Rectangle r/*, bool indentWithoutButton = true*/) { Rectangle cellBounds = r; r.X +=2; r.Width -= 2; r.X += (int)(treeView.Indent * item.Level); r.Width -= (int)(treeView.Indent * item.Level); SimTreeGridView.NodeInfo ci = treeView.view[item]; if(treeView.DrawPlusMinus && ci.hasButton && ci.btnRect == Rectangle.Empty) ci.btnRect = new Rectangle(r.X - cellBounds.X, r.Y + (r.Height - 9)/2 - cellBounds.Y, 9, 9); if(treeView.DrawTreeLines) { if(item.IsRoot == false) { int shift = cellBounds.X + 6; foreach(ITreeItem i in treeView.Tree.GetParentsItemsList(item)) { if(i.IsRoot) continue; if(i.Level < item.Level) if(treeView.view[i].IsEndItem == false) g.DrawLine(SystemPens.ControlDark, shift, r.Y, shift, r.Y + r.Height-1); shift = shift + treeView.Indent; // cellBounds.X + 6 + treeView.Indent * i.Level; } shift = r.X - treeView.Indent + 4; if(ci.IsEndItem) g.DrawLine(SystemPens.ControlDark, shift, r.Y, shift, r.Y+r.Height/2-1); else g.DrawLine(SystemPens.ControlDark, shift, r.Y, shift, r.Y + r.Height-1); g.DrawLine(SystemPens.ControlDark, shift, r.Y+r.Height/2-1, shift + 9, r.Y+r.Height/2-1); } if(ci.hasButton && ci.btnClose == false) { g.DrawLine(SystemPens.ControlDark, r.X + 4, r.Y + r.Height/2, r.X + 4, r.Y + r.Height-1); } } if(treeView.DrawPlusMinus && ci.hasButton) { if(ci.btnClose) g.DrawImage(global::Sim.Controls.Properties.Resources.TreeBtn_Plus, r.X, r.Y + (r.Height - 9)/2); else g.DrawImage(global::Sim.Controls.Properties.Resources.TreeBtn_Minus, r.X, r.Y + (r.Height - 9)/2); } if((treeView.DrawPlusMinus && ci.hasButton) || (((SimTreeGridViewMainColumn)base.OwningColumn).IndentWithoutButton && item.Level == 0)) { r.X += 11; r.Width -= 11; } }
//------------------------------------------------------------------------------------- private void ftgvView_NeedChildItems(object sender, SimTreeGridView.SimTreeGridItemEventArgs args) { try { object obj = ((ViewItem)args.Item.Object).Value; Type t = obj.GetType(); if(obj is IEnumerable == false || showIEnumProps == true) { BindingFlags fl = BindingFlags.Instance | BindingFlags.Public | BindingFlags.GetField | BindingFlags.GetProperty; if(showNonPublic) fl |= BindingFlags.NonPublic; foreach(MemberInfo mi in t.GetMembers(fl)) { ViewItem i = new ViewItem(); i.Name = mi.Name; switch(mi.MemberType) { case MemberTypes.Field: i.mi = mi; i.parObj = obj; break; case MemberTypes.Property: if(((PropertyInfo)mi).GetIndexParameters().Length > 0 )//I i.Name == "Item" || i.Name.EndsWith(".Item")) continue; goto case MemberTypes.Field; default: continue; } args.Tree.Add(i, args.Item); } } if(obj is IEnumerable) { int c = 0; foreach(object i in (IEnumerable)obj) { ViewItem vi = new ViewItem(); vi.Name = String.Format("[{0}]", c++); vi.obj = i; args.Tree.Add(vi, args.Item); } } } catch(Exception Err) { //ModalErrorBox.Show(Err, PanelBack); ViewItem vi = new ViewItem(); vi.Name = "ERROR"; vi.obj = Err; args.Tree.Add(vi, args.Item); } }
//------------------------------------------------------------------------------------- /// <summary> /// Инициализирующий конструктор. /// </summary> /// <param name="treeGridView"></param> public View(SimTreeGridView treeGridView) : this() { treeView = treeGridView; }
//------------------------------------------------------------------------------------- private void ftgvView_HasChildItems(object sender, SimTreeGridView.SimTreeGridItemEventArgs args) { try { Type t = ((ViewItem)args.Item.Object).Type; if(t != null) args.HasChildren = !(t.IsPrimitive || t.IsAssignableFrom(typeof(string)) || t.FullName == "System.RuntimeType"); } catch(Exception Err) { ModalErrorBox.Show(Err, PanelBack); } }