package gov.nasa.jpl.mbee.mdk.mms.sync.queue;
import com.nomagic.magicdraw.core.Application;
import gov.nasa.jpl.mbee.mdk.MDKPlugin;
import gov.nasa.jpl.mbee.mdk.systems_reasoner.actions.SRAction;
import javax.swing.*;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumnModel;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.NumberFormat;
import java.util.Iterator;
import java.util.Vector;
public class OutputQueueStatusAction extends SRAction {
private static final long serialVersionUID = 1L;
private final OutputQueueDetailWindow outputQueueDetailWindow = new OutputQueueDetailWindow();
public static final String NAME = "MMS Queue";
public OutputQueueStatusAction() {
super(NAME);
}
public void update() {
boolean haveCurrent = OutputQueue.getInstance().getCurrent() != null;
setName(OutputQueueStatusAction.NAME + ": " + (OutputQueue.getInstance().size() + (haveCurrent ? 1 : 0)));
if (outputQueueDetailWindow.isVisible()) {
outputQueueDetailWindow.update();
}
MDKPlugin.updateMainToolbarCategory();
//Application.getInstance().getGUILog().log(getName());
//System.out.println(getName());
}
@Override
public void actionPerformed(final ActionEvent event) {
if (!outputQueueDetailWindow.isVisible()) {
outputQueueDetailWindow.setVisible(true);
}
else {
outputQueueDetailWindow.update();
outputQueueDetailWindow.toFront();
}
}
protected class OutputQueueDetailWindow extends JFrame {
private JTable table;
private final Vector<String> columns = new Vector<String>();
private final Vector<Vector<Object>> data = new Vector<Vector<Object>>();
{
columns.addElement("#");
columns.addElement("Method");
columns.addElement("# Elements");
columns.addElement("Type");
columns.addElement("URL");
columns.addElement("");
}
//private AbstractTableModel tableModel;
protected OutputQueueDetailWindow() {
this.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
//this.setSize(new Dimension(500, 200));
this.setLocationRelativeTo(Application.getInstance().getMainFrame());
//tableModel = new OutputQueueTableModel();
table = new JTable(data, columns) {
@Override
public boolean isCellEditable(int row, int column) {
return column == 5;
}
};
table.setFillsViewportHeight(true);
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
table.getColumnModel().getColumn(0).setPreferredWidth(20);
table.getColumnModel().getColumn(1).setPreferredWidth(100);
table.getColumnModel().getColumn(2).setPreferredWidth(100);
table.getColumnModel().getColumn(3).setPreferredWidth(200);
table.getColumnModel().getColumn(4).setPreferredWidth(370);
table.getColumnModel().getColumn(5).setPreferredWidth(100);
final JScrollPane tableScrollPane = new JScrollPane(table);
tableScrollPane.setPreferredSize(new Dimension(500, 200));
final JPanel panel = new JPanel(new BorderLayout());
panel.add(tableScrollPane, BorderLayout.CENTER);
TableButtonColumn buttonEditor = new TableButtonColumn(table);
table.getColumnModel().getColumn(5).setCellRenderer(buttonEditor);
//table.getColumnModel().getColumn(5).setCellEditor(buttonEditor);
this.setContentPane(panel);
this.pack();
}
public void update() {
//final Vector<Vector<Object>> data = new Vector<Vector<Object>>();
data.clear();
final Iterator<Request> it = OutputQueue.getInstance().iterator();
Request current = OutputQueue.getInstance().getCurrent();
int counter = 1;
if (current != null) {
final Vector<Object> row = new Vector<Object>();
row.addElement(0);
row.addElement(current.getRequest().getMethod());
row.addElement(NumberFormat.getInstance().format(current.getCount()));
row.addElement(current.getName());
row.addElement(current.getRequest().getURI().toString());
row.addElement("Continue in Background");
data.addElement(row);
}
while (it.hasNext()) {
final Request r = it.next();
if (r == null) {
// just in case of concurrent modification issues
break;
}
final Vector<Object> row = new Vector<Object>();
row.addElement(counter);
row.addElement(r.getRequest().getMethod());
row.addElement(NumberFormat.getInstance().format(r.getCount()));
row.addElement(r.getName());
row.addElement(r.getRequest().getURI().toString());
row.addElement("Delete");
data.addElement(row);
counter++;
}
/*table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
if (table.getModel() instanceof AbstractTableModel) {
((AbstractTableModel) table.getModel()).fireTableStructureChanged();
}*/
table.repaint();
// this.setAlwaysOnTop(true);
//tableModel.fireTableDataChanged();
}
}
public class TableButtonColumn extends AbstractCellEditor implements TableCellRenderer, TableCellEditor, ActionListener {
private JTable table;
private Action action;
private JButton renderButton;
private JButton editButton;
public TableButtonColumn(JTable table) {
this.table = table;
this.action = new AbstractAction() {
public void actionPerformed(ActionEvent e) {
int modelRow = Integer.valueOf(e.getActionCommand());
if (modelRow == 0) {
//Utils.guilog("Cancel Pressed.");
OutputQueue.getInstance().setCurrent(null); //let the table update when it actually moves on
/*SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
OutputQueueStatusConfigurator.getOutputQueueStatusAction().update();
}
});*/
}
else {
//Utils.guilog("Delete Pressed.");
OutputQueue.getInstance().remove(modelRow);
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
OutputQueueStatusConfigurator.getOutputQueueStatusAction().update();
}
});
}
}
};
renderButton = new JButton();
editButton = new JButton();
editButton.setFocusPainted(false);
editButton.addActionListener(this);
TableColumnModel columnModel = table.getColumnModel();
columnModel.getColumn(5).setCellRenderer(this);
columnModel.getColumn(5).setCellEditor(this);
//table.addMouseListener( this );
}
/*
* The button has been pressed. Stop editing and invoke the custom Action
*/
public void actionPerformed(ActionEvent e) {
int row = table.convertRowIndexToModel(table.getEditingRow());
fireEditingStopped();
// Invoke the Action
ActionEvent event = new ActionEvent(table, ActionEvent.ACTION_PERFORMED, "" + row);
action.actionPerformed(event);
}
@Override
public Object getCellEditorValue() {
return null;
}
@Override
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected,
int row, int column) {
//Utils.guilog("getTableCellEditorComponent - value is null");
if (value != null) {
//Utils.guilog("getTableCellEditorComponent: " + value.toString());
editButton.setText(value.toString());
editButton.setIcon(null);
return editButton;
}
return null;
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
boolean hasFocus, int row, int column) {
//Utils.guilog("getTableCellRendererComponent- value is null");
if (value != null) {
//Utils.guilog("getTableCellRendererComponent: " + value.toString());
renderButton.setText(value.toString());
renderButton.setIcon(null);
return renderButton;
//}
}
return null;
}
}
}