From 5a7860bc756b6b8935d4486f3802663d57ae422a Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Sat, 7 May 2022 11:04:22 +0200 Subject: [PATCH] Adapt ot new third parties --- Makefile | 2 +- .../OSGI-INF/cmsTheme.xml | 2 +- org.argeo.app.theme.default/bnd.bnd | 5 + org.argeo.app.ui/bnd.bnd | 1 + .../argeo/app/ui/osgi/BundleSuiteTheme.java | 106 ++++++++++++++++++ sdk/argeo-build | 2 +- 6 files changed, 115 insertions(+), 3 deletions(-) create mode 100644 org.argeo.app.ui/src/org/argeo/app/ui/osgi/BundleSuiteTheme.java diff --git a/Makefile b/Makefile index 7a9417e..f93dc35 100644 --- a/Makefile +++ b/Makefile @@ -21,7 +21,7 @@ org.argeo.tp \ org.argeo.tp.apache \ org.argeo.tp.jetty \ org.argeo.tp.eclipse.equinox \ -org.argeo.tp.eclipse.rap \ +org.argeo.tp.eclipse.rwt \ org.argeo.tp.jcr \ org.argeo.tp.formats \ org.argeo.tp.gis \ diff --git a/org.argeo.app.theme.default/OSGI-INF/cmsTheme.xml b/org.argeo.app.theme.default/OSGI-INF/cmsTheme.xml index 1a4e589..dde85b0 100644 --- a/org.argeo.app.theme.default/OSGI-INF/cmsTheme.xml +++ b/org.argeo.app.theme.default/OSGI-INF/cmsTheme.xml @@ -1,6 +1,6 @@ - + diff --git a/org.argeo.app.theme.default/bnd.bnd b/org.argeo.app.theme.default/bnd.bnd index 45dc19e..dfaaa7a 100644 --- a/org.argeo.app.theme.default/bnd.bnd +++ b/org.argeo.app.theme.default/bnd.bnd @@ -1,7 +1,12 @@ Service-Component:\ OSGI-INF/cmsTheme.xml +Private-Package: * + +Export-Package: !* + Import-Package:\ +org.argeo.app.ui.osgi,\ org.argeo.cms.swt.osgi,\ javax.servlet.*;version="[3,5)",\ * \ No newline at end of file diff --git a/org.argeo.app.ui/bnd.bnd b/org.argeo.app.ui/bnd.bnd index e36f705..482a9ff 100644 --- a/org.argeo.app.ui/bnd.bnd +++ b/org.argeo.app.ui/bnd.bnd @@ -26,6 +26,7 @@ OSGI-INF/documentUiProvider.xml,\ Import-Package:\ +org.argeo.cms.osgi,\ org.argeo.cms.ui.widgets,\ org.eclipse.swt,\ org.osgi.framework,\ diff --git a/org.argeo.app.ui/src/org/argeo/app/ui/osgi/BundleSuiteTheme.java b/org.argeo.app.ui/src/org/argeo/app/ui/osgi/BundleSuiteTheme.java new file mode 100644 index 0000000..10a67c5 --- /dev/null +++ b/org.argeo.app.ui/src/org/argeo/app/ui/osgi/BundleSuiteTheme.java @@ -0,0 +1,106 @@ +package org.argeo.app.ui.osgi; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.lang.System.Logger; +import java.lang.System.Logger.Level; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +import org.apache.batik.transcoder.TranscoderException; +import org.apache.batik.transcoder.TranscoderInput; +import org.apache.batik.transcoder.TranscoderOutput; +import org.apache.batik.transcoder.image.ImageTranscoder; +import org.apache.batik.transcoder.image.PNGTranscoder; +import org.argeo.cms.swt.osgi.BundleCmsSwtTheme; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.graphics.ImageData; +import org.eclipse.swt.widgets.Display; +import org.osgi.framework.BundleContext; + +/** Theme which can dynamically create icons from SVG data. */ +public class BundleSuiteTheme extends BundleCmsSwtTheme { + private final static Logger logger = System.getLogger(BundleSuiteTheme.class.getName()); + + private Map> imageCache = Collections.synchronizedMap(new HashMap<>()); + + private Map transcoders = Collections.synchronizedMap(new HashMap<>()); + + @Override + public Image getIcon(String name, Integer preferredSize) { + String path = "icons/types/svg/" + name + ".svg"; + return createImageFromSvg(path, preferredSize); + } + + protected Image createImageFromSvg(String path, Integer preferredSize) { + Image image = null; + if (imageCache.containsKey(path)) { + image = imageCache.get(path).get(preferredSize); + } + if (image != null) + return image; + ImageData imageData = loadFromSvg(path, preferredSize); + image = new Image(Display.getDefault(), imageData); + if (!imageCache.containsKey(path)) + imageCache.put(path, Collections.synchronizedMap(new HashMap<>())); + imageCache.get(path).put(preferredSize, image); + return image; + } + + protected ImageData loadFromSvg(String path, int size) { + ImageTranscoder transcoder = null; + synchronized (this) { + transcoder = transcoders.get(size); + if (transcoder == null) { + transcoder = new PNGTranscoder(); + transcoder.addTranscodingHint(PNGTranscoder.KEY_WIDTH, (float) size); + transcoder.addTranscodingHint(PNGTranscoder.KEY_HEIGHT, (float) size); + transcoders.put(size, transcoder); + } + } + ImageData imageData; + try (InputStream in = getResourceAsStream(path); ByteArrayOutputStream out = new ByteArrayOutputStream();) { + if (in == null) + throw new IllegalArgumentException(path + " not found"); + TranscoderInput input = new TranscoderInput(in); + TranscoderOutput output = new TranscoderOutput(out); + transcoder.transcode(input, output); + try (InputStream imageIn = new ByteArrayInputStream(out.toByteArray())) { + imageData = new ImageData(imageIn); + } + logger.log(Level.DEBUG, () -> "Generated " + size + "x" + size + " PNG icon from " + path); + } catch (IOException | TranscoderException e) { + throw new RuntimeException("Cannot transcode SVG " + path, e); + } + + return imageData; + } + + @Override + public void init(BundleContext bundleContext, Map properties) { + super.init(bundleContext, properties); + + // preload all icons +// paths: for (String p : getImagesPaths()) { +// if (!p.endsWith(".svg")) +// continue paths; +// createImageFromSvg(p, getDefaultIconSize()); +// } + } + + @Override + public void destroy(BundleContext bundleContext, Map properties) { + Display display = Display.getDefault(); + if (display != null) + for (String path : imageCache.keySet()) { + for (Image image : imageCache.get(path).values()) { + display.syncExec(() -> image.dispose()); + } + } + super.destroy(bundleContext, properties); + } + +} diff --git a/sdk/argeo-build b/sdk/argeo-build index 90dfe68..2cb8a40 160000 --- a/sdk/argeo-build +++ b/sdk/argeo-build @@ -1 +1 @@ -Subproject commit 90dfe68dd0a8f9510939b2a276aed3d79e563bb2 +Subproject commit 2cb8a40febfe1b42ab2aebecbf6e0ec06b2c5e4d -- 2.30.2