static SkeletonItem[] BfsExpand(SkeletonItem skel) { for (int i = 0; i < skel.displayNodes.Length; ++i) { BfsExpandCore(skel, i); } var workItems = new Stack <SkeletonItem>(); var allNodes = new List <SkeletonItem>(); workItems.Push(skel); while (workItems.Count > 0) { var s = workItems.Pop(); if (!s.isPrimary.Any()) { continue; } allNodes.Add(s); s.children.Iter(workItems.Push); } return(allNodes.ToArray()); }
internal SkeletonItem(string n, SkeletonItem par) : this(par.main, par.displayNodes.Length) { parent = par; name = n; level = par.level + 1; }
static void BfsExpandCore(SkeletonItem skel, int idx) { var visited = new HashSet <Model.Element>(); var workItems = new Queue <SkeletonItem>(); workItems.Enqueue(skel); while (workItems.Count > 0) { var s = workItems.Dequeue(); if (s.displayNodes[idx] == null) { continue; } var e = s.displayNodes[idx].Element; s.isPrimary[idx] = true; if (e != null) { if (visited.Contains(e)) { continue; } visited.Add(e); } s.ComputeChildren(); s.children.Iter(workItems.Enqueue); } }
private void ExpandParents(SkeletonItem item) { item = item.parent; while (item != null) { item.Expanded = true; item = item.parent; } }
private void GotoNode(SkeletonItem skel) { ExpandParents(skel); SyncCurrentStateView(); foreach (DisplayItem it in currentStateView.Items) { if (it.skel == skel) { it.Selected = true; currentStateView.EnsureVisible(it.Index); break; } } }
public void SyncWith(Dictionary <SkeletonItem, SkeletonItem> mapping, SkeletonItem old) { mapping[old] = this; Expanded = old.Expanded; var oldCh = old.children.ToDictionary(c => c.name); foreach (var c in children) { SkeletonItem oc; if (oldCh.TryGetValue(c.name, out oc)) { c.SyncWith(mapping, oc); } } }
private void stateViewMenu_Opening(object sender, CancelEventArgs e) { IDisplayNode sel = null; SkeletonItem skel = null; if (SelectedNode() != null) { sel = SelectedNode().dispNode; skel = SelectedNode().skel; } var items = stateViewMenu.Items; items.Clear(); if (sel == null) { items.Add(new ToolStripMenuItem("Unavailable") { Enabled = false }); return; } foreach (var x in sel.References.Where(q => q != sel.Element)) { var t = new ToolStripMenuItem(LangModel.CanonicalName(x)); items.Add(t); AddMenuItems(NamesFor(x), t.DropDownItems, "= ", 20); } if (sel.Element != null) { var selName = LangModel.CanonicalName(sel.Element); items.Add("Find uses...", null, (s, _) => SetSearch("use:" + selName)); var aliases = NamesFor(sel.Element).Where(s => s != skel).ToArray(); if (aliases.Length > 0) { items.Add("Aliases...", null, (s, _) => SetSearch("eq:" + selName)); AddMenuItems(aliases, items, " = ", 10); } } }
static SkeletonItem[] BfsExpand(SkeletonItem skel) { for (int i = 0; i < skel.displayNodes.Length; ++i) BfsExpandCore(skel, i); var workItems = new Stack<SkeletonItem>(); var allNodes = new List<SkeletonItem>(); workItems.Push(skel); while (workItems.Count > 0) { var s = workItems.Pop(); if (!s.isPrimary.Any()) continue; allNodes.Add(s); s.children.Iter(workItems.Push); } return allNodes.ToArray(); }
private void ComputeChildren() { if (wasExpanded) { return; } wasExpanded = true; var created = new Dictionary <string, SkeletonItem>(); var names = new List <IDisplayNode>(); for (int i = 0; i < displayNodes.Length; ++i) { var dn = displayNodes[i]; if (dn == null) { continue; } foreach (var child in dn.Children) { if (child.ViewLevel > main.viewOpts.ViewLevel) { continue; } SkeletonItem skelChild; var name = child.Name; if (!created.TryGetValue(name, out skelChild)) { skelChild = new SkeletonItem(child.Name, this); created.Add(name, skelChild); names.Add(child); } skelChild.displayNodes[i] = child; } } foreach (var name in main.LangModel.SortFields(names)) { children.Add(created[name]); } }
internal void Set(SkeletonItem s, int id, int prevId) { if (skel == s && stateId == id) return; skel = s; stateId = id; dispNode = skel.displayNodes[stateId]; active = dispNode != null; var closeStateId = stateId; if (dispNode == null) { while (closeStateId < skel.displayNodes.Length && skel.displayNodes[closeStateId] == null) closeStateId++; if (closeStateId >= skel.displayNodes.Length) { closeStateId = stateId; while (closeStateId >= 0 && skel.displayNodes[closeStateId] == null) closeStateId--; } dispNode = skel.displayNodes[closeStateId]; } var fullName = skel.LongName(closeStateId); var tooltip = dispNode.ToolTip; if (tooltip == null) tooltip = ""; if(tooltip.Length > 0 && tooltip[tooltip.Length - 1] != '\n') tooltip += "\n"; tooltip += "Full name: " + fullName; if (tooltip != null) { this.ToolTipText = tooltip; } var name = dispNode.Name; if (name != dispNode.ShortName) { name = dispNode.ShortName; } if (IsMatchListItem) { Util.Assert(active); name = fullName; } this.SubItems[0].Text = name; this.SubItems[1].Text = active ? dispNode.Value : ""; var prev = ""; if (!IsMatchListItem && prevId >= 0 && skel.displayNodes[prevId] != null) { prev = skel.displayNodes[prevId].Value; } this.SubItems[2].Text = prev; }
private void BuildModel() { stateList.Items.Clear(); var items = new List<ListViewItem>(); LangModel = langProvider.GetLanguageSpecificModel(currentModel, viewOpts); states = LangModel.States.ToArray(); var oldRoot = unfoldingRoot; SkeletonItem selectedSkel = null; if (oldRoot != null && SelectedNode() != null) { selectedSkel = SelectedNode().skel; } unfoldingRoot = new SkeletonItem(this, states.Length); allItems = unfoldingRoot.PopulateRoot(states); var idx = 0; foreach (var i in states) { var it = new ListViewItem(new string[] { idx.ToString(), i.Name, "" }); it.Tag = i; items.Add(it); idx++; } stateList.Items.AddRange(items.ToArray()); unfoldingRoot.Expanded = true; if (oldRoot == null) { SetState(0); stateList.Items[0].Selected = true; SetColumnSizes(); } else { var mapping = new Dictionary<SkeletonItem, SkeletonItem>(); unfoldingRoot.SyncWith(mapping, oldRoot); SkeletonItem newIt = null; while (selectedSkel != null) { if (mapping.TryGetValue(selectedSkel, out newIt)) break; selectedSkel = selectedSkel.parent; } if (CurrentState >= stateList.Items.Count) CurrentState = 0; if (PreviousState >= stateList.Items.Count) PreviousState = -1; if (newIt != null) GotoNode(newIt); SyncStateListValues(); UpdateMatches(true); } }
internal void Set(SkeletonItem s, int id, int prevId) { if (skel == s && stateId == id) { return; } skel = s; stateId = id; dispNode = skel.displayNodes[stateId]; active = dispNode != null; var closeStateId = stateId; if (dispNode == null) { while (closeStateId < skel.displayNodes.Length && skel.displayNodes[closeStateId] == null) { closeStateId++; } if (closeStateId >= skel.displayNodes.Length) { closeStateId = stateId; while (closeStateId >= 0 && skel.displayNodes[closeStateId] == null) { closeStateId--; } } dispNode = skel.displayNodes[closeStateId]; } var fullName = skel.LongName(closeStateId); var tooltip = dispNode.ToolTip; if (tooltip == null) { tooltip = ""; } if (tooltip.Length > 0 && tooltip[tooltip.Length - 1] != '\n') { tooltip += "\n"; } tooltip += "Full name: " + fullName; if (tooltip != null) { this.ToolTipText = tooltip; } var name = dispNode.Name; if (name != dispNode.ShortName) { name = dispNode.ShortName; } if (IsMatchListItem) { Util.Assert(active); name = fullName; } this.SubItems[0].Text = name; this.SubItems[1].Text = active ? dispNode.Value : ""; var prev = ""; if (!IsMatchListItem && prevId >= 0 && skel.displayNodes[prevId] != null) { prev = skel.displayNodes[prevId].Value; } this.SubItems[2].Text = prev; }
static void BfsExpandCore(SkeletonItem skel, int idx) { var visited = new HashSet<Model.Element>(); var workItems = new Queue<SkeletonItem>(); workItems.Enqueue(skel); while (workItems.Count > 0) { var s = workItems.Dequeue(); if (s.displayNodes[idx] == null) continue; var e = s.displayNodes[idx].Element; s.isPrimary[idx] = true; if (e != null) { if (visited.Contains(e)) continue; visited.Add(e); } s.ComputeChildren(); s.children.Iter(workItems.Enqueue); } }
private void ComputeChildren() { if (wasExpanded) return; wasExpanded = true; var created = new Dictionary<string, SkeletonItem>(); var names = new List<IDisplayNode>(); for (int i = 0; i < displayNodes.Length; ++i) { var dn = displayNodes[i]; if (dn == null) continue; foreach (var child in dn.Children) { if (child.ViewLevel > main.viewOpts.ViewLevel) continue; SkeletonItem skelChild; var name = child.Name; if (!created.TryGetValue(name, out skelChild)) { skelChild = new SkeletonItem(child.Name, this); created.Add(name, skelChild); names.Add(child); } skelChild.displayNodes[i] = child; } } foreach (var name in main.LangModel.SortFields(names)) { children.Add(created[name]); } }
public void SyncWith(Dictionary<SkeletonItem, SkeletonItem> mapping, SkeletonItem old) { mapping[old] = this; Expanded = old.Expanded; var oldCh = old.children.ToDictionary(c => c.name); foreach (var c in children) { SkeletonItem oc; if (oldCh.TryGetValue(c.name, out oc)) c.SyncWith(mapping, oc); } }
private void BuildModel() { stateList.Items.Clear(); var items = new List <ListViewItem>(); LangModel = langProvider.GetLanguageSpecificModel(currentModel, viewOpts); states = LangModel.States.ToArray(); var oldRoot = unfoldingRoot; SkeletonItem selectedSkel = null; if (oldRoot != null && SelectedNode() != null) { selectedSkel = SelectedNode().skel; } unfoldingRoot = new SkeletonItem(this, states.Length); allItems = unfoldingRoot.PopulateRoot(states); var idx = 0; foreach (var i in states) { var it = new ListViewItem(new string[] { idx.ToString(), i.Name, "" }); it.Tag = i; items.Add(it); idx++; } stateList.Items.AddRange(items.ToArray()); unfoldingRoot.Expanded = true; if (oldRoot == null) { SetState(0); stateList.Items[0].Selected = true; SetColumnSizes(); } else { var mapping = new Dictionary <SkeletonItem, SkeletonItem>(); unfoldingRoot.SyncWith(mapping, oldRoot); SkeletonItem newIt = null; while (selectedSkel != null) { if (mapping.TryGetValue(selectedSkel, out newIt)) { break; } selectedSkel = selectedSkel.parent; } if (CurrentState >= stateList.Items.Count) { CurrentState = 0; } if (PreviousState >= stateList.Items.Count) { PreviousState = -1; } if (newIt != null) { GotoNode(newIt); } SyncStateListValues(); UpdateMatches(true); } }