Loading files
This file is pinned to the selected release. Download the original to open it in your design tool.
package com.marginallyclever.makelangelo.plotter.plottercontrols;
import com.marginallyclever.communications.*;
import com.marginallyclever.convenience.ButtonIcon;
import com.marginallyclever.convenience.ToggleButtonIcon;
import com.marginallyclever.makelangelo.Translator;
import com.marginallyclever.makelangelo.plotter.plottercontrols.communications.DummyUI;
import com.marginallyclever.makelangelo.plotter.plottercontrols.communications.SerialUI;
import com.marginallyclever.makelangelo.plotter.plottercontrols.communications.TransportLayerUI;
import com.marginallyclever.util.PreferencesHelper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ItemEvent;
import java.util.ArrayList;
import java.util.List;
/**
* ChooseConnection provides a human interface to open or close a
* connection to a remote device available through a {@link NetworkSession}.
*
* @author Dan Royer
* @since 7.28.0
*/
public class ChooseConnection extends JPanel {
private static final Logger logger = LoggerFactory.getLogger(ChooseConnection.class);
private final ToggleButtonIcon bConnect = new ToggleButtonIcon(
new ToggleButtonIcon.Item(Translator.get("ChooseConnection.ButtonConnect"), "/images/connect.png", Color.GREEN),
new ToggleButtonIcon.Item(Translator.get("ChooseConnection.ButtonDisconnect"), "/images/disconnect.png", Color.RED)
);
private final ButtonIcon refresh = new ButtonIcon("", "/images/arrow_refresh.png");
private final JComboBox<ComboItem> connectionComboBox = new JComboBox<>();
private final JPanel configurationPanel = new JPanel();
private TransportLayerUI previousTransportLayerUI;
private final List<TransportLayerUI> availableTransportsUI = new ArrayList<>();
private NetworkSession mySession;
public ChooseConnection() {
availableTransportsUI.add(new SerialUI());
if ("true".equalsIgnoreCase(System.getenv("DEV"))) {
availableTransportsUI.add(new DummyUI());
}
this.add(connectionComboBox);
connectionComboBox.addItemListener(this::updateConfigurationPanel);
addConnectionsItems(connectionComboBox);
configurationPanel.setLayout(new BoxLayout(configurationPanel, BoxLayout.LINE_AXIS));
this.add(configurationPanel);
refresh.addActionListener(e -> addConnectionsItems(connectionComboBox));
this.add(refresh);
bConnect.addActionListener(e-> onConnectAction());
this.setLayout(new FlowLayout(FlowLayout.LEADING));
this.add(bConnect);
}
private void updateConfigurationPanel(ItemEvent itemEvent) {
ComboItem comboItem = (ComboItem) itemEvent.getItem();
TransportLayerUI transportLayerUI = comboItem.transportLayerUi;
if (previousTransportLayerUI != transportLayerUI) {
configurationPanel.removeAll();
comboItem.transportLayerUi.addToPanel(configurationPanel);
configurationPanel.revalidate();
}
previousTransportLayerUI = transportLayerUI;
}
private void addConnectionsItems(JComboBox<ComboItem> comboBox) {
comboBox.removeAllItems();
logger.debug("Fetching connections");
for (TransportLayerUI transportLayerUi : availableTransportsUI) {
TransportLayer transportLayer = transportLayerUi.getTransportLayer();
for (String connection: transportLayer.listConnections()) {
Configuration configuration = new Configuration(transportLayer, connection);
comboBox.addItem(new ComboItem(configuration, transportLayerUi));
}
}
bConnect.setEnabled(comboBox.getItemCount() > 0);
}
private void onConnectAction() {
if (mySession != null) {
onClose();
} else {
ComboItem comboItem = (ComboItem) connectionComboBox.getSelectedItem();
if (comboItem==null) return; // no connections selected, can't happened
Configuration configuration = comboItem.configuration;
comboItem.transportLayerUi.setSelectedValue(configuration);
NetworkSession networkSession = configuration.getTransportLayer().openConnection(configuration);
if (networkSession != null) {
onOpen(networkSession);
notifyListeners(new NetworkSessionEvent(this, NetworkSessionEvent.CONNECTION_OPENED, networkSession));
} else {
notifyListeners(new NetworkSessionEvent(this, NetworkSessionEvent.CONNECTION_ERROR, null));
}
}
}
private void onClose() {
if (mySession != null) {
mySession.closeConnection();
mySession = null;
notifyListeners(new NetworkSessionEvent(this, NetworkSessionEvent.CONNECTION_CLOSED, null));
}
connectionComboBox.setEnabled(true);
refresh.setEnabled(true);
bConnect.updateButton(0);
availableTransportsUI.forEach(TransportLayerUI::onClose);
}
private void onOpen(NetworkSession s) {
mySession = s;
mySession.addListener(e -> {
if (e.flag == NetworkSessionEvent.CONNECTION_CLOSED) {
onClose();
}
});
connectionComboBox.setEnabled(false);
refresh.setEnabled(false);
bConnect.updateButton(1);
availableTransportsUI.forEach(TransportLayerUI::onOpen);
}
public void closeConnection() {
onClose();
}
private class ComboItem {
private final Configuration configuration;
private final TransportLayerUI transportLayerUi;
private ComboItem(Configuration configuration, TransportLayerUI transportLayerUi) {
this.configuration = configuration;
this.transportLayerUi = transportLayerUi;
}
public String toString() {
return configuration.getConnectionName();
}
}
// OBSERVER PATTERN
private List<NetworkSessionListener> listeners = new ArrayList<>();
public void addListener(NetworkSessionListener listener) {
listeners.add(listener);
}
public void removeListener(NetworkSessionListener listener) {
listeners.remove(listener);
}
private void notifyListeners(NetworkSessionEvent evt) {
for( NetworkSessionListener a : listeners ) {
a.networkSessionEvent(evt);
}
}
// TEST
public static void main(String[] args) {
PreferencesHelper.start();
Translator.start();
JFrame frame = new JFrame(ChooseConnection.class.getSimpleName());
frame.setMinimumSize(new Dimension(800, 70));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new ChooseConnection());
frame.pack();
frame.setVisible(true);
}
}
7a2adb123This file is pinned to the selected release. Download the original to open it in your design tool.