Introduce display of DocBook videoobject.
authorMathieu Baudier <mbaudier@argeo.org>
Sat, 10 Jul 2021 07:49:27 +0000 (09:49 +0200)
committerMathieu Baudier <mbaudier@argeo.org>
Sat, 10 Jul 2021 07:49:27 +0000 (09:49 +0200)
publishing/org.argeo.publishing.ui/src/org/argeo/docbook/DbkType.java
publishing/org.argeo.publishing.ui/src/org/argeo/docbook/ui/AbstractDbkViewer.java
publishing/org.argeo.publishing.ui/src/org/argeo/docbook/ui/DbkImageManager.java
publishing/org.argeo.publishing.ui/src/org/argeo/docbook/ui/DbkVideo.java [new file with mode: 0644]

index 3a67d81363e1471c4b4af258cea5aa184595d2d1..cf3b293eb820b8a52e3d1a6a043434a76c442af3 100644 (file)
@@ -8,7 +8,7 @@ public enum DbkType implements JcrName {
        //
        info, title, para,
        //
        //
        info, title, para,
        //
-       mediaobject, imageobject, imagedata,
+       mediaobject, imageobject, imagedata, videoobject, videodata,
        //
        link,
        //
        //
        link,
        //
index f2fa79903b2e65a09e80f3984b77843480e220dd..8e18b3232b29782cfa570a967ec9b860a05bc928 100644 (file)
@@ -134,11 +134,13 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke
                                Node child = ni.nextNode();
                                SectionPart sectionPart = null;
                                if (isDbk(child, DbkType.mediaobject)) {
                                Node child = ni.nextNode();
                                SectionPart sectionPart = null;
                                if (isDbk(child, DbkType.mediaobject)) {
-                                       sectionPart = newImg(textSection, child);
-//                                     if (child.hasNode(DbkType.imageobject.get())) {
-//                                             Node imageDataNode = child.getNode(DbkType.imageobject.get()).getNode(DbkType.imagedata.get());
-//                                             sectionPart = newImg(textSection, imageDataNode);
-//                                     }
+                                       if (child.hasNode(DbkType.imageobject.get())) {
+                                               sectionPart = newImg(textSection, child);
+                                       } else if (child.hasNode(DbkType.videoobject.get())) {
+                                               sectionPart = newVideo(textSection, child);
+                                       } else {
+                                               throw new IllegalArgumentException("Unsupported media object " + child);
+                                       }
                                } else if (isDbk(child, DbkType.info)) {
                                        // TODO enrich UI based on info
                                } else if (isDbk(child, DbkType.title)) {
                                } else if (isDbk(child, DbkType.info)) {
                                        // TODO enrich UI based on info
                                } else if (isDbk(child, DbkType.title)) {
@@ -151,7 +153,7 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke
 //                                             throw new IllegalArgumentException("Unsupported node " + child);
                                        // TODO list node types in exception
                                } else {
 //                                             throw new IllegalArgumentException("Unsupported node " + child);
                                        // TODO list node types in exception
                                } else {
-                                       throw new IllegalArgumentException("Unsupported node type for "+child);
+                                       throw new IllegalArgumentException("Unsupported node type for " + child);
                                }
                                if (sectionPart != null && sectionPart instanceof Control)
                                        ((Control) sectionPart).setLayoutData(CmsUiUtils.fillWidth());
                                }
                                if (sectionPart != null && sectionPart instanceof Control)
                                        ((Control) sectionPart).setLayoutData(CmsUiUtils.fillWidth());
@@ -214,6 +216,34 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke
                }
        }
 
                }
        }
 
+       protected DbkVideo newVideo(TextSection parent, Node node) {
+               try {
+//                     node.getSession();
+//                     Composite wrapper = new Composite(parent, SWT.NONE);
+//                     new Label(wrapper,SWT.NONE).setText("TEST");
+                       DbkVideo video = new DbkVideo(parent, SWT.BORDER, node);
+                       GridData gd;
+                       if (maxMediaWidth != null) {
+                               gd = new GridData(SWT.CENTER, SWT.FILL, false, false);
+                               // TODO, manage size
+                               gd.widthHint = maxMediaWidth;
+                               gd.heightHint = (int) (gd.heightHint * 0.5625);
+//                             img.setPreferredSize(new Point(maxMediaWidth, 0));
+                       } else {
+                               gd = new GridData(SWT.CENTER, SWT.FILL, false, false);
+                               gd.widthHint = video.getWidth();
+                               gd.heightHint = video.getHeight();
+//                             gd = new GridData(video.getWidth(),video.getHeight());
+                       }
+//                     wrapper.setLayoutData(gd);
+                       video.setLayoutData(gd);
+                       updateContent(video);
+                       return null;
+               } catch (RepositoryException e) {
+                       throw new JcrException("Cannot add new image " + node, e);
+               }
+       }
+
        protected DocBookSectionTitle newSectionTitle(TextSection parent, Node titleNode) throws RepositoryException {
                int style = parent.getStyle();
                Composite titleParent = newSectionHeader(parent);
        protected DocBookSectionTitle newSectionTitle(TextSection parent, Node titleNode) throws RepositoryException {
                int style = parent.getStyle();
                Composite titleParent = newSectionHeader(parent);
@@ -273,6 +303,9 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke
                        } else if (part instanceof DbkImg) {
                                DbkImg editableImage = (DbkImg) part;
                                imageManager.load(partNode, part.getControl(), editableImage.getPreferredImageSize());
                        } else if (part instanceof DbkImg) {
                                DbkImg editableImage = (DbkImg) part;
                                imageManager.load(partNode, part.getControl(), editableImage.getPreferredImageSize());
+                       } else if (part instanceof DbkVideo) {
+                               DbkVideo video = (DbkVideo) part;
+                               video.load(part.getControl());
                        }
                } else if (part instanceof DocBookSectionTitle) {
                        DocBookSectionTitle title = (DocBookSectionTitle) part;
                        }
                } else if (part instanceof DocBookSectionTitle) {
                        DocBookSectionTitle title = (DocBookSectionTitle) part;
index 008ac76538d6f658b075b42473d4ea2a540d98b9..08b3db7454c78fa3ce76746d2c37cdae88a9df15 100644 (file)
@@ -114,6 +114,7 @@ public class DbkImageManager extends DefaultImageManager {
                        return null;
                URI fileUri;
                try {
                        return null;
                URI fileUri;
                try {
+                       // FIXME it messes up with the '/'
                        fileUri = new URI(URLEncoder.encode(fileref, StandardCharsets.UTF_8.toString()));
                } catch (URISyntaxException | UnsupportedEncodingException e) {
                        throw new IllegalArgumentException("File ref in " + imageDataNode + " is badly formatted", e);
                        fileUri = new URI(URLEncoder.encode(fileref, StandardCharsets.UTF_8.toString()));
                } catch (URISyntaxException | UnsupportedEncodingException e) {
                        throw new IllegalArgumentException("File ref in " + imageDataNode + " is badly formatted", e);
@@ -122,7 +123,7 @@ public class DbkImageManager extends DefaultImageManager {
                        return fileUri.toString();
                // local
                Node fileNode = getFileNode(imageDataNode);
                        return fileUri.toString();
                // local
                Node fileNode = getFileNode(imageDataNode);
-               String url = CmsUiUtils.getDataPath(fileNode);
+               String url = getCleanDataPath(fileNode);
                return url;
        }
 
                return url;
        }
 
diff --git a/publishing/org.argeo.publishing.ui/src/org/argeo/docbook/ui/DbkVideo.java b/publishing/org.argeo.publishing.ui/src/org/argeo/docbook/ui/DbkVideo.java
new file mode 100644 (file)
index 0000000..6ad7ba0
--- /dev/null
@@ -0,0 +1,105 @@
+package org.argeo.docbook.ui;
+
+import javax.jcr.Item;
+import javax.jcr.Node;
+import javax.jcr.PathNotFoundException;
+import javax.jcr.RepositoryException;
+import javax.jcr.ValueFormatException;
+
+import org.argeo.cms.ui.util.CmsUiUtils;
+import org.argeo.cms.ui.viewers.NodePart;
+import org.argeo.cms.ui.viewers.Section;
+import org.argeo.cms.ui.viewers.SectionPart;
+import org.argeo.cms.ui.widgets.StyledControl;
+import org.argeo.docbook.DbkAttr;
+import org.argeo.docbook.DbkType;
+import org.argeo.jcr.JcrException;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.browser.Browser;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+
+public class DbkVideo extends StyledControl implements SectionPart, NodePart {
+       private static final long serialVersionUID = -8753232181570351880L;
+       private Section section;
+
+       private int width = 640;
+       private int height = 360;
+
+       public DbkVideo(Composite parent, int style, Node node) {
+               this(Section.findSection(parent), parent, style, node);
+       }
+
+       DbkVideo(Section section, Composite parent, int style, Node node) {
+               super(parent, style, node);
+               this.section = section;
+               setStyle(DbkType.videoobject.name());
+       }
+
+       @Override
+       protected Control createControl(Composite box, String style) {
+               Browser browser = new Browser(box, SWT.NONE);
+               GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
+               gd.widthHint = getWidth();
+               gd.heightHint = getHeight();
+               browser.setLayoutData(gd);
+               return browser;
+       }
+
+       public void load(Control control) {
+               Browser browser = (Browser) control;
+               try {
+                       getNode().getSession();
+                       String src = getNode().getNode(DbkType.videoobject.get()).getNode(DbkType.videodata.get())
+                                       .getProperty(DbkAttr.fileref.name()).getString();
+                       // TODO manage self-hosted videos
+                       // TODO for YouTube videos, check whether the URL starts with
+                       // https://www.youtube.com/embed/ and not https://www.youtube.com/watch?v=
+                       StringBuilder html = new StringBuilder();
+                       html.append(
+                                       "<iframe frameborder=\"0\" allow=\"autoplay; fullscreen; picture-in-picture\" allowfullscreen=\"true\"");
+                       // TODO make size configurable
+                       html.append("width=\"").append(width).append("\" height=\"").append(height).append("\" ");
+                       html.append("src=\"").append(src).append("\" ");
+                       html.append("/>");
+                       browser.setText(html.toString());
+               } catch (RepositoryException e) {
+                       throw new JcrException("Cannot retrieve src for video " + getNode(), e);
+               }
+       }
+
+       @Override
+       protected void setContainerLayoutData(Composite composite) {
+               composite.setLayoutData(CmsUiUtils.fillAll());
+       }
+
+       @Override
+       protected void setControlLayoutData(Control control) {
+               control.setLayoutData(CmsUiUtils.fillAll());
+       }
+
+       @Override
+       public Item getItem() throws RepositoryException {
+               return getNode();
+       }
+
+       @Override
+       public String getPartId() {
+               return getNodeId();
+       }
+
+       @Override
+       public Section getSection() {
+               return section;
+       }
+
+       public int getWidth() {
+               return width;
+       }
+
+       public int getHeight() {
+               return height;
+       }
+
+}