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 m_colorlist = new ArrayList(); 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= 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 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= 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); } } } /************************************************************************************************/