Exemplo n.º 1
0
        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;
            }
        }
Exemplo n.º 2
0
        // メンバーツリー

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