Improve DocBook support.
authorMathieu Baudier <mbaudier@argeo.org>
Mon, 18 Jan 2021 08:31:28 +0000 (09:31 +0100)
committerMathieu Baudier <mbaudier@argeo.org>
Mon, 18 Jan 2021 08:31:28 +0000 (09:31 +0100)
publishing/org.argeo.publishing.ui/src/org/argeo/docbook/ui/AbstractDbkViewer.java
publishing/org.argeo.publishing.ui/src/org/argeo/docbook/ui/DbkUtils.java
publishing/org.argeo.publishing.ui/src/org/argeo/docbook/ui/DocBookSectionTitle.java
publishing/org.argeo.publishing.ui/src/org/argeo/docbook/ui/DocumentTextEditor.java

index 8a527793a3d47ade95684c5e73d092dc996e6919..245c15e54d25887b977fbad8665fb96b1f2e47ae 100644 (file)
@@ -16,7 +16,6 @@ import javax.jcr.nodetype.NodeType;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-import org.argeo.cms.CmsException;
 import org.argeo.cms.text.Paragraph;
 import org.argeo.cms.text.SectionTitle;
 import org.argeo.cms.text.TextInterpreter;
@@ -35,6 +34,7 @@ import org.argeo.cms.ui.widgets.EditableImage;
 import org.argeo.cms.ui.widgets.EditableText;
 import org.argeo.cms.ui.widgets.Img;
 import org.argeo.cms.ui.widgets.StyledControl;
+import org.argeo.jcr.JcrException;
 import org.argeo.jcr.JcrUtils;
 import org.eclipse.rap.fileupload.FileDetails;
 import org.eclipse.rap.fileupload.FileUploadEvent;
@@ -115,7 +115,7 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke
                                } else {
                                        sectionPart = newSectionPart(textSection, child);
                                        if (sectionPart == null)
-                                               throw new CmsException("Unsupported node " + child);
+                                               throw new IllegalArgumentException("Unsupported node " + child);
                                        // TODO list node types in exception
                                }
                                if (sectionPart instanceof Control)
@@ -135,7 +135,7 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke
                        for (Section s : section.getSubSections().values())
                                refresh(s);
                }
-               // section.layout();
+               // section.layout(true, true);
        }
 
        /** To be overridden in order to provide additional SectionPart types */
@@ -174,14 +174,26 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke
 
        protected DocBookSectionTitle newSectionTitle(TextSection parent, Node titleNode) throws RepositoryException {
                int style = parent.getStyle();
+               Composite titleParent = newSectionHeader(parent);
                if (parent.isTitleReadOnly())
                        style = style | SWT.READ_ONLY;
-               DocBookSectionTitle title = new DocBookSectionTitle(parent.getHeader(), style, titleNode);
+               DocBookSectionTitle title = new DocBookSectionTitle(titleParent, style, titleNode);
                updateContent(title);
                title.setMouseListener(getMouseListener());
                return title;
        }
 
+       /**
+        * To be overridden in order to provide additional processing at the section
+        * level.
+        * 
+        * @return the parent to use for the {@link DocBookSectionTitle}, by default
+        *         {@link Section#getHeader()}
+        */
+       protected Composite newSectionHeader(TextSection section) {
+               return section.getHeader();
+       }
+
        protected DocBookSectionTitle prepareSectionTitle(Section newSection, String titleText) throws RepositoryException {
                Node sectionNode = newSection.getNode();
                Node titleNode;
@@ -274,7 +286,7 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke
                                                currentParagraphN = newNode;
                                        }
                                }
-                               // TODO or rather return the created paragarphs?
+                               // TODO or rather return the created paragraphs?
                                layout(toLayout.toArray(new Control[toLayout.size()]));
                        }
                        persistChanges(et.getNode());
@@ -287,7 +299,7 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke
                } else if (part instanceof PropertyPart) {
                        saveLine(((PropertyPart) part).getProperty(), line);
                } else {
-                       throw new CmsException("Unsupported part " + part);
+                       throw new IllegalArgumentException("Unsupported part " + part);
                }
        }
 
@@ -325,7 +337,7 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke
                        updateContent(paragraph);
                        layout(paragraph);
                } catch (RepositoryException e1) {
-                       throw new CmsException("Cannot set style " + style + " on " + paragraph, e1);
+                       throw new JcrException("Cannot set style " + style + " on " + paragraph, e1);
                }
        }
 
@@ -340,7 +352,7 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke
                                ((Control) paragraph).dispose();
                        layout(section);
                } catch (RepositoryException e1) {
-                       throw new CmsException("Cannot delete " + paragraph, e1);
+                       throw new JcrException("Cannot delete " + paragraph, e1);
                }
        }
 
@@ -409,7 +421,7 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke
                                edit(paragraph, 0);
                        }
                } catch (RepositoryException e) {
-                       throw new CmsException("Cannot split " + getEdited(), e);
+                       throw new JcrException("Cannot split " + getEdited(), e);
                }
        }
 
@@ -432,7 +444,7 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke
                        Paragraph previousParagraph = paragraphMergedWithPrevious(paragraph, previousNode);
                        edit(previousParagraph, previousTxt.length());
                } catch (RepositoryException e) {
-                       throw new CmsException("Cannot stop editing", e);
+                       throw new JcrException("Cannot stop editing", e);
                }
        }
 
@@ -461,7 +473,7 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke
                        paragraphMergedWithNext(paragraph, removed);
                        edit(paragraph, txt.length());
                } catch (RepositoryException e) {
-                       throw new CmsException("Cannot stop editing", e);
+                       throw new JcrException("Cannot stop editing", e);
                }
        }
 
@@ -497,7 +509,7 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke
                                }
                        }
                } catch (RepositoryException e) {
-                       throw new CmsException("Cannot upload", e);
+                       throw new JcrException("Cannot upload", e);
                }
        }
 
@@ -572,7 +584,7 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke
                                persistChanges(previousSectionN);
                        }
                } catch (RepositoryException e) {
-                       throw new CmsException("Cannot deepen " + getEdited(), e);
+                       throw new JcrException("Cannot deepen " + getEdited(), e);
                }
        }
 
@@ -641,7 +653,7 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke
                                persistChanges(mergedNode);
                        }
                } catch (RepositoryException e) {
-                       throw new CmsException("Cannot undeepen " + getEdited(), e);
+                       throw new JcrException("Cannot undeepen " + getEdited(), e);
                }
        }
 
@@ -824,7 +836,7 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke
                }
 
                public void uploadFailed(FileUploadEvent event) {
-                       throw new CmsException("Upload failed " + event, event.getException());
+                       throw new RuntimeException("Upload failed " + event, event.getException());
                }
 
                public void uploadFinished(FileUploadEvent event) {
index ee675d26e5aa77428f63ee774aafca7bab3d0530..35a7132f78fd87a62f4f711d5ae0941dd0fd2b22 100644 (file)
@@ -1,8 +1,11 @@
 package org.argeo.docbook.ui;
 
 import javax.jcr.Node;
+import javax.jcr.NodeIterator;
 import javax.jcr.RepositoryException;
 
+import org.argeo.entity.EntityType;
+import org.argeo.jcr.Jcr;
 import org.argeo.jcr.JcrException;
 import org.argeo.jcr.JcrUtils;
 import org.argeo.jcr.JcrxApi;
@@ -22,6 +25,34 @@ public class DbkUtils {
                }
        }
 
+       public static Node getMetadata(Node infoContainer) {
+               try {
+                       if (!infoContainer.hasNode(DocBookTypes.INFO))
+                               return null;
+                       Node info = infoContainer.getNode(DocBookTypes.INFO);
+                       if (!info.hasNode(EntityType.local.get()))
+                               return null;
+                       return info.getNode(EntityType.local.get());
+               } catch (RepositoryException e) {
+                       throw new JcrException("Cannot retrieve metadata from " + infoContainer, e);
+               }
+       }
+
+       public static Node getChildByRole(Node parent, String role) {
+               try {
+                       NodeIterator baseSections = parent.getNodes();
+                       while (baseSections.hasNext()) {
+                               Node n = baseSections.nextNode();
+                               String r = Jcr.get(n, DocBookNames.DBK_ROLE);
+                               if (r != null && r.equals(role))
+                                       return n;
+                       }
+                       return null;
+               } catch (RepositoryException e) {
+                       throw new JcrException("Cannot get child from " + parent + " with role " + role, e);
+               }
+       }
+
        public static Node addParagraph(Node node, String txt) {
                try {
                        Node para = node.addNode(DocBookTypes.PARA, DocBookTypes.PARA);
index fcde87546d8e4265c51ad2047d775ac3b639f1b2..1ece09e9db99e31798b272dbbf72b322170c485d 100644 (file)
@@ -8,7 +8,10 @@ import org.argeo.cms.text.TextSection;
 import org.argeo.cms.ui.viewers.EditablePart;
 import org.argeo.cms.ui.viewers.NodePart;
 import org.argeo.cms.ui.widgets.EditableText;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
 
 /** The title of a section, based on an XML text node. */
 public class DocBookSectionTitle extends EditableText implements EditablePart, NodePart {
@@ -30,4 +33,16 @@ public class DocBookSectionTitle extends EditableText implements EditablePart, N
                return getNode();
        }
 
+//     @Override
+//     protected void setControlLayoutData(Control control) {
+//             super.setControlLayoutData(control);
+//             control.setLayoutData(new GridData(SWT.LEAD, SWT.CENTER, true, false));
+//     }
+//
+//     @Override
+//     protected void setContainerLayoutData(Composite composite) {
+//             super.setContainerLayoutData(composite);
+//             composite.setLayoutData(new GridData(SWT.LEAD, SWT.BOTTOM, true, false));
+//     }
+
 }
index aeafcd3466557014c529d84fd8a6494c51cdf1e8..bdd72d59aad819a845178509a6a8b815c2b64d97 100644 (file)
@@ -1,7 +1,6 @@
 package org.argeo.docbook.ui;
 
 import javax.jcr.Node;
-import javax.jcr.Property;
 import javax.jcr.RepositoryException;
 
 import org.argeo.cms.text.TextSection;
@@ -33,7 +32,7 @@ public class DocumentTextEditor extends AbstractDbkViewer {
 
        @Override
        protected Boolean isModelInitialized(Node textNode) throws RepositoryException {
-               return textNode.hasProperty(Property.JCR_TITLE) || textNode.hasNode(DocBookNames.DBK_PARA)
+               return textNode.hasNode(DocBookTypes.TITLE) || textNode.hasNode(DocBookNames.DBK_PARA)
                                || (!isFlat() && textNode.hasNode(DocBookNames.DBK_SECTION));
        }