summaryrefslogtreecommitdiff
path: root/src/main/java/org/cristalise/gui/tabs/HistoryPane.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/org/cristalise/gui/tabs/HistoryPane.java')
-rw-r--r--src/main/java/org/cristalise/gui/tabs/HistoryPane.java304
1 files changed, 304 insertions, 0 deletions
diff --git a/src/main/java/org/cristalise/gui/tabs/HistoryPane.java b/src/main/java/org/cristalise/gui/tabs/HistoryPane.java
new file mode 100644
index 0000000..60e97e9
--- /dev/null
+++ b/src/main/java/org/cristalise/gui/tabs/HistoryPane.java
@@ -0,0 +1,304 @@
+/*
+ * StatusPane.java
+ *
+ * Created on March 20, 2001, 3:30 PM
+ */
+
+package org.cristalise.gui.tabs;
+
+/**
+ * @author abranson
+ * @version
+ */
+import java.awt.GridBagConstraints;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+
+import javax.swing.Box;
+import javax.swing.JButton;
+import javax.swing.JScrollPane;
+import javax.swing.JTable;
+import javax.swing.table.AbstractTableModel;
+
+import org.cristalise.gui.MainFrame;
+import org.cristalise.kernel.common.ObjectNotFoundException;
+import org.cristalise.kernel.entity.proxy.MemberSubscription;
+import org.cristalise.kernel.entity.proxy.ProxyObserver;
+import org.cristalise.kernel.events.Event;
+import org.cristalise.kernel.events.History;
+import org.cristalise.kernel.lifecycle.instance.stateMachine.StateMachine;
+import org.cristalise.kernel.persistency.ClusterStorage;
+import org.cristalise.kernel.utils.Language;
+import org.cristalise.kernel.utils.LocalObjectLoader;
+import org.cristalise.kernel.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 ItemTabPane implements ActionListener, ProxyObserver<Event> {
+
+ 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);
+
+ // open viewpoint pane when outcome events are clicked on
+ eventTable.addMouseListener(new MouseAdapter() {
+ @Override
+ public void mouseClicked(MouseEvent e) {
+ if (e.getClickCount() == 2) {
+ Event selected = model.getEventForRow(eventTable.getSelectedRow());
+ if (selected.getSchemaName()!=null && selected.getViewName()!=null)
+ parent.runCommand("Data Viewer", selected.getSchemaName()+":"+selected.getViewName());
+ }
+ }
+ });
+
+ }
+
+ @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)sourceItem.getItem().getObject(ClusterStorage.HISTORY);
+ sourceItem.getItem().subscribe(new MemberSubscription<Event>(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;
+ StateMachine[] sm;
+ 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];
+ sm = new StateMachine[size];
+ this.startId = startId;
+ for (int i=0; i<size; i++) {
+ event[i] = history.getEvent(startId+i);
+ try {
+ sm[i] = LocalObjectLoader.getStateMachine(event[i].getStateMachineName(), event[i].getStateMachineVersion());
+ } catch (Exception ex) { Logger.error(ex); }
+ ids[i] = new Integer(startId+i);
+ loaded = i+1;
+ }
+ fireTableStructureChanged();
+ }
+ /**
+ * @see javax.swing.table.TableModel#getColumnClass(int)
+ */
+ @Override
+ public Class<?> 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 8;
+ }
+
+ /**
+ * @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("Schema");
+ case 7: 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 sm[rowIndex]==null?"Unknown":
+ sm[rowIndex].getTransition(event[rowIndex].getTransition()).getName();
+ case 3: return event[rowIndex].getTimeString();
+ case 4: return event[rowIndex].getAgentPath().getAgentName();
+ case 5: return event[rowIndex].getAgentRole();
+ case 6: return event[rowIndex].getSchemaName()+" v"+event[rowIndex].getSchemaVersion();
+ case 7: return event[rowIndex].getViewName();
+ default: return "";
+ }
+ } catch (Exception e) {
+ return null;
+ }
+ }
+
+ public Event getEventForRow(int rowIndex) {
+ return event[rowIndex];
+ }
+
+ /**
+ * @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);
+ }
+
+}