From e3d53ce327291dd4358edf66bdacaee8e75597d8 Mon Sep 17 00:00:00 2001
From: muellerp <Philipp1.Mueller@Student.Reutlingen-University.de>
Date: Wed, 8 Jan 2025 20:11:09 +0100
Subject: [PATCH] added edit button

---
 .../InnoLabProjektDektopApp.csproj.user       |   6 +
 .../Screens/FirstLaunch/03_2ProgramsList.xaml |  16 +-
 .../FirstLaunch/03_2ProgramsList.xaml.cs      | 187 +++++++++++-------
 .../Services/ProcessMonitor.cs                |   3 +-
 .../Utils/InputDialog.xaml                    |  14 ++
 .../Utils/InputDialog.xaml.cs                 |  33 ++++
 6 files changed, 176 insertions(+), 83 deletions(-)
 create mode 100644 InnoLabProjektDektopApp/InnoLabProjektDektopApp/Utils/InputDialog.xaml
 create mode 100644 InnoLabProjektDektopApp/InnoLabProjektDektopApp/Utils/InputDialog.xaml.cs

diff --git a/InnoLabProjektDektopApp/InnoLabProjektDektopApp/InnoLabProjektDektopApp.csproj.user b/InnoLabProjektDektopApp/InnoLabProjektDektopApp/InnoLabProjektDektopApp.csproj.user
index ca4b48d..92b7ce6 100644
--- a/InnoLabProjektDektopApp/InnoLabProjektDektopApp/InnoLabProjektDektopApp.csproj.user
+++ b/InnoLabProjektDektopApp/InnoLabProjektDektopApp/InnoLabProjektDektopApp.csproj.user
@@ -10,6 +10,9 @@
     <Compile Update="Screens\Templates\HeaderTemplate.xaml.cs">
       <SubType>Code</SubType>
     </Compile>
+    <Compile Update="Utils\InputDialog.xaml.cs">
+      <SubType>Code</SubType>
+    </Compile>
   </ItemGroup>
   <ItemGroup>
     <Page Update="Screens\FirstLaunch\03_2ProgramsList.xaml">
@@ -48,5 +51,8 @@
     <Page Update="Styles\Styles.xaml">
       <SubType>Designer</SubType>
     </Page>
+    <Page Update="Utils\InputDialog.xaml">
+      <SubType>Designer</SubType>
+    </Page>
   </ItemGroup>
 </Project>
\ No newline at end of file
diff --git a/InnoLabProjektDektopApp/InnoLabProjektDektopApp/Screens/FirstLaunch/03_2ProgramsList.xaml b/InnoLabProjektDektopApp/InnoLabProjektDektopApp/Screens/FirstLaunch/03_2ProgramsList.xaml
index 8263e95..25c5982 100644
--- a/InnoLabProjektDektopApp/InnoLabProjektDektopApp/Screens/FirstLaunch/03_2ProgramsList.xaml
+++ b/InnoLabProjektDektopApp/InnoLabProjektDektopApp/Screens/FirstLaunch/03_2ProgramsList.xaml
@@ -39,7 +39,7 @@
                 <!-- Überschrift -->
                 <TextBlock Grid.Column="0"
                            Style="{StaticResource Header1}" 
-                           Text="Edit the list of websites and programs for this category" 
+                           Text="Edit the list of distracting programs" 
                            HorizontalAlignment="Left" Margin="0,46,0,-46" />
 
                 <!-- Suchfeld -->
@@ -84,7 +84,7 @@
                 </DockPanel>
             </Grid>
             <TextBlock Style="{StaticResource StandardText}" Margin="0,40,0,0"
-                       Text="By clicking on a toggle, you can change the programs/websites that should be marked as distracting." />
+                       Text="By clicking on a toggle, you can change the programs that should be marked as distracting." />
 
             <Border Background="#2C2C2C" CornerRadius="10" Padding="10" Margin="0,10,0,0">
                 <Grid>
@@ -96,7 +96,7 @@
                     </Grid.ColumnDefinitions>
 
                     <!-- Label -->
-                    <TextBlock Text="Add a distracting website:" 
+                    <TextBlock Text="Add a distracting program:" 
         VerticalAlignment="Center" 
         Foreground="White" 
         FontSize="14" 
@@ -116,7 +116,7 @@
   BorderThickness="1" 
   TextChanged="UrlInputBox_TextChanged" />
                         <TextBlock x:Name="UrlPlaceholder" 
-    Text="Url" 
+    Text="process name" 
     VerticalAlignment="Center" 
     Foreground="Gray" 
     FontSize="14" 
@@ -153,20 +153,20 @@
                                 Style="{StaticResource Header2}" 
                                 Text="CATEGORY" RenderTransformOrigin="0.548,1.689" Margin="10,0,0,0"/>
                 </StackPanel>
-                <StackPanel Orientation="Horizontal" VerticalAlignment="Center" HorizontalAlignment="Right" Margin="0,10,0,10" Width="350">
+                <StackPanel Orientation="Horizontal" VerticalAlignment="Center" HorizontalAlignment="Right" Margin="0,10,0,10" Width="430">
                     <TextBlock x:Name="HeaderTextBlock2"
                                 Style="{StaticResource Header2}" 
                                 Text="Running Programs" RenderTransformOrigin="0.548,1.689" Margin="0,0,0,0" HorizontalAlignment="Right"/>
-                    <Button Width="110" Margin="70,0,0,0" ToolTip="Refresh" Click="RefreshButton_Click">
+                    <Button Width="110" Margin="150,0,0,0" ToolTip="Refresh" Click="RefreshButton_Click">
                         <TextBlock Text="Click to Refresh"/>
                     </Button>
                 </StackPanel>
             </Grid>
         </StackPanel>
-        <ScrollViewer VerticalScrollBarVisibility="Auto" Margin="20,215,20,8" Width="400px" HorizontalAlignment="Left">
+        <ScrollViewer VerticalScrollBarVisibility="Auto" Margin="20,225,20,8" Width="400px" HorizontalAlignment="Left">
             <StackPanel x:Name="ItemsPanel" />
         </ScrollViewer>
-        <ScrollViewer VerticalScrollBarVisibility="Auto" Margin="20,215,20,8" Width="400px" HorizontalAlignment="Right">
+        <ScrollViewer VerticalScrollBarVisibility="Auto" Margin="20,225,20,8" Width="400px" HorizontalAlignment="Right">
             <StackPanel x:Name="ItemsPanel2" />
         </ScrollViewer>
 
diff --git a/InnoLabProjektDektopApp/InnoLabProjektDektopApp/Screens/FirstLaunch/03_2ProgramsList.xaml.cs b/InnoLabProjektDektopApp/InnoLabProjektDektopApp/Screens/FirstLaunch/03_2ProgramsList.xaml.cs
index 43feefa..0da899c 100644
--- a/InnoLabProjektDektopApp/InnoLabProjektDektopApp/Screens/FirstLaunch/03_2ProgramsList.xaml.cs
+++ b/InnoLabProjektDektopApp/InnoLabProjektDektopApp/Screens/FirstLaunch/03_2ProgramsList.xaml.cs
@@ -17,6 +17,7 @@ using InnoLabProjektDektopApp.Services;
 using System.Diagnostics;
 using static InnoLabProjektDektopApp.DistractionsList;
 using System;
+using InnoLabProjektDektopApp.Utils;
 
 
 namespace InnoLabProjektDektopApp
@@ -30,7 +31,8 @@ namespace InnoLabProjektDektopApp
         {
             InitializeComponent();
             _jsonFilePath = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Assets", "distractingPrograms.json");
-            LoadCategoryItems();
+            LoadProgramList();
+            RefreshRunningProcessList();
         }
 
         private void SearchBox_TextChanged(object sender, TextChangedEventArgs e)
@@ -101,6 +103,14 @@ namespace InnoLabProjektDektopApp
                 _data["Programs"] = new List<ProcessEntry>();
             }
 
+            // Check if the process is already in the list
+            if (_data["Programs"].Any(p => p.ProcessName.Equals(enteredUrl, StringComparison.CurrentCultureIgnoreCase)))
+            {
+                MessageBox.Show($"Process '{enteredUrl}' is already added.", "Info", MessageBoxButton.OK, MessageBoxImage.Information);
+                UrlInputBox.Clear();
+                return;
+            }
+
             _data["Programs"].Add(new ProcessEntry
             {
                 ProcessName = enteredUrl,
@@ -128,26 +138,29 @@ namespace InnoLabProjektDektopApp
             stackPanel.Children.Add(checkBox);
             ItemsPanel.Children.Add(stackPanel);
 
-            MessageBox.Show($"Process '{enteredUrl}' has been added to the 'Programs' category.", "Success", MessageBoxButton.OK, MessageBoxImage.Information);
-
             // Clear the input field
             UrlInputBox.Clear();
+
+            // Refresh Panel to exclude duplicates
+            RefreshRunningProcessList();
         }
 
         private void RefreshButton_Click(object sender, RoutedEventArgs e)
+        {
+            RefreshRunningProcessList();
+        }
+
+        private void RefreshRunningProcessList()
         {
             var windowedProcesses = ProcessMonitor.GetWindowedProcesses();
             ItemsPanel2.Children.Clear();
             foreach (var process in windowedProcesses)
             {
                 // check if the process is not already in the list
-                if(_data["Programs"].Any(p => p.ProcessName == process.Name.ToLower())) continue;
+                if (_data["Programs"].Any(p => p.ProcessName.Equals(process.Name, StringComparison.CurrentCultureIgnoreCase))) continue;
 
                 var stackPanel = new StackPanel { Orientation = Orientation.Horizontal, Margin = new Thickness(5, 2, 5, 2) };
 
-                // a button with the tag "+"next to the button write the processName: mainWindowTitle
-                // if a process has been added to the left list (clicked the Add button), delete its entry from the right list
-
                 var button = new Button
                 {
                     Content = "+",
@@ -157,46 +170,14 @@ namespace InnoLabProjektDektopApp
 
                 var textBlock = new TextBlock
                 {
-                    Text = $"{process.Name}: {process.MainWindowTitle}",
-                    Margin = new Thickness(5)
+                    Text = $"{process.MainWindowTitle} ({process.Name})",
+                    Margin = new Thickness(5),
+                    ToolTip = $"{process.MainWindowTitle} ({process.Name})"
                 };
 
                 button.Click += (s, args) =>
                 {
-                    var processName = process.Name;
-                    var mainWindowTitle = process.MainWindowTitle;
-                    // Check if the process is already in the list
-                    if (_data.ContainsKey("Programs") && _data["Programs"].Any(p => p.ProcessName == processName))
-                    {
-                        MessageBox.Show($"Process '{processName}' is already added.", "Info", MessageBoxButton.OK, MessageBoxImage.Information);
-                        return;
-                    }
-                    // Add the process to the list
-                    if (!_data.ContainsKey("Programs"))
-                    {
-                        _data["Programs"] = new List<ProcessEntry>();
-                    }
-                    _data["Programs"].Add(new ProcessEntry
-                    {
-                        ProcessName = processName,
-                        MainWindowTitle = mainWindowTitle,
-                        IsDistracting = true
-                    });
-                    // Save changes to the JSON
-                    SaveData();
-                    // Add to UI dynamically
-                    var newStackPanel = new StackPanel { Orientation = Orientation.Horizontal, Margin = new Thickness(5, 2, 5, 2) };
-                    var newCheckBox = new CheckBox
-                    {
-                        Content = $"{processName}: {mainWindowTitle}",
-                        Margin = new Thickness(5),
-                        IsChecked = true,
-                        Tag = new ProcessEntry { ProcessName = processName, MainWindowTitle = mainWindowTitle, IsDistracting = true }
-                    };
-                    newCheckBox.Checked += CheckBox_CheckedChanged;
-                    newCheckBox.Unchecked += CheckBox_CheckedChanged;
-                    newStackPanel.Children.Add(newCheckBox);
-                    ItemsPanel.Children.Add(newStackPanel);
+                    AddProcessFromList(process.Name, process.MainWindowTitle);
                 };
 
                 stackPanel.Children.Add(button);
@@ -205,6 +186,84 @@ namespace InnoLabProjektDektopApp
             }
         }
 
+        private void AddProcessFromList(string processName, string mainWindowTitle)
+        {
+            // Check if the process is already in the list
+            if (_data.TryGetValue("Programs", out List<ProcessEntry>? value) && value.Any(p => p.ProcessName.Equals(processName, StringComparison.CurrentCultureIgnoreCase)))
+            {
+                MessageBox.Show($"Process '{processName}' is already added.", "Info", MessageBoxButton.OK, MessageBoxImage.Information);
+                return;
+            }
+
+            //show a message box to give the user the option to change the main window title
+            var inputDialog = new InputDialog("Enter a new Title:", mainWindowTitle); // Assuming InputDialog is a custom dialog
+            if (inputDialog.ShowDialog() == true)
+            {
+                mainWindowTitle = inputDialog.Input; // Get updated title
+            }
+
+            if (inputDialog.DialogResult == false) return;
+
+
+            // Add the process to the list
+            if (!_data.ContainsKey("Programs"))
+            {
+                _data["Programs"] = [];
+            }
+            _data["Programs"].Add(new ProcessEntry
+            {
+                ProcessName = processName,
+                MainWindowTitle = mainWindowTitle,
+                IsDistracting = true
+            });
+
+            ShowNewItemInList(processName, mainWindowTitle, true);
+            RefreshRunningProcessList();
+
+            // Save changes to the JSON
+            SaveData();
+        }
+
+        private void ShowNewItemInList(string processName, string mainWindowTitle, bool isDistracting)
+        {
+            // Add to UI dynamically
+            var newStackPanel = new StackPanel { Orientation = Orientation.Horizontal, Margin = new Thickness(5, 2, 5, 2) };
+            var newCheckBox = new CheckBox
+            {
+                Content = $"{mainWindowTitle} ({processName})",
+                Margin = new Thickness(5),
+                IsChecked = true,
+                ToolTip = $"{mainWindowTitle} ({processName})",
+                Tag = new ProcessEntry { ProcessName = processName, MainWindowTitle = mainWindowTitle, IsDistracting = true }
+            };
+            newCheckBox.Checked += CheckBox_CheckedChanged;
+            newCheckBox.Unchecked += CheckBox_CheckedChanged;
+
+            var editButton = new Button
+            {
+                Content = "Edit",
+                Margin = new Thickness(5, 0, 0, 0),
+                Tag = newCheckBox // Store reference to checkbox for easier editing
+            };
+            editButton.Click += (s, e) => EditItemInList(processName, mainWindowTitle);
+
+            newStackPanel.Children.Add(newCheckBox);
+            newStackPanel.Children.Add(editButton);
+            ItemsPanel.Children.Add(newStackPanel);
+        }
+
+        private void EditItemInList(string processName, string mainWindowTitle)
+        {
+            var inputDialog = new InputDialog("Enter a new Title:", mainWindowTitle);
+            inputDialog.ShowDialog();
+            if (inputDialog.DialogResult == false || inputDialog.Input.Length == 0) return;
+
+            _data["Programs"].FirstOrDefault(p => p.ProcessName.Equals(processName, StringComparison.CurrentCultureIgnoreCase))!.MainWindowTitle = inputDialog.Input;
+
+            SaveData();
+            RefreshProgramList();
+        }
+
 
         private void UrlInputBox_TextChanged(object sender, TextChangedEventArgs e)
         {
@@ -219,16 +278,19 @@ namespace InnoLabProjektDektopApp
             }
         }
 
-        private void LoadCategoryItems()
+        public void RefreshProgramList()
         {
-            try
-            {
-                LoadProgramList();
-            }
-            catch (Exception ex)
+            ItemsPanel.Children.Clear();
+
+            // Kategorie-Elemente laden
+            var items = _data["Programs"];
+            foreach (var item in items)
             {
-                MessageBox.Show($"Error loading items: {ex.Message}");
+                ShowNewItemInList(item.ProcessName, item.MainWindowTitle, item.IsDistracting);
             }
+
+            // Überschrift setzen
+            HeaderTextBlock.Text = "Programs";
         }
 
         public void LoadProgramList()
@@ -247,24 +309,7 @@ namespace InnoLabProjektDektopApp
                     var items = _data["Programs"];
                     foreach (var item in items)
                     {
-                        // Checkbox erstellen
-                        var stackPanel = new StackPanel { Orientation = Orientation.Horizontal, Margin = new Thickness(5, 2, 5, 2) };
-
-                        var checkBox = new CheckBox
-                        {
-                            Content = $"{item.ProcessName}: {item.MainWindowTitle}",
-                            Margin = new Thickness(5),
-                            IsChecked = item.IsDistracting,
-                            Tag = item // Speichert die Referenz zum Item
-                        };
-
-                        checkBox.Checked += CheckBox_CheckedChanged;
-                        checkBox.Unchecked += CheckBox_CheckedChanged;
-
-                        stackPanel.Children.Add(checkBox);
-
-                        // Elemente zur Liste hinzufügen
-                        ItemsPanel.Children.Add(stackPanel);
+                        ShowNewItemInList(item.ProcessName, item.MainWindowTitle, item.IsDistracting);
                     }
 
                     // Überschrift setzen
@@ -279,12 +324,6 @@ namespace InnoLabProjektDektopApp
             {
                 MessageBox.Show($"Error loading items: {ex.Message}");
             }
-
-            var processes = ProcessMonitor.GetWindowedProcesses();
-            foreach (var process in processes)
-            {
-                Debug.WriteLine($"Process: {process.Name}, Title: {process.MainWindowTitle}");
-            }
         }
 
 
diff --git a/InnoLabProjektDektopApp/InnoLabProjektDektopApp/Services/ProcessMonitor.cs b/InnoLabProjektDektopApp/InnoLabProjektDektopApp/Services/ProcessMonitor.cs
index b13ca92..026c355 100644
--- a/InnoLabProjektDektopApp/InnoLabProjektDektopApp/Services/ProcessMonitor.cs
+++ b/InnoLabProjektDektopApp/InnoLabProjektDektopApp/Services/ProcessMonitor.cs
@@ -25,7 +25,7 @@ namespace InnoLabProjektDektopApp.Services
         public ProcessMonitor()
         {
             blockedProcesses = LoadBlockedProcesses();
-
+            
         }
 
         public async void StartMonitoring()
@@ -76,6 +76,7 @@ namespace InnoLabProjektDektopApp.Services
         {
             var processes = Process.GetProcesses()
                                    .Where(p => !string.IsNullOrWhiteSpace(p.MainWindowTitle))
+                                   .Where(p => p.ProcessName.ToLower() != "coflow")
                                    .Select(p => (p.ProcessName, p.MainWindowTitle))
                                    .ToList();
             return processes;
diff --git a/InnoLabProjektDektopApp/InnoLabProjektDektopApp/Utils/InputDialog.xaml b/InnoLabProjektDektopApp/InnoLabProjektDektopApp/Utils/InputDialog.xaml
new file mode 100644
index 0000000..c479217
--- /dev/null
+++ b/InnoLabProjektDektopApp/InnoLabProjektDektopApp/Utils/InputDialog.xaml
@@ -0,0 +1,14 @@
+<Window x:Class="InnoLabProjektDektopApp.Utils.InputDialog"
+        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+        Title="Input Dialog" Height="150" Width="300" WindowStartupLocation="CenterOwner">
+    <StackPanel Margin="10">
+        <TextBlock x:Name="PromptText" Text="Enter your input:" Margin="0,0,0,10" TextWrapping="Wrap"/>
+        <TextBox x:Name="InputTextBox" Margin="0,0,0,10"/>
+        <StackPanel Orientation="Horizontal" HorizontalAlignment="Right">
+            <Button Content="OK" Click="OK_Click" Width="75" Margin="0,0,10,0" IsDefault="True"/>
+            <Button Content="Cancel" Click="Cancel_Click" Width="75" IsCancel="True"/>
+        </StackPanel>
+    </StackPanel>
+</Window>
+
diff --git a/InnoLabProjektDektopApp/InnoLabProjektDektopApp/Utils/InputDialog.xaml.cs b/InnoLabProjektDektopApp/InnoLabProjektDektopApp/Utils/InputDialog.xaml.cs
new file mode 100644
index 0000000..a335da0
--- /dev/null
+++ b/InnoLabProjektDektopApp/InnoLabProjektDektopApp/Utils/InputDialog.xaml.cs
@@ -0,0 +1,33 @@
+using System.Windows;
+
+namespace InnoLabProjektDektopApp.Utils
+{
+    /// <summary>
+    /// Interaction logic for InputDialog.xaml
+    /// </summary>
+    public partial class InputDialog : Window
+    {
+        public string Input { get; private set; }
+
+        public InputDialog(string prompt, string defaultValue = "")
+        {
+            InitializeComponent();
+            PromptText.Text = prompt; // Ensure XAML has a TextBlock named PromptText
+            InputTextBox.Text = defaultValue; // Ensure XAML has a TextBox named InputTextBox
+            InputTextBox.Focus();
+        }
+
+        private void OK_Click(object sender, RoutedEventArgs e)
+        {
+            Input = InputTextBox.Text;
+            DialogResult = true; // Sets DialogResult and allows the window to close
+            Close();
+        }
+
+        private void Cancel_Click(object sender, RoutedEventArgs e)
+        {
+            DialogResult = false; // Indicates cancellation
+            Close();
+        }
+    }
+}
-- 
GitLab