254 lines
9.6 KiB
C#
254 lines
9.6 KiB
C#
using CPM;
|
|
using DAL;
|
|
using System;
|
|
using System.Drawing;
|
|
using System.Windows.Forms;
|
|
|
|
namespace UI
|
|
{
|
|
/// <summary>
|
|
/// Modelo base para todos os formulários do sistema.
|
|
/// Herde esta classe e implemente os membros abstratos.
|
|
/// </summary>
|
|
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!;
|
|
|
|
/// <summary>Título exibido no cabeçalho do formulário.</summary>
|
|
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 ────────────────────────────
|
|
|
|
/// <summary>Cria um cabeçalho de seção com linha separadora.</summary>
|
|
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;
|
|
}
|
|
|
|
/// <summary>Cria um campo LV_TEXTBOX1 com label acima.</summary>
|
|
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;
|
|
}
|
|
|
|
/// <summary>Cria um CheckBox padrão do sistema.</summary>
|
|
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
|
|
};
|
|
|
|
/// <summary>Cria um botão extra para a toolbar (ex: Ficha PDF, Certificado).</summary>
|
|
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 }
|
|
};
|
|
|
|
/// <summary>Adiciona um botão extra na toolbar (após os padrões).</summary>
|
|
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();
|
|
}
|
|
} |