private void RemoveHandlers(AdvancedPart part) { part.DeleteRequested -= Part_DeleteRequested; part.IsSelectedChanged -= Part_IsSelectedChanged; // is the selected part in the hierarchy being removed? if (SelectedPart == part) { SelectedPart = null; } else if (SelectedPart != null) { var junction = SelectedPart.Container; while (junction != null) { // yep, one of the parent junctions of the SelectedPart is the one being removed if (junction == part) { SelectedPart = null; break; } junction = junction.Container; } } }
private void AddPart(AdvancedPart part, int index) { // we're going to be internally consistent layoutParts.SuspendLayout(); Control control; if (part is WinFormsAdvancedPartJunction) control = new AdvancedPartJunctionView((WinFormsAdvancedPartJunction)part); else control = new AdvancedPartNodeView((WinFormsAdvancedPartNode)part); control.Dock = DockStyle.Fill; layoutParts.RowStyles.Insert(index, new RowStyle(SizeType.AutoSize)); // shift all controls after this point down one row // (the last row will have nothing in it, the row of index will have an existing control for (int i = layoutParts.RowStyles.Count - 2; i >= index; i--) { var move = layoutParts.GetControlFromPosition(0, i); if (move != null) layoutParts.SetCellPosition(move, new TableLayoutPanelCellPosition(0, i + 1)); } layoutParts.Controls.Add(control, 0, index); layoutParts.ResumeLayout(); // update height outside SuspendLayout or it won't recalculate correctly //ScrollHeight += ControlHeight(control); }
private void Part_IsSelectedChanged(object sender, EventArgs e) { var part = (AdvancedPart)sender; if (part.IsSelected) { SelectedPart = part; } else if (part == SelectedPart) { SelectedPart = null; } }
protected virtual void Remove(AdvancedPart part) { if (part == null) { return; } RemoveHandlers(part); if (Part == part) { Part = null; } else { var container = part.Container; container.Parts.Remove(part); // remove the container if it's only got 1 item left if (container.Parts.Count == 1) { RemoveHandlers(container); var parentContainer = container.Container; if (parentContainer == null) { container.Parts[0].Container = null; Part = container.Parts[0]; } else { var index = parentContainer.Parts.IndexOf(container); parentContainer.Parts.Remove(container); // if the parent container junction type is the same as what we're inserting, merge the parts var toMerge = container.Parts[0]; if (toMerge is AdvancedPartJunction && ((AdvancedPartJunction)toMerge).Type == parentContainer.Type) { RemoveHandlers(toMerge); foreach (var p in (AdvancedPartJunction)toMerge) { parentContainer.Add(p); } } else { parentContainer.Insert(index, container.Parts[0]); } } } } }
private void AddHandlers(AdvancedPart part) { part.DeleteRequested += Part_DeleteRequested; part.IsSelectedChanged += Part_IsSelectedChanged; }