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

OA系统

开发平台:

Java

  1. // Decompiled by DJ v2.9.9.60 Copyright 2000 Atanas Neshkov  Date: 2002-12-03 18:43:55
  2. // Home Page : http://members.fortunecity.com/neshkov/dj.html  - Check often for new version!
  3. // Decompiler options: packimports(3) 
  4. // Source File Name:   PieChart.java
  5. package cn.com.fcsoft.chart;
  6. import java.awt.*;
  7. import java.awt.event.MouseEvent;
  8. import java.util.Hashtable;
  9. import java.util.Vector;
  10. // Referenced classes of package com.objectplanet.chart:
  11. //            Chart, ChartSample
  12. public class PieChart extends Chart
  13. {
  14.     public int getSeriesLabelStyle()
  15.     {
  16.         return seriesLabelStyle;
  17.     }
  18.     private void paintPies(Graphics g, Rectangle rectangle)
  19.     {
  20.         int i = getSeriesCount();
  21.         if(i == 1)
  22.         {
  23.             pieBounds[0] = rectangle;
  24.             double ad[] = getSampleValues(0);
  25.             paintPie(g, rectangle, ad, 0);
  26.         } else
  27.         {
  28.             int j = getSampleCount();
  29.             calculatePieBounds(rectangle, j);
  30.             for(int k = 0; k < j; k++)
  31.             {
  32.                 double ad1[] = new double[i];
  33.                 for(int l = 0; l < i; l++)
  34.                     ad1[l] = getSampleValue(l, k);
  35.                 paintPie(g, pieBounds[k], ad1, k);
  36.             }
  37.         }
  38.     }
  39.     public boolean isPercentLabelsOn()
  40.     {
  41.         return percentLabelsOn;
  42.     }
  43.     public boolean isSampleLabelsOn()
  44.     {
  45.         return sampleLabelsOn;
  46.     }
  47.     public boolean isPieLabelsOn()
  48.     {
  49.         return pieLabelsOn;
  50.     }
  51.     private void paintPieSegment(Graphics g, Color color, double d, double d1, int i, 
  52.             int j, int k, int l, boolean flag, double d2, int i1)
  53.     {
  54.         if(d2 > 0.0D && d1 < 360D)
  55.         {
  56.             double d3 = -d + d1 / 2D;
  57.             double d5 = d3 * 0.017453292519943295D;
  58.             k += (int)Math.round(Math.cos(d5) * ((double)i * (d2 / 2D)));
  59.             l += (int)Math.round(Math.sin(d5) * ((double)j * (d2 / 2D)));
  60.         }
  61.         if(i1 == 1 || i1 == 2)
  62.         {
  63.             double d4 = d * 0.017453292519943295D;
  64.             double d6 = (d - d1) * 0.017453292519943295D;
  65.             int l1 = (int)Math.round((double)i * pieDepth * ((double)pieAngle / 90D));
  66.             int i2 = i / 2;
  67.             int j2 = j / 2;
  68.             double d7 = Math.abs(d4 - d6) / 6.2831853071795862D;
  69.             double d8 = 3.1415926535897931D * (double)Math.max(i, j);
  70.             double d9 = d7 * d8;
  71.             double d10 = Math.abs(d4 - d6) / d9;
  72.             if(d10 > 0.0D)
  73.             {
  74.                 double d11 = d4;
  75.                 double d12 = d4;
  76.                 g.setColor(color.darker().darker());
  77.                 while(d11 >= d6) 
  78.                 {
  79.                     d11 -= d10;
  80.                     int k2 = (int)Math.round(Math.cos(d11) * (double)i2);
  81.                     int l2 = (int)Math.round(Math.sin(d11) * (double)j2);
  82.                     if(l2 < 0)
  83.                         g.drawLine(k + k2, l - l2, k + k2, (l - l2) + l1 + 1);
  84.                     else
  85.                         g.drawLine(k + k2, (l - l2) + 1, k + k2, (l - l2) + l1 + 2);
  86.                     double d13 = d11;
  87.                 }
  88.             }
  89.         }
  90.         if(i1 == 0 || i1 == 2)
  91.         {
  92.             int j1 = k - i / 2;
  93.             int k1 = l - j / 2;
  94.             g.setColor(color);
  95.             g.fillArc(j1, k1, i + 1, j + 1, (int)Math.round(d), (int)Math.round(-d1));
  96.             g.setColor(color.darker());
  97.             g.drawArc(j1, k1, i, j, (int)Math.round(d), (int)Math.round(-d1));
  98.         }
  99.         if(flag)
  100.             paintSelectionMarker(g, color, (int)Math.round(-d), (int)Math.round(-d1), i, j, k, l, selectionStyle);
  101.     }
  102.     protected void processEvent(AWTEvent awtevent)
  103.     {
  104.         switch(awtevent.getID())
  105.         {
  106.         case 504: 
  107.         default:
  108.             break;
  109.         case 505: 
  110.             selectedSample = -1;
  111.             selectedSeries = -1;
  112.             repaint();
  113.             break;
  114.         case 503: 
  115.         case 506: 
  116.             MouseEvent mouseevent = (MouseEvent)awtevent;
  117.             if(!seriesLabelsOn && !sampleLabelsOn && !isValueLabelsOn() && !percentLabelsOn)
  118.                 break;
  119.             Point point = new Point(mouseevent.getX(), mouseevent.getY());
  120.             ChartSample chartsample = checkSelection(point);
  121.             boolean flag = false;
  122.             if(chartsample != null)
  123.             {
  124.                 flag = chartsample.getIndex() != selectedSample || chartsample.getSeries() != selectedSeries;
  125.                 selectedSample = chartsample.getIndex();
  126.                 selectedSeries = chartsample.getSeries();
  127.             } else
  128.             {
  129.                 flag = selectedSample != -1 || selectedSeries != -1;
  130.                 selectedSample = -1;
  131.                 selectedSeries = -1;
  132.             }
  133.             if(flag)
  134.                 repaint();
  135.             break;
  136.         }
  137.         super.processEvent(awtevent);
  138.     }
  139.     public void setDepth(double d)
  140.     {
  141.         pieDepth = d;
  142.         super.hasChanged = true;
  143.         autoRepaint();
  144.     }
  145.     public float getDepth()
  146.     {
  147.         return (float)pieDepth;
  148.     }
  149.     public void setPercentLabelStyle(int i)
  150.     {
  151.         percentLabelStyle = 0;
  152.         if(i == 1 || i == 2)
  153.             percentLabelStyle = i;
  154.         super.hasChanged = true;
  155.         autoRepaint();
  156.     }
  157.     public int getPercentLabelStyle()
  158.     {
  159.         return percentLabelStyle;
  160.     }
  161.     public void setSampleLabelStyle(int i)
  162.     {
  163.         sampleLabelStyle = 0;
  164.         if(i == 1 || i == 2)
  165.             sampleLabelStyle = i;
  166.         super.hasChanged = true;
  167.         autoRepaint();
  168.     }
  169.     public int getSampleLabelStyle()
  170.     {
  171.         return sampleLabelStyle;
  172.     }
  173.     public void setDetachedDistance(double d)
  174.     {
  175.         detachedDistance = d;
  176.         super.hasChanged = true;
  177.         autoRepaint();
  178.     }
  179.     public double getDetachedDistance()
  180.     {
  181.         return detachedDistance;
  182.     }
  183.     public void setDetachedSlice(int i, int j, double d)
  184.     {
  185.         Double double1 = new Double(i * 0xf4240 + j);
  186.         if(d != 0.0D)
  187.             detachedSlices.put(double1, new Double(d));
  188.         else
  189.             detachedSlices.remove(double1);
  190.         super.hasChanged = true;
  191.         autoRepaint();
  192.     }
  193.     public double getDetachedSlice(int i, int j)
  194.     {
  195.         Double double1 = new Double(i * 0xf4240 + j);
  196.         Double double2 = (Double)detachedSlices.get(double1);
  197.         if(double2 != null)
  198.             return double2.doubleValue();
  199.         else
  200.             return 0.0D;
  201.     }
  202.     public boolean isSliceSeperatorOn()
  203.     {
  204.         return sliceSeperatorOn;
  205.     }
  206.     protected void calculateChartData(Rectangle rectangle, Rectangle rectangle1)
  207.     {
  208.     }
  209.     public double getPercentValue(int i, int j)
  210.     {
  211.         if(i < 0 || i >= getSeriesCount())
  212.             throw new IllegalArgumentException("Invalid series index: " + i);
  213.         if(j < 0 || j >= getSampleCount())
  214.             throw new IllegalArgumentException("Invalid sample index: " + j);
  215.         int k = getSeriesCount();
  216.         if(k == 1)
  217.         {
  218.             int l = getSampleCount();
  219.             double d1 = 0.0D;
  220.             for(int j1 = 0; j1 < l; j1++)
  221.             {
  222.                 double d5 = getSampleValue(0, j1);
  223.                 if(d5 > 0.0D)
  224.                     d1 += d5;
  225.             }
  226.             double d3 = getSampleValue(0, j);
  227.             if(d3 >= 0.0D)
  228.                 return (d3 / d1) * 100D;
  229.         } else
  230.         {
  231.             double d = 0.0D;
  232.             for(int i1 = 0; i1 < k; i1++)
  233.             {
  234.                 double d4 = getSampleValue(i1, j);
  235.                 if(d4 > 0.0D)
  236.                     d += d4;
  237.             }
  238.             double d2 = getSampleValue(i, j);
  239.             if(d2 > 0.0D)
  240.                 return (d2 / d) * 100D;
  241.         }
  242.         return 0.0D;
  243.     }
  244.     private void paintFloatingLabels(Graphics g, int i, int j)
  245.     {
  246.         int k = getSeriesCount();
  247.         int l = getSampleCount();
  248.         if(g == null || i < 0 || i >= k || j < -1 || j >= l)
  249.             return;
  250.         Font font = getFont("floatingLabelFont");
  251.         g.setFont(font);
  252.         FontMetrics fontmetrics = g.getFontMetrics();
  253.         boolean flag = isValueLabelsOn() && valueLabelStyle == 0;
  254.         boolean flag1 = percentLabelsOn && percentLabelStyle == 0;
  255.         boolean flag2 = sampleLabelsOn && sampleLabelStyle == 0;
  256.         boolean flag3 = seriesLabelsOn && k > 1 && seriesLabelStyle == 0;
  257.         if(j >= 0)
  258.         {
  259.             String s = constructLabel(i, j, flag3, flag2, flag, flag1);
  260.             paintFloatingLabel(g, s, i, j, font, fontmetrics);
  261.         } else
  262.         if(isFloatingOnLegendOn())
  263.         {
  264.             for(int i1 = 0; i1 < l; i1++)
  265.             {
  266.                 String s1 = constructLabel(i, i1, flag3, flag2, flag, flag1);
  267.                 paintFloatingLabel(g, s1, i, i1, font, fontmetrics);
  268.             }
  269.         }
  270.     }
  271.     private void paintSelectionMarker(Graphics g, Color color, double d, double d1, int i, 
  272.             int j, int k, int l, int i1)
  273.     {
  274.         if(i1 == 1)
  275.         {
  276.             double d2 = d - d1 / 2D;
  277.             double d4 = d2 * 0.017453292519943295D;
  278.             int j1 = k + (int)Math.round(Math.cos(d4) * ((double)i * 0.40000000000000002D));
  279.             int l1 = l + (int)Math.round(Math.sin(d4) * ((double)j * 0.40000000000000002D));
  280.             int j2 = Math.max(i / 16, 3);
  281.             int l2 = Math.max(j / 16, 3);
  282.             int j3 = j2 / 2;
  283.             int k3 = l2 / 2;
  284.             g.setColor(color.darker());
  285.             g.fillOval(j1 - j3, l1 - k3, j2, l2);
  286.             g.setColor(color.darker());
  287.             g.drawArc(j1 - j3, l1 - k3, j2, l2, 45, 180);
  288.             g.setColor(color.darker().darker());
  289.             g.drawArc((j1 - j3) + 1, (l1 - k3) + 1, j2 - 2, l2 - 2, 45, 180);
  290.             g.setColor(color);
  291.             g.drawArc((j1 - j3) + 1, (l1 - k3) + 1, j2 - 2, l2 - 2, 45, -180);
  292.             g.setColor(color.brighter());
  293.             g.drawArc(j1 - j3, l1 - k3, j2, l2, 45, -180);
  294.         } else
  295.         if(i1 == 0)
  296.         {
  297.             double d3 = d - d1 / 2D;
  298.             double d5 = d3 * 0.017453292519943295D;
  299.             int k1 = (int)Math.round((double)i * 0.69999999999999996D);
  300.             int i2 = (int)Math.round((double)j * 0.69999999999999996D);
  301.             int k2 = k + (int)Math.round(Math.cos(d5) * ((double)i * 0.10000000000000001D));
  302.             int i3 = l + (int)Math.round(Math.sin(d5) * ((double)j * 0.10000000000000001D));
  303.             k2 -= (int)Math.round((double)k1 / 2D);
  304.             i3 -= (int)Math.round((double)i2 / 2D);
  305.             g.setColor(color.darker());
  306.             g.fillArc(k2, i3, k1 + 1, i2 + 1, (int)(-Math.round(d)), (int)Math.round(d1));
  307.         }
  308.     }
  309.     public void setPercentLabelsOn(boolean flag)
  310.     {
  311.         percentLabelsOn = flag;
  312.         super.hasChanged = true;
  313.         autoRepaint();
  314.     }
  315.     public void setSampleLabelsOn(boolean flag)
  316.     {
  317.         sampleLabelsOn = flag;
  318.         super.hasChanged = true;
  319.         autoRepaint();
  320.     }
  321.     public boolean isSeriesLabelsOn()
  322.     {
  323.         return seriesLabelsOn;
  324.     }
  325.     public void setPieLabelsOn(boolean flag)
  326.     {
  327.         pieLabelsOn = flag;
  328.         super.hasChanged = true;
  329.         autoRepaint();
  330.     }
  331.     private void paintPie(Graphics g, Rectangle rectangle, double ad[], int i)
  332.     {
  333.         if(rectangle == null || rectangle.width <= 0 || rectangle.height <= 0)
  334.             return;
  335.         int j = Math.min(rectangle.width, rectangle.height);
  336.         int k = j;
  337.         int l = k;
  338.         int j1 = rectangle.x + rectangle.width / 2;
  339.         int k1 = rectangle.y + rectangle.height / 2;
  340.         Font font = getFont("pieLabelFont");
  341.         if(font != null)
  342.             g.setFont(font);
  343.         else
  344.             g.setFont(getFont());
  345.         FontMetrics fontmetrics = g.getFontMetrics();
  346.         boolean flag = is3DModeOn();
  347.         if(flag)
  348.         {
  349.             int l1 = (int)Math.round((double)j * ((double)pieAngle / 90D));
  350.             k -= l1;
  351.             int i2 = (int)Math.round((double)j * pieDepth * ((double)pieAngle / 90D));
  352.             int i1 = k + i2;
  353.             k1 -= i2 / 2;
  354.             double d1 = (double)rectangle.width / (double)j;
  355.             int i3 = (int)Math.round((double)j * d1);
  356.             int l3 = (int)Math.round((double)k * d1);
  357.             i2 = (int)Math.round((double)i3 * pieDepth * ((double)pieAngle / 90D));
  358.             i1 = l3 + i2;
  359.             k1 = (rectangle.y + rectangle.height / 2) - i2 / 2;
  360.             if(k1 - l3 / 2 < rectangle.y)
  361.             {
  362.                 double d6 = (double)l3 / (double)i1;
  363.                 i1 = rectangle.height;
  364.                 l3 = (int)Math.round((double)i1 * d6);
  365.                 int j2 = rectangle.height - l3;
  366.                 double d2 = (double)j / (double)k;
  367.                 i3 = (int)Math.round((double)l3 * d2);
  368.                 k1 = (rectangle.y + rectangle.height / 2) - j2 / 2;
  369.             }
  370.             j = i3;
  371.             k = l3;
  372.         }
  373.         if(pieLabelsOn)
  374.         {
  375.             Font font1 = getFont("pieLabelFont");
  376.             String s = getSampleLabel(i);
  377.             Dimension dimension = getLabelSize(s, font1);
  378.             if(flag)
  379.             {
  380.                 int l2 = (int)Math.round((double)j * pieDepth * ((double)pieAngle / 90D));
  381.                 int j3 = ((k1 + k / 2 + dimension.height) - fontmetrics.getDescent()) + 2;
  382.                 j3 += l2;
  383.                 if(j3 > rectangle.y + rectangle.height)
  384.                 {
  385.                     int i4 = j3 - (rectangle.y + rectangle.height);
  386.                     k -= i4;
  387.                     k1 -= i4 / 2;
  388.                 }
  389.             } else
  390.             {
  391.                 k -= dimension.height;
  392.                 j = k;
  393.                 k1 -= dimension.height / 2;
  394.             }
  395.         }
  396.         pieCenter[i].x = j1;
  397.         pieCenter[i].y = k1;
  398.         pieWidth[i] = j;
  399.         double d = 0.0D;
  400.         for(int k2 = 0; k2 < ad.length; k2++)
  401.             if(ad[k2] > 0.0D)
  402.                 d += ad[k2];
  403.         double d3 = 90D;
  404.         int k3 = getSeriesCount();
  405.         for(int j4 = 0; j4 < ad.length; j4++)
  406.         {
  407.             double d7 = (ad[j4] / d) * 360D;
  408.             if(k3 == 1)
  409.                 angles[0][j4] = d3;
  410.             else
  411.                 angles[j4][i] = d3;
  412.             d3 -= d7;
  413.         }
  414.         if(flag)
  415.         {
  416.             int k4 = k1;
  417.             k1 += (int)Math.round((double)j * pieDepth * ((double)pieAngle / 90D));
  418.             for(int j5 = 0; j5 < ad.length; j5++)
  419.             {
  420.                 double d10 = -270D;
  421.                 double d15 = d10;
  422.                 if(k3 == 1)
  423.                 {
  424.                     if(j5 < angles[0].length - 1)
  425.                         d10 = angles[0][j5 + 1];
  426.                     d15 = angles[0][j5];
  427.                 } else
  428.                 {
  429.                     if(j5 < angles.length - 1)
  430.                         d10 = angles[j5 + 1][i];
  431.                     d15 = angles[j5][i];
  432.                 }
  433.                 if(d15 != d10)
  434.                 {
  435.                     boolean flag4 = false;
  436.                     if(k3 == 1)
  437.                         flag4 = isSelected(0, j5);
  438.                     else
  439.                         flag4 = isSelected(j5, i);
  440.                     double d19 = 0.0D;
  441.                     if(flag4 && selectionStyle == 2)
  442.                         d19 = detachedDistance;
  443.                     else
  444.                     if(k3 == 1)
  445.                         d19 = getDetachedSlice(0, j5);
  446.                     else
  447.                         d19 = getDetachedSlice(j5, i);
  448.                     flag4 = false;
  449.                     paintPieSegment(g, getSampleColor(j5).darker(), d15, d15 - d10, j, k, j1, k1, flag4, d19, 0);
  450.                 }
  451.             }
  452.             k1 = k4;
  453.         }
  454.         if(flag)
  455.         {
  456.             double d4 = -270D;
  457.             double d11;
  458.             for(int k5 = ad.length - 1; d4 < -90D && k5 >= 0; d4 = d11)
  459.             {
  460.                 d11 = d4;
  461.                 if(k3 == 1)
  462.                     d11 = angles[0][k5];
  463.                 else
  464.                     d11 = angles[k5][i];
  465.                 boolean flag1 = false;
  466.                 if(k3 == 1)
  467.                     flag1 = isSelected(0, k5);
  468.                 else
  469.                     flag1 = isSelected(k5, i);
  470.                 double d16 = 0.0D;
  471.                 if(flag1 && selectionStyle == 2)
  472.                     d16 = detachedDistance;
  473.                 else
  474.                 if(k3 == 1)
  475.                     d16 = getDetachedSlice(0, k5);
  476.                 else
  477.                     d16 = getDetachedSlice(k5, i);
  478.                 paintPieSegment(g, getSampleColor(k5), d11, d11 - d4, j, k, j1, k1, flag1, d16, 1);
  479.                 k5--;
  480.             }
  481.             for(int l5 = 0; l5 < ad.length; l5++)
  482.             {
  483.                 double d5 = -270D;
  484.                 double d12 = d5;
  485.                 if(k3 == 1)
  486.                 {
  487.                     if(l5 < angles[0].length - 1)
  488.                         d5 = angles[0][l5 + 1];
  489.                     d12 = angles[0][l5];
  490.                 } else
  491.                 {
  492.                     if(l5 < angles.length - 1)
  493.                         d5 = angles[l5 + 1][i];
  494.                     d12 = angles[l5][i];
  495.                 }
  496.                 if(d12 >= -90D)
  497.                 {
  498.                     boolean flag2 = false;
  499.                     if(k3 == 1)
  500.                         flag2 = isSelected(0, l5);
  501.                     else
  502.                         flag2 = isSelected(l5, i);
  503.                     double d17 = 0.0D;
  504.                     if(flag2 && selectionStyle == 2)
  505.                         d17 = detachedDistance;
  506.                     else
  507.                     if(k3 == 1)
  508.                         d17 = getDetachedSlice(0, l5);
  509.                     else
  510.                         d17 = getDetachedSlice(l5, i);
  511.                     paintPieSegment(g, getSampleColor(l5), d12, d12 - d5, j, k, j1, k1, flag2, d17, 1);
  512.                 }
  513.             }
  514.         }
  515.         for(int l4 = 0; l4 < ad.length; l4++)
  516.         {
  517.             double d8 = -270D;
  518.             double d13 = d8;
  519.             if(k3 == 1)
  520.             {
  521.                 if(l4 < angles[0].length - 1)
  522.                     d8 = angles[0][l4 + 1];
  523.                 d13 = angles[0][l4];
  524.             } else
  525.             {
  526.                 if(l4 < angles.length - 1)
  527.                     d8 = angles[l4 + 1][i];
  528.                 d13 = angles[l4][i];
  529.             }
  530.             if(d13 != d8)
  531.             {
  532.                 boolean flag3 = false;
  533.                 if(k3 == 1)
  534.                     flag3 = isSelected(0, l4);
  535.                 else
  536.                     flag3 = isSelected(l4, i);
  537.                 double d18 = 0.0D;
  538.                 if(flag3 && selectionStyle == 2)
  539.                     d18 = detachedDistance;
  540.                 else
  541.                 if(k3 == 1)
  542.                     d18 = getDetachedSlice(0, l4);
  543.                 else
  544.                     d18 = getDetachedSlice(l4, i);
  545.                 paintPieSegment(g, getSampleColor(l4), d13, d13 - d8, j, k, j1, k1, flag3, d18, 0);
  546.             }
  547.         }
  548.         if(sliceSeperatorOn)
  549.         {
  550.             for(int i5 = 0; i5 < ad.length; i5++)
  551.             {
  552.                 double d9 = 0.0D;
  553.                 if(k3 == 1)
  554.                     d9 = angles[0][i5];
  555.                 else
  556.                     d9 = angles[i5][i];
  557.                 double d14 = -d9 * 0.017453292519943295D;
  558.                 int k6 = j1 + (int)Math.round(Math.cos(d14) * ((double)j * 0.5D));
  559.                 int l6 = k1 + (int)Math.round(Math.sin(d14) * ((double)k * 0.5D));
  560.                 if(sliceSeperatorColor != null)
  561.                     g.setColor(sliceSeperatorColor);
  562.                 else
  563.                     g.setColor(getSampleColor(i5).darker());
  564.                 g.drawLine(j1, k1, k6, l6);
  565.             }
  566.         }
  567.         if(pieLabelsOn)
  568.         {
  569.             String s1 = k3 != 1 ? getSampleLabel(i) : getSeriesLabel(i);
  570.             Font font2 = getFont("pieLabelFont");
  571.             if(s1 != null && s1.trim().length() > 0)
  572.             {
  573.                 Dimension dimension1 = getLabelSize(s1, font2);
  574.                 int i6 = j1 - dimension1.width / 2;
  575.                 int j6 = ((k1 + k / 2 + fontmetrics.getHeight()) - fontmetrics.getDescent()) + 2;
  576.                 if(flag)
  577.                     j6 += (int)Math.round((double)j * pieDepth * ((double)pieAngle / 90D));
  578.                 Color color = getSampleLabelColor(i);
  579.                 g.setColor(color == null ? getForeground() : color);
  580.                 paintLabel(g, s1, i6, j6, dimension1, 0, 0);
  581.             }
  582.         }
  583.     }
  584.     private String constructLabel(int i, int j, boolean flag, boolean flag1, boolean flag2, boolean flag3)
  585.     {
  586.         int k = getSeriesCount();
  587.         int l = getSampleCount();
  588.         if(i < 0 || i >= k || j < 0 || j >= l)
  589.             return "";
  590.         String s = getLabel("valueLabelPrefix_" + i);
  591.         if(s == null)
  592.             s = getLabel("valueLabelPrefix");
  593.         String s1 = getLabel("valueLabelPostfix_" + i);
  594.         if(s1 == null)
  595.             s1 = getLabel("valueLabelPostfix");
  596.         String s2 = flag ? getSeriesLabel(i) : null;
  597.         String s3 = flag1 ? getSampleLabel(j) : null;
  598.         String s4 = flag2 ? formatNumber(getSampleValue(i, j), getSampleDecimalCount(i)) : null;
  599.         s4 = s == null || s4 == null ? s4 : s + s4;
  600.         s4 = s1 == null || s4 == null ? s4 : s4 + s1;
  601.         String s5 = flag3 ? formatNumber(getPercentValue(i, j), getPercentDecimalCount()) + "%" : null;
  602.         StringBuffer stringbuffer = new StringBuffer();
  603.         if(s2 != null)
  604.         {
  605.             stringbuffer.append(s2);
  606.             if(!s2.endsWith("n") && (s3 != null || s4 != null || s5 != null))
  607.                 stringbuffer.append(" : ");
  608.         }
  609.         if(s3 != null)
  610.         {
  611.             stringbuffer.append(s3);
  612.             if(!s3.endsWith("n") && (s4 != null || s5 != null))
  613.                 stringbuffer.append(" : ");
  614.         }
  615.         if(s4 != null)
  616.         {
  617.             stringbuffer.append(s4);
  618.             if(!s4.endsWith("n") && s5 != null)
  619.                 stringbuffer.append(" : ");
  620.         }
  621.         if(s5 != null)
  622.             stringbuffer.append(s5);
  623.         return stringbuffer.toString();
  624.     }
  625.     private void paintStaticLabels(Graphics g)
  626.     {
  627.         if(g == null)
  628.             return;
  629.         int i = getSeriesCount();
  630.         boolean flag = percentLabelsOn && percentLabelStyle != 0;
  631.         flag |= isValueLabelsOn() && valueLabelStyle != 0;
  632.         flag |= sampleLabelsOn && sampleLabelStyle != 0;
  633.         flag |= seriesLabelsOn && i > 1 && seriesLabelStyle != 0;
  634.         if(!flag)
  635.             return;
  636.         Font font = getFont("insideLabelFont");
  637.         g.setFont(font);
  638.         FontMetrics fontmetrics = g.getFontMetrics();
  639.         int j = getSampleCount();
  640.         boolean flag1 = percentLabelsOn && percentLabelStyle != 0;
  641.         boolean flag2 = isValueLabelsOn() && valueLabelStyle != 0;
  642.         boolean flag3 = seriesLabelsOn && i > 1 && seriesLabelStyle != 0;
  643.         boolean flag4 = sampleLabelsOn && sampleLabelStyle != 0;
  644.         for(int k = 0; k < i; k++)
  645.         {
  646.             for(int l = 0; l < j; l++)
  647.             {
  648.                 String s = constructLabel(k, l, flag3, flag4, flag2, flag1);
  649.                 paintInsideLabel(g, s, k, l, font, fontmetrics);
  650.             }
  651.         }
  652.     }
  653.     public void setValueLabelStyle(int i)
  654.     {
  655.         valueLabelStyle = 0;
  656.         if(i == 1 || i == 2)
  657.             valueLabelStyle = i;
  658.         super.hasChanged = true;
  659.         autoRepaint();
  660.     }
  661.     public int getValueLabelStyle()
  662.     {
  663.         return valueLabelStyle;
  664.     }
  665.     public void setSliceSeperatorOn(boolean flag)
  666.     {
  667.         sliceSeperatorOn = flag;
  668.         super.hasChanged = true;
  669.         autoRepaint();
  670.     }
  671.     public ChartSample checkSelection(Point point)
  672.     {
  673.         ChartSample chartsample = super.checkSelection(point);
  674.         if(chartsample == null)
  675.         {
  676.             int i = -1;
  677.             Object obj = null;
  678.             for(int j = 0; j < pieBounds.length; j++)
  679.             {
  680.                 Rectangle rectangle = pieBounds[j];
  681.                 if(rectangle == null || !rectangle.contains(point))
  682.                     continue;
  683.                 i = j;
  684.                 break;
  685.             }
  686.             if(i >= 0)
  687.             {
  688.                 point.x -= pieCenter[i].x;
  689.                 point.y -= pieCenter[i].y;
  690.                 if(is3DModeOn())
  691.                 {
  692.                     int k = pieWidth[i];
  693.                     int l = (int)Math.round((double)k * ((double)pieAngle / 90D));
  694.                     double d2 = (double)k / (double)(k - l);
  695.                     point.y = (int)Math.round((double)point.y * d2);
  696.                 }
  697.                 double d = Math.atan2(point.y, point.x);
  698.                 double d3 = -(d * 57.295779513082323D);
  699.                 if(d3 > 90D && d3 <= 180D)
  700.                     d3 = -360D + d3;
  701.                 int i1 = getSeriesCount();
  702.                 double d5 = 0.0D;
  703.                 double d6 = 0.0D;
  704.                 double d7 = 0.0D;
  705.                 if(i1 == 1)
  706.                 {
  707.                     int j1 = getSampleCount();
  708.                     for(int l1 = 0; l1 < j1; l1++)
  709.                     {
  710.                         if(l1 < j1 - 1)
  711.                         {
  712.                             d6 = Math.min(angles[0][l1], angles[0][l1 + 1]);
  713.                             d7 = Math.max(angles[0][l1], angles[0][l1 + 1]);
  714.                         } else
  715.                         {
  716.                             d6 = Math.min(angles[0][l1], -270D);
  717.                             d7 = Math.max(angles[0][l1], -270D);
  718.                         }
  719.                         if(d3 < d6 || d3 >= d7)
  720.                             continue;
  721.                         chartsample = getSample(0, l1);
  722.                         d5 = (d6 + d7) / 2D;
  723.                         break;
  724.                     }
  725.                 } else
  726.                 {
  727.                     for(int k1 = 0; k1 < i1; k1++)
  728.                     {
  729.                         if(k1 < i1 - 1)
  730.                         {
  731.                             d6 = Math.min(angles[k1][i], angles[k1 + 1][i]);
  732.                             d7 = Math.max(angles[k1][i], angles[k1 + 1][i]);
  733.                         } else
  734.                         {
  735.                             d6 = Math.min(angles[k1][i], -270D);
  736.                             d7 = Math.max(angles[k1][i], -270D);
  737.                         }
  738.                         if(d3 < d6 || d3 >= d7)
  739.                             continue;
  740.                         chartsample = getSample(k1, i);
  741.                         d5 = (d6 + d7) / 2D;
  742.                         break;
  743.                     }
  744.                 }
  745.                 if(chartsample != null && chartsample.isSelected() && selectionStyle == 2)
  746.                 {
  747.                     double d8 = d5 * 0.017453292519943295D;
  748.                     point.x -= Math.cos(d8) * (double)pieWidth[i] * 0.5D * detachedDistance;
  749.                     point.y += Math.sin(d8) * (double)pieWidth[i] * 0.5D * detachedDistance;
  750.                     double d1 = Math.atan2(point.y, point.x);
  751.                     double d4 = -(d1 * 57.295779513082323D);
  752.                     if(d4 > 90D && d4 <= 180D)
  753.                         d4 = -360D + d4;
  754.                     if(d4 < d6 || d4 >= d7)
  755.                         return null;
  756.                 }
  757.                 double d9 = Math.sqrt(point.x * point.x + point.y * point.y);
  758.                 if(d9 > (double)(pieWidth[i] / 2))
  759.                     return null;
  760.             }
  761.         }
  762.         return chartsample;
  763.     }
  764.     protected void renderData(Graphics g, Rectangle rectangle, Rectangle rectangle1)
  765.     {
  766.         paintPies(g, rectangle);
  767.         paintStaticLabels(g);
  768.     }
  769.     public void reset()
  770.     {
  771.         super.reset();
  772.         pieAngle = 20;
  773.         pieDepth = 0.40000000596046448D;
  774.         sampleLabelsOn = false;
  775.         percentLabelsOn = false;
  776.         pieLabelsOn = false;
  777.         percentDecimalCount = 0;
  778.         selectionStyle = 0;
  779.         sliceSeperatorOn = true;
  780.         sliceSeperatorColor = null;
  781.         detachedDistance = 0.10000000000000001D;
  782.         if(detachedSlices != null)
  783.             detachedSlices.clear();
  784.         percentLabelStyle = 0;
  785.         valueLabelStyle = 0;
  786.         sampleLabelStyle = 0;
  787.         seriesLabelStyle = 0;
  788.         selectedSample = -1;
  789.         selectedSeries = -1;
  790.     }
  791.     public PieChart()
  792.     {
  793.         this(1);
  794.     }
  795.     public PieChart(int i)
  796.     {
  797.         this(1, i);
  798.     }
  799.     public PieChart(int i, int j)
  800.     {
  801.         super(i, j);
  802.         super.chartType = "pie";
  803.         angles = new double[i][j];
  804.         detachedSlices = new Hashtable();
  805.         pieBounds = new Rectangle[i != 1 ? j : 1];
  806.         pieCenter = new Point[pieBounds.length];
  807.         pieWidth = new int[pieBounds.length];
  808.         for(int k = 0; k < pieBounds.length; k++)
  809.         {
  810.             pieBounds[k] = new Rectangle();
  811.             pieCenter[k] = new Point();
  812.         }
  813.     }
  814.     public void setPercentDecimalCount(int i)
  815.     {
  816.         percentDecimalCount = i;
  817.         super.hasChanged = true;
  818.         autoRepaint();
  819.     }
  820.     public int getPercentDecimalCount()
  821.     {
  822.         return percentDecimalCount;
  823.     }
  824.     public void setSliceSeperatorColor(Color color)
  825.     {
  826.         sliceSeperatorColor = color;
  827.         super.hasChanged = true;
  828.         autoRepaint();
  829.     }
  830.     public Color getSliceSeperatorColor()
  831.     {
  832.         return sliceSeperatorColor;
  833.     }
  834.     public void setFont(String s, Font font)
  835.     {
  836.         super.setFont(s, font);
  837.     }
  838.     public void setAngle(int i)
  839.     {
  840.         pieAngle = i;
  841.         super.hasChanged = true;
  842.         autoRepaint();
  843.     }
  844.     public int getAngle()
  845.     {
  846.         return pieAngle;
  847.     }
  848.     public void setSelectionStyle(int i)
  849.     {
  850.         selectionStyle = i;
  851.         super.hasChanged = true;
  852.         autoRepaint();
  853.     }
  854.     public int getSelectionStyle()
  855.     {
  856.         return selectionStyle;
  857.     }
  858.     public void render(Graphics g)
  859.     {
  860.         render(g, !isServletModeOn());
  861.     }
  862.     public void setSeriesLabelsOn(boolean flag)
  863.     {
  864.         seriesLabelsOn = flag;
  865.         super.hasChanged = true;
  866.         autoRepaint();
  867.     }
  868.     protected void checkDataIntegrity()
  869.     {
  870.         super.checkDataIntegrity();
  871.         int i = getSeriesCount();
  872.         int j = getSampleCount();
  873.         angles = new double[i][j];
  874.         pieBounds = new Rectangle[i != 1 ? j : 1];
  875.         pieCenter = new Point[pieBounds.length];
  876.         pieWidth = new int[pieBounds.length];
  877.         for(int k = 0; k < pieBounds.length; k++)
  878.         {
  879.             pieBounds[k] = new Rectangle();
  880.             pieCenter[k] = new Point();
  881.         }
  882.     }
  883.     void render(Graphics g, boolean flag)
  884.     {
  885.         Rectangle rectangle = getGraphBounds();
  886.         for(int i = 0; i < super.overlayCharts.size(); i++)
  887.         {
  888.             Chart chart = (Chart)super.overlayCharts.elementAt(i);
  889.             if(chart != null)
  890.                 chart.calculateChartData(rectangle, rectangle);
  891.         }
  892.         Dimension dimension = getSize();
  893.         if(flag && super.offscreen == null)
  894.         {
  895.             super.offscreen = createImage(Math.max(1, dimension.width), Math.max(1, dimension.height));
  896.             super.hasChanged = true;
  897.         }
  898.         if(!flag || super.hasChanged || super.offscreen == null)
  899.         {
  900.             if(!super.externalGraphicsOn && !flag)
  901.                 super.og = g;
  902.             else
  903.             if(flag || super.externalGraphicsOn)
  904.             {
  905.                 if(!super.externalGraphicsOn && super.offscreen != null)
  906.                     super.og = super.offscreen.getGraphics();
  907.                 super.og.setColor(getBackground());
  908.                 super.og.fillRect(0, 0, dimension.width, dimension.height);
  909.             }
  910.             paintTitle(super.og, dimension);
  911.             renderData(super.og, rectangle, rectangle);
  912.             for(int j = 0; j < super.overlayCharts.size(); j++)
  913.             {
  914.                 Chart chart1 = (Chart)super.overlayCharts.elementAt(j);
  915.                 if(chart1 != null)
  916.                     chart1.renderData(super.og, rectangle, rectangle);
  917.             }
  918.             if(isLegendOn())
  919.                 paintLegend(super.og, rectangle, getLegendLabels());
  920.             if(!super.externalGraphicsOn && super.og != g)
  921.                 super.og.dispose();
  922.             super.hasChanged = false;
  923.         }
  924.         if((flag || super.externalGraphicsOn) && super.offscreen != null)
  925.             g.drawImage(super.offscreen, 0, 0, this);
  926.         if(sampleLabelsOn && sampleLabelStyle == 0 || seriesLabelsOn && seriesLabelStyle == 0 || isValueLabelsOn() && valueLabelStyle == 0 || percentLabelsOn && percentLabelStyle == 0)
  927.             paintFloatingLabels(g, selectedSeries, selectedSample);
  928.     }
  929.     public Rectangle getGraphBounds()
  930.     {
  931.         if(!super.hasChanged && super.currentBounds != null)
  932.             return super.currentBounds;
  933.         Rectangle rectangle = super.getGraphBounds(getLegendLabels());
  934.         Insets insets = getGraphInsets();
  935.         if(insets != null)
  936.         {
  937.             Dimension dimension = getSize();
  938.             if(insets.top != -1)
  939.             {
  940.                 int i = rectangle.y + rectangle.height;
  941.                 rectangle.y = insets.top;
  942.                 rectangle.height = i - rectangle.y;
  943.             }
  944.             if(insets.left != -1)
  945.             {
  946.                 int j = rectangle.x + rectangle.width;
  947.                 rectangle.x = insets.left;
  948.                 rectangle.width = j - rectangle.x;
  949.             }
  950.             if(insets.bottom != -1)
  951.                 rectangle.height = dimension.height - insets.bottom - rectangle.y;
  952.             if(insets.right != -1)
  953.                 rectangle.width = dimension.width - insets.right - rectangle.x;
  954.         }
  955.         super.currentBounds = rectangle;
  956.         return rectangle;
  957.     }
  958.     private void calculatePieBounds(Rectangle rectangle, int i)
  959.     {
  960.         int j = 0;
  961.         int k = i;
  962.         int l = 1;
  963.         for(int i1 = 1; i1 <= i; i1++)
  964.         {
  965.             for(int k1 = 1; k1 <= i; k1++)
  966.                 if(i1 * k1 >= i)
  967.                 {
  968.                     int i2 = Math.min(rectangle.width / i1, rectangle.height / k1);
  969.                     if(i2 > j)
  970.                     {
  971.                         j = i2;
  972.                         k = i1;
  973.                         l = k1;
  974.                     }
  975.                 }
  976.         }
  977.         int j1 = 0;
  978.         for(int l1 = 0; l1 < l; l1++)
  979.         {
  980.             for(int j2 = 0; j2 < k; j2++)
  981.                 if(j1 < i)
  982.                 {
  983.                     Rectangle rectangle1 = pieBounds[j1];
  984.                     rectangle1.width = rectangle.width / k;
  985.                     rectangle1.height = rectangle.height / l;
  986.                     rectangle1.x = rectangle.x + rectangle1.width * j2;
  987.                     rectangle1.y = rectangle.y + rectangle1.height * l1;
  988.                     rectangle1.width -= 10;
  989.                     rectangle1.height -= 10;
  990.                     rectangle1.x += 5;
  991.                     rectangle1.y += 5;
  992.                     j1++;
  993.                 }
  994.         }
  995.     }
  996.     private void paintFloatingLabel(Graphics g, String s, int i, int j, Font font, FontMetrics fontmetrics)
  997.     {
  998.         int k = getSeriesCount();
  999.         Point point = pieCenter[k <= 1 ? 0 : j];
  1000.         if(point == null)
  1001.             return;
  1002.         double d = 0.0D;
  1003.         if(k == 1)
  1004.         {
  1005.             if(j < angles[0].length - 1)
  1006.                 d = -((angles[0][j] + angles[0][j + 1]) / 2D);
  1007.             else
  1008.                 d = -((angles[0][j] - 270D) / 2D);
  1009.         } else
  1010.         if(i < angles.length - 1)
  1011.             d = -((angles[i][j] + angles[i + 1][j]) / 2D);
  1012.         else
  1013.             d = -((angles[i][j] - 270D) / 2D);
  1014.         double d1 = 1.0D;
  1015.         int l = pieWidth[k != 1 ? j : 0];
  1016.         if(is3DModeOn())
  1017.         {
  1018.             int i1 = (int)Math.round((double)l * ((double)pieAngle / 90D));
  1019.             d1 = (double)(l - i1) / (double)l;
  1020.         }
  1021.         double d2 = d * 0.017453292519943295D;
  1022.         int j1 = point.x + (int)Math.round(Math.cos(d2) * (double)l * 0.29999999999999999D);
  1023.         int k1 = point.y + (int)Math.round(Math.sin(d2) * (double)l * 0.29999999999999999D * d1);
  1024.         Dimension dimension = getLabelSize(s, font);
  1025.         j1 -= dimension.width / 2;
  1026.         k1 -= dimension.height / 2 - fontmetrics.getAscent();
  1027.         Dimension dimension1 = getSize();
  1028.         j1 = Math.max(j1, 3);
  1029.         j1 = Math.min(j1, dimension1.width - dimension.width - 3);
  1030.         k1 = Math.max(k1, fontmetrics.getAscent());
  1031.         k1 = Math.min(k1, ((dimension1.height - dimension.height) + fontmetrics.getAscent()) - 1);
  1032.         int l1 = fontmetrics.getHeight();
  1033.         int i2 = fontmetrics.getDescent();
  1034.         g.setColor(new Color(255, 255, 231));
  1035.         g.fillRect(j1 - 2, ((k1 - l1) + i2 * 2) - 3, dimension.width + 5, dimension.height + 2);
  1036.         g.setColor(getSampleColor(getSeriesCount() != 1 ? i : j).darker());
  1037.         g.drawRect(j1 - 3, ((k1 - l1) + i2 * 2) - 4, dimension.width + 5, dimension.height + 3);
  1038.         g.setColor(Color.black);
  1039.         paintLabel(g, s, j1, k1, dimension, 0, 0);
  1040.     }
  1041.     private void paintInsideLabel(Graphics g, String s, int i, int j, Font font, FontMetrics fontmetrics)
  1042.     {
  1043.         int k = getSeriesCount();
  1044.         Point point = pieCenter[k <= 1 ? 0 : j];
  1045.         if(point == null)
  1046.             return;
  1047.         double d = 0.0D;
  1048.         double d1 = -270D;
  1049.         double d2 = d1;
  1050.         if(k == 1)
  1051.         {
  1052.             if(j < angles[0].length - 1)
  1053.                 d1 = angles[0][j + 1];
  1054.             d2 = angles[0][j];
  1055.         } else
  1056.         {
  1057.             if(i < angles.length - 1)
  1058.                 d1 = angles[i + 1][j];
  1059.             d2 = angles[i][j];
  1060.         }
  1061.         d = -((d2 + d1) / 2D);
  1062.         double d3 = 1.0D;
  1063.         int l = pieWidth[k != 1 ? j : 0];
  1064.         double d4 = 0.0D;
  1065.         if(isSelected(i, j) && d2 - d1 < 360D && selectionStyle == 2)
  1066.             d4 = ((double)l * detachedDistance) / 2D;
  1067.         if(is3DModeOn())
  1068.         {
  1069.             int i1 = (int)Math.round((double)l * ((double)pieAngle / 90D));
  1070.             d3 = (double)(l - i1) / (double)l;
  1071.         }
  1072.         double d5 = d * 0.017453292519943295D;
  1073.         int j1 = point.x + (int)Math.round(Math.cos(d5) * (double)l * 0.34999999999999998D + Math.cos(d5) * d4);
  1074.         int k1 = point.y + (int)Math.round((Math.sin(d5) * (double)l * 0.34999999999999998D + Math.sin(d5) * d4) * d3);
  1075.         Dimension dimension = getLabelSize(s, font);
  1076.         j1 -= dimension.width / 2;
  1077.         k1 -= dimension.height / 2 - fontmetrics.getAscent();
  1078.         Color color = getSampleColor(k != 1 ? i : j);
  1079.         if((color.getRed() + color.getGreen() + color.getBlue()) / 3 > 110)
  1080.             g.setColor(Color.black);
  1081.         else
  1082.             g.setColor(Color.white);
  1083.         paintLabel(g, s, j1, k1, dimension, 0, 0);
  1084.     }
  1085.     public void setSeriesLabelStyle(int i)
  1086.     {
  1087.         seriesLabelStyle = 0;
  1088.         if(i == 1 || i == 2)
  1089.             seriesLabelStyle = i;
  1090.         super.hasChanged = true;
  1091.         autoRepaint();
  1092.     }
  1093.     public static final int SELECTION_STYLE_TRIANGLE = 0;
  1094.     public static final int SELECTION_STYLE_CIRCLE = 1;
  1095.     public static final int SELECTION_STYLE_DETACHED = 2;
  1096.     public static final int FLOATING = 0;
  1097.     public static final int INSIDE = 1;
  1098.     public static final int OUTSIDE = 2;
  1099.     private int pieAngle;
  1100.     private double pieDepth;
  1101.     private boolean seriesLabelsOn;
  1102.     private boolean sampleLabelsOn;
  1103.     private boolean percentLabelsOn;
  1104.     private boolean pieLabelsOn;
  1105.     private int percentDecimalCount;
  1106.     private int selectionStyle;
  1107.     private boolean sliceSeperatorOn;
  1108.     private Color sliceSeperatorColor;
  1109.     private double detachedDistance;
  1110.     private Hashtable detachedSlices;
  1111.     private int percentLabelStyle;
  1112.     private int valueLabelStyle;
  1113.     private int seriesLabelStyle;
  1114.     private int sampleLabelStyle;
  1115.     private int selectedSample;
  1116.     private int selectedSeries;
  1117.     private double angles[][];
  1118.     private Rectangle pieBounds[];
  1119.     private Point pieCenter[];
  1120.     private int pieWidth[];
  1121.     private static final int PAINT_2D = 0;
  1122.     private static final int PAINT_3D = 1;
  1123.     private static final int PAINT_ALL = 2;
  1124. }