package com.marginallyclever.makelangeloRobot.settings;
import java.awt.Frame;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.ServiceLoader;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import com.marginallyclever.makelangelo.Translator;
import com.marginallyclever.makelangeloRobot.MakelangeloRobot;
import com.marginallyclever.makelangeloRobot.settings.hardwareProperties.MakelangeloHardwareProperties;
/**
* Controls related to configuring a Makelangelo machine
*
* @author danroyer
* @since 7.1.4
*/
public class MakelangeloSettingsDialog
extends JPanel
implements ActionListener {
/**
* @see Serializable
*/
private static final long serialVersionUID = 1L;
protected MakelangeloRobot robot;
protected Frame parentFrame;
protected JTabbedPane panes;
protected JButton save, cancel;
private JComboBox<String> hardwareVersionChoices;
private ArrayList<Integer> availableHardwareVersions;
private String[] hardwareVersionNames;
private int originalHardwareVersion;
private JPanel modelPanel;
protected PanelAdjustMachine panelAdjustMachine;
protected PanelAdjustPaper panelAdjustPaper;
protected PanelAdjustPen panelAdjustPen;
protected int dialogWidth = 450;
protected int dialogHeight = 500;
public MakelangeloSettingsDialog(Frame parent, MakelangeloRobot robot) {
super();
this.parentFrame = parent;
this.robot = robot;
}
// display settings menu
public void run() {
originalHardwareVersion = robot.getSettings().getHardwareVersion();
this.setLayout(new GridBagLayout());
GridBagConstraints d = new GridBagConstraints();
buildModelPanel();
// hardware model settings
panes = new JTabbedPane(JTabbedPane.TOP);
panes.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
//panes.setPreferredSize(new Dimension(dialogWidth,dialogHeight));
rebuildTabbedPanes();
// now assemble the dialog
d.fill=GridBagConstraints.HORIZONTAL;
d.gridx=0;
d.gridy=0;
d.weightx=0;
d.weighty=0;
d.gridwidth=1;
this.add(modelPanel, d);
d.fill=GridBagConstraints.BOTH;
d.gridy=1;
d.weightx=1;
d.weighty=1;
this.add(panes,d);
int result = JOptionPane.showConfirmDialog(parentFrame, this, Translator.get("configureMachine"),
JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);
if (result == JOptionPane.OK_OPTION) {
panelAdjustMachine.save();
panelAdjustPaper.save();
panelAdjustPen.save();
robot.getSettings().saveConfig();
robot.sendConfig();
} else {
robot.getSettings().setHardwareVersion(originalHardwareVersion);
}
}
// hardware model choice
private void buildModelPanel() {
modelPanel = new JPanel(new GridBagLayout());
modelPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 0, 10));
GridBagConstraints d = new GridBagConstraints();
// the panes for the selected machine configuration
d.fill=GridBagConstraints.BOTH;
d.gridx=0;
d.gridy=0;
d.weightx=0;
d.weighty=0;
JLabel modelLabel = new JLabel(Translator.get("HardwareVersion"));
modelLabel.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 10));
modelPanel.add(modelLabel, d);
findAvailableHardwareVersions();
d.gridx=1;
d.gridwidth=2;
hardwareVersionChoices = new JComboBox<>(hardwareVersionNames);
// set the default
int hv = robot.getSettings().getHardwareVersion();
for(int i=0;i<availableHardwareVersions.size();++i) {
if(availableHardwareVersions.get(i) == hv) {
hardwareVersionChoices.setSelectedIndex(i);
break;
}
}
modelPanel.add(hardwareVersionChoices, d);
hardwareVersionChoices.addActionListener(this);
}
private void findAvailableHardwareVersions() {
availableHardwareVersions = new ArrayList<Integer>();
// get version numbers
ServiceLoader<MakelangeloHardwareProperties> knownHardware = ServiceLoader.load(MakelangeloHardwareProperties.class);
Iterator<MakelangeloHardwareProperties> i = knownHardware.iterator();
while(i.hasNext()) {
MakelangeloHardwareProperties hw = i.next();
availableHardwareVersions.add(new Integer(hw.getVersion()));
}
// get names
hardwareVersionNames = new String[availableHardwareVersions.size()];
i = knownHardware.iterator();
int j=0;
while(i.hasNext()) {
MakelangeloHardwareProperties hw = i.next();
hardwareVersionNames[j] = hw.getName();
++j;
}
}
private void rebuildTabbedPanes() {
panes.removeAll();
panelAdjustMachine = new PanelAdjustMachine(robot);
panes.addTab(Translator.get("MenuSettingsMachine"),panelAdjustMachine);
panelAdjustPaper = new PanelAdjustPaper(robot);
panes.addTab(Translator.get("MenuAdjustPaper"),panelAdjustPaper);
panelAdjustPen = new PanelAdjustPen(robot);
panes.addTab(Translator.get("MenuAdjustTool"),panelAdjustPen);
}
public void actionPerformed(ActionEvent e) {
Object src = e.getSource();
if(src == hardwareVersionChoices) {
int newChoice=availableHardwareVersions.get(hardwareVersionChoices.getSelectedIndex());
robot.getSettings().setHardwareVersion(newChoice);
rebuildTabbedPanes();
}
}
}