From 3304f8934e1dc5846fc6214997bc54faaa93bb39 Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Mon, 12 Sep 2022 08:01:14 +0200 Subject: [PATCH] Introduce ACR-based DocBook viewer --- Makefile | 2 +- .../org/argeo/app/docbook/DbkAcrUtils.java | 14 + .../src/org/argeo/app/docbook/DbkAttr.java | 16 +- .../src/org/argeo/app/docbook/DbkType.java | 9 +- .../.classpath | 0 .../.project | 2 +- org.argeo.app.swt/bnd.bnd | 7 + .../build.properties | 0 .../app/swt/docbook/DbkTextInterpreter.java | 261 ++++++++++++++++++ .../argeo/app/swt/docbook/DocBookViewer.java | 121 ++++++++ .../org/argeo/app/swt/docbook/Paragraph.java | 50 ++++ .../app/swt/docbook/TextInterpreter.java | 14 + .../argeo/app/swt/docbook/TextSection.java | 78 ++++++ .../config/documentUiProvider.properties | 2 +- .../config/publishUiProvider.properties | 2 +- .../app/ui/library/ContentEntryArea.java | 3 +- .../app/ui/publish/PublishUiProvider.java | 9 +- org.argeo.app.ux/bnd.bnd | 0 .../argeo/app/ux/docbook/DocBookViewer.java | 15 - 19 files changed, 579 insertions(+), 26 deletions(-) create mode 100644 org.argeo.app.core/src/org/argeo/app/docbook/DbkAcrUtils.java rename {org.argeo.app.ux => org.argeo.app.swt}/.classpath (100%) rename {org.argeo.app.ux => org.argeo.app.swt}/.project (95%) create mode 100644 org.argeo.app.swt/bnd.bnd rename {org.argeo.app.ux => org.argeo.app.swt}/build.properties (100%) create mode 100644 org.argeo.app.swt/src/org/argeo/app/swt/docbook/DbkTextInterpreter.java create mode 100644 org.argeo.app.swt/src/org/argeo/app/swt/docbook/DocBookViewer.java create mode 100644 org.argeo.app.swt/src/org/argeo/app/swt/docbook/Paragraph.java create mode 100644 org.argeo.app.swt/src/org/argeo/app/swt/docbook/TextInterpreter.java create mode 100644 org.argeo.app.swt/src/org/argeo/app/swt/docbook/TextSection.java delete mode 100644 org.argeo.app.ux/bnd.bnd delete mode 100644 org.argeo.app.ux/src/org/argeo/app/ux/docbook/DocBookViewer.java diff --git a/Makefile b/Makefile index 444b300..8c6d83c 100644 --- a/Makefile +++ b/Makefile @@ -14,7 +14,7 @@ org.argeo.app.api \ org.argeo.app.core \ org.argeo.app.servlet.odk \ org.argeo.app.servlet.publish \ -org.argeo.app.ux \ +org.argeo.app.swt \ org.argeo.app.ui \ org.argeo.app.theme.default \ org.argeo.app.profile.acr.fs \ diff --git a/org.argeo.app.core/src/org/argeo/app/docbook/DbkAcrUtils.java b/org.argeo.app.core/src/org/argeo/app/docbook/DbkAcrUtils.java new file mode 100644 index 0000000..d956069 --- /dev/null +++ b/org.argeo.app.core/src/org/argeo/app/docbook/DbkAcrUtils.java @@ -0,0 +1,14 @@ +package org.argeo.app.docbook; + +import org.argeo.api.acr.Content; + +public class DbkAcrUtils { + /** Whether this DocBook element is of this type. */ + public static boolean isDbk(Content content, DbkType type) { + return content.isContentClass(type.qName()); + } + + /** singleton */ + private DbkAcrUtils() { + } +} diff --git a/org.argeo.app.core/src/org/argeo/app/docbook/DbkAttr.java b/org.argeo.app.core/src/org/argeo/app/docbook/DbkAttr.java index f6cf839..d394836 100644 --- a/org.argeo.app.core/src/org/argeo/app/docbook/DbkAttr.java +++ b/org.argeo.app.core/src/org/argeo/app/docbook/DbkAttr.java @@ -1,7 +1,11 @@ package org.argeo.app.docbook; +import javax.xml.XMLConstants; + +import org.argeo.util.naming.QNamed; + /** Supported DocBook attributes. */ -public enum DbkAttr { +public enum DbkAttr implements QNamed { role, // fileref, contentwidth, contentdepth @@ -10,4 +14,14 @@ public enum DbkAttr { public final static String XLINK_HREF = "xlink:href"; + @Override + public String getNamespace() { + return XMLConstants.NULL_NS_URI; + } + + @Override + public String getDefaultPrefix() { + return XMLConstants.DEFAULT_NS_PREFIX; + } + } diff --git a/org.argeo.app.core/src/org/argeo/app/docbook/DbkType.java b/org.argeo.app.core/src/org/argeo/app/docbook/DbkType.java index 3e3585f..66fdc76 100644 --- a/org.argeo.app.core/src/org/argeo/app/docbook/DbkType.java +++ b/org.argeo.app.core/src/org/argeo/app/docbook/DbkType.java @@ -1,9 +1,10 @@ package org.argeo.app.docbook; import org.argeo.app.api.JcrName; +import org.argeo.util.naming.QNamed; /** Supported DocBook elements */ -public enum DbkType implements JcrName { +public enum DbkType implements JcrName, QNamed { book, article, section, // info, title, para, @@ -19,6 +20,7 @@ public enum DbkType implements JcrName { return prefix(); } + @Deprecated public static String prefix() { return "dbk"; } @@ -32,4 +34,9 @@ public enum DbkType implements JcrName { return "http://docbook.org/ns/docbook"; } + @Override + public String getDefaultPrefix() { + return "dbk"; + } + } diff --git a/org.argeo.app.ux/.classpath b/org.argeo.app.swt/.classpath similarity index 100% rename from org.argeo.app.ux/.classpath rename to org.argeo.app.swt/.classpath diff --git a/org.argeo.app.ux/.project b/org.argeo.app.swt/.project similarity index 95% rename from org.argeo.app.ux/.project rename to org.argeo.app.swt/.project index 8ba2daf..11c6368 100644 --- a/org.argeo.app.ux/.project +++ b/org.argeo.app.swt/.project @@ -1,6 +1,6 @@ - org.argeo.app.ux + org.argeo.app.swt diff --git a/org.argeo.app.swt/bnd.bnd b/org.argeo.app.swt/bnd.bnd new file mode 100644 index 0000000..bbc81c5 --- /dev/null +++ b/org.argeo.app.swt/bnd.bnd @@ -0,0 +1,7 @@ +Import-Package:\ +org.eclipse.swt,\ +org.argeo.util.naming,\ +org.argeo.api.cms.ux,\ +org.argeo.cms.ux.acr,\ +org.argeo.app.api,\ +* \ No newline at end of file diff --git a/org.argeo.app.ux/build.properties b/org.argeo.app.swt/build.properties similarity index 100% rename from org.argeo.app.ux/build.properties rename to org.argeo.app.swt/build.properties diff --git a/org.argeo.app.swt/src/org/argeo/app/swt/docbook/DbkTextInterpreter.java b/org.argeo.app.swt/src/org/argeo/app/swt/docbook/DbkTextInterpreter.java new file mode 100644 index 0000000..2fac3bb --- /dev/null +++ b/org.argeo.app.swt/src/org/argeo/app/swt/docbook/DbkTextInterpreter.java @@ -0,0 +1,261 @@ +package org.argeo.app.swt.docbook; + +import static org.argeo.app.docbook.DbkAcrUtils.isDbk; +import static org.argeo.app.docbook.DbkType.para; +import static org.argeo.app.docbook.DbkType.title; + +import java.io.IOException; +import java.io.StringReader; +import java.io.StringWriter; +import java.util.List; + +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.transform.Result; +import javax.xml.transform.Source; +import javax.xml.transform.TransformerException; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.stream.StreamResult; + +import org.apache.commons.io.IOUtils; +import org.argeo.api.acr.Content; +import org.argeo.app.docbook.DbkType; + +/** Based on HTML with a few Wiki-like shortcuts. */ +public class DbkTextInterpreter implements TextInterpreter { + + private TransformerFactory transformerFactory = TransformerFactory.newDefaultInstance(); + + private String linkCssClass = DbkType.link.name(); + + @Override + public void write(Content node, String content) { + if (isDbk(node, para) || isDbk(node, title)) { + String raw = convertToStorage(node, content); + validateBeforeStoring(raw); + + String jcrUuid = null;// node.getIdentifier(); +// if (node.hasProperty(Property.JCR_UUID)) +// jcrUuid = node.getProperty(Property.JCR_UUID).getString(); +// else { +// // TODO use time based +// jcrUuid = UUID.randomUUID().toString(); +// node.setProperty(Property.JCR_UUID, jcrUuid); +// node.getSession().save(); +// } + + StringBuilder namespaces = new StringBuilder(); + namespaces.append(" xmlns:dbk=\"http://docbook.org/ns/docbook\""); + namespaces.append(" xmlns:jcr=\"http://www.jcp.org/jcr/1.0\""); + namespaces.append(" xmlns:xlink=\"http://www.w3.org/1999/xlink\""); + raw = "<" + node.getName() + " jcr:uuid=\"" + jcrUuid + "\"" + namespaces + ">" + raw + ""; +// System.out.println(raw); +// try (InputStream in = new ByteArrayInputStream(raw.getBytes(StandardCharsets.UTF_8))) { +// node.getSession().importXML(node.getParent().getPath(), in, +// ImportUUIDBehavior.IMPORT_UUID_COLLISION_REPLACE_EXISTING); +// // node.getSession().save(); +// } catch (IOException e) { +// throw new IllegalArgumentException("Cannot parse raw content of " + node, e); +// } + +// try { +// DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); +// Document document; +// try (Reader in = new StringReader(raw)) { +// document = documentBuilder.parse(new InputSource(in)); +// } +// NodeList nl = document.getChildNodes(); +// for (int i = 0; i < nl.getLength(); i++) { +// org.w3c.dom.Node n = nl.item(i); +// if (node instanceof Text) { +// +// } +// } +// } catch (ParserConfigurationException | SAXException | IOException e) { +// throw new IllegalArgumentException("Cannot parse raw content of " + node, e); +// } + +// Node jcrText; +// if (!node.hasNode(Jcr.JCR_XMLTEXT)) +// jcrText = node.addNode(Jcr.JCR_XMLTEXT, JcrxType.JCRX_XMLTEXT); +// else +// jcrText = node.getNode(Jcr.JCR_XMLTEXT); +// jcrText.setProperty(Jcr.JCR_XMLCHARACTERS, raw); + } else { + throw new IllegalArgumentException("Don't know how to interpret " + node); + } + } + + @Override + public String read(Content item) { + String raw = raw(item); + return convertFromStorage(item, raw); + } + + @Override + public String raw(Content node) { + if (isDbk(node, para) || isDbk(node, title)) { + Source source = node.adapt(Source.class); + + StringWriter stringWriter = new StringWriter(); + Result result = new StreamResult(stringWriter); + + try { + transformerFactory.newTransformer().transform(source, result); + return stringWriter.toString(); + } catch (TransformerException e) { + throw new RuntimeException("Could not convert " + node + " to XML", e); + } + +// StringBuilder sb = new StringBuilder(); +// readXml(node, sb); +// NodeIterator nit = node.getNodes(); +// while (nit.hasNext()) { +// Node child = nit.nextNode(); +// if (child.getName().equals(Jcr.JCR_XMLTEXT)) { +// Node jcrText = node.getNode(Jcr.JCR_XMLTEXT); +// String txt = jcrText.getProperty(Jcr.JCR_XMLCHARACTERS).getString(); +// // TODO make it more robust +// // txt = txt.replace("\n", "").replace("\t", ""); +// txt = txt.replace("\t", " "); +// sb.append(txt); +// } else { +// try (ByteArrayOutputStream out = new ByteArrayOutputStream()) { +// child.getSession().exportDocumentView(child.getPath(), out, true, false); +// sb.append(new String(out.toByteArray(), StandardCharsets.UTF_8)); +// } catch (IOException e) { +// throw new IllegalStateException("Cannot export " + child, e); +// } +// } +// } +// return sb.toString(); + } else { + throw new IllegalArgumentException("Don't know how to interpret " + node); + } + } + +// private void readXml(Content node, StringBuilder sb){ +// +// NodeIterator nit = node.getNodes(); +// while (nit.hasNext()) { +// Node child = nit.nextNode(); +// if (child.getName().equals(Jcr.JCR_XMLTEXT)) { +// String txt = child.getProperty(Jcr.JCR_XMLCHARACTERS).getString(); +// // TODO make it more robust +// // txt = txt.replace("\n", "").replace("\t", ""); +// txt = txt.replace("\t", " "); +// sb.append(txt); +// } else { +// sb.append('<').append(child.getName()); +// PropertyIterator pit = child.getProperties(); +// properties: while (pit.hasNext()) { +// Property p = pit.nextProperty(); +// if (p.getName().startsWith("jcr:")) +// continue properties; +// sb.append(' ').append(p.getName()).append("=\"").append(p.getString()).append('\"'); +// } +// sb.append('>'); +// readXml(child, sb); +//// try (ByteArrayOutputStream out = new ByteArrayOutputStream()) { +//// child.getSession().exportDocumentView(child.getPath(), out, true, false); +//// sb.append(new String(out.toByteArray(), StandardCharsets.UTF_8)); +//// } catch (IOException e) { +//// throw new IllegalStateException("Cannot export " + child, e); +//// } +// sb.append("'); +// } +// } +// } + + private void readAsSimpleHtml(Content node, StringBuilder sb) { +// NodeIterator nit = node.getNodes(); +// while (nit.hasNext()) { +// Node child = nit.nextNode(); +// if (child.getName().equals(Jcr.JCR_XMLTEXT)) { +// String txt = child.getProperty(Jcr.JCR_XMLCHARACTERS).getString(); +// // TODO make it more robust +// // txt = txt.replace("\n", "").replace("\t", ""); +// txt = txt.replace("\t", " "); +// String html = textToSimpleHtml(txt); +// sb.append(html); +// } else if (child.getName().equals(DbkType.link.get())) { +// if (child.hasProperty(DbkAttr.XLINK_HREF)) { +// String href = child.getProperty(DbkAttr.XLINK_HREF).getString(); +// // TODO deal with other forbidden XML characters? +// href = href.replace("&", "&"); +// sb.append(""); +// readAsSimpleHtml(child, sb); +// sb.append(""); +// } +// } else { +// // ignore +// } +// } + } + + private String textToSimpleHtml(String raw) { + // FIXME the saved data should be corrected instead. + if (raw.indexOf('&') >= 0) { + raw = raw.replace("&", "&"); + } + if (raw.indexOf('<') >= 0) { + raw = raw.replace("<", "<"); + } + if (raw.indexOf('>') >= 0) { + raw = raw.replace(">", ">"); + } + if (raw.indexOf('\"') >= 0) { + raw = raw.replace("\"", """); + } + if (raw.indexOf('\'') >= 0) { + raw = raw.replace("\'", "'"); + } +// raw = "" + raw + ""; + if (raw.length() == 0) + return raw; + try (StringReader reader = new StringReader(raw)) { + List lines = IOUtils.readLines(reader); + if (lines.size() == 1) + return lines.get(0); + StringBuilder sb = new StringBuilder(raw.length() + lines.size() * BR_LENGTH); + for (int i = 0; i < lines.size(); i++) { + if (i != 0) + sb.append("
"); + sb.append(lines.get(i)); + } + return sb.toString(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + final static int BR_LENGTH = "
".length(); + + public String readSimpleHtml(Content item) { + StringBuilder sb = new StringBuilder(); +// sb.append("
"); + readAsSimpleHtml(item, sb); +// sb.append("
"); +// System.out.println(sb); + return sb.toString(); + } + + // EXTENSIBILITY + /** + * To be overridden, in order to make sure that only valid strings are being + * stored. + */ + protected void validateBeforeStoring(String raw) { + } + + /** To be overridden, in order to support additional formatting. */ + protected String convertToStorage(Content item, String content) { + return content; + + } + + /** To be overridden, in order to support additional formatting. */ + protected String convertFromStorage(Content item, String content) { + return content; + } +} diff --git a/org.argeo.app.swt/src/org/argeo/app/swt/docbook/DocBookViewer.java b/org.argeo.app.swt/src/org/argeo/app/swt/docbook/DocBookViewer.java new file mode 100644 index 0000000..6cd5172 --- /dev/null +++ b/org.argeo.app.swt/src/org/argeo/app/swt/docbook/DocBookViewer.java @@ -0,0 +1,121 @@ +package org.argeo.app.swt.docbook; + +import static org.argeo.app.docbook.DbkAcrUtils.isDbk; +import static org.argeo.app.docbook.DbkType.para; + +import java.util.Optional; + +import org.argeo.api.acr.Content; +import org.argeo.api.cms.ux.CmsEditable; +import org.argeo.app.docbook.DbkAttr; +import org.argeo.app.docbook.DbkType; +import org.argeo.cms.swt.CmsSwtUtils; +import org.argeo.cms.swt.SwtEditablePart; +import org.argeo.cms.swt.acr.AbstractPageViewer; +import org.argeo.cms.swt.acr.SwtSection; +import org.argeo.cms.swt.acr.SwtSectionPart; +import org.argeo.cms.swt.widgets.EditableText; +import org.argeo.cms.swt.widgets.StyledControl; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; + +public class DocBookViewer extends AbstractPageViewer { + + private TextInterpreter textInterpreter = new DbkTextInterpreter(); + + private TextSection mainSection; + + public DocBookViewer(Composite parent, int style, Content item, CmsEditable cmsEditable) { + super(parent, style, cmsEditable); + for (Content child : item) { + if (child.hasContentClass(DbkType.article.qName())) { + if (mainSection != null) + throw new IllegalStateException("Main section already created"); + mainSection = new TextSection(parent, 0, child); + mainSection.setLayoutData(CmsSwtUtils.fillAll()); + } + } + } + + @Override + protected void refresh(Control control) { + if (!(control instanceof SwtSection)) + return; + long begin = System.currentTimeMillis(); + SwtSection section = (SwtSection) control; + if (section instanceof TextSection) { + CmsSwtUtils.clear(mainSection); + refreshTextSection(mainSection); + + } + long duration = System.currentTimeMillis() - begin; +// System.out.println(duration + " ms - " + DbkUtils.getTitle(section.getNode())); + + } + + protected void refreshTextSection(TextSection section) { + for (Content child : section.getContent()) { + if (child.hasContentClass(DbkType.section.qName())) { + TextSection childSection = new TextSection(section, 0, child); + childSection.setLayoutData(CmsSwtUtils.fillAll()); + refreshTextSection(childSection); + } else if (child.hasContentClass(DbkType.para.qName())) { + Paragraph para = new Paragraph(section, 0, child); + para.setLayoutData(CmsSwtUtils.fillWidth()); + updateContent(para); + } + + } + } + + protected void updateContent(SwtEditablePart part) { + if (part instanceof SwtSectionPart) { + SwtSectionPart sectionPart = (SwtSectionPart) part; + Content partContent = sectionPart.getContent(); + + if (part instanceof StyledControl && (sectionPart.getSection() instanceof TextSection)) { + TextSection section = (TextSection) sectionPart.getSection(); + StyledControl styledControl = (StyledControl) part; + if (isDbk(partContent, para)) { + Optional roleAttr = partContent.get(DbkAttr.role.qName(), String.class); + String style = roleAttr.orElse(section.getDefaultTextStyle()); + styledControl.setStyle(style); + } + } + // use control AFTER setting style, since it may have been reset + + if (part instanceof EditableText) { + EditableText paragraph = (EditableText) part; + if (paragraph == getEdited()) + paragraph.setText(textInterpreter.raw(partContent)); + else + paragraph.setText(textInterpreter.raw(partContent)); + //paragraph.setText(textInterpreter.readSimpleHtml(partContent)); + +// } else if (part instanceof DbkImg) { +// DbkImg editableImage = (DbkImg) part; +// // imageManager.load(partNode, part.getControl(), +// // editableImage.getPreferredImageSize()); +// } else if (part instanceof DbkVideo) { +// DbkVideo video = (DbkVideo) part; +// video.load(part.getControl()); +// } + } + } +// else if (part instanceof DbkSectionTitle) { +// DbkSectionTitle title = (DbkSectionTitle) part; +// title.setStyle(title.getSection().getTitleStyle()); +// // use control AFTER setting style +// if (title == getEdited()) +// title.setText(textInterpreter.read(title.getNode())); +// else +// title.setText(textInterpreter.readSimpleHtml(title.getNode())); +// } + } + + @Override + public Control getControl() { + return mainSection; + } + +} diff --git a/org.argeo.app.swt/src/org/argeo/app/swt/docbook/Paragraph.java b/org.argeo.app.swt/src/org/argeo/app/swt/docbook/Paragraph.java new file mode 100644 index 0000000..60bfc77 --- /dev/null +++ b/org.argeo.app.swt/src/org/argeo/app/swt/docbook/Paragraph.java @@ -0,0 +1,50 @@ +package org.argeo.app.swt.docbook; + +import org.argeo.api.acr.Content; +import org.argeo.api.acr.spi.ProvidedContent; +import org.argeo.app.docbook.DbkType; +import org.argeo.cms.swt.CmsSwtUtils; +import org.argeo.cms.swt.acr.SwtSectionPart; +import org.argeo.cms.swt.widgets.EditableText; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Label; + +/** An editable paragraph. */ +public class Paragraph extends EditableText implements SwtSectionPart { + private static final long serialVersionUID = 3746457776229542887L; + + private final TextSection section; + + public Paragraph(TextSection section, int style, Content node) { + super(section, style); + this.section = section; + setData(node); + CmsSwtUtils.style(this, DbkType.para.name()); + } + + public TextSection getSection() { + return section; + } + + @Override + protected Label createLabel(Composite box, String style) { + Label lbl = super.createLabel(box, style); + CmsSwtUtils.disableMarkupValidation(lbl); + return lbl; + } + + @Override + public String getPartId() { + return ((ProvidedContent) getContent()).getSessionLocalId(); + } + + @Override + public Content getContent() { + return (Content) getData(); + } + + @Override + public String toString() { + return "Paragraph #" + getPartId(); + } +} diff --git a/org.argeo.app.swt/src/org/argeo/app/swt/docbook/TextInterpreter.java b/org.argeo.app.swt/src/org/argeo/app/swt/docbook/TextInterpreter.java new file mode 100644 index 0000000..0470a6d --- /dev/null +++ b/org.argeo.app.swt/src/org/argeo/app/swt/docbook/TextInterpreter.java @@ -0,0 +1,14 @@ +package org.argeo.app.swt.docbook; + +import org.argeo.api.acr.Content; + +/** Convert from/to data layer to/from presentation layer. */ +public interface TextInterpreter { + String raw(Content content); + + String read(Content content); + + String readSimpleHtml(Content content); + + void write(Content content, String txt); +} diff --git a/org.argeo.app.swt/src/org/argeo/app/swt/docbook/TextSection.java b/org.argeo.app.swt/src/org/argeo/app/swt/docbook/TextSection.java new file mode 100644 index 0000000..e062ad2 --- /dev/null +++ b/org.argeo.app.swt/src/org/argeo/app/swt/docbook/TextSection.java @@ -0,0 +1,78 @@ +package org.argeo.app.swt.docbook; + +import org.argeo.api.acr.Content; +import org.argeo.app.docbook.DbkType; +import org.argeo.cms.swt.CmsSwtUtils; +import org.argeo.cms.swt.acr.SwtSection; +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Composite; + +/** An editable section. */ +public class TextSection extends SwtSection { + private static final long serialVersionUID = -8625209546243220689L; + private String defaultTextStyle = DbkType.para.name(); + private String titleStyle; + + private final boolean flat; + + private boolean titleReadOnly = false; + + private final int level; + + public TextSection(Composite parent, int style, Content node) { + this(parent, findSection(parent), style, node); + } + + public TextSection(TextSection section, int style, Content node) { + this(section, section.getParentSection(), style, node); + } + + private TextSection(Composite parent, SwtSection parentSection, int style, Content node) { + super(parent, parentSection, style, node); + flat = SWT.FLAT == (style & SWT.FLAT); + if (parentSection instanceof TextSection) { + level = ((TextSection) parentSection).getLevel() + 1; + } else { + level = 0; + } + CmsSwtUtils.style(this, DbkType.section.name()); + } + + public String getDefaultTextStyle() { + return defaultTextStyle; + } + + public boolean isFlat() { + return flat; + } + + /** The level of this section, similar to h1, h2, etc. in HTML. */ + public int getLevel() { + return level; + } + + public String getTitleStyle() { + if (titleStyle != null) + return titleStyle; + // TODO make base H styles configurable +// Integer relativeDepth = getRelativeDepth(); +// System.out.println("Level: " + getLevel()); + return "h" + (getLevel() + 1); + } + + public void setDefaultTextStyle(String defaultTextStyle) { + this.defaultTextStyle = defaultTextStyle; + } + + public void setTitleStyle(String titleStyle) { + this.titleStyle = titleStyle; + } + + public boolean isTitleReadOnly() { + return titleReadOnly; + } + + public void setTitleReadOnly(boolean titleReadOnly) { + this.titleReadOnly = titleReadOnly; + } +} diff --git a/org.argeo.app.ui/config/documentUiProvider.properties b/org.argeo.app.ui/config/documentUiProvider.properties index 855735d..339a444 100644 --- a/org.argeo.app.ui/config/documentUiProvider.properties +++ b/org.argeo.app.ui/config/documentUiProvider.properties @@ -1,3 +1,3 @@ service.pid=argeo.publishing.ui.documentUiProvider -entity.type=entity:document,nt:file \ No newline at end of file +entity.type=nt:file \ No newline at end of file diff --git a/org.argeo.app.ui/config/publishUiProvider.properties b/org.argeo.app.ui/config/publishUiProvider.properties index 64ca319..7555eda 100644 --- a/org.argeo.app.ui/config/publishUiProvider.properties +++ b/org.argeo.app.ui/config/publishUiProvider.properties @@ -1,3 +1,3 @@ service.pid=argeo.publishing.ui.publishUiProvider -#entity.type=entity:document,nt:file \ No newline at end of file +entity.type=entity:document \ No newline at end of file diff --git a/org.argeo.app.ui/src/org/argeo/app/ui/library/ContentEntryArea.java b/org.argeo.app.ui/src/org/argeo/app/ui/library/ContentEntryArea.java index 6b50e93..d1a349f 100644 --- a/org.argeo.app.ui/src/org/argeo/app/ui/library/ContentEntryArea.java +++ b/org.argeo.app.ui/src/org/argeo/app/ui/library/ContentEntryArea.java @@ -46,8 +46,7 @@ public class ContentEntryArea implements SwtUiProvider { contentPart.onSelected((o) -> { Content c = (Content) o; log.debug(c.getPath()); - // cmsView.sendEvent(SuiteEvent.refreshPart.topic(), - // SuiteEvent.eventProperties(c)); + cmsView.sendEvent(SuiteEvent.refreshPart.topic(), SuiteEvent.eventProperties(c)); }); return view; } diff --git a/org.argeo.app.ui/src/org/argeo/app/ui/publish/PublishUiProvider.java b/org.argeo.app.ui/src/org/argeo/app/ui/publish/PublishUiProvider.java index a077372..ed7e1ef 100644 --- a/org.argeo.app.ui/src/org/argeo/app/ui/publish/PublishUiProvider.java +++ b/org.argeo.app.ui/src/org/argeo/app/ui/publish/PublishUiProvider.java @@ -1,7 +1,8 @@ package org.argeo.app.ui.publish; import org.argeo.api.acr.Content; -import org.argeo.app.ux.docbook.DocBookViewer; +import org.argeo.api.cms.ux.CmsEditable; +import org.argeo.app.swt.docbook.DocBookViewer; import org.argeo.cms.swt.acr.SwtUiProvider; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; @@ -10,8 +11,10 @@ public class PublishUiProvider implements SwtUiProvider { @Override public Control createUiPart(Composite parent, Content context) { - DocBookViewer docBookViewer = new DocBookViewer(parent, 0, context); - return docBookViewer; + DocBookViewer docBookViewer = new DocBookViewer(parent, 0, context, CmsEditable.NON_EDITABLE); +// docBookViewer.setLayoutData(CmsSwtUtils.fillAll()); + docBookViewer.refresh(); + return docBookViewer.getControl(); } } diff --git a/org.argeo.app.ux/bnd.bnd b/org.argeo.app.ux/bnd.bnd deleted file mode 100644 index e69de29..0000000 diff --git a/org.argeo.app.ux/src/org/argeo/app/ux/docbook/DocBookViewer.java b/org.argeo.app.ux/src/org/argeo/app/ux/docbook/DocBookViewer.java deleted file mode 100644 index d53b2a7..0000000 --- a/org.argeo.app.ux/src/org/argeo/app/ux/docbook/DocBookViewer.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.argeo.app.ux.docbook; - -import org.argeo.api.acr.Content; -import org.argeo.cms.swt.acr.ContentComposite; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Label; - -public class DocBookViewer extends ContentComposite { - - public DocBookViewer(Composite parent, int style, Content item) { - super(parent, style, item); - new Label(parent, 0).setText(item.toString()); - } - -} -- 2.30.2