ファイル整理用ツールのPrism+WPFサンプル実装
リビジョン | 96c592e9a9cd78d64c1098cf1c7702936f101d32 (tree) |
---|---|
日時 | 2022-07-30 21:03:34 |
作者 | yoshy <yoshy.org.bitbucket@gz.j...> |
コミッター | yoshy |
[UPD] ドロップ対象のパスがファイルリストのドロップ先配下に含まれるパスの場合にドロップ不可にする処理を追加
[MOD] タブ・フォルダーツリーViewModelのマップをツリーナビゲーションViewModelから切り出し
[FIX] ドロップ対象のパスがドロップ先配下に含まれるパスかどうかの判定ロジックに不具合があったため修正
@@ -17,5 +17,18 @@ namespace FolderCategorizer2.Domain.Service.Dto | ||
17 | 17 | : this(target.TreeID, target, source) |
18 | 18 | { |
19 | 19 | } |
20 | + | |
21 | + public static IEnumerable<FileSystemSourceTargetEntry> Join( | |
22 | + IEnumerable<FileSystemTargetFolder> targetFolders, | |
23 | + IEnumerable<FileSystemSourceFiles> sourceFilesList) | |
24 | + { | |
25 | + IEnumerable<FileSystemSourceTargetEntry> sourceTargetEntries = targetFolders.Join( | |
26 | + sourceFilesList, | |
27 | + target => target.TreeID, | |
28 | + source => source.TreeID, | |
29 | + (target, source) => new FileSystemSourceTargetEntry(target, source)); | |
30 | + | |
31 | + return sourceTargetEntries; | |
32 | + } | |
20 | 33 | } |
21 | 34 | } |
@@ -70,11 +70,8 @@ namespace FolderCategorizer2.UseCase.FileSystemOperation.Interactor | ||
70 | 70 | return UseCaseResponse.Abort<FileSystemCopyOperationResponse>(msg); |
71 | 71 | } |
72 | 72 | |
73 | - IEnumerable<FileSystemSourceTargetEntry> sourceTargetEntries = targetFolders.Join( | |
74 | - sourceFilesList, | |
75 | - target => target.TreeID, | |
76 | - source => source.TreeID, | |
77 | - (target, source) => new FileSystemSourceTargetEntry(target, source)); | |
73 | + IEnumerable<FileSystemSourceTargetEntry> sourceTargetEntries = | |
74 | + FileSystemSourceTargetEntry.Join(targetFolders, sourceFilesList); | |
78 | 75 | |
79 | 76 | { |
80 | 77 | string msg = "【仮】コピーしてもよろしいですか"; |
@@ -70,11 +70,8 @@ namespace FolderCategorizer2.UseCase.FileSystemOperation.Interactor | ||
70 | 70 | return UseCaseResponse.Abort<FileSystemMoveOperationResponse>(msg); |
71 | 71 | } |
72 | 72 | |
73 | - IEnumerable<FileSystemSourceTargetEntry> sourceTargetEntries = targetFolders.Join( | |
74 | - sourceFilesList, | |
75 | - target => target.TreeID, | |
76 | - source => source.TreeID, | |
77 | - (target, source) => new FileSystemSourceTargetEntry(target, source)); | |
73 | + IEnumerable<FileSystemSourceTargetEntry> sourceTargetEntries = | |
74 | + FileSystemSourceTargetEntry.Join(targetFolders, sourceFilesList); | |
78 | 75 | |
79 | 76 | { |
80 | 77 | string msg = "【仮】移動してもよろしいですか"; |
@@ -60,14 +60,17 @@ namespace FolderCategorizer2.Adaptor | ||
60 | 60 | containerRegistry.RegisterSingleton<IMainWindowViewModel, MainWindowViewModel>(); |
61 | 61 | containerRegistry.RegisterSingleton<IStatusBarViewModel, StatusBarViewModel>(); |
62 | 62 | |
63 | + containerRegistry.RegisterSingleton<ITreeNavigationViewModel, TreeNavigationViewModel>(); | |
64 | + | |
63 | 65 | containerRegistry.RegisterSingleton<IFolderTreeTabViewModel, FolderTreeTabViewModel>(); |
64 | 66 | containerRegistry.Register<IFolderTreeViewModel, FolderTreeViewModel>(); |
65 | - containerRegistry.RegisterSingleton<ITreeNavigationViewModel, TreeNavigationViewModel>(); | |
66 | 67 | |
67 | 68 | containerRegistry.RegisterSingleton<IFileListViewModel, FileListViewModel>(); |
68 | 69 | |
69 | 70 | containerRegistry.RegisterSingleton<IDragRangeSelectorViewModel, DragRangeSelectorViewModel>(); |
70 | 71 | |
72 | + containerRegistry.RegisterSingleton<IInterViewModelStore, InterViewModelStore>(); | |
73 | + | |
71 | 74 | /// |
72 | 75 | /// Translators |
73 | 76 | /// |
@@ -27,6 +27,6 @@ namespace FolderCategorizer2.Adaptor.Boundary.ViewModel.Child | ||
27 | 27 | |
28 | 28 | void NotifyCopyFileListDropped(DnDSourceFileInfo draggedFileList); |
29 | 29 | void NotifyMoveFileListDropped(DnDSourceFileInfo draggedFileList); |
30 | - bool CheckFileListDragOver(DnDSourceFileInfo draggedFileList); | |
30 | + bool IsDroppableTarget(DnDSourceFileInfo draggedFileList); | |
31 | 31 | } |
32 | 32 | } |
\ No newline at end of file |
@@ -22,6 +22,6 @@ namespace FolderCategorizer2.Adaptor.Boundary.ViewModel.Child | ||
22 | 22 | |
23 | 23 | void NotifyCopyFileListDropped(DnDSourceFileInfo draggedFileList); |
24 | 24 | void NotifyMoveFileListDropped(DnDSourceFileInfo draggedFileList); |
25 | - bool CheckFileListDragOver(DnDSourceFileInfo draggedFileList); | |
25 | + bool IsDroppableTarget(DnDSourceFileInfo draggedFileList); | |
26 | 26 | } |
27 | 27 | } |
\ No newline at end of file |
@@ -24,5 +24,6 @@ namespace FolderCategorizer2.Adaptor.Boundary.ViewModel | ||
24 | 24 | |
25 | 25 | IList<DnDSourceFileImageEntry> CreateDraggedImages(); |
26 | 26 | IList<FileSystemSourceFiles> CreateSelectedSourceFilesList(); |
27 | + bool IsDroppableTarget(IEnumerable<FileSystemSourceTargetEntry> sourceTargetEntries); | |
27 | 28 | } |
28 | 29 | } |
\ No newline at end of file |
@@ -1,9 +1,9 @@ | ||
1 | 1 | using FolderCategorizer2.Adaptor.Boundary.Controller; |
2 | +using FolderCategorizer2.Adaptor.Gateway.ViewModel; | |
2 | 3 | using FolderCategorizer2.Adaptor.Translator.Event.Converter; |
3 | 4 | using FolderCategorizer2.Domain.Model.Const; |
4 | 5 | using FolderCategorizer2.Domain.Model.Entity; |
5 | 6 | using Reactive.Bindings; |
6 | -using System.Collections.Generic; | |
7 | 7 | |
8 | 8 | namespace FolderCategorizer2.Adaptor.Boundary.ViewModel |
9 | 9 | { |
@@ -17,14 +17,12 @@ namespace FolderCategorizer2.Adaptor.Boundary.ViewModel | ||
17 | 17 | ReactiveCommand<RoutedNamedElementEventDto> CommandSelectTargetPath { get; } |
18 | 18 | |
19 | 19 | IAppWindowController WindowController { get; } |
20 | + IInterViewModelStore InterVmStore { get; } | |
20 | 21 | |
21 | 22 | void OnNotifyTreeTabChanged(string id); |
22 | 23 | void NotifyTreeViewNavigated(IFolderTreeViewModel treeVm); |
23 | 24 | void RefreshFolderTree(string treeId, FolderTree tree); |
24 | 25 | void NotifyExpandedFolderChanged(string regionName, string relativePath, RecursiveSearchLevel level, bool isExpanded); |
25 | 26 | void NotifySelectedFolderChanged(string regionName, string relativePath); |
26 | - | |
27 | - IEnumerable<IFolderTreeViewModel> FindTreeViewModelsByTabId(string tabId); | |
28 | - IEnumerable<IFolderTreeViewModel> GetTreeViewModels(); | |
29 | 27 | } |
30 | 28 | } |
\ No newline at end of file |
@@ -33,7 +33,7 @@ namespace FolderCategorizer2.Adaptor.Gateway.ViewModel.Child | ||
33 | 33 | |
34 | 34 | IFileListRowViewModel targetVm = (IFileListRowViewModel)targetItem.DataContext; |
35 | 35 | |
36 | - if (targetVm.CheckFileListDragOver(draggedFileList)) | |
36 | + if (targetVm.IsDroppableTarget(draggedFileList)) | |
37 | 37 | { |
38 | 38 | dropInfo.Effects = DropInfoKeyStatesToEffects.Convert(dropInfo.KeyStates); |
39 | 39 | } |
@@ -84,18 +84,25 @@ namespace FolderCategorizer2.Adaptor.Gateway.ViewModel.Child | ||
84 | 84 | |
85 | 85 | #region event handler |
86 | 86 | |
87 | - public bool CheckFileListDragOver(DnDSourceFileInfo draggedFileList) | |
87 | + public bool IsDroppableTarget(DnDSourceFileInfo draggedFileList) | |
88 | 88 | { |
89 | 89 | // TODO LINKの場合 |
90 | - return this.Type.Value == FileEntryType.FOLDER; | |
90 | + if (this.Type.Value != FileEntryType.FOLDER) | |
91 | + { | |
92 | + return false; | |
93 | + } | |
94 | + | |
95 | + IEnumerable<FileSystemTargetFolder> targetFolders = CreateTargetFolders(); | |
96 | + | |
97 | + IEnumerable<FileSystemSourceTargetEntry> sourceTargetEntries = | |
98 | + FileSystemSourceTargetEntry.Join(targetFolders, draggedFileList.SourceFilesList); | |
99 | + | |
100 | + return this.ParentVm.IsDroppableTarget(sourceTargetEntries); | |
91 | 101 | } |
92 | 102 | |
93 | 103 | public void NotifyCopyFileListDropped(DnDSourceFileInfo draggedFileList) |
94 | 104 | { |
95 | - // TODO LINKの場合 | |
96 | - IEnumerable<FileSystemTargetFolder> targets = this.Source.Sources | |
97 | - .Where(row => row.Type.Value == FileEntryType.FOLDER) | |
98 | - .Select(row => new FileSystemTargetFolder(row.Parent, this.Name.Value)); | |
105 | + IEnumerable<FileSystemTargetFolder> targets = CreateTargetFolders(); | |
99 | 106 | |
100 | 107 | foreach (FileSystemTargetFolder target in targets) |
101 | 108 | { |
@@ -111,6 +118,14 @@ namespace FolderCategorizer2.Adaptor.Gateway.ViewModel.Child | ||
111 | 118 | _ = this.ParentVm.WindowController.Execute(req); |
112 | 119 | } |
113 | 120 | |
121 | + private IEnumerable<FileSystemTargetFolder> CreateTargetFolders() | |
122 | + { | |
123 | + // TODO LINKの場合 | |
124 | + return this.Source.Sources | |
125 | + .Where(row => row.Type.Value == FileEntryType.FOLDER) | |
126 | + .Select(row => new FileSystemTargetFolder(row.Parent, this.Name.Value)); | |
127 | + } | |
128 | + | |
114 | 129 | public void NotifyMoveFileListDropped(DnDSourceFileInfo draggedFileList) |
115 | 130 | { |
116 | 131 | // TODO LINKの場合 |
@@ -1,15 +1,12 @@ | ||
1 | 1 | using FolderCategorizer2.Adaptor.Boundary.ViewModel; |
2 | 2 | using FolderCategorizer2.Adaptor.Boundary.ViewModel.Child; |
3 | 3 | using FolderCategorizer2.Adaptor.Gateway.ViewModel.Dto; |
4 | -using FolderCategorizer2.Adaptor.Translator.Converter; | |
5 | 4 | using FolderCategorizer2.Domain.Service.Dto; |
6 | 5 | using GongSolutions.Wpf.DragDrop; |
7 | 6 | using NLog; |
8 | 7 | using System; |
9 | 8 | using System.Collections.Generic; |
10 | -using System.Runtime.InteropServices; | |
11 | 9 | using System.Windows; |
12 | -using System.Windows.Media; | |
13 | 10 | |
14 | 11 | namespace FolderCategorizer2.Adaptor.Gateway.ViewModel.Child |
15 | 12 | { |
@@ -41,9 +38,11 @@ namespace FolderCategorizer2.Adaptor.Gateway.ViewModel.Child | ||
41 | 38 | |
42 | 39 | IList<FileSystemSourceFiles> sourceFilesList = new List<FileSystemSourceFiles>(); |
43 | 40 | |
44 | - foreach (IFolderTreeViewModel vm in treeNaviVm.FindTreeViewModelsByTabId(treeVm.TabID)) | |
41 | + foreach (IFolderTreeViewModel vm | |
42 | + in treeNaviVm.InterVmStore.FindTreeViewModelsByTabId(treeVm.TabID)) | |
45 | 43 | { |
46 | - sourceFilesList.Add(new FileSystemSourceFiles(vm.TreeID, vm.TargetPath, new string[] { item.Text.Value })); | |
44 | + sourceFilesList.Add(new FileSystemSourceFiles( | |
45 | + vm.TreeID, vm.TargetPath, new string[] { item.Text.Value })); | |
47 | 46 | } |
48 | 47 | |
49 | 48 | dragInfo.Data = new DnDSourceFileInfo(draggedImages, sourceFilesList); |
@@ -33,7 +33,7 @@ namespace FolderCategorizer2.Adaptor.Gateway.ViewModel.Child | ||
33 | 33 | |
34 | 34 | IFolderTreeNodeViewModel targetVm = (IFolderTreeNodeViewModel)targetItem.DataContext; |
35 | 35 | |
36 | - if (targetVm.CheckFileListDragOver(draggedFileList)) | |
36 | + if (targetVm.IsDroppableTarget(draggedFileList)) | |
37 | 37 | { |
38 | 38 | dropInfo.Effects = DropInfoKeyStatesToEffects.Convert(dropInfo.KeyStates); |
39 | 39 | } |
@@ -99,8 +99,10 @@ namespace FolderCategorizer2.Adaptor.Gateway.ViewModel.Child | ||
99 | 99 | } |
100 | 100 | } |
101 | 101 | |
102 | - public bool CheckFileListDragOver(DnDSourceFileInfo draggedFileList) | |
102 | + public bool IsDroppableTarget(DnDSourceFileInfo draggedFileList) | |
103 | 103 | { |
104 | + FileSystemTargetFolder targetFolder = new(this.ParentVm.TreeID, this.AbsolutePath); | |
105 | + | |
104 | 106 | FileSystemSourceFiles sourceFiles = draggedFileList.SourceFilesList |
105 | 107 | .Where(list => list.TreeID == this.ParentVm.TreeID).FirstOrDefault(); |
106 | 108 |
@@ -109,27 +111,7 @@ namespace FolderCategorizer2.Adaptor.Gateway.ViewModel.Child | ||
109 | 111 | return false; |
110 | 112 | } |
111 | 113 | |
112 | - string targetFolderFullPath = this.AbsolutePath; | |
113 | - string sourceFolderFullPath = sourceFiles.Path; | |
114 | - | |
115 | - //logger.Trace("CheckFileListDragOver: target {0}, source {1}", targetFolderFullPath, sourceFolderFullPath); | |
116 | - | |
117 | - if (targetFolderFullPath == sourceFolderFullPath) | |
118 | - { | |
119 | - return false; | |
120 | - } | |
121 | - | |
122 | - foreach (var name in sourceFiles.Names) | |
123 | - { | |
124 | - string sourceFullPath = PathHelper.CreateCanonicalPath(sourceFolderFullPath, name); | |
125 | - | |
126 | - if (PathHelper.IsSameOrChild(targetFolderFullPath, sourceFullPath)) | |
127 | - { | |
128 | - return false; | |
129 | - } | |
130 | - } | |
131 | - | |
132 | - return true; | |
114 | + return DroppableTargetHelper.IsDroppableTarget(targetFolder, sourceFiles); | |
133 | 115 | } |
134 | 116 | |
135 | 117 | public void NotifyCopyFileListDropped(DnDSourceFileInfo draggedFileList) |
@@ -138,7 +120,7 @@ namespace FolderCategorizer2.Adaptor.Gateway.ViewModel.Child | ||
138 | 120 | |
139 | 121 | logger.Trace("FolderTreeNodeViewModel: relativePath {0}", relativePath); |
140 | 122 | |
141 | - IEnumerable<IFolderTreeViewModel> vms = this.ParentVm.ParentVm.GetTreeViewModels(); | |
123 | + IEnumerable<IFolderTreeViewModel> vms = this.ParentVm.ParentVm.InterVmStore.GetTreeViewModels(); | |
142 | 124 | |
143 | 125 | IEnumerable<FileSystemTargetFolder> targets = vms.Select(vm => vm.Source) |
144 | 126 | .Where(src => src != null) |
@@ -165,7 +147,7 @@ namespace FolderCategorizer2.Adaptor.Gateway.ViewModel.Child | ||
165 | 147 | |
166 | 148 | logger.Trace("FolderTreeNodeViewModel: relativePath {0}", relativePath); |
167 | 149 | |
168 | - IEnumerable<IFolderTreeViewModel> vms = this.ParentVm.ParentVm.GetTreeViewModels(); | |
150 | + IEnumerable<IFolderTreeViewModel> vms = this.ParentVm.ParentVm.InterVmStore.GetTreeViewModels(); | |
169 | 151 | |
170 | 152 | IEnumerable<FileSystemTargetFolder> targets = vms.Select(vm => vm.Source) |
171 | 153 | .Where(src => src != null) |
@@ -0,0 +1,43 @@ | ||
1 | +using CleanAuLait.Core.IO; | |
2 | +using FolderCategorizer2.Domain.Service.Dto; | |
3 | +using NLog; | |
4 | + | |
5 | +namespace FolderCategorizer2.Adaptor.Gateway.ViewModel | |
6 | +{ | |
7 | + internal static class DroppableTargetHelper | |
8 | + { | |
9 | + private static readonly ILogger logger = LogManager.GetCurrentClassLogger(); | |
10 | + | |
11 | + public static bool IsDroppableTarget(FileSystemSourceTargetEntry sourceTargetEntry) | |
12 | + { | |
13 | + return IsDroppableTarget(sourceTargetEntry.TargetFolder, sourceTargetEntry.SourceFiles); | |
14 | + } | |
15 | + | |
16 | + public static bool IsDroppableTarget( | |
17 | + FileSystemTargetFolder targetFolder, FileSystemSourceFiles sourceFiles) | |
18 | + { | |
19 | + string targetFolderFullPath = targetFolder.Path; | |
20 | + string sourceFolderFullPath = sourceFiles.Path; | |
21 | + | |
22 | + //logger.Trace("CheckFileListDragOver: target {0}, source {1}", targetFolderFullPath, sourceFolderFullPath); | |
23 | + | |
24 | + if (targetFolderFullPath == sourceFolderFullPath) | |
25 | + { | |
26 | + return false; | |
27 | + } | |
28 | + | |
29 | + foreach (var name in sourceFiles.Names) | |
30 | + { | |
31 | + string sourceFullPath = PathHelper.CreateCanonicalPath(sourceFolderFullPath, name); | |
32 | + | |
33 | + if (PathHelper.IsSameOrChild(sourceFullPath, targetFolder.Path)) | |
34 | + { | |
35 | + return false; | |
36 | + } | |
37 | + } | |
38 | + | |
39 | + return true; | |
40 | + } | |
41 | + | |
42 | + } | |
43 | +} |
@@ -133,6 +133,20 @@ namespace FolderCategorizer2.Adaptor.Gateway.ViewModel | ||
133 | 133 | return sourceFilesList; |
134 | 134 | } |
135 | 135 | |
136 | + public bool IsDroppableTarget( | |
137 | + IEnumerable<FileSystemSourceTargetEntry> sourceTargetEntries) | |
138 | + { | |
139 | + foreach (var entry in sourceTargetEntries) | |
140 | + { | |
141 | + if (!DroppableTargetHelper.IsDroppableTarget(entry)) | |
142 | + { | |
143 | + return false; | |
144 | + } | |
145 | + } | |
146 | + | |
147 | + return true; | |
148 | + } | |
149 | + | |
136 | 150 | #endregion |
137 | 151 | } |
138 | 152 | } |
@@ -0,0 +1,14 @@ | ||
1 | +using FolderCategorizer2.Adaptor.Boundary.ViewModel; | |
2 | +using System.Collections.Generic; | |
3 | + | |
4 | +namespace FolderCategorizer2.Adaptor.Gateway.ViewModel | |
5 | +{ | |
6 | + public interface IInterViewModelStore | |
7 | + { | |
8 | + void AddTabIdTreeIdViewModelMap(IFolderTreeViewModel treeVm); | |
9 | + void AddTreeIdViewModelMap(IFolderTreeViewModel treeVm); | |
10 | + IFolderTreeViewModel FindTreeIdViewModelMapByTreeId(string treeId); | |
11 | + IEnumerable<IFolderTreeViewModel> FindTreeViewModelsByTabId(string tabId); | |
12 | + IEnumerable<IFolderTreeViewModel> GetTreeViewModels(); | |
13 | + } | |
14 | +} | |
\ No newline at end of file |
@@ -0,0 +1,81 @@ | ||
1 | +using CleanAuLait.Core.Log; | |
2 | +using FolderCategorizer2.Adaptor.Boundary.ViewModel; | |
3 | +using NLog; | |
4 | +using System; | |
5 | +using System.Collections.Generic; | |
6 | +using System.Linq; | |
7 | + | |
8 | +namespace FolderCategorizer2.Adaptor.Gateway.ViewModel | |
9 | +{ | |
10 | + internal class InterViewModelStore : IInterViewModelStore | |
11 | + { | |
12 | + private static readonly ILogger logger = LogManager.GetCurrentClassLogger(); | |
13 | + | |
14 | + private readonly IDictionary<string, IFolderTreeViewModel> treeIdVmMap = | |
15 | + new Dictionary<string, IFolderTreeViewModel>(); | |
16 | + | |
17 | + private readonly IDictionary<string, IDictionary<string, IFolderTreeViewModel>> tabIdVmMap = | |
18 | + new Dictionary<string, IDictionary<string, IFolderTreeViewModel>>(); | |
19 | + | |
20 | + public void AddTreeIdViewModelMap(IFolderTreeViewModel treeVm) | |
21 | + { | |
22 | + string treeId = treeVm.TreeID; | |
23 | + | |
24 | + if (!this.treeIdVmMap.ContainsKey(treeId)) | |
25 | + { | |
26 | + this.treeIdVmMap.Add(treeId, treeVm); | |
27 | + | |
28 | + logger.Trace("AddTreeIdViewModelMap: tree {0} -> VM[{1}] added.", | |
29 | + treeId, treeVm.ToHashString()); | |
30 | + | |
31 | + } | |
32 | + } | |
33 | + | |
34 | + public void AddTabIdTreeIdViewModelMap(IFolderTreeViewModel treeVm) | |
35 | + { | |
36 | + string tabId = treeVm.TabID; | |
37 | + string treeId = treeVm.TreeID; | |
38 | + | |
39 | + if (!this.tabIdVmMap.TryGetValue( | |
40 | + tabId, out IDictionary<string, IFolderTreeViewModel> tabIdTreeIdVmMap)) | |
41 | + { | |
42 | + tabIdTreeIdVmMap = new SortedDictionary<string, IFolderTreeViewModel>(); | |
43 | + this.tabIdVmMap.Add(tabId, tabIdTreeIdVmMap); | |
44 | + } | |
45 | + | |
46 | + if (!tabIdTreeIdVmMap.ContainsKey(treeId)) | |
47 | + { | |
48 | + tabIdTreeIdVmMap.Add(treeId, treeVm); | |
49 | + | |
50 | + logger.Trace("AddTabIdTreeIdViewModelMap: tab {0} -> tree {1} -> VM[{2}] added.", | |
51 | + tabId, treeId, treeVm.ToHashString()); | |
52 | + } | |
53 | + } | |
54 | + public IEnumerable<IFolderTreeViewModel> FindTreeViewModelsByTabId(string tabId) | |
55 | + { | |
56 | + if (!this.tabIdVmMap.TryGetValue( | |
57 | + tabId, out IDictionary<string, IFolderTreeViewModel> tabIdTreeIdVmMap)) | |
58 | + { | |
59 | + throw new ArgumentException("invalid tab id"); | |
60 | + } | |
61 | + | |
62 | + return tabIdTreeIdVmMap.Select(x => x.Value); | |
63 | + } | |
64 | + | |
65 | + public IFolderTreeViewModel FindTreeIdViewModelMapByTreeId(string treeId) | |
66 | + { | |
67 | + if (!this.treeIdVmMap.TryGetValue(treeId, out IFolderTreeViewModel vm)) | |
68 | + { | |
69 | + throw new ArgumentException("invalid tree id"); | |
70 | + } | |
71 | + return vm; | |
72 | + } | |
73 | + | |
74 | + public IEnumerable<IFolderTreeViewModel> GetTreeViewModels() | |
75 | + { | |
76 | + return this.treeIdVmMap.Values; | |
77 | + } | |
78 | + | |
79 | + | |
80 | + } | |
81 | +} |
@@ -1,7 +1,6 @@ | ||
1 | 1 | using CleanAuLait.Adaptor.Boundary.Gateway.UI.Dialog.Shell; |
2 | 2 | using CleanAuLait.Adaptor.Gateway.UI.Dialog.Shell.Parameters; |
3 | 3 | using CleanAuLait.Core.IO; |
4 | -using CleanAuLait.Core.Log; | |
5 | 4 | using FolderCategorizer2.Adaptor.Boundary.Controller; |
6 | 5 | using FolderCategorizer2.Adaptor.Boundary.ViewModel; |
7 | 6 | using FolderCategorizer2.Adaptor.Translator; |
@@ -16,7 +15,6 @@ using Prism.Regions; | ||
16 | 15 | using Reactive.Bindings; |
17 | 16 | using Reactive.Bindings.Extensions; |
18 | 17 | using System; |
19 | -using System.Collections.Generic; | |
20 | 18 | using System.ComponentModel; |
21 | 19 | using System.Linq; |
22 | 20 | using System.Reactive.Disposables; |
@@ -55,23 +53,20 @@ namespace FolderCategorizer2.Adaptor.Gateway.ViewModel | ||
55 | 53 | public ReactiveCommand<RoutedNamedElementEventDto> CommandSelectTargetPath { get; } |
56 | 54 | |
57 | 55 | public IAppWindowController WindowController { get; } |
56 | + public IInterViewModelStore InterVmStore { get; } | |
58 | 57 | |
59 | 58 | private readonly IRegionManager regionManager; |
60 | 59 | private readonly IFolderTreeIdTranslator idTranslator; |
61 | - | |
62 | 60 | private readonly ICommonFolderDialogProxy folderDlg; |
63 | 61 | |
64 | - private readonly IDictionary<string, IFolderTreeViewModel> treeIdVmMap = | |
65 | - new Dictionary<string, IFolderTreeViewModel>(); | |
66 | - | |
67 | - private readonly IDictionary<string, IDictionary<string, IFolderTreeViewModel>> tabIdVmMap = | |
68 | - new Dictionary<string, IDictionary<string, IFolderTreeViewModel>>(); | |
69 | - | |
70 | 62 | private readonly CompositeDisposable disposables = new(); |
71 | 63 | |
72 | 64 | public TreeNavigationViewModel( |
73 | - IRegionManager regionManager, IAppWindowController windowController, | |
74 | - IFolderTreeTabViewModel tabVm, IFolderTreeIdTranslator idTranslator, | |
65 | + IAppWindowController windowController, | |
66 | + IRegionManager regionManager, | |
67 | + IInterViewModelStore interVmStore, | |
68 | + IFolderTreeTabViewModel tabVm, | |
69 | + IFolderTreeIdTranslator idTranslator, | |
75 | 70 | ICommonFolderDialogProxy folderDlg) |
76 | 71 | { |
77 | 72 | this.WindowController = windowController; |
@@ -79,6 +74,8 @@ namespace FolderCategorizer2.Adaptor.Gateway.ViewModel | ||
79 | 74 | this.regionManager = regionManager; |
80 | 75 | this.idTranslator = idTranslator; |
81 | 76 | |
77 | + this.InterVmStore = interVmStore; | |
78 | + | |
82 | 79 | this.folderDlg = folderDlg; |
83 | 80 | |
84 | 81 | this.TargetPath1 = new ReactivePropertySlim<string>().AddTo(disposables); |
@@ -263,80 +260,20 @@ namespace FolderCategorizer2.Adaptor.Gateway.ViewModel | ||
263 | 260 | return; |
264 | 261 | } |
265 | 262 | |
266 | - AddTreeIdViewModelMap(treeVm); | |
267 | - AddTabIdTreeIdViewModelMap(treeVm); | |
263 | + this.InterVmStore.AddTreeIdViewModelMap(treeVm); | |
264 | + this.InterVmStore.AddTabIdTreeIdViewModelMap(treeVm); | |
268 | 265 | |
269 | 266 | NotifySelectedFolderChanged(treeVm.RegionName, treeVm.SelectedPath); |
270 | 267 | } |
271 | 268 | |
272 | - private void AddTreeIdViewModelMap(IFolderTreeViewModel treeVm) | |
273 | - { | |
274 | - string treeId = treeVm.TreeID; | |
275 | - | |
276 | - if (!this.treeIdVmMap.ContainsKey(treeId)) | |
277 | - { | |
278 | - this.treeIdVmMap.Add(treeId, treeVm); | |
279 | - | |
280 | - logger.Trace("AddTreeIdViewModelMap: tree {0} -> VM[{1}] added.", | |
281 | - treeId, treeVm.ToHashString()); | |
282 | - | |
283 | - } | |
284 | - } | |
285 | - | |
286 | - private void AddTabIdTreeIdViewModelMap(IFolderTreeViewModel treeVm) | |
287 | - { | |
288 | - string tabId = treeVm.TabID; | |
289 | - string treeId = treeVm.TreeID; | |
290 | - | |
291 | - if (!this.tabIdVmMap.TryGetValue( | |
292 | - tabId, out IDictionary<string, IFolderTreeViewModel> tabIdTreeIdVmMap)) | |
293 | - { | |
294 | - tabIdTreeIdVmMap = new SortedDictionary<string, IFolderTreeViewModel>(); | |
295 | - this.tabIdVmMap.Add(tabId, tabIdTreeIdVmMap); | |
296 | - } | |
297 | - | |
298 | - if (!tabIdTreeIdVmMap.ContainsKey(treeId)) | |
299 | - { | |
300 | - tabIdTreeIdVmMap.Add(treeId, treeVm); | |
301 | - | |
302 | - logger.Trace("AddTabIdTreeIdViewModelMap: tab {0} -> tree {1} -> VM[{2}] added.", | |
303 | - tabId, treeId, treeVm.ToHashString()); | |
304 | - } | |
305 | - } | |
306 | - | |
307 | - public IEnumerable<IFolderTreeViewModel> FindTreeViewModelsByTabId(string tabId) | |
308 | - { | |
309 | - if (!this.tabIdVmMap.TryGetValue( | |
310 | - tabId, out IDictionary<string, IFolderTreeViewModel> tabIdTreeIdVmMap)) | |
311 | - { | |
312 | - throw new ArgumentException("invalid tab id"); | |
313 | - } | |
314 | - | |
315 | - return tabIdTreeIdVmMap.Select(x => x.Value); | |
316 | - } | |
317 | - | |
318 | 269 | public void RefreshFolderTree(string treeId, FolderTree tree) |
319 | 270 | { |
320 | - IFolderTreeViewModel treeVm = FindTreeIdViewModelMapByTreeId(treeId); | |
271 | + IFolderTreeViewModel treeVm = this.InterVmStore.FindTreeIdViewModelMapByTreeId(treeId); | |
321 | 272 | |
322 | 273 | treeVm.Refresh(tree); |
323 | 274 | treeVm.Nodes.First().IsSelected.Value = true; |
324 | 275 | } |
325 | 276 | |
326 | - private IFolderTreeViewModel FindTreeIdViewModelMapByTreeId(string treeId) | |
327 | - { | |
328 | - if (!this.treeIdVmMap.TryGetValue(treeId, out IFolderTreeViewModel vm)) | |
329 | - { | |
330 | - throw new ArgumentException("invalid tree id"); | |
331 | - } | |
332 | - return vm; | |
333 | - } | |
334 | - | |
335 | - public IEnumerable<IFolderTreeViewModel> GetTreeViewModels() | |
336 | - { | |
337 | - return this.treeIdVmMap.Values; | |
338 | - } | |
339 | - | |
340 | 277 | public void NotifyExpandedFolderChanged( |
341 | 278 | string sourceRegionName, string relativePath, |
342 | 279 | RecursiveSearchLevel level, bool isExpanded) |