package com.project.shared.client.net; import com.google.common.base.Strings; 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.event.shared.HandlerRegistration; import com.google.gwt.user.client.ui.Image; import com.google.gwt.user.client.ui.RootPanel; import com.project.shared.client.events.SimpleEvent; import com.project.shared.client.handlers.RegistrationsManager; import com.project.shared.data.KeyValue; public class ImageLoader { private Image _image = new Image(); private RegistrationsManager _selfRegs = new RegistrationsManager(); private RegistrationsManager _imageRegs = new RegistrationsManager(); private SimpleEvent<KeyValue<Integer, Image>> _loadHandler = new SimpleEvent<KeyValue<Integer, Image>>(); private SimpleEvent<Void> _errorHandler = new SimpleEvent<Void>(); public ImageLoader() { //Image is still loaded even if it sets to display:none. this._image.getElement().getStyle().setProperty("display", "none"); } public HandlerRegistration addLoadHandler(SimpleEvent.Handler<KeyValue<Integer, Image>> loadHandler) { return this._loadHandler.addHandler(loadHandler); } public HandlerRegistration addErrorHandler(SimpleEvent.Handler<Void> errorHandler) { return this._errorHandler.addHandler(errorHandler); } public void load(String[] imageUrls) { this._selfRegs.clear(); RootPanel.get().remove(this._image); RootPanel.get().add(this._image); this._selfRegs.add(this._loadHandler.addHandler(new SimpleEvent.Handler<KeyValue<Integer, Image>>(){ @Override public void onFire(KeyValue<Integer, Image> arg) { _selfRegs.clear(); RootPanel.get().remove(_image); }})); this._selfRegs.add(this._errorHandler.addHandler(new SimpleEvent.Handler<Void>(){ @Override public void onFire(Void arg) { _selfRegs.clear(); RootPanel.get().remove(_image); }})); this.load(this._image, imageUrls, 0); } public void load(Image image, String[] imageUrls) { this.load(image, imageUrls, 0); } private void load(final Image image, final String[] imageUrls, final int index) { this._imageRegs.clear(); String imageUrl = imageUrls[index]; if (Strings.isNullOrEmpty(imageUrl)) { _errorHandler.dispatch(null); } this._imageRegs.add(image.addErrorHandler(new ErrorHandler() { @Override public void onError(ErrorEvent event) { _imageRegs.clear(); if (index >= imageUrls.length - 1) { _errorHandler.dispatch(null); } else { load(image, imageUrls, index + 1); } }})); this._imageRegs.add(image.addLoadHandler(new LoadHandler() { @Override public void onLoad(LoadEvent event) { _imageRegs.clear(); _loadHandler.dispatch(new KeyValue<Integer, Image>(index, image)); } })); Image.prefetch(imageUrl); image.setUrl(imageUrl); // will be set to "" after loaded. } }