X-Git-Url: https://git.argeo.org/?p=gpl%2Fargeo-suite.git;a=blobdiff_plain;f=publishing%2Forg.argeo.publishing.ui%2Fsrc%2Forg%2Fargeo%2Fdocbook%2Fui%2FAbstractDbkViewer.java;h=b21f502eb43c2efe3f76bf8fa9ad3a3aaa0f1429;hp=a00c31664adb5992dad90798b56cc53d37f60629;hb=06db6a211a46ba994d007e30f62704165c413177;hpb=147ada7da5bf6292569f17a53a77fca04c97f707 diff --git a/publishing/org.argeo.publishing.ui/src/org/argeo/docbook/ui/AbstractDbkViewer.java b/publishing/org.argeo.publishing.ui/src/org/argeo/docbook/ui/AbstractDbkViewer.java index a00c316..b21f502 100644 --- a/publishing/org.argeo.publishing.ui/src/org/argeo/docbook/ui/AbstractDbkViewer.java +++ b/publishing/org.argeo.publishing.ui/src/org/argeo/docbook/ui/AbstractDbkViewer.java @@ -1,28 +1,25 @@ 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.TextInterpreter; import org.argeo.cms.text.TextSection; -import org.argeo.cms.text.SectionTitle; import org.argeo.cms.ui.CmsEditable; import org.argeo.cms.ui.CmsImageManager; import org.argeo.cms.ui.CmsView; @@ -37,6 +34,8 @@ 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.entity.EntityType; +import org.argeo.jcr.JcrException; import org.argeo.jcr.JcrUtils; import org.eclipse.rap.fileupload.FileDetails; import org.eclipse.rap.fileupload.FileUploadEvent; @@ -72,12 +71,13 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke protected AbstractDbkViewer(Section parent, int style, CmsEditable cmsEditable) { super(parent, style, cmsEditable); CmsView cmsView = CmsView.getCmsView(parent); - imageManager = cmsView.getImageManager(); +// imageManager = cmsView.getImageManager(); + imageManager = new DbkImageManager(); flat = SWT.FLAT == (style & SWT.FLAT); 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,48 +97,50 @@ 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();) { + for (NodeIterator ni = node.getNodes(); ni.hasNext();) { Node child = ni.nextNode(); - final SectionPart sectionPart; - if (child.isNodeType(DocBookTypes.IMAGEDATA) || child.isNodeType(NodeType.NT_FILE)) { - // FIXME adapt to DocBook - sectionPart = newImg(textSection, child); + SectionPart sectionPart = null; + if (child.isNodeType(DocBookTypes.MEDIAOBJECT)) { + if (child.hasNode(DocBookTypes.IMAGEOBJECT)) { + Node imageNode = child.getNode(DocBookTypes.IMAGEOBJECT).getNode(DocBookTypes.INFO) + .getNode(EntityType.box.get()); + sectionPart = newImg(textSection, imageNode); + } } else if (child.isNodeType(DocBookTypes.PARA)) { sectionPart = newParagraph(textSection, child); } else { sectionPart = newSectionPart(textSection, child); - if (sectionPart == null) - throw new CmsException("Unsupported node " + child); +// if (sectionPart == null) +// throw new IllegalArgumentException("Unsupported node " + child); // TODO list node types in exception } - if (sectionPart instanceof Control) + if (sectionPart != null && 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 */ @@ -155,41 +157,64 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke return paragraph; } - protected Img newImg(TextSection parent, Node node) throws RepositoryException { - Img img = new Img(parent, parent.getStyle(), node) { - private static final long serialVersionUID = 1297900641952417540L; + protected Img newImg(TextSection parent, Node node) { + try { + Img img = new Img(parent, parent.getStyle(), node, imageManager) { + private static final long serialVersionUID = 1297900641952417540L; - @Override - protected void setContainerLayoutData(Composite composite) { - composite.setLayoutData(CmsUiUtils.grabWidth(SWT.CENTER, SWT.DEFAULT)); - } + @Override + protected void setContainerLayoutData(Composite composite) { + composite.setLayoutData(CmsUiUtils.grabWidth(SWT.CENTER, SWT.DEFAULT)); + } - @Override - protected void setControlLayoutData(Control control) { - control.setLayoutData(CmsUiUtils.grabWidth(SWT.CENTER, SWT.DEFAULT)); - } - }; - img.setLayoutData(CmsUiUtils.grabWidth(SWT.CENTER, SWT.DEFAULT)); - updateContent(img); - img.setMouseListener(getMouseListener()); - return img; + @Override + protected void setControlLayoutData(Control control) { + control.setLayoutData(CmsUiUtils.grabWidth(SWT.CENTER, SWT.DEFAULT)); + } + }; + img.setLayoutData(CmsUiUtils.grabWidth(SWT.CENTER, SWT.DEFAULT)); + updateContent(img); + img.setMouseListener(getMouseListener()); + return img; + } catch (RepositoryException e) { + throw new JcrException("Cannot add new image " + node, e); + } } - 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 +245,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 +261,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 +294,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 +308,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,27 +341,57 @@ 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); } } - void deletePart(SectionPart paragraph) { + void insertPart(Section section, Node node) { try { - Node paragraphNode = paragraph.getNode(); - Section section = paragraph.getSection(); - Session session = paragraphNode.getSession(); - paragraphNode.remove(); + refresh(section); + layoutPage(); + } catch (RepositoryException e) { + throw new JcrException("Cannot insert part " + node + " in section " + section.getNode(), e); + } + } + + void deletePart(SectionPart sectionPart) { + try { + Node node = sectionPart.getNode(); + Session session = node.getSession(); + if (sectionPart instanceof Img) { + // FIXME make it more robust + node = node.getParent().getParent().getParent(); + } + node.remove(); + session.save(); + if (sectionPart instanceof Control) + ((Control) sectionPart).dispose(); + layoutPage(); + } catch (RepositoryException e1) { + throw new JcrException("Cannot delete " + sectionPart, e1); + } + } + + void deleteSection(Section section) { + try { + Node node = section.getNode(); + Session session = node.getSession(); + node.remove(); session.save(); - if (paragraph instanceof Control) - ((Control) paragraph).dispose(); - layout(section); + section.dispose(); + layoutPage(); } catch (RepositoryException e1) { - throw new CmsException("Cannot delete " + paragraph, e1); + throw new JcrException("Cannot delete " + section, e1); } } @@ -383,8 +440,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 +451,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 +460,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 +483,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 +512,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); } } @@ -487,11 +544,11 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke if (getEdited() == part) return; edit(part, null); - layout(part.getControl()); + layoutPage(); } } } catch (RepositoryException e) { - throw new CmsException("Cannot upload", e); + throw new JcrException("Cannot upload", e); } } @@ -509,13 +566,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 +586,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 +602,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 +623,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); } } @@ -577,8 +634,8 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke try { if (getEdited() instanceof Paragraph) { upload(getEdited()); - } else if (getEdited() instanceof SectionTitle) { - SectionTitle sectionTitle = (SectionTitle) getEdited(); + } else if (getEdited() instanceof DocBookSectionTitle) { + DocBookSectionTitle sectionTitle = (DocBookSectionTitle) getEdited(); Section section = sectionTitle.getSection(); Node sectionNode = section.getNode(); Section parentSection = section.getParentSection(); @@ -602,7 +659,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 +692,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 +707,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 @@ -716,9 +774,13 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke try { // Common if (ke.keyCode == SWT.ESC) { - cancelEdit(); +// cancelEdit(); + saveEdit(); } else if (ke.character == '\r') { splitEdit(); + } else if (ke.character == 'z') { + if (ctrlPressed) + cancelEdit(); } else if (ke.character == 'S') { if (ctrlPressed) saveEdit(); @@ -775,32 +837,33 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke public void mouseDoubleClick(MouseEvent e) { if (e.button == 1) { Control source = (Control) e.getSource(); - if (getCmsEditable().canEdit()) { - if (getCmsEditable().isEditing() && !(getEdited() instanceof Img)) { - if (source == mainSection) - return; - EditablePart part = findDataParent(source); - upload(part); - } else { - getCmsEditable().startEditing(); + EditablePart composite = findDataParent(source); + Point point = new Point(e.x, e.y); + if (composite instanceof Img) { + if (getCmsEditable().canEdit()) { + if (getCmsEditable().isEditing() && !(getEdited() instanceof Img)) { + if (source == mainSection) + return; + EditablePart part = findDataParent(source); + upload(part); + } else { + getCmsEditable().startEditing(); + } } - } + } else + edit(composite, source.toDisplay(point)); } } @Override public void mouseDown(MouseEvent e) { if (getCmsEditable().isEditing()) { - if (e.button == 1) { - Control source = (Control) e.getSource(); - EditablePart composite = findDataParent(source); - Point point = new Point(e.x, e.y); - if (!(composite instanceof Img)) - edit(composite, source.toDisplay(point)); - } else if (e.button == 3) { + 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 styles = getAvailableStyles(composite); + styledTools.show(composite, new Point(e.x, e.y), styles); + } } } } @@ -810,6 +873,10 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke } } + protected List getAvailableStyles(EditablePart editablePart) { + return new ArrayList<>(); + } + // FILE UPLOAD LISTENER private class FUL implements FileUploadListener { public void uploadProgress(FileUploadEvent event) { @@ -817,7 +884,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) {