org.adempiere.apps.graph.Graph.java Source code

Java tutorial

Introduction

Here is the source code for org.adempiere.apps.graph.Graph.java

Source

/******************************************************************************
 * Product: Adempiere ERP & CRM Smart Business Solution                       *
 * Copyright (C) 1999-2006 ComPiere, Inc. All Rights Reserved.                *
 * This program is free software; you can redistribute it and/or modify it    *
 * under the terms version 2 of the GNU General Public License as published   *
 * by the Free Software Foundation. This program 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 General Public License for more details.                       *
 * You should have received a copy of the GNU General Public License along    *
 * with this program; if not, write to the Free Software Foundation, Inc.,    *
 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.                     *
 * For the text or an alternative of this public license, you may reach us    *
 * ComPiere, Inc., 2620 Augustine Dr. #245, Santa Clara, CA 95054, USA        *
 * or via info@compiere.org or http://www.compiere.org/license.html           *
 *****************************************************************************/
package org.adempiere.apps.graph;

import java.awt.BorderLayout;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Point;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyVetoException;
import java.beans.VetoableChangeListener;
import java.util.ArrayList;

import org.compiere.apps.AEnv;
import org.compiere.grid.ed.VLookup;
import org.compiere.model.MGoal;
import org.compiere.model.MLookup;
import org.compiere.model.MLookupFactory;
import org.compiere.model.MLookupInfo;
import org.compiere.model.MQuery;
import org.compiere.swing.CPanel;
import org.compiere.util.CLogger;
import org.compiere.util.DB;
import org.compiere.util.Env;
import org.jfree.chart.ChartMouseEvent;
import org.jfree.chart.ChartMouseListener;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.entity.CategoryItemEntity;
import org.jfree.chart.entity.ChartEntity;
import org.jfree.chart.entity.PieSectionEntity;

/**
 *    Graph
 *
 *  @author Jorg Janke
 *  @version $Id: BarGraph.java,v 1.2 2006/07/30 00:51:28 jjanke Exp $
 *
 * @author Teo Sarca, www.arhipac.ro
 *          <li>BF [ 2507325 ] BarGraph zoom not working
 * @author hengsin
 *          <li> Add support for other type of graph
 */
public class Graph extends CPanel implements ChartMouseListener {
    /**
     *
     */
    private static final long serialVersionUID = -4150122585550132822L;

    /**
     *    Constructor
     */
    public Graph() {
        super();
        this.setLayout(new BorderLayout());
        builder = new GraphBuilder();
    } //   BarGraph

    /**
     *    Constructor
     *   @param goal goal
     */
    public Graph(MGoal goal) {
        this(goal, false);
    }

    /**
     *    Constructor
     *   @param goal goal
     */
    public Graph(MGoal goal, boolean userSelection) {
        this();
        builder = new GraphBuilder();
        builder.setMGoal(goal);
        builder.setYAxisLabel(goal.getName());
        builder.setXAxisLabel(goal.getXAxisText());
        m_userSelection = userSelection;
        loadData();
        //addComponentListener(this);
    } //   BarGraph

    /** Graph Size            */
    //private Dimension       m_size = null;
    /** Zero/Zero Coordinate point   */
    private Point m_point0_0 = null;
    //   /** Layout               */
    //   private BarGraphLayout   m_layout = new BarGraphLayout(this);

    /**   Logger               */
    private static CLogger log = CLogger.getCLogger(Graph.class);

    /** Y Axis Target Line      */
    private double m_Y_Target = 0;
    /** Y Axis Target Line Label */
    private String m_Y_TargetLabel = null;
    private static Dimension paneldimension = new Dimension(180, 150);

    private GraphBuilder builder;

    /**
     *    Load Performance Data
     */
    ArrayList<GraphColumn> list = new ArrayList<GraphColumn>();
    private boolean m_userSelection;

    private void loadData() {

        list = builder.loadData();
        JFreeChart chart = builder.createChart(builder.getMGoal().getChartType());
        if (chartPanel != null)
            remove(chartPanel);

        chartPanel = new ChartPanel(chart);
        chartPanel.setSize(getSize());
        chartPanel.addChartMouseListener(this);
        add(chartPanel, BorderLayout.CENTER);

        if (m_userSelection) {
            int AD_Reference_Value_ID = DB.getSQLValue(null,
                    "SELECT AD_Reference_ID FROM AD_Reference WHERE Name = ?", "PA_Goal ChartType");
            MLookupInfo info = MLookupFactory.getLookup_List(Env.getLanguage(Env.getCtx()), AD_Reference_Value_ID);
            MLookup mLookup = new MLookup(info, 0);
            VLookup lookup = new VLookup("ChartType", false, false, true, mLookup);
            lookup.addVetoableChangeListener(new VetoableChangeListener() {

                public void vetoableChange(PropertyChangeEvent evt) throws PropertyVetoException {
                    Object value = evt.getNewValue();
                    if (value == null)
                        return;
                    JFreeChart chart = null;
                    chart = builder.createChart(value.toString());

                    if (chart != null) {
                        if (chartPanel != null)
                            remove(chartPanel);

                        chartPanel = new ChartPanel(chart);
                        chartPanel.setSize(getSize());
                        chartPanel.addChartMouseListener(Graph.this);
                        add(chartPanel, BorderLayout.CENTER);
                        getParent().validate();

                    }
                }

            });
            add(lookup, BorderLayout.NORTH);
        }
        this.setMinimumSize(paneldimension);
    } //   loadData

    private ChartPanel chartPanel;

    /**
     *    Get Point 0_0
     *   @return point
     */
    public Point getPoint0_0() {
        return m_point0_0;
    } //   getPoint0_0

    /**
     * @return Returns the x_AxisLabel.
     */
    public String getX_AxisLabel() {
        return builder.getXAxisLabel();
    } //   getX_AxisLabel

    /**
     * @param axisLabel The x_AxisLabel to set.
     */
    public void setX_AxisLabel(String axisLabel) {
        builder.setXAxisLabel(axisLabel);
    } //   setX_AxisLabel

    /**
     * @return Returns the y_AxisLabel.
     */
    public String getY_AxisLabel() {
        return builder.getYAxisLabel();
    } //   getY_AxisLabel

    /**
     * @param axisLabel The y_AxisLabel to set.
     */
    public void setY_AxisLabel(String axisLabel) {
        builder.setYAxisLabel(axisLabel);
    } //   setY_AxisLabel

    /**
     * @return Returns the y_TargetLabel.
     */
    public String getY_TargetLabel() {
        return m_Y_TargetLabel;
    } //   getY_TargetLabel

    /**
     * @param targetLabel The y_TargetLabel to set.
     */
    public void setY_TargetLabel(String targetLabel, double target) {
        m_Y_TargetLabel = targetLabel;
        m_Y_Target = target;
    } //   setY_TargetLabel

    /**
     * Get BarGraphColumn for ChartEntity
     * @param event
     * @return BarGraphColumn or null if not found
     */
    private GraphColumn getGraphColumn(ChartMouseEvent event) {
        ChartEntity entity = event.getEntity();
        String key = null;
        if (entity instanceof CategoryItemEntity) {
            Comparable<?> colKey = ((CategoryItemEntity) entity).getColumnKey();
            if (colKey != null) {
                key = colKey.toString();
            }
        } else if (entity instanceof PieSectionEntity) {
            Comparable<?> sectionKey = ((PieSectionEntity) entity).getSectionKey();
            if (sectionKey != null) {
                key = sectionKey.toString();
            }
        }
        if (key == null) {
            return null;
        }
        for (int i = 0; i < list.size(); i++) {
            final String label = list.get(i).getLabel();
            if (key.equals(label)) {
                return list.get(i);
            }
        }
        //
        return null;
    }

    public void chartMouseClicked(ChartMouseEvent event) {
        if ((event.getEntity() != null) && (event.getTrigger().getClickCount() > 1)) {
            setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
            try {
                GraphColumn bgc = getGraphColumn(event);
                if (bgc == null) {
                    return;
                }

                MQuery query = bgc.getMQuery(builder.getMGoal());
                if (query != null)
                    AEnv.zoom(query);
                else
                    log.warning("Nothing to zoom to - " + bgc);
            } finally {
                setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
            }
        }
    }

    public void chartMouseMoved(ChartMouseEvent event) {
    }

    public GraphColumn[] getGraphColumnList() {
        return list.toArray(new GraphColumn[list.size()]);
    }
} //   BarGraph