package org.openslx.dozmod.gui.window; import java.awt.Window; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.util.ArrayList; import java.util.List; import java.util.Map.Entry; import javax.swing.JRadioButton; import org.openslx.bwlp.thrift.iface.Satellite; import org.openslx.bwlp.thrift.iface.UserInfo; import org.openslx.dozmod.Config; import org.openslx.dozmod.gui.Gui; import org.openslx.dozmod.gui.Gui.GuiCallable; import org.openslx.dozmod.gui.helper.MessageType; import org.openslx.dozmod.gui.helper.UiFeedback; import org.openslx.dozmod.gui.window.layout.SatelliteListWindowLayout; /** * Window for selecting an available satellite or setting custom ip. */ @SuppressWarnings("serial") public class SatelliteListWindow extends SatelliteListWindowLayout implements UiFeedback { private Satellite satellite = null; public interface UserAddedCallback { public void userAdded(UserInfo user, SatelliteListWindow window); } private SatelliteListWindow(final Window modalParent, List satList) { super(modalParent, satList); // Prepare doubleclick listener MouseListener radioDoubleClick = new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { if (e.getClickCount() == 2 && e.getButton() == MouseEvent.BUTTON1) { if (e.getSource() instanceof JRadioButton) { ((JRadioButton) e.getSource()).setSelected(true); } prepareSelection(); if (satellite != null) { dispose(); } } } }; // Check, whether we have any satellites String lastSat = Config.getLastSatellite(); if (satList != null && !satList.isEmpty()) { for (Entry entry : radioToSat.entrySet()) { if (!lastSat.isEmpty()) { Satellite sat = entry.getValue(); if (sat.displayName.equals(lastSat)) { entry.getKey().setSelected(true); entry.getKey().requestFocus(); txtCustomAddress.setEnabled(false); lastSat = ""; } } entry.getKey().addMouseListener(radioDoubleClick); } } else { rdoCusomAddress.setSelected(true); txtCustomAddress.requestFocus(); } if (lastSat.startsWith("@")) { txtCustomAddress.setText(lastSat.substring(1)); rdoCusomAddress.setSelected(true); txtCustomAddress.requestFocus(); } // deactivate the custom field when selecting a satellite to make things clearer for user ActionListener listener = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { txtCustomAddress.setEnabled(rdoCusomAddress.isSelected()); } }; for (JRadioButton radio : radioToSat.keySet()) { radio.addActionListener(listener); } rdoCusomAddress.addActionListener(listener); txtCustomAddress.setEnabled(false); // Cancel button btnCancel.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { dispose(); } }); // Continue button btnContinue.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { prepareSelection(); if (satellite != null) { if (rdoCusomAddress.isSelected()) { Config.setLastSatellite("@" + txtCustomAddress.getText()); } else if (satellite.displayName != null && !satellite.displayName.isEmpty()) { Config.setLastSatellite(satellite.displayName); } dispose(); } else { Gui.showMessageBox(rootPane, "Kein Satellit ausgewählt", MessageType.ERROR, null, null); } } }); getRootPane().setDefaultButton(btnContinue); Gui.centerShellOverShell(modalParent, this); } private void prepareSelection() { // satellite is selected if (!rdoCusomAddress.isSelected()) { // check, which satellite is selected for (Entry entry : radioToSat.entrySet()) { if (entry.getKey().isSelected()) { satellite = entry.getValue(); break; } } } // custom button selected if (rdoCusomAddress.isSelected() && !txtCustomAddress.getText().isEmpty()) { satellite = new Satellite(); satellite.addressList = new ArrayList(); satellite.addressList.add(txtCustomAddress.getText()); } } private Satellite runAndReturn() { setVisible(true); return satellite; } /** * Open a new SatelliteListWindow * * @param modalParent * @param satList The list of satellites to display. * @return satellite with address to use, or null on error/cancel */ public static Satellite open(final Window modalParent, final List satList) { return Gui.syncExec(new GuiCallable() { @Override public Satellite run() { return new SatelliteListWindow(modalParent, satList).runAndReturn(); } }); } @Override public boolean wantConfirmQuit() { return false; } @Override public void escapePressed() { dispose(); } }