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 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 folderPaths, string currentSelection) { _tree.Nodes.Clear(); var nodeMap = new Dictionary(); 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(); } } }