/* * StatusPane.java * * Created on March 20, 2001, 3:30 PM */ package com.c2kernel.gui.tabs; /** * @author abranson * @version */ import java.awt.GridBagConstraints; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.Box; import javax.swing.JButton; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.AbstractTableModel; import com.c2kernel.common.ObjectNotFoundException; import com.c2kernel.entity.proxy.EntityProxyObserver; import com.c2kernel.entity.proxy.MemberSubscription; import com.c2kernel.events.Event; import com.c2kernel.events.History; import com.c2kernel.gui.MainFrame; import com.c2kernel.lifecycle.instance.stateMachine.Transitions; import com.c2kernel.persistency.ClusterStorage; import com.c2kernel.utils.Language; import com.c2kernel.utils.Logger; /** * Pane to display all work orders that this agent can execute, and activate * them on request from the user. Subscribes to NodeItem for WorkOrder objects. * @version $Revision: 1.22 $ $Date: 2005/04/26 06:48:13 $ * @author $Author: abranson $ */ public class HistoryPane extends EntityTabPane implements ActionListener, EntityProxyObserver { History history; HistoryTableModel model; JTable eventTable; JButton startButton = new JButton("<<"); JButton prevButton = new JButton("<"); JButton nextButton = new JButton(">"); JButton endButton = new JButton(">>"); public static final int SIZE = 30; int currentSize = SIZE; public HistoryPane() { super("History", "Event History"); initPanel(); // add buttons Box navBox = Box.createHorizontalBox(); navBox.add(startButton); navBox.add(prevButton); navBox.add(nextButton); navBox.add(endButton); // setup buttons //startButton.setEnabled(false); nextButton.setEnabled(false); //prevButton.setEnabled(false); endButton.setEnabled(false); startButton.setActionCommand("start"); startButton.addActionListener(this); prevButton.setActionCommand("prev"); prevButton.addActionListener(this); nextButton.setActionCommand("next"); nextButton.addActionListener(this); endButton.setActionCommand("end"); endButton.addActionListener(this); getGridBagConstraints(); c.gridx = 0; c.gridy = 1; c.anchor = GridBagConstraints.NORTHWEST; c.fill=GridBagConstraints.NONE; c.weightx=0; c.weighty=0; gridbag.setConstraints(navBox, c); add(navBox); // Create table eventTable = new JTable(); JScrollPane eventScroll= new JScrollPane(eventTable); c.weightx = 1.0; c.weighty = 1.0; c.fill = GridBagConstraints.BOTH; c.gridy++; gridbag.setConstraints(eventScroll, c); add(eventScroll); } @Override public void reload() { history.clear(); jumpToEnd(); } @Override public void run() { Thread.currentThread().setName("History Pane Builder"); MainFrame.progress.startBouncing("Loading history"); try { history = (History)sourceEntity.getEntity().getObject(ClusterStorage.HISTORY); sourceEntity.getEntity().subscribe(new MemberSubscription(this, ClusterStorage.HISTORY, true)); } catch (ObjectNotFoundException e) { Logger.error(e); } model = new HistoryTableModel(); eventTable.setModel(model); jumpToEnd(); } public void jumpToEnd() { int lastEvent = history.getLastId(); int firstEvent = 0; currentSize = SIZE; if (lastEvent > currentSize) firstEvent = lastEvent - currentSize + 1; if (lastEvent < currentSize) currentSize = lastEvent + 1; Logger.msg(5, "HistoryPane.run() - init table start "+firstEvent+" for "+currentSize); model.setView(firstEvent, currentSize); } @Override public void add(Event contents) { jumpToEnd(); } @Override public void remove(String id) { // don't have to deal with this normally } @Override public void actionPerformed(ActionEvent e) { if (e.getActionCommand().equals("end")) { jumpToEnd(); return; } int lastEvent = history.getLastId(); int startEvent = model.getStartId(); if (e.getActionCommand().equals("start")) { currentSize = SIZE; startEvent = 0; } else if (e.getActionCommand().equals("prev")) { currentSize = SIZE; startEvent-=currentSize; if (startEvent<0) startEvent = 0; } else if (e.getActionCommand().equals("next")) { currentSize = SIZE; startEvent+=currentSize; if (startEvent > lastEvent) startEvent = lastEvent - currentSize +1; } else { // unknown action return; } model.setView(startEvent, currentSize); } private class HistoryTableModel extends AbstractTableModel { Event[] event; Integer[] ids; int loaded = 0; int startId = 0; public HistoryTableModel() { event = new Event[0]; ids = new Integer[0]; } public int getStartId() { return startId; } public void setView(int startId, int size) { event = new Event[size]; ids = new Integer[size]; this.startId = startId; for (int i=0; i getColumnClass(int columnIndex) { switch(columnIndex) { case 0: return Integer.class; default: return String.class; } } /** * @see javax.swing.table.TableModel#getColumnCount() */ @Override public int getColumnCount() { return 7; } /** * @see javax.swing.table.TableModel#getColumnName(int) */ @Override public String getColumnName(int columnIndex) { switch(columnIndex) { case 0: return Language.translate("ID"); case 1: return Language.translate("Activity"); case 2: return Language.translate("Transition"); case 3: return Language.translate("Date"); case 4: return Language.translate("Agent Name"); case 5: return Language.translate("Agent Role"); case 6: return Language.translate("View"); default: return ""; } } /** * @see javax.swing.table.TableModel#getRowCount() */ @Override public int getRowCount() { return loaded; } /** * @see javax.swing.table.TableModel#getValueAt(int, int) */ @Override public Object getValueAt(int rowIndex, int columnIndex) { if (event.length <= rowIndex || event[rowIndex] == null) return ""; try { switch (columnIndex) { case 0: return ids[rowIndex]; case 1: return event[rowIndex].getStepName(); case 2: return Transitions.getTransitionName(event[rowIndex].getTransition()); case 3: return event[rowIndex].getTimeString(); case 4: return event[rowIndex].getAgentName(); case 5: return event[rowIndex].getAgentRole(); case 6: return event[rowIndex].getViewName(); default: return ""; } } catch (Exception e) { return null; } } /** * @see javax.swing.table.TableModel#isCellEditable(int, int) */ @Override public boolean isCellEditable(int rowIndex, int columnIndex) { return false; } } @Override public void control(String control, String msg) { if (control.equals(MemberSubscription.END)) MainFrame.progress.stopBouncing("History loading complete."); else MainFrame.progress.stopBouncing("History: "+msg); } }