Export DocBook to file system.
[gpl/argeo-suite.git] / publishing / org.argeo.publishing.ui / src / org / argeo / docbook / ui / AbstractDbkViewer.java
index 5896d18107e310938a5112ee3aac514a78a33995..6b0692f6f80c52735b30c1a6647ded04ea0ce876 100644 (file)
@@ -1,14 +1,10 @@
 package org.argeo.docbook.ui;
 
 import static org.argeo.cms.ui.util.CmsUiUtils.fillWidth;
+import static org.argeo.docbook.DbkType.para;
 import static org.argeo.docbook.DbkUtils.addDbk;
 import static org.argeo.docbook.DbkUtils.isDbk;
-import static org.argeo.docbook.DocBookType.para;
 
-import java.io.IOException;
-import java.io.OutputStream;
-import java.nio.file.Files;
-import java.nio.file.Path;
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
@@ -36,9 +32,9 @@ import org.argeo.cms.ui.viewers.Section;
 import org.argeo.cms.ui.viewers.SectionPart;
 import org.argeo.cms.ui.widgets.EditableText;
 import org.argeo.cms.ui.widgets.StyledControl;
+import org.argeo.docbook.DbkAttr;
+import org.argeo.docbook.DbkType;
 import org.argeo.docbook.DbkUtils;
-import org.argeo.docbook.DocBookNames;
-import org.argeo.docbook.DocBookType;
 import org.argeo.jcr.Jcr;
 import org.argeo.jcr.JcrException;
 import org.argeo.jcr.JcrUtils;
@@ -54,8 +50,10 @@ import org.eclipse.swt.events.MouseAdapter;
 import org.eclipse.swt.events.MouseEvent;
 import org.eclipse.swt.events.MouseListener;
 import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
 import org.eclipse.swt.widgets.Text;
 
 /** Base class for text viewers and editors. */
@@ -103,10 +101,10 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke
                        CmsUiUtils.clear(section);
                        Node node = section.getNode();
                        TextSection textSection = (TextSection) section;
-                       if (node.hasNode(DocBookType.title.get())) {
+                       if (node.hasNode(DbkType.title.get())) {
                                if (section.getHeader() == null)
                                        section.createHeader();
-                               Node titleNode = node.getNode(DocBookType.title.get());
+                               Node titleNode = node.getNode(DbkType.title.get());
                                DocBookSectionTitle title = newSectionTitle(textSection, titleNode);
                                title.setLayoutData(CmsUiUtils.fillWidth());
                                updateContent(title);
@@ -115,10 +113,9 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke
                        for (NodeIterator ni = node.getNodes(); ni.hasNext();) {
                                Node child = ni.nextNode();
                                SectionPart sectionPart = null;
-                               if (isDbk(child, DocBookType.mediaobject)) {
-                                       if (child.hasNode(DocBookType.imageobject.get())) {
-                                               Node imageDataNode = child.getNode(DocBookType.imageobject.get())
-                                                               .getNode(DocBookType.imagedata.get());
+                               if (isDbk(child, DbkType.mediaobject)) {
+                                       if (child.hasNode(DbkType.imageobject.get())) {
+                                               Node imageDataNode = child.getNode(DbkType.imageobject.get()).getNode(DbkType.imagedata.get());
                                                sectionPart = newImg(textSection, imageDataNode);
                                        }
                                } else if (isDbk(child, para)) {
@@ -134,9 +131,9 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke
                        }
 
 //                     if (!flat)
-                       for (NodeIterator ni = section.getNode().getNodes(DocBookType.section.get()); ni.hasNext();) {
+                       for (NodeIterator ni = section.getNode().getNodes(DbkType.section.get()); ni.hasNext();) {
                                Node child = ni.nextNode();
-                               if (isDbk(child, DocBookType.section)) {
+                               if (isDbk(child, DbkType.section)) {
                                        TextSection newSection = new TextSection(section, SWT.NONE, child);
                                        newSection.setLayoutData(CmsUiUtils.fillWidth());
                                        refresh(newSection);
@@ -199,7 +196,7 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke
 
        protected DocBookSectionTitle prepareSectionTitle(Section newSection, String titleText) throws RepositoryException {
                Node sectionNode = newSection.getNode();
-               Node titleNode = DbkUtils.getOrAddDbk(sectionNode, DocBookType.title);
+               Node titleNode = DbkUtils.getOrAddDbk(sectionNode, DbkType.title);
                getTextInterpreter().write(titleNode, titleText);
                if (newSection.getHeader() == null)
                        newSection.createHeader();
@@ -216,8 +213,8 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke
                                TextSection section = (TextSection) sectionPart.getSection();
                                StyledControl styledControl = (StyledControl) part;
                                if (isDbk(partNode, para)) {
-                                       String style = partNode.hasProperty(DocBookNames.DBK_ROLE)
-                                                       ? partNode.getProperty(DocBookNames.DBK_ROLE).getString()
+                                       String style = partNode.hasProperty(DbkAttr.role.name())
+                                                       ? partNode.getProperty(DbkAttr.role.name()).getString()
                                                        : section.getDefaultTextStyle();
                                        styledControl.setStyle(style);
                                }
@@ -316,7 +313,18 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke
                                if (caretPosition instanceof Integer)
                                        text.setSelection((Integer) caretPosition);
                                else if (caretPosition instanceof Point) {
-                                       // TODO find a way to position the caret at the right place
+//                                     layout(text);
+//                                     // TODO find a way to position the caret at the right place
+//                                     Point clickLocation = (Point) caretPosition;
+//                                     Point withinText = text.toControl(clickLocation);
+//                                     Rectangle bounds = text.getBounds();
+//                                     int width = bounds.width;
+//                                     int height = bounds.height;
+//                                     int textLength = text.getText().length();
+//                                     float area = width * height;
+//                                     float proportion = withinText.y * width + withinText.x;
+//                                     int pos = (int) (textLength * (proportion / area));
+//                                     text.setSelection(pos);
                                }
                        text.setData(RWT.ACTIVE_KEYS, new String[] { "BACKSPACE", "ESC", "TAB", "SHIFT+TAB", "ALT+ARROW_LEFT",
                                        "ALT+ARROW_RIGHT", "ALT+ARROW_UP", "ALT+ARROW_DOWN", "RETURN", "CTRL+RETURN", "ENTER", "DELETE" });
@@ -332,10 +340,10 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke
                try {
                        Node paragraphNode = paragraph.getNode();
                        if (style == null) {// default
-                               if (paragraphNode.hasProperty(DocBookNames.DBK_ROLE))
-                                       paragraphNode.getProperty(DocBookNames.DBK_ROLE).remove();
+                               if (paragraphNode.hasProperty(DbkAttr.role.name()))
+                                       paragraphNode.getProperty(DbkAttr.role.name()).remove();
                        } else {
-                               paragraphNode.setProperty(DocBookNames.DBK_ROLE, style);
+                               paragraphNode.setProperty(DbkAttr.role.name(), style);
                        }
                        persistChanges(paragraphNode);
                        updateContent(paragraph);
@@ -361,7 +369,7 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke
                        if (sectionPart instanceof DbkImg) {
                                // FIXME make it more robust
                                node = node.getParent().getParent();
-                               if (!isDbk(node, DocBookType.mediaobject))
+                               if (!isDbk(node, DbkType.mediaobject))
                                        throw new IllegalArgumentException("Node " + node + " is not a media object.");
                        }
                        node.remove();
@@ -443,7 +451,7 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke
                                // paragraphNode.addMixin(CmsTypes.CMS_STYLED);
 
                                textInterpreter.write(paragraphNode, txt.substring(caretPosition));
-                               textInterpreter.write(sectionNode.getNode(DocBookType.title.get()), txt.substring(0, caretPosition));
+                               textInterpreter.write(sectionNode.getNode(DbkType.title.get()), txt.substring(0, caretPosition));
                                sectionNode.orderBefore(p(paragraphNode.getIndex()), p(1));
                                persistChanges(sectionNode);
 
@@ -487,7 +495,7 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke
                        String txt = text.getText();
                        Node paragraphNode = paragraph.getNode();
                        Node sectionNode = paragraphNode.getParent();
-                       NodeIterator paragraphNodes = sectionNode.getNodes(DocBookType.para.get());
+                       NodeIterator paragraphNodes = sectionNode.getNodes(DbkType.para.get());
                        long size = paragraphNodes.getSize();
                        if (paragraphNode.getIndex() == size)
                                return;// do nothing
@@ -558,12 +566,12 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke
                                Node sectionNode = section.getNode();
                                // main title
                                if (section == mainSection && section instanceof TextSection && paragraphNode.getIndex() == 1
-                                               && !sectionNode.hasNode(DocBookType.title.get())) {
+                                               && !sectionNode.hasNode(DbkType.title.get())) {
                                        DocBookSectionTitle sectionTitle = prepareSectionTitle(section, txt);
                                        edit(sectionTitle, 0);
                                        return;
                                }
-                               Node newSectionNode = addDbk(sectionNode, DocBookType.section);
+                               Node newSectionNode = addDbk(sectionNode, DbkType.section);
                                // newSectionNode.addMixin(NodeType.MIX_TITLE);
                                sectionNode.orderBefore(h(newSectionNode.getIndex()), h(1));
 
@@ -573,13 +581,13 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke
                                while (sectionNode.hasNode(p(paragraphIndex + 1))) {
                                        Node parag = sectionNode.getNode(p(paragraphIndex + 1));
                                        sectionNode.getSession().move(sectionPath + '/' + p(paragraphIndex + 1),
-                                                       newSectionPath + '/' + DocBookType.para.get());
+                                                       newSectionPath + '/' + DbkType.para.get());
                                        SectionPart sp = section.getSectionPart(parag.getIdentifier());
                                        if (sp instanceof Control)
                                                ((Control) sp).dispose();
                                }
                                // create title
-                               Node titleNode = DbkUtils.addDbk(newSectionNode, DocBookType.title);
+                               Node titleNode = DbkUtils.addDbk(newSectionNode, DbkType.title);
                                // newSectionNode.addNode(DocBookType.TITLE, DocBookType.TITLE);
                                getTextInterpreter().write(titleNode, txt);
 
@@ -606,7 +614,7 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke
                                if (sectionN.getIndex() == 1)
                                        return;// cannot deepen first section
                                Node previousSectionN = parentSectionN.getNode(h(sectionN.getIndex() - 1));
-                               NodeIterator subSections = previousSectionN.getNodes(DocBookType.section.get());
+                               NodeIterator subSections = previousSectionN.getNodes(DbkType.section.get());
                                int subsectionsCount = (int) subSections.getSize();
                                previousSectionN.getSession().move(sectionN.getPath(),
                                                previousSectionN.getPath() + "/" + h(subsectionsCount + 1));
@@ -645,14 +653,14 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke
                                        mergedSection = lst.get(sectionNode.getIndex() - 1);
                                }
                                Node mergedNode = mergedSection.getNode();
-                               boolean mergedHasSubSections = mergedNode.hasNode(DocBookType.section.get());
+                               boolean mergedHasSubSections = mergedNode.hasNode(DbkType.section.get());
 
                                // title as paragraph
                                Node newParagrapheNode = addDbk(mergedNode, para);
                                // newParagrapheNode.addMixin(CmsTypes.CMS_STYLED);
                                if (mergedHasSubSections)
                                        mergedNode.orderBefore(p(newParagrapheNode.getIndex()), h(1));
-                               String txt = getTextInterpreter().read(sectionNode.getNode(DocBookType.title.get()));
+                               String txt = getTextInterpreter().read(sectionNode.getNode(DbkType.title.get()));
                                getTextInterpreter().write(newParagrapheNode, txt);
                                // move
                                NodeIterator paragraphs = sectionNode.getNodes(para.get());
@@ -671,7 +679,7 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke
                                while (subsections.hasNext()) {
                                        Section subsection = subsections.next();
                                        Node s = subsection.getNode();
-                                       mergedNode.getSession().move(s.getPath(), mergedNode.getPath() + '/' + DocBookType.section.get());
+                                       mergedNode.getSession().move(s.getPath(), mergedNode.getPath() + '/' + DbkType.section.get());
                                        subsection.dispose();
                                }
 
@@ -735,7 +743,7 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke
 
        protected String h(Integer index) {
                StringBuilder sb = new StringBuilder(5);
-               sb.append(DocBookType.section.get()).append('[').append(index).append(']');
+               sb.append(DbkType.section.get()).append('[').append(index).append(']');
                return sb.toString();
        }
 
@@ -844,8 +852,22 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke
                                                        getCmsEditable().startEditing();
                                                }
                                        }
-                               } else
+                               } else if (source instanceof Label) {
+                                       Label lbl = (Label) source;
+                                       Rectangle bounds = lbl.getBounds();
+                                       float width = bounds.width;
+                                       float height = bounds.height;
+                                       float textLength = lbl.getText().length();
+                                       float area = width * height;
+                                       float charArea = area/textLength;
+                                       float lines = textLength/width;
+                                       float proportion = point.y * width + point.x;
+                                       int pos = (int) (textLength * (proportion / area));
+                                       // TODO refine it
+                                       edit(composite, (Integer) pos);
+                               } else {
                                        edit(composite, source.toDisplay(point));
+                               }
                        }
                }
 
@@ -871,29 +893,6 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke
                return new ArrayList<>();
        }
 
-       public void export(Path directory, String fileName) {
-               Path filePath = directory.resolve(fileName);
-               try {
-                       Files.createDirectories(directory);
-                       try (OutputStream out = Files.newOutputStream(filePath)) {
-                               exportXml(out);
-                       }
-                       if (log.isDebugEnabled())
-                               log.debug("DocBook " + getMainSection().getNode() + " exported to " + filePath.toAbsolutePath());
-               } catch (IOException e) {
-                       throw new RuntimeException(e);
-               }
-       }
-
-       public void exportXml(OutputStream out) throws IOException {
-               Node node = getMainSection().getNode();
-               try {
-                       node.getSession().exportDocumentView(node.getPath(), out, false, false);
-               } catch (RepositoryException e) {
-                       throw new JcrException("Cannot export " + node + " to XML", e);
-               }
-       }
-
        // FILE UPLOAD LISTENER
        private class FUL implements FileUploadListener {
                public void uploadProgress(FileUploadEvent event) {