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

Java tutorial

Introduction

Here is the source code for org.adempiere.apps.graph.PerformanceIndicator.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.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.text.DecimalFormat;

import javax.swing.BorderFactory;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.SwingUtilities;
import javax.swing.border.BevelBorder;
import javax.swing.event.EventListenerList;

import org.compiere.model.MColorSchema;
import org.compiere.model.MGoal;
import org.compiere.swing.CMenuItem;
import org.compiere.util.DisplayType;
import org.compiere.util.Env;
import org.compiere.util.Msg;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.DialShape;
import org.jfree.chart.plot.MeterInterval;
import org.jfree.chart.plot.MeterPlot;
import org.jfree.data.Range;
import org.jfree.data.general.DefaultValueDataset;
import org.jfree.ui.RectangleInsets;

/**
 *    Performance Indicator
 *   
 *  @author Jorg Janke
 *  @version $Id: PerformanceIndicator.java,v 1.2 2006/07/30 00:51:28 jjanke Exp $
 */
//vpj-cd e-evolution public class PerformanceIndicator extends JComponent 
public class PerformanceIndicator extends JPanel implements MouseListener, ActionListener {
    /**
     * 
     */
    private static final long serialVersionUID = 2267850468607341211L;

    /**
     *    Constructor
     *   @param goal goal model
     */
    public PerformanceIndicator(MGoal goal) {
        super();
        m_goal = goal;
        setName(m_goal.getName());
        //vpj-cd e-evolution getPreferredSize();      //   calculate size
        init();
        //
        setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));
        setOpaque(true);
        //vpj-cd e-evolution updateDisplay();

        //
        mRefresh.addActionListener(this);
        popupMenu.add(mRefresh);
        //
        addMouseListener(this);
    } //   PerformanceIndicator

    private MGoal m_goal = null;
    /**   The Performance Name      */
    private String m_text = null;
    /** Performance Line         */
    private double m_line = 0;

    /**   Height                  */
    private static double s_height = 45;
    /**   100% width               */
    private static double s_width100 = 150;
    /**   Max width               */
    private static double s_widthMax = 250;
    /** Integer Number Format      */
    private static DecimalFormat s_format = DisplayType.getNumberFormat(DisplayType.Integer);

    JPopupMenu popupMenu = new JPopupMenu();
    private CMenuItem mRefresh = new CMenuItem(Msg.getMsg(Env.getCtx(), "Refresh"),
            Env.getImageIcon("Refresh16.gif"));

    //Insert Pie Graph Kinamo (pelgrim)
    private static Color colorOK = Color.magenta;
    private static Color colorNotOK = Color.lightGray;
    private static Dimension indicatordimension = new Dimension(170, 120);
    private static Dimension paneldimension = new Dimension(180, 150);
    ChartPanel chartPanel;
    //private static Dimension 

    /**
     *    Get Goal
     *   @return goal
     */
    public MGoal getGoal() {
        return m_goal;
    } //   getGoal

    private JFreeChart createChart() {
        JFreeChart chart = null;

        //   Set Text
        StringBuffer text = new StringBuffer(m_goal.getName());
        if (m_goal.isTarget())
            text.append(": ").append(m_goal.getPercent()).append("%");
        else
            text.append(": ").append(s_format.format(m_goal.getMeasureActual()));

        m_text = text.toString();

        //   ToolTip
        text = new StringBuffer();
        if (m_goal.getDescription() != null)
            text.append(m_goal.getDescription()).append(": ");
        text.append(s_format.format(m_goal.getMeasureActual()));
        if (m_goal.isTarget())
            text.append(" ").append(Msg.getMsg(Env.getCtx(), "of")).append(" ")
                    .append(s_format.format(m_goal.getMeasureTarget()));
        setToolTipText(text.toString());
        //
        //setBackground(m_goal.getColor());
        setForeground(GraphUtil.getForeground(getBackground()));
        //   Performance Line
        int percent = m_goal.getPercent();
        if (percent > 100) //   draw 100% line
            m_line = s_width100;
        else //   draw Performance Line
            m_line = s_width100 * m_goal.getGoalPerformanceDouble();

        String title = m_text;
        DefaultValueDataset data = new DefaultValueDataset((float) m_goal.getPercent());
        MeterPlot plot = new MeterPlot(data);

        MColorSchema colorSchema = m_goal.getColorSchema();
        int rangeLo = 0;
        int rangeHi = 0;
        for (int i = 1; i <= 4; i++) {
            switch (i) {
            case 1:
                rangeHi = colorSchema.getMark1Percent();
                break;
            case 2:
                rangeHi = colorSchema.getMark2Percent();
                break;
            case 3:
                rangeHi = colorSchema.getMark3Percent();
                break;
            case 4:
                rangeHi = colorSchema.getMark4Percent();
                break;
            }
            if (rangeHi == 9999)
                rangeHi = (int) Math.floor(rangeLo * 1.5);
            if (rangeLo < rangeHi) {
                plot.addInterval(new MeterInterval("Normal", //label
                        new Range(rangeLo, rangeHi), //range
                        colorSchema.getColor(rangeHi), new BasicStroke(7.0f),
                        //Color.lightGray
                        new Color(-13091716)
                //Color.gray 
                ));
                rangeLo = rangeHi;
            }
        }
        plot.setRange(new Range(0, rangeLo));

        plot.setDialBackgroundPaint(new Color(-13091716));//Color.GRAY);
        plot.setUnits(m_goal.getName());
        plot.setDialShape(DialShape.CHORD);//CIRCLE);        
        //plot.setDialBackgroundPaint(new GradientPaint(0, 0, m_goal.getColor(), 0, 1000, Color.black));
        plot.setNeedlePaint(Color.white);
        plot.setTickSize(2000);
        plot.setTickLabelFont(new Font("SansSerif", Font.BOLD, 12));
        plot.setTickLabelPaint(Color.white);
        plot.setInsets(new RectangleInsets(1.0, 2.0, 3.0, 4.0));

        chart = new JFreeChart(m_text, new Font("SansSerif", Font.BOLD, 15), plot, false);

        return chart;
    }

    /**
    *    Init Graph Display
    *  Kinamo (pelgrim)
    */
    private void init() {
        chartPanel = new ChartPanel(createChart(), //chart
                false, //boolean properties
                false, // boolean save
                false, //boolean print
                false, //boolean zoom
                true //boolean tooltips
        );
        chartPanel.setPreferredSize(indicatordimension);

        chartPanel.addChartMouseListener(new org.jfree.chart.ChartMouseListener() {
            public void chartMouseClicked(org.jfree.chart.ChartMouseEvent e) {
                //plot p = (MeterPlot) e.getSource();
                MouseEvent me = e.getTrigger();
                if (SwingUtilities.isLeftMouseButton(me) && me.getClickCount() > 1)
                    fireActionPerformed(me);
                if (SwingUtilities.isRightMouseButton(me))
                    popupMenu.show((Component) me.getSource(), me.getX(), me.getY());
            }

            public void chartMouseMoved(org.jfree.chart.ChartMouseEvent e) {

            }
        });

        this.add(chartPanel, BorderLayout.NORTH);
        this.setMinimumSize(paneldimension);
        this.setMaximumSize(paneldimension);
        //---------------------------------------------

        invalidate();
    }

    /**
     *    Update Display Data
     */
    protected void updateDisplay() {
        chartPanel.setChart(createChart());
        invalidate();

    } //   updateData

    /**************************************************************************
     * Adds an <code>ActionListener</code> to the indicator.
     * @param l the <code>ActionListener</code> to be added
     */
    public void addActionListener(ActionListener l) {
        if (l != null)
            listenerList.add(ActionListener.class, l);
    } //   addActionListener

    /**
     * Removes an <code>ActionListener</code> from the indicator.
     * @param l the listener to be removed
     */
    public void removeActionListener(ActionListener l) {
        if (l != null)
            listenerList.remove(ActionListener.class, l);
    } //   removeActionListener

    /**
     * Returns an array of all the <code>ActionListener</code>s added
     * to this indicator with addActionListener().
     *
     * @return all of the <code>ActionListener</code>s added or an empty
     *         array if no listeners have been added
     */
    public ActionListener[] getActionListeners() {
        return (ActionListener[]) (listenerList.getListeners(ActionListener.class));
    } //   getActionListeners

    /**
     * Notifies all listeners that have registered interest for
     * notification on this event type.  The event instance 
     * is lazily created using the <code>event</code> 
     * parameter.
     *
     * @param event  the <code>ActionEvent</code> object
     * @see EventListenerList
     */
    protected void fireActionPerformed(MouseEvent event) {
        // Guaranteed to return a non-null array
        ActionListener[] listeners = getActionListeners();
        ActionEvent e = null;
        // Process the listeners first to last
        for (int i = 0; i < listeners.length; i++) {
            //   Lazily create the event:
            if (e == null)
                e = new ActionEvent(this, ActionEvent.ACTION_PERFORMED, "pi", event.getWhen(),
                        event.getModifiers());
            listeners[i].actionPerformed(e);
        }
    } //   fireActionPerformed

    /**************************************************************************
     *    Mouse Clicked
     *   @param e mouse event
     */
    public void mouseClicked(MouseEvent e) {
        if (SwingUtilities.isLeftMouseButton(e) && e.getClickCount() > 1)
            fireActionPerformed(e);
        if (SwingUtilities.isRightMouseButton(e))
            popupMenu.show((Component) e.getSource(), e.getX(), e.getY());
    } //   mouseClicked

    public void mousePressed(MouseEvent e) {
    }

    public void mouseReleased(MouseEvent e) {
    }

    public void mouseEntered(MouseEvent e) {
    }

    public void mouseExited(MouseEvent e) {
    }

    /**
     *    Action Listener.
     *    Update Display
     *   @param e event
     */
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == mRefresh) {
            m_goal.updateGoal(true);
            updateDisplay();
            //
            Container parent = getParent();
            if (parent != null)
                parent.invalidate();
            invalidate();
            if (parent != null)
                parent.repaint();
            else
                repaint();
        }
    } //   actionPerformed

} //   PerformanceIndicator