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

  1. /*
  2.  * @(#)WRTextItem.java    1.22 95/04/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 awt.*;
  23. import net.www.html.*;
  24. import java.io.*;
  25.  
  26. /**
  27.  * An instance of class WRTextItem is created for each piece of text
  28.  * in an html document.  WRTextItem handles following links to other
  29.  * documents.
  30.  * @version 1.22, 10 Apr 1995
  31.  * @author Jonathan Payne
  32.  */
  33.  
  34. public class WRTextItem extends TextDisplayItem {
  35.     /** Whether or not to underline anchors. */
  36.     public static boolean   underlineAnchors = true;
  37.  
  38.     /** This is the tagref that contains the href for this anchor. */
  39.     TagRef  anchor;
  40.  
  41.     /** This is the default color, to reset to when we release the
  42.     mouse button to follow this link. */
  43.     Color normalColor;
  44.  
  45.     /** This is the url to go to if we're clicked on. */
  46.     URL        anchorUrl;
  47.  
  48.     /** This is the position in the document that this text
  49.     widget refers to.  It is not possible to reach into
  50.     the string object to get its offset, so we keep that
  51.     information here. */
  52.     int        offset;
  53.     int        length;
  54.     byte    text[];
  55.  
  56.     public String getText() {
  57.     return new String(text, 0, offset, length);
  58.     }
  59.  
  60.     public WRTextItem(String str) {
  61.     text = new byte[length = str.length()];
  62.     for (int i = 0 ; i < length ; i++) {
  63.         text[i] = (byte)str.charAt(i);
  64.     }
  65.     }
  66.  
  67.     public WRTextItem(DisplayItemWindow w, byte text[], int offset1, int offset2, TagRef a) {
  68.     this.text = text;
  69.     this.offset = offset1;
  70.     this.length = offset2 - offset1;
  71.  
  72.     if ((anchor = a) != null) {
  73.         String  href = anchor.getAttribute("href");
  74.         if (href != null) {
  75.         anchorUrl = new URL(((WRWindow) w).document().url(), href);
  76.         setColorFromUrl(anchorUrl);
  77.         }
  78.     }
  79.     normalColor = fgColor;
  80.     }
  81.  
  82.     boolean setColorFromUrl(URL url) {
  83.     Color    c = fgColor;
  84.  
  85.     if (hotjava.history.seen(url)) {
  86.         setColor(hotjava.visitedAnchorColor);
  87.     } else {
  88.         setColor(hotjava.anchorColor);
  89.     }
  90.     normalColor = fgColor;
  91.     return c != fgColor;
  92.     }
  93.  
  94.     public void setup(Font f, Color c, int x, int y, int w, int h) {
  95.     if (normalColor == null) {
  96.         normalColor = c;
  97.     }
  98.     super.setup(f, normalColor, x, y, w, h);
  99.     }
  100.  
  101.     public void trackStart(Event e) {
  102.     if (anchorUrl != null) {
  103.         setColor(Color.red);
  104.         requestUpdate();
  105.     }
  106.     }
  107.  
  108.     public void trackEnter(Event e) {
  109.     if (anchorUrl != null) {
  110.         WRWindow    parent = (WRWindow) this.parent;
  111.  
  112.         parent.status("Go to " + anchorUrl.toExternalForm());
  113.     }
  114.     }
  115.  
  116.     public void trackExit(Event e) {
  117.     if (anchorUrl != null) {
  118.         ((WRWindow) parent).status("");
  119.         if (fgColor != normalColor) {
  120.         fgColor = normalColor;
  121.         requestUpdate();
  122.         }
  123.     }
  124.     }
  125.  
  126.     public void trackStop(Event e) {
  127.     if (anchorUrl != null) {
  128.         WRWindow    mw = (WRWindow) parent;
  129.         fgColor = normalColor;
  130.         requestUpdate();
  131.         if (anchorUrl != null) {
  132.         hotjava.history.addUrl(anchorUrl);
  133.         if (setColorFromUrl(anchorUrl)) {
  134.             requestUpdate();
  135.         }
  136.         mw.pushURL(anchorUrl);
  137.         }
  138.     }
  139.     }
  140.  
  141.     public void paint(awt.Window window, int x, int y) {
  142.     if (!valid) {
  143.         validate();
  144.     }
  145.     if (metrics == null) {
  146.         metrics = window.getFontMetrics(font);
  147.     }
  148.  
  149.     window.setFont(font);
  150.     window.setForeground(fgColor);
  151.     window.drawBytes(text, offset, length, x, y + metrics.ascent);
  152.  
  153.     if (underlineAnchors && (anchorUrl != null)) {
  154.         window.drawLine(x,
  155.                 y + metrics.ascent + 2,
  156.                 x + width, y + metrics.ascent + 2);
  157.     }
  158.     }
  159.  
  160.     public Dimension getPreferredSize() {
  161.     if (metrics == null && parent != null) {
  162.         metrics = parent.getFontMetrics(font);
  163.     }
  164.     if (metrics == null) {
  165.         return new Dimension(0,0);
  166.     } else {
  167.         // Note: The underscore is drawn at y+metrics.ascent+2, so
  168.         // height must be metrics.ascent+3.
  169.         int ht = metrics.height;
  170.         if (underlineAnchors && (anchorUrl != null)) {
  171.         ht = Math.max(ht, metrics.ascent + 3);
  172.         }
  173.         return new Dimension(metrics.bytesWidth(text, offset, length), ht);
  174.     }
  175.     }
  176. }
  177.  
  178.