/*
* 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.plot;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.util.ConcurrentModificationException;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.event.EventListenerList;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.TableCellRenderer;
import org.ujmp.core.Matrix;
import org.ujmp.gui.MatrixGUIObject;
import org.ujmp.gui.interfaces.CanBeUpdated;
import org.ujmp.gui.util.UIDefaults;
import org.ujmp.gui.util.UpdateListener;
public class MatrixPlot extends JPanel implements TableCellRenderer, CanBeUpdated, ListSelectionListener {
private static final long serialVersionUID = -3845070497558608841L;
private EventListenerList listenerList = null;
private PlotSettings plotSettings = null;
private XAxis xAxis = null;
private YAxis yAxis = null;
private ZeroAxis zeroAxis = null;
private XGrid xGrid = null;
private YGrid yGrid = null;
private Traces traces = null;
private PlotBackground plotBackground = null;
private Selection selection = null;
private RunningAveragePlot runningAveragePlot = null;
public MatrixPlot(Matrix m) {
this((MatrixGUIObject) m.getGUIObject(), false);
}
public MatrixPlot(MatrixGUIObject m, boolean registerListeners) {
this();
plotSettings.setMatrixGUIObject(m);
if (registerListeners) {
m.getRowSelectionModel().addListSelectionListener(this);
}
}
public MatrixPlot() {
this.plotSettings = new PlotSettings();
this.xAxis = new XAxis(plotSettings);
this.yAxis = new YAxis(plotSettings);
this.zeroAxis = new ZeroAxis(plotSettings);
this.xGrid = new XGrid(plotSettings);
this.yGrid = new YGrid(plotSettings);
this.plotBackground = new PlotBackground(plotSettings);
this.traces = new Traces(plotSettings);
this.selection = new Selection(plotSettings);
this.runningAveragePlot = new RunningAveragePlot(plotSettings);
setPreferredSize(new Dimension(800, 600));
setMinimumSize(new Dimension(50, 50));
}
public void addUpdateListener(UpdateListener l) {
getListenerList().add(UpdateListener.class, l);
}
public void removeUpdateListener(UpdateListener l) {
getListenerList().remove(UpdateListener.class, l);
}
public EventListenerList getListenerList() {
if (listenerList == null) {
listenerList = new EventListenerList();
}
return listenerList;
}
public void fireUpdated() {
if (listenerList != null) {
for (Object o : listenerList.getListenerList()) {
if (o instanceof UpdateListener)
((UpdateListener) o).updated();
}
}
}
public void paintComponent(Graphics g) {
try {
super.paintComponent(g);
//if (isShowing()) {
MatrixGUIObject guiObject = plotSettings.getMatrixGUIObject();
Graphics2D g2d = (Graphics2D) g;
g2d.addRenderingHints(UIDefaults.AALIAS);
if (guiObject == null) {
return;
}
plotSettings.setHeight(getHeight());
plotSettings.setWidth(getWidth());
plotSettings.setMinXValue(0.0);
plotSettings.setMaxXValue(guiObject.getRowCount() - 1);
plotSettings.setMinYValue(-1);
plotSettings.setMaxYValue(100);
if (plotSettings.isShowPlotBackGround()) {
plotBackground.paintComponent(g);
}
if (plotSettings.isShowXGrid()) {
xGrid.paintComponent(g);
}
if (plotSettings.isShowYGrid()) {
yGrid.paintComponent(g);
}
if (plotSettings.isShowXAxis()) {
xAxis.paintComponent(g);
}
if (plotSettings.isShowYAxis()) {
yAxis.paintComponent(g);
}
if (plotSettings.isShowZeroAxis()) {
zeroAxis.paintComponent(g);
}
if (plotSettings.isShowSelection()) {
selection.paintComponent(g);
}
if (plotSettings.isShowRunningAverage()) {
runningAveragePlot.paintComponent(g);
}
traces.paintComponent(g);
//}
} catch (ConcurrentModificationException e) {
// not too bad
} catch (Exception e) {
e.printStackTrace();
}
}
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
int row, int column) {
if (value instanceof MatrixGUIObject) {
plotSettings.setMatrixGUIObject((MatrixGUIObject) value);
} else if (value instanceof Matrix) {
plotSettings.setMatrixGUIObject((MatrixGUIObject) ((Matrix) value).getGUIObject());
}
if (isSelected) {
plotSettings.setPlotBackGroundColor(table.getSelectionBackground());
} else {
plotSettings.setPlotBackGroundColor(new Color(216, 213, 196));
}
return this;
}
public PlotSettings getPlotSettings() {
return plotSettings;
}
public void valueChanged(ListSelectionEvent e) {
fireUpdated();
}
}