private void AddInheritanceSourceMember(BaseTypeInfo baseType, string relationName) { // 定義元ソースコードがある場合、メンバーも表示する if (baseType.FoundDefinition) { var baseItem = AppEnv.UserDefinitions.FirstOrDefault(x => { var b1 = (x.SourceFile == baseType.DefinitionSourceFile); var b2 = (x.StartLength == baseType.DefinitionStartLength); var b3 = (x.EndLength == baseType.DefinitionEndLength); if (b1 && b2 && b3) { return(true); } else { return(false); } }); AddInheritanceSourceMember(baseItem, false, relationName); } else { // 定義元ソースコードは無いので、名前だけ表示する var model = new DefinitionItemModel { IsTargetDefinition = false, RelationName = relationName, DefinitionName = baseType.DisplayBaseType, }; InheritanceSourceTreeItems.Add(model); } }
private static void ShowData(DefinitionItemModel model) { // コントロールを作成 var newThumb = CreateControl(model); // 1つ前に登録したコントロールがあれば取得しておく var previousThumb = default(ResizableThumb); if (Self.Children.OfType <ResizableThumb>().Any()) { previousThumb = Self.Children.OfType <ResizableThumb>().LastOrDefault(); } // コントロールを追加 Self.Children.Add(newThumb); // Canvas 上の表示位置をセット SetNewLocation(model, newThumb, previousThumb); if (previousThumb is null) { return; } // 既に表示済みの任意のコントロールと今回追加するコントロールを線でつなげる // つなげたい既存コントロールが1つ前とは限らないため、妥当なコントロールを取得 previousThumb = GetRelationControl(newThumb); if (previousThumb is null) { return; } AddArrow(previousThumb, newThumb); }
private static void SetNewLocation(DefinitionItemModel model, ResizableThumb newThumb, ResizableThumb previousThumb) { // 1つ目 if (previousThumb is null) { var pos = new Point(10, 10); Canvas.SetLeft(newThumb, pos.X); Canvas.SetTop(newThumb, pos.Y); return; } // 2つ目以降 var previousModel = previousThumb.DataContext as DefinitionItemModel; if (previousModel.DefinitionName == model.RelationName) { // 右下 var pos = GetRightBottomSideLocation(previousThumb); Canvas.SetLeft(newThumb, pos.X); Canvas.SetTop(newThumb, pos.Y); return; } else { // 位置関係によっては、1つ右ずれしてしまうバグの対応 // 関係元のコントロールを基準として、その最初の関係するコントロールの真下とする previousThumb = GetRelationFirstChildControl(newThumb); // 真下 var pos = GetMostBottomSideLocation(previousThumb); Canvas.SetLeft(newThumb, pos.X); Canvas.SetTop(newThumb, pos.Y); return; } }
private void AddInheritanceSourceMember(UserDefinition item, bool isTargetDefinition, string relationName) { // UserDefinition -> TreeViewItemModel -> DefinitionItemModel // メンバー集めは、既存処理を使用する。すでに TreeViewItemModel 用のメソッドがあるので // いったんメンバーをくっつけて、それをもらう // class, struct, interface var containerModel = ConvertTreeViewItemModel(item); AddFilteredMember(containerModel, item); // 定義元のソースファイルが違う場合、名前空間も付ける var definitionName = item.DisplaySignature; if (item.SourceFile != SourceFile) { definitionName = $"{definitionName}({Path.GetFileName(item.SourceFile)})"; } // ヘッダー名 var model = new DefinitionItemModel { IsTargetDefinition = isTargetDefinition, RelationName = relationName, DefinitionName = definitionName, }; InheritanceSourceTreeItems.Add(model); // メンバー名 if (containerModel.Children.Any()) { foreach (var child in containerModel.Children) { model.MemberTreeItems.Add(child.Copy()); } model.IsExpanded = true; } // 継承元クラス、インターフェース if (item.BaseTypeInfos.Any()) { foreach (var baseType in item.BaseTypeInfos) { // VBNet ソースファイルの場合で、定義元ソースコードが見つからなかった場合、 // 定義名が C# 形式で表示されるバグの対応 if (AppEnv.Languages == Languages.VBNet) { baseType.DisplayBaseType = item.ConvertCurrentLanguageType(baseType.DisplayBaseType); } AddInheritanceSourceMember(baseType, model.DefinitionName); } } }
private static void SetNewLocation(DefinitionItemModel model, ResizableThumb newThumb, ResizableThumb previousThumb) { // 1つ目 if (previousThumb is null) { var pos = new Point(10, 10); Canvas.SetLeft(newThumb, pos.X); Canvas.SetTop(newThumb, pos.Y); return; } // 2つ目以降 var previousModel = previousThumb.DataContext as DefinitionItemModel; if (string.IsNullOrEmpty(model.RelationName)) { // 新しいプロジェクトの始まりの場合、1つ目の列に追加する previousThumb = Self.Children.OfType <ResizableThumb>().FirstOrDefault(); // 真下 var pos = GetMostBottomSideLocation(previousThumb); Canvas.SetLeft(newThumb, pos.X); Canvas.SetTop(newThumb, pos.Y); return; } else if (previousModel.DefinitionName == model.RelationName) { // 右隣 var pos = GetRightSideLocation(previousThumb); Canvas.SetLeft(newThumb, pos.X); Canvas.SetTop(newThumb, pos.Y); return; } else { // 位置関係によっては、1つ右ずれしてしまうバグの対応 // 関係元のコントロールを基準として、その最初の関係するコントロールの真下とする previousThumb = GetRelationFirstChildControl(newThumb); // 真下 var pos = GetMostBottomSideLocation(previousThumb); Canvas.SetLeft(newThumb, pos.X); Canvas.SetTop(newThumb, pos.Y); return; } }
private static ResizableThumb CreateControl(DefinitionItemModel model) { var thumbTemplate = Self.Resources["DefinitionMemberTemplate"] as ControlTemplate; var newThumb = new ResizableThumb(); newThumb.Template = thumbTemplate; newThumb.DataContext = model; // いる? var newSize = new Size(50000, 50000); Self.Measure(newSize); newThumb.ApplyTemplate(); newThumb.UpdateLayout(); return(newThumb); }
private void SetData(ProjectInfo prjInfo, bool isTargetDefinition, string relationName) { var model = new DefinitionItemModel { IsExpanded = true, IsTargetDefinition = isTargetDefinition, RelationName = relationName, DefinitionName = prjInfo.ProjectName, }; // VSエクスプローラーペイン上のプロジェクト名とアセンブリファイル名が違う場合があるので、2つ表示させる model.MemberTreeItems.Add(new TreeViewItemModel { Text = prjInfo.AssemblyName, }); ProjectTreeItems.Add(model); foreach (var child in prjInfo.ProjectReferenceAssemblyNames) { var childInfo = AppEnv.ProjectInfos.FirstOrDefault(x => x.AssemblyFile == child.AssemblyFile); SetData(childInfo, false, model.DefinitionName); } }
private void AddInheritanceDestinationMember(UserDefinition item, bool isTargetDefinition, string relationName) { // UserDefinition -> TreeViewItemModel -> DefinitionItemModel // メンバー集めは、既存処理を使用する。すでに TreeViewItemModel 用のメソッドがあるので // いったんメンバーをくっつけて、それをもらう // class, struct, interface var containerModel = ConvertTreeViewItemModel(item); AddFilteredMember(containerModel, item); // 定義元のソースファイルが違う場合、名前空間も付ける var definitionName = item.DisplaySignature; if (item.SourceFile != SourceFile) { definitionName = $"{definitionName}({Path.GetFileName(item.SourceFile)})"; } // ヘッダー名 var model = new DefinitionItemModel { IsTargetDefinition = isTargetDefinition, RelationName = relationName, DefinitionName = definitionName, }; InheritanceDestinationTreeItems.Add(model); // メンバー名 if (containerModel.Children.Any()) { foreach (var child in containerModel.Children) { model.MemberTreeItems.Add(child.Copy()); } model.IsExpanded = true; } // 継承先クラス、インターフェースを取得 var destItems = AppEnv.UserDefinitions.Where(x => { if (x.BaseTypeInfos.Any(y => { if (!y.FoundDefinition) { return(false); } var b1 = (y.DefinitionSourceFile == item.SourceFile); var b2 = (y.DefinitionStartLength == item.StartLength); var b3 = (y.DefinitionEndLength == item.EndLength); if (b1 && b2 && b3) { return(true); } else { return(false); } })) { return(true); } return(false); }); if (!(destItems is null) && destItems.Any()) { foreach (var destItem in destItems) { AddInheritanceDestinationMember(destItem, false, model.DefinitionName); } } }