Style setter for DocBook.
[gpl/argeo-suite.git] / publishing / org.argeo.publishing.ui / src / org / argeo / docbook / ui / AbstractDbkViewer.java
index 8a527793a3d47ade95684c5e73d092dc996e6919..1b8a237cfcadc14c1642d84cb6661a4e132c5f72 100644 (file)
@@ -4,6 +4,7 @@ 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;
 
@@ -16,7 +17,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 +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;
@@ -75,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());
@@ -115,7 +116,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 +136,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 +175,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 +287,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 +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);
                }
        }
 
@@ -320,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);
                }
        }
 
@@ -340,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);
                }
        }
 
@@ -409,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);
                }
        }
 
@@ -432,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);
                }
        }
 
@@ -461,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);
                }
        }
 
@@ -497,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);
                }
        }
 
@@ -572,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);
                }
        }
 
@@ -641,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);
                }
        }
 
@@ -806,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);
+                                       }
                                }
                        }
                }
@@ -817,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) {
@@ -824,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) {