diff --git a/ClangPowerTools/ClangPowerToolsShared/ClangPowerToolsShared.projitems b/ClangPowerTools/ClangPowerToolsShared/ClangPowerToolsShared.projitems index 50fa0f833..7c396e745 100644 --- a/ClangPowerTools/ClangPowerToolsShared/ClangPowerToolsShared.projitems +++ b/ClangPowerTools/ClangPowerToolsShared/ClangPowerToolsShared.projitems @@ -26,6 +26,7 @@ + diff --git a/ClangPowerTools/ClangPowerToolsShared/Convertors/BooleanToGridLengthConverter.cs b/ClangPowerTools/ClangPowerToolsShared/Convertors/BooleanToGridLengthConverter.cs new file mode 100644 index 000000000..a6e528b71 --- /dev/null +++ b/ClangPowerTools/ClangPowerToolsShared/Convertors/BooleanToGridLengthConverter.cs @@ -0,0 +1,24 @@ +using System; +using System.Globalization; +using System.Windows; +using System.Windows.Data; + +namespace ClangPowerTools.Convertors +{ + public class BooleanToGridLengthConverter : IValueConverter + { + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + if (value is bool valueAsBool && valueAsBool) + { + return new GridLength(1, GridUnitType.Auto); + } + return new GridLength(0); + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } + } +} diff --git a/ClangPowerTools/ClangPowerToolsShared/MVVM/CommonSettingsFunctionality.cs b/ClangPowerTools/ClangPowerToolsShared/MVVM/CommonSettingsFunctionality.cs index dc6b1bf5b..939405f21 100644 --- a/ClangPowerTools/ClangPowerToolsShared/MVVM/CommonSettingsFunctionality.cs +++ b/ClangPowerTools/ClangPowerToolsShared/MVVM/CommonSettingsFunctionality.cs @@ -1,4 +1,4 @@ -using ClangPowerTools.Helpers; +using ClangPowerTools.Helpers; using ClangPowerTools.MVVM.Models; using Microsoft.Win32; using System.Collections.Generic; @@ -70,7 +70,7 @@ protected string[] BrowseForFolderFiles(string searchFilePattern, SearchOption s /// /// Search pattern to apply in the file search /// Information about how to search inside the selected folder - /// Array of files path + /// Path to the selected folder protected string BrowseForFolderFiles() { using var folderBrowseDialog = new System.Windows.Forms.FolderBrowserDialog(); @@ -108,9 +108,9 @@ protected void WriteContentToFile(string path, string content) FileSystem.WriteContentToFile(path, content); } - protected string OpenContentDialog(string content) + protected string OpenContentDialog(string content, bool showFilesPicker = false, bool showFolderPicker = false) { - InputDataViewModel inputDataViewModel = new InputDataViewModel(content); + InputDataViewModel inputDataViewModel = new InputDataViewModel(content, showFilesPicker, showFolderPicker); inputDataViewModel.ShowViewDialog(); string input = CreateInput(inputDataViewModel.Inputs.ToList()); diff --git a/ClangPowerTools/ClangPowerToolsShared/MVVM/ViewModels/CompilerSettingsViewModel.cs b/ClangPowerTools/ClangPowerToolsShared/MVVM/ViewModels/CompilerSettingsViewModel.cs index 7929adf48..f8c7220c2 100644 --- a/ClangPowerTools/ClangPowerToolsShared/MVVM/ViewModels/CompilerSettingsViewModel.cs +++ b/ClangPowerTools/ClangPowerToolsShared/MVVM/ViewModels/CompilerSettingsViewModel.cs @@ -117,7 +117,7 @@ private void UpdateCompileFlags() private void UpdateFilesToIgnore() { - compilerModel.FilesToIgnore = OpenContentDialog(compilerModel.FilesToIgnore); + compilerModel.FilesToIgnore = OpenContentDialog(compilerModel.FilesToIgnore, true, true); PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("CompilerModel")); } diff --git a/ClangPowerTools/ClangPowerToolsShared/MVVM/ViewModels/FormatSettingsViewModel.cs b/ClangPowerTools/ClangPowerToolsShared/MVVM/ViewModels/FormatSettingsViewModel.cs index 42b1679d0..e25ba84cf 100644 --- a/ClangPowerTools/ClangPowerToolsShared/MVVM/ViewModels/FormatSettingsViewModel.cs +++ b/ClangPowerTools/ClangPowerToolsShared/MVVM/ViewModels/FormatSettingsViewModel.cs @@ -129,7 +129,7 @@ private void UpdateFileExtensions() private void UpdateFilesToIgnore() { - formatModel.FilesToIgnore = OpenContentDialog(formatModel.FilesToIgnore); + formatModel.FilesToIgnore = OpenContentDialog(formatModel.FilesToIgnore, true, true); PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("FormatModel")); } diff --git a/ClangPowerTools/ClangPowerToolsShared/MVVM/ViewModels/InputDataViewModel.cs b/ClangPowerTools/ClangPowerToolsShared/MVVM/ViewModels/InputDataViewModel.cs index ac2514b5b..a7039e6c2 100644 --- a/ClangPowerTools/ClangPowerToolsShared/MVVM/ViewModels/InputDataViewModel.cs +++ b/ClangPowerTools/ClangPowerToolsShared/MVVM/ViewModels/InputDataViewModel.cs @@ -1,9 +1,11 @@ -using ClangPowerTools.MVVM.Commands; +using ClangPowerTools.MVVM.Commands; using ClangPowerTools.MVVM.Models; using ClangPowerTools.Views; using System.Collections.ObjectModel; using System.ComponentModel; +using System.IO; using System.Linq; +using System.Windows.Forms; using System.Windows.Input; namespace ClangPowerTools @@ -17,15 +19,21 @@ public class InputDataViewModel : CommonSettingsFunctionality, INotifyPropertyCh private string inputToAdd; private InputDataView inputDataView; private ICommand addCommand; + private bool showFilePicker; + private ICommand pickFilesCommand; + private bool showFolderPicker; + private ICommand pickFolderCommand; #endregion #region Constructor - public InputDataViewModel(string content) + public InputDataViewModel(string content, bool showFilesPicker = false, bool showFolderPicker = false) { CreateInputsCollection(content); + ShowFilesPicker = showFilesPicker; + ShowFolderPicker = showFolderPicker; } public InputDataViewModel() { } @@ -44,25 +52,68 @@ public string InputToAdd set { inputToAdd = value; - PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("InputToAdd")); + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(InputToAdd))); } } public ObservableCollection Inputs { get; set; } = new ObservableCollection(); - public ICommand AddCommand + public bool ShowFilesPicker { - get => addCommand ?? (addCommand = new RelayCommand(() => AddInput(), () => CanExecute)); + get + { + return showFilePicker; + } + set + { + showFilePicker = value; + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(ShowFilesPicker))); + } } - public bool CanExecute + public bool ShowFolderPicker { get { - return true; + return showFolderPicker; + } + set + { + showFolderPicker = value; + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(ShowFolderPicker))); } } + public ICommand AddCommand + { + get => addCommand ??= new RelayCommand(AddInput, () => CanExecute); + } + + public bool CanExecute + { + get => true; + } + + public ICommand PickFilesCommand + { + get => pickFilesCommand ??= new RelayCommand(PickFile, () => CanPickFilesExecute); + } + + public bool CanPickFilesExecute + { + get => ShowFilesPicker; + } + + public ICommand PickFolderCommand + { + get => pickFolderCommand ??= new RelayCommand(PickFolder, () => CanPickFolderExecute); + } + + public bool CanPickFolderExecute + { + get => ShowFolderPicker; + } + #endregion @@ -74,6 +125,24 @@ public void ShowViewDialog() inputDataView.ShowDialog(); } + private void PickFile() + { + var filesToAdd = OpenFiles(string.Empty, ".h", "Header files|*.h"); + if (filesToAdd == null) + return; // no file selected + foreach (var file in filesToAdd) + { + InputToAdd = file; + AddInput(); // automatically add selected file + } + } + + private void PickFolder() + { + InputToAdd = BrowseForFolderFiles(); + AddInput(); // automatically add selected folder + } + public void DeleteInput(int index) { if (index < 0 || index >= Inputs.Count) @@ -88,7 +157,17 @@ private void AddInput() return; if (IsDuplicate(inputToAdd)) + { + MessageBox.Show($"Ignored to add duplicate: {InputToAdd}", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning); + InputToAdd = string.Empty; return; + } + + if(!File.Exists(inputToAdd) && !Directory.Exists(inputToAdd)) + { + MessageBox.Show($"The file or folder does not exist: {InputToAdd}", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning); + return; + } AddNewElement(inputToAdd); InputToAdd = string.Empty; @@ -102,8 +181,8 @@ private void CreateInputsCollection(string content) return; var splitContent = content.Split(';').ToList(); - for (int index = 0; index < splitContent.Count; ++index) - AddNewElement(splitContent[index]); + foreach (var splitItem in splitContent) + AddNewElement(splitItem); } private void AddNewElement(string newElement) diff --git a/ClangPowerTools/ClangPowerToolsShared/MVVM/Views/Components/InputList.xaml b/ClangPowerTools/ClangPowerToolsShared/MVVM/Views/Components/InputList.xaml index 68475b2a0..84eb70651 100644 --- a/ClangPowerTools/ClangPowerToolsShared/MVVM/Views/Components/InputList.xaml +++ b/ClangPowerTools/ClangPowerToolsShared/MVVM/Views/Components/InputList.xaml @@ -4,6 +4,7 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + xmlns:conv="clr-namespace:ClangPowerTools.Convertors" Name="_InputList" d:DesignHeight="450" d:DesignWidth="800" @@ -19,6 +20,7 @@ + @@ -42,6 +44,8 @@ + + @@ -52,7 +56,10 @@ Margin="0,0,5,0" VerticalContentAlignment="Center" FontSize="13" - Text="{Binding InputToAdd, ElementName=_InputList}"> + Text="{Binding InputToAdd, ElementName=_InputList, UpdateSourceTrigger=PropertyChanged}"> + + +