private void SizeNode(IRenderer Renderer, NodeModel root, NodeModel exclude, bool center) { if (!root.Show) return; RectangleF insideArea = root.AreaF; if (ShowLabels) { // check if enough room in root box for label var labelSpace = root.AreaF; labelSpace.Width -= LabelPadding * 2.0f; labelSpace.Height -= LabelPadding * 2.0f; var labelSize = new RectangleF(root.AreaF.Location, Renderer.MeasureString(root.Name, TextFont)); float minHeight = (root.Nodes.Count > 0) ? labelSize.Height * 2.0f : labelSize.Height; if (minHeight < labelSpace.Height && labelSize.Width / 3f < labelSpace.Width) { labelSize.X += LabelPadding; labelSize.Y += LabelPadding; if (labelSpace.Width < labelSize.Width) { root.LabelClipped = true; labelSize.Width = labelSpace.Width; } insideArea.Y += labelSize.Height; insideArea.Height -= labelSize.Height; root.RoomForLabel = true; root.LabelRect = labelSize; } } List<Sector> sectors = new TreeMap(root, exclude, insideArea.Size).Results; foreach (Sector sector in sectors) { var node = sector.OriginalValue; sector.Rect = RectangleExtensions.Contract(sector.Rect, NodeBorderWidth); if (sector.Rect.X < NodeBorderWidth) sector.Rect.X = NodeBorderWidth; if (sector.Rect.Y < NodeBorderWidth) sector.Rect.Y = NodeBorderWidth; if (sector.Rect.X > insideArea.Width - NodeBorderWidth) sector.Rect.X = insideArea.Width - NodeBorderWidth; if (sector.Rect.Y > insideArea.Height - NodeBorderWidth) sector.Rect.Y = insideArea.Height - NodeBorderWidth; sector.Rect.X += insideArea.X; sector.Rect.Y += insideArea.Y; node.SetArea(sector.Rect); PositionMap[node.ID] = node; node.RoomForLabel = false; // cant do above without graphic artifacts node.LabelClipped = false; if (center) CenterMap.Add(node.ID); if (sector.Rect.Width > 1.0f && sector.Rect.Height > 1.0f) SizeNode(Renderer, node, exclude, center); } }
private void SizeNode(IRenderer Renderer, NodeModel root, NodeModel exclude, bool center) { if (!root.Show) { return; } RectangleF insideArea = root.AreaF; if (ShowLabels) { // check if enough room in root box for label var labelSpace = root.AreaF; labelSpace.Width -= LabelPadding * 2.0f; labelSpace.Height -= LabelPadding * 2.0f; var labelSize = new RectangleF(root.AreaF.Location, Renderer.MeasureString(root.Name, TextFont)); float minHeight = (root.Nodes.Count > 0) ? labelSize.Height * 2.0f : labelSize.Height; if (minHeight < labelSpace.Height && labelSize.Width / 3f < labelSpace.Width) { labelSize.X += LabelPadding; labelSize.Y += LabelPadding; if (labelSpace.Width < labelSize.Width) { root.LabelClipped = true; labelSize.Width = labelSpace.Width; } insideArea.Y += labelSize.Height; insideArea.Height -= labelSize.Height; root.RoomForLabel = true; root.LabelRect = labelSize; } } List <Sector> sectors = new TreeMap(root, exclude, insideArea.Size).Results; foreach (Sector sector in sectors) { var node = sector.OriginalValue; sector.Rect = RectangleExtensions.Contract(sector.Rect, NodeBorderWidth); if (sector.Rect.X < NodeBorderWidth) { sector.Rect.X = NodeBorderWidth; } if (sector.Rect.Y < NodeBorderWidth) { sector.Rect.Y = NodeBorderWidth; } if (sector.Rect.X > insideArea.Width - NodeBorderWidth) { sector.Rect.X = insideArea.Width - NodeBorderWidth; } if (sector.Rect.Y > insideArea.Height - NodeBorderWidth) { sector.Rect.Y = insideArea.Height - NodeBorderWidth; } sector.Rect.X += insideArea.X; sector.Rect.Y += insideArea.Y; node.SetArea(sector.Rect); PositionMap[node.ID] = node; node.RoomForLabel = false; // cant do above without graphic artifacts node.LabelClipped = false; if (center) { CenterMap.Add(node.ID); } if (sector.Rect.Width > 1.0f && sector.Rect.Height > 1.0f) { SizeNode(Renderer, node, exclude, center); } } }