ui/src/main/java/ucar/nc2/ui/image/ScalablePicture.java
public void loadAndScalePictureInThread(URL imageUrl, int priority, double rotation) {
    this.imageUrl = imageUrl;

    boolean alreadyLoading = false;
    Tools.log("ScalablePicture.loadAndScalePictureInThread: checking if picture " + imageUrl + " is already being loaded.");
    if ((sourcePicture != null) && (sourcePicture.getUrl().toString().equals(imageUrl.toString()))) {
      Tools.log("ScalablePicture.loadAndScalePictureInThread: the SourcePicture is already loading the sourcePictureimage");
      alreadyLoading = true;
    } else if (PictureCache.isInCache(imageUrl)) {
      // in case the old image has a listener connected remove it
      //  fist time round the sourcePicture is still null therefore the if.
      if (sourcePicture != null) sourcePicture.removeListener(this);

      sourcePicture = PictureCache.getSourcePicture(imageUrl);
      String status = sourcePicture.getStatusMessage();
      if (status == null) status = "";
      Tools.log("ScalablePicture.loadAndScalePictureInThread: Picture in cache! Status: " + status);

      if (sourcePicture.getRotation() == rotation) {
        alreadyLoading = true;
        Tools.log("ScalablePicture.loadAndScalePictureInThread: Picture was even rotated to the correct angle!");
      } else {
        alreadyLoading = false;
        Tools.log("ScalablePicture.loadAndScalePictureInThread: Picture was in cache but with wrong rotation. Forcing reload.");
      }
    }


    if (alreadyLoading) {
      switch (sourcePicture.getStatusCode()) {
        case SourcePicture.UNINITIALISED:
          alreadyLoading = false;
          Tools.log("ScalablePicture.loadAndScalePictureInThread: pictureStatus was: UNINITIALISED");
          break;
        case SourcePicture.ERROR:
          alreadyLoading = false;
          Tools.log("ScalablePicture.loadAndScalePictureInThread: pictureStatus was: ERROR");
          break;
        case SourcePicture.LOADING:
          Tools.log("ScalablePicture.loadAndScalePictureInThread: pictureStatus was: LOADING");
          sourcePicture.addListener(this);
          setStatus(LOADING, "Loading: " + imageUrl.toString());
          sourceLoadProgressNotification(SourcePicture.LOADING_PROGRESS, sourcePicture.getPercentLoaded());
          scaleAfterLoad = true;
          break;
        case SourcePicture.ROTATING:
          Tools.log("ScalablePicture.loadAndScalePictureInThread: pictureStatus was: ROTATING");
          setStatus(LOADING, "Rotating: " + imageUrl.toString());
          sourceLoadProgressNotification(SourcePicture.LOADING_PROGRESS, sourcePicture.getPercentLoaded());
          scaleAfterLoad = true;
          break;
        case SourcePicture.READY:
          Tools.log("ScalablePicture.loadAndScalePictureInThread: pictureStatus was: READY. Sending SCALING status.");
          setStatus(SCALING, "Scaling: " + imageUrl.toString());
          createScaledPictureInThread(priority);
          break;
        default:
          Tools.log("ScalablePicture.loadAndScalePictureInThread: Don't know what status this is:" + Integer.toString(sourcePicture.getStatusCode()));
          break;

      }
    }

    // if the image is not already there then load it.
    if (!alreadyLoading) {
      if (sourcePicture != null) sourcePicture.removeListener(this);
      sourcePicture = new SourcePicture();
      sourcePicture.addListener(this);
      setStatus(LOADING, "Loading: " + imageUrl.toString());
      scaleAfterLoad = true;
      sourcePicture.loadPictureInThread(imageUrl, priority, rotation);
      // when the thread is done it sends a sourceStatusChange message to us
    }
  }
public void loadAndScalePictureInThread(URL imageUrl, int priority, double rotation) {
    this.imageUrl = imageUrl;

    boolean alreadyLoading = false;
    Tools.log("ScalablePicture.loadAndScalePictureInThread: checking if picture " + imageUrl + " is already being loaded.");
    if ((sourcePicture != null) && (sourcePicture.getUrl().toString().equals(imageUrl.toString()))) {
      Tools.log("ScalablePicture.loadAndScalePictureInThread: the SourcePicture is already loading the sourcePictureimage");
      alreadyLoading = true;
    } else if (PictureCache.isInCache(imageUrl)) {
      // in case the old image has a listener connected remove it
      //  fist time round the sourcePicture is still null therefore the if.
      if (sourcePicture != null) sourcePicture.removeListener(this);

      sourcePicture = PictureCache.getSourcePicture(imageUrl);
      String status = sourcePicture.getStatusMessage();
      if (status == null) status = "";
      Tools.log("ScalablePicture.loadAndScalePictureInThread: Picture in cache! Status: " + status);

      if (sourcePicture.getRotation() == rotation) {
        alreadyLoading = true;
        Tools.log("ScalablePicture.loadAndScalePictureInThread: Picture was even rotated to the correct angle!");
      } else {
        alreadyLoading = false;
        Tools.log("ScalablePicture.loadAndScalePictureInThread: Picture was in cache but with wrong rotation. Forcing reload.");
      }
    }


    if (alreadyLoading) {
      switch (sourcePicture.getStatusCode()) {
        case SourcePicture.UNINITIALISED:
          alreadyLoading = false;
          Tools.log("ScalablePicture.loadAndScalePictureInThread: pictureStatus was: UNINITIALISED");
          break;
        case SourcePicture.ERROR:
          alreadyLoading = false;
          Tools.log("ScalablePicture.loadAndScalePictureInThread: pictureStatus was: ERROR");
          break;
        case SourcePicture.LOADING:
          Tools.log("ScalablePicture.loadAndScalePictureInThread: pictureStatus was: LOADING");
          sourcePicture.addListener(this);
          setStatus(LOADING, "Loading: " + imageUrl.toString());
          sourceLoadProgressNotification(SourcePicture.LOADING_PROGRESS, sourcePicture.getPercentLoaded());
          scaleAfterLoad = true;
          break;
        case SourcePicture.ROTATING:
          Tools.log("ScalablePicture.loadAndScalePictureInThread: pictureStatus was: ROTATING");
          setStatus(LOADING, "Rotating: " + imageUrl.toString());
          sourceLoadProgressNotification(SourcePicture.LOADING_PROGRESS, sourcePicture.getPercentLoaded());
          scaleAfterLoad = true;
          break;
        case SourcePicture.READY:
          Tools.log("ScalablePicture.loadAndScalePictureInThread: pictureStatus was: READY. Sending SCALING status.");
          setStatus(SCALING, "Scaling: " + imageUrl.toString());
          createScaledPictureInThread(priority);
          break;
        default:
          Tools.log("ScalablePicture.loadAndScalePictureInThread: Don't know what status this is:" + Integer.toString(sourcePicture.getStatusCode()));
          break;

      }
    }

    // if the image is not already there then load it.
    if (!alreadyLoading) {
      if (sourcePicture != null) sourcePicture.removeListener(this);
      sourcePicture = new SourcePicture();
      sourcePicture.addListener(this);
      setStatus(LOADING, "Loading: " + imageUrl.toString());
      scaleAfterLoad = true;
      sourcePicture.loadPictureInThread(imageUrl, priority, rotation);
      // when the thread is done it sends a sourceStatusChange message to us
    }
  }
public void loadAndScalePictureInThread ( URL imageUrl , int priority , double rotation ) { this . imageUrl = imageUrl ; boolean alreadyLoading = false ; Tools . log ( "ScalablePicture.loadAndScalePictureInThread: checking if picture " + imageUrl + " is already being loaded." ) ; if ( ( sourcePicture != null ) && ( sourcePicture . getUrl ( ) . toString ( ) . equals ( imageUrl . toString ( ) ) ) ) { Tools . log ( "ScalablePicture.loadAndScalePictureInThread: the SourcePicture is already loading the sourcePictureimage" ) ; alreadyLoading = true ; } else if ( PictureCache . isInCache ( imageUrl ) ) { // in case the old image has a listener connected remove it
 //  fist time round the sourcePicture is still null therefore the if.
 if ( sourcePicture != null ) sourcePicture . removeListener ( this ) ; sourcePicture = PictureCache . getSourcePicture ( imageUrl ) ; String status = sourcePicture . getStatusMessage ( ) ; if ( status == null ) status = "" ; Tools . log ( "ScalablePicture.loadAndScalePictureInThread: Picture in cache! Status: " + status ) ; if ( sourcePicture . getRotation ( ) == rotation ) { alreadyLoading = true ; Tools . log ( "ScalablePicture.loadAndScalePictureInThread: Picture was even rotated to the correct angle!" ) ; } else { alreadyLoading = false ; Tools . log ( "ScalablePicture.loadAndScalePictureInThread: Picture was in cache but with wrong rotation. Forcing reload." ) ; } } if ( alreadyLoading ) { switch ( sourcePicture . getStatusCode ( ) ) { case SourcePicture . UNINITIALISED : alreadyLoading = false ; Tools . log ( "ScalablePicture.loadAndScalePictureInThread: pictureStatus was: UNINITIALISED" ) ; break ; case SourcePicture . ERROR : alreadyLoading = false ; Tools . log ( "ScalablePicture.loadAndScalePictureInThread: pictureStatus was: ERROR" ) ; break ; case SourcePicture . LOADING : Tools . log ( "ScalablePicture.loadAndScalePictureInThread: pictureStatus was: LOADING" ) ; sourcePicture . addListener ( this ) ; setStatus ( LOADING , "Loading: " + imageUrl . toString ( ) ) ; sourceLoadProgressNotification ( SourcePicture . LOADING_PROGRESS , sourcePicture . getPercentLoaded ( ) ) ; scaleAfterLoad = true ; break ; case SourcePicture . ROTATING : Tools . log ( "ScalablePicture.loadAndScalePictureInThread: pictureStatus was: ROTATING" ) ; setStatus ( LOADING , "Rotating: " + imageUrl . toString ( ) ) ; sourceLoadProgressNotification ( SourcePicture . LOADING_PROGRESS , sourcePicture . getPercentLoaded ( ) ) ; scaleAfterLoad = true ; break ; case SourcePicture . READY : Tools . log ( "ScalablePicture.loadAndScalePictureInThread: pictureStatus was: READY. Sending SCALING status." ) ; setStatus ( SCALING , "Scaling: " + imageUrl . toString ( ) ) ; createScaledPictureInThread ( priority ) ; break ; default : Tools . log ( "ScalablePicture.loadAndScalePictureInThread: Don't know what status this is:" + Integer . toString ( sourcePicture . getStatusCode ( ) ) ) ; break ; } } // if the image is not already there then load it.
 if ( ! alreadyLoading ) { if ( sourcePicture != null ) sourcePicture . removeListener ( this ) ; sourcePicture = new SourcePicture ( ) ; sourcePicture . addListener ( this ) ; setStatus ( LOADING , "Loading: " + imageUrl . toString ( ) ) ; scaleAfterLoad = true ; sourcePicture . loadPictureInThread ( imageUrl , priority , rotation ) ; // when the thread is done it sends a sourceStatusChange message to us
 } }
method to invoke with a filename or URL of a picture that is to be loaded and scaled in
a new thread. This is handy to update the screen while the loading chuggs along in the background.
Make sure you invoked setScaleFactor or setScaleSize before
invoking this method.
<p/>
Step 1: Am I already loading what I need somewhere?
If yes -> use it.
Has it finished loading?
If no -> wait for it
If yes -> use it
Else -> load it

@param priority The Thread priority
@param  imageUrl  The URL of the image you want to load
@param  rotation  The rotation 0-360 that the image should be put through
after loading.
method to invoke with a filename or URL of a picture that is to be loaded and scaled in a new thread . This is handy to update the screen while the loading chuggs along in the background . Make sure you invoked setScaleFactor or setScaleSize before invoking this method . <p / > Step 1 : Am I already loading what I need somewhere? If yes - > use it . Has it finished loading? If no - > wait for it If yes - > use it Else - > load it