private void SourceTreeSelectedItemChanged(TreeViewItemModel e) { if (e is null || e.FileName != SourceFile) { return; } // 通常はキャレット位置が変わったら、TextEditorEx_CaretPositionChanged イベントハンドラが実行されていいのですが、 // 各ツリーノードのクリック時は、結果的に無駄処理として実行されるだけなので、フラグを立ててイベントハンドラが動作しないように抑制します。 // ただし、ソースツリーで選択した定義が、メンバーツリー(や継承ツリー)で表示中の定義範囲外の場合、表示更新したいため、わざと抑制フラグは立てません。 // ※ NowWorking フラグは、TextEditorEx_CaretPositionChanged() 内で使用しているイベント処理の抑制フラグです。 var useEventSkipFlag = false; if (MemberTreeItems.Any()) { var item = MemberTreeItems.FirstOrDefault(); if (item.StartLength <= e.StartLength && e.EndLength <= item.EndLength) { useEventSkipFlag = true; } // 例外として、インナーのクラス、構造体、インターフェースの場合は再表示させる switch (e.TreeNodeKinds) { case TreeNodeKinds.Class: case TreeNodeKinds.Struct: case TreeNodeKinds.Interface: useEventSkipFlag = false; break; } } if (useEventSkipFlag) { NowWorking = true; } CaretOffset = e.StartLength; if (useEventSkipFlag) { NowWorking = false; } }
// メンバーツリー private void ShowMemberTree() { var item = FindUserDefinition(); if (item is null) { MemberTreeItems.Clear(); return; } // class, struct, interface, module / enum, delegate, event var model = ConvertTreeViewItemModel(item); // 前回の値が入っている場合、前回の値と比較する // 前回と同じ場合は何もしないで終わる if (MemberTreeItems.Any()) { var previous = MemberTreeItems.FirstOrDefault(); if (previous.Text == model.Text && previous.StartLength == model.StartLength) { return; } } MemberTreeItems.Clear(); MemberTreeItems.Add(model); switch (item.DefineKinds) { case DefineKinds.Class: case DefineKinds.Struct: case DefineKinds.Interface: case DefineKinds.Module: AddFilteredMember(model, item); break; } }