package com.ibm.nmon.gui.interval; import java.util.List; import javax.swing.table.AbstractTableModel; import com.ibm.nmon.gui.main.NMONVisualizerGui; import com.ibm.nmon.interval.IntervalListener; import com.ibm.nmon.interval.Interval; /** * <p> * Table model for displaying a list of Intervals. Intervals are added and removed only by listening * to the IntervalManager. * </p> * * <p> * This model maintains the intervals in sorted order. * </p> */ final class IntervalTableModel extends AbstractTableModel implements IntervalListener { private static final long serialVersionUID = 8444774364976685957L; private static final String[] columnNames = { "Name", "Start", "End" }; private final List<Interval> intervals = new java.util.LinkedList<Interval>(); IntervalTableModel(NMONVisualizerGui gui) { // potential race condition here in that intervals could be added between construction and // the time this model is added as a listener // not worrying about this under the assumption that the user cannot add intervals when then // gui is still being built for (Interval interval : gui.getIntervalManager().getIntervals()) { intervals.add(interval); } java.util.Collections.sort(intervals); } @Override public int getRowCount() { return intervals.size(); } @Override public int getColumnCount() { return columnNames.length; } @Override public String getColumnName(int col) { return columnNames[col]; } @Override public Class<?> getColumnClass(int c) { if (c == 0) { return String.class; } else { return Long.class; } } @Override public Object getValueAt(int rowIndex, int columnIndex) { switch (columnIndex) { case 0: return intervals.get(rowIndex).getName(); case 1: return intervals.get(rowIndex).getStart(); case 2: return intervals.get(rowIndex).getEnd(); default: throw new IndexOutOfBoundsException(); } } public Interval getValueAt(int rowIndex) { return intervals.get(rowIndex); } @Override public boolean isCellEditable(int rowIndex, int columnIndex) { return columnIndex == 0; } @Override public void intervalAdded(Interval interval) { for (int i = 0; i < intervals.size(); i++) { if (intervals.get(i).compareTo(interval) >= 0) { intervals.add(i, interval); fireTableRowsInserted(i, i); return; } } // have not added yet, just add at the end intervals.add(interval); fireTableRowsInserted(intervals.size() - 1, intervals.size() - 1); } @Override public void intervalRemoved(Interval interval) { for (int i = 0; i < intervals.size(); i++) { if (intervals.get(i).equals(interval)) { intervals.remove(i); fireTableRowsDeleted(i, i); return; } } } @Override public void intervalsCleared() { intervals.clear(); fireTableDataChanged(); } @Override public void currentIntervalChanged(Interval interval) {} @Override public void intervalRenamed(Interval interval) { for (int i = 0; i < intervals.size(); i++) { if (intervals.get(i).equals(interval)) { fireTableRowsUpdated(i, i); return; } } } }