/*
* Copyright (C) 2008-2015 by Holger Arndt
*
* This file is part of the Universal Java Matrix Package (UJMP).
* See the NOTICE file distributed with this work for additional
* information regarding copyright ownership and licensing.
*
* UJMP 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.
*
* UJMP 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 UJMP; if not, write to the
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301 USA
*/
package org.ujmp.gui.panels;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.lang.reflect.Constructor;
import javax.swing.JPanel;
import javax.swing.JSplitPane;
import javax.swing.JTabbedPane;
import javax.swing.tree.TreeModel;
import org.ujmp.core.Matrix;
import org.ujmp.core.graphmatrix.GraphMatrix;
import org.ujmp.core.mapmatrix.MapMatrix;
import org.ujmp.core.treematrix.TreeMatrix;
import org.ujmp.core.util.GnuPlot;
import org.ujmp.core.util.Matlab;
import org.ujmp.core.util.Octave;
import org.ujmp.core.util.R;
import org.ujmp.gui.DefaultMatrixGUIObject;
import org.ujmp.gui.MatrixGUIObject;
import org.ujmp.gui.graph.GraphPanel;
import org.ujmp.gui.plot.MatrixPlot;
public class MatrixPanel extends AbstractPanel {
private static final long serialVersionUID = 3912987239953510584L;
public MatrixPanel(MatrixGUIObject m) {
super(m);
if (!(m instanceof DefaultMatrixGUIObject)) {
m = new DefaultMatrixGUIObject(m.getMatrix());
}
JSplitPane splitPane1 = new JSplitPane();
JSplitPane splitPane2 = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
JTabbedPane tabbedPane = new JTabbedPane();
tabbedPane.setMinimumSize(new Dimension(10, 10));
MapMatrix<String, Object> metaData = m.getMatrix().getMetaData();
if (metaData != null) {
splitPane2.setTopComponent(new MatrixEditorPanel("Meta Data", (MatrixGUIObject) m.getMatrix().getMetaData()
.getGUIObject()));
}
tabbedPane.add("Heatmap", new MatrixHeatmapPanel(m, false));
tabbedPane.add("Plot", new BufferedPanel(new MatrixPlot(m, true)));
if (m.getMatrix() instanceof GraphMatrix && m.getColumnCount() < 1000) {
tabbedPane.add("Graph", new GraphPanel(m));
tabbedPane.setSelectedIndex(tabbedPane.getComponentCount() - 1);
}
if (m.getMatrix() instanceof GraphMatrix && ((GraphMatrix<?, ?>) m.getMatrix()).getNodeCount() < 1000) {
try {
Class<?> graphPanelClass = Class.forName("org.ujmp.jung.JungVisualizationViewer");
Constructor<?> graphPanelConstructor = graphPanelClass.getConstructor(GraphMatrix.class);
JPanel graphPanel = (JPanel) graphPanelConstructor.newInstance(m.getMatrix());
tabbedPane.add("JUNG Graph", graphPanel);
tabbedPane.setSelectedIndex(tabbedPane.getComponentCount() - 1);
} catch (Throwable e) {
}
}
if (m.getMatrix() instanceof TreeModel) {
tabbedPane.add("Tree", new MatrixTreePanel(m));
}
if (m.getMatrix() instanceof TreeMatrix) {
tabbedPane.add("Treemap", new MatrixTreemapPanel((TreeMatrix<?>) m.getMatrix()));
}
if (m.getRowCount() > 1) {
try {
Class.forName("org.math.plot.PlotPanel");
Class<?> c = Class.forName("org.ujmp.jmathplot.JMathPlotLinePanel");
Constructor<?> con = c.getConstructor(Matrix.class);
JPanel panel = (JPanel) con.newInstance(m.getMatrix());
tabbedPane.add("Line Plot", panel);
} catch (Throwable e) {
}
}
if (m.getRowCount() > 1 && m.getColumnCount() > 1) {
try {
Class.forName("org.math.plot.PlotPanel");
Class<?> c = Class.forName("org.ujmp.jmathplot.JMathPlotXYPanel");
Constructor<?> con = c.getConstructor(Matrix.class);
JPanel panel = (JPanel) con.newInstance(m.getMatrix());
tabbedPane.add("XY Plot", panel);
} catch (Throwable e) {
}
}
if (m.getRowCount() > 1 && m.getColumnCount() > 1) {
try {
Class.forName("org.math.plot.PlotPanel");
Class<?> c = Class.forName("org.ujmp.jmathplot.JMathPlotScatterPanel");
Constructor<?> con = c.getConstructor(Matrix.class);
JPanel panel = (JPanel) con.newInstance(m.getMatrix());
tabbedPane.add("Scatter Plot", panel);
} catch (Throwable e) {
}
}
if (m.getRowCount() > 1 && m.getColumnCount() > 1) {
try {
Class.forName("org.math.plot.PlotPanel");
Class<?> c = Class.forName("org.ujmp.jmathplot.JMathPlotBarPanel");
Constructor<?> con = c.getConstructor(Matrix.class);
JPanel panel = (JPanel) con.newInstance(m.getMatrix());
tabbedPane.add("Bar Plot", panel);
} catch (Throwable e) {
}
}
if (m.getRowCount() > 1 && m.getColumnCount() > 1) {
try {
Class.forName("org.math.plot.PlotPanel");
Class<?> c = Class.forName("org.ujmp.jmathplot.JMathPlotHistogramPanel");
Constructor<?> con = c.getConstructor(Matrix.class);
JPanel panel = (JPanel) con.newInstance(m.getMatrix());
tabbedPane.add("Histogram", panel);
} catch (Throwable e) {
}
}
if (m.getRowCount() > 1 && m.getColumnCount() > 1) {
try {
Class.forName("org.math.plot.PlotPanel");
Class<?> c = Class.forName("org.ujmp.jmathplot.JMathPlotStaircasePanel");
Constructor<?> con = c.getConstructor(Matrix.class);
JPanel panel = (JPanel) con.newInstance(m.getMatrix());
tabbedPane.add("Staircase Plot", panel);
} catch (Throwable e) {
}
}
if (m.getRowCount() > 1 && m.getColumnCount() > 1) {
try {
Class.forName("org.math.plot.PlotPanel");
Class<?> c = Class.forName("org.ujmp.jmathplot.JMathPlotGridPanel");
Constructor<?> con = c.getConstructor(Matrix.class);
JPanel panel = (JPanel) con.newInstance(m.getMatrix());
tabbedPane.add("Grid Plot", panel);
} catch (Throwable e) {
}
}
if (m.getColumnCount() >= 3) {
try {
Class.forName("org.math.plot.PlotPanel");
Class<?> c = Class.forName("org.ujmp.jmathplot.JMathPlotBar3DPanel");
Constructor<?> con = c.getConstructor(Matrix.class);
JPanel panel = (JPanel) con.newInstance(m.getMatrix());
tabbedPane.add("Bar Plot 3D", panel);
} catch (Throwable e) {
}
}
try {
if (m.getColumnCount() >= 3) {
Class<?> c = Class.forName("org.ujmp.jmathplot.JMathPlotScatter3DPanel");
Constructor<?> con = c.getConstructor(Matrix.class);
JPanel panel = (JPanel) con.newInstance(m.getMatrix());
tabbedPane.add("Scatter Plot 3D", panel);
}
} catch (Throwable e) {
}
try {
if (m.getColumnCount() >= 3) {
Class.forName("org.math.plot.PlotPanel");
Class<?> c = Class.forName("org.ujmp.jmathplot.JMathPlotLine3DPanel");
Constructor<?> con = c.getConstructor(Matrix.class);
JPanel panel = (JPanel) con.newInstance(m.getMatrix());
tabbedPane.add("Line Plot 3D", panel);
}
} catch (Throwable e) {
}
if (GnuPlot.isAvailable()) {
GnuPlotPanel gnuPlotPanel = new GnuPlotPanel(m);
tabbedPane.add("GnuPlot", gnuPlotPanel);
}
if (Matlab.isAvailable()) {
MatlabPanel matlabPanel = new MatlabPanel(m);
tabbedPane.add("Matlab", matlabPanel);
}
if (Octave.isAvailable()) {
OctavePanel octavePanel = new OctavePanel(m);
tabbedPane.add("Octave", octavePanel);
}
if (R.isAvailable()) {
RPanel rPanel = new RPanel(m);
tabbedPane.add("R", rPanel);
}
// try {
// Class<?> jfreechart = Class
// .forName("org.ujmp.jfreechart.MatrixChartPanel");
// JPanel panel = (JPanel) jfreechart.getConstructor(
// MatrixGUIObject.class).newInstance(m);
// splitPane2.setTopComponent(new BufferedPanel(panel));
// } catch (Throwable t) {
// }
splitPane2.setBottomComponent(tabbedPane);
splitPane1.setLeftComponent(splitPane2);
splitPane1.setRightComponent(new MatrixEditorPanel(m));
add(splitPane1, BorderLayout.CENTER);
splitPane1.setDividerLocation(600);
splitPane2.setDividerLocation(200);
}
}