From d3a20494b99046cd9f67491064333ba56fbe5772 Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Sat, 10 Jul 2021 09:49:27 +0200 Subject: [PATCH] Introduce display of DocBook videoobject. --- .../src/org/argeo/docbook/DbkType.java | 2 +- .../argeo/docbook/ui/AbstractDbkViewer.java | 45 +++++++- .../org/argeo/docbook/ui/DbkImageManager.java | 3 +- .../src/org/argeo/docbook/ui/DbkVideo.java | 105 ++++++++++++++++++ 4 files changed, 147 insertions(+), 8 deletions(-) create mode 100644 publishing/org.argeo.publishing.ui/src/org/argeo/docbook/ui/DbkVideo.java diff --git a/publishing/org.argeo.publishing.ui/src/org/argeo/docbook/DbkType.java b/publishing/org.argeo.publishing.ui/src/org/argeo/docbook/DbkType.java index 3a67d81..cf3b293 100644 --- a/publishing/org.argeo.publishing.ui/src/org/argeo/docbook/DbkType.java +++ b/publishing/org.argeo.publishing.ui/src/org/argeo/docbook/DbkType.java @@ -8,7 +8,7 @@ public enum DbkType implements JcrName { // info, title, para, // - mediaobject, imageobject, imagedata, + mediaobject, imageobject, imagedata, videoobject, videodata, // link, // diff --git a/publishing/org.argeo.publishing.ui/src/org/argeo/docbook/ui/AbstractDbkViewer.java b/publishing/org.argeo.publishing.ui/src/org/argeo/docbook/ui/AbstractDbkViewer.java index f2fa799..8e18b32 100644 --- a/publishing/org.argeo.publishing.ui/src/org/argeo/docbook/ui/AbstractDbkViewer.java +++ b/publishing/org.argeo.publishing.ui/src/org/argeo/docbook/ui/AbstractDbkViewer.java @@ -134,11 +134,13 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke 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)) { @@ -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 type for "+child); + throw new IllegalArgumentException("Unsupported node type for " + child); } 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); @@ -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 DbkVideo) { + DbkVideo video = (DbkVideo) part; + video.load(part.getControl()); } } else if (part instanceof DocBookSectionTitle) { DocBookSectionTitle title = (DocBookSectionTitle) part; diff --git a/publishing/org.argeo.publishing.ui/src/org/argeo/docbook/ui/DbkImageManager.java b/publishing/org.argeo.publishing.ui/src/org/argeo/docbook/ui/DbkImageManager.java index 008ac76..08b3db7 100644 --- a/publishing/org.argeo.publishing.ui/src/org/argeo/docbook/ui/DbkImageManager.java +++ b/publishing/org.argeo.publishing.ui/src/org/argeo/docbook/ui/DbkImageManager.java @@ -114,6 +114,7 @@ public class DbkImageManager extends DefaultImageManager { 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); @@ -122,7 +123,7 @@ public class DbkImageManager extends DefaultImageManager { return fileUri.toString(); // local Node fileNode = getFileNode(imageDataNode); - String url = CmsUiUtils.getDataPath(fileNode); + String url = getCleanDataPath(fileNode); 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 index 0000000..6ad7ba0 --- /dev/null +++ b/publishing/org.argeo.publishing.ui/src/org/argeo/docbook/ui/DbkVideo.java @@ -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( + "