- added chart type support for performance indicato. Pie chart, line chart, area chart, waterfall chart and ring chart are now supported.
- refactoring to share common graph viewer code between swing and zk client
- enhance the rendering of performance chart for zk
- ported ViewPI custom form to zk
This commit is contained in:
Heng Sin Low 2009-07-11 03:46:17 +00:00
parent b6d3322de5
commit e6feb3d65f
23 changed files with 1833 additions and 2021 deletions

View File

@ -92,6 +92,19 @@ public interface I_PA_Goal
public I_AD_User getAD_User() throws RuntimeException;
/** Column name ChartType */
public static final String COLUMNNAME_ChartType = "ChartType";
/** Set Chart Type.
* Type fo chart to render
*/
public void setChartType (String ChartType);
/** Get Chart Type.
* Type fo chart to render
*/
public String getChartType();
/** Column name Created */
public static final String COLUMNNAME_Created = "Created";
@ -292,19 +305,6 @@ public interface I_PA_Goal
public I_PA_ColorSchema getPA_ColorSchema() throws RuntimeException;
/** Column name PA_Goal_ID */
public static final String COLUMNNAME_PA_Goal_ID = "PA_Goal_ID";
/** Set Goal.
* Performance Goal
*/
public void setPA_Goal_ID (int PA_Goal_ID);
/** Get Goal.
* Performance Goal
*/
public int getPA_Goal_ID();
/** Column name PA_GoalParent_ID */
public static final String COLUMNNAME_PA_GoalParent_ID = "PA_GoalParent_ID";
@ -318,6 +318,19 @@ public interface I_PA_Goal
*/
public int getPA_GoalParent_ID();
/** Column name PA_Goal_ID */
public static final String COLUMNNAME_PA_Goal_ID = "PA_Goal_ID";
/** Set Goal.
* Performance Goal
*/
public void setPA_Goal_ID (int PA_Goal_ID);
/** Get Goal.
* Performance Goal
*/
public int getPA_Goal_ID();
/** Column name PA_Measure_ID */
public static final String COLUMNNAME_PA_Measure_ID = "PA_Measure_ID";

View File

@ -17,11 +17,14 @@
package org.compiere.model;
import java.math.BigDecimal;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Properties;
import java.util.logging.Level;
import org.adempiere.apps.graph.GraphColumn;
import org.compiere.util.CCache;
import org.compiere.util.DB;
import org.compiere.util.Env;
@ -42,7 +45,7 @@ public class MMeasure extends X_PA_Measure
/**
*
*/
private static final long serialVersionUID = -3317015206590431626L;
private static final long serialVersionUID = 6274990637485210675L;
/**
* Get MMeasure from Cache
@ -87,8 +90,184 @@ public class MMeasure extends X_PA_Measure
{
super (ctx, rs, trxName);
} // MMeasure
public ArrayList<GraphColumn> getGraphColumnList(MGoal goal)
{
ArrayList<GraphColumn> list = new ArrayList<GraphColumn>();
if (MMeasure.MEASURETYPE_Calculated.equals(getMeasureType()))
{
MMeasureCalc mc = MMeasureCalc.get(getCtx(), getPA_MeasureCalc_ID());
String sql = mc.getSqlBarChart(goal.getRestrictions(false),
goal.getMeasureDisplay(), goal.getDateFrom(),
MRole.getDefault()); // logged in role
PreparedStatement pstmt = null;
ResultSet rs = null;
try
{
pstmt = DB.prepareStatement (sql, null);
rs = pstmt.executeQuery ();
ArrayList<Timestamp> dataList = new ArrayList<Timestamp>();
while (rs.next ())
{
BigDecimal data = rs.getBigDecimal(1);
Timestamp date = rs.getTimestamp(2);
GraphColumn bgc = new GraphColumn(mc, data);
bgc.setLabel(date, goal.getMeasureDisplay()); //TODO copy order-loop to other measures
int pos=0;
for (int i = 0; i < dataList.size(); i++)
if (dataList.get(i).before(date)) pos++;
dataList.add(date); // list of dates
list.add(pos, bgc);
}
}
catch (Exception e)
{
log.log (Level.SEVERE, sql, e);
}
finally
{
DB.close(rs, pstmt);
rs = null; pstmt = null;
}
}
else if (MMeasure.MEASURETYPE_Achievements.equals(getMeasureType()))
{
if (MMeasure.MEASUREDATATYPE_StatusQtyAmount.equals(getMeasureDataType()))
{
MAchievement[] achievements = MAchievement.get(this);
for (int i = 0; i < achievements.length; i++)
{
MAchievement achievement = achievements[i];
GraphColumn bgc = new GraphColumn(achievement);
list.add(bgc);
}
}
else // MMeasure.MEASUREDATATYPE_QtyAmountInTime
{
String MeasureDisplay = goal.getMeasureDisplay();
String trunc = "D";
if (MGoal.MEASUREDISPLAY_Year.equals(MeasureDisplay))
trunc = "Y";
else if (MGoal.MEASUREDISPLAY_Quarter.equals(MeasureDisplay))
trunc = "Q";
else if (MGoal.MEASUREDISPLAY_Month.equals(MeasureDisplay))
trunc = "MM";
else if (MGoal.MEASUREDISPLAY_Week.equals(MeasureDisplay))
trunc = "W";
// else if (MGoal.MEASUREDISPLAY_Day.equals(MeasureDisplay))
// trunc = "D";
trunc = "TRUNC(DateDoc,'" + trunc + "')";
StringBuffer sql = new StringBuffer ("SELECT SUM(ManualActual), ")
.append(trunc).append(" FROM PA_Achievement WHERE PA_Measure_ID=? AND IsAchieved='Y' ")
.append("GROUP BY ").append(trunc)
.append(" ORDER BY ").append(trunc);
PreparedStatement pstmt = null;
ResultSet rs = null;
try
{
pstmt = DB.prepareStatement (sql.toString(), null);
pstmt.setInt(1, getPA_Measure_ID());
rs = pstmt.executeQuery ();
while (rs.next ())
{
BigDecimal data = rs.getBigDecimal(1);
Timestamp date = rs.getTimestamp(2);
GraphColumn bgc = new GraphColumn(goal, data);
bgc.setLabel(date, goal.getMeasureDisplay());
list.add(bgc);
}
}
catch (Exception e)
{
log.log (Level.SEVERE, sql.toString(), e);
}
finally
{
DB.close(rs, pstmt);
rs = null; pstmt = null;
}
} // Achievement in time
} // Achievement
// Request
else if (MMeasure.MEASURETYPE_Request.equals(getMeasureType()))
{
MRequestType rt = MRequestType.get(Env.getCtx(), getR_RequestType_ID());
String sql = rt.getSqlBarChart(goal.getRestrictions(false),
goal.getMeasureDisplay(), getMeasureDataType(),
goal.getDateFrom(), MRole.getDefault()); // logged in role
PreparedStatement pstmt = null;
ResultSet rs = null;
try
{
pstmt = DB.prepareStatement (sql, null);
rs = pstmt.executeQuery ();
while (rs.next ())
{
BigDecimal data = rs.getBigDecimal(1);
int R_Status_ID = rs.getInt(3);
GraphColumn bgc = new GraphColumn(rt, data, R_Status_ID);
if (R_Status_ID == 0)
{
Timestamp date = rs.getTimestamp(2);
bgc.setLabel(date, goal.getMeasureDisplay());
}
else
{
MStatus status = MStatus.get(Env.getCtx(), R_Status_ID);
bgc.setLabel(status.getName());
}
list.add(bgc);
}
}
catch (Exception e)
{
log.log (Level.SEVERE, sql, e);
}
finally
{
DB.close(rs, pstmt);
rs = null; pstmt = null;
}
} // Request
// Project
else if (MMeasure.MEASURETYPE_Project.equals(getMeasureType()))
{
MProjectType pt = MProjectType.get(Env.getCtx(), getC_ProjectType_ID());
String sql = pt.getSqlBarChart(goal.getRestrictions(false),
goal.getMeasureDisplay(), getMeasureDataType(),
goal.getDateFrom(), MRole.getDefault()); // logged in role
PreparedStatement pstmt = null;
ResultSet rs = null;
try
{
pstmt = DB.prepareStatement (sql, null);
rs = pstmt.executeQuery ();
while (rs.next ())
{
BigDecimal data = rs.getBigDecimal(1);
Timestamp date = rs.getTimestamp(2);
int id = rs.getInt(3);
GraphColumn bgc = new GraphColumn(pt, data, id);
bgc.setLabel(date, goal.getMeasureDisplay());
list.add(bgc);
}
}
catch (Exception e)
{
log.log (Level.SEVERE, sql, e);
}
finally
{
DB.close(rs, pstmt);
rs = null; pstmt = null;
}
} // Project
return list;
}
/**
* String Representation
* @return info

View File

@ -27,15 +27,15 @@ import org.compiere.util.Env;
import org.compiere.util.KeyNamePair;
/** Generated Model for PA_Goal
* @author Adempiere (generated)
* @author Adempiere (generated)
* @version Release 3.5.3a - $Id$ */
public class X_PA_Goal extends PO implements I_PA_Goal, I_Persistent
public class X_PA_Goal extends PO implements I_PA_Goal, I_Persistent
{
/**
*
*/
private static final long serialVersionUID = 20081221L;
private static final long serialVersionUID = 20090710L;
/** Standard Constructor */
public X_PA_Goal (Properties ctx, int PA_Goal_ID, String trxName)
@ -64,7 +64,7 @@ public class X_PA_Goal extends PO implements I_PA_Goal, I_Persistent
}
/** AccessLevel
* @return 6 - System - Client
* @return 6 - System - Client
*/
protected int get_AccessLevel()
{
@ -85,7 +85,7 @@ public class X_PA_Goal extends PO implements I_PA_Goal, I_Persistent
return sb.toString();
}
public I_AD_Role getAD_Role() throws RuntimeException
public I_AD_Role getAD_Role() throws RuntimeException
{
Class<?> clazz = MTable.getClass(I_AD_Role.Table_Name);
I_AD_Role result = null;
@ -102,21 +102,21 @@ public class X_PA_Goal extends PO implements I_PA_Goal, I_Persistent
}
/** Set Role.
@param AD_Role_ID
@param AD_Role_ID
Responsibility Role
*/
public void setAD_Role_ID (int AD_Role_ID)
{
if (AD_Role_ID < 0)
if (AD_Role_ID < 0)
set_Value (COLUMNNAME_AD_Role_ID, null);
else
else
set_Value (COLUMNNAME_AD_Role_ID, Integer.valueOf(AD_Role_ID));
}
/** Get Role.
@return Responsibility Role
*/
public int getAD_Role_ID ()
public int getAD_Role_ID ()
{
Integer ii = (Integer)get_Value(COLUMNNAME_AD_Role_ID);
if (ii == null)
@ -124,7 +124,7 @@ public class X_PA_Goal extends PO implements I_PA_Goal, I_Persistent
return ii.intValue();
}
public I_AD_User getAD_User() throws RuntimeException
public I_AD_User getAD_User() throws RuntimeException
{
Class<?> clazz = MTable.getClass(I_AD_User.Table_Name);
I_AD_User result = null;
@ -141,21 +141,21 @@ public class X_PA_Goal extends PO implements I_PA_Goal, I_Persistent
}
/** Set User/Contact.
@param AD_User_ID
@param AD_User_ID
User within the system - Internal or Business Partner Contact
*/
public void setAD_User_ID (int AD_User_ID)
{
if (AD_User_ID < 1)
if (AD_User_ID < 1)
set_Value (COLUMNNAME_AD_User_ID, null);
else
else
set_Value (COLUMNNAME_AD_User_ID, Integer.valueOf(AD_User_ID));
}
/** Get User/Contact.
@return User within the system - Internal or Business Partner Contact
*/
public int getAD_User_ID ()
public int getAD_User_ID ()
{
Integer ii = (Integer)get_Value(COLUMNNAME_AD_User_ID);
if (ii == null)
@ -163,8 +163,40 @@ public class X_PA_Goal extends PO implements I_PA_Goal, I_Persistent
return ii.intValue();
}
/** ChartType AD_Reference_ID=53315 */
public static final int CHARTTYPE_AD_Reference_ID=53315;
/** Bar Chart = BC */
public static final String CHARTTYPE_BarChart = "BC";
/** Pie Chart = PC */
public static final String CHARTTYPE_PieChart = "PC";
/** Ring Chart = RC */
public static final String CHARTTYPE_RingChart = "RC";
/** Line Chart = LC */
public static final String CHARTTYPE_LineChart = "LC";
/** Area Chart = AC */
public static final String CHARTTYPE_AreaChart = "AC";
/** Waterfall Chart = WC */
public static final String CHARTTYPE_WaterfallChart = "WC";
/** Set Chart Type.
@param ChartType
Type fo chart to render
*/
public void setChartType (String ChartType)
{
set_Value (COLUMNNAME_ChartType, ChartType);
}
/** Get Chart Type.
@return Type fo chart to render
*/
public String getChartType ()
{
return (String)get_Value(COLUMNNAME_ChartType);
}
/** Set Date From.
@param DateFrom
@param DateFrom
Starting date for a range
*/
public void setDateFrom (Timestamp DateFrom)
@ -175,13 +207,13 @@ public class X_PA_Goal extends PO implements I_PA_Goal, I_Persistent
/** Get Date From.
@return Starting date for a range
*/
public Timestamp getDateFrom ()
public Timestamp getDateFrom ()
{
return (Timestamp)get_Value(COLUMNNAME_DateFrom);
}
/** Set Date last run.
@param DateLastRun
@param DateLastRun
Date the process was last run.
*/
public void setDateLastRun (Timestamp DateLastRun)
@ -192,13 +224,13 @@ public class X_PA_Goal extends PO implements I_PA_Goal, I_Persistent
/** Get Date last run.
@return Date the process was last run.
*/
public Timestamp getDateLastRun ()
public Timestamp getDateLastRun ()
{
return (Timestamp)get_Value(COLUMNNAME_DateLastRun);
}
/** Set Date To.
@param DateTo
@param DateTo
End date of a date range
*/
public void setDateTo (Timestamp DateTo)
@ -209,13 +241,13 @@ public class X_PA_Goal extends PO implements I_PA_Goal, I_Persistent
/** Get Date To.
@return End date of a date range
*/
public Timestamp getDateTo ()
public Timestamp getDateTo ()
{
return (Timestamp)get_Value(COLUMNNAME_DateTo);
}
/** Set Description.
@param Description
@param Description
Optional short description of the record
*/
public void setDescription (String Description)
@ -226,13 +258,13 @@ public class X_PA_Goal extends PO implements I_PA_Goal, I_Persistent
/** Get Description.
@return Optional short description of the record
*/
public String getDescription ()
public String getDescription ()
{
return (String)get_Value(COLUMNNAME_Description);
}
/** Set Performance Goal.
@param GoalPerformance
@param GoalPerformance
Target achievement from 0..1
*/
public void setGoalPerformance (BigDecimal GoalPerformance)
@ -243,7 +275,7 @@ public class X_PA_Goal extends PO implements I_PA_Goal, I_Persistent
/** Get Performance Goal.
@return Target achievement from 0..1
*/
public BigDecimal getGoalPerformance ()
public BigDecimal getGoalPerformance ()
{
BigDecimal bd = (BigDecimal)get_Value(COLUMNNAME_GoalPerformance);
if (bd == null)
@ -252,7 +284,7 @@ public class X_PA_Goal extends PO implements I_PA_Goal, I_Persistent
}
/** Set Summary Level.
@param IsSummary
@param IsSummary
This is a summary entity
*/
public void setIsSummary (boolean IsSummary)
@ -263,20 +295,20 @@ public class X_PA_Goal extends PO implements I_PA_Goal, I_Persistent
/** Get Summary Level.
@return This is a summary entity
*/
public boolean isSummary ()
public boolean isSummary ()
{
Object oo = get_Value(COLUMNNAME_IsSummary);
if (oo != null)
if (oo != null)
{
if (oo instanceof Boolean)
return ((Boolean)oo).booleanValue();
if (oo instanceof Boolean)
return ((Boolean)oo).booleanValue();
return "Y".equals(oo);
}
return false;
}
/** Set Measure Actual.
@param MeasureActual
@param MeasureActual
Actual value that has been measured.
*/
public void setMeasureActual (BigDecimal MeasureActual)
@ -287,7 +319,7 @@ public class X_PA_Goal extends PO implements I_PA_Goal, I_Persistent
/** Get Measure Actual.
@return Actual value that has been measured.
*/
public BigDecimal getMeasureActual ()
public BigDecimal getMeasureActual ()
{
BigDecimal bd = (BigDecimal)get_Value(COLUMNNAME_MeasureActual);
if (bd == null)
@ -310,7 +342,7 @@ public class X_PA_Goal extends PO implements I_PA_Goal, I_Persistent
/** Day = 8 */
public static final String MEASUREDISPLAY_Day = "8";
/** Set Measure Display.
@param MeasureDisplay
@param MeasureDisplay
Measure Scope initially displayed
*/
public void setMeasureDisplay (String MeasureDisplay)
@ -322,7 +354,7 @@ public class X_PA_Goal extends PO implements I_PA_Goal, I_Persistent
/** Get Measure Display.
@return Measure Scope initially displayed
*/
public String getMeasureDisplay ()
public String getMeasureDisplay ()
{
return (String)get_Value(COLUMNNAME_MeasureDisplay);
}
@ -342,7 +374,7 @@ public class X_PA_Goal extends PO implements I_PA_Goal, I_Persistent
/** Day = 8 */
public static final String MEASURESCOPE_Day = "8";
/** Set Measure Scope.
@param MeasureScope
@param MeasureScope
Performance Measure Scope
*/
public void setMeasureScope (String MeasureScope)
@ -354,13 +386,13 @@ public class X_PA_Goal extends PO implements I_PA_Goal, I_Persistent
/** Get Measure Scope.
@return Performance Measure Scope
*/
public String getMeasureScope ()
public String getMeasureScope ()
{
return (String)get_Value(COLUMNNAME_MeasureScope);
}
/** Set Measure Target.
@param MeasureTarget
@param MeasureTarget
Target value for measure
*/
public void setMeasureTarget (BigDecimal MeasureTarget)
@ -371,7 +403,7 @@ public class X_PA_Goal extends PO implements I_PA_Goal, I_Persistent
/** Get Measure Target.
@return Target value for measure
*/
public BigDecimal getMeasureTarget ()
public BigDecimal getMeasureTarget ()
{
BigDecimal bd = (BigDecimal)get_Value(COLUMNNAME_MeasureTarget);
if (bd == null)
@ -380,7 +412,7 @@ public class X_PA_Goal extends PO implements I_PA_Goal, I_Persistent
}
/** Set Name.
@param Name
@param Name
Alphanumeric identifier of the entity
*/
public void setName (String Name)
@ -391,7 +423,7 @@ public class X_PA_Goal extends PO implements I_PA_Goal, I_Persistent
/** Get Name.
@return Alphanumeric identifier of the entity
*/
public String getName ()
public String getName ()
{
return (String)get_Value(COLUMNNAME_Name);
}
@ -399,13 +431,13 @@ public class X_PA_Goal extends PO implements I_PA_Goal, I_Persistent
/** Get Record ID/ColumnName
@return ID/ColumnName pair
*/
public KeyNamePair getKeyNamePair()
public KeyNamePair getKeyNamePair()
{
return new KeyNamePair(get_ID(), getName());
}
/** Set Note.
@param Note
@param Note
Optional additional user defined information
*/
public void setNote (String Note)
@ -416,12 +448,12 @@ public class X_PA_Goal extends PO implements I_PA_Goal, I_Persistent
/** Get Note.
@return Optional additional user defined information
*/
public String getNote ()
public String getNote ()
{
return (String)get_Value(COLUMNNAME_Note);
}
public I_PA_ColorSchema getPA_ColorSchema() throws RuntimeException
public I_PA_ColorSchema getPA_ColorSchema() throws RuntimeException
{
Class<?> clazz = MTable.getClass(I_PA_ColorSchema.Table_Name);
I_PA_ColorSchema result = null;
@ -438,21 +470,21 @@ public class X_PA_Goal extends PO implements I_PA_Goal, I_Persistent
}
/** Set Color Schema.
@param PA_ColorSchema_ID
@param PA_ColorSchema_ID
Performance Color Schema
*/
public void setPA_ColorSchema_ID (int PA_ColorSchema_ID)
{
if (PA_ColorSchema_ID < 1)
if (PA_ColorSchema_ID < 1)
set_Value (COLUMNNAME_PA_ColorSchema_ID, null);
else
else
set_Value (COLUMNNAME_PA_ColorSchema_ID, Integer.valueOf(PA_ColorSchema_ID));
}
/** Get Color Schema.
@return Performance Color Schema
*/
public int getPA_ColorSchema_ID ()
public int getPA_ColorSchema_ID ()
{
Integer ii = (Integer)get_Value(COLUMNNAME_PA_ColorSchema_ID);
if (ii == null)
@ -460,45 +492,22 @@ public class X_PA_Goal extends PO implements I_PA_Goal, I_Persistent
return ii.intValue();
}
/** Set Goal.
@param PA_Goal_ID
Performance Goal
*/
public void setPA_Goal_ID (int PA_Goal_ID)
{
if (PA_Goal_ID < 1)
set_ValueNoCheck (COLUMNNAME_PA_Goal_ID, null);
else
set_ValueNoCheck (COLUMNNAME_PA_Goal_ID, Integer.valueOf(PA_Goal_ID));
}
/** Get Goal.
@return Performance Goal
*/
public int getPA_Goal_ID ()
{
Integer ii = (Integer)get_Value(COLUMNNAME_PA_Goal_ID);
if (ii == null)
return 0;
return ii.intValue();
}
/** Set Parent Goal.
@param PA_GoalParent_ID
@param PA_GoalParent_ID
Parent Goal
*/
public void setPA_GoalParent_ID (int PA_GoalParent_ID)
{
if (PA_GoalParent_ID < 1)
if (PA_GoalParent_ID < 1)
set_Value (COLUMNNAME_PA_GoalParent_ID, null);
else
else
set_Value (COLUMNNAME_PA_GoalParent_ID, Integer.valueOf(PA_GoalParent_ID));
}
/** Get Parent Goal.
@return Parent Goal
*/
public int getPA_GoalParent_ID ()
public int getPA_GoalParent_ID ()
{
Integer ii = (Integer)get_Value(COLUMNNAME_PA_GoalParent_ID);
if (ii == null)
@ -506,7 +515,30 @@ public class X_PA_Goal extends PO implements I_PA_Goal, I_Persistent
return ii.intValue();
}
public I_PA_Measure getPA_Measure() throws RuntimeException
/** Set Goal.
@param PA_Goal_ID
Performance Goal
*/
public void setPA_Goal_ID (int PA_Goal_ID)
{
if (PA_Goal_ID < 1)
set_ValueNoCheck (COLUMNNAME_PA_Goal_ID, null);
else
set_ValueNoCheck (COLUMNNAME_PA_Goal_ID, Integer.valueOf(PA_Goal_ID));
}
/** Get Goal.
@return Performance Goal
*/
public int getPA_Goal_ID ()
{
Integer ii = (Integer)get_Value(COLUMNNAME_PA_Goal_ID);
if (ii == null)
return 0;
return ii.intValue();
}
public I_PA_Measure getPA_Measure() throws RuntimeException
{
Class<?> clazz = MTable.getClass(I_PA_Measure.Table_Name);
I_PA_Measure result = null;
@ -523,21 +555,21 @@ public class X_PA_Goal extends PO implements I_PA_Goal, I_Persistent
}
/** Set Measure.
@param PA_Measure_ID
@param PA_Measure_ID
Concrete Performance Measurement
*/
public void setPA_Measure_ID (int PA_Measure_ID)
{
if (PA_Measure_ID < 1)
if (PA_Measure_ID < 1)
set_Value (COLUMNNAME_PA_Measure_ID, null);
else
else
set_Value (COLUMNNAME_PA_Measure_ID, Integer.valueOf(PA_Measure_ID));
}
/** Get Measure.
@return Concrete Performance Measurement
*/
public int getPA_Measure_ID ()
public int getPA_Measure_ID ()
{
Integer ii = (Integer)get_Value(COLUMNNAME_PA_Measure_ID);
if (ii == null)
@ -546,7 +578,7 @@ public class X_PA_Goal extends PO implements I_PA_Goal, I_Persistent
}
/** Set Relative Weight.
@param RelativeWeight
@param RelativeWeight
Relative weight of this step (0 = ignored)
*/
public void setRelativeWeight (BigDecimal RelativeWeight)
@ -557,7 +589,7 @@ public class X_PA_Goal extends PO implements I_PA_Goal, I_Persistent
/** Get Relative Weight.
@return Relative weight of this step (0 = ignored)
*/
public BigDecimal getRelativeWeight ()
public BigDecimal getRelativeWeight ()
{
BigDecimal bd = (BigDecimal)get_Value(COLUMNNAME_RelativeWeight);
if (bd == null)
@ -566,7 +598,7 @@ public class X_PA_Goal extends PO implements I_PA_Goal, I_Persistent
}
/** Set Sequence.
@param SeqNo
@param SeqNo
Method of ordering records; lowest number comes first
*/
public void setSeqNo (int SeqNo)
@ -577,7 +609,7 @@ public class X_PA_Goal extends PO implements I_PA_Goal, I_Persistent
/** Get Sequence.
@return Method of ordering records; lowest number comes first
*/
public int getSeqNo ()
public int getSeqNo ()
{
Integer ii = (Integer)get_Value(COLUMNNAME_SeqNo);
if (ii == null)

View File

@ -1,520 +0,0 @@
/******************************************************************************
* 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.Color;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Point;
import java.math.BigDecimal;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.logging.Level;
import org.compiere.apps.AEnv;
import org.compiere.model.MAchievement;
import org.compiere.model.MGoal;
import org.compiere.model.MMeasure;
import org.compiere.model.MMeasureCalc;
import org.compiere.model.MProjectType;
import org.compiere.model.MQuery;
import org.compiere.model.MRequestType;
import org.compiere.model.MRole;
import org.compiere.model.MStatus;
import org.compiere.swing.CPanel;
import org.compiere.util.CLogger;
import org.compiere.util.DB;
import org.compiere.util.Env;
import org.jfree.chart.ChartFactory;
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.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.BarRenderer;
import org.jfree.data.category.DefaultCategoryDataset;
/**
* Bar 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
*/
public class BarGraph extends CPanel implements ChartMouseListener
{
/**
*
*/
private static final long serialVersionUID = -4150122585550132822L;
/**
* Constructor
*/
public BarGraph()
{
super();
this.setLayout(new BorderLayout());
} // BarGraph
/**
* Constructor
* @param goal goal
*/
public BarGraph(MGoal goal)
{
this();
m_goal = goal;
m_Y_AxisLabel = goal.getName();
m_X_AxisLabel = goal.getXAxisText();
loadData();
//addComponentListener(this);
} // BarGraph
/** The Goal */
private MGoal m_goal = null;
/** Graph Size */
//private Dimension m_size = null;
/** Zero/Zero Coordibate point */
private Point m_point0_0 = null;
// /** Layout */
// private BarGraphLayout m_layout = new BarGraphLayout(this);
/** Logger */
private static CLogger log = CLogger.getCLogger (BarGraph.class);
/** X Axis Label */
private String m_X_AxisLabel = "X Axis";
/** Y Axis Label */
private String m_Y_AxisLabel = "Y Axis";
// /** Y Axis Max */
// private double m_Y_Max = 0;
/** 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);
final DefaultCategoryDataset dataset = new DefaultCategoryDataset();
/**
* Load Performance Data
*/
ArrayList<BarGraphColumn> list = new ArrayList<BarGraphColumn>();
private void loadData()
{
// Calculated
MMeasure measure = m_goal.getMeasure();
if (measure == null)
{
log.warning("No Measure for " + m_goal);
return;
}
if (MMeasure.MEASURETYPE_Calculated.equals(measure.getMeasureType()))
{
MMeasureCalc mc = MMeasureCalc.get(Env.getCtx(), measure.getPA_MeasureCalc_ID());
String sql = mc.getSqlBarChart(m_goal.getRestrictions(false),
m_goal.getMeasureDisplay(), m_goal.getDateFrom(),
MRole.getDefault()); // logged in role
PreparedStatement pstmt = null;
ResultSet rs = null;
try
{
pstmt = DB.prepareStatement (sql, null);
rs = pstmt.executeQuery ();
ArrayList<Timestamp> dataList = new ArrayList<Timestamp>();
while (rs.next ())
{
BigDecimal data = rs.getBigDecimal(1);
Timestamp date = rs.getTimestamp(2);
BarGraphColumn bgc = new BarGraphColumn(mc, data);
bgc.setLabel(date, m_goal.getMeasureDisplay()); //TODO copy order-loop to other measures
int pos=0;
for (int i = 0; i < dataList.size(); i++)
if (dataList.get(i).before(date)) pos++;
dataList.add(date); // list of dates
list.add(pos, bgc);
}
}
catch (Exception e)
{
log.log (Level.SEVERE, sql, e);
}
finally
{
DB.close(rs, pstmt);
rs = null; pstmt = null;
}
}
else if (MMeasure.MEASURETYPE_Achievements.equals(measure.getMeasureType()))
{
if (MMeasure.MEASUREDATATYPE_StatusQtyAmount.equals(measure.getMeasureDataType()))
{
MAchievement[] achievements = MAchievement.get(measure);
for (int i = 0; i < achievements.length; i++)
{
MAchievement achievement = achievements[i];
BarGraphColumn bgc = new BarGraphColumn(achievement);
list.add(bgc);
}
}
else // MMeasure.MEASUREDATATYPE_QtyAmountInTime
{
String MeasureDisplay = m_goal.getMeasureDisplay();
String trunc = "D";
if (MGoal.MEASUREDISPLAY_Year.equals(MeasureDisplay))
trunc = "Y";
else if (MGoal.MEASUREDISPLAY_Quarter.equals(MeasureDisplay))
trunc = "Q";
else if (MGoal.MEASUREDISPLAY_Month.equals(MeasureDisplay))
trunc = "MM";
else if (MGoal.MEASUREDISPLAY_Week.equals(MeasureDisplay))
trunc = "W";
// else if (MGoal.MEASUREDISPLAY_Day.equals(MeasureDisplay))
// trunc = "D";
trunc = "TRUNC(DateDoc,'" + trunc + "')";
StringBuffer sql = new StringBuffer ("SELECT SUM(ManualActual), ")
.append(trunc).append(" FROM PA_Achievement WHERE PA_Measure_ID=? AND IsAchieved='Y' ")
.append("GROUP BY ").append(trunc)
.append(" ORDER BY ").append(trunc);
PreparedStatement pstmt = null;
ResultSet rs = null;
try
{
pstmt = DB.prepareStatement (sql.toString(), null);
pstmt.setInt(1, measure.getPA_Measure_ID());
rs = pstmt.executeQuery ();
while (rs.next ())
{
BigDecimal data = rs.getBigDecimal(1);
Timestamp date = rs.getTimestamp(2);
BarGraphColumn bgc = new BarGraphColumn(m_goal, data);
bgc.setLabel(date, m_goal.getMeasureDisplay());
list.add(bgc);
}
}
catch (Exception e)
{
log.log (Level.SEVERE, sql.toString(), e);
}
finally
{
DB.close(rs, pstmt);
rs = null; pstmt = null;
}
} // Achievement in time
} // Achievement
// Request
else if (MMeasure.MEASURETYPE_Request.equals(measure.getMeasureType()))
{
MRequestType rt = MRequestType.get(Env.getCtx(), measure.getR_RequestType_ID());
String sql = rt.getSqlBarChart(m_goal.getRestrictions(false),
m_goal.getMeasureDisplay(), measure.getMeasureDataType(),
m_goal.getDateFrom(), MRole.getDefault()); // logged in role
PreparedStatement pstmt = null;
ResultSet rs = null;
try
{
pstmt = DB.prepareStatement (sql, null);
rs = pstmt.executeQuery ();
while (rs.next ())
{
BigDecimal data = rs.getBigDecimal(1);
int R_Status_ID = rs.getInt(3);
BarGraphColumn bgc = new BarGraphColumn(rt, data, R_Status_ID);
if (R_Status_ID == 0)
{
Timestamp date = rs.getTimestamp(2);
bgc.setLabel(date, m_goal.getMeasureDisplay());
}
else
{
MStatus status = MStatus.get(Env.getCtx(), R_Status_ID);
bgc.setLabel(status.getName());
}
list.add(bgc);
}
}
catch (Exception e)
{
log.log (Level.SEVERE, sql, e);
}
finally
{
DB.close(rs, pstmt);
rs = null; pstmt = null;
}
} // Request
// Project
else if (MMeasure.MEASURETYPE_Project.equals(measure.getMeasureType()))
{
MProjectType pt = MProjectType.get(Env.getCtx(), measure.getC_ProjectType_ID());
String sql = pt.getSqlBarChart(m_goal.getRestrictions(false),
m_goal.getMeasureDisplay(), measure.getMeasureDataType(),
m_goal.getDateFrom(), MRole.getDefault()); // logged in role
PreparedStatement pstmt = null;
ResultSet rs = null;
try
{
pstmt = DB.prepareStatement (sql, null);
rs = pstmt.executeQuery ();
while (rs.next ())
{
BigDecimal data = rs.getBigDecimal(1);
Timestamp date = rs.getTimestamp(2);
int id = rs.getInt(3);
BarGraphColumn bgc = new BarGraphColumn(pt, data, id);
bgc.setLabel(date, m_goal.getMeasureDisplay());
list.add(bgc);
}
}
catch (Exception e)
{
log.log (Level.SEVERE, sql, e);
}
finally
{
DB.close(rs, pstmt);
rs = null; pstmt = null;
}
} // Project
// Add last 20
int startValue = 0;
//if (list.size() > 20) //TODO CHECK
// startValue = list.size()-20;
/*
for (int i = startValue; i < list.size(); i++)
add (list.get(i));
*/
for (int i = startValue; i < list.size(); i++){
dataset.addValue(list.get(i).getValue(), list.get(i).getLabel(), list.get(i).getLabel());
}
// create the chart...
final JFreeChart chart = ChartFactory.createBarChart(
measure.getName(), // chart title
m_X_AxisLabel, // domain axis label
m_Y_AxisLabel, // range axis label
dataset, // data
PlotOrientation.VERTICAL, // orientation
false, // include legend
true, // tooltips?
true // URLs?
);
CategoryPlot plot = chart.getCategoryPlot();
//plot.setBackgroundPaint(Color.lightGray); //GraphUtil.getForeground(getBackground())
BarRenderer renderer = (BarRenderer) plot.getRenderer();
chart.getCategoryPlot().setRenderer(renderer);
renderer.setSeriesPaint(0, new Color(92/255f, 178/255f, 232/255f));
renderer.setSeriesPaint(1, new Color(56/255f, 97/255f, 119/255f));
renderer.setSeriesPaint(2, new Color(242/255f, 70/255f, 78/255f));
renderer.setSeriesPaint(3, Color.orange);
renderer.setSeriesPaint(4, new Color(147/255f, 196/255f, 51/255f));
renderer.setSeriesPaint(5, new Color(210/255f, 247/255f, 91/255f));
renderer.setSeriesPaint(6, new Color(129/255f, 235/255f, 249/255f));
renderer.setSeriesPaint(7, new Color(60/255f, 84/255f, 8/255f));
renderer.setSeriesPaint(8, new Color(0.8f, 0.8f, 0.8f));
chartPanel = new ChartPanel(chart);
chartPanel.setSize(getSize());
chartPanel.addChartMouseListener(this);
add(chartPanel,BorderLayout.CENTER);
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 m_X_AxisLabel;
} // getX_AxisLabel
/**
* @param axisLabel The x_AxisLabel to set.
*/
public void setX_AxisLabel (String axisLabel)
{
m_X_AxisLabel = axisLabel;
} // setX_AxisLabel
/**
* @return Returns the y_AxisLabel.
*/
public String getY_AxisLabel ()
{
return m_Y_AxisLabel;
} // getY_AxisLabel
/**
* @param axisLabel The y_AxisLabel to set.
*/
public void setY_AxisLabel (String axisLabel)
{
m_Y_AxisLabel = 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
/**
* Add Column
* @param column column
*/
public void add (BarGraphColumn column)
{
super.add (column, "column");
//column.addActionListener(this);
} // add
/**
* Get BarGraphColumn for ChartEntity
* @param event
* @return BarGraphColumn or null if not found
*/
private BarGraphColumn getBarGraphColumn(ChartMouseEvent event)
{
ChartEntity entity = event.getEntity();
String key = null;
if (entity instanceof CategoryItemEntity)
{
Comparable<?> rowKey = ((CategoryItemEntity)entity).getRowKey();
if (rowKey != null)
{
key = rowKey.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
{
BarGraphColumn bgc = getBarGraphColumn(event);
if (bgc == null)
{
return;
}
log.info(bgc.getName());
MQuery query = null;
if (bgc.getAchievement() != null) // Single Achievement
{
MAchievement a = bgc.getAchievement();
query = MQuery.getEqualQuery("PA_Measure_ID", a.getPA_Measure_ID());
}
else if (bgc.getGoal() != null) // Multiple Achievements
{
MGoal goal = bgc.getGoal();
query = MQuery.getEqualQuery("PA_Measure_ID", goal.getPA_Measure_ID());
}
else if (bgc.getMeasureCalc() != null) // Document
{
MMeasureCalc mc = bgc.getMeasureCalc();
query = mc.getQuery(m_goal.getRestrictions(false),
bgc.getMeasureDisplay(), bgc.getDate(),
MRole.getDefault()); // logged in role
}
else if (bgc.getProjectType() != null) // Document
{
MProjectType pt = bgc.getProjectType();
query = pt.getQuery(m_goal.getRestrictions(false),
bgc.getMeasureDisplay(), bgc.getDate(), bgc.getID(),
MRole.getDefault()); // logged in role
}
else if (bgc.getRequestType() != null) // Document
{
MRequestType rt = bgc.getRequestType();
query = rt.getQuery(m_goal.getRestrictions(false),
bgc.getMeasureDisplay(), bgc.getDate(), bgc.getID(),
MRole.getDefault()); // logged in role
}
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 BarGraphColumn[] getBarGraphColumnList()
{
return list.toArray(new BarGraphColumn[list.size()]);
}
} // BarGraph

View File

@ -1,509 +0,0 @@
/******************************************************************************
* 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.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.geom.AffineTransform;
import java.math.BigDecimal;
import java.sql.Timestamp;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import javax.swing.JComponent;
import javax.swing.SwingUtilities;
import javax.swing.event.EventListenerList;
import org.compiere.model.MAchievement;
import org.compiere.model.MGoal;
import org.compiere.model.MMeasureCalc;
import org.compiere.model.MProjectType;
import org.compiere.model.MRequestType;
import org.compiere.util.CLogger;
import org.compiere.util.DisplayType;
/**
* Bar Graph Column
*
* @author Jorg Janke
* @version $Id: BarGraphColumn.java,v 1.2 2006/07/30 00:51:28 jjanke Exp $
*/
public class BarGraphColumn extends JComponent implements MouseListener
{
/**
*
*/
private static final long serialVersionUID = 8249071636376812900L;
/**
* Base Constructor
* @param label label
* @param value value
*/
public BarGraphColumn (String label, double value)
{
m_label = label;
setValue(value);
addMouseListener(this);
} // BarGraphColumn
/**
* Single Achievement Constructor
* @param achievement achievement
*/
public BarGraphColumn (MAchievement achievement)
{
this (achievement.getName(), achievement.getManualActual().doubleValue());
m_achievement = achievement;
} // BarGraphColumn
/**
* Achievement Goal Constructor
* @param goal goal
* @param data count
*/
public BarGraphColumn (MGoal goal, BigDecimal data)
{
this ("", data == null ? 0 : data.doubleValue());
m_goal = goal;
} // BarGraphColumn
/**
* Measure Calc Constructor
* @param mc MeasureCalc
*/
public BarGraphColumn (MMeasureCalc mc, BigDecimal data)
{
this ("", data == null ? 0 : data.doubleValue());
m_mc = mc;
} // BarGraphColumn
/**
* Request Type Constructor
* @param rt Request Type
*/
public BarGraphColumn (MRequestType rt, BigDecimal data, int id)
{
this ("", data == null ? 0 : data.doubleValue());
m_rt = rt;
m_id = id;
} // BarGraphColumn
/**
* Project Type Constructor
* @param pt Procet Type
*/
public BarGraphColumn (MProjectType pt, BigDecimal data, int id)
{
this ("", data == null ? 0 : data.doubleValue());
m_pt = pt;
m_id = id;
} // BarGraphColumn
/** Optional Achievement */
private MAchievement m_achievement = null;
/** Measure Calc */
private MMeasureCalc m_mc = null;
/** Goal */
private MGoal m_goal = null;
private MRequestType m_rt = null;
private MProjectType m_pt = null;
private int m_id = 0;
/** Display */
private String m_measureDisplay = null;
private Timestamp m_date = null;
/** Column Label */
private String m_label = null;
/** Column Data Value */
private double m_value = 0;
/** Column Label Value */
private String m_labelValue = "";
/** Column Data Target Value */
private double m_targetValue = 0;
/** Column Width in pixles */
private double m_width = 0;
/** Column Height in pixles */
private double m_height = 0;
/** Logger */
private static CLogger log = CLogger.getCLogger (BarGraphColumn.class);
/** Integer Number Format */
private static DecimalFormat s_format = DisplayType.getNumberFormat(DisplayType.Integer);
/**
* Get Achievement Goal
* @return achievement or null
*/
public MGoal getGoal()
{
return m_goal;
} // getGoal
/**
* Get Single Achievement
* @return achievement or null
*/
public MAchievement getAchievement()
{
return m_achievement;
} // getAchievement
/**
* Get MeasureCalc
* @return measure
*/
public MMeasureCalc getMeasureCalc()
{
return m_mc;
} // getMeasureCalc
public MRequestType getRequestType()
{
return m_rt;
}
public MProjectType getProjectType()
{
return m_pt;
}
public String getMeasureDisplay()
{
return m_measureDisplay;
} // getMeasureDisplay
public Timestamp getDate()
{
return m_date;
} // getDate
public int getID()
{
return m_id;
}
/**
* Set Background and matching Foreground
* @param bg background
*/
public void setBackground (Color bg)
{
super.setBackground (bg);
setForeground(GraphUtil.getForeground(bg));
} // setBackground
/**
* @return Returns the label.
*/
public String getLabel ()
{
return m_label;
} // getLabel
/**
* @param label The label to set.
*/
public void setLabel (String label)
{
m_label = label;
if (m_label != null)
m_labelValue = s_format.format(m_value) + " - " + m_label;
else
m_labelValue = s_format.format(m_value);
setToolTipText(m_labelValue);
setName(m_labelValue);
} // setLabel
/**
* @param date for label.
* @param MeasureDisplay measure display
*/
public void setLabel (Timestamp date, String MeasureDisplay)
{
if (date == null)
return;
m_date = date;
m_measureDisplay = MeasureDisplay;
//
SimpleDateFormat format = DisplayType.getDateFormat(DisplayType.Date);
String text = format.format(date);
// Month only
if (MGoal.MEASUREDISPLAY_Month.equals(MeasureDisplay)
|| MGoal.MEASUREDISPLAY_Quarter.equals(MeasureDisplay))
{
String pattern = format.toPattern();
String mmText = text;
int index = pattern.indexOf("dd");
if (index == 0) // dd.MM.yyyy
mmText = text.substring(3);
else if (index > 0) // MM/dd/yyyy
{
mmText = text.substring(0, index-1);
if (text.length() > index+2)
mmText += text.substring(index+2);
}
setLabel(mmText);
}
else // Day
setLabel(text);
} // setLabel
/**
* @return Returns the targetValue.
*/
public double getTargetValue ()
{
return m_targetValue;
} // getTargetValue
/**
* @param targetValue The targetValue to set.
*/
public void setTargetValue (double targetValue)
{
m_targetValue = targetValue;
} // setTargetValue
/**
* @return Returns the data value.
*/
public double getValue ()
{
return m_value;
} // getValue
/**
* @param value The data value to set.
*/
public void setValue (double value)
{
m_value = value;
if (m_label != null)
m_labelValue = s_format.format(m_value) + " - " + m_label;
else
m_labelValue = s_format.format(m_value);
setToolTipText(m_labelValue);
setName(m_labelValue);
} // setValue
/**
* @return Returns the column width in pixles.
*/
public double getColWidth ()
{
return m_width;
} // getColWidth
/**
* @param width The column width in pixles.
*/
public void setColWidth (double width)
{
m_width = width;
if (isPreferredSizeSet())
setPreferredSize(null);
} // getColWidth
/**
* @return Returns the height in pixles.
*/
public double getColHeight()
{
return m_height;
} // getHeight
/**
* @param height The hight in pixles.
*/
public void setColHeight (double height)
{
m_height = height;
if (isPreferredSizeSet())
setPreferredSize(null);
} // setHeight
/**
* Get Maximum Size
* @return size
*/
public Dimension getMaximumSize ()
{
return getPreferredSize();
} // getMaximumSize
/**
* Get Minimum Size
* @return size
*/
public Dimension getMinimumSize ()
{
return getPreferredSize();
} // getMinimumSize
/**
* Get Preferred Size
* @return size
*/
public Dimension getPreferredSize ()
{
if (!isPreferredSizeSet())
{
Dimension size = new Dimension((int)m_width, (int)m_height);
setPreferredSize(size);
}
return super.getPreferredSize ();
} // getPreferredSize
/**
* Paint Component
* @param g graphics
*/
protected void paintComponent (Graphics g)
{
Graphics2D g2D = (Graphics2D)g;
Rectangle bounds = getBounds();
// Background
g2D.setColor(getBackground());
//Dimension size = getPreferredSize();
Dimension size =getSize();
log.fine("bgc: " + size.width + " x " + size.height);
g2D.fill3DRect(0, 0, size.width, size.height, true);
// Paint Label & Value
Color color = getForeground();
g2D.setPaint(color);
//
Font font = getFont();
FontMetrics fm = g2D.getFontMetrics(font);
int fontHeight = fm.getHeight();
AffineTransform transform = AffineTransform.getRotateInstance(Math.PI*3/2);
font = font.deriveFont(transform);
g2D.setFont(font);
//
int x = (int)(size.width/2)+((fontHeight-2)/2);
if (x < fontHeight)
x = fontHeight-2;
int y = (int)(size.height-3);
g2D.drawString(m_labelValue, x, y);
log.finest("x=" + x + ",fontHeight=" + fontHeight + ", y=" + y + " - " + m_labelValue);
// Paint Target
if (m_targetValue != 0)
{
}
} // paintComponent
/**************************************************************************
* 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,
"column"+m_label, 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);
} // mouseClicked
public void mousePressed (MouseEvent e)
{
}
public void mouseReleased (MouseEvent e)
{
}
public void mouseEntered (MouseEvent e)
{
}
public void mouseExited (MouseEvent e)
{
}
} // BarGraphColumn

View File

@ -1,161 +0,0 @@
/******************************************************************************
* 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.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FontMetrics;
import java.awt.LayoutManager;
import java.awt.Point;
import java.util.ArrayList;
import org.compiere.util.CLogger;
/**
* Bar Graph Layout
*
* @author Jorg Janke
* @version $Id: BarGraphLayout.java,v 1.2 2006/07/30 00:51:28 jjanke Exp $
*/
public class BarGraphLayout
implements LayoutManager
{
/**
* Bar Graph Layout
* @param parent parenr
*/
public BarGraphLayout (BarGraph parent)
{
m_parent = parent;
} // BarGraphLayout
/** Parent Container */
private BarGraph m_parent;
/** List of Components */
private ArrayList<BarGraphColumn> m_list = new ArrayList<BarGraphColumn>();
/** Layout Complete */
private boolean m_layoutComplete = false;
/** Gap between columns */
private static int XGAP = 2;
/** Gap to Axix */
private static int YGAP = 1;
/** Logger */
private static CLogger log = CLogger.getCLogger (BarGraphLayout.class);
/**
* Add Layout Component
* @param name name
* @param comp component
*/
public void addLayoutComponent (String name, Component comp)
{
if (comp instanceof BarGraphColumn)
m_list.add((BarGraphColumn)comp);
else
log.severe("Invalid Class: " + comp);
m_layoutComplete = false;
} // addLayoutComponent
/**
* Remove Layout Component
* @param comp component
*/
public void removeLayoutComponent (Component comp)
{
m_list.remove(comp);
m_layoutComplete = false;
} // removeLayoutComponent
/**
* Preferred Layout Size
* @param parent parent
* @return size
*/
public Dimension preferredLayoutSize (Container parent)
{
return parent.getPreferredSize();
} // preferredLayoutSize
/**
* Minimum Layout Size
* @param parent parent
* @return size
*/
public Dimension minimumLayoutSize (Container parent)
{
return parent.getMinimumSize();
} // minimumLayoutSize
/**
* Layout Container
* @param parent
*/
public void layoutContainer (Container parent)
{
if (m_layoutComplete)
return;
// Find Max
double maxValue = 0;
for (int i = 0; i < m_list.size(); i++)
{
BarGraphColumn column = m_list.get(i);
maxValue = Math.max(maxValue, column.getValue());
}
//
//Dimension size = m_parent.getPreferredSize();
Dimension size =m_parent.getSize();
log.fine("bgl: " +size.width + " x " + size.height);
Point point0_0 = m_parent.getPoint0_0();
double graphHeight = size.height - (size.height-point0_0.y) - (2*YGAP);
double graphWidth = size.width - point0_0.x - XGAP;
double columnWidth = (graphWidth - (XGAP*m_list.size())) / m_list.size();
columnWidth = Math.min(30, columnWidth);
FontMetrics fm = m_parent.getFontMetrics(m_parent.getFont());
int fontHeight = fm.getHeight();
columnWidth = Math.max(fontHeight, columnWidth);
log.fine("Height=" + graphHeight + ", MaxValue=" + maxValue
+ ", Width=" + graphWidth + ", ColumnWidth=" + columnWidth);
int x = point0_0.x + (2*XGAP);
// Set Values
for (int i = 0; i < m_list.size(); i++)
{
BarGraphColumn column = m_list.get(i);
double multiplier = column.getValue() / maxValue;
double height = graphHeight * multiplier;
column.setColHeight(height);
column.setColWidth(columnWidth);
Dimension ps = column.getPreferredSize();
column.setBackground(GraphUtil.getBackground(i));
//
int y = point0_0.y - ps.height - YGAP;
column.setLocation(x, y);
column.setBounds(x, y, ps.width, ps.height);
x += ps.width + XGAP;
log.finer(i + " - " + ((int)(multiplier*100)) + "% - " + column.getBounds());
}
m_layoutComplete = true;
} // layoutContainer
} // BarGraphLayout

View File

@ -0,0 +1,312 @@
/******************************************************************************
* 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 Coordibate 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

View File

@ -0,0 +1,265 @@
/******************************************************************************
* Copyright (C) 2009 Low Heng Sin *
* Copyright (C) 2009 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.apps.graph;
import java.awt.Color;
import java.util.ArrayList;
import java.util.Calendar;
import org.compiere.model.MGoal;
import org.compiere.model.MMeasure;
import org.compiere.model.X_PA_Goal;
import org.compiere.util.CLogger;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.CategoryItemRenderer;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.data.general.DefaultPieDataset;
/**
*
* @author hengsin
*
*/
public class GraphBuilder {
/** The Goal */
protected MGoal m_goal = null;
/** X Axis Label */
protected String m_X_AxisLabel = "X Axis";
/** Y Axis Label */
protected String m_Y_AxisLabel = "Y Axis";
protected DefaultCategoryDataset dataset = new DefaultCategoryDataset();
protected DefaultCategoryDataset linearDataset = new DefaultCategoryDataset();
protected DefaultPieDataset pieDataset = new DefaultPieDataset();
private static final CLogger log = CLogger.getCLogger(GraphBuilder.class);
public GraphBuilder() {
super();
}
/**
*
* @param type
* @return JFreeChart
*/
public JFreeChart createChart(String type) {
if(X_PA_Goal.CHARTTYPE_BarChart.equals(type))
{
return createBarChart();
}
else if (X_PA_Goal.CHARTTYPE_PieChart.equals(type))
{
return createPieChart();
}
else if (X_PA_Goal.CHARTTYPE_AreaChart.equals(type))
{
return createAreaChart();
}
else if (X_PA_Goal.CHARTTYPE_LineChart.equals(type))
{
return createLineChart();
}
else if (X_PA_Goal.CHARTTYPE_RingChart.equals(type))
{
return createRingChart();
}
else if (X_PA_Goal.CHARTTYPE_WaterfallChart.equals(type))
{
return createWaterfallChart();
}
else
{
throw new IllegalArgumentException("unknown chart type=" + type);
}
}
private JFreeChart createWaterfallChart() {
JFreeChart chart = ChartFactory.createWaterfallChart(
m_goal.getMeasure().getName(), // chart title
m_X_AxisLabel, // domain axis label
m_Y_AxisLabel, // range axis label
linearDataset, // data
PlotOrientation.VERTICAL, // orientation
false, // include legend
true, // tooltips?
true // URLs?
);
setupCategoryChart(chart);
return chart;
}
private JFreeChart createRingChart() {
final JFreeChart chart = ChartFactory.createRingChart(m_goal.getMeasure().getName(),
pieDataset, false, true, true);
return chart;
}
private JFreeChart createBarChart() {
JFreeChart chart = ChartFactory.createBarChart3D(
m_goal.getMeasure().getName(), // chart title
m_X_AxisLabel, // domain axis label
m_Y_AxisLabel, // range axis label
dataset, // data
PlotOrientation.VERTICAL, // orientation
false, // include legend
true, // tooltips?
true // URLs?
);
setupCategoryChart(chart);
return chart;
}
private JFreeChart createPieChart() {
final JFreeChart chart = ChartFactory.createPieChart3D(m_goal.getMeasure().getName(),
pieDataset, false, true, true);
return chart;
}
private JFreeChart createAreaChart() {
// create the chart...
JFreeChart chart = ChartFactory.createAreaChart(
m_goal.getMeasure().getName(), // chart title
m_X_AxisLabel, // domain axis label
m_Y_AxisLabel, // range axis label
dataset, // data
PlotOrientation.VERTICAL, // orientation
false, // include legend
true, // tooltips?
true // URLs?
);
setupCategoryChart(chart);
return chart;
}
private void setupCategoryChart(JFreeChart chart) {
CategoryPlot plot = chart.getCategoryPlot();
CategoryItemRenderer renderer = plot.getRenderer();
renderer.setSeriesPaint(0, new Color(92/255f, 178/255f, 232/255f));
renderer.setSeriesPaint(1, new Color(56/255f, 97/255f, 119/255f));
renderer.setSeriesPaint(2, new Color(242/255f, 70/255f, 78/255f));
renderer.setSeriesPaint(3, Color.orange);
renderer.setSeriesPaint(4, new Color(147/255f, 196/255f, 51/255f));
renderer.setSeriesPaint(5, new Color(210/255f, 247/255f, 91/255f));
renderer.setSeriesPaint(6, new Color(129/255f, 235/255f, 249/255f));
renderer.setSeriesPaint(7, new Color(60/255f, 84/255f, 8/255f));
renderer.setSeriesPaint(8, new Color(0.8f, 0.8f, 0.8f));
}
private JFreeChart createLineChart() {
// create the chart...
JFreeChart chart = ChartFactory.createLineChart3D(
m_goal.getMeasure().getName(), // chart title
m_X_AxisLabel, // domain axis label
m_Y_AxisLabel, // range axis label
linearDataset, // data
PlotOrientation.VERTICAL, // orientation
false, // include legend
true, // tooltips?
true // URLs?
);
setupCategoryChart(chart);
return chart;
}
/**
*
* @return MGoal
*/
public MGoal getMGoal() {
return m_goal;
}
/**
*
* @param mgoal
*/
public void setMGoal(MGoal mgoal) {
m_goal = mgoal;
}
/**
*
* @return X axis label
*/
public String getXAxisLabel() {
return m_X_AxisLabel;
}
/**
*
* @param axisLabel
*/
public void setXAxisLabel(String axisLabel) {
m_X_AxisLabel = axisLabel;
}
/**
*
* @return Y axis label
*/
public String getYAxisLabel() {
return m_Y_AxisLabel;
}
/**
*
* @param axisLabel
*/
public void setYAxisLabel(String axisLabel) {
m_Y_AxisLabel = axisLabel;
}
/**
*
* @return graph column list
*/
public ArrayList<GraphColumn> loadData() {
// Calculated
MMeasure measure = getMGoal().getMeasure();
if (measure == null)
{
log.warning("No Measure for " + getMGoal());
return null;
}
ArrayList<GraphColumn>list = measure.getGraphColumnList(getMGoal());
pieDataset = new DefaultPieDataset();
dataset = new DefaultCategoryDataset();
for (int i = 0; i < list.size(); i++){
String series = m_X_AxisLabel;
if (list.get(i).getDate() != null) {
Calendar cal = Calendar.getInstance();
cal.setTime(list.get(i).getDate());
series = Integer.toString(cal.get(Calendar.YEAR));
}
dataset.addValue(list.get(i).getValue(), series,
list.get(i).getLabel());
linearDataset.addValue(list.get(i).getValue(), m_X_AxisLabel,
list.get(i).getLabel());
pieDataset.setValue(list.get(i).getLabel(), list.get(i).getValue());
}
return list;
}
}

View File

@ -0,0 +1,347 @@
/******************************************************************************
* Copyright (C) 2009 Low Heng Sin *
* Copyright (C) 2009 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.apps.graph;
import java.math.BigDecimal;
import java.sql.Timestamp;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import org.compiere.model.MAchievement;
import org.compiere.model.MGoal;
import org.compiere.model.MMeasureCalc;
import org.compiere.model.MProjectType;
import org.compiere.model.MQuery;
import org.compiere.model.MRequestType;
import org.compiere.model.MRole;
import org.compiere.util.CLogger;
import org.compiere.util.DisplayType;
/**
*
* @author hengsin
*
*/
public class GraphColumn
{
/**
* Base Constructor
* @param label label
* @param value value
*/
public GraphColumn (String label, double value)
{
m_label = label;
setValue(value);
} // BarGraphColumn
/**
* Single Achievement Constructor
* @param achievement achievement
*/
public GraphColumn (MAchievement achievement)
{
this (achievement.getName(), achievement.getManualActual().doubleValue());
m_achievement = achievement;
} // GraphColumn
/**
* Achievement Goal Constructor
* @param goal goal
* @param data count
*/
public GraphColumn (MGoal goal, BigDecimal data)
{
this ("", data == null ? 0 : data.doubleValue());
m_goal = goal;
} // GraphColumn
/**
* Measure Calc Constructor
* @param mc MeasureCalc
*/
public GraphColumn (MMeasureCalc mc, BigDecimal data)
{
this ("", data == null ? 0 : data.doubleValue());
m_mc = mc;
} // GraphColumn
/**
* Request Type Constructor
* @param rt Request Type
*/
public GraphColumn (MRequestType rt, BigDecimal data, int id)
{
this ("", data == null ? 0 : data.doubleValue());
m_rt = rt;
m_id = id;
} // GraphColumn
/**
* Project Type Constructor
* @param pt Procet Type
*/
public GraphColumn (MProjectType pt, BigDecimal data, int id)
{
this ("", data == null ? 0 : data.doubleValue());
m_pt = pt;
m_id = id;
} // BarGraphColumn
/** Optional Achievement */
private MAchievement m_achievement = null;
/** Measure Calc */
private MMeasureCalc m_mc = null;
/** Goal */
private MGoal m_goal = null;
private MRequestType m_rt = null;
private MProjectType m_pt = null;
private int m_id = 0;
/** Display */
private String m_measureDisplay = null;
private Timestamp m_date = null;
/** Column Label */
private String m_label = null;
/** Column Data Value */
private double m_value = 0;
/** Column Label Value */
private String m_labelValue = "";
/** Column Data Target Value */
private double m_targetValue = 0;
/** Column Width in pixles */
private double m_width = 0;
/** Column Height in pixles */
private double m_height = 0;
/** Logger */
private static CLogger log = CLogger.getCLogger (GraphColumn.class);
/** Integer Number Format */
private static DecimalFormat s_format = DisplayType.getNumberFormat(DisplayType.Integer);
/**
* Get Achievement Goal
* @return achievement or null
*/
public MGoal getGoal()
{
return m_goal;
} // getGoal
/**
* Get Single Achievement
* @return achievement or null
*/
public MAchievement getAchievement()
{
return m_achievement;
} // getAchievement
/**
* Get MeasureCalc
* @return measure
*/
public MMeasureCalc getMeasureCalc()
{
return m_mc;
} // getMeasureCalc
public MRequestType getRequestType()
{
return m_rt;
}
public MProjectType getProjectType()
{
return m_pt;
}
public String getMeasureDisplay()
{
return m_measureDisplay;
} // getMeasureDisplay
public Timestamp getDate()
{
return m_date;
} // getDate
public int getID()
{
return m_id;
}
/**
* @return Returns the label.
*/
public String getLabel ()
{
return m_label;
} // getLabel
/**
* @param label The label to set.
*/
public void setLabel (String label)
{
m_label = label;
if (m_label != null)
m_labelValue = s_format.format(m_value) + " - " + m_label;
else
m_labelValue = s_format.format(m_value);
} // setLabel
/**
* @param date for label.
* @param MeasureDisplay measure display
*/
public void setLabel (Timestamp date, String MeasureDisplay)
{
if (date == null)
return;
m_date = date;
m_measureDisplay = MeasureDisplay;
//
SimpleDateFormat format = DisplayType.getDateFormat(DisplayType.Date);
String text = format.format(date);
// Month only
if (MGoal.MEASUREDISPLAY_Month.equals(MeasureDisplay)
|| MGoal.MEASUREDISPLAY_Quarter.equals(MeasureDisplay))
{
String pattern = format.toPattern();
String mmText = text;
int index = pattern.indexOf("dd");
if (index == 0) // dd.MM.yyyy
mmText = text.substring(3);
else if (index > 0) // MM/dd/yyyy
{
mmText = text.substring(0, index-1);
if (text.length() > index+2)
mmText += text.substring(index+2);
}
setLabel(mmText);
}
else // Day
setLabel(text);
} // setLabel
/**
* @return Returns the targetValue.
*/
public double getTargetValue ()
{
return m_targetValue;
} // getTargetValue
/**
* @param targetValue The targetValue to set.
*/
public void setTargetValue (double targetValue)
{
m_targetValue = targetValue;
} // setTargetValue
/**
* @return Returns the data value.
*/
public double getValue ()
{
return m_value;
} // getValue
/**
* @param value The data value to set.
*/
public void setValue (double value)
{
m_value = value;
if (m_label != null)
m_labelValue = s_format.format(m_value) + " - " + m_label;
else
m_labelValue = s_format.format(m_value);
} // setValue
/**
* @return Returns the column width in pixles.
*/
public double getColWidth ()
{
return m_width;
} // getColWidth
/**
* @param width The column width in pixles.
*/
public void setColWidth (double width)
{
m_width = width;
} // getColWidth
/**
* @return Returns the height in pixles.
*/
public double getColHeight()
{
return m_height;
} // getHeight
/**
* @param height The hight in pixles.
*/
public void setColHeight (double height)
{
m_height = height;
} // setHeight
public MQuery getMQuery(MGoal mGoal)
{
MQuery query = null;
if (getAchievement() != null) // Single Achievement
{
MAchievement a = getAchievement();
query = MQuery.getEqualQuery("PA_Measure_ID", a.getPA_Measure_ID());
}
else if (getGoal() != null) // Multiple Achievements
{
MGoal goal = getGoal();
query = MQuery.getEqualQuery("PA_Measure_ID", goal.getPA_Measure_ID());
}
else if (getMeasureCalc() != null) // Document
{
MMeasureCalc mc = getMeasureCalc();
query = mc.getQuery(mGoal.getRestrictions(false),
getMeasureDisplay(), getDate(),
MRole.getDefault()); // logged in role
}
else if (getProjectType() != null) // Document
{
MProjectType pt = getProjectType();
query = pt.getQuery(mGoal.getRestrictions(false),
getMeasureDisplay(), getDate(), getID(),
MRole.getDefault()); // logged in role
}
else if (getRequestType() != null) // Document
{
MRequestType rt = getRequestType();
query = rt.getQuery(mGoal.getRestrictions(false),
getMeasureDisplay(), getDate(), getID(),
MRole.getDefault()); // logged in role
}
return query;
}
}

View File

@ -207,12 +207,12 @@ public class HtmlDashboard extends JPanel implements MouseListener,
output += "<tr><td class=\"label\">Target</td><td colspan=\"2\" class=\"tdcontent\">" + m_goals[i].getMeasureTarget() + "</td></tr>\n";
output += "<tr><td class=\"label\">Actual</td><td colspan=\"2\" class=\"tdcontent\">" + m_goals[i].getMeasureActual() + "</td></tr>\n";
//if (mc.getTableName()!=null) output += "table: " + mc.getAD_Table_ID() + "<br>\n";
BarGraph barPanel = new BarGraph(m_goals[i]);
BarGraphColumn[] bList = barPanel.getBarGraphColumnList();
Graph barPanel = new Graph(m_goals[i]);
GraphColumn[] bList = barPanel.getGraphColumnList();
MQuery query = null;
output += "<tr><td rowspan=\"" + bList.length + "\" class=\"label\" valign=\"top\">" + m_goals[i].getXAxisText() + "</td>\n";
for (int k=0; k<bList.length; k++) {
BarGraphColumn bgc = bList[k];
GraphColumn bgc = bList[k];
if (k>0) output += "<tr>";
if (bgc.getAchievement() != null) // Single Achievement
{

View File

@ -142,7 +142,7 @@ public class PAPanel extends CPanel implements ActionListener
for (int i = 0; i < java.lang.Math.min(2, m_goals.length); i++)
{
if (m_goals[i].getMeasure() != null) //MGoal goal = pi.getGoal();
boxH1.add ( new BarGraph(m_goals[i]), BorderLayout.SOUTH);
boxH1.add ( new Graph(m_goals[i]), BorderLayout.SOUTH);
}
boxV2.add(boxH1, BorderLayout.SOUTH);

View File

@ -40,7 +40,7 @@ public class PerformanceDetail extends CFrame
/**
*
*/
private static final long serialVersionUID = 806635848484287844L;
private static final long serialVersionUID = -5994488373513922522L;
/**
* Constructor.
@ -51,12 +51,12 @@ public class PerformanceDetail extends CFrame
{
super (goal.getName());
setIconImage(Adempiere.getImage16());
barPanel = new BarGraph(goal);
barPanel = new Graph(goal, true);
init();
AEnv.showCenterScreen(this);
} // PerformanceDetail
BarGraph barPanel = null;
Graph barPanel = null;
ConfirmPanel confirmPanel = new ConfirmPanel();
/**

View File

@ -1,514 +0,0 @@
/******************************************************************************
* 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.Color;
import java.awt.Point;
import java.awt.image.BufferedImage;
import java.math.BigDecimal;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.logging.Level;
import org.adempiere.apps.graph.BarGraphColumn;
import org.adempiere.webui.apps.AEnv;
import org.adempiere.webui.component.Panel;
import org.compiere.model.MAchievement;
import org.compiere.model.MGoal;
import org.compiere.model.MMeasure;
import org.compiere.model.MMeasureCalc;
import org.compiere.model.MProjectType;
import org.compiere.model.MQuery;
import org.compiere.model.MRequestType;
import org.compiere.model.MRole;
import org.compiere.model.MStatus;
import org.compiere.util.CLogger;
import org.compiere.util.DB;
import org.compiere.util.Env;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartMouseEvent;
import org.jfree.chart.ChartRenderingInfo;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.encoders.EncoderUtil;
import org.jfree.chart.encoders.ImageFormat;
import org.jfree.chart.entity.ChartEntity;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.BarRenderer;
import org.jfree.data.category.DefaultCategoryDataset;
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.zk.ui.event.MouseEvent;
import org.zkoss.zul.Area;
import org.zkoss.zul.Imagemap;
/**
* Bar Graph
*
* @author hengsin
*/
public class WBarGraph extends Panel
{
/**
*
*/
private static final long serialVersionUID = -975989183542113080L;
/**
* Constructor
*/
public WBarGraph()
{
super();
} // BarGraph
/**
* Constructor
* @param goal goal
*/
public WBarGraph(MGoal goal)
{
this();
m_goal = goal;
m_Y_AxisLabel = goal.getName();
m_X_AxisLabel = goal.getXAxisText();
loadData();
} // BarGraph
/** The Goal */
private MGoal m_goal = null;
/** Zero/Zero Coordibate point */
private Point m_point0_0 = null;
/** Logger */
private static CLogger log = CLogger.getCLogger (WBarGraph.class);
/** X Axis Label */
private String m_X_AxisLabel = "X Axis";
/** Y Axis Label */
private String m_Y_AxisLabel = "Y Axis";
/** Y Axis Target Line Label */
private String m_Y_TargetLabel = null;
final DefaultCategoryDataset dataset = new DefaultCategoryDataset();
/**
* Load Performance Data
*/
ArrayList<BarGraphColumn> list = new ArrayList<BarGraphColumn>();
private void loadData()
{
// Calculated
MMeasure measure = m_goal.getMeasure();
if (measure == null)
{
log.warning("No Measure for " + m_goal);
return;
}
if (MMeasure.MEASURETYPE_Calculated.equals(measure.getMeasureType()))
{
MMeasureCalc mc = MMeasureCalc.get(Env.getCtx(), measure.getPA_MeasureCalc_ID());
String sql = mc.getSqlBarChart(m_goal.getRestrictions(false),
m_goal.getMeasureDisplay(), null,
MRole.getDefault()); // logged in role
PreparedStatement pstmt = null;
ResultSet rs = null;
try
{
pstmt = DB.prepareStatement (sql, null);
rs = pstmt.executeQuery ();
ArrayList<Timestamp> dataList = new ArrayList<Timestamp>();
while (rs.next ())
{
BigDecimal data = rs.getBigDecimal(1);
Timestamp date = rs.getTimestamp(2);
BarGraphColumn bgc = new BarGraphColumn(mc, data);
bgc.setLabel(date, m_goal.getMeasureDisplay()); //TODO copy order-loop to other measures
int pos=0;
for (int i = 0; i < dataList.size(); i++)
if (dataList.get(i).before(date)) pos++;
dataList.add(date); // list of dates
list.add(pos, bgc);
}
}
catch (Exception e)
{
log.log (Level.SEVERE, sql, e);
}
finally
{
DB.close(rs, pstmt);
rs = null; pstmt = null;
}
}
else if (MMeasure.MEASURETYPE_Achievements.equals(measure.getMeasureType()))
{
if (MMeasure.MEASUREDATATYPE_StatusQtyAmount.equals(measure.getMeasureDataType()))
{
MAchievement[] achievements = MAchievement.get(measure);
for (int i = 0; i < achievements.length; i++)
{
MAchievement achievement = achievements[i];
BarGraphColumn bgc = new BarGraphColumn(achievement);
list.add(bgc);
}
}
else // MMeasure.MEASUREDATATYPE_QtyAmountInTime
{
String MeasureDisplay = m_goal.getMeasureDisplay();
String trunc = "D";
if (MGoal.MEASUREDISPLAY_Year.equals(MeasureDisplay))
trunc = "Y";
else if (MGoal.MEASUREDISPLAY_Quarter.equals(MeasureDisplay))
trunc = "Q";
else if (MGoal.MEASUREDISPLAY_Month.equals(MeasureDisplay))
trunc = "MM";
else if (MGoal.MEASUREDISPLAY_Week.equals(MeasureDisplay))
trunc = "W";
// else if (MGoal.MEASUREDISPLAY_Day.equals(MeasureDisplay))
// trunc = "D";
trunc = "TRUNC(DateDoc,'" + trunc + "')";
StringBuffer sql = new StringBuffer ("SELECT SUM(ManualActual), ")
.append(trunc).append(" FROM PA_Achievement WHERE PA_Measure_ID=? AND IsAchieved='Y' ")
.append("GROUP BY ").append(trunc)
.append(" ORDER BY ").append(trunc);
PreparedStatement pstmt = null;
ResultSet rs = null;
try
{
pstmt = DB.prepareStatement (sql.toString(), null);
pstmt.setInt(1, measure.getPA_Measure_ID());
rs = pstmt.executeQuery ();
while (rs.next ())
{
BigDecimal data = rs.getBigDecimal(1);
Timestamp date = rs.getTimestamp(2);
BarGraphColumn bgc = new BarGraphColumn(m_goal, data);
bgc.setLabel(date, m_goal.getMeasureDisplay());
list.add(bgc);
}
}
catch (Exception e)
{
log.log (Level.SEVERE, sql.toString(), e);
}
finally
{
DB.close(rs, pstmt);
rs = null; pstmt = null;
}
} // Achievement in time
} // Achievement
// Request
else if (MMeasure.MEASURETYPE_Request.equals(measure.getMeasureType()))
{
MRequestType rt = MRequestType.get(Env.getCtx(), measure.getR_RequestType_ID());
String sql = rt.getSqlBarChart(m_goal.getRestrictions(false),
m_goal.getMeasureDisplay(), measure.getMeasureDataType(),
null, MRole.getDefault()); // logged in role
PreparedStatement pstmt = null;
ResultSet rs = null;
try
{
pstmt = DB.prepareStatement (sql, null);
rs = pstmt.executeQuery ();
while (rs.next ())
{
BigDecimal data = rs.getBigDecimal(1);
int R_Status_ID = rs.getInt(3);
BarGraphColumn bgc = new BarGraphColumn(rt, data, R_Status_ID);
if (R_Status_ID == 0)
{
Timestamp date = rs.getTimestamp(2);
bgc.setLabel(date, m_goal.getMeasureDisplay());
}
else
{
MStatus status = MStatus.get(Env.getCtx(), R_Status_ID);
bgc.setLabel(status.getName());
}
list.add(bgc);
}
}
catch (Exception e)
{
log.log (Level.SEVERE, sql, e);
}
finally
{
DB.close(rs, pstmt);
rs = null; pstmt = null;
}
} // Request
// Project
else if (MMeasure.MEASURETYPE_Project.equals(measure.getMeasureType()))
{
MProjectType pt = MProjectType.get(Env.getCtx(), measure.getC_ProjectType_ID());
String sql = pt.getSqlBarChart(m_goal.getRestrictions(false),
m_goal.getMeasureDisplay(), measure.getMeasureDataType(),
null, MRole.getDefault()); // logged in role
PreparedStatement pstmt = null;
ResultSet rs = null;
try
{
pstmt = DB.prepareStatement (sql, null);
rs = pstmt.executeQuery ();
while (rs.next ())
{
BigDecimal data = rs.getBigDecimal(1);
Timestamp date = rs.getTimestamp(2);
int id = rs.getInt(3);
BarGraphColumn bgc = new BarGraphColumn(pt, data, id);
bgc.setLabel(date, m_goal.getMeasureDisplay());
list.add(bgc);
}
}
catch (Exception e)
{
log.log (Level.SEVERE, sql, e);
}
finally
{
DB.close(rs, pstmt);
rs = null; pstmt = null;
}
} // Project
// Add last 20
int startValue = 0;
for (int i = startValue; i < list.size(); i++){
dataset.addValue(list.get(i).getValue(), list.get(i).getLabel(), list.get(i).getLabel());
}
// create the chart...
final JFreeChart chart = ChartFactory.createBarChart(
measure.getName(), // chart title
m_X_AxisLabel, // domain axis label
m_Y_AxisLabel, // range axis label
dataset, // data
PlotOrientation.VERTICAL, // orientation
false, // include legend
true, // tooltips?
true // URLs?
);
CategoryPlot plot = chart.getCategoryPlot();
//plot.setBackgroundPaint(Color.lightGray); //GraphUtil.getForeground(getBackground())
BarRenderer renderer = (BarRenderer) plot.getRenderer();
chart.getCategoryPlot().setRenderer(renderer);
renderer.setSeriesPaint(0, new Color(92/255f, 178/255f, 232/255f));
renderer.setSeriesPaint(1, new Color(56/255f, 97/255f, 119/255f));
renderer.setSeriesPaint(2, new Color(242/255f, 70/255f, 78/255f));
renderer.setSeriesPaint(3, Color.orange);
renderer.setSeriesPaint(4, new Color(147/255f, 196/255f, 51/255f));
renderer.setSeriesPaint(5, new Color(210/255f, 247/255f, 91/255f));
renderer.setSeriesPaint(6, new Color(129/255f, 235/255f, 249/255f));
renderer.setSeriesPaint(7, new Color(60/255f, 84/255f, 8/255f));
renderer.setSeriesPaint(8, new Color(0.8f, 0.8f, 0.8f));
ChartRenderingInfo info = new ChartRenderingInfo();
BufferedImage bi = chart.createBufferedImage(700, 500, BufferedImage.TRANSLUCENT, info);
try {
byte[] bytes = EncoderUtil.encode(bi, ImageFormat.PNG, true);
AImage image = new AImage("", bytes);
Imagemap myImage = new Imagemap();
myImage.setContent(image);
appendChild(myImage);
int count = 0;
for(Iterator<?> it = info.getEntityCollection().getEntities().iterator(); it.hasNext(); )
{
ChartEntity ce = ( ChartEntity ) it.next();
String tooltip = ce.getToolTipText();
if(tooltip == null) continue;
Area area = new Area();
myImage.appendChild(area);
area.setCoords(ce.getShapeCoords());
area.setShape(ce.getShapeType());
area.setTooltiptext(tooltip);
area.setId("WBG_"+tooltip);
count++;
}
myImage.addEventListener(Events.ON_CLICK, new EventListener()
{
public void onEvent(Event event) throws Exception
{
MouseEvent me = (MouseEvent) event;
String areaId = me.getArea();
if(areaId != null)
{
for(int i = 0; i < list.size(); i++)
{
String s = "WBG_(" + list.get(i).getLabel() + ", " + list.get(i).getLabel() + ") = ";
if(areaId.startsWith(s))
{
chartMouseClicked(i);
return;
}
}
}
}
});
}
catch (Exception e) {
log.log (Level.SEVERE, "", e);
}
} // loadData
/**
* 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 m_X_AxisLabel;
} // getX_AxisLabel
/**
* @param axisLabel The x_AxisLabel to set.
*/
public void setX_AxisLabel (String axisLabel)
{
m_X_AxisLabel = axisLabel;
} // setX_AxisLabel
/**
* @return Returns the y_AxisLabel.
*/
public String getY_AxisLabel ()
{
return m_Y_AxisLabel;
} // getY_AxisLabel
/**
* @param axisLabel The y_AxisLabel to set.
*/
public void setY_AxisLabel (String axisLabel)
{
m_Y_AxisLabel = 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
/**
* Add Column
* @param column column
*/
public void add (BarGraphColumn column)
{
// super.add (column, "column");
//column.addActionListener(this);
} // add
/**************************************************************************
* Paint Component
* @param g graphics
*/
public void chartMouseClicked(int index)
{
BarGraphColumn bgc = list.get(index);
if (null == bgc)
return;
log.info(bgc.getName());
MQuery query = null;
if (bgc.getAchievement() != null) // Single Achievement
{
MAchievement a = bgc.getAchievement();
query = MQuery.getEqualQuery("PA_Measure_ID", a.getPA_Measure_ID());
}
else if (bgc.getGoal() != null) // Multiple Achievements
{
MGoal goal = bgc.getGoal();
query = MQuery.getEqualQuery("PA_Measure_ID", goal
.getPA_Measure_ID());
}
else if (bgc.getMeasureCalc() != null) // Document
{
MMeasureCalc mc = bgc.getMeasureCalc();
query = mc.getQuery(m_goal.getRestrictions(false), bgc
.getMeasureDisplay(), bgc.getDate(), MRole.getDefault()); // logged
// in
// role
}
else if (bgc.getProjectType() != null) // Document
{
MProjectType pt = bgc.getProjectType();
query = pt.getQuery(m_goal.getRestrictions(false), bgc
.getMeasureDisplay(), bgc.getDate(), bgc.getID(), MRole
.getDefault()); // logged in role
}
else if (bgc.getRequestType() != null) // Document
{
MRequestType rt = bgc.getRequestType();
query = rt.getQuery(m_goal.getRestrictions(false), bgc
.getMeasureDisplay(), bgc.getDate(), bgc.getID(), MRole
.getDefault()); // logged in role
}
if (query != null)
AEnv.zoom(query);
else
log.warning("Nothing to zoom to - " + bgc);
}
public void chartMouseMoved(ChartMouseEvent event) {}
public BarGraphColumn[] getBarGraphColumnList()
{
BarGraphColumn[] array = new BarGraphColumn[list.size()];
for (int i = 0; i < list.size(); i++){
array[i] = list.get(i);
}
return array;
}
} // BarGraph

View File

@ -0,0 +1,471 @@
/******************************************************************************
* 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.Point;
import java.awt.image.BufferedImage;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.logging.Level;
import org.adempiere.apps.graph.GraphBuilder;
import org.adempiere.apps.graph.GraphColumn;
import org.adempiere.webui.apps.AEnv;
import org.adempiere.webui.editor.WTableDirEditor;
import org.adempiere.webui.event.ValueChangeEvent;
import org.adempiere.webui.event.ValueChangeListener;
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.util.CLogger;
import org.compiere.util.DB;
import org.compiere.util.Env;
import org.jfree.chart.ChartMouseEvent;
import org.jfree.chart.ChartRenderingInfo;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.encoders.EncoderUtil;
import org.jfree.chart.encoders.ImageFormat;
import org.jfree.chart.entity.CategoryItemEntity;
import org.jfree.chart.entity.ChartEntity;
import org.jfree.chart.entity.PieSectionEntity;
import org.zkoss.image.AImage;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.IdSpace;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zk.ui.event.Events;
import org.zkoss.zk.ui.event.MouseEvent;
import org.zkoss.zkex.zul.Borderlayout;
import org.zkoss.zkex.zul.Center;
import org.zkoss.zkex.zul.East;
import org.zkoss.zkex.zul.West;
import org.zkoss.zul.Area;
import org.zkoss.zul.Button;
import org.zkoss.zul.Div;
import org.zkoss.zul.Hbox;
import org.zkoss.zul.Html;
import org.zkoss.zul.Imagemap;
import org.zkoss.zul.Panel;
import org.zkoss.zul.Panelchildren;
import org.zkoss.zul.Toolbar;
/**
* Bar Graph
*
* @author hengsin
*/
public class WGraph extends Div implements IdSpace
{
/**
*
*/
private static final long serialVersionUID = -975989183542113080L;
private static final String ZOOM_KEY = "queryZoom";
private boolean m_hideTitle;
private Panel panel;
private boolean m_showDetail;
/**
* Constructor
*/
public WGraph()
{
super();
builder = new GraphBuilder();
} // BarGraph
/**
* Constructor
* @param goal goal
*/
public WGraph(MGoal goal)
{
this(goal, 0, false, false, false);
}
/**
* Constructor
* @param goal goal
*/
public WGraph(MGoal goal, int zoom, boolean userSelection, boolean hideTitle, boolean showDetail)
{
this();
builder.setMGoal(goal);
builder.setYAxisLabel(goal.getName());
builder.setXAxisLabel(goal.getXAxisText());
m_userSelection = userSelection;
zoomFactor = zoom;
m_hideTitle = hideTitle;
m_showDetail = showDetail;
panel = new Panel();
Borderlayout layout = new Borderlayout();
if (m_showDetail)
{
layout = new Borderlayout();
appendChild(layout);
layout.setStyle("height: 100%; width: 100%; position: absolute;");
Center center = new Center();
layout.appendChild(center);
center.appendChild(panel);
}
else
{
appendChild(panel);
}
loadData();
if (m_showDetail)
{
Html html = new Html();
html.setContent(renderGoal());
East east = new East();
layout.appendChild(east);
east.appendChild(html);
}
} // BarGraph
/** Zero/Zero Coordibate point */
private Point m_point0_0 = null;
/** Logger */
private static CLogger log = CLogger.getCLogger (WGraph.class);
/** Y Axis Target Line Label */
private String m_Y_TargetLabel = null;
/**
* Load Performance Data
*/
ArrayList<GraphColumn> list = new ArrayList<GraphColumn>();
private GraphBuilder builder;
private boolean m_userSelection;
private int zoomFactor = 0;
private void loadData()
{
list = builder.loadData();
if (m_userSelection)
{
Toolbar toolbar = new Toolbar();
panel.appendChild(toolbar);
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);
WTableDirEditor editor = new WTableDirEditor("ChartType", false, false, true, mLookup);
toolbar.appendChild(editor.getComponent());
editor.addValueChangeListener(new ValueChangeListener() {
public void valueChange(ValueChangeEvent evt) {
Object value = evt.getNewValue();
if (value == null || value.toString().trim().length() == 0) return;
JFreeChart chart = null;
chart = builder.createChart(value.toString());
if (chart != null)
render(chart);
}
});
}
JFreeChart chart = builder.createChart(builder.getMGoal().getChartType());
render(chart);
} // loadData
private void render(JFreeChart chart) {
ChartRenderingInfo info = new ChartRenderingInfo();
int width = 560;
int height = 400;
if (zoomFactor > 0)
{
width = width * zoomFactor / 100;
height = height * zoomFactor / 100;
}
if (m_hideTitle)
{
chart.setTitle("");
}
BufferedImage bi = chart.createBufferedImage(width, height, BufferedImage.TRANSLUCENT, info);
try {
byte[] bytes = EncoderUtil.encode(bi, ImageFormat.PNG, true);
AImage image = new AImage("", bytes);
Imagemap myImage = new Imagemap();
myImage.setContent(image);
if (panel.getPanelchildren() != null) {
panel.getPanelchildren().getChildren().clear();
panel.getPanelchildren().appendChild(myImage);
} else {
Panelchildren pc = new Panelchildren();
panel.appendChild(pc);
pc.appendChild(myImage);
}
int count = 0;
for(Iterator<?> it = info.getEntityCollection().getEntities().iterator(); it.hasNext(); )
{
ChartEntity entity = ( ChartEntity ) it.next();
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)
{
continue;
}
Area area = new Area();
myImage.appendChild(area);
area.setCoords(entity.getShapeCoords());
area.setShape(entity.getShapeType());
area.setTooltiptext(entity.getToolTipText());
area.setId("WG_"+key);
count++;
}
myImage.addEventListener(Events.ON_CLICK, new EventListener()
{
public void onEvent(Event event) throws Exception
{
MouseEvent me = (MouseEvent) event;
String areaId = me.getArea();
if(areaId != null)
{
for(int i = 0; i < list.size(); i++)
{
String s = "WG_" + list.get(i).getLabel();
if(areaId.equals(s))
{
chartMouseClicked(i);
return;
}
}
}
}
});
}
catch (Exception e) {
log.log (Level.SEVERE, "", e);
}
}
/**
* 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
/**************************************************************************
* Paint Component
* @param g graphics
*/
public void chartMouseClicked(int index)
{
GraphColumn bgc = list.get(index);
if (null == bgc)
return;
MQuery query = bgc.getMQuery(builder.getMGoal());
if (query != null)
AEnv.zoom(query);
else
log.warning("Nothing to zoom to - " + bgc);
}
public void chartMouseMoved(ChartMouseEvent event) {}
public GraphColumn[] getGraphColumnList()
{
GraphColumn[] array = new GraphColumn[list.size()];
for (int i = 0; i < list.size(); i++){
array[i] = list.get(i);
}
return array;
}
public int getZoomFactor() {
return zoomFactor;
}
public void setZoomFactor(int zoomFactor) {
this.zoomFactor = zoomFactor;
}
protected String renderGoal()
{
String output = "<div class=\"pa-content\">";
output += "<table class=\"pa-dataGrid\">\n";
output += "<tr><td class=\"pa-label\">Target</td><td colspan=\"2\" class=\"pa-tdcontent\">"
+ builder.getMGoal().getMeasureTarget().setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString()
+ "</td></tr>\n";
output += "<tr><td class=\"pa-label\">Actual</td><td colspan=\"2\" class=\"pa-tdcontent\">"
+ builder.getMGoal().getMeasureActual().setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString()
+ "</td></tr>\n";
GraphColumn[] bList = getGraphColumnList();
output += "<tr><td rowspan=\"" + bList.length
+ "\" class=\"pa-label\" valign=\"top\">"
+ builder.getMGoal().getXAxisText() + "</td>\n";
for (int k = 0; k < bList.length; k++)
{
GraphColumn bgc = bList[k];
if (k > 0)
output += "<tr>";
output += "<td class=\"pa-tdlabel\">" + bgc.getLabel()
+ "</td><td class=\"pa-tdvalue\">";
if (bgc.getMQuery(builder.getMGoal()) != null) {
Button btn = new Button();
btn.setId(String.valueOf(ZOOM_KEY + k));
btn.addEventListener(Events.ON_CLICK, new EventListener() {
public void onEvent(Event event) throws Exception {
Component comp = event.getTarget();
String id = comp.getId();
if(id.startsWith(ZOOM_KEY))
{
String ss = id.substring(ZOOM_KEY.length());
int index = Integer.parseInt(String.valueOf(ss));
GraphColumn[] colList = getGraphColumnList();
if ((index >= 0) && (index < colList.length))
AEnv.zoom(colList[index].getMQuery(builder.getMGoal()));
}
}
});
btn.setVisible(false);
appendChild(btn);
BigDecimal value = new BigDecimal(bgc.getValue());
output += "<a class=\"pa-hrefNode\" id=\"" + ZOOM_KEY +
+ k
+ "\" href=\"javascript:;\" onclick=\"$('" + btn.getUuid() + "').click()\">"
+ value.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString()
+ "</a>\n";
} else {
output += bgc.getValue();
}
output += "</td></tr>";
}
output += "</tr>"
+ "<tr><td colspan=\"3\">"
+ builder.getMGoal().getDescription()
+ "<br>"
+ stripHtml(builder.getMGoal().getColorSchema()
.getDescription(), true) + "</td></tr>"
+ "</table>\n";
output += "</div>";
bList = null;
return output;
}
protected String stripHtml(String htmlString, boolean all) {
htmlString = htmlString
.replace("<html>", "")
.replace("</html>", "")
.replace("<body>", "")
.replace("</body>", "")
.replace("<head>", "")
.replace("</head>", "");
if (all)
htmlString = htmlString
.replace(">", "&gt;")
.replace("<", "&lt;");
return htmlString;
}
} // BarGraph

View File

@ -27,11 +27,13 @@ public class WPerformanceDetail extends Window
{
super();
setTitle(goal.getName());
WBarGraph barPanel = new WBarGraph(goal);
WGraph barPanel = new WGraph(goal, 0, true, false, true);
appendChild(barPanel);
this.setAttribute(Window.MODE_KEY, Window.MODE_EMBEDDED);
this.setStyle("height: 100%; width: 100%; position: absolute; overflow: auto");
barPanel.setStyle("height: 100%; width: 100%; position: absolute; overflow: visible");
SessionManager.getAppDesktop().showWindow(this);
} // PerformanceDetail
}

View File

@ -0,0 +1,18 @@
package org.adempiere.webui.apps.graph;
import org.adempiere.webui.panel.ADForm;
public class WViewPI extends ADForm {
/**
*
*/
private static final long serialVersionUID = -755873621984745607L;
@Override
protected void initForm() {
WPAPanel paPanel = WPAPanel.get();
appendChild(paPanel);
}
}

View File

@ -16,29 +16,13 @@ package org.adempiere.webui.desktop;
import java.util.ArrayList;
import java.util.List;
import org.adempiere.apps.graph.BarGraphColumn;
import org.adempiere.webui.ClientInfo;
import org.adempiere.webui.apps.AEnv;
import org.adempiere.webui.apps.graph.WBarGraph;
import org.adempiere.webui.component.Window;
import org.adempiere.webui.exception.ApplicationException;
import org.adempiere.webui.part.AbstractUIPart;
import org.compiere.model.MAchievement;
import org.compiere.model.MGoal;
import org.compiere.model.MMeasureCalc;
import org.compiere.model.MMenu;
import org.compiere.model.MProjectType;
import org.compiere.model.MQuery;
import org.compiere.model.MRequestType;
import org.compiere.model.MRole;
import org.compiere.util.CLogger;
import org.compiere.util.Env;
import org.zkoss.zhtml.Button;
import org.zkoss.zk.ui.Component;
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.Panelchildren;
/**
* Base class for desktop implementation
@ -48,20 +32,13 @@ import org.zkoss.zul.Panelchildren;
public abstract class AbstractDesktop extends AbstractUIPart implements IDesktop {
private transient ClientInfo clientInfo;
private List<Object> windows = null;
private MGoal[] m_goals = null;
private List<MQuery> queryZoom = null;
private List<Object> windows = null;
private static final CLogger logger = CLogger.getCLogger(AbstractDesktop.class);
private static final String ZOOM_KEY = "queryZoom";
public AbstractDesktop() {
public AbstractDesktop() {
windows = new ArrayList<Object>();
queryZoom = new ArrayList<MQuery>();
}
/**
@ -264,120 +241,7 @@ public abstract class AbstractDesktop extends AbstractUIPart implements IDesktop
win.doHighlighted();
}
protected String renderGoals(int AD_Table_ID, Panelchildren panel)
{
String output = "";
if (m_goals == null)
{
m_goals = MGoal.getUserGoals(Env.getCtx(), Env.getAD_User_ID(Env.getCtx()));
if (m_goals == null)
return output;
}
for (int i = 0; i < m_goals.length; i++)
{
MMeasureCalc mc = MMeasureCalc.get(Env.getCtx(), m_goals[i].getMeasure().getPA_MeasureCalc_ID());
if (AD_Table_ID == m_goals[i].getPA_Goal_ID())
{
output += "<table class=\"dataGrid\"><tr>\n<th colspan=\"3\" class=\"label\"><b>"
+ m_goals[i].getName() + "</b></th></tr>\n";
output += "<tr><td class=\"label\">Target</td><td colspan=\"2\" class=\"tdcontent\">"
+ m_goals[i].getMeasureTarget() + "</td></tr>\n";
output += "<tr><td class=\"label\">Actual</td><td colspan=\"2\" class=\"tdcontent\">"
+ m_goals[i].getMeasureActual() + "</td></tr>\n";
WBarGraph barPanel = new WBarGraph(m_goals[i]);
BarGraphColumn[] bList = barPanel.getBarGraphColumnList();
MQuery query = null;
output += "<tr><td rowspan=\"" + bList.length
+ "\" class=\"label\" valign=\"top\">"
+ m_goals[i].getXAxisText() + "</td>\n";
for (int k = 0; k < bList.length; k++)
{
BarGraphColumn bgc = bList[k];
if (k > 0)
output += "<tr>";
if (bgc.getAchievement() != null) // Single Achievement
{
MAchievement a = bgc.getAchievement();
query = MQuery.getEqualQuery("PA_Measure_ID", a.getPA_Measure_ID());
}
else if (bgc.getGoal() != null) // Multiple Achievements
{
MGoal goal = bgc.getGoal();
query = MQuery.getEqualQuery("PA_Measure_ID", goal.getPA_Measure_ID());
}
else if (bgc.getMeasureCalc() != null) // Document
{
mc = bgc.getMeasureCalc();
query = mc.getQuery(m_goals[i].getRestrictions(false), bgc.getMeasureDisplay(),
bgc.getDate(), MRole.getDefault()); // logged in role
}
else if (bgc.getProjectType() != null) // Document
{
MProjectType pt = bgc.getProjectType();
query = pt.getQuery(m_goals[i].getRestrictions(false), bgc.getMeasureDisplay(),
bgc.getDate(), bgc.getID(), MRole.getDefault()); // logged in role
}
else if (bgc.getRequestType() != null) // Document
{
MRequestType rt = bgc.getRequestType();
query = rt.getQuery(m_goals[i].getRestrictions(false), bgc.getMeasureDisplay(),
bgc.getDate(), bgc.getID(), MRole.getDefault()); // logged in role
}
output += "<td class=\"tdcontent\">" + bgc.getLabel()
+ "</td><td class=\"tdcontent\">";
if (query != null) {
Button btn = new Button();
btn.setId(String.valueOf(ZOOM_KEY + queryZoom.size()));
btn.addEventListener(Events.ON_CLICK, new EventListener() {
public void onEvent(Event event) throws Exception {
Component comp = event.getTarget();
String id = comp.getId();
if(id.startsWith(ZOOM_KEY))
{
String ss = id.substring(ZOOM_KEY.length());
int index = Integer.parseInt(String.valueOf(ss));
if ((index >= 0) && (index < queryZoom.size()))
AEnv.zoom(queryZoom.get(index));
}
}
});
btn.setVisible(false);
panel.appendChild(btn);
output += "<a class=\"hrefZoom\" id=\"" + ZOOM_KEY +
+ queryZoom.size()
+ "\" href=\"javascript:;\" onclick=\"$('" + btn.getUuid() + "').click()\">"
+ bgc.getValue()
+ "</a><br>\n";
queryZoom.add(query);
} else {
logger.info("Nothing to zoom to - " + bgc);
output += bgc.getValue();
}
output += "</td></tr>";
}
output += "</tr>"
+ "<tr><td colspan=\"3\">"
+ m_goals[i].getDescription()
+ "<br>"
+ stripHtml(m_goals[i].getColorSchema()
.getDescription(), true) + "</td></tr>"
+ "</table>\n";
bList = null;
barPanel = null;
}
}
return output;
}
protected String stripHtml(String htmlString, boolean all) {
htmlString = htmlString
.replace("<html>", "")

View File

@ -26,6 +26,8 @@ import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.logging.Level;
import org.adempiere.webui.apps.graph.WGraph;
import org.adempiere.webui.apps.graph.WPerformanceDetail;
import org.adempiere.webui.component.Tabpanel;
import org.adempiere.webui.component.ToolBarButton;
import org.adempiere.webui.dashboard.DPActivities;
@ -36,6 +38,7 @@ import org.adempiere.webui.panel.HeaderPanel;
import org.adempiere.webui.panel.SidePanel;
import org.adempiere.webui.util.IServerPushCallback;
import org.adempiere.webui.util.ServerPushTemplate;
import org.compiere.model.MGoal;
import org.compiere.model.MMenu;
import org.compiere.model.X_AD_Menu;
import org.compiere.model.X_PA_DashboardContent;
@ -58,6 +61,7 @@ import org.zkoss.zkmax.zul.Portallayout;
import org.zkoss.zul.Html;
import org.zkoss.zul.Panel;
import org.zkoss.zul.Panelchildren;
import org.zkoss.zul.Toolbarbutton;
/**
*
@ -70,7 +74,7 @@ import org.zkoss.zul.Panelchildren;
public class DefaultDesktop extends TabbedDesktop implements MenuListener, Serializable, EventListener, IServerPushCallback
{
private static final long serialVersionUID = 9056511175189603883L;
private static final long serialVersionUID = 6320678631023300467L;
private static final CLogger logger = CLogger.getCLogger(DefaultDesktop.class);
@ -255,28 +259,24 @@ public class DefaultDesktop extends TabbedDesktop implements MenuListener, Seria
int PA_Goal_ID = rs.getInt(X_PA_DashboardContent.COLUMNNAME_PA_Goal_ID);
if(PA_Goal_ID > 0)
{
StringBuffer result = new StringBuffer("<html><head>");
//link to open performance detail
Toolbarbutton link = new Toolbarbutton();
link.setImage("/images/Zoom16.png");
link.setAttribute("PA_Goal_ID", PA_Goal_ID);
link.addEventListener(Events.ON_CLICK, new EventListener() {
URL url = getClass().getClassLoader().
getResource("org/compiere/images/PAPanel.css");
InputStreamReader ins;
try {
ins = new InputStreamReader(url.openStream());
BufferedReader bufferedReader = new BufferedReader( ins );
String cssLine;
while ((cssLine = bufferedReader.readLine()) != null)
result.append(cssLine + "\n");
} catch (IOException e1) {
logger.log(Level.SEVERE, e1.getLocalizedMessage(), e1);
}
public void onEvent(Event event) throws Exception {
int PA_Goal_ID = (Integer)event.getTarget().getAttribute("PA_Goal_ID");
MGoal goal = new MGoal(Env.getCtx(), PA_Goal_ID, null);
new WPerformanceDetail(goal);
}
result.append("</head><body><div class=\"content\">\n");
result.append(renderGoals(PA_Goal_ID, content));
result.append("</div>\n</body>\n</html>\n</html>");
});
content.appendChild(link);
Html html = new Html();
html.setContent(result.toString());
content.appendChild(html);
MGoal goal = new MGoal(Env.getCtx(), PA_Goal_ID, null);
WGraph graph = new WGraph(goal, 55, false, true, false);
content.appendChild(graph);
panelEmpty = false;
}

View File

@ -22,6 +22,7 @@ import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.logging.Level;
import org.adempiere.webui.apps.graph.WGraph;
import org.adempiere.webui.component.Accordion;
import org.adempiere.webui.component.Tabpanel;
import org.adempiere.webui.component.ToolBarButton;
@ -33,6 +34,7 @@ import org.adempiere.webui.panel.HeaderPanel;
import org.adempiere.webui.panel.SidePanel;
import org.adempiere.webui.util.IServerPushCallback;
import org.adempiere.webui.util.ServerPushTemplate;
import org.compiere.model.MGoal;
import org.compiere.model.MMenu;
import org.compiere.model.X_AD_Menu;
import org.compiere.model.X_PA_DashboardContent;
@ -63,12 +65,12 @@ import org.zkoss.zul.Panelchildren;
public class NavBar2Desktop extends TabbedDesktop implements MenuListener, Serializable, EventListener, IServerPushCallback
{
private static final long serialVersionUID = -7483133591812825441L;
private static final String FAVOURITES_PATH = "/zul/favourites.zul";
private static final String ACTIVITIES_PATH = "/zul/activities.zul";
private static final long serialVersionUID = 9056511175189603883L;
private static final CLogger logger = CLogger.getCLogger(DefaultDesktop.class);
private Center windowArea;
@ -295,28 +297,9 @@ public class NavBar2Desktop extends TabbedDesktop implements MenuListener, Seria
int PA_Goal_ID = rs.getInt(X_PA_DashboardContent.COLUMNNAME_PA_Goal_ID);
if(PA_Goal_ID > 0)
{
StringBuffer result = new StringBuffer("<html><head>");
URL url = getClass().getClassLoader().
getResource("org/compiere/images/PAPanel.css");
InputStreamReader ins;
try {
ins = new InputStreamReader(url.openStream());
BufferedReader bufferedReader = new BufferedReader( ins );
String cssLine;
while ((cssLine = bufferedReader.readLine()) != null)
result.append(cssLine + "\n");
} catch (IOException e1) {
logger.log(Level.SEVERE, e1.getLocalizedMessage(), e1);
}
result.append("</head><body><div class=\"content\">\n");
result.append(renderGoals(PA_Goal_ID, content));
result.append("</div>\n</body>\n</html>\n</html>");
Html html = new Html();
html.setContent(result.toString());
content.appendChild(html);
MGoal goal = new MGoal(Env.getCtx(), PA_Goal_ID, null);
WGraph graph = new WGraph(goal, 55, false, true, false);
content.appendChild(graph);
panelEmpty = false;
}

View File

@ -22,6 +22,7 @@ import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.logging.Level;
import org.adempiere.webui.apps.graph.WGraph;
import org.adempiere.webui.component.Accordion;
import org.adempiere.webui.component.Tabpanel;
import org.adempiere.webui.component.ToolBarButton;
@ -34,6 +35,7 @@ import org.adempiere.webui.panel.HeaderPanel;
import org.adempiere.webui.panel.SidePanel;
import org.adempiere.webui.util.IServerPushCallback;
import org.adempiere.webui.util.ServerPushTemplate;
import org.compiere.model.MGoal;
import org.compiere.model.MMenu;
import org.compiere.model.X_AD_Menu;
import org.compiere.model.X_PA_DashboardContent;
@ -67,14 +69,14 @@ import org.zkoss.zul.Treerow;
public class NavBarDesktop extends TabbedDesktop implements MenuListener, Serializable, EventListener, IServerPushCallback
{
private static final long serialVersionUID = 4721048271543882164L;
private static final String FAVOURITES_PATH = "/zul/favourites.zul";
private static final String ACTIVITIES_PATH = "/zul/activities.zul";
private static final String VIEWS_PATH = "/zul/views.zul";
private static final long serialVersionUID = 9056511175189603883L;
private static final CLogger logger = CLogger.getCLogger(DefaultDesktop.class);
private Center windowArea;
@ -298,28 +300,9 @@ public class NavBarDesktop extends TabbedDesktop implements MenuListener, Serial
int PA_Goal_ID = rs.getInt(X_PA_DashboardContent.COLUMNNAME_PA_Goal_ID);
if(PA_Goal_ID > 0)
{
StringBuffer result = new StringBuffer("<html><head>");
URL url = getClass().getClassLoader().
getResource("org/compiere/images/PAPanel.css");
InputStreamReader ins;
try {
ins = new InputStreamReader(url.openStream());
BufferedReader bufferedReader = new BufferedReader( ins );
String cssLine;
while ((cssLine = bufferedReader.readLine()) != null)
result.append(cssLine + "\n");
} catch (IOException e1) {
logger.log(Level.SEVERE, e1.getLocalizedMessage(), e1);
}
result.append("</head><body><div class=\"content\">\n");
result.append(renderGoals(PA_Goal_ID, content));
result.append("</div>\n</body>\n</html>\n</html>");
Html html = new Html();
html.setContent(result.toString());
content.appendChild(html);
MGoal goal = new MGoal(Env.getCtx(), PA_Goal_ID, null);
WGraph graph = new WGraph(goal, 55, false, true, false);
content.appendChild(graph);
panelEmpty = false;
}

View File

@ -13,6 +13,7 @@ public class ADClassNameMap {
map.put("org.compiere.apps.wf.WFPanel", "org.adempiere.webui.apps.wf.WFEditor");
map.put("org.compiere.process.InvoicePrint", "org.adempiere.webui.process.InvoicePrint");
map.put("org.compiere.process.CacheReset", "org.adempiere.webui.process.CacheReset");
map.put("org.adempiere.apps.graph.ViewPI", "org.adempiere.webui.apps.graph.WViewPI");
}
/**

45
zkwebui/css/PAPanel.css Executable file
View File

@ -0,0 +1,45 @@
.pa-header {
background-color: #B5C6C6;
}
.pa-content {
width: 90%;
margin: 20px;
background-color: #FFFFFF;
}
.pa-hrefNode {
color: #000000;
text-decoration: none;
}
.pa-dataGrid {
border-width: 1px;
border-color: #BBBBBB;
border-style: solid;
border-collapse: collapse;
width: 60%;
background-color: #EBF1EF;
}
.pa-dataGrid th {
text-align: center;
padding: 2px;
font-weight: normal;
font-size: 13px;
background-color: #C6D1CD;
border-width: 1px;
border-color: #BBBBBB;
border-style: solid;
}
.pa-dataGrid td {
border-width: 1px;
border-color: #BBBBBB;
border-style: solid;
}
.pa-label {
background-color: #C6D1CD;
}
.pa-tdlabel {
background-color: #D6E1DD;
}
.pa-tdvalue {
background-color: #EBF1EF;
text-align: right;
}

View File

@ -6,6 +6,7 @@ Copyright (C) 2007 Ashley G Ramdass.
<?init zscript="theme.zs" ?>
<?link rel="icon" type="image/png" href="${browserIcon}"?>
<?link rel="stylesheet" type="text/css" href="${themeStyleSheet}"?>
<?link rel="stylesheet" type="text/css" href="css/PAPanel.css"?>
<zk>
<window use="org.adempiere.webui.AdempiereWebUI"/>
</zk>