Style setter for DocBook.
[gpl/argeo-suite.git] / publishing / org.argeo.publishing.ui / src / org / argeo / docbook / ui / AbstractDbkViewer.java
index 39ae080152dfc0ca5c58ed621b486b512553ba9b..1b8a237cfcadc14c1642d84cb6661a4e132c5f72 100644 (file)
@@ -1,24 +1,22 @@
 package org.argeo.docbook.ui;
 
-import static javax.jcr.Property.JCR_TITLE;
 import static org.argeo.cms.ui.util.CmsUiUtils.fillWidth;
 
 import java.util.ArrayList;
 import java.util.Iterator;
+import java.util.List;
 import java.util.Map;
 import java.util.Observer;
 
 import javax.jcr.Item;
 import javax.jcr.Node;
 import javax.jcr.NodeIterator;
-import javax.jcr.Property;
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
 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;
@@ -37,6 +35,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;
@@ -77,7 +76,7 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke
 
                if (getCmsEditable().canEdit()) {
                        fileUploadListener = new FUL();
-                       styledTools = new DbkContextMenu(this, parent.getDisplay());
+                       styledTools = new DbkContextMenu(this, parent.getShell());
                }
                this.mainSection = parent;
                initModelIfNeeded(mainSection.getNode());
@@ -97,14 +96,13 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke
                        CmsUiUtils.clear(section);
                        Node node = section.getNode();
                        TextSection textSection = (TextSection) section;
-                       if (node.hasProperty(Property.JCR_TITLE)) {
+                       if (node.hasNode(DocBookTypes.TITLE)) {
                                if (section.getHeader() == null)
                                        section.createHeader();
-                               if (node.hasProperty(Property.JCR_TITLE)) {
-                                       SectionTitle title = newSectionTitle(textSection, node);
-                                       title.setLayoutData(CmsUiUtils.fillWidth());
-                                       updateContent(title);
-                               }
+                               Node titleNode = node.getNode(DocBookTypes.TITLE);
+                               DocBookSectionTitle title = newSectionTitle(textSection, titleNode);
+                               title.setLayoutData(CmsUiUtils.fillWidth());
+                               updateContent(title);
                        }
 
                        for (NodeIterator ni = node.getNodes(DocBookNames.DBK_PARA); ni.hasNext();) {
@@ -118,27 +116,27 @@ 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)
                                        ((Control) sectionPart).setLayoutData(CmsUiUtils.fillWidth());
                        }
 
-                       if (!flat)
-                               for (NodeIterator ni = section.getNode().getNodes(DocBookNames.DBK_SECTION); ni.hasNext();) {
-                                       Node child = ni.nextNode();
-                                       if (child.isNodeType(DocBookTypes.SECTION)) {
-                                               TextSection newSection = new TextSection(section, SWT.NONE, child);
-                                               newSection.setLayoutData(CmsUiUtils.fillWidth());
-                                               refresh(newSection);
-                                       }
+//                     if (!flat)
+                       for (NodeIterator ni = section.getNode().getNodes(DocBookNames.DBK_SECTION); ni.hasNext();) {
+                               Node child = ni.nextNode();
+                               if (child.isNodeType(DocBookTypes.SECTION)) {
+                                       TextSection newSection = new TextSection(section, SWT.NONE, child);
+                                       newSection.setLayoutData(CmsUiUtils.fillWidth());
+                                       refresh(newSection);
                                }
+                       }
                } else {
                        for (Section s : section.getSubSections().values())
                                refresh(s);
                }
-               // section.layout();
+               // section.layout(true, true);
        }
 
        /** To be overridden in order to provide additional SectionPart types */
@@ -175,21 +173,40 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke
                return img;
        }
 
-       protected SectionTitle newSectionTitle(TextSection parent, Node node) throws RepositoryException {
-               SectionTitle title = new SectionTitle(parent.getHeader(), parent.getStyle(), node.getProperty(JCR_TITLE));
+       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(titleParent, style, titleNode);
                updateContent(title);
                title.setMouseListener(getMouseListener());
                return title;
        }
 
-       protected SectionTitle prepareSectionTitle(Section newSection, String titleText) throws RepositoryException {
+       /**
+        * 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();
-               if (!sectionNode.hasProperty(JCR_TITLE))
-                       sectionNode.setProperty(Property.JCR_TITLE, "");
-               getTextInterpreter().write(sectionNode.getProperty(Property.JCR_TITLE), titleText);
+               Node titleNode;
+               if (!sectionNode.hasNode(DocBookTypes.TITLE)) {
+                       titleNode = sectionNode.addNode(DocBookTypes.TITLE, DocBookTypes.TITLE);
+               } else {
+                       titleNode = sectionNode.getNode(DocBookTypes.TITLE);
+               }
+               getTextInterpreter().write(titleNode, titleText);
                if (newSection.getHeader() == null)
                        newSection.createHeader();
-               SectionTitle sectionTitle = newSectionTitle((TextSection) newSection, sectionNode);
+               DocBookSectionTitle sectionTitle = newSectionTitle((TextSection) newSection, sectionNode);
                return sectionTitle;
        }
 
@@ -220,14 +237,14 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke
                                EditableImage editableImage = (EditableImage) part;
                                imageManager.load(partNode, part.getControl(), editableImage.getPreferredImageSize());
                        }
-               } else if (part instanceof SectionTitle) {
-                       SectionTitle title = (SectionTitle) part;
+               } else if (part instanceof DocBookSectionTitle) {
+                       DocBookSectionTitle title = (DocBookSectionTitle) part;
                        title.setStyle(title.getSection().getTitleStyle());
                        // use control AFTER setting style
                        if (title == getEdited())
-                               title.setText(textInterpreter.read(title.getProperty()));
+                               title.setText(textInterpreter.read(title.getNode()));
                        else
-                               title.setText(textInterpreter.raw(title.getProperty()));
+                               title.setText(textInterpreter.raw(title.getNode()));
                }
        }
 
@@ -236,6 +253,8 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke
        protected void save(EditablePart part) throws RepositoryException {
                if (part instanceof EditableText) {
                        EditableText et = (EditableText) part;
+                       if (!et.getEditable())
+                               return;
                        String text = ((Text) et.getControl()).getText();
 
                        String[] lines = text.split("[\r\n]+");
@@ -267,11 +286,11 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke
                                                currentParagraph = newParagraph;
                                                currentParagraphN = newNode;
                                        }
-                                       persistChanges(sectionNode);
                                }
-                               // TODO or rather return the created paragarphs?
+                               // TODO or rather return the created paragraphs?
                                layout(toLayout.toArray(new Control[toLayout.size()]));
                        }
+                       persistChanges(et.getNode());
                }
        }
 
@@ -281,7 +300,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);
                }
        }
 
@@ -314,12 +333,17 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke
        void setParagraphStyle(Paragraph paragraph, String style) {
                try {
                        Node paragraphNode = paragraph.getNode();
-                       paragraphNode.setProperty(DocBookNames.DBK_ROLE, style);
+                       if (style == null) {// default
+                               if (paragraphNode.hasProperty(DocBookNames.DBK_ROLE))
+                                       paragraphNode.getProperty(DocBookNames.DBK_ROLE).remove();
+                       } else {
+                               paragraphNode.setProperty(DocBookNames.DBK_ROLE, style);
+                       }
                        persistChanges(paragraphNode);
                        updateContent(paragraph);
-                       layout(paragraph);
+                       layoutPage();
                } catch (RepositoryException e1) {
-                       throw new CmsException("Cannot set style " + style + " on " + paragraph, e1);
+                       throw new JcrException("Cannot set style " + style + " on " + paragraph, e1);
                }
        }
 
@@ -334,7 +358,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);
                }
        }
 
@@ -383,8 +407,8 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke
 
                                Paragraph secondParagraph = paragraphSplitted(paragraph, secondNode);
                                edit(secondParagraph, 0);
-                       } else if (getEdited() instanceof SectionTitle) {
-                               SectionTitle sectionTitle = (SectionTitle) getEdited();
+                       } else if (getEdited() instanceof DocBookSectionTitle) {
+                               DocBookSectionTitle sectionTitle = (DocBookSectionTitle) getEdited();
                                Text text = (Text) sectionTitle.getControl();
                                String txt = text.getText();
                                int caretPosition = text.getCaretPosition();
@@ -394,7 +418,7 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke
                                // paragraphNode.addMixin(CmsTypes.CMS_STYLED);
 
                                textInterpreter.write(paragraphNode, txt.substring(caretPosition));
-                               textInterpreter.write(sectionNode.getProperty(Property.JCR_TITLE), txt.substring(0, caretPosition));
+                               textInterpreter.write(sectionNode.getNode(DocBookTypes.TITLE), txt.substring(0, caretPosition));
                                sectionNode.orderBefore(p(paragraphNode.getIndex()), p(1));
                                persistChanges(sectionNode);
 
@@ -403,7 +427,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);
                }
        }
 
@@ -426,7 +450,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);
                }
        }
 
@@ -455,7 +479,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);
                }
        }
 
@@ -491,7 +515,7 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke
                                }
                        }
                } catch (RepositoryException e) {
-                       throw new CmsException("Cannot upload", e);
+                       throw new JcrException("Cannot upload", e);
                }
        }
 
@@ -509,13 +533,13 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke
                                Node sectionNode = section.getNode();
                                // main title
                                if (section == mainSection && section instanceof TextSection && paragraphNode.getIndex() == 1
-                                               && !sectionNode.hasProperty(JCR_TITLE)) {
-                                       SectionTitle sectionTitle = prepareSectionTitle(section, txt);
+                                               && !sectionNode.hasNode(DocBookTypes.TITLE)) {
+                                       DocBookSectionTitle sectionTitle = prepareSectionTitle(section, txt);
                                        edit(sectionTitle, 0);
                                        return;
                                }
                                Node newSectionNode = sectionNode.addNode(DocBookNames.DBK_SECTION, DocBookTypes.SECTION);
-                               newSectionNode.addMixin(NodeType.MIX_TITLE);
+                               // newSectionNode.addMixin(NodeType.MIX_TITLE);
                                sectionNode.orderBefore(h(newSectionNode.getIndex()), h(1));
 
                                int paragraphIndex = paragraphNode.getIndex();
@@ -529,9 +553,9 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke
                                        if (sp instanceof Control)
                                                ((Control) sp).dispose();
                                }
-                               // create property
-                               newSectionNode.setProperty(Property.JCR_TITLE, "");
-                               getTextInterpreter().write(newSectionNode.getProperty(Property.JCR_TITLE), txt);
+                               // create title
+                               Node titleNode = newSectionNode.addNode(DocBookTypes.TITLE, DocBookTypes.TITLE);
+                               getTextInterpreter().write(titleNode, txt);
 
                                TextSection newSection = new TextSection(section, section.getStyle(), newSectionNode);
                                newSection.setLayoutData(CmsUiUtils.fillWidth());
@@ -545,8 +569,8 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke
                                newSection.getParent().layout();
                                layout(newSection);
                                persistChanges(sectionNode);
-                       } else if (getEdited() instanceof SectionTitle) {
-                               SectionTitle sectionTitle = (SectionTitle) getEdited();
+                       } else if (getEdited() instanceof DocBookSectionTitle) {
+                               DocBookSectionTitle sectionTitle = (DocBookSectionTitle) getEdited();
                                Section section = sectionTitle.getSection();
                                Section parentSection = section.getParentSection();
                                if (parentSection == null)
@@ -566,7 +590,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);
                }
        }
 
@@ -602,7 +626,7 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke
                                // newParagrapheNode.addMixin(CmsTypes.CMS_STYLED);
                                if (mergedHasSubSections)
                                        mergedNode.orderBefore(p(newParagrapheNode.getIndex()), h(1));
-                               String txt = getTextInterpreter().read(sectionNode.getProperty(Property.JCR_TITLE));
+                               String txt = getTextInterpreter().read(sectionNode.getNode(DocBookTypes.TITLE));
                                getTextInterpreter().write(newParagrapheNode, txt);
                                // move
                                NodeIterator paragraphs = sectionNode.getNodes(DocBookNames.DBK_PARA);
@@ -635,7 +659,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);
                }
        }
 
@@ -650,7 +674,8 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke
                return newParagraph;
        }
 
-       protected Paragraph sectionTitleSplitted(SectionTitle sectionTitle, Node newNode) throws RepositoryException {
+       protected Paragraph sectionTitleSplitted(DocBookSectionTitle sectionTitle, Node newNode)
+                       throws RepositoryException {
                updateContent(sectionTitle);
                Paragraph newParagraph = newParagraph(sectionTitle.getSection(), newNode);
                // we assume beforeFirst is not null since there was a sectionTitle
@@ -799,8 +824,10 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke
                                                edit(composite, source.toDisplay(point));
                                } else if (e.button == 3) {
                                        EditablePart composite = findDataParent((Control) e.getSource());
-                                       if (styledTools != null)
-                                               styledTools.show(composite, new Point(e.x, e.y));
+                                       if (styledTools != null) {
+                                               List<String> styles = getAvailableStyles(composite);
+                                               styledTools.show(composite, new Point(e.x, e.y), styles);
+                                       }
                                }
                        }
                }
@@ -810,6 +837,10 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke
                }
        }
 
+       protected List<String> getAvailableStyles(EditablePart editablePart) {
+               return new ArrayList<>();
+       }
+
        // FILE UPLOAD LISTENER
        private class FUL implements FileUploadListener {
                public void uploadProgress(FileUploadEvent event) {
@@ -817,7 +848,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) {