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}">
+
+
+