Introduce display of DocBook videoobject.
[gpl/argeo-suite.git] / publishing / org.argeo.publishing.ui / src / org / argeo / docbook / ui / AbstractDbkViewer.java
index 814cfb3415e129dcdc28164e27ad72f03d7f78ed..8e18b3232b29782cfa570a967ec9b860a05bc928 100644 (file)
@@ -19,9 +19,6 @@ import javax.jcr.Session;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-import org.argeo.cms.text.Paragraph;
-import org.argeo.cms.text.TextInterpreter;
-import org.argeo.cms.text.TextSection;
 import org.argeo.cms.ui.CmsEditable;
 import org.argeo.cms.ui.util.CmsUiUtils;
 import org.argeo.cms.ui.viewers.AbstractPageViewer;
@@ -75,6 +72,7 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke
        private boolean showMainTitle = true;
 
        private Integer maxMediaWidth = null;
+       private String defaultSectionStyle;
 
        protected AbstractDbkViewer(Section parent, int style, CmsEditable cmsEditable) {
                super(parent, style, cmsEditable);
@@ -106,34 +104,56 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke
                        CmsUiUtils.clear(section);
                        Node node = section.getNode();
                        TextSection textSection = (TextSection) section;
+                       String style = node.hasProperty(DbkAttr.role.name()) ? node.getProperty(DbkAttr.role.name()).getString()
+                                       : getDefaultSectionStyle();
+                       if (style != null)
+                               CmsUiUtils.style(textSection, style);
+
+                       // Title
+                       Node titleNode = null;
+                       // We give priority to ./title vs ./info/title, like the DocBook XSL
                        if (node.hasNode(DbkType.title.get())) {
+                               titleNode = node.getNode(DbkType.title.get());
+                       } else if (node.hasNode(DbkType.info.get() + '/' + DbkType.title.get())) {
+                               titleNode = node.getNode(DbkType.info.get() + '/' + DbkType.title.get());
+                       }
+
+                       if (titleNode != null) {
                                boolean showTitle = getMainSection() == section ? showMainTitle : true;
                                if (showTitle) {
                                        if (section.getHeader() == null)
                                                section.createHeader();
-                                       Node titleNode = node.getNode(DbkType.title.get());
                                        DocBookSectionTitle title = newSectionTitle(textSection, titleNode);
                                        title.setLayoutData(CmsUiUtils.fillWidth());
                                        updateContent(title);
                                }
                        }
 
+                       // content
                        for (NodeIterator ni = node.getNodes(); ni.hasNext();) {
                                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)) {
+                                       // already managed
                                } else if (isDbk(child, para)) {
                                        sectionPart = newParagraph(textSection, child);
-                               } else {
+                               } else if (isDbk(child, DbkType.section)) {
                                        sectionPart = newSectionPart(textSection, child);
 //                                     if (sectionPart == null)
 //                                             throw new IllegalArgumentException("Unsupported node " + child);
                                        // TODO list node types in exception
+                               } else {
+                                       throw new IllegalArgumentException("Unsupported node type for " + child);
                                }
                                if (sectionPart != null && sectionPart instanceof Control)
                                        ((Control) sectionPart).setLayoutData(CmsUiUtils.fillWidth());
@@ -143,7 +163,7 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke
                        for (NodeIterator ni = section.getNode().getNodes(DbkType.section.get()); ni.hasNext();) {
                                Node child = ni.nextNode();
                                if (isDbk(child, DbkType.section)) {
-                                       TextSection newSection = new TextSection(section, SWT.NONE, child);
+                                       TextSection newSection = newTextSection(section, child);
                                        newSection.setLayoutData(CmsUiUtils.fillWidth());
                                        refresh(newSection);
                                }
@@ -155,6 +175,11 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke
                // section.layout(true, true);
        }
 
+       /** To be overridden in order to provide additional SectionPart types */
+       protected TextSection newTextSection(Section section, Node node) {
+               return new TextSection(section, SWT.NONE, node);
+       }
+
        /** To be overridden in order to provide additional SectionPart types */
        protected SectionPart newSectionPart(TextSection textSection, Node node) {
                return null;
@@ -191,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);
@@ -250,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;
@@ -258,7 +314,7 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke
                        if (title == getEdited())
                                title.setText(textInterpreter.read(title.getNode()));
                        else
-                               title.setText(textInterpreter.raw(title.getNode()));
+                               title.setText(textInterpreter.readSimpleHtml(title.getNode()));
                }
        }
 
@@ -946,6 +1002,14 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke
                this.showMainTitle = showMainTitle;
        }
 
+       public String getDefaultSectionStyle() {
+               return defaultSectionStyle;
+       }
+
+       public void setDefaultSectionStyle(String defaultSectionStyle) {
+               this.defaultSectionStyle = defaultSectionStyle;
+       }
+
        // FILE UPLOAD LISTENER
        private class FUL implements FileUploadListener {
                public void uploadProgress(FileUploadEvent event) {