home *** CD-ROM | disk | FTP | other *** search
/ PC Online 1997 October / PCO1097.ISO / FilesBBS / WIN95 / IAVAZIP.EXE / DATA.Z / HtmlPager.class (.txt) < prev    next >
Encoding:
Java Class File  |  1997-08-18  |  7.3 KB  |  402 lines

  1. package com.sfs.html;
  2.  
  3. import java.awt.Color;
  4. import java.awt.Component;
  5. import java.awt.Font;
  6. import java.awt.FontMetrics;
  7. import java.awt.Graphics;
  8. import java.awt.Image;
  9. import java.net.URL;
  10. import java.util.Hashtable;
  11. import java.util.Stack;
  12. import java.util.StringTokenizer;
  13. import java.util.Vector;
  14.  
  15. class HtmlPager {
  16.    private static final int BUTTON = -1;
  17.    private static final int MARGIN = 20;
  18.    private static final int[] sizes = new int[]{32, 28, 24, 20, 17, 15, 14};
  19.    private int offset;
  20.    private Stack fonts = new Stack();
  21.    private Font font;
  22.    private int spaceWidth;
  23.    private FontMetrics metrics;
  24.    private Stack anchors = new Stack();
  25.    private boolean anchor;
  26.    private int leftMargin = 20;
  27.    private int rightMargin = -20;
  28.    private int center;
  29.    private int preformatted;
  30.    private Stack lists = new Stack();
  31.    private int list = -1;
  32.    private Vector hrefs = new Vector();
  33.    private Hashtable names = new Hashtable();
  34.    private int[] heights;
  35.    private Vector lines = new Vector();
  36.    private HtmlPagerLine line;
  37.    private Href href;
  38.    private boolean lineEmpty = true;
  39.    private boolean prevLineEmpty;
  40.    private URL url;
  41.    private HtmlCanvas parent;
  42.    private int width = -1;
  43.    private Color bgColor;
  44.    private Color textColor;
  45.    private Color linkColor;
  46.    private Stack fontColors = new Stack();
  47.    private Color fontColor;
  48.  
  49.    protected void pushListNumber() {
  50.       this.lists.push(new Integer(this.list));
  51.       this.list += 0;
  52.    }
  53.  
  54.    protected void pushBold() {
  55.       this.pushFont(this.font.getName(), this.font.getStyle() | 1, this.font.getSize());
  56.    }
  57.  
  58.    protected void setBase(URL var1) {
  59.       this.url = var1;
  60.    }
  61.  
  62.    protected void popList() {
  63.       if (this.lists.size() > 0) {
  64.          this.list = (Integer)this.lists.pop();
  65.       }
  66.  
  67.    }
  68.  
  69.    private void finishLine() {
  70.       this.prevLineEmpty = this.lineEmpty;
  71.       if (this.center > 0) {
  72.          this.line.translate((this.rightMargin - this.offset) / 2);
  73.       }
  74.  
  75.       this.line = new HtmlPagerLine();
  76.       this.lines.addElement(this.line);
  77.       this.offset = 0;
  78.       this.addItem(new HtmlPagerItem(this.fontColor, this.font, ""));
  79.       this.offset = this.leftMargin;
  80.       this.lineEmpty = true;
  81.    }
  82.  
  83.    protected void pushPreformatted() {
  84.       this.pushFixedFont();
  85.       this.drawNewLine(true);
  86.       ++this.preformatted;
  87.       this.prevLineEmpty = true;
  88.    }
  89.  
  90.    protected void popPreformatted() {
  91.       this.preformatted += -1;
  92.       this.drawNewLine(true);
  93.       this.popFont();
  94.    }
  95.  
  96.    protected void pushFontColor(Color var1) {
  97.       this.fontColors.push(this.fontColor);
  98.       this.fontColor = var1;
  99.    }
  100.  
  101.    protected void popFontColor() {
  102.       if (this.fontColors.size() > 0) {
  103.          this.fontColor = (Color)this.fontColors.pop();
  104.       }
  105.  
  106.    }
  107.  
  108.    protected Color getFontColor() {
  109.       return this.fontColor;
  110.    }
  111.  
  112.    protected synchronized void drawImage(HtmlImage var1, String var2) {
  113.       Color var3 = this.anchor ? this.linkColor : null;
  114.       this.drawNewLine(var1.w);
  115.       if ("TOP".equalsIgnoreCase(var2)) {
  116.          this.addItem(new HtmlPagerItem(var3, var1, 1));
  117.       } else if ("MIDDLE".equalsIgnoreCase(var2)) {
  118.          this.addItem(new HtmlPagerItem(var3, var1, 0));
  119.       } else {
  120.          this.addItem(new HtmlPagerItem(var3, var1, -1));
  121.       }
  122.  
  123.       this.offset += var1.w;
  124.    }
  125.  
  126.    protected void pushItalic() {
  127.       this.pushFont(this.font.getName(), this.font.getStyle() | 2, this.font.getSize());
  128.    }
  129.  
  130.    protected void pushStandardFont() {
  131.       this.pushFont("TimesRoman", this.font.getStyle(), this.font.getSize());
  132.    }
  133.  
  134.    protected void pushFixedFont() {
  135.       this.pushFont("Courier", this.font.getStyle(), this.font.getSize());
  136.    }
  137.  
  138.    protected void pushLeftMargin(boolean var1) {
  139.       this.leftMargin += 20;
  140.       if (var1) {
  141.          this.drawNewLine(true);
  142.       }
  143.  
  144.    }
  145.  
  146.    protected void finish() {
  147.       int var1 = this.lines.size();
  148.       int[] var2 = new int[var1 + 2];
  149.       var2[0] = 20;
  150.  
  151.       for(int var3 = 0; var3 < var1; ++var3) {
  152.          var2[var3 + 1] = var2[var3] + ((HtmlPagerLine)this.lines.elementAt(var3)).getHeight();
  153.       }
  154.  
  155.       var2[var1 + 1] = var2[var1] + 20;
  156.       Href[] var8 = new Href[this.hrefs.size()];
  157.       this.hrefs.copyInto(var8);
  158.       Vector var4 = new Vector();
  159.       Image var5 = null;
  160.       if (this.width > 0) {
  161.          var5 = this.parent.createImage(this.width, var2[var1 + 1]);
  162.          if (var5 != null) {
  163.             this.parent.setBackground(this.bgColor);
  164.             Graphics var6 = var5.getGraphics();
  165.             var6.setColor(this.bgColor);
  166.             var6.fillRect(0, 0, this.width, var2[var1 + 1]);
  167.  
  168.             for(int var7 = 0; var7 < var1; ++var7) {
  169.                ((HtmlPagerLine)this.lines.elementAt(var7)).draw(var6, var2[var7], var4);
  170.             }
  171.          }
  172.       }
  173.  
  174.       HtmlImage[] var9 = new HtmlImage[var4.size()];
  175.       var4.copyInto(var9);
  176.       this.parent.setData(var2, var8, this.names, var9, var5);
  177.    }
  178.  
  179.    protected void popLeftMargin(boolean var1) {
  180.       this.leftMargin -= 20;
  181.       if (var1) {
  182.          this.drawNewLine(true);
  183.       }
  184.  
  185.    }
  186.  
  187.    protected void pushRightMargin() {
  188.       this.rightMargin -= 20;
  189.    }
  190.  
  191.    protected void popRightMargin() {
  192.       this.rightMargin += 20;
  193.    }
  194.  
  195.    protected HtmlPager(HtmlCanvas var1, int var2) {
  196.       this.width = var2;
  197.       this.parent = var1;
  198.       this.rightMargin += var2;
  199.       this.pushFont("TimesRoman", 0, sizes[6]);
  200.       this.drawNewLine(true);
  201.       this.bgColor = ((Component)var1).getBackground();
  202.       this.textColor = ((Component)var1).getForeground();
  203.       this.linkColor = Color.blue;
  204.       this.fontColor = this.textColor;
  205.    }
  206.  
  207.    protected void drawListItem() {
  208.       int var1 = this.offset;
  209.       this.offset = this.leftMargin - 20;
  210.       if (this.list == -1) {
  211.          this.addItem(new HtmlPagerItem(this.fontColor, this.font, "-"));
  212.       } else {
  213.          this.addItem(new HtmlPagerItem(this.fontColor, this.font, String.valueOf(++this.list)));
  214.       }
  215.  
  216.       this.offset = var1;
  217.    }
  218.  
  219.    protected void drawNewLine(boolean var1) {
  220.       if (this.lineEmpty) {
  221.          this.offset = this.leftMargin;
  222.       }
  223.  
  224.       if (!this.lineEmpty || this.lines.size() != 1) {
  225.          if (this.lineEmpty) {
  226.             if ((this.preformatted > 0 || var1) && !this.prevLineEmpty) {
  227.                this.finishLine();
  228.                return;
  229.             }
  230.          } else {
  231.             this.finishLine();
  232.             if (var1) {
  233.                this.finishLine();
  234.             }
  235.          }
  236.  
  237.       }
  238.    }
  239.  
  240.    private void drawNewLine(int var1) {
  241.       if (this.offset + var1 >= this.rightMargin) {
  242.          this.drawNewLine(false);
  243.       }
  244.  
  245.    }
  246.  
  247.    protected void pushCenter() {
  248.       this.drawNewLine(false);
  249.       ++this.center;
  250.    }
  251.  
  252.    protected void popCenter() {
  253.       this.drawNewLine(false);
  254.       this.center += -1;
  255.    }
  256.  
  257.    protected void pushFontSize(int var1) {
  258.       if (var1 < 0) {
  259.          var1 = 0;
  260.       }
  261.  
  262.       if (var1 >= sizes.length) {
  263.          var1 = sizes.length - 1;
  264.       }
  265.  
  266.       this.pushFont(this.font.getName(), this.font.getStyle(), sizes[var1]);
  267.    }
  268.  
  269.    protected int getFontSize() {
  270.       int var1 = this.font.getSize();
  271.  
  272.       for(int var2 = 0; var2 < sizes.length; ++var2) {
  273.          if (var1 == sizes[var2]) {
  274.             return var2;
  275.          }
  276.       }
  277.  
  278.       return -1;
  279.    }
  280.  
  281.    private void pushFont(String var1, int var2, int var3) {
  282.       this.fonts.push(this.font);
  283.       this.font = new Font(var1, var2, var3);
  284.       this.metrics = this.parent.getFontMetrics(this.font);
  285.       this.spaceWidth = this.metrics.stringWidth(" ");
  286.    }
  287.  
  288.    protected void popFont() {
  289.       if (this.fonts.size() > 1) {
  290.          this.font = (Font)this.fonts.pop();
  291.          this.metrics = this.parent.getFontMetrics(this.font);
  292.          this.spaceWidth = this.metrics.stringWidth(" ");
  293.       }
  294.  
  295.    }
  296.  
  297.    private void addItem(HtmlPagerItem var1) {
  298.       this.line.addItem(this.metrics, this.offset, var1);
  299.       this.lineEmpty = false;
  300.    }
  301.  
  302.    protected void pushAnchor(String var1, String var2) {
  303.       this.anchors.push(new Boolean(this.anchor));
  304.       if (var1 != null) {
  305.          this.anchor = true;
  306.          this.pushFontColor(this.linkColor);
  307.          this.href = new Href();
  308.          this.href.startLine = this.lines.size() - 1;
  309.          this.href.startOffset = this.offset;
  310.  
  311.          try {
  312.             this.href.url = new URL(this.url, var1);
  313.          } catch (Exception var3) {
  314.             this.href.url = null;
  315.          }
  316.       }
  317.  
  318.       if (var2 != null) {
  319.          this.names.put(var2, new Integer(this.lines.size()));
  320.       }
  321.  
  322.    }
  323.  
  324.    protected void popAnchor() {
  325.       if (this.anchors.size() > 0) {
  326.          if (this.anchor) {
  327.             this.href.endLine = this.lines.size() - 1;
  328.             this.href.endOffset = this.offset;
  329.             this.hrefs.addElement(this.href);
  330.             this.href = null;
  331.          }
  332.  
  333.          this.anchor = (Boolean)this.anchors.pop();
  334.          this.popFontColor();
  335.       }
  336.  
  337.    }
  338.  
  339.    protected void pushListButton() {
  340.       this.lists.push(new Integer(this.list));
  341.       this.list = -1;
  342.    }
  343.  
  344.    protected void setColors(Color var1, Color var2, Color var3) {
  345.       if (var1 != null) {
  346.          this.bgColor = var1;
  347.       }
  348.  
  349.       if (var2 != null) {
  350.          this.textColor = var2;
  351.       }
  352.  
  353.       if (var3 != null) {
  354.          this.linkColor = var3;
  355.       }
  356.  
  357.       this.pushFontColor(this.anchor ? this.linkColor : this.textColor);
  358.    }
  359.  
  360.    protected void drawText(String var1) {
  361.       if (this.preformatted > 0) {
  362.          StringTokenizer var5 = new StringTokenizer(var1, "\n", true);
  363.  
  364.          while(var5.hasMoreTokens()) {
  365.             String var6 = var5.nextToken();
  366.             if (var6.equals("\n")) {
  367.                this.drawNewLine(false);
  368.                this.prevLineEmpty = false;
  369.             } else {
  370.                this.addItem(new HtmlPagerItem(this.fontColor, this.font, var6));
  371.                this.offset += this.metrics.stringWidth(var6);
  372.             }
  373.          }
  374.  
  375.       } else {
  376.          if (this.offset > this.leftMargin) {
  377.             this.offset += this.spaceWidth;
  378.          }
  379.  
  380.          StringTokenizer var2;
  381.          int var4;
  382.          for(var2 = new StringTokenizer(var1); var2.hasMoreTokens(); this.offset += var4 + this.spaceWidth) {
  383.             String var3 = var2.nextToken();
  384.             var4 = this.metrics.stringWidth(var3);
  385.             this.drawNewLine(var4);
  386.             this.addItem(new HtmlPagerItem(this.fontColor, this.font, var3));
  387.          }
  388.  
  389.          if (var2.countTokens() > 0) {
  390.             this.offset -= this.spaceWidth;
  391.          }
  392.  
  393.       }
  394.    }
  395.  
  396.    protected void drawRule() {
  397.       this.drawNewLine(false);
  398.       this.addItem(new HtmlPagerItem(this.fontColor, this.rightMargin - this.leftMargin));
  399.       this.drawNewLine(false);
  400.    }
  401. }
  402.