home *** CD-ROM | disk | FTP | other *** search
- import allaire.dcf.recordset.AppletParamRecordset;
- import allaire.dcf.recordset.Query;
- import allaire.dcf.recordset.Recordset;
- import allaire.util.Debug;
- import java.applet.Applet;
- import java.awt.Color;
- import java.awt.Component;
- import java.awt.Event;
- import java.awt.Font;
- import java.awt.FontMetrics;
- import java.awt.Graphics;
- import java.util.Date;
- import java.util.Vector;
-
- public class MultiBarChart extends Applet implements Runnable {
- static final int VERTICAL = 1;
- static final int HORIZONTAL = 2;
- static final int PARAMS = 1;
- static final int TEMPLATE = 2;
- static final Color[] defaultColors;
- Thread runner;
- Query query;
- int refreshTime;
- boolean debugInfoEnabled;
- String title;
- String titleFontName;
- Font titleFont;
- FontMetrics titleFontMetrics;
- int titleFontHeight;
- String legendFontName;
- Font legendFont;
- FontMetrics legendFontMetrics;
- int legendFontHeight;
- int legendHeight;
- int legendWidth;
- boolean legendEnabled;
- int orientation;
- int shadow;
- boolean barBorderEnabled;
- boolean showDateTime;
- String currentDateTime;
- Color backgroundColor;
- Color fontColor;
- Color lineColor;
- Vector itemColors;
- Vector itemLabels;
- Vector pointerToItems;
- Recordset chartData;
- int rowCount;
- int groupCount;
- int itemCount;
- int maxItemLabelWidth;
- int maxGroupLabelWidth;
- double maxGroupSum;
-
- public void start() {
- if (this.runner == null) {
- this.runner = new Thread(this);
- this.runner.start();
- }
-
- }
-
- public void stop() {
- if (this.runner != null) {
- this.runner.stop();
- this.runner = null;
- }
-
- }
-
- private void getData(int var1) {
- try {
- switch (var1) {
- case 1:
- this.chartData = new AppletParamRecordset(this, "ChartData");
- break;
- case 2:
- this.query.execute();
- this.chartData = this.query.getRecordset();
- }
-
- if (this.refreshTime == 0) {
- ((Applet)this).getAppletContext().showStatus("Done");
- } else {
- ((Applet)this).getAppletContext().showStatus("...");
- }
-
- this.rowCount = this.chartData.getRowCount();
- if (this.rowCount != 0) {
- this.maxGroupSum = (double)0.0F;
- double var7 = (double)0.0F;
-
- for(int var2 = 0; var2 < this.rowCount; ++var2) {
- double var5;
- try {
- var5 = Math.abs(new Double(this.chartData.getData(var2 + 1, "Values")));
- } catch (Exception var11) {
- var5 = (double)0.0F;
- }
-
- if (var2 == 0) {
- this.groupCount = this.itemCount = 1;
- this.pointerToItems.setSize(this.rowCount);
- this.pointerToItems.setElementAt(new Integer(this.itemCount - 1), var2);
- this.itemLabels.setSize(var2 + 1);
- this.itemLabels.setElementAt(this.chartData.getData(var2 + 1, "Items"), var2);
- this.maxItemLabelWidth = this.legendFontMetrics.stringWidth(this.chartData.getData(var2 + 1, "Items"));
- this.maxGroupLabelWidth = this.legendFontMetrics.stringWidth(this.chartData.getData(var2 + 1, "Groups"));
- } else {
- if (!this.chartData.getData(var2 + 1, "Groups").equals(this.chartData.getData(var2, "Groups"))) {
- if (this.maxGroupSum < var7) {
- this.maxGroupSum = var7;
- }
-
- this.maxGroupLabelWidth = Math.max(this.legendFontMetrics.stringWidth(this.chartData.getData(var2 + 1, "Groups")), this.maxGroupLabelWidth);
- var7 = (double)0.0F;
- ++this.groupCount;
- }
-
- boolean var4 = false;
-
- for(int var3 = 0; var3 < var2; ++var3) {
- if (this.chartData.getData(var2 + 1, "Items").equals(this.chartData.getData(var3 + 1, "Items"))) {
- var4 = true;
- this.pointerToItems.setElementAt(this.pointerToItems.elementAt(var3), var2);
- break;
- }
- }
-
- if (!var4) {
- ++this.itemCount;
- this.pointerToItems.setElementAt(new Integer(this.itemCount - 1), var2);
- this.itemLabels.setSize(this.itemCount);
- this.itemLabels.setElementAt(this.chartData.getData(var2 + 1, "Items"), this.itemCount - 1);
- this.maxItemLabelWidth = Math.max(this.legendFontMetrics.stringWidth(this.chartData.getData(var2 + 1, "Items")), this.maxItemLabelWidth);
- }
- }
-
- var7 += var5;
- }
-
- if (this.maxGroupSum < var7) {
- this.maxGroupSum = var7;
- }
-
- this.itemColors.setSize(this.itemCount);
-
- for(int var13 = 0; var13 < this.itemCount; ++var13) {
- if (var13 < 9) {
- this.itemColors.setElementAt(defaultColors[var13], var13);
- } else if (var13 < 18) {
- this.itemColors.setElementAt(defaultColors[var13 - 9].darker(), var13);
- } else if (var13 < 27) {
- this.itemColors.setElementAt(defaultColors[var13 - 18].darker().darker(), var13);
- } else {
- this.itemColors.setElementAt(Color.black, var13);
- }
- }
- }
-
- this.currentDateTime = (new Date()).toLocaleString();
- } catch (Exception var12) {
- if (this.debugInfoEnabled) {
- Debug.write(((Throwable)var12).getMessage());
- }
-
- }
- }
-
- public boolean mouseExit(Event var1, int var2, int var3) {
- if (var1.id == 505) {
- ((Applet)this).getAppletContext().showStatus("");
- return true;
- } else {
- return false;
- }
- }
-
- static {
- defaultColors = new Color[]{Color.red, Color.blue, Color.green, Color.yellow, Color.magenta, Color.cyan, Color.orange, Color.pink, Color.darkGray};
- }
-
- private void pause(int var1) {
- try {
- Thread.sleep((long)var1);
- } catch (InterruptedException var4) {
- if (this.debugInfoEnabled) {
- Debug.write(((Throwable)var4).getMessage());
- }
-
- }
- }
-
- public boolean mouseEnter(Event var1, int var2, int var3) {
- if (var1.id == 504) {
- ((Applet)this).getAppletContext().showStatus("(c)1996 Allaire Corp.");
- return true;
- } else {
- return false;
- }
- }
-
- public void run() {
- while(this.refreshTime != 0) {
- this.pause(this.refreshTime * 1000);
- this.getData(2);
- ((Component)this).repaint();
- }
-
- this.stop();
- }
-
- public synchronized void init() {
- String var1 = ((Applet)this).getParameter("RefreshTime");
- if (var1 == null) {
- this.refreshTime = 0;
- } else {
- this.refreshTime = Integer.parseInt(var1);
- var1 = ((Applet)this).getParameter("RefreshDataFromURL");
- if (var1 == null) {
- this.refreshTime = 0;
- } else {
- if (var1.indexOf(63) == -1) {
- var1 = var1 + '?';
- }
-
- this.query = new Query(var1);
- this.query.addParam("RefreshTime", String.valueOf(this.refreshTime));
- }
- }
-
- var1 = ((Applet)this).getParameter("DebugInfoEnabled");
- if (var1 == null) {
- this.debugInfoEnabled = false;
- } else if (var1.toLowerCase().equals("yes")) {
- this.debugInfoEnabled = true;
- } else {
- this.debugInfoEnabled = false;
- }
-
- this.title = ((Applet)this).getParameter("Title");
- if (this.title == null) {
- this.title = "Chart";
- }
-
- this.titleFontName = ((Applet)this).getParameter("TitleFontName");
- if (this.titleFontName == null) {
- this.titleFontName = "TimesRoman";
- }
-
- var1 = ((Applet)this).getParameter("TitleFontHeight");
- if (var1 == null) {
- this.titleFontHeight = 12;
- } else {
- this.titleFontHeight = Integer.parseInt(var1);
- }
-
- this.legendFontName = ((Applet)this).getParameter("LegendFontName");
- if (this.legendFontName == null) {
- this.legendFontName = "TimesRoman";
- }
-
- var1 = ((Applet)this).getParameter("ShowLegend");
- if (var1 == null) {
- this.legendEnabled = true;
- } else if (var1.toLowerCase().equals("yes")) {
- this.legendEnabled = true;
- } else {
- this.legendEnabled = false;
- }
-
- var1 = ((Applet)this).getParameter("LegendFontHeight");
- if (var1 == null) {
- this.legendFontHeight = 10;
- } else {
- this.legendFontHeight = Integer.parseInt(var1);
- }
-
- var1 = ((Applet)this).getParameter("DrawBorders");
- if (var1 == null) {
- this.barBorderEnabled = true;
- } else if (var1.toLowerCase().equals("yes")) {
- this.barBorderEnabled = true;
- } else {
- this.barBorderEnabled = false;
- }
-
- var1 = ((Applet)this).getParameter("ShowDateTime");
- if (var1 == null) {
- this.showDateTime = true;
- } else if (var1.toLowerCase().equals("yes")) {
- this.showDateTime = true;
- } else {
- this.showDateTime = false;
- }
-
- var1 = ((Applet)this).getParameter("Orientation");
- if (var1 == null) {
- this.orientation = 1;
- } else if (var1.toLowerCase().equals("vertical")) {
- this.orientation = 1;
- } else if (var1.toLowerCase().equals("horizontal")) {
- this.orientation = 2;
- } else {
- this.orientation = 1;
- }
-
- var1 = ((Applet)this).getParameter("Shadow");
- if (var1 == null) {
- this.shadow = 4;
- } else {
- this.shadow = Integer.parseInt(var1);
- }
-
- var1 = ((Applet)this).getParameter("BackgroundColor");
- if (var1 == null) {
- this.backgroundColor = ((Component)this).getBackground();
- } else {
- this.backgroundColor = new Color(Integer.valueOf(var1, 16));
- }
-
- var1 = ((Applet)this).getParameter("FontColor");
- if (var1 == null) {
- this.fontColor = Color.black;
- } else {
- this.fontColor = new Color(Integer.valueOf(var1, 16));
- }
-
- var1 = ((Applet)this).getParameter("GridLineColor");
- if (var1 == null) {
- this.lineColor = Color.gray;
- } else {
- this.lineColor = new Color(Integer.valueOf(var1, 16));
- }
-
- ((Component)this).setBackground(this.backgroundColor);
- this.titleFont = new Font(this.titleFontName, 1, this.titleFontHeight);
- this.titleFontMetrics = ((Component)this).getFontMetrics(this.titleFont);
- this.legendFont = new Font(this.legendFontName, 0, this.legendFontHeight);
- this.legendFontMetrics = ((Component)this).getFontMetrics(this.legendFont);
- this.pointerToItems = new Vector();
- this.itemColors = new Vector();
- this.itemLabels = new Vector();
- this.getData(1);
- }
-
- public synchronized void paint(Graphics var1) {
- double var26 = (double)0.0F;
- double var28 = (double)0.0F;
- if (this.itemCount > 0) {
- if (this.maxGroupSum == (double)0.0F) {
- this.maxGroupSum = (double)1.0F;
- }
-
- int var3 = ((Component)this).size().width / 15;
- int var4 = ((Component)this).size().height / 15;
- double var11 = Math.pow((double)10.0F, Math.floor(Math.log(this.maxGroupSum) / Math.log((double)10.0F)));
- if (this.maxGroupSum / var11 < (double)2.0F) {
- var11 /= (double)10.0F;
- }
-
- if (this.maxGroupSum / var11 < (double)6.0F) {
- var11 /= (double)2.0F;
- }
-
- var1.setColor(this.fontColor);
- var1.setFont(this.titleFont);
- var1.drawString(this.title, Math.max((((Component)this).size().width - this.titleFontMetrics.stringWidth(this.title)) / 2, 0), ((Component)this).size().height - var4);
- var1.setFont(this.legendFont);
- if (this.showDateTime) {
- var1.drawString("(as of " + this.currentDateTime + ")", Math.max((((Component)this).size().width - this.legendFontMetrics.stringWidth("(as of " + this.currentDateTime + ")")) / 2, 0), ((Component)this).size().height - var4 + this.legendFontHeight * 3 / 2);
- }
-
- int var22;
- if (this.legendEnabled) {
- int var51 = Math.min((((Component)this).size().height - this.titleFontHeight - 3 * var4) / this.legendFontHeight, this.itemCount);
- int var52 = (((Component)this).size().height - this.titleFontHeight - 3 * var4) / var51;
- if (var52 > 2 * this.titleFontHeight) {
- var52 = 2 * this.titleFontHeight;
- }
-
- var22 = this.legendFontHeight * 2 + this.maxItemLabelWidth + var3;
- int var50 = var51 * var52;
- int var9 = ((Component)this).size().width - var22;
- int var10 = (((Component)this).size().height - 3 * var4 - this.titleFontHeight - var50) / 2 + var4;
- var1.drawRect(var9 - this.legendFontHeight, var10 - var52 / 2, var22 - var3 + 2 * this.legendFontHeight, var50 + var52 / 2);
-
- for(int var2 = 0; var2 < var51; ++var2) {
- var1.setColor((Color)this.itemColors.elementAt(var2));
- var1.fillRect(var9, var10, this.legendFontHeight, this.legendFontHeight);
- if (this.barBorderEnabled) {
- var1.setColor(this.fontColor);
- var1.drawRect(var9, var10, this.legendFontHeight - 1, this.legendFontHeight - 1);
- }
-
- var1.setColor(this.fontColor);
- var1.drawString((String)this.itemLabels.elementAt(var2), var9 + 2 * this.legendFontHeight, var10 + this.legendFontHeight - 1);
- var10 += var52;
- }
- } else {
- boolean var25 = false;
- boolean var24 = false;
- boolean var23 = false;
- var22 = 0;
- }
-
- switch (this.orientation) {
- case 1:
- int var48 = ((Component)this).size().width - 2 * var3 - var22;
- int var49 = ((Component)this).size().height - this.titleFontHeight - this.legendFontHeight - 3 * var4;
- double var44 = Math.max((double)var49 / this.maxGroupSum, (double)0.0F);
- int var46 = Math.max(var48 * 3 / (4 * this.groupCount), this.legendFontMetrics.stringWidth("O"));
- int var47 = Math.max((var48 - this.groupCount * var46) / this.groupCount, 0);
- int var39 = var3;
- int var42 = var4 + var49;
-
- for(double var43 = (double)0.0F; var43 < this.maxGroupSum; var43 += var11) {
- var1.setColor(this.lineColor);
- var1.drawLine(var39, var42 - (int)(var44 * var43), var39 + var48, var42 - (int)(var44 * var43));
- var1.drawString("" + var43, var39 - this.legendFontMetrics.stringWidth("" + var43) - 2, var42 - (int)(var44 * var43) + this.legendFontHeight / 2);
- }
-
- var39 += var47 / 2 + this.shadow;
- int var45 = 0;
- int var8 = 0;
- var28 = (double)0.0F;
- String var57 = "";
-
- for(int var38 = 0; var38 < this.rowCount; ++var38) {
- String var56;
- try {
- var56 = this.chartData.getData(var38 + 1, "Groups");
- } catch (Exception var36) {
- var56 = "";
- }
-
- if (var38 > 0) {
- if (!var56.equals(var57)) {
- if (this.legendFontMetrics.stringWidth(var57) > var46) {
- var57 = var57.substring(0, var57.length() * var46 / this.legendFontMetrics.stringWidth(var57));
- }
-
- var1.drawString("" + var28, var39 + (var46 - this.legendFontMetrics.stringWidth("" + var28)) / 2, var42 - var8 - var45 - 3);
- var1.drawString(var57, var39 + (var46 - this.legendFontMetrics.stringWidth(var57)) / 2, var42 + this.legendFontHeight + this.shadow);
- var8 = 0;
- var28 = (double)0.0F;
- var39 += var46 + var47;
- } else {
- var8 += var45;
- }
- }
-
- var57 = var56;
-
- try {
- var26 = new Double(this.chartData.getData(var38 + 1, "Values"));
- } catch (Exception var35) {
- var26 = (double)0.0F;
- }
-
- var28 += Math.abs(var26);
- var45 = (int)Math.abs(var44 * var26);
- var1.setColor(this.lineColor);
- var1.fillRect(var39, var42 - var8 - var45, var46, var45 + 1);
- var1.setColor((Color)this.itemColors.elementAt((Integer)this.pointerToItems.elementAt(var38)));
- var1.fillRect(var39 - this.shadow, var42 - var8 - var45 + this.shadow, var46, var45 + 1);
- var1.setColor(this.fontColor);
- if (this.barBorderEnabled) {
- var1.drawRect(var39 - this.shadow, var42 - var8 - var45 + this.shadow, var46 - 1, var45);
- }
- }
-
- if (this.legendFontMetrics.stringWidth(var57) > var46) {
- var57 = var57.substring(0, var57.length() * var46 / this.legendFontMetrics.stringWidth(var57));
- }
-
- var1.drawString("" + var28, var39 + (var46 - this.legendFontMetrics.stringWidth("" + var26)) / 2, var42 - var8 - var45 - 3);
- var1.drawString(var57, var39 + (var46 - this.legendFontMetrics.stringWidth(var57)) / 2, var42 + this.legendFontHeight + this.shadow);
- return;
- case 2:
- int var20 = ((Component)this).size().width - 2 * var3 - var22 - this.maxGroupLabelWidth;
- int var21 = ((Component)this).size().height - this.titleFontHeight - this.legendFontHeight - 2 * var4;
- double var15 = Math.max((double)var20 / this.maxGroupSum, (double)0.0F);
- int var18 = var21 * 3 / (4 * this.groupCount);
- int var19 = Math.max((var21 - this.groupCount * var18) / this.groupCount, 0);
- int var5 = var3 + this.maxGroupLabelWidth + this.shadow;
- int var6 = var4;
-
- for(double var13 = (double)0.0F; var13 < this.maxGroupSum; var13 += var11) {
- var1.setColor(this.lineColor);
- var1.drawLine(var5 + (int)(var15 * var13), var6, var5 + (int)(var15 * var13), var6 + var21);
- var1.drawString("" + var13, var5 + (int)(var15 * var13) - this.legendFontMetrics.stringWidth("" + var13) / 2, var6 - 2);
- }
-
- var6 += var19 / 2 + this.shadow;
- int var17 = 0;
- int var7 = 0;
- var28 = (double)0.0F;
- String var31 = "";
-
- for(int var37 = 0; var37 < this.rowCount; ++var37) {
- String var30;
- try {
- var30 = this.chartData.getData(var37 + 1, "Groups");
- } catch (Exception var34) {
- var30 = "";
- }
-
- if (var37 > 0) {
- if (!var30.equals(var31)) {
- var1.drawString("" + var28, var5 + var7 + var17 + 4, var6 + var18 / 2 + this.legendFontHeight / 2 - this.shadow);
- var1.drawString(var31, var3 - var3 / 3, var6 + var18 / 2 + this.legendFontHeight / 2 - this.shadow);
- var7 = 0;
- var28 = (double)0.0F;
- var6 += var18 + var19;
- } else {
- var7 += var17;
- }
- }
-
- var31 = var30;
-
- try {
- var26 = new Double(this.chartData.getData(var37 + 1, "Values"));
- } catch (Exception var33) {
- var26 = (double)0.0F;
- }
-
- var28 += Math.abs(var26);
- var17 = (int)Math.abs(var15 * var26);
- var1.setColor(this.lineColor);
- var1.fillRect(var5 + var7, var6, var17 + 1, var18);
- var1.setColor((Color)this.itemColors.elementAt((Integer)this.pointerToItems.elementAt(var37)));
- var1.fillRect(var5 + var7 - this.shadow, var6 - this.shadow, var17 + 1, var18);
- var1.setColor(this.fontColor);
- if (this.barBorderEnabled) {
- var1.drawRect(var5 + var7 - this.shadow, var6 - this.shadow, var17, var18 - 1);
- }
- }
-
- var1.drawString("" + var28, var5 + var7 + var17 + 4, var6 + var18 / 2 + this.legendFontHeight / 2 - this.shadow);
- var1.drawString(var31, var3 - var3 / 3, var6 + var18 / 2 + this.legendFontHeight / 2 - this.shadow);
- return;
- }
- }
-
- }
- }
-