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

  1. /*
  2.  * @(#)AdvertizingWindow.java    1.35 95/03/20 James Gosling
  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.io.BufferedInputStream;
  23. import awt.*;
  24. import net.www.html.URL;
  25. import java.util.Vector;
  26.  
  27. class AdvertisingItem {
  28.     String  blurb;
  29.     String  target;
  30.  
  31.     AdvertisingItem (String b, String t) {
  32.     blurb = b;
  33.     target = t;
  34.     }
  35. }
  36.  
  37. /**
  38.  * The advertizing window class
  39.  * @author    James Gosling
  40.  * @version    1.35, 20 Mar 1995
  41.  */
  42. class AdvertizingWindow extends DisplayItemWindow implements Runnable {
  43.     /**
  44.      * True if the mouse is over this window.
  45.      */
  46.     public boolean mouseIn = false;
  47.  
  48.     /**
  49.      * Where the ad list is fetched, initially.
  50.      */
  51.     public static String adBase;
  52.  
  53.     /**
  54.      * The thread that flips the images.
  55.      */
  56.     private Thread kicker = null;
  57.  
  58.     /**
  59.      * The current ad.
  60.      */
  61.     private AdvertisingItem currentAd;
  62.  
  63.     /**
  64.      * The base URL for the ads.
  65.      */
  66.     URL ad_base;
  67.  
  68.     /**
  69.      * The hotjava app
  70.      */
  71.     hotjava    app;
  72.  
  73.     /**
  74.      * Create and AdvertizingWindow.
  75.      */
  76.     public AdvertizingWindow(Window itsParent, String name, Color bg, hotjava m) {
  77.     super(itsParent, name);
  78.     setMargin(0);
  79.     setInsets(0,0,0,0);
  80.     width = 140;
  81.     height = 80;
  82.     app = m;
  83.     }
  84.  
  85.     /**
  86.      * Wait for the window to be mapped before doing any graphics
  87.      * operations.
  88.      */
  89.     public void map() {
  90.     super.map();
  91.     start();
  92.     }
  93.  
  94.     /**
  95.      * Display a list of ads.
  96.      */
  97.     public synchronized void display(Vector ads) {
  98.     ImageDisplayItem di = new ImageDisplayItem(null);
  99.     addItem(di);
  100.     while (ads.size() > 0) {
  101.         int i;
  102.  
  103.         for (i = 0; i < ads.size(); ) {
  104.         currentAd = (AdvertisingItem) ads.elementAt(i);
  105.  
  106.         if (currentAd.blurb != null) {
  107.             try {
  108.             Image img = di.getImage();
  109.             URL url = new URL(ad_base, currentAd.blurb);
  110.             DIBitmap bm = (DIBitmap)url.getContent();
  111.  
  112.             di.move((width - bm.width) / 2,
  113.                 (height - bm.height) / 2);
  114.  
  115.             di.setImage(bm);
  116.  
  117.             /* if we set a new image, destroy the old one */
  118.             if (img != null) {
  119.                 img.dispose();
  120.             }
  121.             paint();
  122.             wait(15000);
  123.             i += 1;
  124.             } catch(Exception e) {
  125.             e.printStackTrace();
  126.             currentAd.blurb = null;
  127.             ads.removeElementAt(i);
  128.             }
  129.         }
  130.         }
  131.     }
  132.     }
  133.  
  134.     /**
  135.      * Run the thread.
  136.      */
  137.     public void run() {
  138.     if ((adBase == null) || (adBase.length() == 0)) {
  139.         return;
  140.     }
  141.  
  142.     Vector    ads = new Vector();
  143.     Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
  144.     try {
  145.         StringBuffer sb = new StringBuffer(60);
  146.         String s1 = null, s2 = null;
  147.         ad_base = new URL(null, adBase);
  148.         BufferedInputStream si = new BufferedInputStream(ad_base.openStreamInteractively());
  149.         int c;
  150.  
  151.         while ((c = si.read()) != -1) {
  152.         switch (c) {
  153.           default:
  154.             sb.appendChar(c);
  155.             break;
  156.           case ' ':
  157.           case '\t':
  158.             if (s1 == null && sb.length() > 0) {
  159.             s1 = sb.toString();
  160.             sb.setLength(0);
  161.             sb.copyWhenShared();
  162.             }
  163.             break;
  164.           case '\n':
  165.             if (sb.length() > 0) {
  166.             s2 = sb.toString();
  167.             } else
  168.             s2 = null;
  169.             ads.addElement(new AdvertisingItem(s1, s2));
  170.             sb.setLength(0);
  171.             sb.copyWhenShared();
  172.             s1 = null;
  173.             s2 = null;
  174.             break;
  175.         }
  176.         }
  177.         si.close();
  178.         display(ads);
  179.     } catch(Exception e) {
  180.         e.printStackTrace();
  181.     }
  182.     kicker = null;
  183.     }
  184.  
  185.     /**
  186.      * Start the ads.
  187.      */
  188.     public synchronized void start() {
  189.     if (kicker == null) {
  190.         kicker = new Thread(this);
  191.         kicker.start();
  192.     }
  193.     }
  194.  
  195.     /**
  196.      * Stop the ads.
  197.      */
  198.     public synchronized void stop() {
  199.     if (kicker != null) {
  200.         kicker.stop();
  201.         kicker = null;
  202.     }
  203.     }
  204.  
  205.     void setAdBase(String base) {
  206.     adBase = base;
  207.     if (kicker != null) {
  208.         kicker.stop();
  209.         kicker = null;
  210.     }
  211.     clearItems();
  212.     paint();
  213.     start();
  214.     }
  215.  
  216.     private void feedback(boolean on) {
  217.     if (on) {
  218.         if (currentAd != null && currentAd.target != null) {
  219.         setForeground(Color.blue);
  220.         graphics.drawRect(0, 0, width-2, height-2);
  221.         URL u = new URL(ad_base, currentAd.target);
  222.         app.setMessage(u.toExternalForm());
  223.         }
  224.     } else {
  225.         setForeground(background);
  226.         graphics.drawRect(0, 0, width-2, height-2);
  227.         app.setMessage("");
  228.     }
  229.     }
  230.  
  231.     public void mouseEnter(Event e) {
  232.     feedback(true);
  233.     mouseIn = true;
  234.     }
  235.  
  236.     public void mouseLeave(Event e) {
  237.     feedback(false);
  238.     mouseIn = false;
  239.     }
  240.  
  241.     public void paint() {
  242.     super.paint();
  243.     if (mouseIn) {
  244.         feedback(true);
  245.     }
  246.     }
  247.  
  248.     /**
  249.      * Go to the current ad.
  250.      */
  251.     public void mouseDown(Event e) {
  252.     if (currentAd != null && currentAd.target != null) {
  253.         app.doc.pushURL(new URL(ad_base, currentAd.target));
  254.     }
  255.     }
  256.  
  257.     public Dimension minDimension() {
  258.     return getPreferredSize();
  259.     }
  260.  
  261.     public Dimension getPreferredSize() {
  262.     return new Dimension(140, 80);
  263.     }
  264. }
  265.