/* MontageTableModel.java created 2007-11-23 * */ package org.signalml.app.model.montage; import static org.signalml.app.util.i18n.SvarogI18n._; import java.awt.Window; import javax.swing.table.AbstractTableModel; import org.apache.log4j.Logger; import org.signalml.app.view.common.dialogs.errors.Dialogs; import org.signalml.domain.montage.Montage; import org.signalml.domain.montage.MontageEvent; import org.signalml.domain.montage.MontageException; import org.signalml.domain.montage.MontageListener; import org.signalml.domain.montage.SourceMontageEvent; import org.signalml.domain.montage.SourceMontageListener; /** MontageTableModel * * * @author Michal Dobaczewski © 2007-2008 CC Otwarte Systemy Komputerowe Sp. z o.o. */ public class MontageTableModel extends AbstractTableModel implements SourceMontageListener, MontageListener { private static final long serialVersionUID = 1L; protected static final Logger logger = Logger.getLogger(MontageTableModel.class); public static final int INDEX_COLUMN = 0; public static final int PRIMARY_LABEL_COLUMN = 1; public static final int LABEL_COLUMN = 2; private Montage montage; public MontageTableModel() { } public Montage getMontage() { return montage; } public void setMontage(Montage montage) { if (this.montage != montage) { if (this.montage != null) { this.montage.removeSourceMontageListener(this); this.montage.removeMontageListener(this); } this.montage = montage; if (montage != null) { montage.addSourceMontageListener(this); montage.addMontageListener(this); } fireTableDataChanged(); } } @Override public int getColumnCount() { return 3; } @Override public int getRowCount() { if (montage == null) { return 0; } return montage.getMontageChannelCount(); } @Override public boolean isCellEditable(int rowIndex, int columnIndex) { if (columnIndex == INDEX_COLUMN || columnIndex == PRIMARY_LABEL_COLUMN) { return false; } return true; } @Override public String getColumnName(int column) { switch (column) { case INDEX_COLUMN : return _("Index"); case PRIMARY_LABEL_COLUMN : return _("Primary label"); case LABEL_COLUMN : return _("Label"); default : throw new IndexOutOfBoundsException(); } } @Override public Class<?> getColumnClass(int columnIndex) { switch (columnIndex) { case INDEX_COLUMN : return Integer.class; case PRIMARY_LABEL_COLUMN : return String.class; case LABEL_COLUMN : return String.class; default : throw new IndexOutOfBoundsException(); } } @Override public Object getValueAt(int rowIndex, int columnIndex) { switch (columnIndex) { case INDEX_COLUMN : return (rowIndex+1); case PRIMARY_LABEL_COLUMN : return montage.getReferenceReadable(rowIndex); case LABEL_COLUMN : return montage.getMontageChannelLabelAt(rowIndex); default : throw new IndexOutOfBoundsException(); } } @Override public void setValueAt(Object value, int rowIndex, int columnIndex) { if (columnIndex == INDEX_COLUMN) { return; } if (columnIndex == LABEL_COLUMN) { try { montage.setMontageChannelLabelAt(rowIndex, (String) value); } catch (MontageException ex) { Dialogs.showExceptionDialog((Window) null, ex); fireTableDataChanged(); return; } } else { throw new IndexOutOfBoundsException(); } } @Override public void sourceMontageChannelAdded(SourceMontageEvent ev) { // this doesn't immediately affect this table } @Override public void sourceMontageChannelChanged(SourceMontageEvent ev) { // this may affect any row fireTableRowsUpdated(0, getRowCount()-1); } @Override public void sourceMontageChannelRemoved(SourceMontageEvent ev) { // this may affect any row and remove any number of rows fireTableDataChanged(); } @Override public void montageChannelsAdded(MontageEvent ev) { int[] indices = ev.getChannels(); if (indices.length == 0) { return; } for (int i=0; i<(indices.length-1); i++) { if (indices[i] != (indices[i+1]-1)) { // if non-contiguous fire a total update fireTableDataChanged(); return; } } // if contiguous fire an insert fireTableRowsInserted(indices[0], indices[indices.length-1]); } @Override public void montageChannelsChanged(MontageEvent ev) { int[] indices = ev.getChannels(); for (int i=0; i<indices.length; i++) { fireTableRowsUpdated(indices[i], indices[i]); } } @Override public void montageChannelsRemoved(MontageEvent ev) { int[] indices = ev.getChannels(); if (indices.length == 0) { return; } for (int i=0; i<(indices.length-1); i++) { if (indices[i] != (indices[i+1]-1)) { // if non-contiguous fire a total update fireTableDataChanged(); return; } } // if contiguous fire a delete fireTableRowsDeleted(indices[0], indices[indices.length-1]); } @Override public void montageReferenceChanged(MontageEvent ev) { // this is not reflected in this table so far } @Override public void montageStructureChanged(MontageEvent ev) { fireTableDataChanged(); } @Override public void sourceMontageEegSystemChanged(SourceMontageEvent ev) { } }