
net.maizegenetics.tassel.DataTreePanel Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of tassel Show documentation
Show all versions of tassel Show documentation
TASSEL is a software package to evaluate traits associations, evolutionary patterns, and linkage
disequilibrium.
/*
* TASSEL - Trait Analysis by a aSSociation Evolution & Linkage
* Copyright (C) 2003 Ed Buckler
*
* This software evaluates linkage disequilibrium nucletide diversity and
* associations. For more information visit http://www.maizegenetics.net
*
* This software is distributed under GNU general public license and without
* any warranty ot technical support.
*
* You can redistribute and/or modify it under the terms of GNU General
* public license.
*
*/
package net.maizegenetics.tassel;
import net.maizegenetics.analysis.association.EqtlAssociationPlugin;
import net.maizegenetics.analysis.association.FixedEffectLMPlugin;
import net.maizegenetics.analysis.association.MLMPlugin;
import net.maizegenetics.analysis.data.GenotypeSummaryPlugin;
import net.maizegenetics.analysis.popgen.LinkageDisequilibriumPlugin;
import net.maizegenetics.analysis.popgen.SequenceDiversityPlugin;
import net.maizegenetics.dna.map.Chromosome;
import net.maizegenetics.dna.map.PositionList;
import net.maizegenetics.dna.map.TOPMInterface;
import net.maizegenetics.dna.snp.FilterList;
import net.maizegenetics.dna.snp.GenotypeTable;
import net.maizegenetics.dna.snp.NucleotideAlignmentConstants;
import net.maizegenetics.gui.GenotypeTableMask;
import net.maizegenetics.phenotype.Phenotype;
import net.maizegenetics.plugindef.DataSet;
import net.maizegenetics.plugindef.Datum;
import net.maizegenetics.plugindef.Plugin;
import net.maizegenetics.plugindef.PluginEvent;
import net.maizegenetics.plugindef.PluginListener;
import net.maizegenetics.taxa.IdentifierSynonymizer;
import net.maizegenetics.taxa.TaxaList;
import net.maizegenetics.taxa.distance.DistanceMatrix;
import net.maizegenetics.taxa.tree.SimpleTree;
import net.maizegenetics.taxa.tree.Tree;
import net.maizegenetics.util.GeneralAnnotation;
import net.maizegenetics.util.HDF5TableReport;
import net.maizegenetics.util.TableReport;
import org.apache.log4j.Logger;
import javax.swing.*;
import javax.swing.event.TreeModelEvent;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.MutableTreeNode;
import javax.swing.tree.TreeNode;
import javax.swing.tree.TreePath;
import javax.swing.tree.TreeSelectionModel;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.io.Serializable;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
public class DataTreePanel extends JPanel implements PluginListener {
private static final Logger myLogger = Logger.getLogger(DataTreePanel.class);
public static final String NODE_TYPE_DATA = "Data";
public static final String NODE_TYPE_RESULT = "Result";
public static final String NODE_TYPE_SEQUENCE = "Sequence";
public static final String NODE_TYPE_POLYMORPHISMS = "Polymorphisms";
public static final String NODE_TYPE_NUMERICAL = "Numerical";
public static final String NODE_TYPE_HDF5_SCHEMA = "HDF5 Schema";
public static final String NODE_TYPE_MATRIX = "Matrix";
public static final String NODE_TYPE_TREE = "Tree";
public static final String NODE_TYPE_LISTS = "Lists";
public static final String NODE_TYPE_FILTERS = "Filters";
public static final String NODE_TYPE_FUSIONS = "Fusions";
public static final String NODE_TYPE_SYNONYMS = "Synonyms";
public static final String NODE_TYPE_DIVERSITY = "Diversity";
public static final String NODE_TYPE_SNP_ASSAYS = "SNP Assays";
public static final String NODE_TYPE_LD = "LD";
public static final String NODE_TYPE_ASSOCIATIONS = "Association";
public static final String NODE_TYPE_VARIANCES = "Variances";
public static final String NODE_TYPE_SYNONYMIZER = "Synonymizer";
public static final String NODE_TYPE_STEPWISE = "Stepwise";
public static final String NODE_TYPE_TOPM = "TOPM";
public static final String NODE_TYPE_GENO_SUMMARY = "Genotype Summary";
public static final String NODE_TYPE_DEFAULT = NODE_TYPE_DATA;
private static final List NODE_TYPE_DATA_CHILDREN = new ArrayList<>();
static {
NODE_TYPE_DATA_CHILDREN.add(NODE_TYPE_SEQUENCE);
NODE_TYPE_DATA_CHILDREN.add(NODE_TYPE_POLYMORPHISMS);
NODE_TYPE_DATA_CHILDREN.add(NODE_TYPE_NUMERICAL);
NODE_TYPE_DATA_CHILDREN.add(NODE_TYPE_HDF5_SCHEMA);
NODE_TYPE_DATA_CHILDREN.add(NODE_TYPE_MATRIX);
NODE_TYPE_DATA_CHILDREN.add(NODE_TYPE_TREE);
NODE_TYPE_DATA_CHILDREN.add(NODE_TYPE_FUSIONS);
NODE_TYPE_DATA_CHILDREN.add(NODE_TYPE_TOPM);
NODE_TYPE_DATA_CHILDREN.add(NODE_TYPE_LISTS);
NODE_TYPE_DATA_CHILDREN.add(NODE_TYPE_FILTERS);
}
//Possible line styles...
//"Angled", "Horizontal", and "None" (the default).
private String myLineStyle = "Angled";
private JTree myTree;
private DefaultTreeModel myTreeModel;
private TASSELMainFrame myTASSELMainFrame;
private HashMap myNodeHash = new HashMap<>();
private LinkedHashMap myDataSetList = new LinkedHashMap();
private Datum myLastBookSelected;
private DefaultMutableTreeNode myTopNode;
private DefaultMutableTreeNode myDataNode;
private DefaultMutableTreeNode myResultNode;
private DefaultMutableTreeNode myLastNode = null;
private TreeSelectionListener myTreeSelectionListener = null;
public DataTreePanel(TASSELMainFrame theQAF) {
super();
myTASSELMainFrame = theQAF;
myTopNode = new DefaultMutableTreeNode("top");
createNodes();
myTreeModel = new DefaultTreeModel(myTopNode);
myTree = new JTree(myTreeModel);
myTree.setRootVisible(false);
myTree.setEditable(true);
myTreeModel.addTreeModelListener(new MyTreeModelListener(this));
myTree.getSelectionModel().setSelectionMode(TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION);
myTree.setLargeModel(true);
//Listen for when the selection changes.
initSelectionListener();
initKeyStrokeListener();
myTree.putClientProperty("JTree.lineStyle", myLineStyle);
myTree.setCellRenderer(new DefaultTreeCellRenderer() {
public Component getTreeCellRendererComponent(JTree pTree,
Object pValue, boolean pIsSelected, boolean pIsExpanded,
boolean pIsLeaf, int pRow, boolean pHasFocus) {
DefaultMutableTreeNode node = (DefaultMutableTreeNode) pValue;
Datum nodeInfo = (Datum) node.getUserObject();
Component result = super.getTreeCellRendererComponent(pTree, pValue, pIsSelected,
pIsExpanded, pIsLeaf, pRow, pHasFocus);
Object data = nodeInfo.getData();
if (data instanceof GenotypeTableMask) {
result.setForeground(((GenotypeTableMask) nodeInfo.getData()).getColor());
}
return result;
}
});
try {
jbInit();
} catch (Exception e) {
e.printStackTrace();
}
}
public DataTreePanel getThis() {
return this;
}
private void processMyKeyStroke(KeyEvent e) {
// only respond if the KeyEvent is a key released event.
if (e.getID() == KeyEvent.KEY_RELEASED) {
if (KeyEvent.VK_DELETE == e.getKeyCode()) {
TreePath[] currentSelection = myTree.getSelectionPaths();
String pluralQuestion = "Are you sure you want to delete these " + currentSelection.length + " nodes?";
String question = "Are you sure you want to delete this node?";
if (currentSelection.length > 1) {
question = pluralQuestion;
}
int userResponse = JOptionPane.showOptionDialog(myTASSELMainFrame, question, "Node Deletion",
JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, null, null);
if (userResponse == JOptionPane.YES_OPTION) {
deleteSelectedNodes();
}
}
}
}
private void initKeyStrokeListener() {
myTree.addKeyListener(new KeyAdapter() {
/**
* Invoked when a key has been released.
*/
public void keyReleased(KeyEvent e) {
super.keyReleased(e);
processMyKeyStroke(e);
}
});
}
private void initSelectionListener() {
myTreeSelectionListener = (new TreeSelectionListener() {
@Override
public void valueChanged(TreeSelectionEvent e) {
try {
DefaultMutableTreeNode node = null;
if ((e != null) && (e.getSource() instanceof DefaultMutableTreeNode)) {
node = (DefaultMutableTreeNode) e.getSource();
} else {
node = (DefaultMutableTreeNode) myTree.getLastSelectedPathComponent();
}
if (node == null) {
return;
}
if (myLastNode == node) {
return;
}
myLastNode = node;
Object nodeInfo = node.getUserObject();
myLastBookSelected = (Datum) nodeInfo;
Datum book = (Datum) nodeInfo;
myLogger.info("initSelectionListener: node type: " + book.getDataType());
StringBuilder builder = new StringBuilder();
if (book.getData() instanceof GenotypeTable) {
GenotypeTable a = (GenotypeTable) book.getData();
builder.append("Number of taxa: ");
builder.append(a.numberOfTaxa());
builder.append("\n");
builder.append("Number of sites: ");
builder.append(a.numberOfSites());
builder.append("\n");
Chromosome[] loci = a.chromosomes();
PositionList positions = null;
boolean first = true;
int numLoci = 0;
if (loci != null) {
numLoci = loci.length;
positions = a.positions();
}
for (int i = 0; i < numLoci; i++) {
String name = loci[i].getName();
if ((name == null) || (name.length() == 0)) {
continue;
}
if (first) {
builder.append("\nChromosomes...\n\n");
first = false;
}
builder.append(name);
int[] firstLast = a.firstLastSiteOfChromosome(loci[i]);
builder.append(": ");
builder.append(firstLast[1] - firstLast[0] + 1);
builder.append(" sites:\n");
builder.append(firstLast[0]);
builder.append(" (");
builder.append(positions.get(firstLast[0]).getPosition());
builder.append(") - ");
builder.append(firstLast[1]);
builder.append(" (");
builder.append(positions.get(firstLast[1]).getPosition());
builder.append(")");
builder.append("\n\n");
}
}
if (book.getData() instanceof GenotypeTable) {
try {
GenotypeTable a = (GenotypeTable) book.getData();
if ((a.hasGenotype()) && (NucleotideAlignmentConstants.isNucleotideEncodings(a.alleleDefinitions()))) {
builder.append("\n");
builder.append("Nucleotide Codes\n(Derived from IUPAC)...\n");
builder.append("A A:A\n");
builder.append("C C:C\n");
builder.append("G G:G\n");
builder.append("T T:T\n");
builder.append("R A:G\n");
builder.append("Y C:T\n");
builder.append("S C:G\n");
builder.append("W A:T\n");
builder.append("K G:T\n");
builder.append("M A:C\n");
builder.append("+ +:+ (insertion)\n");
builder.append("0 +:-\n");
builder.append("- -:- (deletion)\n");
builder.append("N Unknown\n\n");
}
} catch (Exception ex) {
myLogger.debug(ex.getMessage(), ex);
}
}
if (book.getData() instanceof TableReport) {
TableReport tr = (TableReport) book.getData();
long numColumns = tr.getColumnCount();
long numRows = tr.getRowCount();
builder.append("Table Title: ");
builder.append(tr.getTableTitle());
builder.append("\n");
builder.append("Number of columns: ");
builder.append(numColumns);
builder.append("\n");
builder.append("Number of rows: ");
builder.append(numRows);
builder.append("\n");
builder.append("Matrix size (excludes row headers): ");
builder.append((numColumns - 1) * numRows);
builder.append("\n");
}
if (book.getData() instanceof TOPMInterface) {
TOPMInterface topm = (TOPMInterface) book.getData();
builder.append("Number of Tags: ");
builder.append(topm.getSize());
builder.append("\n");
}
if (book.getData() instanceof DistanceMatrix) {
DistanceMatrix matrix = (DistanceMatrix) book.getData();
GeneralAnnotation annotations = matrix.annotations();
if ((annotations != null) && (annotations.numAnnotations() != 0)) {
builder.append("\nAnnotations...\n");
for (Map.Entry entry : annotations.getAllAnnotationEntries()) {
builder.append(entry.getKey());
builder.append(": ");
builder.append(entry.getValue());
builder.append("\n");
}
builder.append("\n");
}
}
if (book.getData() instanceof TaxaList) {
TaxaList taxa = (TaxaList) book.getData();
builder.append("Number of Taxa: ");
builder.append(taxa.numberOfTaxa());
builder.append("\n\n");
}
String comment = book.getComment();
if ((comment != null) && (comment.length() != 0)) {
builder.append(comment);
}
myTASSELMainFrame.setNoteText(builder.toString());
if (book.getData() != null) {
myTASSELMainFrame.mainDisplayPanel.removeAll();
if (book.getData() instanceof TableReport) {
long size = ((TableReport) book.getData()).getElementCount();
myLogger.info("initSelectionListener: Table Report Size: " + size);
if (size == 0) {
JPanel blankPanel = new JPanel();
blankPanel.setLayout(new BorderLayout());
blankPanel.add(new JLabel(" Nothing to Display"), BorderLayout.CENTER);
myTASSELMainFrame.mainDisplayPanel.add(blankPanel, BorderLayout.CENTER);
} else {
TableReportPanel theATP = TableReportPanel.getInstance((TableReport) book.getData());
myTASSELMainFrame.mainDisplayPanel.add(theATP, BorderLayout.CENTER);
}
} else if (book.getData() instanceof FilterList) {
TableReportPanel theATP = TableReportPanel.getInstance((FilterList) book.getData());
myTASSELMainFrame.mainDisplayPanel.add(theATP, BorderLayout.CENTER);
} else if (book.getData() instanceof TOPMInterface) {
int size = ((TOPMInterface) book.getData()).getTagCount();
myLogger.info("initSelectionListener: TOPM Tag Count: " + size);
if (size == 0) {
JPanel blankPanel = new JPanel();
blankPanel.setLayout(new BorderLayout());
blankPanel.add(new JLabel(" No Tags"), BorderLayout.CENTER);
myTASSELMainFrame.mainDisplayPanel.add(blankPanel, BorderLayout.CENTER);
} else {
String name = book.getName();
if (name.endsWith("(Graphical)")) {
SeqViewerPanel seqViewer = SeqViewerPanel.getInstance((TOPMInterface) book.getData(), getThis());
myTASSELMainFrame.mainDisplayPanel.add(seqViewer, BorderLayout.CENTER);
} else {
TableReportPanel theATP = TableReportPanel.getInstance((TOPMInterface) book.getData());
myTASSELMainFrame.mainDisplayPanel.add(theATP, BorderLayout.CENTER);
}
}
} else if (book.getData() instanceof TaxaList) {
int size = ((TaxaList) book.getData()).numberOfTaxa();
myLogger.info("initSelectionListener: Number of Taxa: " + size);
if (size == 0) {
JPanel blankPanel = new JPanel();
blankPanel.setLayout(new BorderLayout());
blankPanel.add(new JLabel(" No Taxa"), BorderLayout.CENTER);
myTASSELMainFrame.mainDisplayPanel.add(blankPanel, BorderLayout.CENTER);
} else {
TableReportPanel theATP = TableReportPanel.getInstance((TaxaList) book.getData());
myTASSELMainFrame.mainDisplayPanel.add(theATP, BorderLayout.CENTER);
}
} else if (book.getData() instanceof PositionList) {
int size = ((PositionList) book.getData()).numberOfSites();
myLogger.info("initSelectionListener: Number of Positions: " + size);
if (size == 0) {
JPanel blankPanel = new JPanel();
blankPanel.setLayout(new BorderLayout());
blankPanel.add(new JLabel(" No Positions"), BorderLayout.CENTER);
myTASSELMainFrame.mainDisplayPanel.add(blankPanel, BorderLayout.CENTER);
} else {
TableReportPanel theATP = TableReportPanel.getInstance((PositionList) book.getData());
myTASSELMainFrame.mainDisplayPanel.add(theATP, BorderLayout.CENTER);
}
} else if (book.getData() instanceof GenotypeTable) {
GenotypeTable align = (GenotypeTable) book.getData();
List masks = new ArrayList();
for (int i = 0, n = node.getChildCount(); i < n; i++) {
try {
DefaultMutableTreeNode currentNode = (DefaultMutableTreeNode) node.getChildAt(i);
Datum currentDatum = (Datum) currentNode.getUserObject();
Object currentMask = currentDatum.getData();
if ((currentMask != null) && (currentMask instanceof GenotypeTableMask)) {
masks.add(currentMask);
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
SeqViewerPanel seqViewer = null;
if (masks.size() != 0) {
GenotypeTableMask[] masksArray = new GenotypeTableMask[masks.size()];
masks.toArray(masksArray);
seqViewer = SeqViewerPanel.getInstance(align, masksArray, getThis());
} else {
seqViewer = SeqViewerPanel.getInstance(align, getThis());
}
myTASSELMainFrame.mainDisplayPanel.add(seqViewer, BorderLayout.CENTER);
} else if (book.getData() instanceof GenotypeTableMask) {
GenotypeTableMask mask = (GenotypeTableMask) book.getData();
if (mask.getColor() != null) {
Color tempColor = JColorChooser.showDialog(myTASSELMainFrame, "Select Mask Color...", mask.getColor());
//myTree.setSelectionPath(new TreePath(parentNode.getPath()));
if (tempColor != null) {
mask.setColor(tempColor);
book.setName(mask.toString());
}
}
myLastNode = null;
DefaultMutableTreeNode parentNode = (DefaultMutableTreeNode) node.getParent();
TreeSelectionEvent event = new TreeSelectionEvent(parentNode, null, false, null, null);
myTreeSelectionListener.valueChanged(event);
} else if (book.getData() instanceof SimpleTree) {
myTASSELMainFrame.mainDisplayPanel.add(myTASSELMainFrame.mainPanelScrollPane, BorderLayout.CENTER);
SimpleTree tree = (SimpleTree) book.getData();
StringWriter writer = null;
try {
if (tree.getExternalNodeCount() < 300) {
writer = new StringWriter();
tree.report(writer);
myTASSELMainFrame.setMainText(writer.toString());
} else {
myTASSELMainFrame.setMainText(tree.toString());
}
} catch (Exception ex) {
myLogger.debug(ex.getMessage(), ex);
} finally {
try {
writer.close();
} catch (Exception ex) {
// do nothing
}
}
} else {
myTASSELMainFrame.mainDisplayPanel.add(myTASSELMainFrame.mainPanelScrollPane, BorderLayout.CENTER);
String s = book.getData().toString();
if (s.length() > 2000000) {
s = s.substring(1, 2000000) + "\n Truncated view. Too much to display. Save it to a file.";
}
myTASSELMainFrame.setMainText(s);
}
myTASSELMainFrame.sendMessage(book.getData().getClass().toString());
myTASSELMainFrame.mainDisplayPanel.revalidate();
myTASSELMainFrame.mainDisplayPanel.repaint();
}
} catch (Throwable e1) {
String userMessage = "TASSEL has experienced an error. ";
if (e1 instanceof java.lang.OutOfMemoryError) {
userMessage = "You have used up all of the memory allocated to the Java Virtual Machine. \n"
+ "It is recommneded that you adjust your heap settings and possibly add more memory to the computer\n"
+ "Additionally, some operations are not recommended on a full dataset, i.e., select SNPs *before* determining LD";
}
JOptionPane.showMessageDialog(myTASSELMainFrame, userMessage, "Fatal Error", JOptionPane.ERROR_MESSAGE);
e1.printStackTrace();
}
}
});
myTree.addTreeSelectionListener(myTreeSelectionListener);
}
private void createNodes() {
myDataNode = new DefaultMutableTreeNode(new Datum(NODE_TYPE_DATA, "Node on data tree", "Holds the basic data structures"));
myTopNode.add(myDataNode);
myNodeHash.put(NODE_TYPE_DATA, myDataNode);
myResultNode = new DefaultMutableTreeNode(new Datum(NODE_TYPE_RESULT, "Node on data tree", "Holds the basic result structures"));
myTopNode.add(myResultNode);
myNodeHash.put(NODE_TYPE_RESULT, myResultNode);
}
private synchronized DefaultMutableTreeNode getTreeNode(String nodeString) {
DefaultMutableTreeNode result = myNodeHash.get(nodeString);
if (result == null) {
if (NODE_TYPE_DATA_CHILDREN.contains(nodeString)) {
result = new DefaultMutableTreeNode(new Datum(nodeString, nodeString, nodeString));
int childIndex = getInsertLocation(myDataNode, nodeString);
myTreeModel.insertNodeInto(result, myDataNode, childIndex);
myNodeHash.put(nodeString, result);
} else {
result = new DefaultMutableTreeNode(new Datum(nodeString, nodeString, nodeString));
int childIndex = getInsertLocation(myResultNode, nodeString);
myTreeModel.insertNodeInto(result, myResultNode, childIndex);
myNodeHash.put(nodeString, result);
}
}
return result;
}
private int getInsertLocation(DefaultMutableTreeNode node, String newNode) {
Enumeration children = node.children();
int result = 0;
while (children.hasMoreElements()) {
DefaultMutableTreeNode currentNode = (DefaultMutableTreeNode) children.nextElement();
Datum current = (Datum) currentNode.getUserObject();
if (current.getName().compareTo(newNode) > 0) {
break;
}
result++;
}
return result;
}
private void jbInit() throws Exception {
JScrollPane jScrollPane1 = new JScrollPane(myTree);
jScrollPane1.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
setLayout(new BorderLayout());
add(jScrollPane1, BorderLayout.CENTER);
}
private void deleteDatumFromList(Datum datum) {
Iterator itr = myDataSetList.keySet().iterator();
while (itr.hasNext()) {
Datum current = (Datum) itr.next();
if (current == datum) {
itr.remove();
break;
}
}
}
public void addDataSet(DataSet theDataSet, String defaultNode) {
Plugin theCreator = theDataSet.getCreator();
for (int i = 0; i < theDataSet.getSize(); i++) {
Datum d = theDataSet.getData(i);
if ((theCreator instanceof MLMPlugin)
|| (theCreator instanceof FixedEffectLMPlugin)
|| (theCreator instanceof EqtlAssociationPlugin)) {
addDatum(NODE_TYPE_ASSOCIATIONS, d);
continue;
}
if (theCreator instanceof GenotypeSummaryPlugin) {
addDatum(NODE_TYPE_GENO_SUMMARY, d);
continue;
}
if (theCreator instanceof SequenceDiversityPlugin) {
addDatum(NODE_TYPE_DIVERSITY, d);
continue;
}
if (theCreator instanceof LinkageDisequilibriumPlugin) {
addDatum(NODE_TYPE_LD, d);
continue;
}
if (d.getData() instanceof GenotypeTable) {
addDatum(NODE_TYPE_SEQUENCE, d);
continue;
}
if (d.getData() instanceof GenotypeTableMask) {
addDatum(d);
continue;
}
if (d.getData() instanceof IdentifierSynonymizer) {
addDatum(NODE_TYPE_SYNONYMIZER, d);
continue;
}
if (d.getData() instanceof Phenotype) {
addDatum(NODE_TYPE_NUMERICAL, d);
continue;
}
if (d.getData() instanceof DistanceMatrix) {
addDatum(NODE_TYPE_MATRIX, d);
continue;
}
if (d.getData() instanceof HDF5TableReport) {
addDatum(NODE_TYPE_HDF5_SCHEMA, d);
continue;
}
if (d.getData() instanceof TableReport) {
addDatum(NODE_TYPE_NUMERICAL, d);
continue;
}
if (d.getData() instanceof FilterList) {
addDatum(NODE_TYPE_FILTERS, d);
continue;
}
if (d.getData() instanceof Tree) {
addDatum(NODE_TYPE_TREE, d);
continue;
}
if (d.getData() instanceof TaxaList) {
addDatum(NODE_TYPE_LISTS, d);
continue;
}
if (d.getData() instanceof PositionList) {
addDatum(NODE_TYPE_LISTS, d);
continue;
}
if (d.getData() instanceof TOPMInterface) {
addDatum(NODE_TYPE_TOPM, new Datum(d.getName() + " (Text)", d.getData(), null));
addDatum(NODE_TYPE_TOPM, new Datum(d.getName() + " (Graphical)", d.getData(), null));
continue;
}
if (defaultNode == null) {
addDatum(NODE_TYPE_DEFAULT, d);
continue;
}
addDatum(defaultNode, d);
}
}
public synchronized void addDatum(String dataParent, Datum theDatum) {
if (theDatum.getData() instanceof GenotypeTableMask) {
addDatum(theDatum);
return;
}
DefaultMutableTreeNode temp = findOnTree(theDatum);
if (temp != null) {
myTree.scrollPathToVisible(new TreePath(temp.getPath()));
myTree.validate();
myTree.repaint();
return;
}
DefaultMutableTreeNode parentNode = getTreeNode(dataParent);
DefaultMutableTreeNode childNode = new DefaultMutableTreeNode(theDatum);
myNodeHash.put(theDatum.getName(), childNode);
myTreeModel.insertNodeInto(childNode, parentNode, parentNode.getChildCount());
myTree.scrollPathToVisible(new TreePath(childNode.getPath()));
if (theDatum instanceof Serializable) {
myDataSetList.put(theDatum, dataParent);
}
}
public synchronized void addDatum(Datum theDatum) {
GenotypeTableMask mask = null;
try {
mask = (GenotypeTableMask) theDatum.getData();
} catch (Exception e) {
throw new IllegalArgumentException("DataTreePanel: addDatum: input must be AlignmentMask.");
}
GenotypeTable align = mask.getAlignment();
Iterator itr = myNodeHash.values().iterator();
while (itr.hasNext()) {
DefaultMutableTreeNode parentNode = (DefaultMutableTreeNode) itr.next();
Object current = ((Datum) parentNode.getUserObject()).getData();
if ((current instanceof GenotypeTable) && (current == align)) {
DefaultMutableTreeNode childNode = new DefaultMutableTreeNode(theDatum);
myTreeModel.insertNodeInto(childNode, parentNode, parentNode.getChildCount());
myTree.scrollPathToVisible(new TreePath(childNode.getPath()));
myLastNode = null;
myTree.setSelectionPath(new TreePath(parentNode.getPath()));
myTree.scrollPathToVisible(new TreePath(parentNode.getPath()));
myTreeSelectionListener.valueChanged(null);
if (theDatum instanceof Serializable) {
myDataSetList.put(theDatum, "NA");
}
break;
}
}
}
public void setSelectionPath(Datum theDatum) {
DefaultMutableTreeNode temp = findOnTree(theDatum);
if (temp != null) {
myTree.scrollPathToVisible(new TreePath(temp.getPath()));
myTree.setSelectionPath(new TreePath(temp.getPath()));
myTree.validate();
myTree.repaint();
}
}
private DefaultMutableTreeNode findOnTree(Datum theDatum) {
if (theDatum == null) {
return null;
}
Iterator itr = myNodeHash.values().iterator();
while (itr.hasNext()) {
DefaultMutableTreeNode parentNode = (DefaultMutableTreeNode) itr.next();
Datum current = (Datum) parentNode.getUserObject();
if ((current != null) && (current.equals(theDatum))) {
return parentNode;
}
}
return null;
}
public DataSet getSelectedTasselDataSet() {
int n = myTree.getSelectionCount();
String parentNodeName = null;
ArrayList data = new ArrayList();
TreePath[] tp = myTree.getSelectionPaths();
for (int i = 0; i < n; i++) {
DefaultMutableTreeNode node = (DefaultMutableTreeNode) tp[i].getLastPathComponent();
if (node == null) {
return null;
}
//if the parents don't share the same name then leave blank
if (i == 0) {
parentNodeName = node.getParent().toString();
} else if (!node.getParent().toString().equals(parentNodeName)) {
parentNodeName = null;
}
data.add((Datum) node.getUserObject());
}
return new DataSet(data, null);
}
public void deleteSelectedNodes() {
TreePath[] currentSelection = myTree.getSelectionPaths();
if (currentSelection != null) {
for (int i = 0; i < currentSelection.length; i++) {
myLogger.info("Start Deleting at Selection: " + currentSelection[i]);
if (currentSelection[i] != null) {
DefaultMutableTreeNode currentNode = (DefaultMutableTreeNode) (currentSelection[i].getLastPathComponent());
myLogger.info("Deleting Node : " + currentNode);
deleteNode(currentNode);
}
}
}
}
private void deleteNode(DefaultMutableTreeNode currentNode) {
int size = currentNode.getChildCount();
for (int i = size - 1; i >= 0; i--) {
DefaultMutableTreeNode current = (DefaultMutableTreeNode) currentNode.getChildAt(i);
deleteNode(current);
}
if ((currentNode == myDataNode) || (currentNode == myResultNode)) {
return;
}
MutableTreeNode parent = (MutableTreeNode) (currentNode.getParent());
if ((parent != null) && (parent != myDataNode) && (parent != myResultNode)) {
myTreeModel.removeNodeFromParent(currentNode);
Iterator itr = myNodeHash.keySet().iterator();
while (itr.hasNext()) {
Object key = itr.next();
if (myNodeHash.get(key) == currentNode) {
itr.remove();
}
}
try {
Datum datum = (Datum) currentNode.getUserObject();
deleteDatumFromList(datum);
} catch (Exception ex) {
// do nothing
}
try {
if (((Datum) currentNode.getUserObject()).getData() instanceof GenotypeTableMask) {
myLastNode = null;
myTree.setSelectionPath(new TreePath(((DefaultMutableTreeNode) parent).getPath()));
myTree.scrollPathToVisible(new TreePath(((DefaultMutableTreeNode) parent).getPath()));
myTreeSelectionListener.valueChanged(null);
}
} catch (Exception e) {
// do nothing
}
try {
if (((Datum) currentNode.getUserObject()).getData() instanceof GenotypeTable) {
SeqViewerPanel.removeInstance((GenotypeTable) ((Datum) currentNode.getUserObject()).getData());
}
} catch (Exception e) {
// do nothing
}
}
}
public Map getDataList() {
return Collections.unmodifiableMap(myDataSetList);
}
public JTree getTree() {
return myTree;
}
/**
* Returns Tassel data set after complete.
*
* @param event event
*/
public void dataSetReturned(PluginEvent event) {
DataSet tds = (DataSet) event.getSource();
if (tds != null) {
addDataSet(tds, DataTreePanel.NODE_TYPE_DEFAULT);
setSelectionPath(tds.getData(0));
}
}
/**
* Returns progress of execution.
*
* @param event event
*/
public void progress(PluginEvent event) {
//do nothing
}
class MyTreeModelListener implements javax.swing.event.TreeModelListener {
DataTreePanel theDTP;
public MyTreeModelListener(DataTreePanel theDTP) {
this.theDTP = theDTP;
}
public void treeNodesChanged(TreeModelEvent e) {
DefaultMutableTreeNode node;
node = (DefaultMutableTreeNode) (e.getTreePath().getLastPathComponent());
/*
* If the event lists children, then the changed
* node is the child of the node we've already
* gotten. Otherwise, the changed node and the
* specified node are the same.
*/
try {
int index = e.getChildIndices()[0];
node = (DefaultMutableTreeNode) (node.getChildAt(index));
} catch (NullPointerException exc) {
}
String s = (String) node.getUserObject();
theDTP.myLastBookSelected.setName(s);
node.setUserObject(theDTP.myLastBookSelected);
System.out.println("The user has finished editing the node.");
System.out.println("New value: " + node.getUserObject());
}
public void treeNodesInserted(TreeModelEvent e) {
}
public void treeNodesRemoved(TreeModelEvent e) {
}
public void treeStructureChanged(TreeModelEvent e) {
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy