/* * PartitionsPanel.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.bss; import jam.framework.Exportable; import jam.panels.ActionPanel; import jam.table.TableRenderer; import java.awt.BorderLayout; import java.awt.Insets; import java.awt.event.ActionEvent; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.JComponent; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.SwingConstants; import javax.swing.event.TableModelEvent; import javax.swing.event.TableModelListener; import javax.swing.table.TableColumn; /** * @author Filip Bielejec * @version $Id$ */ @SuppressWarnings("serial") public class PartitionsPanel extends JPanel implements Exportable { private PartitionDataList dataList = null; private JTable partitionTable = null; private PartitionTableModel partitionTableModel = null; private JTableComboBoxCellEditor jTableComboBoxCellEditor = null; private TableColumnHider hider; private JScrollPane scrollPane; private TableColumn column; private int columnIndex; private int partitionsCount; private Action addPartitionAction = new AbstractAction("+") { public void actionPerformed(ActionEvent ae) { // partitionTableModel.copyPreviousRow(); partitionTableModel.addDefaultRow(); setPartitions(); }// END: actionPerformed }; private Action removePartitionAction = new AbstractAction("-") { public void actionPerformed(ActionEvent ae) { if (partitionsCount > 1) { partitionTableModel.deleteRow(partitionsCount - 1); setPartitions(); } }// END: actionPerformed }; public PartitionsPanel(PartitionDataList dataList) { this.dataList = dataList; partitionTable = new JTable(); partitionTable.getTableHeader().setReorderingAllowed(false); partitionTable.addMouseListener(new JTableButtonMouseListener( partitionTable)); partitionTableModel = new PartitionTableModel(this.dataList); partitionTableModel .addTableModelListener(new PartitionTableModelListener()); partitionTable.setModel(partitionTableModel); hider = new TableColumnHider(partitionTable); setLayout(new BorderLayout()); scrollPane = new JScrollPane(partitionTable, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); RowNumberTable rowNumberTable = new RowNumberTable(partitionTable); scrollPane.setRowHeaderView(rowNumberTable); scrollPane.setCorner(JScrollPane.UPPER_LEFT_CORNER, rowNumberTable.getTableHeader()); scrollPane.getViewport().setOpaque(false); add(scrollPane, BorderLayout.CENTER); //TODO: Input columnIndex = PartitionTableModel.DATA_INDEX; column = partitionTable.getColumnModel().getColumn( columnIndex); column.setCellRenderer(new JTableComboBoxCellRenderer(columnIndex)); jTableComboBoxCellEditor = new JTableComboBoxCellEditor(this.dataList); column.setCellEditor(jTableComboBoxCellEditor); column.setMinWidth(100); column = partitionTable.getColumnModel().getColumn( PartitionTableModel.FROM_INDEX); column.setCellRenderer( new TableRenderer(SwingConstants.LEFT, new Insets(0, 2, 0, 2))); column.setPreferredWidth(80); column = partitionTable.getColumnModel().getColumn( PartitionTableModel.TO_INDEX); column.setCellRenderer( new TableRenderer(SwingConstants.LEFT, new Insets(0, 2, 0, 2))); column.setPreferredWidth(80); column = partitionTable.getColumnModel().getColumn( PartitionTableModel.EVERY_INDEX); column.setCellRenderer( new TableRenderer(SwingConstants.LEFT, new Insets(0, 2, 0, 2))); column.setPreferredWidth(80); columnIndex = PartitionTableModel.DATA_TYPE_INDEX; column = partitionTable.getColumnModel().getColumn( columnIndex); column.setCellEditor(new JTableComboBoxCellEditor(this.dataList)); column.setCellRenderer(new JTableComboBoxCellRenderer(columnIndex)); column = partitionTable.getColumnModel().getColumn( PartitionTableModel.DEMOGRAPHIC_MODEL_INDEX); column.setCellRenderer(new JTableButtonCellRenderer()); column.setCellEditor(new JTableButtonCellEditor()); column = partitionTable.getColumnModel().getColumn( PartitionTableModel.BRANCH_SUBSTITUTION_MODEL_INDEX); column.setCellRenderer(new JTableButtonCellRenderer()); column.setCellEditor(new JTableButtonCellEditor()); column = partitionTable.getColumnModel().getColumn( PartitionTableModel.FREQUENCY_MODEL_INDEX); column.setCellRenderer(new JTableButtonCellRenderer()); column.setCellEditor(new JTableButtonCellEditor()); column = partitionTable.getColumnModel().getColumn( PartitionTableModel.SITE_RATE_MODEL_INDEX); column.setCellRenderer(new JTableButtonCellRenderer()); column.setCellEditor(new JTableButtonCellEditor()); column = partitionTable.getColumnModel().getColumn( PartitionTableModel.CLOCK_RATE_MODEL_INDEX); column.setCellRenderer(new JTableButtonCellRenderer()); column.setCellEditor(new JTableButtonCellEditor()); String toolTipText = "Leave this field empty to start from a random root sequence."; column = partitionTable.getColumnModel().getColumn( PartitionTableModel.ROOT_SEQUENCE_INDEX); JTableButtonCellRenderer jTableButtonCellRenderer = new JTableButtonCellRenderer(); jTableButtonCellRenderer.setColumnToolTipText(toolTipText); column.setCellRenderer(jTableButtonCellRenderer); column.setCellEditor(new JTableButtonCellEditor()); ActionPanel actionPanel = new ActionPanel(false); actionPanel.setAddAction(addPartitionAction); actionPanel.setRemoveAction(removePartitionAction); add(actionPanel, BorderLayout.SOUTH); setPartitions(); }// END: Constructor private void setPartitions() { partitionsCount = dataList.size(); addPartitionAction.setEnabled(true); if (partitionsCount == 1) { removePartitionAction.setEnabled(false); } else { removePartitionAction.setEnabled(true); } ColumnResizer.adjustColumnPreferredWidths(partitionTable); }// END: setPartitions // Listen to tree choices, set tree model in partition data private class PartitionTableModelListener implements TableModelListener { public void tableChanged(TableModelEvent ev) { if (ev.getType() == TableModelEvent.UPDATE) { int row = ev.getFirstRow(); int column = ev.getColumn(); if (column == PartitionTableModel.DATA_INDEX) { TreesTableRecord value = (TreesTableRecord) partitionTableModel.getValueAt(row, column); dataList.get(row).record = (TreesTableRecord) value; }// END: column check }// END: event check // frame.collectAllSettings(); }// END: tableChanged }// END: InteractiveTableModelListener public void hideTreeColumn() { hider.hide(PartitionTableModel.COLUMN_NAMES[PartitionTableModel.DATA_INDEX]); } public void showTreeColumn() { hider.show(PartitionTableModel.COLUMN_NAMES[PartitionTableModel.DATA_INDEX]); } public JComponent getExportableComponent() { return this; }// END: getExportableComponent public void updatePartitionTable(PartitionDataList dataList) { partitionTableModel.setDataList(dataList); setDataList(dataList); setPartitions(); jTableComboBoxCellEditor.setDataList(dataList); partitionTableModel.fireTableDataChanged(); }// END: updatePartitionTable public void setDataList(PartitionDataList dataList) { this.dataList = dataList; } }// END: class