Add Outlook folder browser and user settings
- Replace Outlook folder ComboBox with TextBox + Browse button that opens a TreeView-based folder browser dialog - Add per-user settings stored in %AppData% (not HKLM) with option to start minimized (System Tray only) - Add Settings button to main window - Settings are per-user, independent of profiles Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,125 @@
|
||||
using System;
|
||||
using System.Drawing;
|
||||
using System.Windows.Forms;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace StarfaceOutlookSync.UI
|
||||
{
|
||||
public class OutlookFolderBrowserForm : Form
|
||||
{
|
||||
private TreeView _tree;
|
||||
private Button _btnOk, _btnCancel;
|
||||
public string SelectedFolderPath { get; private set; } = "";
|
||||
public string SelectedFolderName { get; private set; } = "";
|
||||
|
||||
public OutlookFolderBrowserForm(List<string> folderPaths, string currentSelection)
|
||||
{
|
||||
InitializeComponent();
|
||||
BuildTree(folderPaths, currentSelection);
|
||||
}
|
||||
|
||||
private void InitializeComponent()
|
||||
{
|
||||
Text = "Outlook-Ordner waehlen";
|
||||
Size = new Size(400, 450);
|
||||
FormBorderStyle = FormBorderStyle.FixedDialog;
|
||||
MaximizeBox = false;
|
||||
MinimizeBox = false;
|
||||
StartPosition = FormStartPosition.CenterParent;
|
||||
Font = new Font("Segoe UI", 9);
|
||||
|
||||
var lblInfo = new Label
|
||||
{
|
||||
Text = "Bitte waehlen Sie den Outlook-Kontaktordner fuer die Synchronisation:",
|
||||
Left = 12, Top = 12, Width = 360, Height = 36
|
||||
};
|
||||
|
||||
_tree = new TreeView
|
||||
{
|
||||
Left = 12, Top = 52, Width = 360, Height = 310,
|
||||
HideSelection = false,
|
||||
ShowLines = true,
|
||||
ShowPlusMinus = true,
|
||||
ShowRootLines = true
|
||||
};
|
||||
_tree.DoubleClick += (s, e) => { if (_tree.SelectedNode?.Tag != null) SelectAndClose(); };
|
||||
|
||||
_btnOk = new Button
|
||||
{
|
||||
Text = "OK", Left = 210, Top = 372, Width = 75, Height = 28,
|
||||
DialogResult = DialogResult.None
|
||||
};
|
||||
_btnOk.Click += (s, e) => SelectAndClose();
|
||||
|
||||
_btnCancel = new Button
|
||||
{
|
||||
Text = "Abbrechen", Left = 292, Top = 372, Width = 80, Height = 28,
|
||||
DialogResult = DialogResult.Cancel
|
||||
};
|
||||
|
||||
Controls.AddRange(new Control[] { lblInfo, _tree, _btnOk, _btnCancel });
|
||||
AcceptButton = _btnOk;
|
||||
CancelButton = _btnCancel;
|
||||
}
|
||||
|
||||
private void BuildTree(List<string> folderPaths, string currentSelection)
|
||||
{
|
||||
_tree.Nodes.Clear();
|
||||
var nodeMap = new Dictionary<string, TreeNode>();
|
||||
|
||||
foreach (var path in folderPaths)
|
||||
{
|
||||
// Pfad: \\Store\Kontakte\Unterordner
|
||||
var parts = path.TrimStart('\\').Split('\\');
|
||||
string runningPath = "";
|
||||
TreeNode parent = null;
|
||||
|
||||
for (int i = 0; i < parts.Length; i++)
|
||||
{
|
||||
runningPath += "\\" + parts[i];
|
||||
|
||||
if (!nodeMap.ContainsKey(runningPath))
|
||||
{
|
||||
var node = new TreeNode(parts[i]);
|
||||
// Nur Blatt-Knoten oder bekannte Pfade sind waehlbar
|
||||
if (i == parts.Length - 1)
|
||||
node.Tag = path; // Vollstaendiger Pfad
|
||||
|
||||
if (parent == null)
|
||||
_tree.Nodes.Add(node);
|
||||
else
|
||||
parent.Nodes.Add(node);
|
||||
|
||||
nodeMap[runningPath] = node;
|
||||
|
||||
// Aktuellen Ordner vorauswaehlen
|
||||
if (path == currentSelection)
|
||||
{
|
||||
_tree.SelectedNode = node;
|
||||
node.EnsureVisible();
|
||||
}
|
||||
}
|
||||
|
||||
parent = nodeMap[runningPath];
|
||||
}
|
||||
}
|
||||
|
||||
_tree.ExpandAll();
|
||||
}
|
||||
|
||||
private void SelectAndClose()
|
||||
{
|
||||
if (_tree.SelectedNode?.Tag == null)
|
||||
{
|
||||
MessageBox.Show("Bitte einen Kontaktordner waehlen.", "Hinweis",
|
||||
MessageBoxButtons.OK, MessageBoxIcon.Information);
|
||||
return;
|
||||
}
|
||||
|
||||
SelectedFolderPath = _tree.SelectedNode.Tag.ToString();
|
||||
SelectedFolderName = _tree.SelectedNode.Text;
|
||||
DialogResult = DialogResult.OK;
|
||||
Close();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user