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=814cfb3415e129dcdc28164e27ad72f03d7f78ed;hp=a4755c7114b1c1dc9aafe6757e89d1284cc011d1;hb=44909f08709dd0bde1284e203a2495f03a613ed8;hpb=70010c4afc5799622fcad5b075740d94da074798 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 a4755c7..814cfb3 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 @@ -5,10 +5,6 @@ import static org.argeo.docbook.DbkType.para; import static org.argeo.docbook.DbkUtils.addDbk; import static org.argeo.docbook.DbkUtils.isDbk; -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; @@ -54,8 +50,11 @@ 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.layout.GridData; 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. */ @@ -73,6 +72,10 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke private final boolean flat; + private boolean showMainTitle = true; + + private Integer maxMediaWidth = null; + protected AbstractDbkViewer(Section parent, int style, CmsEditable cmsEditable) { super(parent, style, cmsEditable); // CmsView cmsView = CmsView.getCmsView(parent); @@ -104,22 +107,26 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke Node node = section.getNode(); TextSection textSection = (TextSection) section; if (node.hasNode(DbkType.title.get())) { - if (section.getHeader() == null) - section.createHeader(); - Node titleNode = node.getNode(DbkType.title.get()); - DocBookSectionTitle title = newSectionTitle(textSection, titleNode); - title.setLayoutData(CmsUiUtils.fillWidth()); - updateContent(title); + boolean showTitle = getMainSection() == section ? showMainTitle : true; + if (showTitle) { + if (section.getHeader() == null) + section.createHeader(); + 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, DbkType.mediaobject)) { - if (child.hasNode(DbkType.imageobject.get())) { - Node imageDataNode = child.getNode(DbkType.imageobject.get()).getNode(DbkType.imagedata.get()); - sectionPart = newImg(textSection, imageDataNode); - } + sectionPart = newImg(textSection, child); +// 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)) { sectionPart = newParagraph(textSection, child); } else { @@ -159,15 +166,25 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke updateContent(paragraph); paragraph.setLayoutData(fillWidth()); paragraph.setMouseListener(getMouseListener()); + paragraph.setFocusListener(getFocusListener()); return paragraph; } protected DbkImg newImg(TextSection parent, Node node) { try { DbkImg img = new DbkImg(parent, parent.getStyle(), node, imageManager); - img.setLayoutData(CmsUiUtils.grabWidth(SWT.CENTER, SWT.DEFAULT)); + GridData imgGd; + if (maxMediaWidth != null) { + imgGd = new GridData(SWT.CENTER, SWT.FILL, false, false); + imgGd.widthHint = maxMediaWidth; + img.setPreferredSize(new Point(maxMediaWidth, 0)); + } else { + imgGd = CmsUiUtils.grabWidth(SWT.CENTER, SWT.DEFAULT); + } + img.setLayoutData(imgGd); updateContent(img); img.setMouseListener(getMouseListener()); + img.setFocusListener(getFocusListener()); return img; } catch (RepositoryException e) { throw new JcrException("Cannot add new image " + node, e); @@ -182,6 +199,7 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke DocBookSectionTitle title = new DocBookSectionTitle(titleParent, style, titleNode); updateContent(title); title.setMouseListener(getMouseListener()); + title.setFocusListener(getFocusListener()); return title; } @@ -315,7 +333,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" }); @@ -344,22 +373,47 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke } } - void insertPart(Section section, Node node) { + SectionPart insertPart(Section section, Node node) { try { refresh(section); layoutPage(); + for (Control control : section.getChildren()) { + if (control instanceof SectionPart) { + SectionPart sectionPart = (SectionPart) control; + Node partNode = sectionPart.getNode(); + if (partNode.getPath().equals(node.getPath())) + return sectionPart; + } + } + throw new IllegalStateException("New section part " + node + "not found"); } catch (RepositoryException e) { throw new JcrException("Cannot insert part " + node + " in section " + section.getNode(), e); } } + void addParagraph(SectionPart partBefore, String txt) { + Section section = partBefore.getSection(); + SectionPart nextSectionPart = section.nextSectionPart(partBefore); + Node newNode = addDbk(section.getNode(), para); + textInterpreter.write(newNode, txt != null ? txt : ""); + if (nextSectionPart != null) { + try { + Node nextNode = nextSectionPart.getNode(); + section.getNode().orderBefore(Jcr.getIndexedName(newNode), Jcr.getIndexedName(nextNode)); + } catch (RepositoryException e) { + throw new JcrException("Cannot order " + newNode + " before " + nextSectionPart.getNode(), e); + } + } + Jcr.save(newNode); + Paragraph paragraph = (Paragraph) insertPart(partBefore.getSection(), newNode); + edit(paragraph, 0); + } + void deletePart(SectionPart sectionPart) { try { Node node = sectionPart.getNode(); Session session = node.getSession(); if (sectionPart instanceof DbkImg) { - // FIXME make it more robust - node = node.getParent().getParent(); if (!isDbk(node, DbkType.mediaobject)) throw new IllegalArgumentException("Node " + node + " is not a media object."); } @@ -843,8 +897,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)); + } } } @@ -870,27 +938,12 @@ 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 setMaxMediaWidth(Integer maxMediaWidth) { + this.maxMediaWidth = maxMediaWidth; } - 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); - } + public void setShowMainTitle(boolean showMainTitle) { + this.showMainTitle = showMainTitle; } // FILE UPLOAD LISTENER