home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1995 November / PCWK1195.iso / inne / win95 / sieciowe / hotja32.lzh / hotjava / classsrc / browser / document.java < prev    next >
Text File  |  1995-08-11  |  9KB  |  327 lines

  1. /*
  2.  * @(#)Document.java    1.50 95/05/10 Jonathan Payne
  3.  *
  4.  * Copyright (c) 1994 Sun Microsystems, Inc. All Rights Reserved.
  5.  *
  6.  * Permission to use, copy, modify, and distribute this software
  7.  * and its documentation for NON-COMMERCIAL purposes and without
  8.  * fee is hereby granted provided that this copyright notice
  9.  * appears in all copies. Please refer to the file "copyright.html"
  10.  * for further important copyright and licensing information.
  11.  *
  12.  * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
  13.  * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
  14.  * TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
  15.  * PARTICULAR PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR
  16.  * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
  17.  * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
  18.  */
  19.  
  20. package browser;
  21.  
  22. import java.util.*;
  23. import java.io.*;
  24. import awt.*;
  25. import net.*;
  26. import net.www.http.*;
  27. import net.www.html.*;
  28.  
  29. /**
  30.  * Class Document extends the generic html.Document class to use
  31.  * TagRef subclasses that contain information about formatting the
  32.  * document.  This is the class which associates particular style
  33.  * changes with particular html tags.  Many of the html tags are
  34.  * associated with a single TagRef subclass called StyleTagRef,
  35.  * which knows how to apply a style to the formatter when the
  36.  * formatter encounters that tag.  But many other tags have their
  37.  * own special subclass of TagRef, and it's this class which
  38.  * associates those TagRef subclasses with the html tag.<p> This
  39.  * also handles creation, starting, stopping and destruction of
  40.  * hotjava applets.
  41.  * @see Applet
  42.  * @see Style
  43.  * @see net.www.html.Document
  44.  * @version 1.50, 10 May 1995
  45.  * @author Jonathan Payne
  46.  */
  47.  
  48. public class Document extends net.www.html.Document {
  49.     URL        thisURL;            /* url for this document */
  50.  
  51.     /** If an html document is transformed into a DisplayItem
  52.     (rather than being a normal text document) then this points
  53.     to that DisplayItem and the other parts of the document are
  54.     ignored */
  55.     public DisplayItem displayItem;
  56.  
  57.     /** This is the actual object we got back if it wasn't an
  58.     html document.  Obviously, this shouldn't be an instance
  59.     variable of document ... */
  60.     Object        content;   /* set if this document is a general Object */
  61.  
  62.     public String toString() {
  63.     return "Document[url=" + thisURL + ", title = " + getTitle() + "]";
  64.     }
  65.  
  66.     Vector applets = new Vector();
  67.  
  68.     static Style        styleIndex[] = new Style[Tag.NTAGS];
  69.     static void defineTag(String name, Style s) {
  70.     Tag t = Tag.lookup(name);
  71.  
  72.     styleIndex[t.id] = s;
  73.     }
  74.  
  75.     static {
  76.     defineTag("a", new AnchorStyle("style=u"));
  77.     defineTag("br", new BreakingStyle("break=0"));
  78.     defineTag("p", new BreakingStyle(null));
  79.     defineTag("center", new BreakingStyle("align=c, break=0"));
  80.     defineTag("h1", new BreakingStyle("size=24,style=b"));
  81.     defineTag("h2", new BreakingStyle("size=18,style=b"));
  82.     defineTag("h3", new BreakingStyle("size=17,style=b"));
  83.     defineTag("h4", new BreakingStyle("size=14,style=b"));
  84.     defineTag("h5", new BreakingStyle("size=12,style=b"));
  85.     defineTag("h6", new BreakingStyle("size=10,style=b"));
  86.  
  87.     defineTag("title", new Style("renders=false"));
  88.     defineTag("head", new Style(null));
  89.  
  90.     defineTag("address", new BreakingStyle("break=0,size=14,style=i"));
  91.     defineTag("b", new BasicStyle("style=b"));
  92.     defineTag("body", new BasicStyle("size=14, style=p"));
  93.     defineTag("cite", new BasicStyle("style=i"));
  94.     defineTag("var", new BasicStyle("style=i"));
  95.     defineTag("code", new BasicStyle("style=pf, size=14"));
  96.     defineTag("em", new BasicStyle("style=i"));
  97.     defineTag("i", new BasicStyle("style=i"));
  98.     defineTag("pre", new BreakingStyle("style=pf, size=14, align=l, wrap=not"));
  99.     defineTag("samp", new BasicStyle("style=pf, size=14"));
  100.     defineTag("strong", new BasicStyle("style=b"));
  101.     defineTag("tt", new BasicStyle("style=pf, size=14"));
  102.     defineTag("u", new BasicStyle("style=u"));
  103.     defineTag("blockquote", new BreakingStyle("leftMargin=+35, rightMargin=+35"));
  104.     defineTag("plaintext", new BasicStyle("style=pf, size=14, wrap=not"));
  105.     }
  106.  
  107.     /** Creates and returns a new TagRef for the specified html start tag. */
  108.     public TagRef startTag(Tag t, int offset) {
  109.     return addTagRef(newTagAt(t, offset, false), offset);
  110.     }
  111.  
  112.     /** Creates and returns a new TagRef for the specified html end tag. */
  113.     public TagRef endTag(Tag t, int offset) {
  114.     return addTagRef(newTagAt(t, offset, true), offset);
  115.     }
  116.  
  117.     private TagRef newTagAt(Tag t, int pos, boolean isEnd) {
  118.     TagRef    ref = null;
  119.  
  120.     switch (t.id) {
  121.     case Tag.ADDRESS:
  122.     case Tag.B:
  123.     case Tag.BODY:
  124.     case Tag.CITE:
  125.     case Tag.CODE:
  126.     case Tag.EM:
  127.     case Tag.I:
  128.     case Tag.KBD:
  129.     case Tag.SAMP:
  130.     case Tag.STRONG:
  131.     case Tag.TT:
  132.     case Tag.U:
  133.     case Tag.BLOCKQUOTE:
  134.     case Tag.H1:
  135.     case Tag.H2:
  136.     case Tag.H3:
  137.     case Tag.H4:
  138.     case Tag.H5:
  139.     case Tag.H6:
  140.     case Tag.PRE:
  141.     case Tag.HEAD:
  142.     case Tag.TITLE:
  143.     case Tag.P:
  144.     case Tag.BR:
  145.     case Tag.CENTER:
  146.     default:
  147.         ref = new StyleTagRef(t, pos, isEnd, styleIndex[t.id]);
  148.         break;
  149.  
  150.     case Tag.A:
  151.         ref = new AnchorTagRef(t, pos, isEnd, styleIndex[t.id]);
  152.         break;
  153.  
  154.     case Tag.UNKNOWN:
  155.         break;
  156.  
  157.     case Tag.DL:
  158.         ref = new DLTagRef(t, pos, isEnd);
  159.         break;
  160.  
  161.         /* REMIND: these two can be styles ... */
  162.     case Tag.DD:
  163.         ref = new DDTagRef(t, pos, isEnd);
  164.         break;
  165.  
  166.     case Tag.DT:
  167.         ref = new DTTagRef(t, pos, isEnd);
  168.         break;
  169.  
  170.         /* These are not styles because they potentially create
  171.            display items, which should not be created repeatedly
  172.            each time the document is layed out. */
  173.     case Tag.LI:
  174.         ref = new LITagRef(t, pos, isEnd);
  175.         break;
  176.  
  177.     case Tag.OL:
  178.         ref = new OLTagRef(t, pos, isEnd);
  179.         break;
  180.  
  181.     case Tag.HR:
  182.         ref = new HRTagRef(t, pos, isEnd);
  183.         break;
  184.  
  185.     case Tag.IMG:
  186.         ref = new ImgTagRef(t, pos, isEnd);
  187.         break;
  188.  
  189.     case Tag.MENU:
  190.     case Tag.DIR:
  191.         /* REMIND: DIR and MENU should be its own kind of tag
  192.            list, but for now is a UnorderedList. */
  193.  
  194.     case Tag.UL:
  195.         ref = new ULTagRef(t, pos, isEnd);
  196.         break;
  197.  
  198.     case Tag.APP:
  199.         ref = new AppTagRef(t, pos, isEnd);
  200.         break;
  201.  
  202.     case Tag.FORM:
  203.         ref = new FormTagRef(t, pos, isEnd);
  204.         break;
  205.  
  206.     case Tag.INPUT:
  207.         ref = new InputTagRef(t, pos, isEnd);
  208.         break;
  209.  
  210.     case Tag.SELECT:
  211.         ref = new SelectTagRef(t, pos, isEnd);
  212.         break;
  213.  
  214.     case Tag.OPTION:
  215.         ref = new OptionTagRef(t, pos, isEnd);
  216.         break;
  217.  
  218.     case Tag.TEXTAREA:
  219.         ref = new TextAreaTagRef(t, pos, isEnd);
  220.         break;
  221.     }
  222.     return ref;
  223.     }
  224.  
  225.     /** Returns the URL that is associated with this document. */
  226.     public URL url() {
  227.     return thisURL;
  228.     }
  229.  
  230.     /** Sets the URL that is associated with this document. */
  231.     public void setURL(URL u) {
  232.     thisURL = u;
  233.     }
  234.  
  235.     /**
  236.      * Creates a new Document with the specified URL and InputStream.
  237.      */
  238.     public browser.Document(URL url, InputStream is) {
  239.     thisURL = url;
  240.  
  241.     try {
  242.  
  243.         if (url.content_type != URL.content_html) {
  244.         setText(url.content_type + ": expected html");
  245.         return;
  246.         }
  247.         try {
  248.         Parser parser = new Parser(is, this);
  249.         } catch (Exception e) {
  250.         setText("I can't read your data\n" + e);
  251.         }
  252.  
  253.     } finally {
  254.         is.close();
  255.     }
  256.     }
  257.  
  258.     /**
  259.      * Creates a new Document with the specified URL with its
  260.      * contents initialized by the specified String.  Unless the
  261.      * string starts with "<html>", the document
  262.      * is a plain text document, which means it contains no html
  263.      * tags in it, exception for the <plaintext> tag at the very
  264.      * beginning.
  265.      */
  266.     public browser.Document(URL u, String s) {
  267.     thisURL = u;
  268.     if (s.startsWith("<html>")){
  269.         try {
  270.         new Parser(new StringInputStream(s), this);
  271.         } catch(Exception e) {
  272.         setText("Error in error message:\n"+s);
  273.         startTag(Tag.lookup("plaintext"), 0);
  274.         }
  275.     } else {
  276.         setText(s);
  277.         startTag(Tag.lookup("plaintext"), 0);
  278.     }
  279.     }
  280.  
  281.     /** Add an applet to this document */
  282.     public synchronized void addApplet(AppletDisplayItem item) {
  283.     if (!applets.contains(item)) {
  284.         applets.addElement(item);
  285.     }
  286.     }
  287.  
  288.     /** Send start()s to all the Applets in our hashtable. */
  289.     public synchronized void startApplets() {
  290.     for (Enumeration e = applets.elements() ; e.hasMoreElements() ;) {
  291.         ((AppletDisplayItem)e.nextElement()).start();
  292.     }
  293.     }
  294.  
  295.     /** Send stop()s to all the Applets in our hashtable. */
  296.     public synchronized void stopApplets() {
  297.     for (Enumeration e = applets.elements() ; e.hasMoreElements() ;) {
  298.         ((AppletDisplayItem)e.nextElement()).stop();
  299.     }
  300.     }
  301.  
  302.     /** Send destroy()s to all the Applets in our hashtable. */
  303.     public synchronized void destroyApplets() {
  304.     for (Enumeration e = applets.elements() ; e.hasMoreElements() ;) {
  305.         ((AppletDisplayItem)e.nextElement()).destroy();
  306.     }
  307.     }
  308.  
  309.     /** Nuke all the images in a document */
  310.     public synchronized void flushImages() {
  311.     Vector tagList = getTags();
  312.  
  313.     /* now, walk through all the tag refs, and start fetching images */
  314.     int i = 0;
  315.     int cnt = tagList.size();
  316.     while (--cnt >= 0) {
  317.         TagRef  ref = (TagRef)tagList.elementAt(i++);
  318.  
  319.         if (ref instanceof ImgTagRef) {
  320.         ((ImgTagRef)ref).nuke();
  321.         }
  322.     }
  323.     }
  324. }
  325.  
  326.  
  327.