home *** CD-ROM | disk | FTP | other *** search
/ Computer Shopper 139 / dpcs0999.iso / Web / CFserver / data1.cab / Webroot / classes / CFGraphs / barchart.class (.txt) < prev    next >
Encoding:
Java Class File  |  1999-04-12  |  8.5 KB  |  466 lines

  1. import allaire.dcf.recordset.AppletParamRecordset;
  2. import allaire.dcf.recordset.Query;
  3. import allaire.dcf.recordset.Recordset;
  4. import allaire.util.Debug;
  5. import java.applet.Applet;
  6. import java.awt.Color;
  7. import java.awt.Component;
  8. import java.awt.Font;
  9. import java.awt.FontMetrics;
  10. import java.awt.Graphics;
  11. import java.awt.Panel;
  12. import java.util.Date;
  13. import java.util.Vector;
  14.  
  15. public class BarChart extends Applet implements Runnable {
  16.    static final int VERTICAL = 1;
  17.    static final int HORIZONTAL = 2;
  18.    Thread runner;
  19.    Query query;
  20.    int refreshTime;
  21.    boolean debugInfoEnabled;
  22.    String title;
  23.    String titleFontName;
  24.    Font titleFont;
  25.    FontMetrics titleFontMetrics;
  26.    int titleFontHeight;
  27.    String legendFontName;
  28.    Font legendFont;
  29.    FontMetrics legendFontMetrics;
  30.    int legendFontHeight;
  31.    int legendHeight;
  32.    int legendWidth;
  33.    boolean legendEnabled;
  34.    int orientation;
  35.    int shadow;
  36.    double scale;
  37.    boolean barBorderEnabled;
  38.    boolean showDateTime;
  39.    Color[] defaultColors;
  40.    Vector colors;
  41.    Recordset chartData;
  42.    int itemCount;
  43.    int maxLegendWidth;
  44.    double maxValue;
  45.    double minValue;
  46.    Color backgroundColor;
  47.    Color fontColor;
  48.    Color lineColor;
  49.    Panel panel;
  50.  
  51.    public void start() {
  52.       if (this.runner == null) {
  53.          this.runner = new Thread(this);
  54.          this.runner.start();
  55.       }
  56.  
  57.    }
  58.  
  59.    public BarChart() {
  60.       this.defaultColors = new Color[]{Color.red, Color.blue, Color.green, Color.yellow, Color.magenta, Color.cyan, Color.orange, Color.pink, Color.darkGray};
  61.    }
  62.  
  63.    public void stop() {
  64.       if (this.runner != null) {
  65.          this.runner.stop();
  66.          this.runner = null;
  67.       }
  68.  
  69.    }
  70.  
  71.    private void getData() {
  72.       this.maxValue = this.minValue = (double)0.0F;
  73.  
  74.       try {
  75.          if (this.chartData == null) {
  76.             this.chartData = new AppletParamRecordset(this, "ChartData");
  77.          } else {
  78.             this.query.execute();
  79.             this.chartData = this.query.getRecordset();
  80.          }
  81.  
  82.          if (this.refreshTime == 0) {
  83.             ((Applet)this).getAppletContext().showStatus("Done");
  84.          } else {
  85.             ((Applet)this).getAppletContext().showStatus("...");
  86.          }
  87.  
  88.          this.itemCount = this.chartData.getRowCount();
  89.          this.colors.setSize(this.itemCount);
  90.          this.maxLegendWidth = 0;
  91.  
  92.          for(int var1 = 0; var1 < this.itemCount; ++var1) {
  93.             this.maxLegendWidth = Math.max(this.legendFontMetrics.stringWidth(this.chartData.getData(var1 + 1, "Items")), this.maxLegendWidth);
  94.  
  95.             double var3;
  96.             try {
  97.                var3 = new Double(this.chartData.getData(var1 + 1, "Values"));
  98.             } catch (Exception var7) {
  99.                var3 = (double)0.0F;
  100.             }
  101.  
  102.             if (var3 > this.maxValue) {
  103.                this.maxValue = var3;
  104.             }
  105.  
  106.             if (var3 < this.minValue) {
  107.                this.minValue = var3;
  108.             }
  109.  
  110.             if (!this.chartData.columnExists("Colors")) {
  111.                if (var1 < 9) {
  112.                   this.colors.setElementAt(this.defaultColors[var1], var1);
  113.                } else if (var1 < 18) {
  114.                   this.colors.setElementAt(this.defaultColors[var1 - 9].darker(), var1);
  115.                } else if (var1 < 27) {
  116.                   this.colors.setElementAt(this.defaultColors[var1 - 18].darker().darker(), var1);
  117.                } else {
  118.                   this.colors.setElementAt(Color.black, var1);
  119.                }
  120.             } else {
  121.                String var2 = this.chartData.getData(var1 + 1, "Colors");
  122.                if (var2.equals("red")) {
  123.                   this.colors.setElementAt(Color.red, var1);
  124.                } else if (var2.equals("green")) {
  125.                   this.colors.setElementAt(Color.green, var1);
  126.                } else if (var2.equals("blue")) {
  127.                   this.colors.setElementAt(Color.blue, var1);
  128.                } else if (var2.equals("pink")) {
  129.                   this.colors.setElementAt(Color.pink, var1);
  130.                } else if (var2.equals("orange")) {
  131.                   this.colors.setElementAt(Color.orange, var1);
  132.                } else if (var2.equals("magenta")) {
  133.                   this.colors.setElementAt(Color.magenta, var1);
  134.                } else if (var2.equals("cyan")) {
  135.                   this.colors.setElementAt(Color.cyan, var1);
  136.                } else if (var2.equals("white")) {
  137.                   this.colors.setElementAt(Color.white, var1);
  138.                } else if (var2.equals("yellow")) {
  139.                   this.colors.setElementAt(Color.yellow, var1);
  140.                } else if (var2.equals("gray")) {
  141.                   this.colors.setElementAt(Color.gray, var1);
  142.                } else if (var2.equals("darkGray")) {
  143.                   this.colors.setElementAt(Color.darkGray, var1);
  144.                } else {
  145.                   this.colors.setElementAt(Color.black, var1);
  146.                }
  147.             }
  148.          }
  149.  
  150.       } catch (Exception var8) {
  151.          if (this.debugInfoEnabled) {
  152.             Debug.write(((Throwable)var8).getMessage());
  153.          }
  154.  
  155.       }
  156.    }
  157.  
  158.    private void pause(int var1) {
  159.       try {
  160.          Thread.sleep((long)var1);
  161.       } catch (InterruptedException var4) {
  162.          if (this.debugInfoEnabled) {
  163.             Debug.write(((Throwable)var4).getMessage());
  164.          }
  165.  
  166.       }
  167.    }
  168.  
  169.    public void run() {
  170.       while(this.refreshTime != 0) {
  171.          this.pause(this.refreshTime * 1000);
  172.          this.getData();
  173.          ((Component)this).repaint();
  174.       }
  175.  
  176.       this.stop();
  177.    }
  178.  
  179.    public synchronized void init() {
  180.       String var1 = ((Applet)this).getParameter("RefreshTime");
  181.       if (var1 == null) {
  182.          this.refreshTime = 0;
  183.       } else {
  184.          this.refreshTime = Integer.parseInt(var1);
  185.          var1 = ((Applet)this).getParameter("RefreshDataFromURL");
  186.          if (var1 == null) {
  187.             this.refreshTime = 0;
  188.          } else {
  189.             if (var1.indexOf(63) == -1) {
  190.                var1 = var1 + '?';
  191.             }
  192.  
  193.             this.query = new Query(var1);
  194.             this.query.addParam("RefreshTime", String.valueOf(this.refreshTime));
  195.          }
  196.       }
  197.  
  198.       var1 = ((Applet)this).getParameter("DebugInfoEnabled");
  199.       if (var1 == null) {
  200.          this.debugInfoEnabled = false;
  201.       } else if (var1.toLowerCase().equals("yes")) {
  202.          this.debugInfoEnabled = true;
  203.       } else {
  204.          this.debugInfoEnabled = false;
  205.       }
  206.  
  207.       this.title = ((Applet)this).getParameter("Title");
  208.       if (this.title == null) {
  209.          this.title = "Chart";
  210.       }
  211.  
  212.       this.titleFontName = ((Applet)this).getParameter("TitleFontName");
  213.       if (this.titleFontName == null) {
  214.          this.titleFontName = "TimesRoman";
  215.       }
  216.  
  217.       var1 = ((Applet)this).getParameter("TitleFontHeight");
  218.       if (var1 == null) {
  219.          this.titleFontHeight = 12;
  220.       } else {
  221.          this.titleFontHeight = Integer.parseInt(var1);
  222.       }
  223.  
  224.       var1 = ((Applet)this).getParameter("ShowDateTime");
  225.       if (var1 == null) {
  226.          this.showDateTime = true;
  227.       } else if (var1.toLowerCase().equals("yes")) {
  228.          this.showDateTime = true;
  229.       } else {
  230.          this.showDateTime = false;
  231.       }
  232.  
  233.       this.legendFontName = ((Applet)this).getParameter("LegendFontName");
  234.       if (this.legendFontName == null) {
  235.          this.legendFontName = "TimesRoman";
  236.       }
  237.  
  238.       var1 = ((Applet)this).getParameter("LegendFontHeight");
  239.       if (var1 == null) {
  240.          this.legendFontHeight = 10;
  241.       } else {
  242.          this.legendFontHeight = Integer.parseInt(var1);
  243.       }
  244.  
  245.       var1 = ((Applet)this).getParameter("DrawBorders");
  246.       if (var1 == null) {
  247.          this.barBorderEnabled = true;
  248.       } else if (var1.toLowerCase().equals("yes")) {
  249.          this.barBorderEnabled = true;
  250.       } else {
  251.          this.barBorderEnabled = false;
  252.       }
  253.  
  254.       var1 = ((Applet)this).getParameter("Orientation");
  255.       if (var1 == null) {
  256.          this.orientation = 1;
  257.       } else if (var1.toLowerCase().equals("vertical")) {
  258.          this.orientation = 1;
  259.       } else if (var1.toLowerCase().equals("horizontal")) {
  260.          this.orientation = 2;
  261.       } else {
  262.          this.orientation = 1;
  263.       }
  264.  
  265.       var1 = ((Applet)this).getParameter("Shadow");
  266.       if (var1 == null) {
  267.          this.shadow = 4;
  268.       } else {
  269.          this.shadow = Integer.parseInt(var1);
  270.       }
  271.  
  272.       var1 = ((Applet)this).getParameter("BackgroundColor");
  273.       if (var1 == null) {
  274.          this.backgroundColor = ((Component)this).getBackground();
  275.       } else {
  276.          this.backgroundColor = new Color(Integer.valueOf(var1, 16));
  277.       }
  278.  
  279.       var1 = ((Applet)this).getParameter("FontColor");
  280.       if (var1 == null) {
  281.          this.fontColor = Color.black;
  282.       } else {
  283.          this.fontColor = new Color(Integer.valueOf(var1, 16));
  284.       }
  285.  
  286.       var1 = ((Applet)this).getParameter("GridLineColor");
  287.       if (var1 == null) {
  288.          this.lineColor = Color.gray;
  289.       } else {
  290.          this.lineColor = new Color(Integer.valueOf(var1, 16));
  291.       }
  292.  
  293.       ((Component)this).setBackground(this.backgroundColor);
  294.       this.titleFont = new Font(this.titleFontName, 1, this.titleFontHeight);
  295.       this.titleFontMetrics = ((Component)this).getFontMetrics(this.titleFont);
  296.       this.legendFont = new Font(this.legendFontName, 0, this.legendFontHeight);
  297.       this.legendFontMetrics = ((Component)this).getFontMetrics(this.legendFont);
  298.       this.colors = new Vector();
  299.       this.getData();
  300.    }
  301.  
  302.    public synchronized void paint(Graphics var1) {
  303.       double var16 = (double)0.0F;
  304.       if (this.itemCount > 0) {
  305.          if (this.maxValue == (double)0.0F && this.minValue == (double)0.0F) {
  306.             this.maxValue = (double)1.0F;
  307.          }
  308.  
  309.          int var3 = ((Component)this).size().width / 15;
  310.          int var4 = ((Component)this).size().height / 15;
  311.          double var7 = Math.pow((double)10.0F, Math.floor(Math.log(this.maxValue - this.minValue) / Math.log((double)10.0F)));
  312.          if ((this.maxValue - this.minValue) / var7 < (double)6.0F) {
  313.             var7 /= (double)2.0F;
  314.          }
  315.  
  316.          var1.setColor(this.fontColor);
  317.          var1.setFont(this.titleFont);
  318.          var1.drawString(this.title, Math.max((((Component)this).size().width - this.titleFontMetrics.stringWidth(this.title)) / 2, 0), ((Component)this).size().height - var4);
  319.          var1.setFont(this.legendFont);
  320.          if (this.showDateTime) {
  321.             String var19 = (new Date()).toLocaleString();
  322.             var1.drawString("(as of " + var19 + ")", Math.max((((Component)this).size().width - this.legendFontMetrics.stringWidth("(as of " + var19 + ")")) / 2, 0), ((Component)this).size().height - var4 + this.legendFontHeight * 3 / 2);
  323.          }
  324.  
  325.          switch (this.orientation) {
  326.             case 1:
  327.                int var36 = ((Component)this).size().width - 2 * var3;
  328.                int var37 = ((Component)this).size().height - this.titleFontHeight - this.legendFontHeight - 3 * var4;
  329.                this.scale = Math.max((double)var37 / (this.maxValue - this.minValue), (double)0.0F);
  330.                int var34 = Math.max(var36 * 3 / (4 * this.itemCount), this.legendFontMetrics.stringWidth("O"));
  331.                int var35 = Math.max((var36 - this.itemCount * var34) / this.itemCount, 0);
  332.                int var26 = var3;
  333.                int var29 = var4 + (int)(this.scale * this.maxValue);
  334.  
  335.                for(double var31 = (double)0.0F; var31 < this.maxValue; var31 += var7) {
  336.                   var1.setColor(this.lineColor);
  337.                   var1.drawLine(var26, var29 - (int)(this.scale * var31), var26 + var36, var29 - (int)(this.scale * var31));
  338.                   var1.drawString("" + var31, var26 - this.legendFontMetrics.stringWidth("" + var31) - 2, var29 - (int)(this.scale * var31) + this.legendFontHeight / 2);
  339.                }
  340.  
  341.                for(double var32 = (double)0.0F; var32 > this.minValue; var32 -= var7) {
  342.                   var1.setColor(this.lineColor);
  343.                   var1.drawLine(var26, var29 - (int)(this.scale * var32), var26 + var36, var29 - (int)(this.scale * var32));
  344.                   var1.drawString("" + var32, var26 - this.legendFontMetrics.stringWidth("" + var32) - 2, var29 - (int)(this.scale * var32) + this.legendFontHeight / 2);
  345.                }
  346.  
  347.                var26 += var35 / 2 + this.shadow;
  348.  
  349.                for(int var25 = 0; var25 < this.itemCount; ++var25) {
  350.                   try {
  351.                      var16 = new Double(this.chartData.getData(var25 + 1, "Values"));
  352.                   } catch (Exception var24) {
  353.                      var16 = (double)0.0F;
  354.                   }
  355.  
  356.                   String var40;
  357.                   try {
  358.                      var40 = this.chartData.getData(var25 + 1, "Items");
  359.                   } catch (Exception var23) {
  360.                      var40 = "";
  361.                   }
  362.  
  363.                   if (this.legendFontMetrics.stringWidth(var40) > var34) {
  364.                      var40 = var40.substring(0, var40.length() * var34 / this.legendFontMetrics.stringWidth(var40));
  365.                   }
  366.  
  367.                   int var33 = (int)Math.abs(this.scale * var16);
  368.                   if (var16 < (double)0.0F) {
  369.                      var1.setColor(this.lineColor);
  370.                      var1.fillRect(var26, var29, var34, var33);
  371.                      var1.setColor((Color)this.colors.elementAt(var25));
  372.                      var1.fillRect(var26 - this.shadow, var29 + this.shadow, var34, var33);
  373.                      var1.setColor(this.fontColor);
  374.                      var1.drawString("" + var16, var26 + (var34 - this.legendFontMetrics.stringWidth("" + var16)) / 2, var29 + var33 + this.legendFontHeight + this.shadow);
  375.                      var1.drawString(var40, var26 + (var34 - this.legendFontMetrics.stringWidth(var40)) / 2, var29 - 2);
  376.                      if (this.barBorderEnabled) {
  377.                         var1.drawRect(var26 - this.shadow, var29 + this.shadow, var34 - 1, var33 - 1);
  378.                      }
  379.                   } else {
  380.                      var1.setColor(this.lineColor);
  381.                      var1.fillRect(var26, var29 - var33, var34, var33);
  382.                      var1.setColor((Color)this.colors.elementAt(var25));
  383.                      var1.fillRect(var26 - this.shadow, var29 - var33 + this.shadow, var34, var33);
  384.                      var1.setColor(this.fontColor);
  385.                      var1.drawString("" + var16, var26 + (var34 - this.legendFontMetrics.stringWidth("" + var16)) / 2, var29 - var33 - 2);
  386.                      var1.drawString(var40, var26 + (var34 - this.legendFontMetrics.stringWidth(var40)) / 2, var29 + this.legendFontHeight + this.shadow);
  387.                      if (this.barBorderEnabled) {
  388.                         var1.drawRect(var26 - this.shadow, var29 - var33 + this.shadow, var34 - 1, var33 - 1);
  389.                      }
  390.                   }
  391.  
  392.                   var26 += var34 + var35;
  393.                }
  394.  
  395.                return;
  396.             case 2:
  397.                int var14 = ((Component)this).size().width - 2 * var3 - this.maxLegendWidth;
  398.                int var15 = ((Component)this).size().height - this.titleFontHeight - this.legendFontHeight - 2 * var4;
  399.                this.scale = Math.max((double)var14 / (this.maxValue - this.minValue), (double)0.0F);
  400.                int var12 = var15 * 3 / (4 * this.itemCount);
  401.                int var13 = Math.max((var15 - this.itemCount * var12) / this.itemCount, 0);
  402.                int var5 = var3 + this.maxLegendWidth - (int)(this.scale * this.minValue) + this.shadow;
  403.                int var6 = var4;
  404.  
  405.                for(double var9 = (double)0.0F; var9 < this.maxValue; var9 += var7) {
  406.                   var1.setColor(this.lineColor);
  407.                   var1.drawLine(var5 + (int)(this.scale * var9), var6, var5 + (int)(this.scale * var9), var6 + var15);
  408.                   var1.drawString("" + var9, var5 + (int)(this.scale * var9) - this.legendFontMetrics.stringWidth("" + var9) / 2, var6 - 2);
  409.                }
  410.  
  411.                for(double var30 = (double)0.0F; var30 > this.minValue; var30 -= var7) {
  412.                   var1.setColor(this.lineColor);
  413.                   var1.drawLine(var5 + (int)(this.scale * var30), var6, var5 + (int)(this.scale * var30), var6 + var15);
  414.                   var1.drawString("" + var30, var5 + (int)(this.scale * var30) - this.legendFontMetrics.stringWidth("" + var30) / 2, var6 - 2);
  415.                }
  416.  
  417.                var6 += var13 / 2 + this.shadow;
  418.  
  419.                for(int var2 = 0; var2 < this.itemCount; ++var2) {
  420.                   try {
  421.                      var16 = new Double(this.chartData.getData(var2 + 1, "Values"));
  422.                   } catch (Exception var22) {
  423.                      var16 = (double)0.0F;
  424.                   }
  425.  
  426.                   String var18;
  427.                   try {
  428.                      var18 = this.chartData.getData(var2 + 1, "Items");
  429.                   } catch (Exception var21) {
  430.                      var18 = "";
  431.                   }
  432.  
  433.                   int var11 = (int)Math.abs(this.scale * var16);
  434.                   if (var16 < (double)0.0F) {
  435.                      var1.setColor(this.lineColor);
  436.                      var1.fillRect(var5 - var11, var6, var11, var12);
  437.                      var1.setColor((Color)this.colors.elementAt(var2));
  438.                      var1.fillRect(var5 - var11 - this.shadow, var6 - this.shadow, var11, var12);
  439.                      var1.setColor(this.fontColor);
  440.                      var1.drawString("" + var16, var5 + 3, var6 + var12 / 2 + this.legendFontHeight / 2 - this.shadow);
  441.                      if (this.barBorderEnabled) {
  442.                         var1.drawRect(var5 - var11 - this.shadow, var6 - this.shadow, var11 - 1, var12 - 1);
  443.                      }
  444.                   } else {
  445.                      var1.setColor(this.lineColor);
  446.                      var1.fillRect(var5, var6, var11, var12);
  447.                      var1.setColor((Color)this.colors.elementAt(var2));
  448.                      var1.fillRect(var5 - this.shadow, var6 - this.shadow, var11, var12);
  449.                      var1.setColor(this.fontColor);
  450.                      var1.drawString("" + var16, var5 + var11 + 3, var6 + var12 / 2 + this.legendFontHeight / 2 - this.shadow);
  451.                      if (this.barBorderEnabled) {
  452.                         var1.drawRect(var5 - this.shadow, var6 - this.shadow, var11 - 1, var12 - 1);
  453.                      }
  454.                   }
  455.  
  456.                   var1.drawString(var18, var3 / 2, var6 + var12 / 2 + this.legendFontHeight / 2 - this.shadow);
  457.                   var6 += var12 + var13;
  458.                }
  459.  
  460.                return;
  461.          }
  462.       }
  463.  
  464.    }
  465. }
  466.