FileDocCategorySizeDatePackage
ImageMap.javaAPI DocSun JDK 1.4.2 Example14354Thu May 12 00:35:29 BST 2005None

ImageMap

public class ImageMap extends Applet implements MouseListener, Runnable, MouseMotionListener
An extensible ImageMap applet class. The active areas on the image are controlled by ImageArea classes that can be dynamically loaded over the net.
author
Jim Graham
version
1.18, 01/23/03

Fields Summary
Image
baseImage
The unhighlighted image being mapped.
ImageMapArea[]
areas
The list of image area handling objects;
static final int
BRIGHTER
The primary highlight mode to be used.
static final int
DARKER
int
hlmode
int
hlpercent
The percentage of highlight to apply for the primary highlight mode.
MediaTracker
tracker
The MediaTracker for loading and constructing the various images.
Thread
aniThread
String
introTune
private boolean
fullrepaint
private static final long
UPDATERATE
int
pressX
int
pressY
Constructors Summary
Methods Summary
voidaddImage(java.awt.Image img)
Add an image to the list of images to be tracked.

	tracker.addImage(img, 1);
    
voidcheckSize()
Check the size of this applet while the image is being loaded.

	int w = baseImage.getWidth(this);
	int h = baseImage.getHeight(this);
	if (w > 0 && h > 0) {
	    resize(w, h);
	    synchronized(this) {
		fullrepaint = true;
	    }
	    repaint(0, 0, w, h);
	}
    
public voiddestroy()

        removeMouseListener(this);
        removeMouseMotionListener(this);
    
public java.lang.StringgetAppletInfo()

    return "Title: ImageMap \nAuthor: Jim Graham \nAn extensible ImageMap applet class. \nThe active areas on the image are controlled by ImageArea \nclasses that can be dynamically loaded over the net.";
  
java.awt.ImagegetHighlight(int x, int y, int w, int h)
Get a rectangular region of the baseImage highlighted according to the primary highlight specification.


                       
             
	return getHighlight(x, y, w, h, hlmode, hlpercent);
    
java.awt.ImagegetHighlight(int x, int y, int w, int h, int mode, int percent)
Get a rectangular region of the baseImage with a specific highlight.

	return getHighlight(x, y, w, h, new HighlightFilter(mode == BRIGHTER,
							    percent));
    
java.awt.ImagegetHighlight(int x, int y, int w, int h, java.awt.image.ImageFilter filter)
Get a rectangular region of the baseImage modified by an image filter.

	ImageFilter cropfilter = new CropImageFilter(x, y, w, h);
	ImageProducer prod = new FilteredImageSource(baseImage.getSource(),
						     cropfilter);
	return makeImage(prod, filter, 0);
    
public java.lang.String[][]getParameterInfo()

    String[][] info = {
      {"area[n]", "delimited string",
"This parameter takes the form of <ImageAreaClassName>, <ul>, <ur>, <ll>, <lr>, <action> where ImageAreaClassName is the name of the class from which this feedback area is controlled, the next four arguments are the four corners of the "
+ " feedback zone, and the final argument is that action that should be taken on click or mouseover.  That action can be 1) display text in the status bar (if you provide a string argument), 2) play a sound (if you provide the path to a sound file), or 3) load a page (if you provide a URL)."},
      {"rect[n]", "delimited string", "Deprecated: use area[n]"},
      {"href[n]", "URL string", "Pass in a URL to create a LinkArea which will point to this URL.  Not used in these examples."},
      {"highlight", "string/int", "Pass the word 'brighter' followed by an integer 'n' to change the highlight mode to brighter and the hightlight percentage to n.  Pass the word 'darker' followed by an integer 'm' to change the highlight mode to darker and the highlight percentage to m.  Anything else will be ignored.  The default highlight mode is BRIGHTER and the default highlight percentage is 50."},
      {"startsound", "path string", "The path of a soundclip to play when the image is first displayed."},
      {"img", "path string", "The path to the image to be displayed as a live feedback image map."}
    };
    return info;
  
public booleanimageUpdate(java.awt.Image img, int infoflags, int x, int y, int width, int height)
Handle updates from images being loaded.


               
         
			               
	if ((infoflags & (WIDTH | HEIGHT)) != 0) {
	    checkSize();
	}
	if ((infoflags & (SOMEBITS | FRAMEBITS | ALLBITS)) != 0) {
	    synchronized(this) {
		fullrepaint = true;
	    }
	    repaint(((infoflags & (FRAMEBITS | ALLBITS)) != 0)
		    ? 0 : UPDATERATE,
		    x, y, width, height);
	}
	return (infoflags & (ALLBITS | ERROR)) == 0;
    
public voidinit()
Initialize the applet. Get attributes. Initialize the ImageAreas. Each ImageArea is a subclass of the class ImageArea, and is specified with an attribute of the form: areaN=ImageAreaClassName,arguments... The ImageAreaClassName is parsed off and a new instance of that class is created. The initializer for that class is passed a reference to the applet and the remainder of the attribute string, from which the class should retrieve any information it needs about the area it controls and the actions it needs to take within that area.

	String s;

	tracker = new MediaTracker(this);
	parseHighlight(getParameter("highlight"));
	introTune = getParameter("startsound");
	baseImage = getImage(getDocumentBase(), getParameter("img"));
	Vector areaVec = new Vector();
	int num = 1;
	while (true) {
	    ImageMapArea newArea;
	    s = getParameter("area"+num);
	    if (s == null) {
		// Try rect for backwards compatibility.
		s = getParameter("rect"+num);
		if (s == null) {
		    break;
		}
		try {
		    newArea = new HighlightArea();
		    newArea.init(this, s);
		    areaVec.addElement(newArea);
		    String url = getParameter("href"+num);
		    if (url != null) {
			s += "," + url;
			newArea = new LinkArea();
			newArea.init(this, s);
			areaVec.addElement(newArea);
		    }
		} catch (Exception e) {
		    System.out.println("error processing: "+s);
		    e.printStackTrace();
		    break;
		}
	    } else {
		try {
		    int classend = s.indexOf(",");
		    String name = s.substring(0, classend);
		    newArea = (ImageMapArea) Class.forName(name).newInstance();
		    s = s.substring(classend+1);
		    newArea.init(this, s);
		    areaVec.addElement(newArea);
		} catch (Exception e) {
		    System.out.println("error processing: "+s);
		    e.printStackTrace();
		    break;
		}
	    }
	    num++;
	}
	areas = new ImageMapArea[areaVec.size()];
	areaVec.copyInto(areas);
	checkSize();
	addMouseListener(this);
	addMouseMotionListener(this);
    
java.awt.ImagemakeImage(java.awt.Image orig, java.awt.image.ImageFilter filter)
Make a filtered image based on another image.

	return makeImage(orig.getSource(), filter);
    
java.awt.ImagemakeImage(java.awt.image.ImageProducer prod, java.awt.image.ImageFilter filter)
Make a filtered image based on another ImageProducer.

	return makeImage(prod, filter,
			 (prod == baseImage.getSource()) ? 1 : 0);
    
java.awt.ImagemakeImage(java.awt.image.ImageProducer prod, java.awt.image.ImageFilter filter, int ID)
Make a filtered image based on another ImageProducer. Add it to the media tracker using the indicated ID.

	Image filtered = createImage(new FilteredImageSource(prod, filter));
	tracker.addImage(filtered, ID);
	return filtered;
    
public voidmouseClicked(java.awt.event.MouseEvent e)

public voidmouseDragged(java.awt.event.MouseEvent e)
Inform all active ImageAreas of a mouse drag. Only those areas that were inside the original mouseDown() are informed of the mouseUp.

    mouseMoved(e);
    for (int i = 0; i < areas.length; i++) {
      if (areas[i].inside(pressX, pressY)) {
	if (areas[i].drag(e.getX(), e.getY())) {
	  break;
	}
      }
    }
    e.consume();
  
public voidmouseEntered(java.awt.event.MouseEvent e)

public voidmouseExited(java.awt.event.MouseEvent e)
Make sure that no ImageAreas are highlighted.

    for (int i = 0; i < areas.length; i++) {
      areas[i].checkExit();
    }
    e.consume();
  
public voidmouseMoved(java.awt.event.MouseEvent e)
Find the ImageAreas that the mouse is in.

    boolean eaten = false;

    for (int i = 0; i < areas.length; i++) {
      if (!eaten && areas[i].inside(e.getX(), e.getY())) {
	eaten = areas[i].checkEnter(e.getX(), e.getY());
      } else {
	areas[i].checkExit();
      }
    }
    e.consume();
  
public voidmousePressed(java.awt.event.MouseEvent e)
Inform all active ImageAreas of a mouse press.

    pressX = e.getX();
    pressY = e.getY();

    for (int i = 0; i < areas.length; i++) {
      if (areas[i].inside(pressX, pressY)) {
	if (areas[i].press(pressX, pressY)) {
	  break;
	}
      }
    }
    e.consume();
  
public voidmouseReleased(java.awt.event.MouseEvent e)
Inform all active ImageAreas of a mouse release. Only those areas that were inside the original mousePressed() are informed of the mouseReleased.

    for (int i = 0; i < areas.length; i++) {
      if (areas[i].inside(pressX, pressY)) {
	if (areas[i].lift(e.getX(), e.getY())) {
	  break;
	}
      }
    }
    e.consume();
  
public voidnewStatus()
Scan all areas looking for the topmost status string.

	String msg = null;
	for (int i = 0; i < areas.length; i++) {
	    msg = areas[i].getStatus(msg);
	}
	showStatus(msg);
    
public voidpaint(java.awt.Graphics g)
Paint the image and all active highlights.

	synchronized(this) {
	    fullrepaint = false;
	}
	if (baseImage == null) {
	    return;
	}
	g.drawImage(baseImage, 0, 0, this);
	if (areas != null) {
	    for (int i = areas.length; --i >= 0; ) {
		areas[i].highlight(g);
	    }
	}
    
voidparseHighlight(java.lang.String s)
Parse a string representing the desired highlight to be applied.

	if (s == null) {
	    return;
	}
	if (s.startsWith("brighter") || s.startsWith("BRIGHTER")) {
	    hlmode = BRIGHTER;
	    if (s.length() > "brighter".length()) {
		hlpercent = Integer.parseInt(s.substring("brighter".length()));
	    }
	} else if (s.startsWith("darker") || s.startsWith("DARKER")) {
	    hlmode = DARKER;
	    if (s.length() > "darker".length()) {
		hlpercent = Integer.parseInt(s.substring("darker".length()));
	    }
	}
    
public voidrun()

	Thread me = Thread.currentThread();
	tracker.checkAll(true);
	for (int i = areas.length; --i >= 0; ) {
	    areas[i].getMedia();
	}
	me.setPriority(Thread.MIN_PRIORITY);
	while (aniThread == me) {
	    boolean animating = false;
	    for (int i = areas.length; --i >= 0; ) {
		animating = areas[i].animate() || animating;
	    }
	    try {
		synchronized(this) {
		    wait(animating ? 100 : 0);
		}
	    } catch (InterruptedException e) {
		break;
	    }
	}
    
public voidstart()


       
	if (introTune != null)
	    try {
		play(new URL(getDocumentBase(), introTune));
	    } catch (MalformedURLException e) {}
	if (aniThread == null) {
            aniThread = new Thread(this);
            aniThread.setName("ImageMap Animator");
            aniThread.start();
	}
    
public synchronized voidstartAnimation()

	notify();
    
public synchronized voidstop()

	aniThread = null;
	notify();
	for (int i = 0; i < areas.length; i++) {
	    areas[i].exit();
	}
    
public voidupdate(java.awt.Graphics g)
Update the active highlights on the image.

	boolean full;
	synchronized(this) {
	    full = fullrepaint;
	}
	if (full) {
	    paint(g);
	    return;
	}
	if (baseImage == null) {
	    return;
	}
	g.drawImage(baseImage, 0, 0, this);
	if (areas == null) {
	    return;
	}
	// First unhighlight all of the deactivated areas
	for (int i = areas.length; --i >= 0; ) {
	    areas[i].highlight(g);
	}