Documentation: add an Xcos diagram to image exporter (bis) 18/9618/2
Clément DAVID [Wed, 7 Nov 2012 11:57:33 +0000 (12:57 +0100)]
Use a delegate to Xcos to avoid a static dependency.

Change-Id: I0d4e622bf98be3d384cc28422804df8712f91553

scilab/etc/classpath.xml.in
scilab/etc/classpath.xml.vc
scilab/modules/graph/src/java/org/scilab/modules/graph/ScilabComponent.java
scilab/modules/helptools/src/java/org/scilab/modules/helptools/HTMLDocbookTagConverter.java
scilab/modules/helptools/src/java/org/scilab/modules/helptools/image/ImageConverter.java
scilab/modules/helptools/src/java/org/scilab/modules/helptools/image/XcosImageConverter.java [new file with mode: 0644]
scilab/modules/xcos/help/en_US/palettes/Continuous_pal/DERIV.xml
scilab/modules/xcos/src/java/org/scilab/modules/xcos/Xcos.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/graph/swing/GraphComponent.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/utils/XcosDelegates.java [new file with mode: 0644]

index 2c58453..91bb147 100644 (file)
@@ -47,6 +47,7 @@ The option is "disableUnderMode" and can be:
 
 <path value="@JGRAPHX@" load="onUse">
        <load on="Xcos"/>
+       <load on="documentationGeneration"/>
 </path>
 
 <path value="@SCIRENDERER@" load="onUse">
@@ -69,10 +70,6 @@ The option is "disableUnderMode" and can be:
 
 <!-- Temp. loaded at startup -->
 <path value="$SCILAB/modules/types/jar/org.scilab.modules.types.jar"/>
-
-<path value="$SCILAB/modules/xcos/jar/org.scilab.modules.xcos.jar" load="onUse">
-       <load on="Xcos"/>
-</path>
 <!-- END -->
 
 <!-- Documentation (not mandatory) -->
@@ -172,6 +169,16 @@ The option is "disableUnderMode" and can be:
        <load on="SciNotes"/>
 </path>
 
+<!-- Xcos module -->
+<path value="$SCILAB/modules/xcos/jar/org.scilab.modules.xcos.jar" load="onUse">
+       <load on="Xcos"/>
+       <load on="documentationGeneration"/>
+</path>
+
+<path value="$SCILAB/modules/graph/jar/org.scilab.modules.graph.jar" load="onUse">
+       <load on="Xcos"/>
+       <load on="documentationGeneration"/>
+</path>
 
 <!-- TO DO Load only when we need -->
 <path value="$SCILAB/modules/graphic_objects/jar/org.scilab.modules.graphic_objects.jar"/>
@@ -180,9 +187,6 @@ The option is "disableUnderMode" and can be:
 <path value="$SCILAB/modules/ui_data/jar/org.scilab.modules.ui_data.jar"/>
 <path value="$SCILAB/modules/javasci/jar/org.scilab.modules.javasci.jar"/>
 
-<!-- TO DO Load only when we need -->
-<path value="$SCILAB/modules/graph/jar/org.scilab.modules.graph.jar"/>
-
 <path value="$SCILAB/modules/history_browser/jar/org.scilab.modules.history_browser.jar" disableUnderMode="NW"/>
 
 </classpaths>
index 61bd13b..dd73785 100644 (file)
@@ -47,6 +47,13 @@ The option is "disableUnderMode" and can be:
 
 <path value="$SCILAB/thirdparty/jgraphx.jar" load="onUse">
        <load on="Xcos"/>
+       <load on="documentationGeneration"/>
+</path>
+
+<path value="$SCILAB/thirdparty/scirenderer-1.0.2.jar" load="onUse">
+    <load on="graphics"/>
+    <load on="graphic_ojects"/>
+    <load on="Xcos"/>
 </path>
 
 <path value="$SCILAB/thirdparty/jogl2.jar" load="onUse">
@@ -61,18 +68,8 @@ The option is "disableUnderMode" and can be:
        <load on="Xcos"/>
 </path>
 
-<path value="$SCILAB/thirdparty/scirenderer-1.0.2.jar" load="onUse">
-    <load on="graphics"/>
-    <load on="graphic_ojects"/>
-    <load on="Xcos"/>
-</path>
-
 <!-- Temp. loaded at startup -->
 <path value="$SCILAB/modules/types/jar/org.scilab.modules.types.jar"/>
-
-<path value="$SCILAB/modules/xcos/jar/org.scilab.modules.xcos.jar" load="onUse">
-       <load on="Xcos"/>
-</path>
 <!-- END -->
 
 <!-- Documentation (not mandatory) -->
@@ -172,6 +169,16 @@ The option is "disableUnderMode" and can be:
        <load on="SciNotes"/>
 </path>
 
+<!-- Xcos module -->
+<path value="$SCILAB/modules/xcos/jar/org.scilab.modules.xcos.jar" load="onUse">
+       <load on="Xcos"/>
+       <load on="documentationGeneration"/>
+</path>
+
+<path value="$SCILAB/modules/graph/jar/org.scilab.modules.graph.jar" load="onUse">
+       <load on="Xcos"/>
+       <load on="documentationGeneration"/>
+</path>
 
 <!-- TO DO Load only when we need -->
 <path value="$SCILAB/modules/graphic_objects/jar/org.scilab.modules.graphic_objects.jar"/>
@@ -180,9 +187,6 @@ The option is "disableUnderMode" and can be:
 <path value="$SCILAB/modules/ui_data/jar/org.scilab.modules.ui_data.jar"/>
 <path value="$SCILAB/modules/javasci/jar/org.scilab.modules.javasci.jar"/>
 
-    <!-- TO DO Load only when we need -->
-<path value="$SCILAB/modules/graph/jar/org.scilab.modules.graph.jar"/>
-
 <path value="$SCILAB/modules/history_browser/jar/org.scilab.modules.history_browser.jar" disableUnderMode="NW"/>
 
 </classpaths>
index 6d7bab0..9731e92 100644 (file)
@@ -15,6 +15,7 @@ package org.scilab.modules.graph;
 import java.awt.Color;
 import java.awt.Dimension;
 import java.awt.Graphics;
+import java.awt.GraphicsEnvironment;
 import java.awt.Rectangle;
 
 import com.mxgraph.model.mxICell;
@@ -197,6 +198,7 @@ public class ScilabComponent extends mxGraphComponent {
 
             // Paint the foreground color after the real paint
             addListener(mxEvent.AFTER_PAINT, new mxEventSource.mxIEventListener() {
+                @Override
                 public void invoke(Object sender, mxEventObject evt) {
 
                     Graphics g = (Graphics) evt.getProperty("g");
@@ -211,4 +213,17 @@ public class ScilabComponent extends mxGraphComponent {
             });
         }
     }
+
+    /*
+     * Disable some handlers in case of an headless env.
+     */
+
+    @Override
+    protected void createHandlers() {
+        if (GraphicsEnvironment.isHeadless()) {
+            return;
+        }
+
+        super.createHandlers();
+    }
 }
index 23d88d4..4a0dda6 100644 (file)
@@ -28,6 +28,7 @@ import org.scilab.modules.helptools.image.LaTeXImageConverter;
 import org.scilab.modules.helptools.image.MathMLImageConverter;
 import org.scilab.modules.helptools.image.ScilabImageConverter;
 import org.scilab.modules.helptools.image.SVGImageConverter;
+import org.scilab.modules.helptools.image.XcosImageConverter;
 import org.scilab.modules.helptools.scilab.ScilabLexer;
 import org.scilab.modules.helptools.scilab.HTMLScilabCodeHandler;
 import org.scilab.modules.helptools.scilab.AbstractScilabCodeHandler;
@@ -160,6 +161,7 @@ public class HTMLDocbookTagConverter extends DocbookTagConverter implements Temp
         ImageConverter.registerExternalImageConverter(MathMLImageConverter.getInstance(type));
         ImageConverter.registerExternalImageConverter(SVGImageConverter.getInstance(type));
         ImageConverter.registerExternalImageConverter(ScilabImageConverter.getInstance(type));
+        ImageConverter.registerExternalImageConverter(XcosImageConverter.getInstance(type));
     }
 
     /**
index 477f7d5..db0e132 100644 (file)
@@ -47,6 +47,7 @@ public final class ImageConverter {
         mimeMap.addMimeTypes("type=image/mathml exts=mml,mathml");
         mimeMap.addMimeTypes("type=image/svg exts=svg");
         mimeMap.addMimeTypes("type=image/scilab exts=sce");
+        mimeMap.addMimeTypes("type=image/scilab-xcos exts=xcos,zcos");
     }
 
     /**
diff --git a/scilab/modules/helptools/src/java/org/scilab/modules/helptools/image/XcosImageConverter.java b/scilab/modules/helptools/src/java/org/scilab/modules/helptools/image/XcosImageConverter.java
new file mode 100644 (file)
index 0000000..b3ed383
--- /dev/null
@@ -0,0 +1,112 @@
+/*
+ * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C) 2012 - Scilab Enterprises - Clément David
+ *
+ * This file must be used under the terms of the CeCILL.
+ * This source file is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution.  The terms
+ * are also available at
+ * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
+ *
+ */
+
+package org.scilab.modules.helptools.image;
+
+import java.io.File;
+import java.lang.reflect.Method;
+import java.util.Map;
+
+import org.scilab.modules.helptools.HTMLDocbookTagConverter;
+
+/**
+ * Xcos schema to PNG converter
+ */
+public class XcosImageConverter implements ExternalImageConverter {
+
+    private static XcosImageConverter instance;
+    private final HTMLDocbookTagConverter.GenerationType type;
+
+    private XcosImageConverter(HTMLDocbookTagConverter.GenerationType type) {
+        this.type = type;
+    }
+
+    @Override
+    public String getMimeType() {
+        return "image/scilab-xcos";
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public boolean mustRegenerate() {
+        return false;
+    }
+
+    /**
+     * Since this a singleton class...
+     *
+     * @return this
+     */
+    public static XcosImageConverter getInstance(HTMLDocbookTagConverter.GenerationType type) {
+        if (instance == null) {
+            instance = new XcosImageConverter(type);
+        }
+
+        return instance;
+    }
+
+    public static XcosImageConverter getInstance() {
+        return instance;
+    }
+
+    /**
+     * {@inheritDoc}
+     *
+     * Redirect to the scilab code implementation.
+     */
+    @Override
+    public String convertToImage(String currentFile, String code, Map<String, String> attributes, File imageFile, String imageName) {
+        return ScilabImageConverter.getInstance().convertToImage(currentFile, code, attributes, imageFile, imageName);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String convertToImage(File schema, Map<String, String> attributes, File imageFile, String imageName) {
+        try {
+            final String name = schema.getName();
+            return convertToPNG(name, schema.getAbsolutePath(), imageFile, imageName);
+        } catch (Exception e) {
+            e.printStackTrace();
+            System.err.printf("Problem when exporting Xcos schema %s !\n%s\n", schema, e.toString());
+        }
+
+        return null;
+    }
+
+    private final String convertToPNG(final String helpID, final String xcosFile, final File imageFile, final String imageName) throws Exception {
+        /*
+         * use a delegate method to avoid a static dependency
+         */
+        final Class<?> export = Class.forName("org.scilab.modules.xcos.utils.XcosDelegates");
+        final Method convertToPNG = export.getDeclaredMethod("convertToPNG", String.class, String.class, File.class, String.class);
+        convertToPNG.invoke(null, helpID, xcosFile, imageFile, imageName);
+
+        return getHTMLCodeToReturn(helpID, "<img src=\'" + imageName + "\'/>");
+    }
+
+    public String getHTMLCodeToReturn(String filename, String imageTag) {
+        if (type == HTMLDocbookTagConverter.GenerationType.WEB) {
+            /* Provide a tooltip */
+            return "<div rel='tooltip' title='" + filename + "'>" + imageTag + "</div>";
+        } else {
+            /*
+             * No tooltip in the javahelp browser ... too limited html
+             * capabilities
+             */
+            return imageTag;
+        }
+    }
+}
index f84a398..9142e21 100644 (file)
                     <imagedata align="center" fileref="../../../examples/derivative_diag.png" valign="middle"/>
                 </imageobject>
             </inlinemediaobject>
+<scilab:image><![CDATA[
+importXcosDiagram(SCI + "/modules/xcos/examples/continuous_pal/DERIV_Example.xcos");
+xcos_simulate(scs_m, 4);
+]]></scilab:image>
         </para>
     </refsection>
     <refsection id="Interfacingfunction_DERIV">
index 8113916..abf4743 100644 (file)
@@ -14,7 +14,6 @@
 package org.scilab.modules.xcos;
 
 import java.awt.Component;
-import java.awt.GraphicsEnvironment;
 import java.io.File;
 import java.io.IOException;
 import java.lang.reflect.InvocationTargetException;
@@ -103,7 +102,6 @@ public final class Xcos {
     private static final List<String> MXGRAPH_VERSIONS = null;
     private static final List<String> BATIK_VERSIONS = Arrays.asList("1.7", "1.8pre", "1.8");
 
-    private static final String IS_HEADLESS = Messages.gettext("a graphical environment is needed.");
     private static final String UNABLE_TO_LOAD_JGRAPHX = Messages.gettext("Unable to load the jgraphx library.\nExpecting version %s ; Getting version %s .");
     private static final String UNABLE_TO_LOAD_BATIK = Messages.gettext("Unable to load the Batik library. \nExpecting version %s ; Getting version %s .");
 
@@ -208,11 +206,6 @@ public final class Xcos {
     private void checkDependencies() {
         final ClassLoader loader = ClassLoader.getSystemClassLoader();
 
-        /* Check not headless */
-        if (GraphicsEnvironment.isHeadless()) {
-            throw new RuntimeException(IS_HEADLESS);
-        }
-
         /* JGraphx */
         String mxGraphVersion = "";
         try {
index bcadd5b..0bb969c 100644 (file)
@@ -12,6 +12,7 @@
 
 package org.scilab.modules.xcos.graph.swing;
 
+import java.awt.GraphicsEnvironment;
 import java.awt.MouseInfo;
 
 import org.scilab.modules.graph.ScilabComponent;
@@ -72,6 +73,10 @@ public class GraphComponent extends ScilabComponent {
      */
     @Override
     protected mxGraphHandler createGraphHandler() {
+        if (GraphicsEnvironment.isHeadless()) {
+            return null;
+        }
+
         return new GraphHandler(this);
     }
 
diff --git a/scilab/modules/xcos/src/java/org/scilab/modules/xcos/utils/XcosDelegates.java b/scilab/modules/xcos/src/java/org/scilab/modules/xcos/utils/XcosDelegates.java
new file mode 100644 (file)
index 0000000..7887bb8
--- /dev/null
@@ -0,0 +1,59 @@
+/*
+ * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C) 2012 - Scilab Enterprises - Clement David
+ *
+ * This file must be used under the terms of the CeCILL.
+ * This source file is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution.  The terms
+ * are also available at
+ * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
+ *
+ */
+
+package org.scilab.modules.xcos.utils;
+
+import java.awt.image.BufferedImage;
+import java.io.File;
+
+import javax.imageio.ImageIO;
+
+import org.scilab.modules.helptools.image.XcosImageConverter;
+import org.scilab.modules.xcos.graph.XcosDiagram;
+import org.scilab.modules.xcos.io.XcosFileType;
+
+import com.mxgraph.swing.mxGraphComponent;
+import com.mxgraph.util.mxCellRenderer;
+
+/**
+ * Class which contains all Xcos dependant function used by other modules.
+ */
+public class XcosDelegates {
+
+    private XcosDelegates() {
+        // static singleton
+    }
+
+    /**
+     * Delegate method to avoid a strong dependency on helptools.
+     *
+     * @param helpID
+     * @param xcosFile
+     * @param imageFile
+     * @param imageName
+     * @throws Exception
+     *
+     * @see {@link XcosImageConverter}
+     */
+    public static final void convertToPNG(final String helpID, final String xcosFile, final File imageFile, final String imageName) throws Exception {
+        final XcosDiagram diag = new XcosDiagram();
+        diag.installListeners();
+
+        final XcosFileType filetype = XcosFileType.findFileType(xcosFile);
+        filetype.load(xcosFile, diag);
+
+        final mxGraphComponent graphComponent = diag.getAsComponent();
+
+        final BufferedImage image = mxCellRenderer.createBufferedImage(diag, null, 1, null, graphComponent.isAntiAlias(), null, graphComponent.getCanvas());
+        ImageIO.write(image, "png", imageFile);
+    }
+}