package org.lysty.ui;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JScrollPane;
import net.miginfocom.swing.MigLayout;
import org.lysty.core.SongIndexer;
import org.lysty.core.UpdateListener;
import org.lysty.exceptions.FeatureExtractionException;
public class ProgressWindow extends LFrame implements UpdateListener {
private static final String TEXT_OK = "Ok";
private static final String TEXT_CANCEL = "Cancel";
JLabel lblMessage;
JButton btnCancel;
JProgressBar progressBar;
JList lstErrors;
JScrollPane scroller;
private DefaultListModel errorListModel;
private int errorCount = 0;
private long successCount;
private boolean isCancelEnabled;
public ProgressWindow(String title, boolean isCancelEnabled) {
super(title);
this.isCancelEnabled = isCancelEnabled;
createUI();
layoutUI();
}
private void layoutUI() {
MigLayout layout = new MigLayout("insets 6 6 6 6");
JPanel panel = new JPanel(layout);
panel.add(lblMessage, "growx");
panel.add(btnCancel, "push, al right, wrap");
panel.add(progressBar, "span");
panel.add(scroller, "south");
if (!isCancelEnabled) {
btnCancel.setEnabled(false);
}
this.setContentPane(panel);
this.pack();
this.setVisible(true);
}
private void createUI() {
lblMessage = new JLabel("Preparing to Index songs...");
lblMessage.setPreferredSize(new Dimension(150, 10));
lblMessage.setMinimumSize(new Dimension(150, 10));
btnCancel = new JButton(new AbstractAction("Cancel") {
@Override
public void actionPerformed(ActionEvent e) {
if (TEXT_OK.equalsIgnoreCase(btnCancel.getText())) {
ProgressWindow.this.dispose();
} else if (TEXT_CANCEL.equalsIgnoreCase(btnCancel.getText())) {
SongIndexer.cancel();
btnCancel.setText(TEXT_OK);
lblMessage.setText("Cancelled Indexing");
}
}
});
progressBar = new JProgressBar();
progressBar.setPreferredSize(new Dimension(400, 20));
progressBar.setStringPainted(true);
lstErrors = new JList();
errorListModel = new DefaultListModel();
lstErrors.setModel(errorListModel);
scroller = new JScrollPane(lstErrors);
}
@Override
public void setSize(long size) {
lblMessage.setText(size + " songs found for indexing...");
progressBar.setMaximum((int) size);
}
@Override
public void notifyUpdate(long currentProgress, String customMessage) {
progressBar.setValue((int) currentProgress);
lblMessage.setText(customMessage);
}
@Override
public void notifyError(Exception e) {
if (e instanceof FeatureExtractionException) {
errorCount++;
FeatureExtractionException e1 = (FeatureExtractionException) e;
errorListModel.addElement("Error indexing: "
+ e1.getFile().getAbsolutePath());
}
}
@Override
public void notifyComplete() {
lblMessage.setText("Indexing Complete. " + successCount
+ " files indexed out of " + (successCount + errorCount));
progressBar.setValue(progressBar.getMaximum());
btnCancel.setText(TEXT_OK);
}
@Override
public void notifyCurrentSuccessCount(long successCount) {
progressBar.setString("Successfully indexed: " + successCount
+ " files");
this.successCount = successCount;
}
}