package com.revolsys.swing.table.worker;
import java.awt.BorderLayout;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingWorker;
import org.jdesktop.swingx.table.TableColumnExt;
import com.revolsys.swing.TabbedPane;
import com.revolsys.swing.parallel.AbstractSwingWorker;
import com.revolsys.swing.parallel.Invoke;
import com.revolsys.swing.table.AbstractTableModel;
import com.revolsys.swing.table.BaseJTable;
public class SwingWorkerTableModel extends AbstractTableModel implements PropertyChangeListener {
private static final long serialVersionUID = 1L;
private static final List<String> COLUMN_TITLES = Arrays.asList("Thread", "Description",
"Status");
public static int addNewTabPanel(final TabbedPane tabs) {
final JPanel panel = newPanel();
final int tabIndex = tabs.addTabIcon("time", "Background Tasks", panel, false);
return tabIndex;
}
public static JPanel newPanel() {
final JPanel taskPanel = new JPanel(new BorderLayout());
final BaseJTable table = SwingWorkerTableModel.newTable();
final JScrollPane scrollPane = new JScrollPane(table);
taskPanel.add(scrollPane, BorderLayout.CENTER);
return taskPanel;
}
public static BaseJTable newTable() {
final SwingWorkerTableModel model = new SwingWorkerTableModel();
final BaseJTable table = new BaseJTable(model);
table.setAutoResizeMode(JTable.AUTO_RESIZE_LAST_COLUMN);
table.setAutoCreateColumnsFromModel(false);
for (int i = 0; i < model.getColumnCount(); i++) {
final TableColumnExt column = table.getColumnExt(i);
if (i == 0) {
column.setMinWidth(70);
column.setPreferredWidth(70);
column.setMaxWidth(70);
} else if (i == 1) {
column.setMinWidth(200);
column.setPreferredWidth(400);
} else if (i == 2) {
column.setMinWidth(70);
column.setPreferredWidth(70);
column.setMaxWidth(70);
}
}
return table;
}
private List<SwingWorker<?, ?>> workers = Collections.emptyList();
public SwingWorkerTableModel() {
final PropertyChangeSupport propertyChangeSupport = Invoke.getPropertyChangeSupport();
propertyChangeSupport.addPropertyChangeListener(this);
}
@Override
public void dispose() {
super.dispose();
Invoke.getPropertyChangeSupport().removePropertyChangeListener(this);
}
@Override
public Class<?> getColumnClass(final int columnIndex) {
return String.class;
}
@Override
public int getColumnCount() {
return 3;
}
@Override
public String getColumnName(final int columnIndex) {
return COLUMN_TITLES.get(columnIndex);
}
@Override
public int getRowCount() {
return this.workers.size();
}
@Override
public Object getValueAt(final int rowIndex, final int columnIndex) {
if (rowIndex < getRowCount()) {
final SwingWorker<?, ?> worker = this.workers.get(rowIndex);
if (worker != null) {
if (columnIndex == 0) {
if (worker.isDone()) {
this.workers.remove(rowIndex);
fireTableRowsDeleted(rowIndex, rowIndex);
} else if (worker instanceof AbstractSwingWorker) {
final AbstractSwingWorker<?, ?> threadWorker = (AbstractSwingWorker<?, ?>)worker;
return threadWorker.getThreadName();
}
} else if (columnIndex == 1) {
return worker.toString();
} else {
return worker.getState().name();
}
}
}
return "-";
}
@Override
public boolean isCellEditable(final int rowIndex, final int columnIndex) {
return false;
}
@SuppressWarnings("unchecked")
@Override
public void propertyChange(final PropertyChangeEvent event) {
Invoke.later(() -> {
if (event.getPropertyName().equals("workers")) {
this.workers = (List<SwingWorker<?, ?>>)event.getNewValue();
fireTableDataChanged();
}
});
}
@Override
public void setValueAt(final Object value, final int rowIndex, final int columnIndex) {
}
}