package net.codjo.dataprocess.gui.repository;
import net.codjo.dataprocess.common.DataProcessConstants;
import net.codjo.dataprocess.common.context.DataProcessContext;
import net.codjo.dataprocess.common.model.ArgList;
import net.codjo.dataprocess.common.model.ArgModel;
import net.codjo.dataprocess.common.model.ArgModelHelper;
import net.codjo.dataprocess.common.model.TreatmentModel;
import net.codjo.dataprocess.common.util.CommonUtils;
import net.codjo.dataprocess.gui.launcher.configuration.ConfigurationTable;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.swing.AbstractAction;
import javax.swing.InputMap;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.KeyStroke;
import javax.swing.table.DefaultTableModel;
public class ArgumentDialog extends JDialog {
private JPanel contentPane;
private JButton buttonOK;
private ConfigurationTable configurationTable;
private JTextField timeoutTextField;
private JButton annulerButton;
private JLabel treatmentIdLabel;
private JFrame frame;
private TreatmentModel treatmentModel;
private DataProcessContext dataProcessContext;
private boolean cancel;
private Map<String, String> prop = new HashMap<String, String>();
public ArgumentDialog(JFrame frame,
DataProcessContext dataProcessContext,
TreatmentModel treatmentModel) {
super(frame, true);
this.frame = frame;
this.treatmentModel = treatmentModel;
this.dataProcessContext = dataProcessContext;
dataProcessContext.putAllInMap(prop);
setContentPane(contentPane);
getRootPane().setDefaultButton(buttonOK);
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent evt) {
onCancel();
}
});
buttonOK.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
onOK();
}
});
annulerButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
onCancel();
}
});
treatmentIdLabel.setText(treatmentIdLabel.getText() + treatmentModel.getId());
updateArgumentTable();
InputMap inputMap = contentPane.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
inputMap.put(KeyStroke.getKeyStroke("ESCAPE"), "cancel");
contentPane.getActionMap().put("cancel", new AbstractAction() {
public void actionPerformed(ActionEvent evt) {
onCancel();
}
});
pack();
}
public int getTimeout() {
return Integer.parseInt(timeoutTextField.getText());
}
private void onCancel() {
cancel = true;
dispose();
}
private void onOK() {
updateLocalContext();
dataProcessContext.putAll(prop);
dispose();
}
private void createUIComponents() {
configurationTable = new ConfigurationTable(0, 0, true);
configurationTable.initConfigurationTableModel();
}
private void updateArgumentTable() {
int rowNumber = treatmentModel.getArguments().getArgs().size();
DefaultTableModel model = (DefaultTableModel)configurationTable.getModel();
configurationTable.removeAllRows();
if (rowNumber != 0) {
List<ArgModel> arguments = treatmentModel.getArguments().getArgs();
List<String> variables = new ArrayList<String>();
for (ArgModel argument : arguments) {
if (!argument.isFunctionValue()) {
add(model, variables, argument.getValue().trim());
}
else {
List<String> params = argument.getFunctionParams();
for (String param : params) {
add(model, variables, param);
}
}
}
}
configurationTable.setModel(model);
}
private void add(DefaultTableModel model, List<String> variables, String value) {
if (ArgModelHelper.isGlobalValue(value)) {
String data = ArgModelHelper.getGlobalValue(value);
addToModel(data, data, variables, model);
}
else if (ArgModelHelper.isLocalValue(value)) {
value = ArgModelHelper.getLocalValue(value);
addToModel(localify(value),
DataProcessConstants.LOCAL_VISIBILITY + value, variables, model);
}
}
private static String localify(String value) {
return CommonUtils.localify(1000, "XXXXXXXXXX", value);
}
private void addToModel(String data, String view, List<String> variables, DefaultTableModel tableModel) {
Object[] objectsTable = new Object[]{view, prop.get(data)};
if (!variables.contains(view)) {
tableModel.addRow(objectsTable);
variables.add(view);
}
}
private void updateLocalContext() {
ArgList argList = configurationTable.getArglist();
List<ArgModel> arguments = argList.getArgs();
for (ArgModel argument : arguments) {
String name = argument.getName();
String value = argument.getValue();
if (name.startsWith(DataProcessConstants.LOCAL_VISIBILITY)) {
name = localify(name.substring(DataProcessConstants.LOCAL_VISIBILITY.length()).trim());
}
prop.put(name, (value == null) ? "" : value);
}
}
public boolean isCanceled() {
return cancel;
}
public JTextField getTimeoutTextField() {
return timeoutTextField;
}
}