protected override void OnPaint(PaintEventArgs pe) { int y = 0; if (!IsSoftRefresh) { DrawnNodes.Clear(); foreach (var node in Nodes) { node.Drawn = false; node.ZIndex = 0; } for (int i = 0; i < Nodes.Count(); i++) { CalculateChildren(pe.Graphics, Nodes.ElementAt(i), 0, ref y, true); } } foreach (var item in DrawnNodes.OrderBy(r => r.ZIndex)) { Draw(pe.Graphics, item); } if (LastClickDrag) { pe.Graphics.DrawLine(Pens.Red, new Point(0, LatchPoint.Y), new Point(this.Width, LatchPoint.Y)); } IsSoftRefresh = false; }
private void MouseUpCascade(object sender, MouseEventArgs e) { if (NodesMoved.Count > 0) { DragStopped(e); LastClickDrag = false; NodeBeingMoved = null; HardRefresh(); return; } foreach (var item in DrawnNodes.OrderByDescending(r => r.ZIndex)) { if (item.Contains(e.Location)) { MouseUpOnElem(item, e); break; } } if (LastClickDrag) { LastClickDrag = false; NodeBeingMoved = null; HardRefresh(); } }
private void CalculateIndividual(Graphics g, RTreeNode node, int depth, ref int y) { y += SPACING; int x = 0 + node.Depth * 8; var drawString = "[" + (node.Collapsed ? "+" : "-") + "]" + node.Name; node.Location = new Point(x, y); node.Size = new Size(300, DefaultFont.Height); g.DrawString(drawString, DefaultFont, Brushes.Black, x, y); DrawnNodes.Add(node); }
private void MouseMoveCascade(object sender, MouseEventArgs e) { foreach (var item in DrawnNodes.OrderBy(r => r.ZIndex)) { if (item.Contains(e.Location)) { MouseMoveOnElem(item, e); break; } } }
private IEnumerable <RTreeNode> MoveChildren(RTreeNode topNode, Size size) { var res = new List <RTreeNode>(); res.Add(topNode); topNode.ZIndex = DrawnNodes.Max(r => r.ZIndex) + 1; topNode.Location += size; if (!topNode.Collapsed) { foreach (var node in topNode.Children.OrderBy(r => r.Left)) { res.AddRange(MoveChildren(node, size)); } } return(res); }
RTreeNode FindNodeClosestTo(RTreeNode fromNode, Point p, out bool inside) { RTreeNode best = null; double dist = 9999999; inside = false; foreach (var node in DrawnNodes.Where(r => r != fromNode && !fromNode.Children.Contains(r))) { if (node.Contains(p)) { inside = true; return(node); } var ptA = p; var ptB = node.Location + new Size(0, node.Size.Height); var rdist = Math.Sqrt((ptA.X - ptB.X) * (ptA.X - ptB.X) + (ptA.Y - ptB.Y) * (ptA.Y - ptB.Y)); if (rdist < dist) { dist = rdist; best = node; } } /*for (int i = 0; i < DrawnNodes.Count; i++) * { * var node = DrawnNodes[i]; * if (node == fromNode) * continue; * var ptA = p; * var ptB = node.Location + new Size(0, node.Size.Height); * var rdist = Math.Sqrt((ptA.X-ptB.X)* (ptA.X - ptB.X)+ (ptA.Y - ptB.Y)* (ptA.Y - ptB.Y)); * if(rdist < dist) * { * dist = rdist; * best = node; * } * * contPlace: * continue; * }*/ return(best); }