package com.eas.ui; import java.util.logging.Level; import java.util.logging.Logger; import com.eas.client.AppClient; import com.eas.client.CallbackAdapter; import com.eas.core.Utils; import com.google.gwt.core.client.Callback; import com.google.gwt.core.client.JavaScriptObject; import com.google.gwt.dom.client.Style; import com.google.gwt.dom.client.Style.Position; import com.google.gwt.event.dom.client.ErrorEvent; import com.google.gwt.event.dom.client.ErrorHandler; import com.google.gwt.event.dom.client.LoadEvent; import com.google.gwt.event.dom.client.LoadHandler; import com.google.gwt.resources.client.ImageResource; import com.google.gwt.safehtml.shared.SafeUri; import com.google.gwt.user.client.ui.Image; import com.google.gwt.user.client.ui.RootPanel; public class PlatypusImageResource implements ImageResource { protected String name; protected int width; protected int height; public PlatypusImageResource(String aName, int aWidth, int aHeight) { super(); name = aName; width = aWidth; height = aHeight; } public static void jsLoad(final String aResourceName, final JavaScriptObject aOnSuccess, final JavaScriptObject aOnFailure) { final String callerDir = Utils.lookupCallerJsDir(); String normalizedResourceName = aResourceName.startsWith("./") || aResourceName.startsWith("../") ? AppClient.toFilyAppModuleId(aResourceName, callerDir) : aResourceName; load(normalizedResourceName, new CallbackAdapter<ImageResource, String>() { @Override public void onFailure(String reason) { if (aOnFailure != null) { try { Utils.executeScriptEventVoid(null, aOnFailure, reason); } catch (Exception ex) { Logger.getLogger(PlatypusImageResource.class.getName()).log(Level.SEVERE, null, ex); } } } @Override protected void doWork(ImageResource aResult) throws Exception { if (aOnSuccess != null) { Utils.executeScriptEventVoid(null, aOnSuccess, aResult); } } }); } public static void load(final String aName, final Callback<ImageResource, String> aCallback) { if (aName != null && !aName.isEmpty()) { SafeUri imageUri = AppClient.getInstance().getResourceUri(aName); final Image im = new Image(imageUri); im.addLoadHandler(new LoadHandler() { @Override public void onLoad(LoadEvent event) { int imWidth = im.getWidth(); int imHeight = im.getHeight(); im.removeFromParent(); ImageResource loaded = new PlatypusImageResource(aName, imWidth, imHeight); if (aCallback != null) { aCallback.onSuccess(loaded); } } }); im.addErrorHandler(new ErrorHandler() { @Override public void onError(ErrorEvent event) { im.removeFromParent(); if (aCallback != null) { aCallback.onFailure("Error while loading an image " + aName); } } }); im.setVisible(false); im.getElement().getStyle().setPosition(Position.ABSOLUTE); im.getElement().getStyle().setLeft(-Integer.MAX_VALUE / 2, Style.Unit.PX); im.getElement().getStyle().setTop(-Integer.MAX_VALUE / 2, Style.Unit.PX); RootPanel.get().add(im); } } @Override public String getName() { return name; } @Override public int getHeight() { return height; } @Override public int getLeft() { return 0; } @Override public SafeUri getSafeUri() { return AppClient.getInstance().getResourceUri(name); } @Override public int getTop() { return 0; } @Override public String getURL() { return getSafeUri().asString(); } @Override public int getWidth() { return width; } @Override public boolean isAnimated() { return true; } }