package eu.jucy.gui.texteditor;
import java.io.IOException;
import java.net.URL;
import logger.LoggerFactory;
import org.apache.log4j.Logger;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.widgets.Control;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.browser.IWebBrowser;
import org.eclipse.ui.browser.IWorkbenchBrowserSupport;
import uihelpers.SUIJob;
public class GraphicalFileDownloader {
private static final Logger logger = LoggerFactory.make();
private final URL url;
private final ObjectPoint<Control> point;
private final URLTextModificator mod;
/**
*
* @param url - where the image is..
*
* @param where - the StyledText where the URL is located
* @param positionx - point.x contains the carret offset for the position
*/
public GraphicalFileDownloader(URL url,ObjectPoint<Control> point,URLTextModificator mod) {
this.url = url;
this.point = point;
this.mod = mod;
}
public void start() {
point.obj.setEnabled(false);
new Job("loading image") {
public IStatus run(IProgressMonitor monitor) {
try {
ImageDescriptor imagedesc = ImageDescriptor.createFromURL(url);
final ImageData imagedata = imagedesc.getImageData();
if (imagedata == null) {
throw new IOException("failed loading image");
}
new SUIJob() {
@Override
public void run() {
Image image = scaleIfNeeded(imagedata);
mod.addLabelReplacementImage(point.x, url.toString(), image);
return;
}
}.schedule();
} catch(Exception e) {
try {
IWorkbenchBrowserSupport browserSupport =
PlatformUI.getWorkbench().getBrowserSupport();
IWebBrowser browser = browserSupport.createBrowser("myid");
browser.openURL(url);
} catch (PartInitException io2) {
logger.warn(io2, io2);
}
logger.debug(e,e);
} finally {
new SUIJob() {
@Override
public void run() {
if (!point.obj.isDisposed()) {
point.obj.setEnabled(true);
}
}
}.schedule();
}
return Status.OK_STATUS;
}
}.schedule();
}
public static Image scaleIfNeeded(ImageData imaged) {
if (imaged.width > 500 || imaged.height > 800 ) {
double scale = Math.max(imaged.width / 500d, imaged.height/800d);
Image img = new Image(null,imaged);
int newWidth = (int)(imaged.width/scale);
int newHeight= (int) (imaged.height/scale);
Image target = new Image(null,newWidth,newHeight);
GC gc = new GC(target);
gc.setInterpolation(SWT.HIGH);
gc.drawImage(img, 0, 0, imaged.width, imaged.height, 0, 0, newWidth, newHeight);
gc.dispose();
img.dispose();
return target;
//imaged = imaged.scaledTo((int)(imaged.width/scale),(int) (imaged.height/scale));
}
return new Image(null,imaged);// ImageDescriptor.createFromImageData(imaged).createImage();
}
}