package com.universalbits.conorganizer.badger.ui; import com.universalbits.conorganizer.badger.control.BadgePrinter; import com.universalbits.conorganizer.badger.control.BadgeQueue; import com.universalbits.conorganizer.badger.control.ServerBadgeLoader; import com.universalbits.conorganizer.common.APIClient; import com.universalbits.conorganizer.common.ISettings; import com.universalbits.conorganizer.common.Settings; import javax.swing.*; import java.awt.event.ActionEvent; public class ServerConnectAction extends AbstractAction { private static final long serialVersionUID = 1L; private static final String STOP_TEXT = "Disconnect from Server"; private static final String START_TEXT = "Connect to Server"; private JFrame frame; private BadgeQueue queue; private boolean running = false; private ServerBadgeLoader loader; private String token; private ISettings settings; public ServerConnectAction(JFrame frame, ISettings settings, BadgeQueue queue) { super("Connect to Server"); this.frame = frame; this.queue = queue; this.settings = settings; loader = new ServerBadgeLoader(queue, new TokenRequiredListener()); } private synchronized void start() { running = true; final String appName = settings.getProperty(Settings.PROPERTY_APP_NAME); final String clientName = settings.getProperty(APIClient.PROPERTY_NAME); frame.setTitle(appName + " - " + clientName); new Thread(loader).start(); firePropertyChange(Action.NAME, STOP_TEXT, START_TEXT); } private synchronized void stop() { running = false; loader.stop(); loader = null; firePropertyChange(Action.NAME, START_TEXT, STOP_TEXT); } public ServerBadgeLoader getServerBadgeLoader() { return loader; } @Override public void actionPerformed(ActionEvent event) { if (running) { stop(); } else { start(); } } private class TokenRequiredListener implements ServerBadgeLoader.TokenRequiredListener { private boolean asking = false; @Override public String getToken() { if ((token == null || token.isEmpty()) && !asking) { asking = true; SwingUtilities.invokeLater(new Runnable() { public void run() { token = JOptionPane.showInputDialog(frame, "API Client Token Required"); asking = false; } }); } return token; } } }