package com.opendoorlogistics.core.scripts.parameters.controls; import java.awt.Dimension; import java.awt.FlowLayout; import java.util.ArrayList; import java.util.List; import java.util.Map; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.JPanel; import com.opendoorlogistics.api.Factory; import com.opendoorlogistics.api.ODLApi; import com.opendoorlogistics.api.StringConventions; import com.opendoorlogistics.api.scripts.parameters.Parameters; import com.opendoorlogistics.api.scripts.parameters.Parameters.ParamDefinitionField; import com.opendoorlogistics.api.scripts.parameters.Parameters.PromptType; import com.opendoorlogistics.api.scripts.parameters.ParametersControlFactory; import com.opendoorlogistics.api.tables.ODLTable; import com.opendoorlogistics.api.tables.ODLTableReadOnly; public class ControlFactory implements ParametersControlFactory { @Override public JPanel createHorizontalPanel(ODLApi api,ODLTable paramTable, ODLTableReadOnly valuesTable) { JPanel ret = new JPanel(); ret.setLayout(new FlowLayout(FlowLayout.LEFT)); addToPanel(api, paramTable, valuesTable, ret, new PromptType[]{PromptType.ATTACH, PromptType.ATTACH_POPUP},true); return ret; } private List<SmartComboBox> addToPanel(ODLApi api, ODLTable paramTable, ODLTableReadOnly valuesTable, JPanel panel, PromptType [] promptTypes, boolean isAttachedPanel) { Parameters parameters = api.scripts().parameters(); StringConventions strings = api.stringConventions(); ArrayList<SmartComboBox> list = new ArrayList<>(); // get values by key Map<String,List<String>> valuesMap = api.stringConventions().createStandardisedMap(new Factory<List<String>>() { @Override public List<String> create() { return new ArrayList<>(); } }); if(valuesTable!=null){ int n = valuesTable.getRowCount(); for(int i =0 ; i < n ; i++){ String key =(String) valuesTable.getValueAt(i, 0); String value =(String)valuesTable.getValueAt(i, 1); if(key!=null){ valuesMap.get(key).add(value); } } } int n = paramTable.getRowCount(); for(int i =0 ; i < n ; i++){ String key = parameters.getByRow(paramTable, i, ParamDefinitionField.KEY); if(!strings.isEmptyString(key)){ PromptType pt = parameters.getPromptType(paramTable, key); boolean accept=false; for(PromptType allowedType : promptTypes){ if(pt==allowedType){ accept = true; } } if(accept){ List<String> possibles = valuesMap.get(key); SmartComboBox box = new SmartComboBox(key, possibles,null,parameters.getColumnType(paramTable, key),isAttachedPanel); box.setValue(parameters.getByKey(paramTable,key, ParamDefinitionField.VALUE)); if(!isAttachedPanel){ panel.add(Box.createVerticalStrut(10)); } panel.add(box); list.add(box); box.addValueChangedListener(new SmartComboValueChangedListener() { @Override public void onValueChanged(SmartComboBox scb, String newValue) { api.scripts().parameters().setByKey(paramTable, key, ParamDefinitionField.VALUE, newValue); } }); // if (a) the current value is empty, (b) we have input values and (c) none are empty, then take the first possible value if(strings.isEmptyString(box.getValue()) && possibles!=null && possibles.size()>0){ String first=""; boolean hasEmpty=false; for(String possible:possibles){ if(strings.isEmptyString(first)){ first = possible; } if(strings.isEmptyString(possible)){ hasEmpty = true; } } if(!hasEmpty){ box.setValue(first); } } } } } return list; } @Override public JPanel createModalPanel(ODLApi api, ODLTable paramTable, ODLTableReadOnly valuesTable) { JPanel panel = new JPanel(); panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); panel.setAlignmentX( JPanel.LEFT_ALIGNMENT ); panel.setMinimumSize(new Dimension(300,300)); for(SmartComboBox scb:addToPanel(api, paramTable, valuesTable, panel,new PromptType[]{PromptType.POPUP, PromptType.ATTACH_POPUP},false)){ scb.setAlignmentX(SmartComboBox.LEFT_ALIGNMENT); } return panel; } @Override public boolean hasModalParameters(ODLApi api, ODLTable paramTable, ODLTableReadOnly valuesTable) { Parameters parameters = api.scripts().parameters(); int n = paramTable.getRowCount(); for(int i =0 ; i < n ; i++){ String key = parameters.getByRow(paramTable, i, ParamDefinitionField.KEY); if(!api.stringConventions().isEmptyString(key)){ PromptType pt = parameters.getPromptType(paramTable, key); if(pt == PromptType.ATTACH_POPUP || pt == PromptType.POPUP){ return true; } } } return false; } }