package com.teechart;
|
|
import java.awt.event.ActionEvent;
|
import java.awt.event.ActionListener;
|
import java.awt.event.MouseEvent;
|
import java.awt.event.MouseListener;
|
import java.awt.event.MouseMotionListener;
|
import java.util.ArrayList;
|
|
import javax.swing.JMenuItem;
|
import javax.swing.JPopupMenu;
|
import com.steema.teechart.TChart;
|
import com.steema.teechart.drawing.Color;
|
import com.steema.teechart.drawing.DashStyle;
|
import com.steema.teechart.events.TextResolver;
|
import com.steema.teechart.styles.Bar;
|
import com.steema.teechart.styles.Line;
|
import com.steema.teechart.styles.MarksStyle;
|
import com.steema.teechart.tools.MarksTip;
|
import com.steema.teechart.tools.MarksTipMouseAction;
|
|
/********************************* Tee Bar Chart ************************************************/
|
public class TBarChart extends TChart
|
{
|
public static final long serialVersionUID = 1L;
|
public static final int Bar_Type_MonVol = 0;
|
public static final int Bar_Type_MonTmp = 1;
|
public static final int Bar_Type_MonRes = 2;
|
public static final int Bar_Type_ConnRes = 3;
|
public static final int Bar_Type_MonSer = 4;
|
public static final int Bar_Type_MonSerPercent = 5;
|
public static final int Bar_Type_MonCapVol = 6;
|
public static final int Bar_Type_MonRealCap = 7;
|
public static final int Bar_Type_MonRestCap = 8;
|
public static final int Bar_Type_MonCapPercent = 9;
|
|
private static final Color COLOR_MAX = Color.GREEN;
|
private static final Color COLOR_MIN = Color.RED;
|
private static final Color COLOR_AVG = Color.GOLD;
|
private static final Color COLOR_HIGH = Color.GREEN;
|
private static final Color COLOR_LOW = Color.RED;
|
|
public Bar bar_ser;
|
public double[] bar_values;
|
private ArrayList<Color> m_colorlist = new ArrayList<Color>();
|
private double bar_leftAxMax = 0;
|
private int bar_value_count = 0;
|
|
private Line line_ser_avg;
|
private Line line_ser_low;
|
private Line line_ser_high;
|
private MarksTip tooltip1;
|
|
private int mBarType = Bar_Type_MonVol;
|
private int m_UI_GridViewIndex = 0;
|
|
public double max = 0;
|
public double min = 900000;
|
public double avg_val = 0;
|
public double low_val = 0;
|
public double sublow_val = 0;
|
public int lowcount = 0;
|
public float low_percent = 0;
|
|
public TBarChart(int bar_type)
|
{
|
bar_ser = new Bar();
|
bar_ser.getMarks().setStyle(MarksStyle.VALUE);
|
bar_ser.getMarks().setVisible(false);
|
|
this.setBarValueFormat(bar_type);
|
this.addSeries(bar_ser);
|
|
this.addMouseListener(new MouseListener(){
|
|
@Override
|
public void mouseClicked(MouseEvent arg0) {
|
if(arg0.getButton() == MouseEvent.BUTTON3)
|
{
|
JPopupMenu popupMenu = new JPopupMenu();
|
JMenuItem tableItem_restorezomm = new JMenuItem("»¹ÔËõ·Å״̬");
|
JMenuItem tableItem_showbar_label = new JMenuItem("ÏÔʾ/Òþ²ØÊýÖµ");
|
|
ActionListener act_Listener = new ActionListener(){
|
@Override
|
public void actionPerformed(ActionEvent arg0) {
|
if(arg0.getSource() == tableItem_restorezomm) {
|
restoreZoom();
|
} else if(arg0.getSource() == tableItem_showbar_label) {
|
bar_ser.getMarks().setVisible(!bar_ser.getMarks().getVisible());
|
}
|
}
|
};
|
|
tableItem_restorezomm.addActionListener(act_Listener);
|
tableItem_showbar_label.addActionListener(act_Listener);
|
popupMenu.add(tableItem_restorezomm);
|
popupMenu.add(tableItem_showbar_label);
|
popupMenu.show(arg0.getComponent(), arg0.getX(), arg0.getY());
|
}
|
}
|
|
@Override
|
public void mouseEntered(MouseEvent arg0) {
|
// TODO Auto-generated method stub
|
//arg0.getX();
|
|
}
|
|
@Override
|
public void mouseExited(MouseEvent arg0) {
|
// TODO Auto-generated method stub
|
|
}
|
|
@Override
|
public void mousePressed(MouseEvent arg0) {
|
// TODO Auto-generated method stub
|
|
}
|
|
@Override
|
public void mouseReleased(MouseEvent arg0) {
|
// TODO Auto-generated method stub
|
|
}
|
});
|
|
line_ser_avg = new Line();
|
line_ser_avg.getLinePen().setStyle(DashStyle.DOT);
|
line_ser_avg.setColor(COLOR_AVG);
|
this.addSeries(line_ser_avg);
|
|
line_ser_high = new Line();
|
line_ser_high.getLinePen().setStyle(DashStyle.DOT);
|
line_ser_high.setColor(COLOR_HIGH);
|
this.addSeries(line_ser_high);
|
|
line_ser_low = new Line();
|
line_ser_low.getLinePen().setStyle(DashStyle.DOT);
|
line_ser_low.setColor(COLOR_LOW);
|
this.addSeries(line_ser_low);
|
|
this.getChart().getTitle().setText("");
|
this.getChart().getTitle().getFont().setColor(Color.GRAY);
|
this.getLegend().setVisible(false);
|
this.getAspect().setView3D(false);
|
this.getPanel().setMarginLeft(0);
|
this.getPanel().setMarginRight(1);
|
this.getPanel().setMarginTop(1.5);
|
this.getPanel().setMarginBottom(2);
|
this.getPanel().setColor(Color.BLACK);
|
this.getAxes().getLeft().getLabels().getFont().setColor(Color.GRAY);
|
this.getAxes().getLeft().getGrid().setColor(Color.fromArgb(50, 50, 50));
|
this.getAxes().getLeft().getAxisPen().setColor(Color.GRAY);
|
this.getAxes().getBottom().getAxisPen().setColor(Color.GRAY);
|
this.getAxes().getBottom().getLabels().getFont().setColor(Color.GRAY);
|
this.getAxes().getBottom().getGrid().setVisible(false);
|
|
tooltip1 = new MarksTip(this.getChart());
|
tooltip1.setMouseDelay(50);
|
tooltip1.setMouseAction(MarksTipMouseAction.MOVE);
|
tooltip1.setStyle(MarksStyle.LABELVALUE);
|
tooltip1.setToolTipResolver(new TextResolver(){
|
@Override
|
public String getText(Object arg0, String arg1) {
|
// TODO Auto-generated method stub
|
return arg1.replace(" ", " ");
|
}
|
});
|
tooltip1.addMouseMotionListener(new MouseMotionListener(){
|
|
@Override
|
public void mouseDragged(MouseEvent arg0) {
|
}
|
|
@Override
|
public void mouseMoved(MouseEvent arg0) {
|
try {
|
if(bar_ser.getYValues().count > 0)
|
{
|
int index = Integer.parseInt(String.format("%1.0f", bar_ser.xScreenToValue(arg0.getX()))) - 1;
|
float bvalue = (float) bar_ser.yScreenToValue(arg0.getY());
|
for(int n=0; n<m_colorlist.size(); n++)
|
bar_ser.getColors().setColor(n, m_colorlist.get(n));
|
|
if((index >= 0) && (index < bar_ser.getColors().getCount())
|
&& (Math.abs(bvalue) <= Math.abs(bar_ser.getYValues().getValue(index))))
|
{
|
bar_ser.getColors().setColor(index, Color.CYAN);
|
String str = (String) (bar_ser.getLabels().get(index));
|
Integer.parseInt(str.substring(1, str.length()).trim());
|
}
|
|
bar_ser.repaint();
|
}
|
} catch(Exception e) {
|
System.out.println(e.getMessage());
|
}
|
}
|
});
|
}
|
|
public void setGridViewIndex(int index) {
|
m_UI_GridViewIndex = index;
|
}
|
public int getGridViewIndex() {
|
return m_UI_GridViewIndex;
|
}
|
|
public int getBarValueCount()
|
{
|
return bar_value_count;
|
}
|
/*
|
public void setShowLowBattOnly(boolean sh)
|
{
|
show_lowbatt_only = sh;
|
if(false == show_lowbatt_only)
|
{
|
restoreZoom();
|
}
|
}
|
*/
|
|
public void setBarValueFormat(int bar_type)
|
{
|
mBarType = bar_type;
|
switch(mBarType)
|
{
|
case Bar_Type_MonVol: bar_ser.setValueFormat("#0.000V"); break;
|
case Bar_Type_MonTmp: bar_ser.setValueFormat("#0.0¡ãC"); break;
|
case Bar_Type_MonRes: bar_ser.setValueFormat("#0.000m¦¸"); break;
|
case Bar_Type_MonSer: bar_ser.setValueFormat("#"); break;
|
case Bar_Type_MonSerPercent: bar_ser.setValueFormat("#0.0%"); break;
|
case Bar_Type_ConnRes: bar_ser.setValueFormat("#0.000m¦¸"); break;
|
case Bar_Type_MonCapVol: bar_ser.setValueFormat("#0.000V"); break;
|
case Bar_Type_MonRealCap: bar_ser.setValueFormat("#AH"); break;
|
case Bar_Type_MonRestCap: bar_ser.setValueFormat("#AH"); break;
|
case Bar_Type_MonCapPercent: bar_ser.setValueFormat("#%"); break;
|
}
|
}
|
|
public void restoreZoom()
|
{
|
this.getZoom().undo();
|
this.getAxes().getBottom().setMinMax(0.2, bar_value_count+0.6);
|
}
|
|
public void clearSerialData()
|
{
|
this.getChart().getTitle().setText("");
|
bar_ser.clear();
|
m_colorlist.clear();
|
line_ser_avg.clear();
|
line_ser_high.clear();
|
line_ser_low.clear();
|
//this.getChart().getAxes().getBottom().setMinMax(0, 0);
|
this.getChart().getAxes().getLeft().setMinMax(0, 0);
|
}
|
|
private String getChartTitleString(String value_title, String value_formate)
|
{
|
float param = 1;
|
if(value_formate.contains("%%")) {
|
param = 100;
|
}
|
|
String str = String.format(value_title
|
+ ": MAX = " + value_formate
|
+ "; MIN = " + value_formate
|
+ "; AVG = " + value_formate
|
+ "; \n\r"
|
+ "LOW = " + value_formate
|
+ "; LC = %d"
|
+ "; LP = %1.1f%%",
|
max*param, min*param, avg_val*param, sublow_val*param, lowcount, low_percent);
|
return str;
|
}
|
|
public void updateChartData(int bar_type, double val[], int d_count)
|
{
|
setBarValueFormat(bar_type);
|
|
bar_values = val;
|
boolean manulbottomAx = false;
|
|
clearSerialData();
|
|
if(d_count <= 0)
|
return;
|
|
if(this.getSeriesCount() != 3)
|
{
|
this.removeAllSeries();
|
this.addSeries(bar_ser);
|
this.addSeries(line_ser_avg);
|
this.addSeries(line_ser_high);
|
this.addSeries(line_ser_low);
|
}
|
|
max = 0;
|
min = 900000;
|
avg_val = 0;
|
sublow_val = 0;
|
low_val = 0;
|
lowcount = 0;
|
low_percent = 0;
|
|
if(bar_value_count != d_count)
|
{
|
bar_value_count = d_count;
|
manulbottomAx = true;
|
m_colorlist.clear();
|
}
|
|
for(int n=0; n<d_count; n++)
|
{
|
avg_val += bar_values[n];
|
if(max < bar_values[n]) {max = bar_values[n];}
|
if(min > bar_values[n]) {min = bar_values[n];}
|
}
|
avg_val /= d_count;
|
|
line_ser_avg.add(0, avg_val, "");
|
line_ser_high.add(0, sublow_val, "");
|
line_ser_low.add(0, low_val, "");
|
int chart_value_show_count = 0;
|
|
for(int n=0; n<d_count; n++)
|
{
|
Color cl = Color.fromArgb(100, 100, 100);
|
//if(true == m_UI.m_CFG.showHighLightBar)
|
// cl = Color.BLUE;
|
|
if((Bar_Type_MonRes==bar_type)||(Bar_Type_ConnRes==bar_type)||(Bar_Type_MonTmp==bar_type)) {
|
/*if(bar_values[n] >= sublow_val) {cl = COLOR_SUBLOW; lowcount++;}
|
if(bar_values[n] >= low_val) {cl = COLOR_LOW;}*/
|
if(bar_values[n] >= max) {cl = COLOR_MIN;}
|
if(bar_values[n] <= min) {cl = COLOR_MAX;}
|
} else {/*
|
if(bar_values[n] <= sublow_val) {cl = COLOR_SUBLOW; lowcount++;}
|
if(bar_values[n] <= low_val) {cl = COLOR_LOW;}*/
|
if(bar_values[n] >= max) {cl = COLOR_MAX;}
|
if(bar_values[n] <= min) {cl = COLOR_MIN;}
|
}
|
|
bar_ser.add(chart_value_show_count+1, bar_values[n], "#" + String.valueOf(n+1), cl);
|
m_colorlist.add(cl);
|
/*
|
line_ser_avg.add(chart_value_show_count+1, avg_val, "#" + String.valueOf(n+1));
|
line_ser_high.add(chart_value_show_count+1, max, "#" + String.valueOf(n+1));
|
line_ser_low.add(chart_value_show_count+1, min, "#" + String.valueOf(n+1));
|
*/
|
chart_value_show_count++;
|
}
|
/*
|
line_ser_avg.add(chart_value_show_count+0.6, avg_val, "");
|
line_ser_sublow.add(chart_value_show_count+0.6, sublow_val, "");
|
line_ser_low.add(chart_value_show_count+0.6, low_val, "");
|
*/
|
low_percent = ((float)lowcount)*100 / (float)d_count;
|
|
String chart_tile_str = getChartTitleString("MonVol", "%1.3fV");
|
String left_axes_format = "#0.00V";
|
|
float ax_left_pm_min = (float) 0.9;
|
float ax_left_pm_max = (float) 1.08;
|
|
if(Bar_Type_MonRealCap == mBarType) {
|
chart_tile_str = getChartTitleString("RealCap", "%1.0fAH");
|
left_axes_format = "#AH";
|
}
|
else if(Bar_Type_MonRestCap == mBarType) {
|
chart_tile_str = getChartTitleString("RestCap", "%1.0fAH");
|
left_axes_format = "#AH";
|
}
|
else if(Bar_Type_MonCapPercent == mBarType)
|
{
|
chart_tile_str = getChartTitleString("CapPercent", "%1.2f%%");
|
left_axes_format = "#%";
|
}
|
else if(Bar_Type_MonTmp == mBarType)
|
{
|
chart_tile_str = getChartTitleString("MonTmp", "%1.1f¡ãC");
|
left_axes_format = "#0.0¡ãC";
|
ax_left_pm_min = (float) 0.5;
|
ax_left_pm_max = (float) 1.1;
|
}
|
else if(Bar_Type_MonRes == mBarType)
|
{
|
chart_tile_str = getChartTitleString("MonRes", "%1.3fm¦¸");
|
left_axes_format = "#0.00m¦¸";
|
ax_left_pm_min = (float) 0.5;
|
ax_left_pm_max = (float) 1.1;
|
}
|
else if(Bar_Type_MonSer == mBarType)
|
{
|
chart_tile_str = getChartTitleString("MonSer", "%1.0f");
|
left_axes_format = "#";
|
ax_left_pm_min = (float) 0.5;
|
ax_left_pm_max = (float) 1.1;
|
}
|
else if(Bar_Type_MonSerPercent == mBarType)
|
{
|
chart_tile_str = getChartTitleString("MonSerPercent", "%1.1f%%");
|
left_axes_format = "#%";
|
ax_left_pm_min = (float) 0.5;
|
ax_left_pm_max = (float) 1.1;
|
}
|
else if(Bar_Type_ConnRes == mBarType)
|
{
|
chart_tile_str = getChartTitleString("ConnRes", "%1.3fm¦¸");
|
left_axes_format = "#0.00m¦¸";
|
ax_left_pm_min = (float) 0.5;
|
ax_left_pm_max = (float) 1.1;
|
}
|
|
this.getAxes().getLeft().getLabels().setValueFormat(left_axes_format);
|
this.getChart().getTitle().setText(chart_tile_str);
|
|
float left_ax = (float) Math.abs(bar_ser.getMaxYValue());
|
float left_ax_min = (float) (Math.abs(min)*ax_left_pm_min);
|
if((bar_leftAxMax < (left_ax*1.05)) || (bar_leftAxMax > (left_ax*1.1)))
|
{
|
bar_leftAxMax = (bar_ser.getMaxYValue()*ax_left_pm_max);
|
}
|
//leftAxMax = bar_leftAxMax;
|
|
this.getAxes().getLeft().setMinMax(left_ax_min, bar_leftAxMax);
|
if(true == manulbottomAx)
|
{
|
this.getZoom().undo();
|
this.getAxes().getBottom().setMinMax(0.2, chart_value_show_count+0.6);
|
}
|
}
|
}
|
/************************************************************************************************/
|