using System; using System.Linq; using System.Reactive.Disposables; using System.Windows; using System.Windows.Controls; using System.Windows.Input; using Intromat.ViewModels; using ReactiveUI; namespace Intromat.Views { /// /// Interaction logic for ExplorerView.xaml /// public partial class ExplorerView : IViewFor { public static readonly DependencyProperty ViewModelProperty = DependencyProperty.Register(nameof(ViewModel), typeof(ExplorerViewModel), typeof(ExplorerView), new PropertyMetadata(null)); private readonly MenuItem _newModuleButton; private readonly MenuItem _renameModuleButton; private readonly MenuItem _deleteModuleButton; private readonly MenuItem _createModuleFolderButton; private readonly MenuItem _renameFolderButton; private readonly MenuItem _deleteFolderButton; private readonly MenuItem _createSubFolderButton; private readonly MenuItem _createModuleFileButton; private readonly MenuItem _createSubFileButton; private readonly MenuItem _renameFileButton; private readonly MenuItem _deleteFileButton; public ExplorerView() { InitializeComponent(); var projectMenu = (ContextMenu)Resources["projectMenu"]; var projectMenuItems = projectMenu.Items.OfType().ToList(); _newModuleButton = projectMenuItems.First(c => c.Name == nameof(_newModuleButton)); var moduleMenu = (ContextMenu)Resources["moduleMenu"]; var moduleMenuItems = moduleMenu.Items.OfType().ToList(); _renameModuleButton = moduleMenuItems.First(c => c.Name == nameof(_renameModuleButton)); _deleteModuleButton = moduleMenuItems.First(c => c.Name == nameof(_deleteModuleButton)); _createModuleFolderButton = moduleMenuItems.First(c => c.Name == nameof(_createModuleFolderButton)); _createModuleFileButton = moduleMenuItems.First(c => c.Name == nameof(_createModuleFileButton)); var folderMenu = (ContextMenu)Resources["folderMenu"]; var folderMenuItems = folderMenu.Items.OfType().ToList(); _renameFolderButton = folderMenuItems.First(c => c.Name == nameof(_renameFolderButton)); _deleteFolderButton = folderMenuItems.First(c => c.Name == nameof(_deleteFolderButton)); _createSubFolderButton = folderMenuItems.First(c => c.Name == nameof(_createSubFolderButton)); _createSubFileButton = folderMenuItems.First(c => c.Name == nameof(_createSubFileButton)); var documentMenu = (ContextMenu)Resources["documentMenu"]; var documentMenuItems = documentMenu.Items.OfType().ToList(); _renameFileButton = documentMenuItems.First(c => c.Name == nameof(_renameFileButton)); _deleteFileButton = documentMenuItems.First(c => c.Name == nameof(_deleteFileButton)); this.WhenActivated(d => { _treeView.ItemsSource = ViewModel!.TreeRoot; _treeView.Events().MouseDoubleClick.Subscribe(OnTreeViewDoubleClicked); projectMenu.Events().DataContextChanged.Subscribe(args => ViewModel.CurrentProject = (ProjectViewModel)args.NewValue); moduleMenu.Events().DataContextChanged.Subscribe(args => ViewModel.CurrentModule = (ModuleViewModel)args.NewValue); folderMenu.Events().DataContextChanged.Subscribe(args => ViewModel.CurrentFolder = (FolderViewModel)args.NewValue); documentMenu.Events().DataContextChanged.Subscribe(args => ViewModel.CurrentFile = (FileViewModel)args.NewValue); this.BindCommand(ViewModel, vm => vm.NewModule, v => v._newModuleButton).DisposeWith(d); this.BindCommand(ViewModel, vm => vm.RenameModule, v => v._renameModuleButton).DisposeWith(d); this.BindCommand(ViewModel, vm => vm.DeleteModule, v => v._deleteModuleButton).DisposeWith(d); this.BindCommand(ViewModel, vm => vm.NewModuleFolder, v => v._createModuleFolderButton).DisposeWith(d); this.BindCommand(ViewModel, vm => vm.NewSubFolder, v => v._createSubFolderButton).DisposeWith(d); this.BindCommand(ViewModel, vm => vm.RenameFolder, v => v._renameFolderButton).DisposeWith(d); this.BindCommand(ViewModel, vm => vm.DeleteFolder, v => v._deleteFolderButton).DisposeWith(d); this.BindCommand(ViewModel, vm => vm.NewFile, v => v._createModuleFileButton).DisposeWith(d); this.BindCommand(ViewModel, vm => vm.NewFile, v => v._createSubFileButton).DisposeWith(d); this.BindCommand(ViewModel, vm => vm.RenameFile, v => v._renameFileButton).DisposeWith(d); this.BindCommand(ViewModel, vm => vm.DeleteFile, v => v._deleteFileButton).DisposeWith(d); }); } object? IViewFor.ViewModel { get => ViewModel; set => ViewModel = (ExplorerViewModel?)value; } public ExplorerViewModel? ViewModel { get => (ExplorerViewModel?)GetValue(ViewModelProperty); set => SetValue(ViewModelProperty, value); } private void OnTreeViewDoubleClicked(MouseButtonEventArgs args) { var vm = ((FrameworkElement)args.OriginalSource).DataContext; if (vm is FileViewModel fileVm) { var mainVm = ViewModel!.MainViewModel; if (mainVm.Files.All(d => d != fileVm)) mainVm.Files.Add(fileVm); mainVm.ActiveFile = fileVm; } } } }