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

OA系统

开发平台:

Java

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