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=5896d18107e310938a5112ee3aac514a78a33995;hb=cf3e6fe2b8c0f37d3e83980047764f12aabb6d49;hpb=4bd6cf0556f597ee73c8f13df45019ccf9e418a6 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 5896d18..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,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) {