/** * Image Loader for the Moving Map Navigator Demonstrator Applet * @author Robert J Morton * @version 12 Dec 2007 */ import java.awt.MediaTracker; // for the new-fangled 1.1 event handling public class imgldr { private static imgldr il; private bs hf; // instance reference to the bs applet private msgpanel mp; // instance reference for message panel private MediaTracker tracker; // to track when the images have been loaded private boolean loadingImages = true, trackerError = false, // true = tracker encountered an error loadFTT = true, // to avoid an erase and repaint of the loading message errorFTT = true; // load-error message once per refresh cycle imgldr(bs hf, msgpanel mp) { this.hf = hf; // instance reference to the bs applet this.mp = mp; // instance of message panel // create a media tracker and register images with it tracker = new MediaTracker(hf); il = this; // instance reference to this instance of the image loader if(hf.JarredImages) { // load images from the applet's own jar file hf.IMG1 = hf.getImage(getClass().getResource("map1.png")); hf.IMG2 = hf.getImage(getClass().getResource("map2.png")); hf.IMG3 = hf.getImage(getClass().getResource("map3.png")); } else { // load images from remote server hf.IMG1 = hf.getImage(hf.getDocumentBase(),"map1.png"); hf.IMG2 = hf.getImage(hf.getDocumentBase(),"map2.png"); hf.IMG3 = hf.getImage(hf.getDocumentBase(),"map3.png"); } tracker.addImage(hf.IMG1,0); // register the images with the tracker tracker.addImage(hf.IMG2,0); tracker.addImage(hf.IMG3,0); } boolean awaitingImages() { if(loadFTT) { // if this is the first time through here mp.showMsg("Loading images from server...", false); loadFTT = false; // avoid repeating display every cycle } /* Keep checking the tracker for a completion or error signal. If the tracker does not say anything, return without servicing the applet 'run' thread. */ try { tracker.waitForAll(); } catch (InterruptedException e) { return true; } return false; // drop thru when tracker gives a completion signal } // RETURNS TRUE WHEN IMAGE LOADING HAS TERMINATED boolean imagesLoaded() { if(tracker == null) return true; // tracker instance no longer exists if(loadingImages) { // if image loading process still running /* Get the status of the image loading process. If it has finished, set the flag to indicate image loading failure. */ int ts = tracker.statusAll(false); if((ts & MediaTracker.ERRORED) != 0) { trackerError = true; /* If this is the first time through here, display error message and set the flag to aviod repeated re-display of the same message. */ if(errorFTT) { mp.showMsg("Error: couldn't load images.", true); errorFTT = false; } } /* If the tracker has completed its task, set the flag to indicate that image loading has terminated. */ if(ts == MediaTracker.COMPLETE) { loadingImages = false; } } /* Else, the image loading process has just finished, so refresh the display if not already done so. */ else { killTracker(); mp.showMsg("Images Loaded.", false); } return false; } // REMOVE [DE-REGISTER] THE IMAGES FROM TRACKER AND THEN KILL THE TRACKER void killTracker() { if(tracker != null) { tracker.removeImage(hf.IMG1, 0); tracker.removeImage(hf.IMG2, 0); tracker.removeImage(hf.IMG3, 0); tracker = null; } } boolean TrackerError() {return trackerError;} }