package de.jigp.plugin.configuration;
import de.jigp.plugin.GeneratorPluginContext;
import de.jigp.plugin.configuration.TypeToTextMapping.Entry;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.Arrays;
public class TypeToTextPanel extends JPanel implements ActionListener, ItemListener {
private Object[][] initializerRowData;
private JTable tableVariableInitializers;
private DefaultTableModel tableModel;
private JButton addButton;
private JButton removeButton;
private JCheckBox isEnabled;
private boolean isEnabledState = true;
private GridBagConstraints constraints;
private JPanel buttonPanel;
private JScrollPane tablePane;
public TypeToTextPanel(TypeToTextMapping mapping, String activationText) {
initLayout();
createEnableCheckbox(mapping, activationText);
createTablePanel(mapping);
createButtonPanel();
setXY(0, 0);
this.add(isEnabled, constraints);
setXY(0, 1);
constraints.anchor = GridBagConstraints.CENTER;
constraints.fill = GridBagConstraints.HORIZONTAL;
this.add(tablePane, constraints);
setXY(0, 2);
this.add(buttonPanel, constraints);
this.updateUI();
}
private void setXY(int x, int y) {
constraints.gridx = x;
constraints.gridy = y;
}
private void createButtonPanel() {
buttonPanel = new JPanel();
addButton = new JButton("new");
addButton.addActionListener(this);
removeButton = new JButton("remove selected");
removeButton.addActionListener(this);
this.buttonPanel.add(addButton);
buttonPanel.add(removeButton);
}
private void initLayout() {
setLayout(new GridBagLayout());
constraints = new GridBagConstraints();
constraints.anchor = GridBagConstraints.LINE_START;
constraints.weightx = 1.0;
}
private void createEnableCheckbox(TypeToTextMapping mapping, String activationText) {
isEnabled = new JCheckBox(activationText);
isEnabled.setEnabled(mapping != null ? mapping.isMappingActive : isEnabledState);
isEnabled.addItemListener(this);
}
private void createTablePanel(TypeToTextMapping mapping) {
createInitializerTableRowData(mapping);
tableModel = createTableModel();
tableVariableInitializers = new JTable(tableModel);
setTableColumnWidths();
tablePane = new JScrollPane(tableVariableInitializers);
}
private void createInitializerTableRowData(TypeToTextMapping mapping) {
if (mapping == null) {
//TODO wrong initialization
mapping = GeneratorPluginContext.getConfiguration().variableInitializers;
}
initializerRowData = new Object[mapping.size()][3];
int i = 0;
// TODO sort it
for (Entry entry : mapping.entries()) {
initializerRowData[i++] = new Object[]{entry.type, entry.text, (Boolean) entry.isAddRemoveMethodRequested};
}
}
protected DefaultTableModel createTableModel() {
String[] columNames = {"type (full qualified)", "initializer expression", "generate add/remove"};
DefaultTableModel defaultTableModel = new DefaultTableModel(initializerRowData, columNames) {
public boolean isCellEditable(int row, int col) {
return true;
}
@Override
public Class<?> getColumnClass(int i) {
if (i == 2) {
return Boolean.class;
}
return super.getColumnClass(i);
}
};
return defaultTableModel;
}
private void setTableColumnWidths() {
tableVariableInitializers.getColumnModel().getColumn(0).setPreferredWidth(900);
tableVariableInitializers.getColumnModel().getColumn(1).setPreferredWidth(900);
tableVariableInitializers.getColumnModel().getColumn(2).setPreferredWidth(100);
}
public TypeToTextMapping getMapping() {
TypeToTextMapping mapping = new TypeToTextMapping();
for (int i = 0; i < tableModel.getRowCount(); i++) {
mapping.put(
(String) tableModel.getValueAt(i, 0),
(String) tableModel.getValueAt(i, 1),
(Boolean) tableModel.getValueAt(i, 2));
}
mapping.setMappingActive(isEnabledState);
return mapping;
}
private void deleteRows(int[] rows) {
Arrays.sort(rows);
for (int i = rows.length - 1; i >= 0; i--) {
tableModel.removeRow(rows[i]);
}
}
private void addNewRow() {
tableModel.insertRow(0, new Object[]{"new type", "new initializer expression", Boolean.FALSE});
}
public void init(TypeToTextMapping typeToTextMapping) {
createInitializerTableRowData(typeToTextMapping);
tableModel = createTableModel();
tableVariableInitializers.setModel(tableModel);
tableVariableInitializers.updateUI();
isEnabledState = typeToTextMapping.isMappingActive;
isEnabled.setSelected(isEnabledState);
}
public void actionPerformed(ActionEvent actionEvent) {
if (actionEvent.getSource().equals(addButton)) {
addNewRow();
} else if (actionEvent.getSource().equals(removeButton)) {
deleteRows(tableVariableInitializers.getSelectedRows());
}
}
public void itemStateChanged(ItemEvent itemEvent) {
if (itemEvent.getItemSelectable().equals(isEnabled)) {
isEnabledState = itemEvent.getStateChange() == ItemEvent.SELECTED;
}
}
}