package com.totvslabs.mdm.client.ui;
import java.awt.Color;
import java.awt.Component;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.List;
import javax.swing.BorderFactory;
import javax.swing.JComponent;
import javax.swing.JPanel;
import javax.swing.text.MaskFormatter;
import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;
import com.totvslabs.mdm.client.pojoTSA.MasterConfigurationData;
public abstract class PanelAbstract extends JPanel {
private static final long serialVersionUID = 1L;
protected CellConstraints cc;
private FormLayout layoutGeneral;
private Integer actualRow = 2;
protected final List<JComponent> fieldsToNotEnable = new ArrayList<JComponent>();
protected final List<JComponent> fieldsToNotDisable = new ArrayList<JComponent>();
public PanelAbstract(int colNumber, int rowNumber, String borderName){
this.setCc(new CellConstraints());
this.setLayoutGeneral(new FormLayout( "30px, " + this.generateStringLayout(colNumber, 300) + ", 30px", "10px, " + this.generateStringLayout(rowNumber, 21) + ", 10px" ));
this.setLayout(this.getLayoutGeneral());
// this.setBackground(Color.GREEN);
this.setBorder( BorderFactory.createTitledBorder(borderName) );
}
public static MaskFormatter getMaskFormatter(String mask) {
MaskFormatter maskFormatter = null;
try {
maskFormatter = new MaskFormatter(mask);
maskFormatter.setPlaceholderCharacter('_');
} catch (ParseException e) {
}
return maskFormatter;
}
private String generateStringLayout(int number, int size) {
StringBuilder sb = new StringBuilder();
for(int i=0; i<number; i++) {
sb.append(size);
if(i<number+1) {
sb.append(", ");
}
}
return sb.toString();
}
protected void add(JComponent[] components, int rowSpan) {
if(components != null) {
int colNumber = 2;
for (JComponent component : components) {
this.add(component, colNumber, false, rowSpan);
colNumber++;
}
this.actualRow = rowSpan + this.actualRow;
}
}
protected void add(JComponent[] components) {
this.add(components, 1);
}
public abstract void initializeLayout();
public abstract void fillComponents(MasterConfigurationData masterConfigurationData);
public abstract void fillData(MasterConfigurationData masterConfigurationData);
public void disableFields() {
disableFields(this);
}
public void enableDisableField(JComponent component, boolean enable) {
component.setEnabled(enable);
if(enable) {
this.fieldsToNotEnable.remove(component);
}
else {
this.fieldsToNotEnable.add(component);
}
}
public void disableFields(JPanel panel) {
Component[] components = panel.getComponents();
if(components != null) {
for (Component component : components) {
if(component instanceof JPanel) {
disableFields((JPanel) component);
}
else {
processEnableDisableComponent(component, false);
}
}
}
}
public void enableFields() {
enableFields(this);
}
private void enableFields(JPanel panel) {
Component[] components = panel.getComponents();
if(components != null) {
for (Component component : components) {
if(component instanceof JPanel) {
enableFields((JPanel) component);
}
else {
processEnableDisableComponent(component, true);
}
}
}
}
private void processEnableDisableComponent(Component component, boolean enable) {
if((!enable && !fieldsToNotDisable.contains(component)) || (enable && !fieldsToNotEnable.contains(component))) {
component.setEnabled(enable);
}
}
protected void add(JComponent component) {
this.add(component, 2);
}
protected void add(JComponent component, int colNumber) {
this.add(component, colNumber, true);
}
protected void add(JComponent component, int colNumber, boolean addRow) {
this.add(component, colNumber, addRow, 1);
}
protected void add(final JComponent component, int colNumber, boolean addRow, int rowSpan, int colSpan) {
this.add(component, this.cc.xywh(colNumber, this.actualRow, colSpan, rowSpan));
if(addRow) {
this.actualRow = this.actualRow + rowSpan;
}
}
protected void add(final JComponent component, int colNumber, boolean addRow, int rowSpan) {
this.add(component, colNumber, addRow, rowSpan, 1);
}
public CellConstraints getCc() {
return cc;
}
public void setCc(CellConstraints cc) {
this.cc = cc;
}
public FormLayout getLayoutGeneral() {
return layoutGeneral;
}
public void setLayoutGeneral(FormLayout layoutGeneral) {
this.layoutGeneral = layoutGeneral;
}
}