using System.Drawing; using System.Windows.Forms; using StarfaceOutlookSync.Models; using StarfaceOutlookSync.Services; namespace StarfaceOutlookSync.UI { public class SettingsForm : Form { private CheckBox _chkStartMinimized, _chkSyncOnStart, _chkAutoAcceptOutlook; private CheckBox _chkNotifGeneral, _chkNotifWarn; private CheckBox _chkAutostartUser, _chkAutostartAll; private NumericUpDown _numLogRetention; private TextBox _txtSharedDir; private Button _btnBrowseShared; private Button _btnSave, _btnCancel; private readonly UserSettings _settings; public SettingsForm() { _settings = UserSettings.Load(); InitializeComponent(); } private void InitializeComponent() { Text = "Einstellungen"; Size = new Size(380, 250); FormBorderStyle = FormBorderStyle.FixedDialog; MaximizeBox = false; MinimizeBox = false; StartPosition = FormStartPosition.CenterParent; Font = new Font("Segoe UI", 9); _chkStartMinimized = new CheckBox { Text = "Minimiert starten (nur im System Tray)", Left = 20, Top = 24, AutoSize = true, Checked = _settings.StartMinimized }; _chkSyncOnStart = new CheckBox { Text = "Beim Start automatisch synchronisieren", Left = 20, Top = 52, AutoSize = true, Checked = _settings.SyncOnStart }; _chkAutoAcceptOutlook = new CheckBox { Text = "Outlook-Sicherheitsabfrage automatisch erlauben", Left = 20, Top = 80, AutoSize = true, Checked = _settings.AutoAcceptOutlookPrompt }; var hintText = "Hinweis: Outlook muss nach Aenderung neu gestartet werden."; if (UserSettings.IsOutlookSecurityLockedByPolicy()) hintText += "\nAuf Domaenen-PCs: App einmalig als Admin starten!"; var lblHint = new Label { Text = hintText, Left = 38, Top = 102, Width = 320, Height = 36, ForeColor = UserSettings.IsOutlookSecurityLockedByPolicy() ? Color.OrangeRed : Color.Gray, Font = new Font("Segoe UI", 8) }; _chkNotifGeneral = new CheckBox { Text = "Tray-Benachrichtigungen (allgemein)", Left = 20, Top = 144, AutoSize = true, Checked = _settings.NotificationsEnabled }; _chkNotifWarn = new CheckBox { Text = "Benachrichtigungen bei Warnungen/Fehlern (Konflikte, Fehler)", Left = 20, Top = 170, AutoSize = true, Checked = _settings.NotifyWarningsErrors }; var lblLogRetention = new Label { Text = "Protokoll auto-leeren - Eintraege aelter als (Tage, 0 = aus):", Left = 20, Top = 204, AutoSize = true }; _numLogRetention = new NumericUpDown { Left = 305, Top = 200, Width = 55, Minimum = 0, Maximum = 3650, Value = System.Math.Max(0, System.Math.Min(3650, _settings.LogRetentionDays)) }; var lblShared = new Label { Text = "Gemeinsames Verzeichnis fuer Sync-Sperre (Mehrplatz, optional):", Left = 20, Top = 240, AutoSize = true }; _txtSharedDir = new TextBox { Left = 20, Top = 262, Width = 250, Text = _settings.SharedDirectory }; _btnBrowseShared = new Button { Text = "...", Left = 274, Top = 261, Width = 36, Height = 24 }; _btnBrowseShared.Click += (s, e) => BrowseSharedDir(); var lblSharedHint = new Label { Text = "Netzlaufwerk/UNC, das alle Arbeitsplaetze erreichen. Leer = keine\n" + "clientuebergreifende Sperre (nur Schutz auf diesem PC).", Left = 20, Top = 288, Width = 330, Height = 32, ForeColor = Color.Gray, Font = new Font("Segoe UI", 8) }; // === Autostart === bool isAdmin = AutostartManager.IsAdmin(); var lblAutostart = new Label { Text = "Autostart (bei Windows-Anmeldung starten)", Left = 12, Top = 332, AutoSize = true, Font = new Font("Segoe UI", 10, FontStyle.Bold) }; _chkAutostartUser = new CheckBox { Text = "Nur fuer diesen Benutzer", Left = 20, Top = 360, AutoSize = true, Checked = AutostartManager.GetUserAutostart() }; _chkAutostartAll = new CheckBox { Text = "Fuer alle Benutzer" + (isAdmin ? "" : " (nur mit Admin-Rechten aenderbar)"), Left = 20, Top = 386, AutoSize = true, Checked = AutostartManager.GetMachineAutostart(), Enabled = isAdmin }; _btnSave = new Button { Text = "Speichern", Left = 95, Top = 422, Width = 85, Height = 28, DialogResult = DialogResult.None }; _btnSave.Click += (s, e) => Save(); _btnCancel = new Button { Text = "Abbrechen", Left = 189, Top = 422, Width = 85, Height = 28, DialogResult = DialogResult.Cancel }; Size = new Size(380, 512); Controls.AddRange(new Control[] { _chkStartMinimized, _chkSyncOnStart, _chkAutoAcceptOutlook, lblHint, _chkNotifGeneral, _chkNotifWarn, lblLogRetention, _numLogRetention, lblShared, _txtSharedDir, _btnBrowseShared, lblSharedHint, lblAutostart, _chkAutostartUser, _chkAutostartAll, _btnSave, _btnCancel }); AcceptButton = _btnSave; CancelButton = _btnCancel; } private void BrowseSharedDir() { using (var dlg = new FolderBrowserDialog()) { dlg.Description = "Gemeinsames Verzeichnis fuer die Sync-Sperre waehlen"; if (!string.IsNullOrWhiteSpace(_txtSharedDir.Text)) { try { dlg.SelectedPath = _txtSharedDir.Text; } catch { } } if (dlg.ShowDialog(this) == DialogResult.OK) _txtSharedDir.Text = dlg.SelectedPath; } } private void Save() { _settings.StartMinimized = _chkStartMinimized.Checked; _settings.SyncOnStart = _chkSyncOnStart.Checked; _settings.AutoAcceptOutlookPrompt = _chkAutoAcceptOutlook.Checked; _settings.NotificationsEnabled = _chkNotifGeneral.Checked; _settings.NotifyWarningsErrors = _chkNotifWarn.Checked; _settings.LogRetentionDays = (int)_numLogRetention.Value; _settings.SharedDirectory = _txtSharedDir.Text.Trim(); _settings.Save(); // Sofort anwenden, damit der Effekt direkt sichtbar ist. Logger.PruneOlderThan(_settings.LogRetentionDays); // Autostart (Registry). Pro Benutzer immer; alle Benutzer nur mit Admin. AutostartManager.SetUserAutostart(_chkAutostartUser.Checked); if (AutostartManager.IsAdmin()) { if (!AutostartManager.SetMachineAutostart(_chkAutostartAll.Checked)) MessageBox.Show(this, "Autostart fuer alle Benutzer konnte nicht geaendert werden (Rechte?).", "Autostart", MessageBoxButtons.OK, MessageBoxIcon.Warning); } DialogResult = DialogResult.OK; Close(); } } }