/* * MeasurementsPanel.java * * Copyright (c) 2002-2015 Alexei Drummond, Andrew Rambaut and Marc Suchard * * This file is part of BEAST. * See the NOTICE file distributed with this work for additional * information regarding copyright ownership and licensing. * * BEAST is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * BEAST is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with BEAST; if not, write to the * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, * Boston, MA 02110-1301 USA */ package dr.app.mapper.application; import dr.app.gui.FileDrop; import dr.app.gui.table.DateCellEditor; import dr.app.gui.table.TableEditorStopper; import dr.app.gui.table.TableSorter; import dr.evolution.util.Taxa; import dr.evolution.util.Taxon; import dr.util.DataTable; import jam.framework.Exportable; import jam.table.HeaderRenderer; import jam.table.TableRenderer; import javax.swing.*; import javax.swing.border.Border; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.plaf.BorderUIResource; import javax.swing.table.AbstractTableModel; import java.awt.*; import java.util.*; import java.util.List; /** * @author Andrew Rambaut * @version $Id: StrainsPanel.java,v 1.17 2006/09/05 13:29:34 rambaut Exp $ */ public class MeasurementsPanel extends JPanel implements Exportable, MapperDocument.Listener { private JScrollPane scrollPane = new JScrollPane(); private JTable dataTable = null; private DataTableModel dataTableModel = null; private final MapperFrame frame; private final MapperDocument document; public MeasurementsPanel(final MapperFrame parent, final MapperDocument document) { this.frame = parent; this.document = document; dataTableModel = new DataTableModel(); TableSorter sorter = new TableSorter(dataTableModel); dataTable = new JTable(sorter); sorter.setTableHeader(dataTable.getTableHeader()); dataTable.getTableHeader().setReorderingAllowed(false); dataTable.getTableHeader().setDefaultRenderer( new HeaderRenderer(SwingConstants.LEFT, new Insets(0, 4, 0, 4))); dataTable.getColumnModel().getColumn(0).setCellRenderer( new TableRenderer(SwingConstants.LEFT, new Insets(0, 4, 0, 4))); dataTable.getColumnModel().getColumn(0).setPreferredWidth(80); dataTable.getColumnModel().getColumn(1).setCellRenderer( new TableRenderer(SwingConstants.LEFT, new Insets(0, 4, 0, 4))); dataTable.getColumnModel().getColumn(1).setPreferredWidth(80); dataTable.getColumnModel().getColumn(1).setCellEditor( new DateCellEditor()); dataTable.getColumnModel().getColumn(2).setCellRenderer( new TableRenderer(SwingConstants.LEFT, new Insets(0, 4, 0, 4))); dataTable.getColumnModel().getColumn(2).setPreferredWidth(80); TableEditorStopper.ensureEditingStopWhenTableLosesFocus(dataTable); dataTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent evt) { selectionChanged(); } }); scrollPane = new JScrollPane(dataTable, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); scrollPane.setOpaque(false); JToolBar toolBar1 = new JToolBar(); toolBar1.setFloatable(false); toolBar1.setOpaque(false); // toolBar1.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0)); // JButton button = new JButton(clearDatesAction); // PanelUtils.setupComponent(button); // toolBar1.add(button); // button = new JButton(guessDatesAction); // PanelUtils.setupComponent(button); // toolBar1.add(button); // toolBar1.add(new JToolBar.Separator(new Dimension(12, 12))); // final JLabel unitsLabel = new JLabel("Dates specified as "); // toolBar1.add(unitsLabel); // toolBar1.add(unitsCombo); // toolBar1.add(directionCombo); setOpaque(false); setBorder(new BorderUIResource.EmptyBorderUIResource(new Insets(12, 12, 12, 12))); setLayout(new BorderLayout(0, 0)); add(toolBar1, "North"); add(scrollPane, "Center"); Color focusColor = UIManager.getColor("Focus.color"); Border focusBorder = BorderFactory.createMatteBorder(2, 2, 2, 2, focusColor); scrollPane.setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2)); new FileDrop(null, scrollPane, focusBorder, new FileDrop.Listener() { public void filesDropped(java.io.File[] files) { frame.importMeasurementFiles(files); } // end filesDropped }); // end FileDrop.Listener } @Override public void taxaChanged() { dataTableModel.fireTableDataChanged(); } public JComponent getExportableComponent() { return dataTable; } public void selectionChanged() { // nothing to do } class DataTableModel extends AbstractTableModel { String[] columnNames = {"Serum", "Virus", "Titre", "Table"}; public DataTableModel() { } public int getColumnCount() { return columnNames.length; } public int getRowCount() { java.util.List<MapperDocument.Measurement> measurementList = document.getMeasurements(); return measurementList.size(); } public Object getValueAt(int row, int col) { MapperDocument.Measurement measurement = document.getMeasurements().get(row); switch (col) { case 0: return measurement.columnStrain.getId(); case 1: return measurement.rowStrain.getId(); case 2: // if (measurement.type == MapperDocument.MeasurementType.THRESHOLD) { // return "<" + measurement.titre; // } return measurement.titre; case 3: return measurement.column; } return null; } public void setValueAt(Object aValue, int row, int col) { // java.util.List<Taxon> taxonList = document.getTaxa(); // // if (col == 0) { // taxonList.get(row).setId(aValue.toString()); // } else if (col == 1) { // Date date = taxonList.get(row).getDate(); // if (date != null) { // double d = (Double) aValue; // Date newDate = createDate(d, date.getUnits(), date.isBackwards(), date.getOrigin()); // taxonList.get(row).setDate(newDate); // } // } // // timeScaleChanged(); } public boolean isCellEditable(int row, int col) { // if (col == 0) return true; // if (col == 1) { // Date date = document.getTaxa().get(row).getDate(); // return (date != null); // } return false; } public String getColumnName(int column) { return columnNames[column]; } public Class getColumnClass(int c) { return getValueAt(0, c).getClass(); } public String toString() { StringBuffer buffer = new StringBuffer(); buffer.append(getColumnName(0)); for (int j = 1; j < getColumnCount(); j++) { buffer.append("\t"); buffer.append(getColumnName(j)); } buffer.append("\n"); for (int i = 0; i < getRowCount(); i++) { buffer.append(getValueAt(i, 0)); for (int j = 1; j < getColumnCount(); j++) { buffer.append("\t"); buffer.append(getValueAt(i, j)); } buffer.append("\n"); } return buffer.toString(); } } }