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=6b0692f6f80c52735b30c1a6647ded04ea0ce876;hp=b21f502eb43c2efe3f76bf8fa9ad3a3aaa0f1429;hb=cf3e6fe2b8c0f37d3e83980047764f12aabb6d49;hpb=06db6a211a46ba994d007e30f62704165c413177 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 b21f502..6b0692f 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,6 +1,9 @@ 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 java.util.ArrayList; import java.util.Iterator; @@ -13,7 +16,6 @@ import javax.jcr.Node; import javax.jcr.NodeIterator; 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; @@ -21,8 +23,6 @@ import org.argeo.cms.text.Paragraph; import org.argeo.cms.text.TextInterpreter; import org.argeo.cms.text.TextSection; import org.argeo.cms.ui.CmsEditable; -import org.argeo.cms.ui.CmsImageManager; -import org.argeo.cms.ui.CmsView; import org.argeo.cms.ui.util.CmsUiUtils; import org.argeo.cms.ui.viewers.AbstractPageViewer; import org.argeo.cms.ui.viewers.EditablePart; @@ -30,11 +30,12 @@ import org.argeo.cms.ui.viewers.NodePart; import org.argeo.cms.ui.viewers.PropertyPart; import org.argeo.cms.ui.viewers.Section; import org.argeo.cms.ui.viewers.SectionPart; -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.docbook.DbkAttr; +import org.argeo.docbook.DbkType; +import org.argeo.docbook.DbkUtils; +import org.argeo.jcr.Jcr; import org.argeo.jcr.JcrException; import org.argeo.jcr.JcrUtils; import org.eclipse.rap.fileupload.FileDetails; @@ -49,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. */ @@ -61,7 +64,7 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke private final Section mainSection; private TextInterpreter textInterpreter = new DbkTextInterpreter(); - private CmsImageManager imageManager; + private DbkImageManager imageManager; private FileUploadListener fileUploadListener; private DbkContextMenu styledTools; @@ -70,9 +73,8 @@ 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); +// CmsView cmsView = CmsView.getCmsView(parent); // imageManager = cmsView.getImageManager(); - imageManager = new DbkImageManager(); flat = SWT.FLAT == (style & SWT.FLAT); if (getCmsEditable().canEdit()) { @@ -80,6 +82,8 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke styledTools = new DbkContextMenu(this, parent.getShell()); } this.mainSection = parent; + Node baseFolder = Jcr.getParent(mainSection.getNode()); + imageManager = new DbkImageManager(baseFolder); initModelIfNeeded(mainSection.getNode()); // layout(this.mainSection); } @@ -97,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(DocBookTypes.TITLE)) { + if (node.hasNode(DbkType.title.get())) { if (section.getHeader() == null) section.createHeader(); - Node titleNode = node.getNode(DocBookTypes.TITLE); + Node titleNode = node.getNode(DbkType.title.get()); DocBookSectionTitle title = newSectionTitle(textSection, titleNode); title.setLayoutData(CmsUiUtils.fillWidth()); updateContent(title); @@ -109,13 +113,12 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke for (NodeIterator ni = node.getNodes(); ni.hasNext();) { Node child = ni.nextNode(); 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); + 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 (child.isNodeType(DocBookTypes.PARA)) { + } else if (isDbk(child, para)) { sectionPart = newParagraph(textSection, child); } else { sectionPart = newSectionPart(textSection, child); @@ -128,9 +131,9 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke } // if (!flat) - for (NodeIterator ni = section.getNode().getNodes(DocBookNames.DBK_SECTION); ni.hasNext();) { + for (NodeIterator ni = section.getNode().getNodes(DbkType.section.get()); ni.hasNext();) { Node child = ni.nextNode(); - if (child.isNodeType(DocBookTypes.SECTION)) { + if (isDbk(child, DbkType.section)) { TextSection newSection = new TextSection(section, SWT.NONE, child); newSection.setLayoutData(CmsUiUtils.fillWidth()); refresh(newSection); @@ -157,21 +160,9 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke return paragraph; } - protected Img newImg(TextSection parent, Node node) { + protected DbkImg 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 setControlLayoutData(Control control) { - control.setLayoutData(CmsUiUtils.grabWidth(SWT.CENTER, SWT.DEFAULT)); - } - }; + DbkImg img = new DbkImg(parent, parent.getStyle(), node, imageManager); img.setLayoutData(CmsUiUtils.grabWidth(SWT.CENTER, SWT.DEFAULT)); updateContent(img); img.setMouseListener(getMouseListener()); @@ -205,12 +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; - if (!sectionNode.hasNode(DocBookTypes.TITLE)) { - titleNode = sectionNode.addNode(DocBookTypes.TITLE, DocBookTypes.TITLE); - } else { - titleNode = sectionNode.getNode(DocBookTypes.TITLE); - } + Node titleNode = DbkUtils.getOrAddDbk(sectionNode, DbkType.title); getTextInterpreter().write(titleNode, titleText); if (newSection.getHeader() == null) newSection.createHeader(); @@ -226,9 +212,9 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke if (part instanceof StyledControl && (sectionPart.getSection() instanceof TextSection)) { TextSection section = (TextSection) sectionPart.getSection(); StyledControl styledControl = (StyledControl) part; - if (partNode.isNodeType(DocBookTypes.PARA)) { - String style = partNode.hasProperty(DocBookNames.DBK_ROLE) - ? partNode.getProperty(DocBookNames.DBK_ROLE).getString() + if (isDbk(partNode, para)) { + String style = partNode.hasProperty(DbkAttr.role.name()) + ? partNode.getProperty(DbkAttr.role.name()).getString() : section.getDefaultTextStyle(); styledControl.setStyle(style); } @@ -238,11 +224,11 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke if (part instanceof EditableText) { EditableText paragraph = (EditableText) part; if (paragraph == getEdited()) - paragraph.setText(textInterpreter.read(partNode)); - else paragraph.setText(textInterpreter.raw(partNode)); - } else if (part instanceof EditableImage) { - EditableImage editableImage = (EditableImage) part; + else + paragraph.setText(textInterpreter.readSimpleHtml(partNode)); + } else if (part instanceof DbkImg) { + DbkImg editableImage = (DbkImg) part; imageManager.load(partNode, part.getControl(), editableImage.getPreferredImageSize()); } } else if (part instanceof DocBookSectionTitle) { @@ -265,7 +251,8 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke return; String text = ((Text) et.getControl()).getText(); - String[] lines = text.split("[\r\n]+"); + // String[] lines = text.split("[\r\n]+"); + String[] lines = { text }; assert lines.length != 0; saveLine(part, lines[0]); if (lines.length > 1) { @@ -276,7 +263,7 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke Node sectionNode = section.getNode(); Node currentParagraphN = currentParagraph.getNode(); for (int i = 1; i < lines.length; i++) { - Node newNode = sectionNode.addNode(DocBookNames.DBK_PARA, DocBookTypes.PARA); + Node newNode = addDbk(sectionNode, para); // newNode.addMixin(CmsTypes.CMS_STYLED); saveLine(newNode, lines[i]); // second node was create as last, if it is not the next @@ -326,14 +313,25 @@ 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" }); text.setData(RWT.CANCEL_KEYS, new String[] { "RETURN", "ALT+ARROW_LEFT", "ALT+ARROW_RIGHT" }); text.addKeyListener(this); - } else if (part instanceof Img) { - ((Img) part).setFileUploadListener(fileUploadListener); + } else if (part instanceof DbkImg) { + ((DbkImg) part).setFileUploadListener(fileUploadListener); } } @@ -342,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); @@ -368,9 +366,11 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke try { Node node = sectionPart.getNode(); Session session = node.getSession(); - if (sectionPart instanceof Img) { + if (sectionPart instanceof DbkImg) { // FIXME make it more robust - node = node.getParent().getParent().getParent(); + node = node.getParent().getParent(); + if (!isDbk(node, DbkType.mediaobject)) + throw new IllegalArgumentException("Node " + node + " is not a media object."); } node.remove(); session.save(); @@ -415,7 +415,7 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke // FIXME set content the DocBook way // firstNode.setProperty(CMS_CONTENT, first); - Node secondNode = sectionNode.addNode(DocBookNames.DBK_PARA, DocBookTypes.PARA); + Node secondNode = addDbk(sectionNode, para); // secondNode.addMixin(CmsTypes.CMS_STYLED); // second node was create as last, if it is not the next one, it @@ -447,11 +447,11 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke int caretPosition = text.getCaretPosition(); Section section = sectionTitle.getSection(); Node sectionNode = section.getNode(); - Node paragraphNode = sectionNode.addNode(DocBookNames.DBK_PARA, DocBookTypes.PARA); + Node paragraphNode = addDbk(sectionNode, para); // paragraphNode.addMixin(CmsTypes.CMS_STYLED); textInterpreter.write(paragraphNode, txt.substring(caretPosition)); - textInterpreter.write(sectionNode.getNode(DocBookTypes.TITLE), txt.substring(0, caretPosition)); + textInterpreter.write(sectionNode.getNode(DbkType.title.get()), txt.substring(0, caretPosition)); sectionNode.orderBefore(p(paragraphNode.getIndex()), p(1)); persistChanges(sectionNode); @@ -495,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(DocBookNames.DBK_PARA); + NodeIterator paragraphNodes = sectionNode.getNodes(DbkType.para.get()); long size = paragraphNodes.getSize(); if (paragraphNode.getIndex() == size) return;// do nothing @@ -527,20 +527,20 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke if (part instanceof Paragraph) { // FIXME adapt to DocBook - Node newNode = sectionNode.addNode(DocBookNames.DBK_MEDIAOBJECT, NodeType.NT_FILE); - newNode.addNode(Node.JCR_CONTENT, NodeType.NT_RESOURCE); - JcrUtils.copyBytesAsFile(sectionNode, p(newNode.getIndex()), new byte[0]); - if (partIndex < newNode.getIndex() - 1) { - // was not last - sectionNode.orderBefore(p(newNode.getIndex()), p(partIndex - 1)); - } - // sectionNode.orderBefore(p(partNode.getIndex()), - // p(newNode.getIndex())); - persistChanges(sectionNode); - Img img = newImg((TextSection) section, newNode); - edit(img, null); - layout(img.getControl()); - } else if (part instanceof Img) { +// Node newNode = sectionNode.addNode(DocBookNames.DBK_MEDIAOBJECT, NodeType.NT_FILE); +// newNode.addNode(Node.JCR_CONTENT, NodeType.NT_RESOURCE); +// JcrUtils.copyBytesAsFile(sectionNode, p(newNode.getIndex()), new byte[0]); +// if (partIndex < newNode.getIndex() - 1) { +// // was not last +// sectionNode.orderBefore(p(newNode.getIndex()), p(partIndex - 1)); +// } +// // sectionNode.orderBefore(p(partNode.getIndex()), +// // p(newNode.getIndex())); +// persistChanges(sectionNode); +// DbkImg img = newImg((TextSection) section, newNode); +// edit(img, null); +// layout(img.getControl()); + } else if (part instanceof DbkImg) { if (getEdited() == part) return; edit(part, null); @@ -566,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(DocBookTypes.TITLE)) { + && !sectionNode.hasNode(DbkType.title.get())) { DocBookSectionTitle sectionTitle = prepareSectionTitle(section, txt); edit(sectionTitle, 0); return; } - Node newSectionNode = sectionNode.addNode(DocBookNames.DBK_SECTION, DocBookTypes.SECTION); + Node newSectionNode = addDbk(sectionNode, DbkType.section); // newSectionNode.addMixin(NodeType.MIX_TITLE); sectionNode.orderBefore(h(newSectionNode.getIndex()), h(1)); @@ -581,13 +581,14 @@ 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 + '/' + DocBookNames.DBK_PARA); + newSectionPath + '/' + DbkType.para.get()); SectionPart sp = section.getSectionPart(parag.getIdentifier()); if (sp instanceof Control) ((Control) sp).dispose(); } // create title - Node titleNode = newSectionNode.addNode(DocBookTypes.TITLE, DocBookTypes.TITLE); + Node titleNode = DbkUtils.addDbk(newSectionNode, DbkType.title); + // newSectionNode.addNode(DocBookType.TITLE, DocBookType.TITLE); getTextInterpreter().write(titleNode, txt); TextSection newSection = new TextSection(section, section.getStyle(), newSectionNode); @@ -613,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(DocBookNames.DBK_SECTION); + NodeIterator subSections = previousSectionN.getNodes(DbkType.section.get()); int subsectionsCount = (int) subSections.getSize(); previousSectionN.getSession().move(sectionN.getPath(), previousSectionN.getPath() + "/" + h(subsectionsCount + 1)); @@ -652,23 +653,23 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke mergedSection = lst.get(sectionNode.getIndex() - 1); } Node mergedNode = mergedSection.getNode(); - boolean mergedHasSubSections = mergedNode.hasNode(DocBookNames.DBK_SECTION); + boolean mergedHasSubSections = mergedNode.hasNode(DbkType.section.get()); // title as paragraph - Node newParagrapheNode = mergedNode.addNode(DocBookNames.DBK_PARA, DocBookTypes.PARA); + 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(DocBookTypes.TITLE)); + String txt = getTextInterpreter().read(sectionNode.getNode(DbkType.title.get())); getTextInterpreter().write(newParagrapheNode, txt); // move - NodeIterator paragraphs = sectionNode.getNodes(DocBookNames.DBK_PARA); + NodeIterator paragraphs = sectionNode.getNodes(para.get()); while (paragraphs.hasNext()) { Node p = paragraphs.nextNode(); SectionPart sp = section.getSectionPart(p.getIdentifier()); if (sp instanceof Control) ((Control) sp).dispose(); - mergedNode.getSession().move(p.getPath(), mergedNode.getPath() + '/' + DocBookNames.DBK_PARA); + mergedNode.getSession().move(p.getPath(), mergedNode.getPath() + '/' + para.get()); if (mergedHasSubSections) mergedNode.orderBefore(p(p.getIndex()), h(1)); } @@ -678,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() + '/' + DocBookNames.DBK_SECTION); + mergedNode.getSession().move(s.getPath(), mergedNode.getPath() + '/' + DbkType.section.get()); subsection.dispose(); } @@ -736,13 +737,13 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke // UTILITIES protected String p(Integer index) { StringBuilder sb = new StringBuilder(6); - sb.append(DocBookNames.DBK_PARA).append('[').append(index).append(']'); + sb.append(para.get()).append('[').append(index).append(']'); return sb.toString(); } protected String h(Integer index) { StringBuilder sb = new StringBuilder(5); - sb.append(DocBookNames.DBK_SECTION).append('[').append(index).append(']'); + sb.append(DbkType.section.get()).append('[').append(index).append(']'); return sb.toString(); } @@ -777,7 +778,8 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke // cancelEdit(); saveEdit(); } else if (ke.character == '\r') { - splitEdit(); + if (!shiftPressed) + splitEdit(); } else if (ke.character == 'z') { if (ctrlPressed) cancelEdit(); @@ -839,9 +841,9 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke Control source = (Control) e.getSource(); EditablePart composite = findDataParent(source); Point point = new Point(e.x, e.y); - if (composite instanceof Img) { + if (composite instanceof DbkImg) { if (getCmsEditable().canEdit()) { - if (getCmsEditable().isEditing() && !(getEdited() instanceof Img)) { + if (getCmsEditable().isEditing() && !(getEdited() instanceof DbkImg)) { if (source == mainSection) return; EditablePart part = findDataParent(source); @@ -850,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)); + } } }