using System; using System.Collections.Generic; using System.Linq; using System.Windows.Forms; using PolyTrader.Core.Modularity; namespace PolyTraderSharp.Ui { /// /// Verwaltet die registrierten Fenster-Views: öffnet sie als eigenständige Forms, /// hält je View höchstens eine Instanz offen und holt ein bereits offenes Fenster /// wieder in den Vordergrund. Meldet Änderungen am Offen-Status (für die /// Button-Markierung im Launcher). /// public class ShellUiHost : IModuleUiHost { private readonly List _views = new(); private readonly Dictionary _open = new(); private Form? _mainWindow; /// Wird ausgelöst, wenn sich der Offen-Status irgendeiner View ändert. public event Action? OpenStateChanged; public IReadOnlyList Views => _views; public void RegisterView(ModuleView view) => _views.Add(view); /// Setzt das Hauptfenster (Launcher) – Ziel für . public void SetMainWindow(Form main) => _mainWindow = main; public void ActivateMain() { if (_mainWindow == null || _mainWindow.IsDisposed) return; if (_mainWindow.WindowState == FormWindowState.Minimized) _mainWindow.WindowState = FormWindowState.Maximized; _mainWindow.BringToFront(); _mainWindow.Activate(); } public bool IsOpen(string viewId) => _open.TryGetValue(viewId, out var form) && !form.IsDisposed; public void OpenView(string viewId) { var view = _views.FirstOrDefault(v => v.Id == viewId); if (view != null) OpenView(view); } public void OpenView(ModuleView view) { if (_open.TryGetValue(view.Id, out var existing) && !existing.IsDisposed) { if (existing.WindowState == FormWindowState.Minimized) existing.WindowState = FormWindowState.Normal; existing.BringToFront(); existing.Activate(); return; } var form = view.CreateForm(); if (string.IsNullOrEmpty(form.Text) || form.Text == form.Name) form.Text = view.Title; // Alle Fenster maximiert (Vorgabe): Full-HD-Ziel, skaliert auf größere Auflösungen. form.StartPosition = FormStartPosition.CenterScreen; form.WindowState = FormWindowState.Maximized; _open[view.Id] = form; form.FormClosed += (_, _) => { _open.Remove(view.Id); OpenStateChanged?.Invoke(); }; form.Show(); OpenStateChanged?.Invoke(); } } }