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

OA系统

开发平台:

Java

  1.         double d1 = getHighestValue(i);
  2.         double d2 = getLowestValue(i);
  3.         if(i == 0)
  4.         {
  5.             for(Enumeration enumeration = targetsValue.elements(); enumeration.hasMoreElements();)
  6.                 d1 = Math.max(((Double)enumeration.nextElement()).doubleValue(), d1);
  7.         }
  8.         if(d1 > 0.0D)
  9.             setRange(i, d1 * Math.abs(d));
  10.         else
  11.         if(d1 == 0.0D && d2 == 0.0D)
  12.             setRange(i, 100D);
  13.         else
  14.             setRange(i, 0.0D);
  15.     }
  16.     public boolean isPrintAsBitmap()
  17.     {
  18.         return printAsBitmap;
  19.     }
  20.     public int addOverlayChart(Chart chart)
  21.     {
  22.         if(chart != null)
  23.         {
  24.             chart.overlayChartOn = true;
  25.             chart.parentChart = this;
  26.             overlayCharts.addElement(chart);
  27.             chart.setRange(0, getRange(0));
  28.             chart.setRange(1, getRange(1));
  29.             chart.setLowerRange(0, getLowerRange(0));
  30.             chart.setLowerRange(1, getLowerRange(1));
  31.             hasChanged = true;
  32.             autoRepaint();
  33.             return overlayCharts.lastIndexOf(chart);
  34.         } else
  35.         {
  36.             return 0;
  37.         }
  38.     }
  39.     public int getLastSelectedSeries()
  40.     {
  41.         return lastSelectedSeries;
  42.     }
  43.     public synchronized void setRange(int i, double d)
  44.     {
  45.         i = Math.max(0, Math.min(1, i));
  46.         upperRange[i] = d;
  47.         currentUpperRange[i] = Math.min(currentUpperRange[i], d);
  48.         if(!rangeAdjusterOn[i])
  49.             currentUpperRange[i] = d;
  50.         for(int j = 0; j < overlayCharts.size(); j++)
  51.             ((Chart)overlayCharts.elementAt(j)).setRange(i, d);
  52.         hasChanged = true;
  53.         autoRepaint();
  54.     }
  55.     public synchronized double getRange(int i)
  56.     {
  57.         return upperRange[Math.max(0, Math.min(1, i))];
  58.     }
  59.     public void setCurrentLowerRange(int i, double d)
  60.     {
  61.         i = Math.min(currentLowerRange.length - 1, Math.max(0, i));
  62.         int j = rangeAdjusted[i];
  63.         if(i == 0 && j == 2)
  64.             j = 0;
  65.         else
  66.         if(i == 1 && j == 2)
  67.             j = 1;
  68.         d = Math.max(lowerRange[j], d);
  69.         d = Math.min(currentUpperRange[j], d);
  70.         currentLowerRange[j] = d;
  71.         hasChanged = true;
  72.         autoRepaint();
  73.     }
  74.     public double getCurrentLowerRange(int i)
  75.     {
  76.         i = Math.min(currentLowerRange.length - 1, Math.max(0, i));
  77.         return currentLowerRange[i];
  78.     }
  79.     /**
  80.      * @deprecated Method setRange is deprecated
  81.      */
  82.     public synchronized void setRange(double d)
  83.     {
  84.         setRange(0, d);
  85.     }
  86.     /**
  87.      * @deprecated Method getRange is deprecated
  88.      */
  89.     public synchronized long getRange()
  90.     {
  91.         return (long)getRange(0);
  92.     }
  93.     /**
  94.      * @deprecated Method setCurrentLowerRange is deprecated
  95.      */
  96.     public void setCurrentLowerRange(double d)
  97.     {
  98.         setCurrentLowerRange(0, d);
  99.     }
  100.     /**
  101.      * @deprecated Method getCurrentLowerRange is deprecated
  102.      */
  103.     public double getCurrentLowerRange()
  104.     {
  105.         return getCurrentLowerRange(0);
  106.     }
  107.     public Rectangle getDataBounds(Rectangle rectangle)
  108.     {
  109.         chartDataBounds.setBounds(rectangle);
  110.         double d = 1.0D - leftScrollerFactor - rightScrollerFactor;
  111.         if(gridAlignment == 1)
  112.         {
  113.             chartDataBounds.width = (int)Math.round((double)rectangle.width / d);
  114.             chartDataBounds.x -= Math.round(leftScrollerFactor * (double)chartDataBounds.width);
  115.         } else
  116.         {
  117.             chartDataBounds.height = (int)Math.round((double)rectangle.height / d);
  118.             chartDataBounds.y -= Math.round(leftScrollerFactor * (double)chartDataBounds.height);
  119.         }
  120.         return chartDataBounds;
  121.     }
  122.     void calculateZeroLines(Rectangle rectangle)
  123.     {
  124.         for(int i = 0; i < zeroLine.length; i++)
  125.             if(currentUpperRange[i] - currentLowerRange[i] != 0.0D)
  126.                 if(gridAlignment == 1)
  127.                 {
  128.                     int j = (int)Math.round((double)rectangle.height * (currentUpperRange[i] / (currentUpperRange[i] - currentLowerRange[i])));
  129.                     zeroLine[i] = rectangle.y + j;
  130.                 } else
  131.                 {
  132.                     int k = (int)Math.round((double)rectangle.width * (currentUpperRange[i] / (currentUpperRange[i] - currentLowerRange[i])));
  133.                     zeroLine[i] = (rectangle.x + rectangle.width) - k;
  134.                 }
  135.     }
  136.     public void setRangePosition(int i, int j)
  137.     {
  138.         rangePosition[Math.min(1, Math.max(0, i))] = Math.min(1, Math.max(0, j));
  139.         hasChanged = true;
  140.         autoRepaint();
  141.     }
  142.     public int getRangePosition(int i)
  143.     {
  144.         return rangePosition[Math.min(1, Math.max(0, i))];
  145.     }
  146.     public boolean isTitleOn()
  147.     {
  148.         return chartTitleOn;
  149.     }
  150.     public void setLegendPosition(int i)
  151.     {
  152.         if(i == 2 || i == 3 || i == 0 || i == 1)
  153.         {
  154.             legendPosition = i;
  155.             hasChanged = true;
  156.             autoRepaint();
  157.         } else
  158.         {
  159.             throw new IllegalArgumentException("Should be TOP, BOTTOM, LEFT, or RIGHT");
  160.         }
  161.     }
  162.     public int getLegendPosition()
  163.     {
  164.         return legendPosition;
  165.     }
  166.     public void addImage(String s, Image image)
  167.     {
  168.         if(s != null)
  169.             try
  170.             {
  171.                 if(image != null)
  172.                 {
  173.                     images.put(s, image);
  174.                     imageTracker.addImage(image, 0);
  175.                     imageTracker.waitForAll();
  176.                 } else
  177.                 {
  178.                     images.remove(s);
  179.                 }
  180.             }
  181.             catch(InterruptedException interruptedexception)
  182.             {
  183.                 interruptedexception.printStackTrace();
  184.             }
  185.     }
  186.     public void setRangeDecimalCount(int i, int j)
  187.     {
  188.         i = Math.max(0, Math.min(rangeDecimalCount.length - 1, i));
  189.         rangeDecimalCount[i] = j;
  190.         hasChanged = true;
  191.         autoRepaint();
  192.     }
  193.     public int getRangeDecimalCount(int i)
  194.     {
  195.         i = Math.max(0, Math.min(rangeDecimalCount.length - 1, i));
  196.         return rangeDecimalCount[i];
  197.     }
  198.     /**
  199.      * @deprecated Method setRangeDecimalCount is deprecated
  200.      */
  201.     public void setRangeDecimalCount(int i)
  202.     {
  203.         setRangeDecimalCount(0, i);
  204.     }
  205.     public void setLegendColors(Color acolor[])
  206.     {
  207.         legendColors = acolor;
  208.         hasChanged = true;
  209.         autoRepaint();
  210.     }
  211.     public Color[] getLegendColors()
  212.     {
  213.         return legendColors;
  214.     }
  215.     /**
  216.      * @deprecated Method getRangeDecimalCount is deprecated
  217.      */
  218.     public int getRangeDecimalCount()
  219.     {
  220.         return getRangeDecimalCount(0);
  221.     }
  222.     public static void main(String args[])
  223.     {
  224.         System.out.println("webgraph " + getVersion());
  225.         System.out.println("Copyright 2002-2003, 方成公司.");
  226.     }
  227.     public void setSampleColor(int i, Color color)
  228.     {
  229.         if(i < 0)
  230.         {
  231.             throw new IllegalArgumentException("Negativ index");
  232.         } else
  233.         {
  234.             sampleColors[i % sampleColors.length] = color;
  235.             hasChanged = true;
  236.             autoRepaint();
  237.             return;
  238.         }
  239.     }
  240.     public Color getSampleColor(int i)
  241.     {
  242.         Color color = DEFAULT_SAMPLE_COLORS[i % DEFAULT_SAMPLE_COLORS.length];
  243.         if(sampleColors != null && sampleColors.length > 0)
  244.         {
  245.             color = sampleColors[i % sampleColors.length];
  246.             if(color == null)
  247.             {
  248.                 int j = Math.min(sampleColors.length, DEFAULT_SAMPLE_COLORS.length);
  249.                 color = DEFAULT_SAMPLE_COLORS[i % j];
  250.             }
  251.         }
  252.         return color;
  253.     }
  254.     private void paintSampleScroller(Graphics g, Rectangle rectangle)
  255.     {
  256.         if(gridAlignment == 1)
  257.         {
  258.             int i = rectangle.x;
  259.             int k = rectangle.y + rectangle.height + 1;
  260.             if(display3dOn)
  261.             {
  262.                 i -= depth3dPoint.x;
  263.                 k -= depth3dPoint.y;
  264.             }
  265.             sampleScrollerBounds.x = i;
  266.             sampleScrollerBounds.y = k;
  267.             sampleScrollerBounds.height = 8;
  268.             sampleScrollerBounds.width = rectangle.width;
  269.             g.setColor(getBackground().darker());
  270.             g.drawLine(i, k + 4, i + sampleScrollerBounds.width, k + 4);
  271.             g.setColor(getBackground().brighter());
  272.             g.drawLine(i, k + 5, i + sampleScrollerBounds.width, k + 5);
  273.             paintBox(g, Color.lightGray, i, k, 8, 8, leftPushed);
  274.             i += leftPushed ? 1 : 0;
  275.             g.setColor(Color.black);
  276.             g.drawLine(i + 3, k + 4, i + 3, k + 4);
  277.             g.drawLine(i + 4, k + 3, i + 4, k + 5);
  278.             g.drawLine(i + 5, k + 2, i + 5, k + 6);
  279.             i = (sampleScrollerBounds.x + sampleScrollerBounds.width) - 8;
  280.             paintBox(g, Color.lightGray, i, k, 8, 8, rightPushed);
  281.             i += rightPushed ? 1 : 0;
  282.             g.setColor(Color.black);
  283.             g.drawLine(i + 3, k + 2, i + 3, k + 6);
  284.             g.drawLine(i + 4, k + 3, i + 4, k + 5);
  285.             g.drawLine(i + 5, k + 4, i + 5, k + 4);
  286.             sampleScrollerSpace = sampleScrollerBounds.width - 18;
  287.             int i1 = (int)Math.round(leftScrollerFactor * (double)sampleScrollerSpace);
  288.             i = rectangle.x + 9 + i1;
  289.             if(display3dOn)
  290.                 i -= depth3dPoint.x;
  291.             int k1 = sampleScrollerSpace - (int)Math.round(rightScrollerFactor * (double)sampleScrollerSpace) - i1;
  292.             leftAdjusterPos = i;
  293.             rightAdjusterPos = leftAdjusterPos + k1;
  294.             paintBox(g, Color.lightGray, i, k, k1, 8, false);
  295.             g.setColor(Color.gray);
  296.             g.drawLine(i + 2, k + 1, i + 2, k + 7);
  297.             g.setColor(Color.white);
  298.             g.drawLine((i + k1) - 2, k + 1, (i + k1) - 2, k + 7);
  299.         } else
  300.         {
  301.             int j = rectangle.x - 10;
  302.             int l = rectangle.y;
  303.             if(display3dOn)
  304.             {
  305.                 j -= depth3dPoint.x;
  306.                 l -= depth3dPoint.y;
  307.             }
  308.             sampleScrollerBounds.x = j;
  309.             sampleScrollerBounds.y = l;
  310.             sampleScrollerBounds.height = rectangle.height;
  311.             sampleScrollerBounds.width = 7;
  312.             g.setColor(getBackground().darker());
  313.             g.drawLine(j + 4, l, j + 4, l + sampleScrollerBounds.height);
  314.             g.setColor(getBackground().brighter());
  315.             g.drawLine(j + 5, l, j + 5, l + sampleScrollerBounds.height);
  316.             paintBox(g, Color.lightGray, j, l, 8, 8, leftPushed);
  317.             l += leftPushed ? 1 : 0;
  318.             g.setColor(Color.black);
  319.             g.drawLine(j + 4, l + 3, j + 4, l + 3);
  320.             g.drawLine(j + 3, l + 4, j + 5, l + 4);
  321.             g.drawLine(j + 2, l + 5, j + 6, l + 5);
  322.             l = (sampleScrollerBounds.y + sampleScrollerBounds.height) - 8;
  323.             paintBox(g, Color.lightGray, j, l, 8, 8, rightPushed);
  324.             l += rightPushed ? 1 : 0;
  325.             g.setColor(Color.black);
  326.             g.drawLine(j + 4, l + 5, j + 4, l + 5);
  327.             g.drawLine(j + 3, l + 4, j + 5, l + 4);
  328.             g.drawLine(j + 2, l + 3, j + 6, l + 3);
  329.             sampleScrollerSpace = sampleScrollerBounds.height - 18;
  330.             int j1 = (int)Math.round(leftScrollerFactor * (double)sampleScrollerSpace);
  331.             l = rectangle.y + 9 + j1;
  332.             if(display3dOn)
  333.                 l -= depth3dPoint.y;
  334.             int l1 = sampleScrollerSpace - (int)Math.round(rightScrollerFactor * (double)sampleScrollerSpace) - j1;
  335.             leftAdjusterPos = l;
  336.             rightAdjusterPos = leftAdjusterPos + l1;
  337.             paintBox(g, Color.lightGray, j, l, 8, l1, false);
  338.             g.setColor(Color.gray);
  339.             g.drawLine(j + 1, l + 2, j + 7, l + 2);
  340.             g.setColor(Color.white);
  341.             g.drawLine(j + 1, (l + l1) - 2, j + 7, (l + l1) - 2);
  342.         }
  343.     }
  344.     public void setLegendOn(boolean flag)
  345.     {
  346.         legendOn = flag;
  347.         legend.width = 0;
  348.         hasChanged = true;
  349.         autoRepaint();
  350.     }
  351.     public synchronized void setSamples(int i, ChartSample achartsample[])
  352.     {
  353.         chartData.setSamples(i, achartsample);
  354.         hasChanged = true;
  355.         if(isValueLabelsOn(i) && getLabelAngle("valueLabelAngle") != 0)
  356.             angledLabelCache.clear();
  357.         labelSizeCache.clear();
  358.         autoRepaint();
  359.     }
  360.     public synchronized ChartSample[] getSamples(int i)
  361.     {
  362.         return chartData.getSamples(i);
  363.     }
  364.     protected abstract void renderData(Graphics g, Rectangle rectangle, Rectangle rectangle1);
  365.     public double getMinValue(int i)
  366.     {
  367.         return chartData.getMinValue(i);
  368.     }
  369.     public String toString()
  370.     {
  371.         return getTitle();
  372.     }
  373.     public void setGridLine(int i, double d)
  374.     {
  375.         if(i >= maxGridLineCount || i < 0)
  376.             throw new IllegalArgumentException("Illegal vertical grid line index: " + i);
  377.         if(gridLines == null)
  378.         {
  379.             gridLines = new double[i + 1];
  380.             for(int j = 0; j < gridLines.length; j++)
  381.                 gridLines[j] = -2147483648D;
  382.         }
  383.         if(i >= gridLines.length)
  384.         {
  385.             double ad[] = new double[i + 1];
  386.             System.arraycopy(gridLines, 0, ad, 0, gridLines.length);
  387.             for(int k = gridLines.length; k < ad.length - 1; k++)
  388.                 ad[k] = -2147483648D;
  389.             gridLines = ad;
  390.         }
  391.         gridLines[i] = d;
  392.         hasChanged = true;
  393.         autoRepaint();
  394.     }
  395.     public double getGridLine(int i)
  396.     {
  397.         if(gridLines == null || i >= gridLines.length)
  398.             return -2147483648D;
  399.         else
  400.             return gridLines[i];
  401.     }
  402.     public void setChartData(ChartData chartdata)
  403.     {
  404.         chartData = chartdata;
  405.         checkDataIntegrity();
  406.         autoRepaint();
  407.     }
  408.     public ChartData getChartData()
  409.     {
  410.         return chartData;
  411.     }
  412.     public boolean isRangeLabelsOn()
  413.     {
  414.         return rangeLabelsOn;
  415.     }
  416.     public void setValueLabelsOn(boolean flag)
  417.     {
  418.         setValueLabelsOn(-1, flag);
  419.     }
  420.     public void setValueLabelsOn(int i, boolean flag)
  421.     {
  422.         if(i >= 0 && i < valueLabelsOn.length)
  423.             valueLabelsOn[i] = flag;
  424.         else
  425.         if(i == -1)
  426.         {
  427.             for(int j = 0; j < valueLabelsOn.length; j++)
  428.                 valueLabelsOn[j] = flag;
  429.         }
  430.         hasChanged = true;
  431.         autoRepaint();
  432.     }
  433.     public synchronized void setRelativeRange(double d)
  434.     {
  435.         setRelativeRangeIndex(0, d);
  436.     }
  437.     public synchronized void setRelativeRange(double d, double d1)
  438.     {
  439.         setRelativeRange(0, d, d1);
  440.     }
  441.     public synchronized void setRelativeRange(int i, double d, double d1)
  442.     {
  443.         i = Math.min(rangeOn.length - 1, Math.max(0, i));
  444.         double d2 = getHighestValue(i);
  445.         double d3 = getLowestValue(i);
  446.         if(i == 0)
  447.         {
  448.             for(Enumeration enumeration = targetsValue.elements(); enumeration.hasMoreElements();)
  449.                 d2 = Math.max(((Double)enumeration.nextElement()).doubleValue(), d2);
  450.         }
  451.         if(d2 > 0.0D)
  452.         {
  453.             d1 = Math.abs(d1);
  454.             double d4 = d2 * Math.abs(d);
  455.             if(d1 % 1.0D == 0.0D)
  456.             {
  457.                 if(d4 % d1 == 0.0D)
  458.                     setRange(i, d4);
  459.                 else
  460.                     setRange(i, (d4 - d4 % d1) + d1);
  461.             } else
  462.             {
  463.                 double d5;
  464.                 for(d5 = 0.0D; d5 < d4; d5 += d1);
  465.                 setRange(i, d5);
  466.             }
  467.         } else
  468.         if(d2 == 0.0D && d3 == 0.0D)
  469.             setRange(i, 100D);
  470.         else
  471.             setRange(i, 0.0D);
  472.     }
  473.     public void setFont(String s, Font font)
  474.     {
  475.         if(s == null || s.trim().length() < 1)
  476.             return;
  477.         s = s.trim().toLowerCase();
  478.         if(font != null)
  479.             labelFonts.put(s, font);
  480.         else
  481.             labelFonts.remove(s);
  482.         labelSizeCache.clear();
  483.         hasChanged = true;
  484.         autoRepaint();
  485.     }
  486.     public Font getFont(String s)
  487.     {
  488.         if(s == null)
  489.             getFont();
  490.         Font font = (Font)labelFonts.get(s.trim().toLowerCase());
  491.         if(font != null)
  492.             return font;
  493.         else
  494.             return getFont();
  495.     }
  496.     public synchronized void setSeriesLabels(String as[])
  497.     {
  498.         chartData.setSeriesLabels(as);
  499.         hasChanged = true;
  500.         autoRepaint();
  501.     }
  502.     public synchronized String[] getSeriesLabels()
  503.     {
  504.         return chartData.getSeriesLabels();
  505.     }
  506.     /**
  507.      * @deprecated Method getFloatRange is deprecated
  508.      */
  509.     public synchronized double getFloatRange()
  510.     {
  511.         return getRange(0);
  512.     }
  513.     private void adjustRange(Chart chart, int i, double d, double d1)
  514.     {
  515.         if(d != 0.0D)
  516.         {
  517.             double d2 = chart.lowerRange[i] + d * (chart.upperRange[i] - chart.lowerRange[i]);
  518.             if(d2 > chart.currentLowerRange[i])
  519.                 chart.currentUpperRange[i] = d2;
  520.             chart.currentUpperRange[i] = Math.min(chart.currentUpperRange[i], chart.upperRange[i]);
  521.         }
  522.         if(d1 != 0.0D)
  523.         {
  524.             double d3 = chart.lowerRange[i] + d1 * (chart.upperRange[i] - chart.lowerRange[i]);
  525.             if(d3 < chart.currentUpperRange[i])
  526.                 chart.currentLowerRange[i] = d3;
  527.             chart.currentLowerRange[i] = Math.max(chart.currentLowerRange[i], chart.lowerRange[i]);
  528.         }
  529.     }
  530.     protected abstract void render(Graphics g);
  531.     void render(Graphics g, boolean flag)
  532.     {
  533.     }
  534.     public boolean isValueLabelsOn()
  535.     {
  536.         return isValueLabelsOn(-1);
  537.     }
  538.     public void setRangeOn(int i, boolean flag)
  539.     {
  540.         rangeOn[Math.min(1, Math.max(0, i))] = flag;
  541.         hasChanged = true;
  542.         autoRepaint();
  543.     }
  544.     public boolean isValueLabelsOn(int i)
  545.     {
  546.         if(i >= 0 && i < valueLabelsOn.length)
  547.             return valueLabelsOn[i];
  548.         if(i == -1)
  549.         {
  550.             for(int j = 0; j < valueLabelsOn.length; j++)
  551.                 if(!valueLabelsOn[j])
  552.                     return false;
  553.             return true;
  554.         } else
  555.         {
  556.             return false;
  557.         }
  558.     }
  559.     public void setSelection(int i, int j, boolean flag)
  560.     {
  561.         setSelection(i, j, flag, false);
  562.     }
  563.     private void setSelection(int i, int j, boolean flag, boolean flag1)
  564.     {
  565.         chartData.setSelection(i, j, flag, flag1);
  566.         lastSelectedSample = -1;
  567.         lastSelectedSeries = -1;
  568.         for(int k = 0; k < legendSelection.length; k++)
  569.             legendSelection[k] = false;
  570.         if(j == -1 && i == -1)
  571.         {
  572.             if(selectedSample != null)
  573.             {
  574.                 notifyListeners(this, 2, selectedSample);
  575.                 selectedSample = null;
  576.             }
  577.         } else
  578.         if(j == -1 && i != -1)
  579.         {
  580.             ChartSample chartsample = new ChartSample(j);
  581.             chartsample.setSeries(i);
  582.             if(legendLabels != null && i < legendLabels.length && legendLabels[i] != null)
  583.                 chartsample.setLabel(legendLabels[i]);
  584.             else
  585.             if(i >= 0 && i < getSeriesCount())
  586.                 chartsample.setLabel(getSeriesLabel(i));
  587.             if(flag)
  588.             {
  589.                 lastSelectedSeries = i;
  590.                 if((selectedSample == null || chartsample.getSeries() != selectedSample.getSeries()) && selectedSample != null)
  591.                     notifyListeners(this, 2, selectedSample);
  592.                 notifyListeners(this, 1, chartsample);
  593.                 selectedSample = chartsample;
  594.             } else
  595.             {
  596.                 notifyListeners(this, 2, chartsample);
  597.                 if(chartsample == selectedSample)
  598.                     selectedSample = null;
  599.             }
  600.         } else
  601.         if(j != -1 && i != -1)
  602.         {
  603.             ChartSample chartsample1 = getSample(i, j);
  604.             if(flag)
  605.             {
  606.                 lastSelectedSample = j;
  607.                 lastSelectedSeries = i;
  608.                 if(selectedSample != null && chartsample1 != selectedSample)
  609.                     notifyListeners(this, 2, selectedSample);
  610.                 notifyListeners(this, 1, chartsample1);
  611.                 selectedSample = chartsample1;
  612.             } else
  613.             {
  614.                 notifyListeners(this, 2, chartsample1);
  615.                 if(chartsample1 == selectedSample)
  616.                     selectedSample = null;
  617.             }
  618.         }
  619.         if(getSeriesCount() > 1 || multiSeriesOn)
  620.         {
  621.             if(i >= 0 && i < legendSelection.length)
  622.                 legendSelection[i] = flag;
  623.         } else
  624.         if(j >= 0 && j < legendSelection.length)
  625.             legendSelection[j] = flag;
  626.         if(j == -1)
  627.         {
  628.             for(int l = 0; l < overlayCharts.size(); l++)
  629.             {
  630.                 Chart chart = (Chart)overlayCharts.elementAt(l);
  631.                 if(chart != null)
  632.                     chart.setSelection(i, j, flag, flag1);
  633.             }
  634.         }
  635.         hasChanged = true;
  636.         autoRepaint();
  637.     }
  638.     int getValuePosition(int i, double d, Rectangle rectangle)
  639.     {
  640.         i = Math.min(upperRange.length - 1, Math.max(0, i));
  641.         int j = 0;
  642.         int k = 0;
  643.         if(gridAlignment == 1)
  644.         {
  645.             if(currentUpperRange[i] - currentLowerRange[i] != 0.0D)
  646.                 j = (int)((double)rectangle.height * (currentUpperRange[i] / (currentUpperRange[i] - currentLowerRange[i])));
  647.             k = rectangle.y + j;
  648.         } else
  649.         {
  650.             if(currentUpperRange[i] - currentLowerRange[i] != 0.0D)
  651.                 j = (int)((double)rectangle.width * (currentUpperRange[i] / (currentUpperRange[i] - currentLowerRange[i])));
  652.             k = (rectangle.x + rectangle.width) - j;
  653.         }
  654.         int l = 0;
  655.         if(currentUpperRange[i] - currentLowerRange[i] != 0.0D)
  656.             if(gridAlignment == 1)
  657.                 l = (int)((double)k - (double)rectangle.height * (d / (currentUpperRange[i] - currentLowerRange[i])));
  658.             else
  659.                 l = (int)((double)k + (double)rectangle.width * (d / (currentUpperRange[i] - currentLowerRange[i])));
  660.         return l;
  661.     }
  662.     public final void print(Graphics g)
  663.     {
  664.         Dimension dimension = getSize();
  665.         g.setColor(getBackground());
  666.         g.fillRect(0, 0, dimension.width, dimension.height);
  667.         g.setColor(getForeground());
  668.         hasChanged = true;
  669.         render(g, printAsBitmap);
  670.         
  671.         //g.setColor(Color.red);
  672.         //g.setFont(new Font("Dialog", 1, 18));
  673.         //g.drawString("演示版不支持打印,请购买正版!",10,30);
  674.         //c2.paint(g, dimension);
  675.     }
  676.     public void setChartBackground(Color color)
  677.     {
  678.         chartBackground = color;
  679.         hasChanged = true;
  680.         autoRepaint();
  681.     }
  682.     public Color getChartBackground()
  683.     {
  684.         return chartBackground;
  685.     }
  686.     public void setRangeColor(int i, Color color)
  687.     {
  688.         rangeColor[Math.min(1, Math.max(0, i))] = color == null ? chartForeground : color;
  689.         hasChanged = true;
  690.         autoRepaint();
  691.     }
  692.     public Color getRangeColor(int i)
  693.     {
  694.         i = Math.min(1, Math.max(0, i));
  695.         if(rangeColor[i] != null)
  696.             return rangeColor[i];
  697.         else
  698.             return chartForeground;
  699.     }
  700.     public synchronized void setSeriesLabelColor(int i, Color color)
  701.     {
  702.         try
  703.         {
  704.             seriesLabelColors[i] = color;
  705.             hasChanged = true;
  706.             autoRepaint();
  707.         }
  708.         catch(IndexOutOfBoundsException _ex)
  709.         {
  710.             throw new IllegalArgumentException("Invalid series index: " + i);
  711.         }
  712.     }
  713.     public Color getSeriesLabelColor(int i)
  714.     {
  715.         try
  716.         {
  717.             return seriesLabelColors[i];
  718.         }
  719.         catch(IndexOutOfBoundsException _ex)
  720.         {
  721.             throw new IllegalArgumentException("Invalid series index: " + i);
  722.         }
  723.     }
  724.     public synchronized ChartSample getSample(Object obj)
  725.     {
  726.         return chartData.getSample(obj);
  727.     }
  728.     public synchronized int appendSample(int i, ChartSample chartsample, boolean flag)
  729.     {
  730.         int j = chartData.appendSample(i, chartsample, flag);
  731.         checkDataIntegrity();
  732.         hasChanged = true;
  733.         if(isValueLabelsOn(i) && getLabelAngle("valueLabelAngle") != 0)
  734.             angledLabelCache.clear();
  735.         autoRepaint();
  736.         return j;
  737.     }
  738.     public synchronized void setSample(int i, int j, ChartSample chartsample)
  739.     {
  740.         chartData.setSample(i, j, chartsample);
  741.         hasChanged = true;
  742.         if(isValueLabelsOn(i) && getLabelAngle("valueLabelAngle") != 0)
  743.             angledLabelCache.clear();
  744.         autoRepaint();
  745.     }
  746.     public void setLabel(String s, String s1)
  747.     {
  748.         if(s != null && s.length() > 0)
  749.         {
  750.             s = s.toLowerCase().trim();
  751.             if(s1 != null && s1.length() > 0)
  752.                 labels.put(s, s1);
  753.             else
  754.                 labels.remove(s);
  755.             hasChanged = true;
  756.             if(getLabelAngle(s + "Angle") != 0)
  757.                 angledLabelCache.clear();
  758.             autoRepaint();
  759.         }
  760.     }
  761.     public String getLabel(String s)
  762.     {
  763.         if(s != null)
  764.         {
  765.             s = s.toLowerCase().trim();
  766.             return (String)labels.get(s);
  767.         } else
  768.         {
  769.             return null;
  770.         }
  771.     }
  772.     public synchronized ChartSample getSample(int i, int j)
  773.     {
  774.         return chartData.getSample(i, j);
  775.     }
  776.     public void setValueLinesColor(Color color)
  777.     {
  778.         valueLinesColor = color;
  779.         if(valueLinesColor == null)
  780.             valueLinesColor = Color.lightGray;
  781.         hasChanged = true;
  782.         autoRepaint();
  783.     }
  784.     public Color getValueLinesColor()
  785.     {
  786.         return valueLinesColor;
  787.     }
  788.     String getTargetLabel(String s)
  789.     {
  790.         String s1 = "";
  791.         int i = ((Integer)targetsStyle.get(s)).intValue();
  792.         double d = ((Double)targetsValue.get(s)).doubleValue();
  793.         String s2 = formatNumber(d, rangeDecimalCount[0]);
  794.         if(getLabel("rangeLabelPrefix") != null)
  795.             s2 = getLabel("rangeLabelPrefix") + s2;
  796.         if(getLabel("rangeLabelPostfix") != null)
  797.             s2 += getLabel("rangeLabelPostfix");
  798.         switch(i)
  799.         {
  800.         default:
  801.             break;
  802.         case 0: // ''
  803.             s1 = "";
  804.             break;
  805.         case 1: // '01'
  806.             s1 = s;
  807.             break;
  808.         case 2: // '02'
  809.             s1 = s2;
  810.             break;
  811.         case 3: // '03'
  812.             if(rangePosition[0] == 0)
  813.                 s1 = s + " " + s2;
  814.             else
  815.                 s1 = s2 + " " + s;
  816.             break;
  817.         }
  818.         return s1;
  819.     }
  820.     public void setLegendColor(int i, Color color)
  821.     {
  822.         if(legendColors == null)
  823.             legendColors = new Color[i + 1];
  824.         if(i >= legendColors.length)
  825.         {
  826.             Color acolor[] = new Color[i + 1];
  827.             System.arraycopy(legendColors, 0, acolor, 0, legendColors.length);
  828.             legendColors = acolor;
  829.         }
  830.         legendColors[i] = color;
  831.         hasChanged = true;
  832.         autoRepaint();
  833.     }
  834.     public Color getLegendColor(int i)
  835.     {
  836.         if(legendColors == null || i >= legendColors.length)
  837.             return getSampleColor(i);
  838.         else
  839.             return legendColors[i];
  840.     }
  841.     public void setRangeAdjusted(int i, int j)
  842.     {
  843.         i = Math.min(rangeAdjusterOn.length - 1, Math.max(0, i));
  844.         j = Math.min(2, Math.max(0, j));
  845.         rangeAdjusted[i] = j;
  846.     }
  847.     public int getRangeAdjusted(int i)
  848.     {
  849.         i = Math.min(rangeAdjusterOn.length - 1, Math.max(0, i));
  850.         return rangeAdjusted[i];
  851.     }
  852.     protected void processEvent(AWTEvent awtevent)
  853.     {
  854.         if(depth3d > -1)
  855.         {
  856.             depth3dPoint.x = depth3d;
  857.             depth3dPoint.y = -depth3d;
  858.         }
  859.         if((awtevent instanceof MouseEvent) && (rangeAdjusterOn[0] || rangeAdjusterOn[1] || sampleScrollerOn))
  860.             handleAdjusters(awtevent);
  861.         switch(awtevent.getID())
  862.         {
  863.         default:
  864.             break;
  865.         case 501: 
  866.             /*if(c2.copyright)
  867.             {
  868.                 c2.copyright = false;
  869.             } else
  870.             {
  871.                 int i = ((MouseEvent)awtevent).getX();
  872.                 int k = ((MouseEvent)awtevent).getY();
  873.                 Dimension dimension = getSize();
  874.                 if(i > 0 && i < 11 && k > dimension.height - 11 && k < dimension.height)
  875.                     c2.copyright = true;
  876.             }
  877.             repaint();
  878.             */
  879.             break;
  880.         case 502: 
  881.             int j = ((MouseEvent)awtevent).getX();
  882.             int l = ((MouseEvent)awtevent).getY();
  883.             ChartSample chartsample = checkSelection(new Point(j, l));
  884.             if(chartsample != null)
  885.             {
  886.                 int i1 = chartsample.getSeries();
  887.                 if(i1 >= 0)
  888.                 {
  889.                     setSelection(i1, chartsample.getIndex(), true, true);
  890.                     repaint();
  891.                 }
  892.                 break;
  893.             }
  894.             if(selectedSample != null)
  895.             {
  896.                 setSelection(-1, -1, false, true);
  897.                 repaint();
  898.             }
  899.             break;
  900.         case 101: // 'e'
  901.             if(offscreen != null)
  902.                 offscreen.flush();
  903.             if(!externalGraphicsOn)
  904.                 offscreen = null;
  905.             hasChanged = true;
  906.             repaint();
  907.             break;
  908.         }
  909.         super.processEvent(awtevent);
  910.     }
  911.     public double getMaxValue(int i)
  912.     {
  913.         return chartData.getMaxValue(i);
  914.     }
  915.     double getHighestValue(int i)
  916.     {
  917.         i = Math.min(rangeOn.length - 1, Math.max(0, i));
  918.         int j = getSeriesCount();
  919.         double d = 0.0D;
  920.         for(int k = 0; k < j; k++)
  921.             if(getSeriesRange(k) == i)
  922.                 d = Math.max(getMaxValue(k), d);
  923.         for(int l = 0; l < overlayCharts.size(); l++)
  924.         {
  925.             Chart chart = (Chart)overlayCharts.elementAt(l);
  926.             if(chart != null && !chart.chartType.equals("pie"))
  927.             {
  928.                 for(int i1 = 0; i1 < chart.getSeriesCount(); i1++)
  929.                     if(chart.getSeriesRange(i1) == i)
  930.                         d = Math.max(chart.getMaxValue(i1), d);
  931.             }
  932.         }
  933.         return d;
  934.     }
  935.     public final void update(Graphics g)
  936.     {
  937.         paint(g);
  938.     }
  939.     private void adjustRangeSlide(Chart chart, int i, double d)
  940.     {
  941.         double d1 = d * (chart.upperRange[i] - chart.lowerRange[i]);
  942.         d1 = gridAlignment != 1 ? -d1 : d1;
  943.         if(d1 >= 0.0D)
  944.             d1 = Math.min(chart.upperRange[i] - chart.currentUpperRange[i], d1);
  945.         else
  946.         if(chart.currentLowerRange[i] + d1 < chart.lowerRange[i])
  947.             d1 = chart.lowerRange[i] - chart.currentLowerRange[i];
  948.         chart.currentUpperRange[i] += d1;
  949.         chart.currentLowerRange[i] += d1;
  950.     }
  951.     public void setTitle(String s)
  952.     {
  953.         if(chartTitle != null)
  954.         {
  955.             Long long1 = new Long(chartTitle.hashCode() + getFont("titleFont").hashCode());
  956.             labelSizeCache.remove(long1);
  957.         }
  958.         chartTitle = s;
  959.         hasChanged = true;
  960.         autoRepaint();
  961.     }
  962.     public String getTitle()
  963.     {
  964.         return chartTitle;
  965.     }
  966.     public void removeOverlayChart(int i)
  967.     {
  968.         if(i >= 0 && i < overlayCharts.size())
  969.         {
  970.             overlayCharts.removeElementAt(i);
  971.             hasChanged = true;
  972.             autoRepaint();
  973.         } else
  974.         {
  975.             throw new IllegalArgumentException("invalid overlay index: " + i);
  976.         }
  977.     }
  978.     private void transform(double d, double d1, double d2, double d3, double ad[])
  979.     {
  980.         ad[0] = d * d2 + d1 * d3;
  981.         ad[1] = d * d3 - d1 * d2;
  982.     }
  983.     public void addItemListener(ItemListener itemlistener)
  984.     {
  985.         if(itemlistener != null)
  986.             listeners.addElement(itemlistener);
  987.     }
  988.     public synchronized void setSampleValues(int i, double ad[])
  989.     {
  990.         chartData.setSampleValues(i, ad);
  991.         hasChanged = true;
  992.         if(isValueLabelsOn(i) && getLabelAngle("valueLabelAngle") != 0)
  993.             angledLabelCache.clear();
  994.         labelSizeCache.clear();
  995.         autoRepaint();
  996.     }
  997.     public synchronized double[] getSampleValues(int i)
  998.     {
  999.         return chartData.getSampleValues(i);
  1000.     }
  1001.     private void getAngledBounds(double d, double d1, Rectangle rectangle, double ad[])
  1002.     {
  1003.         double d2 = (1.0D / 0.0D);
  1004.         double d3 = (1.0D / 0.0D);
  1005.         double d4 = (-1.0D / 0.0D);
  1006.         double d5 = (-1.0D / 0.0D);
  1007.         int i = 0;
  1008.         do
  1009.         {
  1010.             int j = 0;
  1011.             do
  1012.             {
  1013.                 transform(d, d1, rectangle.x + j * rectangle.width, rectangle.y + i * rectangle.height, ad);
  1014.                 d2 = Math.min(d2, ad[0]);
  1015.                 d3 = Math.min(d3, ad[1]);
  1016.                 d4 = Math.max(d4, ad[0]);
  1017.                 d5 = Math.max(d5, ad[1]);
  1018.             } while(++j <= 1);
  1019.         } while(++i <= 1);
  1020.         rectangle.x = (int)Math.floor(d2);
  1021.         rectangle.y = (int)Math.floor(d3);
  1022.         rectangle.width = ((int)Math.ceil(d4) - rectangle.x) + 1;
  1023.         rectangle.height = ((int)Math.ceil(d5) - rectangle.y) + 1;
  1024.     }
  1025.     public void setGridLineColors(Color acolor[])
  1026.     {
  1027.         gridLineColors = acolor;
  1028.         hasChanged = true;
  1029.         autoRepaint();
  1030.     }
  1031.     public Color[] getGridLineColors()
  1032.     {
  1033.         return gridLineColors;
  1034.     }
  1035.     public void setRangeAdjusterPosition(int i, int j)
  1036.     {
  1037.         i = Math.min(rangeAdjusterPosition.length - 1, Math.max(0, i));
  1038.         rangeAdjusterPosition[i] = Math.min(1, Math.max(0, j));
  1039.     }
  1040.     public int getRangeAdjusterPosition(int i)
  1041.     {
  1042.         i = Math.min(rangeAdjusterPosition.length - 1, Math.max(0, i));
  1043.         return rangeAdjusterPosition[i];
  1044.     }
  1045.     public void setTitleOn(boolean flag)
  1046.     {
  1047.         chartTitleOn = flag;
  1048.         hasChanged = true;
  1049.         autoRepaint();
  1050.     }
  1051.     public boolean isAutomaticRepaintOn()
  1052.     {
  1053.         return automaticRepaintOn;
  1054.     }
  1055.     public boolean isOverlayChartOn(int i)
  1056.     {
  1057.         Chart chart = getOverlayChart(i);
  1058.         if(chart != null)
  1059.             return chart.overlayChartOn;
  1060.         else
  1061.             return false;
  1062.     }
  1063.     public void reset()
  1064.     {
  1065.         automaticRepaintOn = true;
  1066.         chartTitle = null;
  1067.         chartTitleOn = false;
  1068.         sampleDecimalCount = new int[getSeriesCount()];
  1069.         legendOn = false;
  1070.         legendPosition = 1;
  1071.         display3dOn = false;
  1072.         chartBackground = Color.white;
  1073.         chartForeground = Color.black;
  1074.         setForeground(Color.black);
  1075.         setBackground(new Color(231, 221, 231));
  1076.         labelFonts.clear();
  1077.         labels.clear();
  1078.         legendLabels = null;
  1079.         graphInsets.top = graphInsets.bottom = graphInsets.left = graphInsets.right = -1;
  1080.         preferredSize.setSize(300, 200);
  1081.         lastSelectedSample = -1;
  1082.         lastSelectedSeries = -1;
  1083.         setFont(new Font("Arial", 0, 11));
  1084.         setFont("titleFont", new Font("Arial", 1, 14));
  1085.         setSampleColors(null);
  1086.         seriesRange = new int[getSeriesCount()];
  1087.         valueLabelsOn = new boolean[getSeriesCount()];
  1088.         barLabelStyle = 0;
  1089.         overlayChartOn = true;
  1090.         servletModeOn = false;
  1091.         externalGraphicsOn = false;
  1092.         floatingOnLegendOn = true;
  1093.         maxValueLineCount = 0x7fffffff;
  1094.         maxGridLineCount = 1000;
  1095.         leftSampleAxisRange = 0.0D;
  1096.         rightSampleAxisRange = 100D;
  1097.         valueLinesOn = false;
  1098.         valueLinesColor = Color.lightGray;
  1099.         rangeLabelsOn = true;
  1100.         rangeOn[0] = true;
  1101.         rangeOn[1] = false;
  1102.         rangeDecimalCount[0] = 0;
  1103.         rangeDecimalCount[1] = 0;
  1104.         sampleLabelsOn = false;
  1105.         targetsLabel.clear();
  1106.         targetsValue.clear();
  1107.         targetsColor.clear();
  1108.         targetsStyle.clear();
  1109.         gridAlignment = 1;
  1110.         rangeAdjusterOn[0] = false;
  1111.         rangeAdjusterOn[1] = false;
  1112.         sampleScrollerOn = false;
  1113.         setSize(300, 200);
  1114.         upperRange[0] = 100D;
  1115.         upperRange[1] = 100D;
  1116.         lowerRange[0] = 0.0D;
  1117.         lowerRange[1] = 0.0D;
  1118.         currentUpperRange[0] = 100D;
  1119.         currentUpperRange[1] = 100D;
  1120.         currentLowerRange[0] = 0.0D;
  1121.         currentLowerRange[1] = 0.0D;
  1122.         rangeAdjusterPosition[0] = 1;
  1123.         rangeAdjusterPosition[1] = 1;
  1124.         adjusterIndex = -1;
  1125.         rangePosition[0] = 0;
  1126.         rangePosition[1] = 1;
  1127.         rangeAdjusted[0] = 0;
  1128.         rangeAdjusted[1] = 1;
  1129.         gridLines = null;
  1130.         defaultGridLines = null;
  1131.         defaultGridLinesColor = Color.lightGray;
  1132.         gridLineColors = null;
  1133.         leftSampleAxisRange = 0.0D;
  1134.         rightSampleAxisRange = 100D;
  1135.         images = new Hashtable();
  1136.         imageTracker = new MediaTracker(this);
  1137.     }
  1138.     public void setMaxValueLineCount(int i)
  1139.     {
  1140.         if(i > -1)
  1141.             maxValueLineCount = i;
  1142.         else
  1143.             maxValueLineCount = 0x7fffffff;
  1144.         hasChanged = true;
  1145.         autoRepaint();
  1146.     }
  1147.     public int getMaxValueLineCount()
  1148.     {
  1149.         if(maxValueLineCount != 0x7fffffff)
  1150.             return maxValueLineCount;
  1151.         else
  1152.             return -1;
  1153.     }
  1154.     public synchronized void setSeriesCount(int i)
  1155.     {
  1156.         chartData.setSeriesCount(i);
  1157.         checkDataIntegrity();
  1158.         hasChanged = true;
  1159.         autoRepaint();
  1160.     }
  1161.     public synchronized int getSeriesCount()
  1162.     {
  1163.         return chartData.getSeriesCount();
  1164.     }
  1165.     public void setSampleColors(Color acolor[])
  1166.     {
  1167.         if(acolor != null)
  1168.         {
  1169.             sampleColors = acolor;
  1170.         } else
  1171.         {
  1172.             sampleColors = new Color[DEFAULT_SAMPLE_COLORS.length];
  1173.             System.arraycopy(DEFAULT_SAMPLE_COLORS, 0, sampleColors, 0, sampleColors.length);
  1174.         }
  1175.         hasChanged = true;
  1176.         autoRepaint();
  1177.     }
  1178.     public Color[] getSampleColors()
  1179.     {
  1180.         return sampleColors;
  1181.     }
  1182.     protected ChartSample checkSelection(Point point)
  1183.     {
  1184.         if(legendBounds == null || !legendOn)
  1185.             return null;
  1186.         ChartSample chartsample = null;
  1187.         int i = getSeriesCount();
  1188.         int j = getSampleCount();
  1189.         if(j > 0 && i > 0)
  1190.         {
  1191.             for(int k = 0; k < legendBounds.length; k++)
  1192.             {
  1193.                 if(legendBounds[k] == null || !legendBounds[k].contains(point))
  1194.                     continue;
  1195.                 if(i > 1 || chartType.equals("line") || multiSeriesOn)
  1196.                 {
  1197.                     chartsample = new ChartSample(-1);
  1198.                     chartsample.setSeries(k);
  1199.                 } else
  1200.                 {
  1201.                     chartsample = getSample(0, k);
  1202.                 }
  1203.                 break;
  1204.             }
  1205.         }
  1206.         return chartsample;
  1207.     }
  1208.     public void setFloatingOnLegendOn(boolean flag)
  1209.     {
  1210.         floatingOnLegendOn = flag;
  1211.         hasChanged = true;
  1212.         autoRepaint();
  1213.     }
  1214.     Dimension getImageSize(String s)
  1215.     {
  1216.         Dimension dimension = new Dimension(0, 0);
  1217.         if(s != null)
  1218.         {
  1219.             Image image = (Image)images.get(s);
  1220.             if(image != null)
  1221.             {
  1222.                 dimension.width = image.getWidth(this);
  1223.                 dimension.height = image.getHeight(this);
  1224.             }
  1225.         }
  1226.         return dimension;
  1227.     }
  1228.     Dimension getLabelSize(String s, Font font)
  1229.     {
  1230.         if(s == null)
  1231.             return new Dimension(0, 0);
  1232.         if(font == null)
  1233.             font = new Font("Dialog", 0, 12);
  1234.         Long long1 = new Long(s.hashCode() + font.hashCode());
  1235.         Dimension dimension = (Dimension)labelSizeCache.get(long1);
  1236.         if(dimension == null)
  1237.         {
  1238.             FontMetrics fontmetrics = getFontMetrics(font);
  1239.             dimension = new Dimension();
  1240.             if(s != null)
  1241.             {
  1242.                 for(StringTokenizer stringtokenizer = new StringTokenizer(s, "n"); stringtokenizer.hasMoreElements();)
  1243.                 {
  1244.                     String s1 = (String)stringtokenizer.nextElement();
  1245.                     dimension.height += fontmetrics.getMaxAscent() + 1;
  1246.                     if(s1 != null)
  1247.                         dimension.width = Math.max(dimension.width, fontmetrics.stringWidth(s1));
  1248.                 }
  1249.             }
  1250.             dimension.height = Math.max(dimension.height, fontmetrics.getMaxAscent());
  1251.             if(!servletModeOn)
  1252.                 labelSizeCache.put(long1, dimension);
  1253.         }
  1254.         return dimension;
  1255.     }
  1256.     Dimension getAngledLabelSize(Dimension dimension, int i)
  1257.     {
  1258.         if(i == 90 || i == 270)
  1259.             return new Dimension(dimension.height, dimension.width);
  1260.         if(i > 0 && i < 360)
  1261.         {
  1262.             double d = Math.sin((double)i * 0.017453292519943295D);
  1263.             double d1 = Math.cos((double)i * 0.017453292519943295D);
  1264.             int j = (int)(Math.abs((double)dimension.width * d1) + Math.abs((double)dimension.height * d) + 0.5D);
  1265.             int k = (int)(Math.abs((double)dimension.width * d) + Math.abs((double)dimension.height * d1) + 0.5D);
  1266.             return new Dimension(j, k);
  1267.         } else
  1268.         {
  1269.             return dimension;
  1270.         }
  1271.     }
  1272.     public synchronized void setSampleLabel(int i, String s)
  1273.     {
  1274.         String s1 = getSampleLabel(i);
  1275.         chartData.setSampleLabel(i, s);
  1276.         hasChanged = true;
  1277.         if(sampleLabelsOn && (getLabelAngle("sampleLabelAngle") != 0 || getLabelAngle("barLabelAngle") != 0))
  1278.             angledLabelCache.clear();
  1279.         if(s1 != null)
  1280.         {
  1281.             Long long1 = new Long(s1.hashCode() + getFont("sampleLabelFont").hashCode());
  1282.             labelSizeCache.remove(long1);
  1283.             long1 = new Long(s1.hashCode() + getFont("barLabelFont").hashCode());
  1284.             labelSizeCache.remove(long1);
  1285.         }
  1286.         autoRepaint();
  1287.     }
  1288.     public synchronized String getSampleLabel(int i)
  1289.     {
  1290.         return chartData.getSampleLabel(i);
  1291.     }
  1292.     public void setRangeAdjusterOn(int i, boolean flag)
  1293.     {
  1294.         i = Math.min(rangeAdjusterOn.length - 1, Math.max(0, i));
  1295.         rangeAdjusterOn[i] = flag;
  1296.         if(!flag)
  1297.         {
  1298.             int j = rangeAdjusted[i];
  1299.             if(i == 0 && j == 2)
  1300.                 j = 0;
  1301.             else
  1302.             if(i == 1 && j == 2)
  1303.                 j = 1;
  1304.             setCurrentRange(i, getRange(j));
  1305.             setCurrentLowerRange(i, getLowerRange(j));
  1306.         }
  1307.         hasChanged = true;
  1308.         autoRepaint();
  1309.     }
  1310.     public boolean isSampleScrollerOn()
  1311.     {
  1312.         return sampleScrollerOn;
  1313.     }
  1314.     protected synchronized void checkDataIntegrity()
  1315.     {
  1316.         int i = chartData.getSeriesCount();
  1317.         if(i != seriesLabelColors.length)
  1318.         {
  1319.             hasChanged = true;
  1320.             Color acolor[] = new Color[i];
  1321.             int j = Math.min(i, seriesLabelColors.length);
  1322.             System.arraycopy(seriesLabelColors, 0, acolor, 0, j);
  1323.             seriesLabelColors = acolor;
  1324.             int ai[] = new int[i];
  1325.             System.arraycopy(seriesRange, 0, ai, 0, Math.min(seriesRange.length, ai.length));
  1326.             seriesRange = ai;
  1327.             int ai1[] = new int[i];
  1328.             System.arraycopy(sampleDecimalCount, 0, ai1, 0, Math.min(sampleDecimalCount.length, ai1.length));
  1329.             sampleDecimalCount = ai1;
  1330.             boolean aflag1[] = new boolean[i];
  1331.             System.arraycopy(valueLabelsOn, 0, aflag1, 0, Math.min(valueLabelsOn.length, aflag1.length));
  1332.             valueLabelsOn = aflag1;
  1333.         }
  1334.         String as[] = getLegendLabels();
  1335.         if(legendSelection.length != as.length)
  1336.         {
  1337.             boolean aflag[] = new boolean[as.length];
  1338.             System.arraycopy(legendSelection, 0, aflag, 0, Math.min(legendSelection.length, aflag.length));
  1339.             legendSelection = aflag;
  1340.         }
  1341.         int k = chartData.getSampleCount();
  1342.         if(k != sampleLabelColors.length)
  1343.         {
  1344.             hasChanged = true;
  1345.             Color acolor1[] = new Color[k];
  1346.             int l = Math.min(k, sampleLabelColors.length);
  1347.             System.arraycopy(sampleLabelColors, 0, acolor1, 0, l);
  1348.             sampleLabelColors = acolor1;
  1349.         }
  1350.     }
  1351.     /**
  1352.      * @deprecated Method setRangeAdjusterOn is deprecated
  1353.      */
  1354.     public void setRangeAdjusterOn(boolean flag)
  1355.     {
  1356.         setRangeAdjusterOn(0, flag);
  1357.     }
  1358.     public void setPreferredSize(int i, int j)
  1359.     {
  1360.         preferredSize.width = i;
  1361.         preferredSize.height = j;
  1362.     }
  1363.     public Dimension getPreferredSize()
  1364.     {
  1365.         return new Dimension(preferredSize);
  1366.     }
  1367.     public Dimension getMinimumSize()
  1368.     {
  1369.         return new Dimension(100, 70);
  1370.     }
  1371.     private void handleAdjusters(AWTEvent awtevent)
  1372.     {
  1373.         boolean flag = false;
  1374.         boolean flag1 = false;
  1375.         boolean flag2 = false;
  1376.         boolean flag3 = false;
  1377.         boolean flag4 = false;
  1378.         boolean flag5 = false;
  1379.         insideLeftButton = false;
  1380.         insideRightButton = false;
  1381.         int i = -1;
  1382.         int j = ((MouseEvent)awtevent).getX();
  1383.         int k = ((MouseEvent)awtevent).getY();
  1384.         if(gridAlignment == 1)
  1385.         {
  1386.             flag = j >= rangeAdjusterBounds[0].x && j <= rangeAdjusterBounds[0].x + rangeAdjusterBounds[0].width;
  1387.             flag = flag && k >= rangeAdjusterBounds[0].y - 3 && k <= rangeAdjusterBounds[0].y + rangeAdjusterBounds[0].height + 1;
  1388.             flag1 = k >= rangeAdjusterBounds[0].y - 1 && k <= rangeAdjusterBounds[0].y + 3;
  1389.             flag2 = k >= (rangeAdjusterBounds[0].y + rangeAdjusterBounds[0].height) - 3 && k <= rangeAdjusterBounds[0].y + rangeAdjusterBounds[0].height + 1;
  1390.             i = !flag && !flag1 && !flag2 ? -1 : 0;
  1391.             if(rangeAdjusterOn[1] && !flag)
  1392.             {
  1393.                 flag = j >= rangeAdjusterBounds[1].x && j <= rangeAdjusterBounds[1].x + rangeAdjusterBounds[1].width;
  1394.                 flag = flag && k >= rangeAdjusterBounds[1].y - 3 && k <= rangeAdjusterBounds[1].y + rangeAdjusterBounds[1].height + 1;
  1395.                 flag1 = k >= rangeAdjusterBounds[1].y - 1 && k <= rangeAdjusterBounds[1].y + 3;
  1396.                 flag2 = k >= (rangeAdjusterBounds[1].y + rangeAdjusterBounds[1].height) - 3 && k <= rangeAdjusterBounds[1].y + rangeAdjusterBounds[1].height + 1;
  1397.                 i = !flag && !flag1 && !flag2 ? -1 : 1;
  1398.             }
  1399.         } else
  1400.         {
  1401.             flag = k >= rangeAdjusterBounds[0].y && k <= rangeAdjusterBounds[0].y + rangeAdjusterBounds[0].height;
  1402.             flag = flag && j >= rangeAdjusterBounds[0].x - 1 && j <= rangeAdjusterBounds[0].x + rangeAdjusterBounds[0].width + 1;
  1403.             flag2 = j >= rangeAdjusterBounds[0].x - 1 && j <= rangeAdjusterBounds[0].x + 2;
  1404.             flag1 = j >= (rangeAdjusterBounds[0].x + rangeAdjusterBounds[0].width) - 3 && j <= rangeAdjusterBounds[0].x + rangeAdjusterBounds[0].width + 1;
  1405.             i = !flag && !flag1 && !flag2 ? -1 : 0;
  1406.             if(rangeAdjusterOn[1] && !flag)
  1407.             {
  1408.                 flag = k >= rangeAdjusterBounds[1].y && k <= rangeAdjusterBounds[1].y + rangeAdjusterBounds[1].height;
  1409.                 flag = flag && j >= rangeAdjusterBounds[1].x - 1 && j <= rangeAdjusterBounds[1].x + rangeAdjusterBounds[1].width + 1;
  1410.                 flag2 = j >= rangeAdjusterBounds[1].x - 1 && j <= rangeAdjusterBounds[1].x + 2;
  1411.                 flag1 = j >= (rangeAdjusterBounds[1].x + rangeAdjusterBounds[1].width) - 3 && j <= rangeAdjusterBounds[1].x + rangeAdjusterBounds[1].width + 1;
  1412.                 i = !flag && !flag1 && !flag2 ? -1 : 1;
  1413.             }
  1414.         }
  1415.         if(!flag)
  1416.             if(gridAlignment == 1)
  1417.             {
  1418.                 int l = sampleScrollerBounds.x;
  1419.                 int j1 = sampleScrollerBounds.x + sampleScrollerBounds.width;
  1420.                 flag3 = k >= sampleScrollerBounds.y && k <= sampleScrollerBounds.y + sampleScrollerBounds.height;
  1421.                 flag3 = flag3 && j >= l - 1 && j <= j1 + 1;
  1422.                 insideLeftButton = flag3 && j >= l && j <= l + 8;
  1423.                 insideRightButton = flag3 && j >= j1 - 8 && j <= j1;
  1424.                 flag4 = flag3 && j >= leftAdjusterPos && j <= leftAdjusterPos + 2;
  1425.                 flag5 = flag3 && j >= rightAdjusterPos - 2 && j <= rightAdjusterPos;
  1426.                 flag3 = flag3 && j > leftAdjusterPos + 2 && j < rightAdjusterPos - 2;
  1427.             } else
  1428.             {
  1429.                 int i1 = sampleScrollerBounds.y;
  1430.                 int k1 = sampleScrollerBounds.y + sampleScrollerBounds.height;
  1431.                 flag3 = j >= sampleScrollerBounds.x && j <= sampleScrollerBounds.x + sampleScrollerBounds.width;
  1432.                 flag3 = flag3 && k >= i1 - 1 && k <= k1 + 1;
  1433.                 insideLeftButton = flag3 && k >= i1 && k <= i1 + 8;
  1434.                 insideRightButton = flag3 && k >= k1 - 8 && k <= k1;
  1435.                 flag4 = flag3 && k >= leftAdjusterPos && k <= leftAdjusterPos + 2;
  1436.                 flag5 = flag3 && k >= rightAdjusterPos - 2 && k <= rightAdjusterPos;
  1437.                 flag3 = flag3 && k > leftAdjusterPos + 2 && k < rightAdjusterPos - 2;
  1438.             }
  1439.         switch(awtevent.getID())
  1440.         {
  1441.         case 504: 
  1442.         case 505: 
  1443.         default:
  1444.             break;
  1445.         case 503: 
  1446.             if((flag1 || flag2) && flag)
  1447.             {
  1448.                 setCursor(gridAlignment != 1 ? RESIZE_HOR_CURSOR : RESIZE_CURSOR);
  1449.                 break;
  1450.             }
  1451.             if(flag)
  1452.             {
  1453.                 setCursor(MOVE_CURSOR);
  1454.                 break;
  1455.             }
  1456.             if(flag4 || flag5)
  1457.             {
  1458.                 setCursor(gridAlignment != 1 ? RESIZE_CURSOR : RESIZE_HOR_CURSOR);
  1459.                 break;
  1460.             }
  1461.             if(flag3)
  1462.                 setCursor(MOVE_CURSOR);
  1463.             else
  1464.                 setCursor(DEFAULT_CURSOR);
  1465.             break;
  1466.         case 501: 
  1467.             adjustingUpper = flag1 && flag;
  1468.             adjustingLower = flag2 && flag;
  1469.             slidingAdjuster = flag && !flag1 && !flag2;
  1470.             adjusterIndex = i;
  1471.             leftPushed = insideLeftButton;
  1472.             rightPushed = insideRightButton;
  1473.             adjustingLeft = flag4;
  1474.             adjustingRight = flag5;
  1475.             slidingScroller = flag3 && !flag4 && !flag5;
  1476.             lastAdjusterClick = gridAlignment != 1 ? j : k;
  1477.             lastScrollerClick = gridAlignment != 1 ? k : j;
  1478.             long l1 = System.currentTimeMillis();
  1479.             int i2 = getSampleCount();
  1480.             if(insideLeftButton)
  1481.             {
  1482.                 double d = (double)(chartDataBounds.width / i2) / (double)chartDataBounds.width;
  1483.                 if(gridAlignment == 0)
  1484.                     d = (double)(chartDataBounds.height / i2) / (double)chartDataBounds.height;
  1485.                 d = Math.min(d, leftScrollerFactor);
  1486.                 leftScrollerFactor -= d;
  1487.                 rightScrollerFactor += d;
  1488.                 if(scrollerThread == null)
  1489.                 {
  1490.                     scrollerThread = new Thread(this);
  1491.                     scrollerThread.start();
  1492.                 }
  1493.             } else
  1494.             if(insideRightButton)
  1495.             {
  1496.                 double d1 = (double)(chartDataBounds.width / i2) / (double)chartDataBounds.width;
  1497.                 if(gridAlignment == 0)
  1498.                     d1 = (double)(chartDataBounds.height / i2) / (double)chartDataBounds.height;
  1499.                 d1 = Math.min(d1, rightScrollerFactor);
  1500.                 leftScrollerFactor += d1;
  1501.                 rightScrollerFactor -= d1;
  1502.                 if(scrollerThread == null)
  1503.                 {
  1504.                     scrollerThread = new Thread(this);
  1505.                     scrollerThread.start();
  1506.                 }
  1507.             } else
  1508.             if(flag3 && !insideLeftButton && !insideRightButton)
  1509.             {
  1510.                 if(l1 - lastClickTime < 350L)
  1511.                 {
  1512.                     leftScrollerFactor = 0.0D;
  1513.                     rightScrollerFactor = 0.0D;
  1514.                 }
  1515.             } else
  1516.             if(flag && !flag1 && !flag2 && l1 - lastClickTime < 350L)
  1517.             {
  1518.                 int j2 = 0;
  1519.                 do
  1520.                 {
  1521.                     int l3 = rangeAdjusted[adjusterIndex] <= 1 ? rangeAdjusted[adjusterIndex] : j2;
  1522.                     currentUpperRange[l3] = upperRange[l3];
  1523.                     currentLowerRange[l3] = lowerRange[l3];
  1524.                     for(int i4 = 0; i4 < overlayCharts.size(); i4++)
  1525.                     {
  1526.                         Chart chart = (Chart)overlayCharts.elementAt(i4);
  1527.                         if(chart != null)
  1528.                         {
  1529.                             chart.currentUpperRange[l3] = chart.upperRange[l3];
  1530.                             chart.currentLowerRange[l3] = chart.lowerRange[l3];
  1531.                         }
  1532.                     }
  1533.                 } while(++j2 < 2);
  1534.             }
  1535.             lastClickTime = l1;
  1536.             hasChanged = true;
  1537.             repaint();
  1538.             break;
  1539.         case 506: 
  1540.             int k2 = ((MouseEvent)awtevent).getY();
  1541.             if(gridAlignment == 0)
  1542.                 k2 = ((MouseEvent)awtevent).getX();
  1543.             Rectangle rectangle = currentBounds;
  1544.             double d2 = 0.0D;
  1545.             if(adjustingUpper)
  1546.             {
  1547.                 double d3;
  1548.                 if(gridAlignment == 1)
  1549.                 {
  1550.                     setCursor(RESIZE_CURSOR);
  1551.                     k2 -= rectangle.y;
  1552.                     if(display3dOn && rangeAdjusterPosition[adjusterIndex] == 0)
  1553.                         k2 += depth3dPoint.y;
  1554.                     d3 = 1.0D - (double)k2 / (double)rectangle.height;
  1555.                 } else
  1556.                 {
  1557.                     setCursor(RESIZE_HOR_CURSOR);
  1558.                     k2 -= rectangle.x;
  1559.                     if(display3dOn && rangeAdjusterPosition[adjusterIndex] == 0)
  1560.                         k2 += depth3dPoint.x;
  1561.                     d3 = (double)k2 / (double)rectangle.width;
  1562.                 }
  1563.                 if(rangeAdjusted[adjusterIndex] == 2)
  1564.                 {
  1565.                     int j4 = 0;
  1566.                     do
  1567.                     {
  1568.                         adjustRange(this, j4, d3, 0.0D);
  1569.                         for(int l6 = 0; l6 < overlayCharts.size(); l6++)
  1570.                             adjustRange((Chart)overlayCharts.elementAt(l6), j4, d3, 0.0D);
  1571.                     } while(++j4 < 2);
  1572.                 } else
  1573.                 {
  1574.                     adjustRange(this, rangeAdjusted[adjusterIndex], d3, 0.0D);
  1575.                     for(int k4 = 0; k4 < overlayCharts.size(); k4++)
  1576.                         adjustRange((Chart)overlayCharts.elementAt(k4), rangeAdjusted[adjusterIndex], d3, 0.0D);
  1577.                 }
  1578.             } else
  1579.             if(adjustingLower)
  1580.             {
  1581.                 double d4;
  1582.                 if(gridAlignment == 1)
  1583.                 {
  1584.                     setCursor(RESIZE_CURSOR);
  1585.                     k2 -= rectangle.y;
  1586.                     if(display3dOn && rangeAdjusterPosition[adjusterIndex] == 0)
  1587.                         k2 += depth3dPoint.y;
  1588.                     d4 = 1.0D - (double)k2 / (double)rectangle.height;
  1589.                 } else
  1590.                 {
  1591.                     setCursor(RESIZE_HOR_CURSOR);
  1592.                     k2 -= rectangle.x;
  1593.                     if(display3dOn && rangeAdjusterPosition[adjusterIndex] == 0)
  1594.                         k2 += depth3dPoint.x;
  1595.                     d4 = (double)k2 / (double)rectangle.width;
  1596.                 }
  1597.                 if(rangeAdjusted[adjusterIndex] == 2)
  1598.                 {
  1599.                     int l4 = 0;
  1600.                     do
  1601.                     {
  1602.                         adjustRange(this, l4, 0.0D, d4);
  1603.                         for(int i7 = 0; i7 < overlayCharts.size(); i7++)
  1604.                             adjustRange((Chart)overlayCharts.elementAt(i7), l4, 0.0D, d4);
  1605.                     } while(++l4 < 2);
  1606.                 } else
  1607.                 {
  1608.                     adjustRange(this, rangeAdjusted[adjusterIndex], 0.0D, d4);
  1609.                     for(int i5 = 0; i5 < overlayCharts.size(); i5++)
  1610.                         adjustRange((Chart)overlayCharts.elementAt(i5), rangeAdjusted[adjusterIndex], 0.0D, d4);
  1611.                 }
  1612.             } else
  1613.             if(slidingAdjuster)
  1614.             {
  1615.                 setCursor(MOVE_CURSOR);
  1616.                 int j5 = lastAdjusterClick - k2;
  1617.                 double d5;
  1618.                 if(gridAlignment == 1)
  1619.                     d5 = (double)j5 / (double)rectangle.height;
  1620.                 else
  1621.                     d5 = (double)j5 / (double)rectangle.width;
  1622.                 if(rangeAdjusted[adjusterIndex] == 2)
  1623.                 {
  1624.                     int j7 = 0;
  1625.                     do
  1626.                     {
  1627.                         adjustRangeSlide(this, j7, d5);
  1628.                         for(int l7 = 0; l7 < overlayCharts.size(); l7++)
  1629.                             adjustRangeSlide((Chart)overlayCharts.elementAt(l7), j7, d5);
  1630.                     } while(++j7 < 2);
  1631.                 } else
  1632.                 {
  1633.                     adjustRangeSlide(this, rangeAdjusted[adjusterIndex], d5);
  1634.                     for(int k7 = 0; k7 < overlayCharts.size(); k7++)
  1635.                         adjustRangeSlide((Chart)overlayCharts.elementAt(k7), rangeAdjusted[adjusterIndex], d5);
  1636.                 }
  1637.                 lastAdjusterClick = k2;
  1638.             } else
  1639.             if(adjustingLeft)
  1640.             {
  1641.                 if(gridAlignment == 1)
  1642.                 {
  1643.                     int k5 = sampleScrollerBounds.x + 8;
  1644.                     int l2 = Math.max(((MouseEvent)awtevent).getX(), k5);
  1645.                     l2 = Math.min(l2, rightAdjusterPos - 8);
  1646.                     leftScrollerFactor = (double)(l2 - k5) / (double)sampleScrollerSpace;
  1647.                 } else
  1648.                 {
  1649.                     int l5 = sampleScrollerBounds.y + 8;
  1650.                     int i3 = Math.max(((MouseEvent)awtevent).getY(), l5);
  1651.                     i3 = Math.min(i3, rightAdjusterPos - 8);
  1652.                     leftScrollerFactor = (double)(i3 - l5) / (double)sampleScrollerSpace;
  1653.                 }
  1654.             } else
  1655.             if(adjustingRight)
  1656.             {
  1657.                 if(gridAlignment == 1)
  1658.                 {
  1659.                     int i6 = sampleScrollerBounds.x + 8 + sampleScrollerSpace;
  1660.                     int j3 = Math.min(((MouseEvent)awtevent).getX(), i6);
  1661.                     j3 = Math.max(j3, leftAdjusterPos + 6);
  1662.                     rightScrollerFactor = (double)(i6 - j3) / (double)sampleScrollerSpace;
  1663.                 } else
  1664.                 {
  1665.                     int j6 = sampleScrollerBounds.y + 8 + sampleScrollerSpace;
  1666.                     int k3 = Math.min(((MouseEvent)awtevent).getY(), j6);
  1667.                     k3 = Math.max(k3, leftAdjusterPos + 6);
  1668.                     rightScrollerFactor = (double)(j6 - k3) / (double)sampleScrollerSpace;
  1669.                 }
  1670.             } else
  1671.             if(slidingScroller)
  1672.             {
  1673.                 int k6 = gridAlignment != 1 ? k - lastScrollerClick : j - lastScrollerClick;
  1674.                 double d6 = (double)k6 / (double)sampleScrollerSpace;
  1675.                 if(k6 > 0)
  1676.                     d6 = Math.min(d6, rightScrollerFactor);
  1677.                 else
  1678.                     d6 = -Math.min(-d6, leftScrollerFactor);
  1679.                 leftScrollerFactor += d6;
  1680.                 rightScrollerFactor -= d6;
  1681.                 lastScrollerClick = gridAlignment != 1 ? k : j;
  1682.             }
  1683.             hasChanged = true;
  1684.             repaint();
  1685.             break;
  1686.         case 502: 
  1687.             adjustingUpper = adjustingLower = slidingAdjuster = false;
  1688.             adjusterIndex = -1;
  1689.             leftPushed = rightPushed = false;
  1690.             adjustingLeft = adjustingRight = slidingScroller = false;
  1691.             if(scrollerThread != null)
  1692.             {
  1693.                 scrollerThread.stop();
  1694.                 scrollerThread = null;
  1695.             }
  1696.             hasChanged = true;
  1697.             repaint();
  1698.             break;
  1699.         }
  1700.     }
  1701.     void notifyListeners(Chart chart, int i, Object obj)
  1702.     {
  1703.         if(listeners != null)
  1704.         {
  1705.             ItemEvent itemevent = new ItemEvent(chart, 701, obj, i);
  1706.             for(Enumeration enumeration = listeners.elements(); enumeration.hasMoreElements(); ((ItemListener)enumeration.nextElement()).itemStateChanged(itemevent));
  1707.         }
  1708.     }
  1709.     public static final int HORIZONTAL = 0;
  1710.     public static final int VERTICAL = 1;
  1711.     public static final int LEFT = 0;
  1712.     public static final int RIGHT = 1;
  1713.     public static final int TOP = 2;
  1714.     public static final int BOTTOM = 3;
  1715.     public static final int TARGET_LINE_NO_LABEL = 0;
  1716.     public static final int TARGET_LINE_ID_LABEL = 1;
  1717.     public static final int TARGET_LINE_VALUE_LABEL = 2;
  1718.     public static final int TARGET_LINE_ID_AND_VALUE_LABEL = 3;
  1719.     static final int BELOW = 0;
  1720.     static final int FLOATING = 1;
  1721.     static final int BELOW_AND_FLOATING = 2;
  1722.     private static final int X_AXIS = 0;
  1723.     private static final int Y_AXIS = 1;
  1724.     protected ChartData chartData;
  1725.     protected Vector overlayCharts;
  1726.     private Color sampleColors[];
  1727.     private Color sampleLabelColors[];
  1728.     private Color seriesLabelColors[];
  1729.     private String chartTitle;
  1730.     private boolean chartTitleOn;
  1731.     private int sampleDecimalCount[];
  1732.     private boolean legendOn;
  1733.     private int legendPosition;
  1734.     private boolean valueLabelsOn[];
  1735.     private boolean display3dOn;
  1736.     private Color chartBackground;
  1737.     private Color chartForeground;
  1738.     private Hashtable labels;
  1739.     private Hashtable labelFonts;
  1740.     private Hashtable labelAngles;
  1741.     String legendLabels[];
  1742.     private Color legendColors[];
  1743.     private String legendImages[];
  1744.     private boolean automaticRepaintOn;
  1745.     private Insets graphInsets;
  1746.     private Dimension preferredSize;
  1747.     int lastSelectedSample;
  1748.     int lastSelectedSeries;
  1749.     boolean multiSeriesOn;
  1750.     int barLabelStyle;
  1751.     private boolean printAsBitmap;
  1752.     Hashtable images;
  1753.     private boolean overlayChartOn;
  1754.     private boolean servletModeOn;
  1755.     private boolean floatingOnLegendOn;
  1756.     boolean rangeOn[];
  1757.     double upperRange[];
  1758.     double lowerRange[];
  1759.     double currentUpperRange[];
  1760.     double currentLowerRange[];
  1761.     double leftSampleAxisRange;
  1762.     double rightSampleAxisRange;
  1763.     int rangePosition[];
  1764.     Color rangeColor[];
  1765.     int seriesRange[];
  1766.     boolean valueLinesOn;
  1767.     int maxValueLineCount;
  1768.     Color valueLinesColor;
  1769.     int maxGridLineCount;
  1770.     double gridLines[];
  1771.     double defaultGridLines[];
  1772.     Color defaultGridLinesColor;
  1773.     Color gridLineColors[];
  1774.     boolean rangeLabelsOn;
  1775.     int rangeDecimalCount[];
  1776.     boolean sampleLabelsOn;
  1777.     Hashtable targetsLabel;
  1778.     Hashtable targetsValue;
  1779.     Hashtable targetsColor;
  1780.     Hashtable targetsStyle;
  1781.     int zeroLine[];
  1782.     Point depth3dPoint;
  1783.     int depth3d;
  1784.     int gridAlignment;
  1785.     static final double STEPS[] = {
  1786.         1.0D, 2D, 2.5D, 5D
  1787.     };
  1788.     static final float ANGLE = 1.25F;
  1789.     static final float DEPTH = 0.75F;
  1790.     Rectangle currentBounds;
  1791.     String barLabels[];
  1792.     boolean rangeAdjusterOn[];
  1793.     int rangeAdjusterPosition[];
  1794.     int rangeAdjusted[];
  1795.     boolean adjustingUpper;
  1796.     boolean adjustingLower;
  1797.     boolean slidingAdjuster;
  1798.     int adjusterIndex;
  1799.     int lastAdjusterClick;
  1800.     Rectangle rangeAdjusterBounds[];
  1801.     static Cursor RESIZE_CURSOR;
  1802.     static Cursor RESIZE_HOR_CURSOR;
  1803.     static Cursor MOVE_CURSOR;
  1804.     static Cursor DEFAULT_CURSOR;
  1805.     boolean sampleScrollerOn;
  1806.     boolean leftPushed;
  1807.     boolean rightPushed;
  1808.     boolean adjustingLeft;
  1809.     boolean adjustingRight;
  1810.     boolean slidingScroller;
  1811.     boolean insideLeftButton;
  1812.     boolean insideRightButton;
  1813.     int lastScrollerClick;
  1814.     double leftScrollerFactor;
  1815.     double rightScrollerFactor;
  1816.     int leftAdjusterPos;
  1817.     int rightAdjusterPos;
  1818.     int sampleScrollerSpace;
  1819.     Thread scrollerThread;
  1820.     Rectangle sampleScrollerBounds;
  1821.     Rectangle chartDataBounds;
  1822.     String chartType;
  1823.     Chart parentChart;
  1824.     private ChartSample selectedSample;
  1825.     Rectangle legendBounds[];
  1826.     boolean legendSelection[];
  1827.     private Vector listeners;
  1828.     private NumberFormat numberFormatter;
  1829.     boolean hasChanged;
  1830.     Rectangle legend;
  1831.     private long lastClickTime;
  1832.     private Image rotateImage;
  1833.     private Hashtable angledLabelCache;
  1834.     private Hashtable labelSizeCache;
  1835.     double valueLines[];
  1836.     Image offscreen;
  1837.     Graphics og;
  1838.     private long lastRenderTime;
  1839.     //private Chart2 c2;
  1840.     private static final int DOUBLE_CLICK_TIME = 350;
  1841.     MediaTracker imageTracker;
  1842.     boolean externalGraphicsOn;
  1843.     private static Color DEFAULT_SAMPLE_COLORS[] = {
  1844.         new Color(132, 130, 255), new Color(132, 32, 99), new Color(255, 255, 198), new Color(165, 227, 231), new Color(99, 0, 132), new Color(255, 130, 132), new Color(0, 130, 198), new Color(198, 195, 255), new Color(0, 0, 132), new Color(255, 0, 255), 
  1845.         new Color(255, 255, 0), new Color(0, 255, 255), new Color(132, 0, 132), new Color(132, 0, 0), new Color(0, 130, 132), new Color(0, 0, 255), new Color(0, 207, 255), new Color(107, 255, 255), new Color(206, 255, 206), new Color(255, 255, 156)
  1846.     };
  1847. }