/******************************************************************************
* Copyright (C) 2008 Low Heng Sin *
* Copyright (C) 2008 Idalica Corporation *
* 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. *
*****************************************************************************/
package org.adempiere.webui.apps.graph;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.image.BufferedImage;
import java.text.DecimalFormat;
import org.adempiere.webui.component.Panel;
import org.compiere.model.MColorSchema;
import org.compiere.model.MGoal;
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.encoders.EncoderUtil;
import org.jfree.chart.encoders.ImageFormat;
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;
import org.zkoss.image.AImage;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zk.ui.event.Events;
import org.zkoss.zul.Image;
import org.zkoss.zul.Menuitem;
import org.zkoss.zul.Menupopup;
/**
* Performance Indicator
*
* @author hengsin
*/
public class WPerformanceIndicator extends Panel implements EventListener
{
/**
*
*/
private static final long serialVersionUID = 3580494126343850939L;
/**
* Constructor
* @param goal goal model
*/
public WPerformanceIndicator(MGoal goal)
{
super();
m_goal = goal;
init();
mRefresh.addEventListener(Events.ON_CLICK, this);
popupMenu.appendChild(mRefresh);
addEventListener(Events.ON_DOUBLE_CLICK, this);
addEventListener(Events.ON_CLICK, this);
} // PerformanceIndicator
private MGoal m_goal = null;
/** The Performance Name */
private String m_text = null;
/** Performance Line */
/** Integer Number Format */
private static DecimalFormat s_format = DisplayType.getNumberFormat(DisplayType.Integer);
Menupopup popupMenu = new Menupopup();
private Menuitem mRefresh = new Menuitem(Msg.getMsg(Env.getCtx(), "Refresh"), "/images/Refresh16.png");
ChartPanel chartPanel;
/**
* 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());
//
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),
new Color(-13091716)
));
rangeLo = rangeHi;
}
}
plot.setRange(new Range(0,rangeLo));
plot.setDialBackgroundPaint(new Color(-13091716));
plot.setUnits("");
plot.setDialShape(DialShape.CHORD);//CIRCLE);
plot.setNeedlePaint(Color.white);
plot.setTickSize(2000);
plot.setTickLabelFont(new Font("SansSerif", Font.BOLD, 8));
plot.setValueFont(new Font("SansSerif", Font.BOLD, 8));
plot.setNoDataMessageFont(new Font("SansSerif", Font.BOLD, 8));
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, 9), plot,false);
return chart;
}
/**
* Init Graph Display
* Kinamo (pelgrim)
*/
private void init()
{
JFreeChart chart = createChart();
chart.setBackgroundPaint(Color.WHITE);
chart.setBorderVisible(true);
chart.setBorderPaint(Color.LIGHT_GRAY);
chart.setAntiAlias(true);
BufferedImage bi = chart.createBufferedImage(200, 120, BufferedImage.TRANSLUCENT , null);
try {
byte[] bytes = EncoderUtil.encode(bi, ImageFormat.PNG, true);
AImage image = new AImage("", bytes);
Image myImage = new Image();
myImage.setContent(image);
appendChild(myImage);
}
catch (Exception e)
{
// TODO: handle exception
}
invalidate();
}
/**
* Update Display Data
*/
protected void updateDisplay()
{
chartPanel.setChart(createChart());
invalidate();
} // updateData
public void onEvent(Event event) throws Exception
{
}
}