package com.opengamma.integration.tool.enginedebugger;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JPanel;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import net.miginfocom.swing.MigLayout;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.opengamma.engine.marketdata.spec.MarketDataSpecification;
import com.opengamma.integration.tool.enginedebugger.MarketDataSpecificationRowComponent.Action;
import com.opengamma.master.config.ConfigMaster;
import com.opengamma.master.marketdatasnapshot.MarketDataSnapshotMaster;
import com.opengamma.provider.livedata.LiveDataMetaDataProvider;
/**
*
*/
public class MarketDataDialog extends JDialog {
private static final Logger s_logger = LoggerFactory.getLogger(MarketDataDialog.class);
private List<LiveDataMetaDataProvider> _liveDataMetaDataProvider;
private ConfigMaster _configMaster;
private MarketDataSnapshotMaster _snapshotMaster;
private JButton _cancelButton = new JButton("Cancel");
private JButton _okayButton = new JButton("OK");
private Map<MarketDataSpecificationRowComponent, Boolean> _validState = new HashMap<>();
private List<MarketDataSpecificationRowComponent> _components = new ArrayList<>();
private volatile boolean _cancelled;
public MarketDataDialog(List<LiveDataMetaDataProvider> liveDataMetaDataProvider, ConfigMaster configMaster, MarketDataSnapshotMaster snapshotMaster) {
super();
setModalityType(ModalityType.APPLICATION_MODAL);
_liveDataMetaDataProvider = liveDataMetaDataProvider;
_configMaster = configMaster;
_snapshotMaster = snapshotMaster;
buildForm();
}
public void buildForm() {
MigLayout layout = new MigLayout();
setLayout(layout);
addRow(0);
_okayButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
setVisible(false);
dispose();
}
});
_cancelButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
_cancelled = true;
setVisible(false);
dispose();
}
});
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
JPanel jPanel = new JPanel(new MigLayout("inset 15 0 -5 -5"));
jPanel.add(_okayButton, "right");
jPanel.add(_cancelButton, "right");
add(jPanel, "span 2, right, wrap");
pack();
}
private boolean validState() {
boolean activate = true;
for (boolean good : _validState.values()) {
activate = activate & good;
}
return activate && !_cancelled;
}
private void checkOkayCancel() {
_okayButton.setEnabled(validState());
}
private void addRow(final int index) {
// + 1 because we're about to add it.
final MarketDataSpecificationRowComponent rowComponent = new MarketDataSpecificationRowComponent(_liveDataMetaDataProvider, _configMaster, _snapshotMaster);
// listen for changes in component's validity and record them in map
final ChangeListener changeListener = new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
MarketDataSpecificationComponent component = (MarketDataSpecificationComponent) e.getSource();
_validState.put(rowComponent, component.getCurrentState() != null);
checkOkayCancel();
}
};
_validState.put(rowComponent, false);
rowComponent.addChangeListener(changeListener);
rowComponent.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Action command = MarketDataSpecificationRowComponent.Action.valueOf(e.getActionCommand());
MarketDataSpecificationRowComponent rowComponent = (MarketDataSpecificationRowComponent) e.getSource();
int index = _components.indexOf(rowComponent);
switch (command) {
case MOVE_UP:
remove(rowComponent);
add(rowComponent, "span 2, wrap", index - 1);
_components.remove(rowComponent);
_components.add(index - 1, rowComponent);
break;
case MOVE_DOWN:
remove(rowComponent);
add(rowComponent, "span 2, wrap", index + 1);
_components.remove(rowComponent);
_components.add(index + 1, rowComponent);
break;
case ADD:
addRow(index + 1);
break;
case REMOVE:
remove(rowComponent);
rowComponent.removeActionListener(this);
rowComponent.removeChangeListener(changeListener);
_validState.remove(rowComponent);
_components.remove(rowComponent);
break;
}
checkButtons();
pack();
for (int i = 0; i < _components.size(); i++) {
MarketDataSpecificationRowComponent marketDataSpecificationRowComponent = _components.get(i);
if (marketDataSpecificationRowComponent == null) {
s_logger.error("{} was null", i);
} else {
s_logger.error("{} was {}", i, marketDataSpecificationRowComponent.getCurrentState());
}
}
}
});
_components.add(index, rowComponent);
checkButtons();
checkOkayCancel();
add(rowComponent, "span 2, wrap", index);
}
private void checkButtons() {
int i = 0;
for (MarketDataSpecificationRowComponent component : _components) {
component.checkButtons(i++, _components.size());
}
}
public List<MarketDataSpecification> showDialog() {
setVisible(true);
if (validState()) {
List<MarketDataSpecification> specs = new ArrayList<>();
for (MarketDataSpecificationRowComponent component : _components) {
specs.add(component.getCurrentState());
}
return specs;
} else {
return null;
}
}
}