package org.jzy3d.ui;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.List;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.border.Border;

import net.miginfocom.swing.MigLayout;

import org.jzy3d.chart.Chart;
import org.jzy3d.plot3d.rendering.canvas.OffscreenCanvas;
import org.jzy3d.plot3d.rendering.view.AWTRenderer3d;
import org.jzy3d.ui.views.ImagePanel;

public class MultiChartPanel extends JPanel {
    private static final long serialVersionUID = 7519209038396190502L;

    protected JTextField tf;
    protected JTextArea textArea;
    protected JScrollPane textPane;

    protected int lineHeightPX = 300;
    protected int columnWidthPX = 500;
    protected boolean growCol = true;
    protected boolean growLine = false;

    // protected List charts;

    protected boolean vertical;

    public static String WT = "awt";

    private int nComponent = 0;
    
    public static void ui(String[] headers, Chart[][] charts) throws IOException {
        MultiChartPanel monitorPanel = new MultiChartPanel(charts, headers, null, false, 100, 100, false, false);
        monitorPanel.ui();
    }
    
    public static void ui(String[] headers, Chart[][] charts, int width, int height) throws IOException {
        MultiChartPanel monitorPanel = new MultiChartPanel(charts, headers, null, false, width, height, false, false);
        monitorPanel.ui();
    }

    public MultiChartPanel(List charts)  {
        this(charts, true);
    }

    public MultiChartPanel(List charts, boolean vertical)  {
        this(charts, vertical, 500, 300);
    }

    public MultiChartPanel(List charts, boolean vertical, int width, int height)  {
        this(charts, vertical, width, height, true, false);
    }

    public MultiChartPanel(List charts, boolean vertical, int width, int height, boolean growCol, boolean growLine)  {
        LookAndFeel.apply();

        // Main layout
        this.vertical = vertical;
        this.lineHeightPX = height;
        this.columnWidthPX = width;
        this.growCol = growCol;
        this.growLine = growLine;

        String lines = lineInstruction();
        String columns = columnInstruction();
        setLayout(new MigLayout(insets0(), columns, lines));

        for (Chart c : charts) {
            addChart(c);
        }
    }

    public MultiChartPanel(Chart[][] charts, boolean vertical, int width, int height, boolean growCol, boolean growLine) throws IOException {
        this(charts, null, null, vertical, width, height, growCol, growLine);
    }

    public MultiChartPanel(Chart[][] charts, String[] header, String[] row, boolean vertical, int width, int height, boolean growCol, boolean growLine) throws IOException {
        LookAndFeel.apply();

        // Main layout
        this.vertical = vertical;
        this.lineHeightPX = height;
        this.columnWidthPX = width;
        this.growCol = growCol;
        this.growLine = growLine;

        boolean hasHeader = header != null;

        String lines = null;// lineInstruction();

        if (growLine) {
            if (hasHeader)
                lines = "[20px][" + lineHeightPX + "px,grow]";
            else
                lines = "[" + lineHeightPX + "px,grow]";

        } else {
            if (hasHeader)
                lines = "[20px][" + lineHeightPX + "px]";
            else
                lines = "[" + lineHeightPX + "px]";
        }

        String columns = columnInstruction();
        setLayout(new MigLayout(insets0(), columns, lines));
        // setBounds(0, 0, 700, 600);
        // demoList.setMinimumSize(new Dimension(200,200));
        // textPane.setMinimumSize(new Dimension(700, 50));

        if (hasHeader) {
            for (int i = 0; i < header.length; i++) {
                addPanelAt(new JLabel(header[i]), 0, i);
            }
        }

        for (int i = 0; i < charts.length; i++) {
            for (int j = 0; j < charts[i].length; j++) {
                if (charts[i][j] != null) {
                    int r = hasHeader ? i + 1 : i;
                    int c = j;
                    addChartAt(charts[i][j], r, c);
                } else {

                }
            }
        }
        
        //setPreferredSize(new Dimension((charts[0].length + 5)* columnWidthPX, (charts.length + 5) * lineHeightPX));
    }
    
    public String insetsDefault() {
        return "";
    }

    public String insets0() {
        return "insets 0 0 0 0";
    }


    public String lineInstruction() {
        if (growLine) {
            return "[" + lineHeightPX + "px,grow]";
        } else {
            return "[" + lineHeightPX + "px]";
        }
    }

    public String columnInstruction() {
        if (growCol) {
            return "[" + columnWidthPX + "px,grow]";
        } else {
            return "[" + columnWidthPX + "px]";
        }
    }

    public JPanel addChart(Chart chart) {
        Component component = getChartAsComponent(chart);
        
        return addPanel(component);
    }

    public JPanel addChartAt(Chart chart, int nlin, int ncol) {
        Component component;
        
        if(chart.getCanvas() instanceof OffscreenCanvas){
            component = getChartScreenshotAsComponent(chart);    
        }
        else
            component = getChartAsComponent(chart);
        return addPanelAt(component, nlin, ncol);
    }

    public JPanel getChartScreenshotAsComponent(Chart chart) {
        chart.screenshot();
        AWTRenderer3d renderer = (AWTRenderer3d)chart.getCanvas().getRenderer();
        BufferedImage i = renderer.getLastScreenshotImage();
        JPanel component = new ImagePanel(i);
        return component;
    }

    public Component  getChartAsComponent(Chart chart) {
        return (Component) chart.getCanvas();
    }

    public JPanel addPanel(java.awt.Component panel) {
        if (vertical) {
            int ncol = 0;
            int nlin = nComponent++;
            return addPanelAt(panel, nlin, ncol);
        } else {
            int nlin = 0;
            int ncol = nComponent++;
            return addPanelAt(panel, nlin, ncol);
        }
    }

    public JPanel addPanelAt(java.awt.Component panel, int nlin, int ncol) {
        JPanel chartPanel = new JPanel(new BorderLayout());
        Border b = BorderFactory.createLineBorder(Color.black);
        chartPanel.setBorder(b);
        chartPanel.add(panel, BorderLayout.CENTER);
        add(chartPanel, "cell " + ncol + " " + nlin + ", grow");
        return chartPanel;
    }
    
    public JFrame ui() {
        JScrollPane pane = new JScrollPane(this, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
        JPanel parent = new JPanel();
        parent.add(pane);
        return MultiChartPanel.frame(parent);
    }


    public JFrame frame() {
        return frame(this);
    }

    public static JFrame frame(JPanel panel) {
        JFrame frame = new JFrame();
        windowExitListener(frame);
        frame.add(panel);
        frame.pack();
        frame.show();
        frame.setVisible(true);
        return frame;
    }
    


    public static void windowExitListener(final JFrame frame) {
        frame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                frame.dispose();
                System.exit(0);
            }
        });
    }
}

 

Ads help maintain this website.