Improve image management and ACR
[lgpl/argeo-commons.git] / swt / org.argeo.cms.swt / src / org / argeo / cms / swt / AbstractSwtImageManager.java
index 00a51ef921f9cc62a27e6bd6609b78b5f549b414..30d6bc907b54229a2d00a4263878c13e3ccbaf22 100644 (file)
@@ -1,24 +1,29 @@
 package org.argeo.cms.swt;
 
+import java.net.URI;
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
+
 import org.argeo.api.cms.ux.Cms2DSize;
 import org.argeo.cms.ux.AbstractImageManager;
-import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.ImageData;
 import org.eclipse.swt.widgets.Control;
 import org.eclipse.swt.widgets.Label;
 
 /** Manages only public images so far. */
 public abstract class AbstractSwtImageManager<M> extends AbstractImageManager<Control, M> {
-       protected abstract Image getSwtImage(M node);
+       protected abstract ImageData getSwtImageData(M node);
 
        protected abstract String noImg(Cms2DSize size);
 
-       public Boolean load(M node, Control control, Cms2DSize preferredSize) {
+       @Override
+       public Boolean load(M node, Control control, Cms2DSize preferredSize, URI link) {
                Cms2DSize imageSize = getImageSize(node);
                Cms2DSize size;
                String imgTag = null;
-               if (preferredSize == null || imageSize.getWidth() == 0 || imageSize.getHeight() == 0
-                               || (preferredSize.getWidth() == 0 && preferredSize.getHeight() == 0)) {
-                       if (imageSize.getWidth() != 0 && imageSize.getHeight() != 0) {
+               if (preferredSize == null || imageSize.width() == 0 || imageSize.height() == 0
+                               || (preferredSize.width() == 0 && preferredSize.height() == 0)) {
+                       if (imageSize.width() != 0 && imageSize.height() != 0) {
                                // actual image size if completely known
                                size = imageSize;
                        } else {
@@ -27,15 +32,15 @@ public abstract class AbstractSwtImageManager<M> extends AbstractImageManager<Co
                                imgTag = noImg(size);
                        }
 
-               } else if (preferredSize.getWidth() != 0 && preferredSize.getHeight() != 0) {
+               } else if (preferredSize.width() != 0 && preferredSize.height() != 0) {
                        // given size if completely provided
                        size = preferredSize;
                } else {
                        // at this stage :
                        // image is completely known
-                       assert imageSize.getWidth() != 0 && imageSize.getHeight() != 0;
+                       assert imageSize.width() != 0 && imageSize.height() != 0;
                        // one and only one of the dimension as been specified
-                       assert preferredSize.getWidth() == 0 || preferredSize.getHeight() == 0;
+                       assert preferredSize.width() == 0 || preferredSize.height() == 0;
                        size = resizeTo(imageSize, preferredSize);
                }
 
@@ -55,6 +60,13 @@ public abstract class AbstractSwtImageManager<M> extends AbstractImageManager<Co
                        }
 
                        Label lbl = (Label) control;
+                       StringBuilder sb = new StringBuilder();
+                       if (link != null)
+                               sb.append("<a href='").append(URLEncoder.encode(link.toString(), StandardCharsets.UTF_8)).append("'>");
+                       sb.append(imgTag);
+                       if (link != null)
+                               sb.append("</a>");
+
                        lbl.setText(imgTag);
                        // lbl.setSize(size);
 //             } else if (control instanceof FileUpload) {
@@ -70,8 +82,8 @@ public abstract class AbstractSwtImageManager<M> extends AbstractImageManager<Co
 
        public Cms2DSize getImageSize(M node) {
                // TODO optimise
-               Image image = getSwtImage(node);
-               return new Cms2DSize(image.getBounds().width, image.getBounds().height);
+               ImageData imageData = getSwtImageData(node);
+               return new Cms2DSize(imageData.width, imageData.height);
        }
 
 }