using CPM;
using DAL;
using System;
using System.Drawing;
using System.Windows.Forms;
namespace LevelOS
{
///
/// 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();
}
}