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;
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;
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. */
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);
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)) {
}
// 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);
updateContent(paragraph);
paragraph.setLayoutData(fillWidth());
paragraph.setMouseListener(getMouseListener());
+ paragraph.setFocusListener(getFocusListener());
return paragraph;
}
img.setLayoutData(CmsUiUtils.grabWidth(SWT.CENTER, SWT.DEFAULT));
updateContent(img);
img.setMouseListener(getMouseListener());
+ img.setFocusListener(getFocusListener());
return img;
} catch (RepositoryException e) {
throw new JcrException("Cannot add new image " + node, e);
DocBookSectionTitle title = new DocBookSectionTitle(titleParent, style, titleNode);
updateContent(title);
title.setMouseListener(getMouseListener());
+ title.setFocusListener(getFocusListener());
return title;
}
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();
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);
}
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" });
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);
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();
// 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);
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
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));
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);
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));
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());
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();
}
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();
}
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));
+ }
}
}
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) {