--- /dev/null
+package org.argeo.minidesktop;
+
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.PaintEvent;
+import org.eclipse.swt.events.PaintListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.ImageData;
+import org.eclipse.swt.graphics.ImageLoader;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.layout.RowLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Canvas;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.FileDialog;
+import org.eclipse.swt.widgets.Shell;
+
+public class MiniImageViewer implements PaintListener {
+ private URL url;
+ private Canvas area;
+
+ private Image image;
+
+ public MiniImageViewer(Composite parent, int style) {
+ parent.setLayout(new GridLayout());
+
+ Composite toolBar = new Composite(parent, SWT.NONE);
+ toolBar.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+ toolBar.setLayout(new RowLayout());
+ Button load = new Button(toolBar, SWT.FLAT);
+ load.setText("\u2191");// up arrow
+ load.addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ FileDialog fileDialog = new FileDialog(area.getShell());
+ String path = fileDialog.open();
+ if (path != null) {
+ setUrl(path);
+ }
+ }
+
+ });
+
+ area = new Canvas(parent, SWT.NONE);
+ area.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ area.addPaintListener(this);
+ }
+
+ protected void load(URL url) {
+ try {
+ ImageLoader imageLoader = new ImageLoader();
+ ImageData[] data = imageLoader.load(url.openStream());
+ image = new Image(area.getDisplay(), data[0]);
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+
+ @Override
+ public void paintControl(PaintEvent e) {
+ e.gc.drawImage(image, 0, 0);
+
+ }
+
+ protected Path url2path(URL url) {
+ try {
+ Path path = Paths.get(url.toURI());
+ return path;
+ } catch (URISyntaxException e) {
+ throw new IllegalStateException("Cannot convert " + url + " to uri", e);
+ }
+ }
+
+ public void setUrl(URL url) {
+ this.url = url;
+ if (area != null)
+ load(this.url);
+ }
+
+ public void setUrl(String url) {
+ try {
+ setUrl(new URL(url));
+ } catch (MalformedURLException e) {
+ // try with http
+ try {
+ setUrl(new URL("file://" + url));
+ return;
+ } catch (MalformedURLException e1) {
+ // nevermind...
+ }
+ throw new IllegalArgumentException("Cannot interpret URL " + url, e);
+ }
+ }
+
+ public static void main(String[] args) {
+ Display display = Display.getCurrent() == null ? new Display() : Display.getCurrent();
+ Shell shell = new Shell(display, SWT.SHELL_TRIM);
+
+ MiniImageViewer miniBrowser = new MiniImageViewer(shell, SWT.NONE);
+ String url = args.length > 0 ? args[0] : "";
+ if (!url.trim().equals("")) {
+ miniBrowser.setUrl(url);
+ shell.setText(url);
+ } else {
+ shell.setText("*");
+ }
+
+ shell.open();
+ shell.setSize(new Point(800, 480));
+ while (!shell.isDisposed()) {
+ if (!display.readAndDispatch())
+ display.sleep();
+ }
+ }
+
+}