package net.sourceforge.subsonic.booter.mac;
import java.awt.Color;
import java.awt.Desktop;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.URI;
import java.text.DateFormat;
import java.util.Locale;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.Timer;
import com.jgoodies.forms.builder.DefaultFormBuilder;
import com.jgoodies.forms.factories.Borders;
import com.jgoodies.forms.layout.FormLayout;
import net.sourceforge.subsonic.booter.deployer.DeploymentStatus;
import net.sourceforge.subsonic.booter.deployer.SubsonicDeployerService;
/**
* Panel displaying the status of the Subsonic service.
*
* @author Sindre Mehus
*/
public class StatusPanel extends JPanel {
private static final DateFormat DATE_FORMAT = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM, Locale.US);
private final SubsonicDeployerService deployer;
private JTextField startedTextField;
private JTextField memoryTextField;
private JTextArea errorTextField;
private JButton urlButton;
public StatusPanel(SubsonicDeployerService deployer) {
this.deployer = deployer;
createComponents();
configureComponents();
layoutComponents();
addBehaviour();
}
private void createComponents() {
startedTextField = new JTextField();
memoryTextField = new JTextField();
errorTextField = new JTextArea(3, 24);
urlButton = new JButton();
}
private void configureComponents() {
startedTextField.setEditable(false);
memoryTextField.setEditable(false);
errorTextField.setEditable(false);
errorTextField.setLineWrap(true);
errorTextField.setBorder(startedTextField.getBorder());
urlButton.setBorderPainted(false);
urlButton.setContentAreaFilled(false);
urlButton.setForeground(Color.BLUE.darker());
urlButton.setHorizontalAlignment(SwingConstants.LEFT);
}
private void layoutComponents() {
FormLayout layout = new FormLayout("right:d, 6dlu, max(d;30dlu):grow");
DefaultFormBuilder builder = new DefaultFormBuilder(layout, this);
builder.append("Started on", startedTextField);
builder.append("Memory used", memoryTextField);
builder.append("Error message", errorTextField);
builder.append("Server address", urlButton);
setBorder(Borders.DIALOG_BORDER);
}
private void addBehaviour() {
urlButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
openBrowser();
}
});
Timer timer = new Timer(3000, new ActionListener() {
public void actionPerformed(ActionEvent e) {
updateStatus(deployer.getDeploymentInfo());
}
});
updateStatus(deployer.getDeploymentInfo());
timer.start();
}
private void openBrowser() {
String url = urlButton.getText();
if (url == null) {
return;
}
try {
Desktop.getDesktop().browse(new URI(url));
} catch (Throwable x) {
x.printStackTrace();
}
}
private void updateStatus(DeploymentStatus status) {
startedTextField.setText(status == null ? null : DATE_FORMAT.format(status.getStartTime()));
memoryTextField.setText(status == null ? null : status.getMemoryUsed() + " MB");
errorTextField.setText(status == null ? null : status.getErrorMessage());
urlButton.setText(status == null ? null : status.getURL());
}
}