using CPM; using DAL; using System; using System.Drawing; using System.Windows.Forms; namespace UI { /// /// Modelo base para todos os formulários do sistema. /// Herde esta classe e implemente os membros abstratos. /// public abstract class FormularioModelo : UserControl { // ── CONEXÃO ─────────────────────────────────────────────────────────── protected string _cx = DadosDaConexao.ObterConexao(); // ── CORES DO SISTEMA ────────────────────────────────────────────────── protected readonly Color AccentBlue = Color.FromArgb(37, 99, 235); protected readonly Color TextDark = Color.FromArgb(30, 41, 59); protected readonly Color BorderColor = Color.FromArgb(226, 232, 240); protected readonly Color BgLight = Color.FromArgb(248, 250, 252); protected readonly Color ReadOnlyBg = Color.FromArgb(241, 245, 249); protected readonly Color ReadOnlyBorder = Color.FromArgb(203, 213, 225); // ── PAINÉIS ESTRUTURAIS ─────────────────────────────────────────────── protected Panel pnlToolbar = null!; protected Panel pnlTitulo = null!; protected Panel mainScroll = null!; protected Panel content = null!; // ── BOTÕES DA TOOLBAR ───────────────────────────────────────────────── protected Button btnNovo = null!; protected Button btnAlterar = null!; protected Button btnExcluir = null!; protected Button btnLocalizar = null!; protected Button btnSalvar = null!; protected Button btnCancelar = null!; // ── TÍTULO ──────────────────────────────────────────────────────────── private Label lblTitulo = null!; /// Título exibido no cabeçalho do formulário. public string Titulo { get => lblTitulo.Text; set => lblTitulo.Text = value; } // ── CONSTRUTOR ──────────────────────────────────────────────────────── protected FormularioModelo() { Dock = DockStyle.Fill; BackColor = Color.White; DoubleBuffered = true; BuildToolbar(); BuildTitulo(); BuildScrollArea(); // Liga os eventos abstratos btnNovo.Click += (s, e) => OnNovo(); btnAlterar.Click += (s, e) => OnAlterar(); btnExcluir.Click += (s, e) => OnExcluir(); btnLocalizar.Click += (s, e) => OnLocalizar(); btnSalvar.Click += (s, e) => OnSalvar(); btnCancelar.Click += (s, e) => OnCancelar(); } // ── CONSTRUÇÃO DA INTERFACE ─────────────────────────────────────────── private void BuildToolbar() { pnlToolbar = new Panel { Dock = DockStyle.Top, Height = 55, BackColor = Color.FromArgb(248, 250, 252) }; var flow = new FlowLayoutPanel { Dock = DockStyle.Fill, Padding = new Padding(12, 10, 0, 0), BackColor = Color.Transparent }; btnNovo = CreateToolbarButton("Novo", Color.FromArgb(34, 197, 94)); btnAlterar = CreateToolbarButton("Alterar", Color.FromArgb(245, 158, 11)); btnExcluir = CreateToolbarButton("Excluir", Color.FromArgb(239, 68, 68)); btnLocalizar = CreateToolbarButton("Localizar", AccentBlue); btnSalvar = CreateToolbarButton("Salvar", AccentBlue); btnCancelar = CreateToolbarButton("Cancelar", Color.FromArgb(148, 163, 184)); flow.Controls.AddRange(new Control[] { btnNovo, btnAlterar, btnExcluir, btnLocalizar, btnSalvar, btnCancelar }); pnlToolbar.Controls.Add(flow); this.Controls.Add(pnlToolbar); } private void BuildTitulo() { pnlTitulo = new Panel { Dock = DockStyle.Top, Height = 42, BackColor = Color.White }; // Linha separadora no topo do título var linha = new Panel { Dock = DockStyle.Top, Height = 1, BackColor = BorderColor }; lblTitulo = new Label { Dock = DockStyle.Fill, Text = "Título do Formulário", Font = new Font("Segoe UI", 13f, FontStyle.Bold), ForeColor = AccentBlue, TextAlign = ContentAlignment.MiddleLeft, Padding = new Padding(16, 0, 0, 0) }; pnlTitulo.Controls.Add(lblTitulo); pnlTitulo.Controls.Add(linha); this.Controls.Add(pnlTitulo); } private void BuildScrollArea() { mainScroll = new Panel { Dock = DockStyle.Fill, AutoScroll = true, BackColor = Color.White }; content = new Panel { Width = 1100, Height = 900, Location = new Point(0, 0), BackColor = Color.White }; mainScroll.Controls.Add(content); this.Controls.Add(mainScroll); mainScroll.BringToFront(); } // ── HELPERS DISPONÍVEIS PARA AS SUBCLASSES ──────────────────────────── /// Cria um cabeçalho de seção com linha separadora. protected Panel CreateSectionHeader(string title, int y) { var pnl = new Panel { Location = new Point(20, y), Width = 1000, Height = 26 }; var lbl = new Label { Text = title, Font = new Font("Segoe UI", 8.5f, FontStyle.Bold), ForeColor = AccentBlue, AutoSize = true, Location = new Point(0, 0) }; var line = new Panel { BackColor = BorderColor, Height = 1, Width = 980, Location = new Point(0, 20) }; pnl.Controls.Add(lbl); pnl.Controls.Add(line); return pnl; } /// Cria um campo LV_TEXTBOX1 com label acima. protected LV_TEXTBOX1 AddInput(Control parent, string label, int x, int y, int width, int height, bool readOnly = false) { var lbl = new Label { Text = label, Location = new Point(x, y), Font = new Font("Segoe UI", 7.5f, FontStyle.Bold), ForeColor = readOnly ? Color.Gray : TextDark, AutoSize = true }; var txt = new LV_TEXTBOX1 { Location = new Point(x, y + 16), Size = new Size(width, height), BorderColor = readOnly ? ReadOnlyBorder : BorderColor, BorderFocusColor = AccentBlue, ReadOnly = readOnly, BackColor = readOnly ? ReadOnlyBg : Color.White }; parent.Controls.Add(lbl); parent.Controls.Add(txt); return txt; } /// Cria um CheckBox padrão do sistema. protected CheckBox CreateCheckBox(string text, int x, int y) => new CheckBox { Text = text, Location = new Point(x, y), Font = new Font("Segoe UI", 8.5f, FontStyle.Bold), ForeColor = TextDark, AutoSize = true }; /// Cria um botão extra para a toolbar (ex: Ficha PDF, Certificado). protected Button CreateToolbarButton(string text, Color color) => new Button { Text = text, Size = new Size(95, 32), BackColor = color, ForeColor = Color.White, Font = new Font("Segoe UI Semibold", 8.5f), Margin = new Padding(0, 0, 6, 0), Cursor = Cursors.Hand, FlatStyle = FlatStyle.Flat, FlatAppearance = { BorderSize = 0 } }; /// Adiciona um botão extra na toolbar (após os padrões). protected void AddToolbarButton(Button btn) { var flow = pnlToolbar.Controls[0] as FlowLayoutPanel; flow?.Controls.Add(btn); } // ── EVENTOS ABSTRATOS (cada formulário implementa o seu) ────────────── protected abstract void OnNovo(); protected abstract void OnAlterar(); protected abstract void OnExcluir(); protected abstract void OnLocalizar(); protected abstract void OnSalvar(); protected abstract void OnCancelar(); } }