LineChart.java
上传用户:mingda
上传日期:2017-06-20
资源大小:27691k
文件大小:59k
源码类别:

OA系统

开发平台:

Java

  1. // Decompiled by DJ v2.9.9.60 Copyright 2000 Atanas Neshkov  Date: 2002-12-03 18:42:54
  2. // Home Page : http://members.fortunecity.com/neshkov/dj.html  - Check often for new version!
  3. // Decompiler options: packimports(3) 
  4. // Source File Name:   LineChart.java
  5. package cn.com.fcsoft.chart;
  6. import java.awt.*;
  7. import java.awt.event.MouseEvent;
  8. import java.io.PrintStream;
  9. import java.util.*;
  10. // Referenced classes of package com.objectplanet.chart:
  11. //            Chart, ChartSample, PieChart
  12. public class LineChart extends Chart
  13. {
  14.     public void setSampleHighlightStyle(int i, int j, int k)
  15.     {
  16.         sampleHighlightSize[i] = Math.max(0, k);
  17.         sampleHighlightStyle[i] = j;
  18.         super.hasChanged = true;
  19.         autoRepaint();
  20.     }
  21.     public int getSampleHighlightStyle(int i)
  22.     {
  23.         try
  24.         {
  25.             return sampleHighlightStyle[i];
  26.         }
  27.         catch(IndexOutOfBoundsException _ex)
  28.         {
  29.             throw new IllegalArgumentException("Invalid series: " + i);
  30.         }
  31.     }
  32.     public boolean isSampleLabelsOn()
  33.     {
  34.         return super.sampleLabelsOn;
  35.     }
  36.     public void setAutoLabelSpacingOn(boolean flag)
  37.     {
  38.         autoLabelSpacingOn = flag;
  39.         super.hasChanged = true;
  40.         autoRepaint();
  41.     }
  42.     public void setStackedOn(boolean flag)
  43.     {
  44.         stackedOn = flag;
  45.         super.hasChanged = true;
  46.         autoRepaint();
  47.     }
  48.     public void setConnectedLinesOn(int i, boolean flag)
  49.     {
  50.         if(i >= 0 && i < connectedLinesOn.length)
  51.             connectedLinesOn[i] = flag;
  52.         else
  53.         if(i == -1)
  54.         {
  55.             for(int j = 0; j < connectedLinesOn.length; j++)
  56.                 connectedLinesOn[j] = flag;
  57.         }
  58.         super.hasChanged = true;
  59.         autoRepaint();
  60.     }
  61.     protected void processEvent(AWTEvent awtevent)
  62.     {
  63.         switch(awtevent.getID())
  64.         {
  65.         case 504: 
  66.         default:
  67.             break;
  68.         case 505: 
  69.             selectedSample = -1;
  70.             selectedSeries = -1;
  71.             repaint();
  72.             break;
  73.         case 503: 
  74.         case 506: 
  75.             MouseEvent mouseevent = (MouseEvent)awtevent;
  76.             boolean flag = isValueLabelsOn() && valueLabelStyle == 2;
  77.             flag |= super.sampleLabelsOn && sampleLabelStyle == 2;
  78.             flag |= seriesLabelsOn;
  79.             if(!flag)
  80.                 break;
  81.             mousePosition.x = mouseevent.getX();
  82.             mousePosition.y = mouseevent.getY();
  83.             ChartSample chartsample = super.checkSelection(mousePosition);
  84.             if(chartsample != null)
  85.             {
  86.                 mousePosition.x = -1;
  87.                 mousePosition.y = -1;
  88.             } else
  89.             {
  90.                 chartsample = checkSelection(mousePosition);
  91.             }
  92.             if(chartsample != null)
  93.             {
  94.                 if(chartsample.getIndex() != selectedSample || chartsample.getSeries() != selectedSeries)
  95.                 {
  96.                     selectedSample = chartsample.getIndex();
  97.                     selectedSeries = chartsample.getSeries();
  98.                     repaint();
  99.                 }
  100.                 break;
  101.             }
  102.             boolean flag1 = selectedSample != -1 || selectedSeries != -1;
  103.             selectedSample = -1;
  104.             selectedSeries = -1;
  105.             if(flag1)
  106.                 repaint();
  107.             break;
  108.         }
  109.         super.processEvent(awtevent);
  110.     }
  111.     public String[] getLegendLabels()
  112.     {
  113.         if(super.legendLabels != null)
  114.             return super.legendLabels;
  115.         else
  116.             return getSeriesLabels();
  117.     }
  118.     private void paintSampleLabels(Graphics g, Rectangle rectangle, Rectangle rectangle1)
  119.     {
  120.         String as[] = getSampleLabels();
  121.         if(as == null)
  122.             return;
  123.         Font font = getFont("sampleLabelFont");
  124.         g.setFont(font);
  125.         FontMetrics fontmetrics = g.getFontMetrics();
  126.         int i = getSampleCount();
  127.         double d = rectangle1.width;
  128.         if(i > 1)
  129.             d = (float)rectangle1.width / (float)(i - 1);
  130.         int j = rectangle1.y + rectangle1.height;
  131.         double d1 = rectangle1.x;
  132.         int k = rectangle.x;
  133.         int l = rectangle.x + rectangle.width;
  134.         if(is3DModeOn())
  135.         {
  136.             j -= super.depth3dPoint.y;
  137.             d1 -= super.depth3dPoint.x;
  138.             k -= super.depth3dPoint.x;
  139.             l -= super.depth3dPoint.x;
  140.         }
  141.         if(super.sampleScrollerOn)
  142.             j += 10;
  143.         Color color = getChartForeground();
  144.         int i1 = getLabelAngle("sampleLabelAngle");
  145.         double d2 = 0.0D;
  146.         for(int j1 = 0; j1 < as.length; j1++)
  147.         {
  148.             if(as[j1] != null && as[j1].length() > 0 && d1 >= (double)k && d1 <= (double)(l + 1))
  149.             {
  150.                 Color color1 = getSampleLabelColor(j1);
  151.                 if(color1 == null)
  152.                     color1 = getForeground();
  153.                 String s = as[j1];
  154.                 Dimension dimension = getLabelSize(s, font);
  155.                 Dimension dimension1 = getAngledLabelSize(dimension, i1);
  156.                 int k1 = j + 8;
  157.                 if(i1 % 180 == 0)
  158.                     k1 += fontmetrics.getMaxAscent() - 4;
  159.                 double d3 = 0.0D;
  160.                 if(i1 % 180 == 0)
  161.                     d3 = d1 - (double)(dimension1.width / 2);
  162.                 else
  163.                 if(i1 % 360 > 90 && i1 % 360 < 180 || i1 % 360 > 270)
  164.                     d3 = (d1 - (double)dimension1.width) + (double)(fontmetrics.getAscent() / 2);
  165.                 else
  166.                     d3 = d1 - (double)(fontmetrics.getAscent() / 2);
  167.                 g.setColor(color);
  168.                 if(autoLabelSpacingOn)
  169.                 {
  170.                     if(s != null && s.trim().length() > 0 && (d3 > d2 || j1 == 0))
  171.                     {
  172.                         g.drawLine((int)Math.round(d1), j, (int)Math.round(d1), j + 3);
  173.                         g.setColor(color1);
  174.                         paintLabel(g, s, (int)Math.round(d3), k1, dimension, 0, i1);
  175.                         d2 = d3 + (double)dimension1.width;
  176.                     }
  177.                 } else
  178.                 if(s != null && s.trim().length() > 0)
  179.                 {
  180.                     g.drawLine((int)Math.round(d1), j, (int)Math.round(d1), j + 3);
  181.                     g.setColor(color1);
  182.                     paintLabel(g, s, (int)Math.round(d3), k1, dimension, 0, i1);
  183.                 }
  184.             }
  185.             d1 += d;
  186.         }
  187.     }
  188.     public void setSampleLabelStyle(int i)
  189.     {
  190.         sampleLabelStyle = i;
  191.         super.hasChanged = true;
  192.         autoRepaint();
  193.     }
  194.     public int getSampleLabelStyle()
  195.     {
  196.         return sampleLabelStyle;
  197.     }
  198.     public void setSeriesLineOn(boolean flag)
  199.     {
  200.         for(int i = 0; i < seriesLinesOn.length; i++)
  201.             seriesLinesOn[i] = flag;
  202.         super.hasChanged = true;
  203.         autoRepaint();
  204.     }
  205.     public void setSeriesLineOn(int i, boolean flag)
  206.     {
  207.         seriesLinesOn[i] = flag;
  208.         super.hasChanged = true;
  209.         autoRepaint();
  210.     }
  211.     private void paintSampleHighlight(Graphics g, int i, int j, int k, Color color)
  212.     {
  213.         java.awt.Shape shape = g.getClip();
  214.         g.setClip(0, 0, 32767, 32767);
  215.         String s = getLegendImage(i);
  216.         Dimension dimension = getImageSize(s);
  217.         if(s != null && dimension.width > 0 && dimension.height > 0)
  218.         {
  219.             Image image = (Image)super.images.get(s);
  220.             if(image != null)
  221.                 g.drawImage(image, j - dimension.width / 2, k - dimension.height / 2, this);
  222.         } else
  223.         {
  224.             int l = 6;
  225.             if(i >= 0 && i < sampleHighlightSize.length)
  226.                 l = sampleHighlightSize[i];
  227.             int i1 = 0;
  228.             if(i >= 0 && i < sampleHighlightStyle.length)
  229.                 i1 = sampleHighlightStyle[i];
  230.             Color color1 = getChartBackground();
  231.             g.setColor(color);
  232.             switch(i1)
  233.             {
  234.             default:
  235.                 break;
  236.             case 0: // ''
  237.                 g.drawOval(j - l / 2, k - l / 2, l, l);
  238.                 break;
  239.             case 2: // '02'
  240.                 g.fillOval(j - l / 2, k - l / 2, l + 1, l + 1);
  241.                 break;
  242.             case 1: // '01'
  243.                 g.setColor(color1);
  244.                 g.fillOval(j - l / 2, k - l / 2, l + 1, l + 1);
  245.                 g.setColor(color);
  246.                 g.drawOval(j - l / 2, k - l / 2, l, l);
  247.                 break;
  248.             case 3: // '03'
  249.                 g.drawRect(j - l / 2, k - l / 2, l, l);
  250.                 break;
  251.             case 5: // '05'
  252.                 g.fillRect(j - l / 2, k - l / 2, l + 1, l + 1);
  253.                 break;
  254.             case 4: // '04'
  255.                 g.setColor(color1);
  256.                 g.fillRect(j - l / 2, k - l / 2, l + 1, l + 1);
  257.                 g.setColor(color);
  258.                 g.drawRect(j - l / 2, k - l / 2, l, l);
  259.                 break;
  260.             case 6: // '06'
  261.             case 7: // '07'
  262.             case 8: // 'b'
  263.                 int ai[] = new int[4];
  264.                 ai[0] = ai[2] = j;
  265.                 ai[1] = j + l / 2;
  266.                 ai[3] = j - l / 2;
  267.                 int ai1[] = new int[4];
  268.                 ai1[0] = k - l / 2;
  269.                 ai1[2] = k + l / 2;
  270.                 ai1[1] = ai1[3] = k;
  271.                 if(i1 == 7)
  272.                 {
  273.                     g.setColor(color1);
  274.                     g.fillPolygon(ai, ai1, 4);
  275.                 } else
  276.                 if(i1 == 8)
  277.                 {
  278.                     g.setColor(color);
  279.                     g.fillPolygon(ai, ai1, 4);
  280.                 }
  281.                 g.setColor(color);
  282.                 g.drawPolygon(ai, ai1, 4);
  283.                 break;
  284.             }
  285.         }
  286.         g.setClip(shape);
  287.     }
  288.     double getHighestValue(int i)
  289.     {
  290.         if(stackedOn)
  291.             return getMaxValue(-2);
  292.         else
  293.             return super.getHighestValue(i);
  294.     }
  295.     public double getMaxValue(int i)
  296.     {
  297.         if(i >= -1 || !stackedOn)
  298.             return super.getMaxValue(i);
  299.         double d = 0.0D;
  300.         int j = getSampleCount();
  301.         int k = getSeriesCount();
  302.         for(int l = 0; l < j; l++)
  303.         {
  304.             double d1 = 0.0D;
  305.             for(int i1 = 0; i1 < k; i1++)
  306.             {
  307.                 ChartSample chartsample = getSample(i1, l);
  308.                 if(chartsample != null && chartsample.value != null && !chartsample.value.isNaN() && chartsample.value.doubleValue() > 0.0D)
  309.                     d1 += chartsample.value.doubleValue();
  310.             }
  311.             d = Math.max(d, d1);
  312.         }
  313.         return d;
  314.     }
  315.     protected void calculateChartData(Rectangle rectangle, Rectangle rectangle1)
  316.     {
  317.         calculateZeroLines(rectangle);
  318.         if(is3DModeOn())
  319.             if(super.depth3d > -1)
  320.             {
  321.                 super.depth3dPoint.x = super.depth3d;
  322.                 super.depth3dPoint.y = -super.depth3d;
  323.             } else
  324.             {
  325.                 int i = Math.max(getSampleCount(), 20);
  326.                 int j = getSeriesCount();
  327.                 if(j > 1 && !stackedOn)
  328.                 {
  329.                     i /= j;
  330.                     i = Math.max(i, 4);
  331.                 }
  332.                 double d = (double)rectangle.width / (double)i;
  333.                 super.depth3dPoint.x = (int)Math.round(d * 1.25D);
  334.                 super.depth3dPoint.y = (int)Math.round(-d / 1.25D);
  335.             }
  336.     }
  337.     private void paintFloatingLabels(Graphics g, Rectangle rectangle)
  338.     {
  339.         boolean flag = isValueLabelsOn(-1) && valueLabelStyle == 2;
  340.         flag |= super.sampleLabelsOn && sampleLabelStyle == 2;
  341.         flag |= seriesLabelsOn;
  342.         if(flag)
  343.         {
  344.             Font font = getFont("floatingLabelFont");
  345.             g.setFont(font);
  346.             FontMetrics fontmetrics = g.getFontMetrics();
  347.             if(selectedSample >= 0 && selectedSeries >= 0)
  348.             {
  349.                 ChartSample chartsample = getSample(selectedSeries, selectedSample);
  350.                 if(chartsample != null && chartsample.value != null && !chartsample.value.isNaN())
  351.                 {
  352.                     String s = constructFloatingLabel(selectedSeries, selectedSample, seriesLabelsOn);
  353.                     paintFloatingLabel(g, rectangle, selectedSeries, selectedSample, s, font, fontmetrics);
  354.                 }
  355.             } else
  356.             if(selectedSeries >= 0 && isFloatingOnLegendOn())
  357.             {
  358.                 int i = getSampleCount();
  359.                 for(int j = 0; j < i; j++)
  360.                 {
  361.                     ChartSample chartsample1 = getSample(selectedSeries, j);
  362.                     if(chartsample1 != null && chartsample1.value != null && !chartsample1.value.isNaN())
  363.                     {
  364.                         String s1 = constructFloatingLabel(selectedSeries, j, false);
  365.                         paintFloatingLabel(g, rectangle, selectedSeries, j, s1, font, fontmetrics);
  366.                     }
  367.                 }
  368.             }
  369.         }
  370.     }
  371.     public boolean isSeriesLineOn(int i)
  372.     {
  373.         return seriesLinesOn[i];
  374.     }
  375.     public void setSampleLabelsOn(boolean flag)
  376.     {
  377.         super.sampleLabelsOn = flag;
  378.         super.hasChanged = true;
  379.         autoRepaint();
  380.     }
  381.     public boolean isSeriesLabelsOn()
  382.     {
  383.         return seriesLabelsOn;
  384.     }
  385.     /**
  386.      * @deprecated Method setLineWidth is deprecated
  387.      */
  388.     public void setLineWidth(int i)
  389.     {
  390.         setLineWidth(-1, i);
  391.     }
  392.     public void setLineWidth(int i, int j)
  393.     {
  394.         if(i >= 0 && i < lineWidth.length)
  395.             lineWidth[i] = j;
  396.         else
  397.         if(i < 0)
  398.         {
  399.             for(int k = 0; k < lineWidth.length; k++)
  400.                 lineWidth[k] = j;
  401.         }
  402.         super.hasChanged = true;
  403.         autoRepaint();
  404.     }
  405.     /**
  406.      * @deprecated Method getLineWidth is deprecated
  407.      */
  408.     public int getLineWidth()
  409.     {
  410.         return getLineWidth(0);
  411.     }
  412.     public int getLineWidth(int i)
  413.     {
  414.         if(i >= 0 && i < lineWidth.length)
  415.             return lineWidth[i];
  416.         else
  417.             return lineWidth[0];
  418.     }
  419.     public void setValueLabelStyle(int i)
  420.     {
  421.         valueLabelStyle = i;
  422.         super.hasChanged = true;
  423.         autoRepaint();
  424.     }
  425.     public int getValueLabelStyle()
  426.     {
  427.         return valueLabelStyle;
  428.     }
  429.     public boolean isSampleHighlightOn(int i, int j)
  430.     {
  431.         try
  432.         {
  433.             return sampleHighlightOn[i][j];
  434.         }
  435.         catch(IndexOutOfBoundsException _ex)
  436.         {
  437.             throw new IllegalArgumentException("Invalid series or index: " + i + ", " + j);
  438.         }
  439.     }
  440.     public ChartSample checkSelection(Point point)
  441.     {
  442.         if(point == null)
  443.             return null;
  444.         ChartSample chartsample = null;
  445.         getSeriesCount();
  446.         if(isLegendOn() && super.legendBounds != null)
  447.         {
  448.             for(int i = 0; i < super.legendBounds.length; i++)
  449.             {
  450.                 if(super.legendBounds[i] == null || !super.legendBounds[i].contains(point))
  451.                     continue;
  452.                 chartsample = new ChartSample(-1);
  453.                 chartsample.setSeries(i);
  454.                 break;
  455.             }
  456.         }
  457.         if(chartsample == null && samplePosition != null)
  458.         {
  459.             byte byte0 = 3;
  460.             for(int j = 0; j < samplePosition.length; j++)
  461.             {
  462.                 Point apoint[] = samplePosition[j];
  463.                 if(apoint != null)
  464.                 {
  465.                     for(int k = 0; k < apoint.length; k++)
  466.                         if(apoint[k] != null)
  467.                         {
  468.                             Point point1 = new Point(apoint[k]);
  469.                             if(is3DModeOn())
  470.                             {
  471.                                 point1.x -= super.depth3dPoint.x;
  472.                                 if(!stackedOn)
  473.                                 {
  474.                                     double d = (double)super.depth3dPoint.x / (double)getSeriesCount();
  475.                                     int l = (int)Math.round(d * (double)j);
  476.                                     point1.x += l;
  477.                                 }
  478.                             }
  479.                             boolean flag = point.x >= point1.x - byte0 && point.x <= point1.x + byte0;
  480.                             flag &= point.y >= point1.y - byte0 && point.y <= point1.y + byte0;
  481.                             if(flag)
  482.                                 return getSample(j, k);
  483.                         }
  484.                 }
  485.             }
  486.         }
  487.         return chartsample;
  488.     }
  489.     protected void renderData(Graphics g, Rectangle rectangle, Rectangle rectangle1)
  490.     {
  491.         paintLines(g, rectangle, rectangle1);
  492.     }
  493.     public void reset()
  494.     {
  495.         super.reset();
  496.         valueLabelStyle = 0;
  497.         autoLabelSpacingOn = false;
  498.         super.multiSeriesOn = true;
  499.         selectedSample = -1;
  500.         selectedSeries = -1;
  501.         super.hasChanged = true;
  502.     }
  503.     public void setSampleColors(Color acolor[])
  504.     {
  505.         super.setSampleColors(acolor);
  506.         if(acolor == null)
  507.             setSampleColor(2, new Color(132, 255, 198));
  508.         super.hasChanged = true;
  509.         autoRepaint();
  510.     }
  511.     public LineChart()
  512.     {
  513.         this(1, 5, 100D);
  514.     }
  515.     public LineChart(int i, int j, double d)
  516.     {
  517.         this(i, j, d, 0.0D);
  518.     }
  519.     public LineChart(int i, int j, double d, double d1)
  520.     {
  521.         super(j);
  522.         super.chartType = "line";
  523.         super.multiSeriesOn = true;
  524.         sampleHighlightOn = new boolean[i][j];
  525.         sampleHighlightStyle = new int[i];
  526.         sampleHighlightSize = new int[i];
  527.         seriesLinesOn = new boolean[i];
  528.         lineWidth = new int[i];
  529.         for(int k = 0; k < sampleHighlightSize.length; k++)
  530.         {
  531.             sampleHighlightSize[k] = 6;
  532.             seriesLinesOn[k] = true;
  533.             lineWidth[k] = 2;
  534.         }
  535.         connectedLinesOn = new boolean[i];
  536.         samplePosition = new Point[i][j];
  537.         for(int l = 0; l < samplePosition.length; l++)
  538.         {
  539.             for(int i1 = 0; i1 < samplePosition[l].length; i1++)
  540.                 samplePosition[l][i1] = new Point();
  541.         }
  542.         mousePosition = new Point();
  543.         setAutomaticRepaintOn(false);
  544.         setSeriesCount(i);
  545.         setRange(0, d);
  546.         setLowerRange(0, d1);
  547.         setSampleColors(null);
  548.         setAutomaticRepaintOn(true);
  549.         selectedSample = -1;
  550.         selectedSeries = -1;
  551.         lastSelectedLine = -1;
  552.     }
  553.     private void paintLine(Graphics g, int i, Rectangle rectangle, Rectangle rectangle1, Color color, boolean flag)
  554.     {
  555.         int j = getSeriesCount();
  556.         if(i < 0 || i >= j)
  557.             throw new IllegalArgumentException("Invalid series: " + i);
  558.         if(flag)
  559.             lastSelectedLine = i;
  560.         ChartSample achartsample[] = getSamples(i);
  561.         if(achartsample == null || achartsample.length == 0)
  562.             return;
  563.         double d = rectangle1.width;
  564.         if(achartsample.length - 1 > 0)
  565.             d = (double)(rectangle1.width - 1) / (double)(achartsample.length - 1);
  566.         Color color1 = !stackedOn && !flag ? color : color.darker();
  567.         boolean flag1 = is3DModeOn();
  568.         Graphics g1 = g;
  569.         if(flag1)
  570.             g1.setClip((rectangle.x - super.depth3dPoint.x) + 1, rectangle.y + 1, (rectangle.width + super.depth3dPoint.x) - 1, rectangle.height - super.depth3dPoint.y - 1);
  571.         else
  572.             g1.setClip(rectangle.x + 1, rectangle.y, rectangle.width - 1, rectangle.height + 1);
  573.         double d1 = rectangle1.x + 1;
  574.         int ai[] = new int[4];
  575.         int ai1[] = new int[4];
  576.         boolean flag2 = false;
  577.         double d2 = d1;
  578.         double d3 = calculateYPos(i, 0, rectangle1);
  579.         for(int k = 0; k < achartsample.length - 1; k++)
  580.         {
  581.             boolean flag3 = achartsample[k] != null && achartsample[k].value != null && !achartsample[k].value.isNaN();
  582.             boolean flag4 = achartsample[k + 1] != null && achartsample[k + 1].value != null && !achartsample[k + 1].value.isNaN();
  583.             if(flag3)
  584.             {
  585.                 d2 = d1;
  586.                 d3 = calculateYPos(i, k, rectangle1);
  587.                 flag2 = true;
  588.             }
  589.             boolean flag5 = flag3 && flag4;
  590.             flag5 |= flag4 && connectedLinesOn[i];
  591.             if(flag5 && flag2)
  592.             {
  593.                 if(connectedLinesOn[i])
  594.                 {
  595.                     ai[0] = (int)d2;
  596.                     ai1[0] = (int)d3;
  597.                 } else
  598.                 {
  599.                     ai[0] = (int)d1;
  600.                     ai1[0] = calculateYPos(i, k, rectangle1);
  601.                 }
  602.                 ai[1] = (int)(d1 + d);
  603.                 ai1[1] = calculateYPos(i, k + 1, rectangle1);
  604.                 if(flag1)
  605.                 {
  606.                     ai[0] -= super.depth3dPoint.x;
  607.                     ai[1] -= super.depth3dPoint.x;
  608.                     ai[2] -= super.depth3dPoint.x;
  609.                     ai[3] -= super.depth3dPoint.x;
  610.                     if(!stackedOn)
  611.                     {
  612.                         double d4 = (double)super.depth3dPoint.x / (double)j;
  613.                         int i2 = (int)Math.round(d4 * (double)i);
  614.                         ai[0] += i2;
  615.                         ai[1] += i2;
  616.                         ai[2] += i2;
  617.                         ai[3] += i2;
  618.                     }
  619.                 }
  620.                 if(stackedOn)
  621.                 {
  622.                     ai[2] = ai[1];
  623.                     ai1[2] = calculateYPos(i - 1, k + 1, rectangle1);
  624.                     ai[3] = ai[0];
  625.                     ai1[3] = calculateYPos(i - 1, k, rectangle1);
  626.                 }
  627.                 boolean flag7 = false;
  628.                 int l1 = rectangle.x - (flag1 ? super.depth3dPoint.x * 2 : 0);
  629.                 int j2 = rectangle.x + rectangle.width;
  630.                 flag7 |= ai[0] >= l1 && ai[0] <= j2;
  631.                 flag7 |= ai[1] >= l1 && ai[1] <= j2;
  632.                 flag7 |= ai[0] <= l1 && ai[1] >= j2;
  633.                 if(flag7)
  634.                 {
  635.                     ai[0] = Math.max(ai[0], -10000);
  636.                     ai[1] = Math.max(ai[1], -10000);
  637.                     ai[0] = Math.min(ai[0], 11000);
  638.                     ai[1] = Math.min(ai[1], 11000);
  639.                     ai1[0] = Math.max(ai1[0], -10000);
  640.                     ai1[1] = Math.max(ai1[1], -10000);
  641.                     ai1[0] = Math.min(ai1[0], 11000);
  642.                     ai1[1] = Math.min(ai1[1], 11000);
  643.                     if(seriesLinesOn[i])
  644.                         if(flag1 && stackedOn)
  645.                         {
  646.                             boolean flag8 = i == j - 1;
  647.                             boolean flag9 = k == achartsample.length - 2;
  648.                             if(k < achartsample.length - 2)
  649.                             {
  650.                                 flag9 |= achartsample[k + 2] == null || achartsample[k + 2].value == null || achartsample[k + 2].value.isNaN();
  651.                                 flag9 &= !connectedLinesOn[i];
  652.                             }
  653.                             paint3DLine(g1, ai[0], ai1[0], ai[1], ai1[1], ai1[2], color1, flag8, flag9);
  654.                         } else
  655.                         if(flag1)
  656.                             paint3DLine(g1, ai[0], ai1[0], ai[1], ai1[1], ai1[2], color1, true, false);
  657.                     if(stackedOn && seriesLinesOn[i])
  658.                     {
  659.                         g1.setColor(flag ? color.darker() : color);
  660.                         g1.fillPolygon(ai, ai1, 4);
  661.                         g1.setColor(color.darker());
  662.                         g1.drawLine(ai[1], ai1[1], ai[2], ai1[2]);
  663.                     }
  664.                     g1.setColor(color);
  665.                     if(flag1 && stackedOn)
  666.                         g1.setColor(color.darker().darker());
  667.                     else
  668.                     if(flag1 || stackedOn)
  669.                         g1.setColor(color.darker());
  670.                     if(seriesLinesOn[i] || flag)
  671.                     {
  672.                         g1.drawLine(ai[0], ai1[0], ai[1], ai1[1]);
  673.                         if(!flag1 && !stackedOn && lineWidth[i] > 1 && (seriesLinesOn[i] || flag))
  674.                         {
  675.                             double d5 = 0.0D;
  676.                             if(ai[1] - ai[0] != 0)
  677.                                 d5 = Math.abs((double)(ai1[1] - ai1[0]) / (double)(ai[1] - ai[0]));
  678.                             int k2 = 1;
  679.                             for(int i3 = 2; i3 <= lineWidth[i]; i3++)
  680.                             {
  681.                                 int j3 = (i3 / 2) * k2;
  682.                                 if(d5 <= 1.0D)
  683.                                     g1.drawLine(ai[0], ai1[0] + j3, ai[1], ai1[1] + j3);
  684.                                 else
  685.                                     g1.drawLine(ai[0] - j3, ai1[0], ai[1] - j3, ai1[1]);
  686.                                 k2 = -k2;
  687.                             }
  688.                         }
  689.                     }
  690.                     if(flag && seriesLinesOn[i] && !flag1 && !stackedOn)
  691.                     {
  692.                         double d6 = 0.0D;
  693.                         if(ai[1] - ai[0] != 0)
  694.                             d6 = Math.abs((double)(ai1[1] - ai1[0]) / (double)(ai[1] - ai[0]));
  695.                         int l2 = lineWidth[i] / 2 + 1;
  696.                         g1.setColor(color.darker().darker());
  697.                         if(d6 <= 1.0D)
  698.                             g1.drawLine(ai[0], ai1[0] + l2, ai[1], ai1[1] + l2);
  699.                         else
  700.                             g1.drawLine(ai[0] - l2, ai1[0], ai[1] - l2, ai1[1]);
  701.                     }
  702.                 }
  703.             }
  704.             d1 += d;
  705.         }
  706.         if(!flag1)
  707.         {
  708.             d1 = rectangle1.x + 1;
  709.             for(int l = 0; l < achartsample.length; l++)
  710.             {
  711.                 ChartSample chartsample = achartsample[l];
  712.                 if(chartsample != null && chartsample.value != null && !chartsample.value.isNaN() && sampleHighlightOn[i][l])
  713.                 {
  714.                     int k1 = calculateYPos(i, l, rectangle1);
  715.                     boolean flag6 = k1 >= rectangle.y && k1 <= rectangle.y + rectangle.height && d1 >= (double)rectangle.x && d1 <= (double)(rectangle.x + rectangle.width + 1);
  716.                     if(flag6)
  717.                         paintSampleHighlight(g, i, (int)Math.round(d1), k1, color);
  718.                 }
  719.                 d1 += d;
  720.             }
  721.         }
  722.         d1 = rectangle1.x + 1;
  723.         for(int i1 = 0; i1 < achartsample.length; i1++)
  724.         {
  725.             int j1 = calculateYPos(i, i1, rectangle1);
  726.             if(samplePosition != null && i < samplePosition.length && samplePosition[i] != null && i1 < samplePosition[i].length && samplePosition[i][i1] != null)
  727.             {
  728.                 samplePosition[i][i1].x = (int)Math.round(d1);
  729.                 samplePosition[i][i1].y = Math.round(j1);
  730.             }
  731.             d1 += d;
  732.         }
  733.         g.setClip(0, 0, 32767, 32767);
  734.     }
  735.     public boolean isAutoLabelSpacingOn()
  736.     {
  737.         return autoLabelSpacingOn;
  738.     }
  739.     public boolean isStackedOn()
  740.     {
  741.         return stackedOn;
  742.     }
  743.     public boolean isConnectedLinesOn(int i)
  744.     {
  745.         if(i >= 0 && i < connectedLinesOn.length)
  746.             return connectedLinesOn[i];
  747.         if(i == -1)
  748.         {
  749.             boolean flag = false;
  750.             for(int j = 0; j < connectedLinesOn.length; j++)
  751.                 if(connectedLinesOn[j])
  752.                     flag = true;
  753.             return flag;
  754.         } else
  755.         {
  756.             return false;
  757.         }
  758.     }
  759.     public void setLegendImage(int i, String s)
  760.     {
  761.         if(i >= 0 && i < 1000)
  762.         {
  763.             super.setLegendImage(i, s);
  764.             if(highlightImages == null)
  765.                 highlightImages = new String[i + 1];
  766.             if(i >= highlightImages.length)
  767.             {
  768.                 String as[] = new String[i + 1];
  769.                 System.arraycopy(highlightImages, 0, as, 0, highlightImages.length);
  770.                 highlightImages = as;
  771.             }
  772.             highlightImages[i] = s;
  773.             super.hasChanged = true;
  774.             autoRepaint();
  775.         }
  776.     }
  777.     private String constructFloatingLabel(int i, int j, boolean flag)
  778.     {
  779.         if(i < 0 || i >= getSeriesCount() || j < 0 || j >= getSampleCount())
  780.             return "";
  781.         String s = "";
  782.         if(flag)
  783.         {
  784.             String s1 = getSeriesLabel(i);
  785.             if(s1 != null)
  786.             {
  787.                 s += s1;
  788.                 if(!s1.endsWith("n") && super.sampleLabelsOn && sampleLabelStyle == 2 && getSampleLabel(j) != null)
  789.                     s += " : ";
  790.             }
  791.         }
  792.         if(super.sampleLabelsOn && sampleLabelStyle == 2 && getSampleLabel(j) != null)
  793.             s += getSampleLabel(j);
  794.         if(isValueLabelsOn() && valueLabelStyle == 2)
  795.         {
  796.             String s2 = getLabel("valueLabelPrefix_" + i);
  797.             if(s2 == null)
  798.                 s2 = getLabel("valueLabelPrefix");
  799.             String s3 = getLabel("valueLabelPostfix_" + i);
  800.             if(s3 == null)
  801.                 s3 = getLabel("valueLabelPostfix");
  802.             if(s.length() > 0)
  803.             {
  804.                 String s4 = formatNumber(getSampleValue(i, j), getSampleDecimalCount(i));
  805.                 s4 = s2 == null ? s4 : s2 + s4;
  806.                 s4 = s3 == null ? s4 : s4 + s3;
  807.                 if(s.endsWith("n"))
  808.                     s += s4;
  809.                 else
  810.                     s = s + " : " + s4;
  811.             } else
  812.             {
  813.                 s = formatNumber(getSampleValue(i, j), getSampleDecimalCount(i));
  814.                 s = s2 == null ? s : s2 + s;
  815.                 s = s3 == null ? s : s + s3;
  816.             }
  817.         }
  818.         return s;
  819.     }
  820.     private int calculateYPos(int i, int j, Rectangle rectangle)
  821.     {
  822.         double d = 0.0D;
  823.         if(i >= 0 && stackedOn)
  824.         {
  825.             for(int k = 0; k <= i; k++)
  826.                 d += getSampleValue(k, j);
  827.         } else
  828.         if(i >= 0)
  829.             d = getSampleValue(i, j);
  830.         int l = getSeriesRange(i);
  831.         double d1 = 0.0D;
  832.         if(super.currentUpperRange[l] - super.currentLowerRange[l] != 0.0D)
  833.             d1 = (d - super.currentLowerRange[l]) / (super.currentUpperRange[l] - super.currentLowerRange[l]);
  834.         int i1 = (rectangle.y + rectangle.height) - (int)(d1 * (double)rectangle.height);
  835.         boolean flag = is3DModeOn();
  836.         if(flag && stackedOn)
  837.             i1 -= super.depth3dPoint.y;
  838.         else
  839.         if(flag)
  840.         {
  841.             i1 -= super.depth3dPoint.y;
  842.             double d2 = ((double)super.depth3dPoint.y / (double)getSeriesCount()) * (double)i;
  843.             i1 += (int)Math.round(d2);
  844.         }
  845.         return i1;
  846.     }
  847.     private void paintValueLabels(Graphics g, Rectangle rectangle, Rectangle rectangle1, int i, boolean flag)
  848.     {
  849.         if(valueLabelStyle == 2)
  850.             return;
  851.         Font font = getFont("valueLabelFont");
  852.         g.setFont(font);
  853.         FontMetrics fontmetrics = g.getFontMetrics();
  854.         int j = fontmetrics.getAscent();
  855.         int k = getSampleDecimalCount(i);
  856.         int l = getSampleCount();
  857.         int i1 = getSeriesCount();
  858.         int j1 = getLabelAngle("valueLabelAngle");
  859.         getSize();
  860.         double d = rectangle1.x;
  861.         double d1 = rectangle1.width;
  862.         if(l > 2)
  863.             d1 = (double)rectangle1.width / (double)(l - 1);
  864.         double d2 = super.depth3dPoint.x;
  865.         boolean flag1 = is3DModeOn();
  866.         if(flag1)
  867.         {
  868.             d -= super.depth3dPoint.x;
  869.             double d3 = ((double)super.depth3dPoint.x / (double)i1) * (double)i;
  870.             d += d3;
  871.         }
  872.         g.setColor(getChartForeground());
  873.         String s = getLabel("valueLabelPrefix_" + i);
  874.         if(s == null)
  875.             s = getLabel("valueLabelPrefix");
  876.         String s1 = getLabel("valueLabelPostfix_" + i);
  877.         if(s1 == null)
  878.             s1 = getLabel("valueLabelPostfix");
  879.         ChartSample achartsample[] = getSamples(i);
  880.         for(int k1 = 0; k1 < achartsample.length; k1++)
  881.         {
  882.             if(!flag && (achartsample[k1] == null || achartsample[k1].value == null || achartsample[k1].value.isNaN()))
  883.             {
  884.                 d += d1;
  885.                 continue;
  886.             }
  887.             double d4 = 0.0D;
  888.             if(flag)
  889.             {
  890.                 boolean flag2 = false;
  891.                 for(int l1 = 0; l1 < i1; l1++)
  892.                 {
  893.                     ChartSample chartsample = getSample(l1, k1);
  894.                     if(chartsample != null && chartsample.value != null && !chartsample.value.isNaN())
  895.                     {
  896.                         d4 += chartsample.value.doubleValue();
  897.                         flag2 = true;
  898.                     }
  899.                 }
  900.                 if(!flag2)
  901.                 {
  902.                     d += d1;
  903.                     continue;
  904.                 }
  905.             } else
  906.             {
  907.                 d4 = achartsample[k1].getFloatValue();
  908.             }
  909.             String s2 = formatNumber(d4, k);
  910.             s2 = s == null ? s2 : s + s2;
  911.             s2 = s1 == null ? s2 : s2 + s1;
  912.             Dimension dimension = getLabelSize(s2, font);
  913.             Dimension dimension1 = getAngledLabelSize(dimension, j1);
  914.             int i2 = (int)Math.round(d - (double)(dimension1.width / 2)) + 1;
  915.             if(valueLabelStyle == 0)
  916.             {
  917.                 if(flag1)
  918.                     i2 = Math.max((rectangle1.x - super.depth3dPoint.x) + 2, i2);
  919.                 else
  920.                     i2 = Math.max(rectangle1.x + 2, i2);
  921.                 i2 = Math.min(i2, (rectangle.x + rectangle.width) - dimension1.width - 1);
  922.             }
  923.             if(j1 % 360 > 90 && j1 % 360 < 180 || j1 % 360 > 270)
  924.                 i2 = (int)(d - (double)(fontmetrics.getAscent() / 2));
  925.             int j2 = calculateYPos(i, k1, rectangle1) - 1;
  926.             int k2 = j2;
  927.             if(j1 % 180 != 0)
  928.                 k2 -= dimension1.height + 1;
  929.             if(valueLabelStyle == 1)
  930.             {
  931.                 if(j1 % 180 == 0)
  932.                     k2 += j / 2;
  933.                 else
  934.                     k2 = j2 - dimension1.height / 2;
  935.             } else
  936.             if(!stackedOn)
  937.             {
  938.                 double d5 = k1 <= 0 || achartsample[k1 - 1] == null ? d4 : achartsample[k1 - 1].getFloatValue();
  939.                 double d7 = k1 >= achartsample.length - 1 || achartsample[k1 + 1] == null ? d4 : achartsample[k1 + 1].getFloatValue();
  940.                 double d9 = (d4 - d5) / d1;
  941.                 double d10 = (d7 - d4) / d1;
  942.                 if(d9 < d10)
  943.                 {
  944.                     if(j1 % 180 == 0)
  945.                         k2 += j;
  946.                     else
  947.                         k2 += dimension1.height + 4;
  948.                     if(j1 % 360 > 90 && j1 % 360 < 180 || j1 % 360 > 270)
  949.                         i2 = (int)((d - (double)dimension1.width) + (double)(fontmetrics.getAscent() / 2));
  950.                 } else
  951.                 if(flag1)
  952.                 {
  953.                     double d11 = (double)super.depth3dPoint.x / (double)i1;
  954.                     i2 = (int)((double)i2 + d11);
  955.                     d11 = (double)super.depth3dPoint.y / (double)i1;
  956.                     k2 = (int)((double)k2 + d11);
  957.                 }
  958.                 try
  959.                 {
  960.                     boolean flag4 = sampleHighlightOn[i][k1];
  961.                     int l2 = sampleHighlightSize[i];
  962.                     if(flag4 && d9 < d10)
  963.                         k2 += l2 / 2;
  964.                     else
  965.                     if(flag4)
  966.                         k2 -= l2 / 2;
  967.                 }
  968.                 catch(IndexOutOfBoundsException indexoutofboundsexception)
  969.                 {
  970.                     System.out.println("Internal error with value labels");
  971.                     indexoutofboundsexception.printStackTrace();
  972.                 }
  973.             }
  974.             boolean flag3 = true;
  975.             if(flag1)
  976.             {
  977.                 if(j2 <= k2)
  978.                 {
  979.                     flag3 = j2 >= rectangle.y - 2 && j2 <= (rectangle.y + rectangle.height + 2) - super.depth3dPoint.y && d >= (double)(rectangle.x - 2 - super.depth3dPoint.x) && d <= (double)(rectangle.x + rectangle.width + 2);
  980.                 } else
  981.                 {
  982.                     double d6 = (double)super.depth3dPoint.x / (double)i1;
  983.                     double d8 = (double)super.depth3dPoint.y / (double)i1;
  984.                     flag3 = (double)j2 >= (double)rectangle.y - d8 - 2D && (double)j2 <= (double)((rectangle.y + rectangle.height) - super.depth3dPoint.y) - d8 && d >= (double)(rectangle.x - super.depth3dPoint.x) - d6 - 2D && d <= ((double)(rectangle.x + rectangle.width) - d6) + 2D;
  985.                 }
  986.             } else
  987.             {
  988.                 flag3 = j2 >= rectangle.y - 2 && j2 <= rectangle.y + rectangle.height + 2 && d >= (double)(rectangle.x - 4) && d <= (double)(rectangle.x + rectangle.width + 2);
  989.             }
  990.             if(flag3)
  991.                 paintLabel(g, s2, i2, k2, dimension, 0, j1);
  992.             d += d1;
  993.         }
  994.     }
  995.     public void render(Graphics g)
  996.     {
  997.         render(g, !isServletModeOn());
  998.     }
  999.     void render(Graphics g, boolean flag)
  1000.     {
  1001.         Dimension dimension = getSize();
  1002.         Rectangle rectangle = getGraphBounds();
  1003.         Rectangle rectangle1 = getDataBounds(rectangle);
  1004.         calculateChartData(rectangle, rectangle1);
  1005.         for(int i = 0; i < super.overlayCharts.size(); i++)
  1006.         {
  1007.             Chart chart = (Chart)super.overlayCharts.elementAt(i);
  1008.             if(chart != null)
  1009.             {
  1010.                 Rectangle rectangle2 = new Rectangle(rectangle);
  1011.                 Rectangle rectangle4 = new Rectangle(rectangle1);
  1012.                 if(is3DModeOn())
  1013.                 {
  1014.                     rectangle2.x -= super.depth3dPoint.x;
  1015.                     rectangle2.y -= super.depth3dPoint.y;
  1016.                     rectangle4.x -= super.depth3dPoint.x;
  1017.                     rectangle4.y -= super.depth3dPoint.y;
  1018.                 }
  1019.                 chart.calculateChartData(rectangle2, rectangle4);
  1020.             }
  1021.         }
  1022.         if(flag && super.offscreen == null)
  1023.         {
  1024.             super.offscreen = createImage(Math.max(1, dimension.width), Math.max(1, dimension.height));
  1025.             super.hasChanged = true;
  1026.         }
  1027.         if(!flag || super.hasChanged || super.offscreen == null)
  1028.         {
  1029.             if(!super.externalGraphicsOn && !flag)
  1030.                 super.og = g;
  1031.             else
  1032.             if(flag || super.externalGraphicsOn)
  1033.             {
  1034.                 if(!super.externalGraphicsOn && super.offscreen != null)
  1035.                     super.og = super.offscreen.getGraphics();
  1036.                 super.og.setColor(getBackground());
  1037.                 super.og.fillRect(0, 0, dimension.width, dimension.height);
  1038.             }
  1039.             paintGrid(super.og, rectangle);
  1040.             paintTitle(super.og, dimension);
  1041.             if(super.sampleLabelsOn && sampleLabelStyle != 2)
  1042.                 paintSampleLabels(super.og, rectangle, rectangle1);
  1043.             if(isLegendOn())
  1044.                 paintLegend(super.og, rectangle, getLegendLabels());
  1045.             renderData(super.og, rectangle, rectangle1);
  1046.             for(int j = 0; j < super.overlayCharts.size(); j++)
  1047.             {
  1048.                 Chart chart1 = (Chart)super.overlayCharts.elementAt(j);
  1049.                 if(chart1 != null && isOverlayChartOn(j))
  1050.                 {
  1051.                     Rectangle rectangle3 = new Rectangle(rectangle);
  1052.                     Rectangle rectangle5 = new Rectangle(rectangle1);
  1053.                     rectangle3.x -= super.depth3dPoint.x;
  1054.                     rectangle3.y -= super.depth3dPoint.y;
  1055.                     rectangle5.x -= super.depth3dPoint.x;
  1056.                     rectangle5.y -= super.depth3dPoint.y;
  1057.                     if((chart1 instanceof LineChart) || (chart1 instanceof PieChart))
  1058.                         chart1.renderData(super.og, rectangle3, rectangle5);
  1059.                     else
  1060.                         chart1.renderData(super.og, rectangle, rectangle1);
  1061.                 }
  1062.             }
  1063.             if(is3DModeOn())
  1064.             {
  1065.                 for(int k = super.rangeOn.length - 1; k >= 0; k--)
  1066.                     paint3DZeroDivider(super.og, rectangle, k);
  1067.                 if(isRangeOn(1))
  1068.                     paint3DEdges(super.og, rectangle);
  1069.             }
  1070.             if(!super.externalGraphicsOn && super.og != g)
  1071.                 super.og.dispose();
  1072.             super.hasChanged = false;
  1073.         }
  1074.         if((flag || super.externalGraphicsOn) && super.offscreen != null)
  1075.             g.drawImage(super.offscreen, 0, 0, this);
  1076.         paintFloatingLabels(g, rectangle);
  1077.     }
  1078.     private void paintLines(Graphics g, Rectangle rectangle, Rectangle rectangle1)
  1079.     {
  1080.         int i = getSeriesCount();
  1081.         if(i > 0)
  1082.         {
  1083.             for(int j = i - 1; j >= 0; j--)
  1084.             {
  1085.                 int i1 = getSeriesRange(j);
  1086.                 if(super.currentUpperRange[i1] != super.currentLowerRange[i1])
  1087.                     paintLine(g, j, rectangle, rectangle1, getSampleColor(j), isSelected(j, -1));
  1088.             }
  1089.             if(!is3DModeOn() && lastSelectedLine >= 0)
  1090.             {
  1091.                 int k = lastSelectedLine;
  1092.                 paintLine(g, k, rectangle, rectangle1, getSampleColor(k), isSelected(k, -1));
  1093.             }
  1094.             if(stackedOn)
  1095.             {
  1096.                 if(isValueLabelsOn(0))
  1097.                     paintValueLabels(g, rectangle, rectangle1, i - 1, true);
  1098.             } else
  1099.             {
  1100.                 for(int l = i - 1; l >= 0; l--)
  1101.                     if(isValueLabelsOn(l))
  1102.                         paintValueLabels(g, rectangle, rectangle1, l, false);
  1103.             }
  1104.         }
  1105.     }
  1106.     public int getValuePosition(double d)
  1107.     {
  1108.         return getValuePosition(0, d, getGraphBounds());
  1109.     }
  1110.     public void setSeriesLabelsOn(boolean flag)
  1111.     {
  1112.         seriesLabelsOn = flag;
  1113.         super.hasChanged = true;
  1114.         autoRepaint();
  1115.     }
  1116.     public void setSampleHighlightOn(boolean flag)
  1117.     {
  1118.         for(int i = 0; i < sampleHighlightOn.length; i++)
  1119.         {
  1120.             for(int j = 0; j < sampleHighlightOn[i].length; j++)
  1121.                 sampleHighlightOn[i][j] = flag;
  1122.         }
  1123.         super.hasChanged = true;
  1124.         autoRepaint();
  1125.     }
  1126.     public void setSampleHighlightOn(int i, boolean flag)
  1127.     {
  1128.         try
  1129.         {
  1130.             for(int j = 0; j < sampleHighlightOn[i].length; j++)
  1131.                 sampleHighlightOn[i][j] = flag;
  1132.         }
  1133.         catch(IndexOutOfBoundsException _ex)
  1134.         {
  1135.             throw new IllegalArgumentException("Invalid series: " + i);
  1136.         }
  1137.         super.hasChanged = true;
  1138.         autoRepaint();
  1139.     }
  1140.     public void setSampleHighlightOn(int i, int j, boolean flag)
  1141.     {
  1142.         try
  1143.         {
  1144.             sampleHighlightOn[i][j] = flag;
  1145.         }
  1146.         catch(IndexOutOfBoundsException _ex)
  1147.         {
  1148.             throw new IllegalArgumentException("Invalid series or index: " + i + ", " + j);
  1149.         }
  1150.         super.hasChanged = true;
  1151.         autoRepaint();
  1152.     }
  1153.     public int getSampleHighlightSize(int i)
  1154.     {
  1155.         try
  1156.         {
  1157.             return sampleHighlightSize[i];
  1158.         }
  1159.         catch(IndexOutOfBoundsException _ex)
  1160.         {
  1161.             throw new IllegalArgumentException("Invalid series: " + i);
  1162.         }
  1163.     }
  1164.     protected void checkDataIntegrity()
  1165.     {
  1166.         super.checkDataIntegrity();
  1167.         int i = getSeriesCount();
  1168.         int j = getSampleCount();
  1169.         int k = sampleHighlightOn.length;
  1170.         int l = k <= 0 ? 0 : sampleHighlightOn[0].length;
  1171.         if(i != k || j != l)
  1172.         {
  1173.             boolean aflag[][] = new boolean[i][j];
  1174.             for(int j1 = 0; j1 < i; j1++)
  1175.             {
  1176.                 for(int l1 = 0; l1 < j; l1++)
  1177.                     if(j1 < k && l1 < l)
  1178.                         aflag[j1][l1] = sampleHighlightOn[j1][l1];
  1179.             }
  1180.             sampleHighlightOn = aflag;
  1181.             int ai[] = new int[i];
  1182.             int ai1[] = new int[i];
  1183.             boolean aflag1[] = new boolean[i];
  1184.             boolean aflag2[] = new boolean[i];
  1185.             int ai2[] = new int[i];
  1186.             for(int i2 = 0; i2 < i; i2++)
  1187.                 if(i2 < k)
  1188.                 {
  1189.                     ai[i2] = sampleHighlightStyle[i2];
  1190.                     ai1[i2] = sampleHighlightSize[i2];
  1191.                     aflag1[i2] = seriesLinesOn[i2];
  1192.                     aflag2[i2] = connectedLinesOn[i2];
  1193.                     ai2[i2] = lineWidth[i2];
  1194.                 } else
  1195.                 {
  1196.                     ai1[i2] = 6;
  1197.                     aflag1[i2] = true;
  1198.                     ai2[i2] = 2;
  1199.                 }
  1200.             sampleHighlightStyle = ai;
  1201.             sampleHighlightSize = ai1;
  1202.             seriesLinesOn = aflag1;
  1203.             connectedLinesOn = aflag2;
  1204.             lineWidth = ai2;
  1205.         }
  1206.         samplePosition = new Point[i][j];
  1207.         for(int i1 = 0; i1 < samplePosition.length; i1++)
  1208.         {
  1209.             for(int k1 = 0; k1 < samplePosition[i1].length; k1++)
  1210.                 samplePosition[i1][k1] = new Point();
  1211.         }
  1212.         if(lastSelectedLine >= i)
  1213.             lastSelectedLine = -1;
  1214.     }
  1215.     public Rectangle getGraphBounds()
  1216.     {
  1217.         if(!super.hasChanged && super.currentBounds != null)
  1218.             return super.currentBounds;
  1219.         Rectangle rectangle = super.getGraphBounds(getLegendLabels());
  1220.         Dimension dimension = getSize();
  1221.         int i = rectangle.x;
  1222.         int j = dimension.width - rectangle.width - rectangle.x;
  1223.         int k = rectangle.y;
  1224.         int l = dimension.height - rectangle.height - rectangle.y;
  1225.         for(int i1 = 0; i1 < super.rangeAdjusterOn.length; i1++)
  1226.             if(super.rangeAdjusterOn[i1])
  1227.                 if(super.rangeAdjusterPosition[i1] == 0)
  1228.                     i += 6;
  1229.                 else
  1230.                     j += 6;
  1231.         if(super.sampleLabelsOn && getSampleCount() > 0 && sampleLabelStyle != 2)
  1232.         {
  1233.             Font font = getFont("sampleLabelFont");
  1234.             FontMetrics fontmetrics = getFontMetrics(font);
  1235.             int k1 = 0;
  1236.             int j2 = getLabelAngle("sampleLabelAngle");
  1237.             String as[] = getSampleLabels();
  1238.             for(int k3 = 0; k3 < as.length; k3++)
  1239.             {
  1240.                 Dimension dimension2 = getLabelSize(as[k3], font);
  1241.                 Dimension dimension5 = getAngledLabelSize(dimension2, j2);
  1242.                 k1 = Math.max(dimension5.height, k1);
  1243.             }
  1244.             l += k1 + 3;
  1245.             if(j2 % 180 == 0)
  1246.                 l -= fontmetrics.getMaxDescent();
  1247.             String s4 = getSampleLabel(getSampleCount() - 1);
  1248.             int j4 = 0;
  1249.             if(s4 != null)
  1250.             {
  1251.                 Dimension dimension6 = getLabelSize(s4, font);
  1252.                 Dimension dimension8 = getAngledLabelSize(dimension6, j2);
  1253.                 j4 = dimension8.width / 2 - 5;
  1254.             }
  1255.             int i5 = 0;
  1256.             if(isLegendOn() && getLegendPosition() == 1)
  1257.                 i5 = super.legend.width;
  1258.             if(j4 > i5)
  1259.                 j += j4 - i5;
  1260.         }
  1261.         boolean flag = false;
  1262.         for(int j1 = 0; j1 < super.rangeOn.length; j1++)
  1263.             flag = super.rangeOn[j1] ? true : flag;
  1264.         if(flag || super.rangeLabelsOn || super.targetsLabel.size() > 0)
  1265.         {
  1266.             FontMetrics fontmetrics1 = getFontMetrics(getFont("rangeLabelFont"));
  1267.             String s1 = getLabel("rangeLabelPrefix");
  1268.             String s2 = getLabel("rangeLabelPostfix");
  1269.             int l2 = 0;
  1270.             int l3 = 0;
  1271.             for(Enumeration enumeration = super.targetsLabel.keys(); enumeration.hasMoreElements();)
  1272.             {
  1273.                 String s5 = (String)enumeration.nextElement();
  1274.                 String s8 = getTargetLabel(s5);
  1275.                 if(s8 != null && s8.length() > 0)
  1276.                     if(super.rangePosition[0] == 0)
  1277.                         l2 = Math.max(l2, fontmetrics1.stringWidth(s8));
  1278.                     else
  1279.                         l3 = Math.max(l3, fontmetrics1.stringWidth(s8));
  1280.             }
  1281.             if(super.rangeLabelsOn && super.rangeOn[0])
  1282.             {
  1283.                 int k4 = getRangeDecimalCount(0);
  1284.                 String s6 = formatNumber(super.upperRange[0], k4);
  1285.                 String s9 = formatNumber(super.lowerRange[0], k4);
  1286.                 s6 = s1 == null ? s6 : s1 + s6;
  1287.                 s9 = s1 == null ? s9 : s1 + s9;
  1288.                 s6 = s2 == null ? s6 : s6 + s2;
  1289.                 s9 = s2 == null ? s9 : s9 + s2;
  1290.                 if(super.rangePosition[0] == 0)
  1291.                 {
  1292.                     l2 = Math.max(l2, fontmetrics1.stringWidth(s6));
  1293.                     l2 = Math.max(l2, fontmetrics1.stringWidth(s9));
  1294.                 } else
  1295.                 {
  1296.                     l3 = Math.max(l3, fontmetrics1.stringWidth(s6));
  1297.                     l3 = Math.max(l3, fontmetrics1.stringWidth(s9));
  1298.                 }
  1299.             }
  1300.             if(super.rangeOn[1])
  1301.             {
  1302.                 int l4 = getRangeDecimalCount(1);
  1303.                 String s7 = formatNumber(super.upperRange[1], l4);
  1304.                 String s10 = formatNumber(super.lowerRange[1], l4);
  1305.                 if(super.rangePosition[1] == 0)
  1306.                 {
  1307.                     l2 = Math.max(l2, fontmetrics1.stringWidth(s7));
  1308.                     l2 = Math.max(l2, fontmetrics1.stringWidth(s10));
  1309.                 } else
  1310.                 {
  1311.                     l3 = Math.max(l3, fontmetrics1.stringWidth(s7));
  1312.                     l3 = Math.max(l3, fontmetrics1.stringWidth(s10));
  1313.                 }
  1314.             }
  1315.             i += l2 + 2;
  1316.             j += l3 <= 0 ? 0 : l3 + 2;
  1317.         }
  1318.         String s = getLabel("sampleAxisLabel");
  1319.         if(s != null)
  1320.         {
  1321.             Font font1 = getFont("sampleAxisLabelFont");
  1322.             FontMetrics fontmetrics2 = getFontMetrics(font1);
  1323.             int i3 = getLabelAngle("sampleAxisLabelAngle");
  1324.             Dimension dimension1 = getLabelSize(s, font1);
  1325.             Dimension dimension3 = getAngledLabelSize(dimension1, i3);
  1326.             l += dimension3.height + 3;
  1327.             if(i3 % 180 == 0)
  1328.                 l -= fontmetrics2.getDescent();
  1329.         }
  1330.         int l1 = 0;
  1331.         do
  1332.         {
  1333.             String s3 = l1 != 0 ? getLabel("rangeAxisLabel_2") : getLabel("rangeAxisLabel");
  1334.             if(s3 != null)
  1335.             {
  1336.                 Font font2 = getFont("rangeAxisLabelFont");
  1337.                 getFontMetrics(font2);
  1338.                 int i4 = l1 != 0 ? getLabelAngle("rangeAxisLabelAngle_2") : getLabelAngle("rangeAxisLabelAngle");
  1339.                 Dimension dimension4 = getLabelSize(s3, font2);
  1340.                 Dimension dimension7 = getAngledLabelSize(dimension4, i4);
  1341.                 if(super.rangePosition[l1] == 0)
  1342.                     i += dimension7.width + 20;
  1343.                 else
  1344.                     j += dimension7.width + 20;
  1345.             }
  1346.         } while(++l1 < 2);
  1347.         if(is3DModeOn())
  1348.             if(super.depth3d > -1)
  1349.             {
  1350.                 i += super.depth3dPoint.x;
  1351.                 l -= super.depth3dPoint.y;
  1352.             } else
  1353.             {
  1354.                 int i2 = Math.max(20, getSampleCount());
  1355.                 int k2 = getSeriesCount();
  1356.                 if(k2 > 1 && !stackedOn)
  1357.                 {
  1358.                     i2 /= k2;
  1359.                     i2 = Math.max(i2, 4);
  1360.                 }
  1361.                 int j3 = (int)(((float)rectangle.width * 1.25F) / ((float)i2 + 1.25F));
  1362.                 i += j3;
  1363.                 rectangle.width = dimension.width - i - j;
  1364.                 double d = rectangle.width / i2;
  1365.                 l += (int)Math.round(d / 1.25D);
  1366.             }
  1367.         Insets insets = getGraphInsets();
  1368.         if(insets != null)
  1369.         {
  1370.             k = insets.top != -1 ? insets.top : k;
  1371.             i = insets.left != -1 ? insets.left : i;
  1372.             l = insets.bottom != -1 ? insets.bottom : l;
  1373.             j = insets.right != -1 ? insets.right : j;
  1374.         }
  1375.         rectangle.x = i;
  1376.         rectangle.width = dimension.width - i - j - 1;
  1377.         rectangle.y = k;
  1378.         rectangle.height = dimension.height - k - l - 1;
  1379.         super.currentBounds = rectangle;
  1380.         return rectangle;
  1381.     }
  1382.     private void paint3DLine(Graphics g, int i, int j, int k, int l, int i1, Color color, 
  1383.             boolean flag, boolean flag1)
  1384.     {
  1385.         int ai[] = new int[4];
  1386.         int ai1[] = new int[4];
  1387.         int j1 = stackedOn ? 1 : Math.max(1, getSeriesCount());
  1388.         int k1 = (int)Math.round((double)super.depth3dPoint.x / (double)j1);
  1389.         int l1 = (int)Math.round((double)super.depth3dPoint.y / (double)j1);
  1390.         ai[0] = i;
  1391.         ai1[0] = j;
  1392.         ai[1] = i + k1;
  1393.         ai1[1] = j + l1;
  1394.         ai[2] = ai[1] + (k - i);
  1395.         ai1[2] = l + l1;
  1396.         ai[3] = k;
  1397.         ai1[3] = l;
  1398.         Color color1 = color.darker();
  1399.         if(flag)
  1400.         {
  1401.             double d = 0.0D;
  1402.             if(ai[1] - ai[0] != 0)
  1403.                 d = (double)(j - l) / (double)(k - i);
  1404.             if(d > 0.68999999999999995D)
  1405.                 g.setColor(color1);
  1406.             else
  1407.                 g.setColor(color);
  1408.             g.fillPolygon(ai, ai1, 4);
  1409.             g.setColor(color1);
  1410.             g.drawLine(ai[0], ai1[0], ai[1], ai1[1]);
  1411.             g.drawLine(ai[1], ai1[1], ai[2], ai1[2]);
  1412.             g.drawLine(ai[2], ai1[2], ai[3], ai1[3]);
  1413.         }
  1414.         if(flag1)
  1415.         {
  1416.             ai[0] = ai[3];
  1417.             ai1[0] = ai1[3];
  1418.             ai[1] = ai[2];
  1419.             ai1[1] = ai1[2];
  1420.             ai[2] = ai[2];
  1421.             ai1[2] = i1 + l1;
  1422.             ai[3] = ai[0];
  1423.             ai1[3] = i1;
  1424.             g.setColor(color);
  1425.             g.fillPolygon(ai, ai1, 4);
  1426.             g.setColor(color1);
  1427.             g.drawLine(ai[0], ai1[0], ai[1], ai1[1]);
  1428.             g.drawLine(ai[1], ai1[1], ai[2], ai1[2]);
  1429.             g.drawLine(ai[2], ai1[2], ai[3], ai1[3]);
  1430.             g.drawLine(ai[3], ai1[3], ai[0], ai1[0]);
  1431.         }
  1432.     }
  1433.     private void paint3DZeroDivider(Graphics g, Rectangle rectangle, int i)
  1434.     {
  1435.         i = Math.min(super.rangeOn.length - 1, Math.max(0, i));
  1436.         if(super.rangeOn[i])
  1437.         {
  1438.             int j = Math.max(super.zeroLine[i], rectangle.y);
  1439.             j = Math.min(j, rectangle.y + rectangle.height);
  1440.             int k = rectangle.x - super.depth3dPoint.x;
  1441.             int l = j - super.depth3dPoint.y;
  1442.             g.setColor(i != 0 ? getRangeColor(i) : getChartForeground());
  1443.             g.drawLine(k, l, k + rectangle.width, l);
  1444.             g.drawLine(k + rectangle.width, l, rectangle.x + rectangle.width, j);
  1445.         }
  1446.     }
  1447.     private void paintFloatingLabel(Graphics g, Rectangle rectangle, int i, int j, String s, Font font, FontMetrics fontmetrics)
  1448.     {
  1449.         if(i < 0 || i >= getSeriesCount() || j < 0 || j >= getSampleCount())
  1450.             return;
  1451.         Point point = null;
  1452.         if(samplePosition != null && i < samplePosition.length && samplePosition[i] != null && j <= samplePosition[i].length)
  1453.             point = samplePosition[i][j];
  1454.         if(point == null)
  1455.             return;
  1456.         int k = 0;
  1457.         if(is3DModeOn())
  1458.             if(stackedOn)
  1459.             {
  1460.                 k = -super.depth3d;
  1461.             } else
  1462.             {
  1463.                 double d = (double)super.depth3dPoint.x / (double)getSeriesCount();
  1464.                 k = (int)Math.round(d * (double)i) - super.depth3dPoint.x;
  1465.             }
  1466.         if(point.x < rectangle.x || point.x > (rectangle.x + rectangle.width) - k)
  1467.             return;
  1468.         if(point.y < rectangle.y || point.y > (is3DModeOn() ? (rectangle.y + rectangle.height) - super.depth3dPoint.y : rectangle.y + rectangle.height))
  1469.         {
  1470.             return;
  1471.         } else
  1472.         {
  1473.             Dimension dimension = getLabelSize(s, font);
  1474.             int l = (point.x - dimension.width / 2) + k;
  1475.             int i1 = ((point.y - dimension.height) + fontmetrics.getAscent()) - 3;
  1476.             Dimension dimension1 = getSize();
  1477.             l = Math.max(l, 3);
  1478.             l = Math.min(l, dimension1.width - dimension.width - 3);
  1479.             i1 = Math.max(i1, fontmetrics.getAscent());
  1480.             i1 = Math.min(i1, ((dimension1.height - dimension.height) + fontmetrics.getAscent()) - 1);
  1481.             int j1 = fontmetrics.getHeight();
  1482.             int k1 = fontmetrics.getDescent();
  1483.             g.setColor(new Color(255, 255, 231));
  1484.             g.fillRect(l - 2, ((i1 - j1) + k1 * 2) - 2, dimension.width + 5, dimension.height);
  1485.             g.setColor(getChartForeground());
  1486.             g.setColor(getSampleColor(i).darker());
  1487.             g.drawRect(l - 3, ((i1 - j1) + k1 * 2) - 3, dimension.width + 5, dimension.height);
  1488.             g.setColor(Color.black);
  1489.             paintLabel(g, s, l, i1, dimension, 0, 0);
  1490.             return;
  1491.         }
  1492.     }
  1493.     public void setSampleHighlightStyle(int i, int j)
  1494.     {
  1495.         for(int k = 0; k < sampleHighlightStyle.length; k++)
  1496.             setSampleHighlightStyle(k, i, j);
  1497.     }
  1498.     public static final int SAMPLE_HIGHLIGHT_CIRCLE = 0;
  1499.     public static final int SAMPLE_HIGHLIGHT_CIRCLE_OPAQUE = 1;
  1500.     public static final int SAMPLE_HIGHLIGHT_CIRCLE_FILLED = 2;
  1501.     public static final int SAMPLE_HIGHLIGHT_SQUARE = 3;
  1502.     public static final int SAMPLE_HIGHLIGHT_SQUARE_OPAQUE = 4;
  1503.     public static final int SAMPLE_HIGHLIGHT_SQUARE_FILLED = 5;
  1504.     public static final int SAMPLE_HIGHLIGHT_DIAMOND = 6;
  1505.     public static final int SAMPLE_HIGHLIGHT_DIAMOND_OPAQUE = 7;
  1506.     public static final int SAMPLE_HIGHLIGHT_DIAMOND_FILLED = 8;
  1507.     public static final int VALUE_LABELS_OUTSIDE_POINT = 0;
  1508.     public static final int VALUE_LABELS_AT_POINT = 1;
  1509.     public static final int FLOATING = 2;
  1510.     public static final int BELOW = 3;
  1511.     private int valueLabelStyle;
  1512.     private int sampleLabelStyle;
  1513.     private boolean seriesLabelsOn;
  1514.     private boolean autoLabelSpacingOn;
  1515.     private int lineWidth[];
  1516.     private boolean stackedOn;
  1517.     private boolean sampleHighlightOn[][];
  1518.     private int sampleHighlightStyle[];
  1519.     private int sampleHighlightSize[];
  1520.     private boolean seriesLinesOn[];
  1521.     private boolean connectedLinesOn[];
  1522.     private String highlightImages[];
  1523.     private Point samplePosition[][];
  1524.     private int selectedSeries;
  1525.     private int selectedSample;
  1526.     private Point mousePosition;
  1527.     private int lastSelectedLine;
  1528. }