001 package com.croftsoft.apps.ads;
002
003 import java.applet.Applet;
004 import java.awt.*;
005 import java.io.*;
006 import java.net.*;
007 import java.util.*;
008
009 /*********************************************************************
010 * Rotating ad banner canvas.
011 *
012 * Allows rotating ad banners to be integrated into both Java applets
013 * and applications.
014 *
015 * @version
016 * 1999-03-14
017 * @author
018 * <A HREF="http://www.alumni.caltech.edu/~croft/">David W. Croft</A>
019 *********************************************************************/
020
021 public final class AdCanvas extends Canvas implements Runnable {
022 //////////////////////////////////////////////////////////////////////
023 //////////////////////////////////////////////////////////////////////
024
025 /**
026 *
027 * Modify to redirect control of what ads are displayed.
028 *
029 * Example: "/mydata/ads.data"
030 *
031 * The link is relative to the CodeBase although this may be modified
032 * as well.
033 *
034 */
035 private static final String ADS_DATA
036 = "http://www.orbs.com/advertising/data/Ads.data";
037
038 /**
039 *
040 * How long each image is displayed, in milliseconds.
041 *
042 */
043 private static final long AIR_TIME = 15000;
044
045 private static Random random = new Random ( );
046 private static boolean data_loaded = false;
047 private static Vector imageURL_StringVector = new Vector ( );
048 private static Vector site_URL_StringVector = new Vector ( );
049 private Graphics g;
050 private Dimension size;
051 private Image offscreenImage;
052 private Graphics offscreenGraphics;
053 private Thread thread;
054 private int index;
055 private Applet applet;
056
057 //////////////////////////////////////////////////////////////////////
058 //////////////////////////////////////////////////////////////////////
059
060 public AdCanvas ( Applet applet ) {
061 //////////////////////////////////////////////////////////////////////
062 this.applet = applet;
063 }
064
065 public void start ( ) {
066 //////////////////////////////////////////////////////////////////////
067 g = getGraphics ( );
068 size = size ( );
069 offscreenImage = createImage ( size.width, size.height );
070 offscreenGraphics = offscreenImage.getGraphics ( );
071 if ( data_load ( applet ) ) ( thread = new Thread ( this ) ).start ( );
072 }
073
074 private synchronized static boolean data_load ( Applet applet ) {
075 //////////////////////////////////////////////////////////////////////
076 if ( data_loaded ) return true;
077 try {
078 URL dataURL = new URL ( applet.getCodeBase ( ), ADS_DATA );
079 InputStream conn = dataURL.openStream ( );
080 DataInputStream data = new DataInputStream ( conn );
081 while ( true ) {
082 String line = data.readLine ( );
083 if ( line == null ) break;
084 imageURL_StringVector.addElement ( line );
085 site_URL_StringVector.addElement ( data.readLine ( ) );
086 if ( data.readLine ( ) == null ) break;
087 }
088 }
089 catch ( Exception e ) {
090 e.printStackTrace ( );
091 applet.showStatus ( e.getMessage ( ) );
092 return false;
093 }
094 data_loaded = true;
095 return true;
096 }
097
098 public void run ( ) {
099 //////////////////////////////////////////////////////////////////////
100 int count = imageURL_StringVector.size ( );
101 while ( true ) {
102 int [ ] random_order = random_order_list ( count );
103 for ( int i = 0; i < count; i++ ) {
104 index = random_order [ i ];
105 try {
106 Image image = applet.getImage ( new URL (
107 ( String ) imageURL_StringVector.elementAt ( index ) ) );
108 if ( prepareImage ( image, size.width, size.height, this ) ) {
109 offscreenGraphics.drawImage (
110 image, 0, 0, size.width, size.height, this );
111 paint ( g );
112 }
113 } catch ( Exception e ) {
114 e.printStackTrace ( );
115 applet.showStatus ( e.getMessage ( ) );
116 }
117 try { thread.sleep ( AIR_TIME ); }
118 catch ( InterruptedException e ) { }
119 }
120 }
121 }
122
123 public boolean imageUpdate (
124 Image image, int flags, int x, int y, int w, int h ) {
125 //////////////////////////////////////////////////////////////////////
126 if ( flags == 32 ) {
127 offscreenGraphics.drawImage (
128 image, 0, 0, size.width, size.height, this );
129 paint ( g );
130 }
131 return super.imageUpdate ( image, flags, x, y, w, h );
132 }
133
134 public boolean mouseMove ( Event evt, int x, int y ) {
135 //////////////////////////////////////////////////////////////////////
136 if ( site_URL_StringVector == null ) return true;
137 if ( site_URL_StringVector.size ( ) <= index ) return true;
138 applet.showStatus (
139 ( String ) site_URL_StringVector.elementAt ( index ) );
140 return true;
141 }
142
143 public boolean mouseUp ( Event evt, int x, int y ) {
144 //////////////////////////////////////////////////////////////////////
145 if ( site_URL_StringVector == null ) return true;
146 if ( site_URL_StringVector.size ( ) <= index ) return true;
147 try {
148 applet.getAppletContext ( ).showDocument ( new URL (
149 ( String ) site_URL_StringVector.elementAt ( index ) ) );
150 } catch ( MalformedURLException e ) {
151 e.printStackTrace ( );
152 applet.showStatus ( e.getMessage ( ) );
153 }
154 return true;
155 }
156
157 public void paint ( Graphics graphics ) {
158 //////////////////////////////////////////////////////////////////////
159 if ( offscreenImage == null ) return;
160 graphics.drawImage ( offscreenImage, 0, 0, this );
161 }
162
163 public void stop ( ) {
164 //////////////////////////////////////////////////////////////////////
165 if ( thread != null ) {
166 thread.stop ( );
167 thread = null;
168 }
169 }
170
171 public void update ( Graphics graphics ) {
172 //////////////////////////////////////////////////////////////////////
173 paint ( graphics );
174 }
175
176 public void repaint ( ) {
177 //////////////////////////////////////////////////////////////////////
178 paint ( g );
179 }
180
181 public static int [ ] random_order_list ( int count ) {
182 //////////////////////////////////////////////////////////////////////
183 Vector vector = new Vector ( count );
184 for ( int i = 0; i < count; i++ ) {
185 vector.addElement ( new Integer ( i ) );
186 }
187 int [ ] random_order = new int [ count ];
188 for ( int i = 0; i < count; i++ ) {
189 Integer lucky = ( Integer ) vector.elementAt (
190 ( int ) roll ( 1, count - i, -1 ) );
191 vector.removeElement ( lucky );
192 random_order [ i ] = lucky.intValue ( );
193 }
194 return random_order;
195 }
196
197 public static long roll (
198 long multiplier,
199 long base,
200 long offset ) {
201 //////////////////////////////////////////////////////////////////////
202 long temp = 0;
203 //////////////////////////////////////////////////////////////////////
204 for ( long index_roll = 0; index_roll < multiplier; index_roll++ ) {
205 temp += 1 + Math.round (
206 ( double ) ( base - 1 ) * random.nextDouble ( ) );
207 }
208 return temp + offset;
209 }
210
211 //////////////////////////////////////////////////////////////////////
212 //////////////////////////////////////////////////////////////////////
213 }