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); } }