package com.compomics.util.gui;
import com.compomics.util.math.VennDiagram;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Insets;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.Ellipse2D;
import java.util.ArrayList;
import java.util.HashMap;
import javax.swing.JOptionPane;
import no.uib.jsparklines.data.XYDataPoint;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartMouseEvent;
import org.jfree.chart.ChartMouseListener;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.ChartRenderingInfo;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.annotations.XYBoxAnnotation;
import org.jfree.chart.annotations.XYShapeAnnotation;
import org.jfree.chart.annotations.XYTextAnnotation;
import org.jfree.chart.entity.ChartEntity;
import org.jfree.chart.entity.EntityCollection;
import org.jfree.chart.entity.XYAnnotationEntity;
import org.jfree.chart.labels.StandardXYZToolTipGenerator;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYBubbleRenderer;
import org.jfree.data.xy.DefaultXYZDataset;
import org.jfree.ui.TextAnchor;
/**
* A panel displaying a Venn diagram based on the provided data.
*
* @author Harald Barsnes.
*/
public class VennDiagramPanel extends javax.swing.JPanel {
/**
* The supported Venn diagram types.
*/
public enum VennDiagramType {
ONE_WAY, TWO_WAY, THREE_WAY, FOUR_WAY
}
/**
* Map each dataset tooltip back to the given dataset.
*/
private HashMap<String, String> tooltipToDatasetMap;
/**
* The current Venn diagram type.
*/
private VennDiagramType currentVennDiagramType = VennDiagramType.THREE_WAY;
/**
* The current Venn diagram results/data.
*/
private HashMap<String, ArrayList<String>> vennDiagramResults;
/**
* The current Venn diagram group names.
*/
private HashMap<String, String> groupNames;
/**
* The chart panel.
*/
private ChartPanel chartPanel;
/**
* The font size to use for the values.
*/
private int fontSizeValues = 17;
/**
* The font size to use for the legend.
*/
private int fontSizeLegend = 14;
/**
* If true, the legend is shown.
*/
private boolean showLegend = true;
/**
* The legend location of Dataset A in a one to three way Venn diagram.
*/
private XYDataPoint legendDatasetAThreeWay = new XYDataPoint(0.86, 0.86);
/**
* The legend location of Dataset B in a one to three way Venn diagram.
*/
private XYDataPoint legendDatasetBThreeWay = new XYDataPoint(1.15, 0.86);
/**
* The legend location of Dataset C in a one to three way Venn diagram.
*/
private XYDataPoint legendDatasetCThreeWay = new XYDataPoint(1.0, 1.22);
/**
* The legend location of Dataset A in a four-way Venn diagram.
*/
private XYDataPoint legendDatasetAFourWay = new XYDataPoint(0.13, 0.53);
/**
* The legend location of Dataset B in a four-way Venn diagram.
*/
private XYDataPoint legendDatasetBFourWay = new XYDataPoint(0.23, 0.43);
/**
* The legend location of Dataset C in a four-way Venn diagram.
*/
private XYDataPoint legendDatasetCFourWay = new XYDataPoint(0.33, 0.33);
/**
* The legend location of Dataset D in a four-way Venn diagram.
*/
private XYDataPoint legendDatasetDFourWay = new XYDataPoint(0.43, 0.23);
/**
* The color for dataset A.
*/
private Color datasetAColor;
/**
* The color for dataset B.
*/
private Color datasetBColor;
/**
* The color for dataset C.
*/
private Color datasetCColor;
/**
* The color for dataset D.
*/
private Color datasetDColor;
/**
* Creates a new VennDiagramPanel.
*
* @param a dataset A
* @param b dataset B
* @param c dataset C
* @param d dataset D
* @param groupA the name for dataset A
* @param groupB the name for dataset B
* @param groupC the name for dataset C
* @param groupD the name for dataset D
* @param datasetAColor the color for dataset A
* @param datasetBColor the color for dataset B
* @param datasetCColor the color for dataset C
* @param datasetDColor the color for dataset D
*/
public VennDiagramPanel(ArrayList<String> a, ArrayList<String> b, ArrayList<String> c, ArrayList<String> d,
String groupA, String groupB, String groupC, String groupD,
Color datasetAColor, Color datasetBColor, Color datasetCColor, Color datasetDColor) {
initComponents();
vennDiagramResults = VennDiagram.vennDiagramMaker(a, b, c, d);
if (b.isEmpty() && c.isEmpty() && d.isEmpty()) {
currentVennDiagramType = VennDiagramType.ONE_WAY;
} else if (c.isEmpty() && d.isEmpty()) {
currentVennDiagramType = VennDiagramType.TWO_WAY;
} else if (d.isEmpty()) {
currentVennDiagramType = VennDiagramType.THREE_WAY;
} else {
currentVennDiagramType = VennDiagramType.FOUR_WAY;
}
groupNames = new HashMap<String, String>();
groupNames.put("a", groupA);
groupNames.put("b", groupB);
groupNames.put("c", groupC);
groupNames.put("d", groupD);
this.datasetAColor = datasetAColor;
this.datasetBColor = datasetBColor;
this.datasetCColor = datasetCColor;
this.datasetDColor = datasetDColor;
updatePlot();
}
/**
* This method is called from within the constructor to initialize the form.
* WARNING: Do NOT modify this code. The content of this method is always
* regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
plotPanel = new javax.swing.JPanel();
setOpaque(false);
plotPanel.setOpaque(false);
plotPanel.setLayout(new javax.swing.BoxLayout(plotPanel, javax.swing.BoxLayout.LINE_AXIS));
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(plotPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(plotPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
);
}// </editor-fold>//GEN-END:initComponents
/**
* Update the plot.
*/
public void updatePlot() {
plotPanel.removeAll();
tooltipToDatasetMap = new HashMap<String, String>();
DefaultXYZDataset xyzDataset = new DefaultXYZDataset();
JFreeChart chart = ChartFactory.createBubbleChart(null, "X", "Y", xyzDataset, PlotOrientation.VERTICAL, false, true, false);
XYPlot plot = chart.getXYPlot();
if (currentVennDiagramType == VennDiagramType.ONE_WAY) {
plot.getRangeAxis().setRange(0.86, 1.24);
plot.getDomainAxis().setRange(0.85, 1.25);
} else if (currentVennDiagramType == VennDiagramType.TWO_WAY) {
plot.getRangeAxis().setRange(0.86, 1.24);
plot.getDomainAxis().setRange(0.85, 1.25);
} else if (currentVennDiagramType == VennDiagramType.THREE_WAY) {
plot.getRangeAxis().setRange(0.86, 1.24);
plot.getDomainAxis().setRange(0.85, 1.25);
} else {
plot.getRangeAxis().setRange(-0.04, 0.6);
plot.getDomainAxis().setRange(-0.08, 0.7);
}
plot.getRangeAxis().setVisible(false);
plot.getDomainAxis().setVisible(false);
double radius = 0.1;
Ellipse2D ellipse = new Ellipse2D.Double(1 - radius, 1 - radius, radius + radius, radius + radius);
XYShapeAnnotation xyShapeAnnotation = new XYShapeAnnotation(ellipse, new BasicStroke(2f), new Color(140, 140, 140, 150), datasetAColor); // @TODO: make it possible set the line color and width?
plot.addAnnotation(xyShapeAnnotation);
if (currentVennDiagramType == VennDiagramType.TWO_WAY || currentVennDiagramType == VennDiagramType.THREE_WAY) {
ellipse = new Ellipse2D.Double(1 - radius + 0.1, 1 - radius, radius + radius, radius + radius);
xyShapeAnnotation = new XYShapeAnnotation(ellipse, new BasicStroke(2f), new Color(140, 140, 140, 150), datasetBColor);
plot.addAnnotation(xyShapeAnnotation);
}
if (currentVennDiagramType == VennDiagramType.THREE_WAY) {
ellipse = new Ellipse2D.Double(1 - radius + 0.05, 1 - radius + 0.1, radius + radius, radius + radius);
xyShapeAnnotation = new XYShapeAnnotation(ellipse, new BasicStroke(2f), new Color(140, 140, 140, 150), datasetCColor);
plot.addAnnotation(xyShapeAnnotation);
}
XYTextAnnotation anotation;
if (currentVennDiagramType == VennDiagramType.ONE_WAY) {
anotation = new XYTextAnnotation("" + vennDiagramResults.get("a").size(), 1.0, 1.0);
anotation.setToolTipText(groupNames.get("a"));
anotation.setFont(new Font(anotation.getFont().getFontName(), Font.BOLD, fontSizeValues));
plot.addAnnotation(anotation);
tooltipToDatasetMap.put(anotation.getToolTipText(), "a");
// legend
if (showLegend) {
anotation = new XYTextAnnotation(groupNames.get("a"), legendDatasetAThreeWay.getX(), legendDatasetAThreeWay.getY());
anotation.setTextAnchor(TextAnchor.BASELINE_LEFT);
anotation.setFont(new Font(anotation.getFont().getFontName(), Font.BOLD, fontSizeLegend));
plot.addAnnotation(anotation);
}
} else if (currentVennDiagramType == VennDiagramType.TWO_WAY) {
anotation = new XYTextAnnotation("" + vennDiagramResults.get("a").size(), 0.96, 1.0);
anotation.setToolTipText(groupNames.get("a"));
anotation.setFont(new Font(anotation.getFont().getFontName(), Font.BOLD, fontSizeValues));
plot.addAnnotation(anotation);
tooltipToDatasetMap.put(anotation.getToolTipText(), "a");
anotation = new XYTextAnnotation("" + vennDiagramResults.get("b").size(), 1.14, 1.0);
anotation.setToolTipText(groupNames.get("b"));
anotation.setFont(new Font(anotation.getFont().getFontName(), Font.BOLD, fontSizeValues));
plot.addAnnotation(anotation);
tooltipToDatasetMap.put(anotation.getToolTipText(), "b");
anotation = new XYTextAnnotation("" + vennDiagramResults.get("ab").size(), 1.05, 1.0);
anotation.setToolTipText("<html>" + groupNames.get("a") + " ∩ " + groupNames.get("b") + "</html>");
anotation.setFont(new Font(anotation.getFont().getFontName(), Font.BOLD, fontSizeValues));
plot.addAnnotation(anotation);
tooltipToDatasetMap.put(anotation.getToolTipText(), "ab");
// legend
if (showLegend) {
anotation = new XYTextAnnotation(groupNames.get("a"), legendDatasetAThreeWay.getX(), legendDatasetAThreeWay.getY());
anotation.setTextAnchor(TextAnchor.BASELINE_LEFT);
anotation.setFont(new Font(anotation.getFont().getFontName(), Font.BOLD, fontSizeLegend));
plot.addAnnotation(anotation);
anotation = new XYTextAnnotation(groupNames.get("b"), legendDatasetBThreeWay.getX(), legendDatasetBThreeWay.getY());
anotation.setTextAnchor(TextAnchor.BASELINE_LEFT);
anotation.setFont(new Font(anotation.getFont().getFontName(), Font.BOLD, fontSizeLegend));
plot.addAnnotation(anotation);
}
} else if (currentVennDiagramType == VennDiagramType.THREE_WAY) {
anotation = new XYTextAnnotation("" + vennDiagramResults.get("a").size(), 0.96, 0.97);
anotation.setToolTipText(groupNames.get("a"));
anotation.setFont(new Font(anotation.getFont().getFontName(), Font.BOLD, fontSizeValues));
plot.addAnnotation(anotation);
tooltipToDatasetMap.put(anotation.getToolTipText(), "a");
anotation = new XYTextAnnotation("" + vennDiagramResults.get("b").size(), 1.14, 0.97);
anotation.setToolTipText(groupNames.get("b"));
anotation.setFont(new Font(anotation.getFont().getFontName(), Font.BOLD, fontSizeValues));
plot.addAnnotation(anotation);
tooltipToDatasetMap.put(anotation.getToolTipText(), "b");
anotation = new XYTextAnnotation("" + vennDiagramResults.get("ab").size(), 1.05, 0.97);
anotation.setToolTipText("<html>" + groupNames.get("a") + " ∩ " + groupNames.get("b") + "</html>");
anotation.setFont(new Font(anotation.getFont().getFontName(), Font.BOLD, fontSizeValues));
plot.addAnnotation(anotation);
tooltipToDatasetMap.put(anotation.getToolTipText(), "ab");
anotation = new XYTextAnnotation("" + vennDiagramResults.get("c").size(), 1.05, 1.14);
anotation.setToolTipText(groupNames.get("c"));
anotation.setFont(new Font(anotation.getFont().getFontName(), Font.BOLD, fontSizeValues));
plot.addAnnotation(anotation);
tooltipToDatasetMap.put(anotation.getToolTipText(), "c");
anotation = new XYTextAnnotation("" + vennDiagramResults.get("ac").size(), 0.99, 1.065);
anotation.setToolTipText("<html>" + groupNames.get("a") + " ∩ " + groupNames.get("c") + "</html>");
anotation.setFont(new Font(anotation.getFont().getFontName(), Font.BOLD, fontSizeValues));
plot.addAnnotation(anotation);
tooltipToDatasetMap.put(anotation.getToolTipText(), "ac");
anotation = new XYTextAnnotation("" + vennDiagramResults.get("bc").size(), 1.11, 1.065);
anotation.setToolTipText("<html>" + groupNames.get("b") + " ∩ " + groupNames.get("c") + "</html>");
anotation.setFont(new Font(anotation.getFont().getFontName(), Font.BOLD, fontSizeValues));
plot.addAnnotation(anotation);
tooltipToDatasetMap.put(anotation.getToolTipText(), "bc");
anotation = new XYTextAnnotation("" + vennDiagramResults.get("abc").size(), 1.05, 1.036);
anotation.setToolTipText("<html>" + groupNames.get("a") + " ∩ " + groupNames.get("b") + " ∩ " + groupNames.get("c") + "</html>");
anotation.setFont(new Font(anotation.getFont().getFontName(), Font.BOLD, fontSizeValues));
plot.addAnnotation(anotation);
tooltipToDatasetMap.put(anotation.getToolTipText(), "abc");
// legend
if (showLegend) {
anotation = new XYTextAnnotation(groupNames.get("a"), legendDatasetAThreeWay.getX(), legendDatasetAThreeWay.getY());
anotation.setTextAnchor(TextAnchor.BASELINE_LEFT);
anotation.setFont(new Font(anotation.getFont().getFontName(), Font.BOLD, fontSizeLegend));
plot.addAnnotation(anotation);
anotation = new XYTextAnnotation(groupNames.get("b"), legendDatasetBThreeWay.getX(), legendDatasetBThreeWay.getY());
anotation.setTextAnchor(TextAnchor.BASELINE_LEFT);
anotation.setFont(new Font(anotation.getFont().getFontName(), Font.BOLD, fontSizeLegend));
plot.addAnnotation(anotation);
anotation = new XYTextAnnotation(groupNames.get("c"), legendDatasetCThreeWay.getX(), legendDatasetCThreeWay.getY());
anotation.setTextAnchor(TextAnchor.BASELINE_LEFT);
anotation.setFont(new Font(anotation.getFont().getFontName(), Font.BOLD, fontSizeLegend));
plot.addAnnotation(anotation);
}
} else if (currentVennDiagramType == VennDiagramType.FOUR_WAY) {
XYBoxAnnotation anotation2 = new XYBoxAnnotation(0, 0, 0.2, 0.5, new BasicStroke(2), Color.LIGHT_GRAY, datasetAColor);
plot.addAnnotation(anotation2);
anotation2 = new XYBoxAnnotation(0.1, 0, 0.3, 0.4, new BasicStroke(2), Color.LIGHT_GRAY, datasetBColor);
plot.addAnnotation(anotation2);
anotation2 = new XYBoxAnnotation(0, 0.1, 0.4, 0.3, new BasicStroke(2), Color.LIGHT_GRAY, datasetCColor);
plot.addAnnotation(anotation2);
anotation2 = new XYBoxAnnotation(0, 0, 0.5, 0.2, new BasicStroke(2), Color.LIGHT_GRAY, datasetDColor);
plot.addAnnotation(anotation2);
anotation = new XYTextAnnotation("" + vennDiagramResults.get("a").size(), 0.15, 0.45);
anotation.setToolTipText(groupNames.get("a"));
anotation.setFont(new Font(anotation.getFont().getFontName(), Font.BOLD, fontSizeValues));
plot.addAnnotation(anotation);
tooltipToDatasetMap.put(anotation.getToolTipText(), "a");
anotation = new XYTextAnnotation("" + vennDiagramResults.get("ab").size(), 0.15, 0.35);
anotation.setToolTipText("<html>" + groupNames.get("a") + " ∩ " + groupNames.get("b") + "</html>");
anotation.setFont(new Font(anotation.getFont().getFontName(), Font.BOLD, fontSizeValues));
plot.addAnnotation(anotation);
tooltipToDatasetMap.put(anotation.getToolTipText(), "ab");
anotation = new XYTextAnnotation("" + vennDiagramResults.get("abc").size(), 0.15, 0.25);
anotation.setToolTipText("<html>" + groupNames.get("a") + " ∩ " + groupNames.get("b") + " ∩ " + groupNames.get("c") + "</html>");
anotation.setFont(new Font(anotation.getFont().getFontName(), Font.BOLD, fontSizeValues));
plot.addAnnotation(anotation);
tooltipToDatasetMap.put(anotation.getToolTipText(), "abc");
anotation = new XYTextAnnotation("" + vennDiagramResults.get("abcd").size(), 0.15, 0.15);
anotation.setToolTipText("<html>" + groupNames.get("a") + " ∩ " + groupNames.get("b") + " ∩ " + groupNames.get("c") + " ∩ " + groupNames.get("d") + "</html>");
anotation.setFont(new Font(anotation.getFont().getFontName(), Font.BOLD, fontSizeValues));
plot.addAnnotation(anotation);
tooltipToDatasetMap.put(anotation.getToolTipText(), "abcd");
anotation = new XYTextAnnotation("" + vennDiagramResults.get("abd").size(), 0.15, 0.05);
anotation.setToolTipText("<html>" + groupNames.get("a") + " ∩ " + groupNames.get("b") + " ∩ " + groupNames.get("d") + "</html>");
anotation.setFont(new Font(anotation.getFont().getFontName(), Font.BOLD, fontSizeValues));
plot.addAnnotation(anotation);
tooltipToDatasetMap.put(anotation.getToolTipText(), "abd");
anotation = new XYTextAnnotation("" + vennDiagramResults.get("ac").size(), 0.05, 0.25);
anotation.setToolTipText("<html>" + groupNames.get("a") + " ∩ " + groupNames.get("c") + "</html>");
anotation.setFont(new Font(anotation.getFont().getFontName(), Font.BOLD, fontSizeValues));
plot.addAnnotation(anotation);
tooltipToDatasetMap.put(anotation.getToolTipText(), "ac");
anotation = new XYTextAnnotation("" + vennDiagramResults.get("acd").size(), 0.05, 0.15);
anotation.setToolTipText("<html>" + groupNames.get("a") + " ∩ " + groupNames.get("c") + " ∩ " + groupNames.get("d") + "</html>");
anotation.setFont(new Font(anotation.getFont().getFontName(), Font.BOLD, fontSizeValues));
plot.addAnnotation(anotation);
tooltipToDatasetMap.put(anotation.getToolTipText(), "acd");
anotation = new XYTextAnnotation("" + vennDiagramResults.get("ad").size(), 0.05, 0.05);
anotation.setToolTipText("<html>" + groupNames.get("a") + " ∩ " + groupNames.get("d") + "</html>");
anotation.setFont(new Font(anotation.getFont().getFontName(), Font.BOLD, fontSizeValues));
plot.addAnnotation(anotation);
tooltipToDatasetMap.put(anotation.getToolTipText(), "ad");
anotation = new XYTextAnnotation("" + vennDiagramResults.get("b").size(), 0.25, 0.35);
anotation.setToolTipText("<html>" + groupNames.get("b") + "</html>");
anotation.setFont(new Font(anotation.getFont().getFontName(), Font.BOLD, fontSizeValues));
plot.addAnnotation(anotation);
tooltipToDatasetMap.put(anotation.getToolTipText(), "b");
anotation = new XYTextAnnotation("" + vennDiagramResults.get("bc").size(), 0.25, 0.25);
anotation.setToolTipText("<html>" + groupNames.get("b") + " ∩ " + groupNames.get("c") + "</html>");
anotation.setFont(new Font(anotation.getFont().getFontName(), Font.BOLD, fontSizeValues));
plot.addAnnotation(anotation);
tooltipToDatasetMap.put(anotation.getToolTipText(), "bc");
anotation = new XYTextAnnotation("" + vennDiagramResults.get("bcd").size(), 0.25, 0.15);
anotation.setToolTipText("<html>" + groupNames.get("b") + " ∩ " + groupNames.get("c") + " ∩ " + groupNames.get("d") + "</html>");
anotation.setFont(new Font(anotation.getFont().getFontName(), Font.BOLD, fontSizeValues));
plot.addAnnotation(anotation);
tooltipToDatasetMap.put(anotation.getToolTipText(), "bcd");
anotation = new XYTextAnnotation("" + vennDiagramResults.get("bd").size(), 0.25, 0.05);
anotation.setToolTipText("<html>" + groupNames.get("b") + " ∩ " + groupNames.get("d") + "</html>");
anotation.setFont(new Font(anotation.getFont().getFontName(), Font.BOLD, fontSizeValues));
plot.addAnnotation(anotation);
tooltipToDatasetMap.put(anotation.getToolTipText(), "bd");
anotation = new XYTextAnnotation("" + vennDiagramResults.get("c").size(), 0.35, 0.25);
anotation.setToolTipText("<html>" + groupNames.get("c") + "</html>");
anotation.setFont(new Font(anotation.getFont().getFontName(), Font.BOLD, fontSizeValues));
plot.addAnnotation(anotation);
tooltipToDatasetMap.put(anotation.getToolTipText(), "c");
anotation = new XYTextAnnotation("" + vennDiagramResults.get("cd").size(), 0.35, 0.15);
anotation.setToolTipText("<html>" + groupNames.get("c") + " ∩ " + groupNames.get("d") + "</html>");
anotation.setFont(new Font(anotation.getFont().getFontName(), Font.BOLD, fontSizeValues));
plot.addAnnotation(anotation);
tooltipToDatasetMap.put(anotation.getToolTipText(), "cd");
anotation = new XYTextAnnotation("" + vennDiagramResults.get("d").size(), 0.45, 0.15);
anotation.setToolTipText("<html>" + groupNames.get("d") + "</html>");
anotation.setFont(new Font(anotation.getFont().getFontName(), Font.BOLD, fontSizeValues));
plot.addAnnotation(anotation);
tooltipToDatasetMap.put(anotation.getToolTipText(), "d");
// legend
if (showLegend) {
anotation = new XYTextAnnotation(groupNames.get("a"), legendDatasetAFourWay.getX(), legendDatasetAFourWay.getY());
anotation.setTextAnchor(TextAnchor.BASELINE_LEFT);
anotation.setFont(new Font(anotation.getFont().getFontName(), Font.BOLD, fontSizeLegend));
plot.addAnnotation(anotation);
anotation = new XYTextAnnotation(groupNames.get("b"), legendDatasetBFourWay.getX(), legendDatasetBFourWay.getY());
anotation.setTextAnchor(TextAnchor.BASELINE_LEFT);
anotation.setFont(new Font(anotation.getFont().getFontName(), Font.BOLD, fontSizeLegend));
plot.addAnnotation(anotation);
anotation = new XYTextAnnotation(groupNames.get("c"), legendDatasetCFourWay.getX(), legendDatasetCFourWay.getY());
anotation.setTextAnchor(TextAnchor.BASELINE_LEFT);
anotation.setFont(new Font(anotation.getFont().getFontName(), Font.BOLD, fontSizeLegend));
plot.addAnnotation(anotation);
anotation = new XYTextAnnotation(groupNames.get("d"), legendDatasetDFourWay.getX(), legendDatasetDFourWay.getY());
anotation.setTextAnchor(TextAnchor.BASELINE_LEFT);
anotation.setFont(new Font(anotation.getFont().getFontName(), Font.BOLD, fontSizeLegend));
plot.addAnnotation(anotation);
}
}
// set up the renderer
XYBubbleRenderer renderer = new XYBubbleRenderer(XYBubbleRenderer.SCALE_ON_RANGE_AXIS);
renderer.setBaseToolTipGenerator(new StandardXYZToolTipGenerator());
plot.setRenderer(renderer);
// make all datapoints semitransparent
plot.setForegroundAlpha(0.5f);
// remove space before/after the domain axis
plot.getDomainAxis().setUpperMargin(0);
plot.getDomainAxis().setLowerMargin(0);
plot.setRangeGridlinePaint(Color.black);
// hide unwanted chart details
plot.setDomainGridlinesVisible(false);
plot.setRangeGridlinesVisible(false);
chart.getPlot().setOutlineVisible(false);
// set background color
chart.getPlot().setBackgroundPaint(Color.WHITE);
chart.setBackgroundPaint(Color.WHITE);
chartPanel = new ChartPanel(chart);
// disable the pop up menu
chartPanel.setPopupMenu(null);
chartPanel.setBackground(Color.WHITE);
// add the plot to the chart
plotPanel.add(chartPanel);
plotPanel.revalidate();
plotPanel.repaint();
// add chart mouse listener
chartPanel.addChartMouseListener(
new ChartMouseListener() {
public void chartMouseClicked(ChartMouseEvent cme) {
mouseClickedInChart(cme);
}
public void chartMouseMoved(ChartMouseEvent cme) {
mouseMovedInChart(cme);
}
});
// add more chart mouse listeners
chartPanel.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
super.mouseClicked(e);
}
});
}
/**
* Handles mouse clicks in the chart panel.
*
* @param event the chart mouse event
*/
private void mouseClickedInChart(ChartMouseEvent event) {
ArrayList<ChartEntity> entities = getEntitiesForPoint(event.getTrigger().getPoint().x, event.getTrigger().getPoint().y);
if (entities.isEmpty()) {
return;
}
boolean dataPointFound = false;
String dataPointTooltip = "";
for (ChartEntity tempEntity : entities) {
if (tempEntity instanceof XYAnnotationEntity) {
if (((XYAnnotationEntity) tempEntity).getToolTipText() != null) {
dataPointFound = true;
dataPointTooltip = ((XYAnnotationEntity) tempEntity).getToolTipText();
}
}
}
if (dataPointFound) {
String dataset = tooltipToDatasetMap.get(dataPointTooltip);
JOptionPane.showMessageDialog(this, dataPointTooltip + ":\n" + vennDiagramResults.get(dataset), "Selected Values", JOptionPane.INFORMATION_MESSAGE);
}
}
/**
* Handles mouse movements in the chart panel.
*
* @param event the chart mouse event
*/
private void mouseMovedInChart(ChartMouseEvent event) {
ArrayList<ChartEntity> entities = getEntitiesForPoint(event.getTrigger().getPoint().x, event.getTrigger().getPoint().y);
boolean dataPointFound = false;
for (ChartEntity tempEntity : entities) {
if (tempEntity instanceof XYAnnotationEntity) {
if (((XYAnnotationEntity) tempEntity).getToolTipText() != null) {
dataPointFound = true;
}
}
}
if (dataPointFound) {
chartPanel.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
} else {
chartPanel.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
}
}
/**
* Returns a list of the entities at the given x, y view location.
*
* @param viewX the x location
* @param viewY the y location
* @return a list of the entities
*/
public ArrayList<ChartEntity> getEntitiesForPoint(int viewX, int viewY) {
ArrayList<ChartEntity> entitiesForPoint = new ArrayList<ChartEntity>();
ChartRenderingInfo info = chartPanel.getChartRenderingInfo();
if (info != null) {
Insets insets = chartPanel.getInsets();
double x = (viewX - insets.left) / chartPanel.getScaleX();
double y = (viewY - insets.top) / chartPanel.getScaleY();
EntityCollection allEntities = info.getEntityCollection();
int numEntities = allEntities.getEntityCount();
for (int i = 0; i < numEntities; i++) {
ChartEntity entity = allEntities.getEntity(i);
if (entity.getArea().contains(x, y)) {
entitiesForPoint.add(entity);
}
}
}
return entitiesForPoint;
}
/**
* Returns the chart panel.
*
* @return the chart panel
*/
public ChartPanel getChartPanel() {
return chartPanel;
}
/**
* Returns a standard map of the group names. Keys: a, b, c and d.
*
* @return a standard map of the group names
*/
public HashMap<String, String> getGroupNames() {
return groupNames;
}
/**
* Returns the legend location of Dataset A in a three way Venn diagram.
*
* @return the legendDatasetAThreeWay
*/
public XYDataPoint getLegendDatasetAThreeWay() {
return legendDatasetAThreeWay;
}
/**
* Set the legend location of Dataset A in a three way Venn diagram.
*
* @param legendDatasetAThreeWay the legendDatasetAThreeWay to set
*/
public void setLegendDatasetAThreeWay(XYDataPoint legendDatasetAThreeWay) {
this.legendDatasetAThreeWay = legendDatasetAThreeWay;
updatePlot();
}
/**
* Returns the legend location of dataset B in a three way Venn diagram.
*
* @return the legendDatasetBThreeWay
*/
public XYDataPoint getLegendDatasetBThreeWay() {
return legendDatasetBThreeWay;
}
/**
* Set the legend location of Dataset B in a three way Venn diagram.
*
* @param legendDatasetBThreeWay the legendDatasetBThreeWay to set
*/
public void setLegendDatasetBThreeWay(XYDataPoint legendDatasetBThreeWay) {
this.legendDatasetBThreeWay = legendDatasetBThreeWay;
updatePlot();
}
/**
* Returns the legend location of dataset C in a three way Venn diagram.
*
* @return the legendDatasetCThreeWay
*/
public XYDataPoint getLegendDatasetCThreeWay() {
return legendDatasetCThreeWay;
}
/**
* Set the legend location of Dataset C in a three way Venn diagram.
*
* @param legendDatasetCThreeWay the legendDatasetCThreeWay to set
*/
public void setLegendDatasetCThreeWay(XYDataPoint legendDatasetCThreeWay) {
this.legendDatasetCThreeWay = legendDatasetCThreeWay;
updatePlot();
}
/**
* Returns the legend location of dataset A in a four way Venn diagram.
*
* @return the legendDatasetAFourWay
*/
public XYDataPoint getLegendDatasetAFourWay() {
return legendDatasetAFourWay;
}
/**
* Set the legend location of Dataset A in a four way Venn diagram.
*
* @param legendDatasetAFourWay the legendDatasetAFourWay to set
*/
public void setLegendDatasetAFourWay(XYDataPoint legendDatasetAFourWay) {
this.legendDatasetAFourWay = legendDatasetAFourWay;
updatePlot();
}
/**
* Returns the legend location of dataset B in a four way Venn diagram.
*
* @return the legendDatasetBFourWay
*/
public XYDataPoint getLegendDatasetBFourWay() {
return legendDatasetBFourWay;
}
/**
* Set the legend location of Dataset B in a four way Venn diagram.
*
* @param legendDatasetBFourWay the legendDatasetBFourWay to set
*/
public void setLegendDatasetBFourWay(XYDataPoint legendDatasetBFourWay) {
this.legendDatasetBFourWay = legendDatasetBFourWay;
updatePlot();
}
/**
* Returns the legend location of dataset C in a four way Venn diagram.
*
* @return the legendDatasetCFourWay
*/
public XYDataPoint getLegendDatasetCFourWay() {
return legendDatasetCFourWay;
}
/**
* Set the legend location of Dataset C in a four way Venn diagram.
*
* @param legendDatasetCFourWay the legendDatasetCFourWay to set
*/
public void setLegendDatasetCFourWay(XYDataPoint legendDatasetCFourWay) {
this.legendDatasetCFourWay = legendDatasetCFourWay;
updatePlot();
}
/**
* Returns the legend location of dataset D in a four way Venn diagram.
*
* @return the legendDatasetDFourWay
*/
public XYDataPoint getLegendDatasetDFourWay() {
return legendDatasetDFourWay;
}
/**
* Set the legend location of Dataset D in a four way Venn diagram.
*
* @param legendDatasetDFourWay the legendDatasetDFourWay to set
*/
public void setLegendDatasetDFourWay(XYDataPoint legendDatasetDFourWay) {
this.legendDatasetDFourWay = legendDatasetDFourWay;
updatePlot();
}
/**
* Returns the current Venn diagram type.
*
* @return the currentVennDiagramType
*/
public VennDiagramType getCurrentVennDiagramType() {
return currentVennDiagramType;
}
public void resizePlot(int parentWidth, int parentHeight) {
if (currentVennDiagramType != VennDiagramType.FOUR_WAY) {
int min = Math.min(parentWidth, parentHeight);
setMaximumSize(new Dimension(min, min));
setPreferredSize(new Dimension(min, min));
updatePlot();
} else {
setMaximumSize(new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE));
updatePlot();
}
}
/**
* Show the legend or not.
*
* @return show the legend or not
*/
public boolean showLegend() {
return showLegend;
}
/**
* Set if the legend is to be shown.
*
* @param showLegend if the legend is to be shown
*/
public void setShowLegend(boolean showLegend) {
this.showLegend = showLegend;
}
/**
* Get the font size.
*
* @return the font size
*/
public int getFontSize() {
return fontSizeValues;
}
/**
* Set the font size.
*
* @param fontSizeValues the font size
*/
public void setFontSize(int fontSizeValues) {
this.fontSizeValues = fontSizeValues;
}
/**
* Get the font size for the legend.
*
* @return the font size for the legend
*/
public int getFontSizeLegend() {
return fontSizeLegend;
}
/**
* Set the font size of the legend.
*
* @param fontSizeLegend the font size of the legend
*/
public void setFontSizeLegend(int fontSizeLegend) {
this.fontSizeLegend = fontSizeLegend;
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JPanel plotPanel;
// End of variables declaration//GEN-END:variables
}