package org.argeo.docbook.ui; import java.util.ArrayList; import java.util.List; import javax.jcr.Node; import org.argeo.cms.text.Paragraph; import org.argeo.cms.text.TextSection; import org.argeo.cms.ui.CmsEditable; import org.argeo.cms.ui.util.CmsUiUtils; import org.argeo.cms.ui.viewers.EditablePart; import org.argeo.cms.ui.viewers.NodePart; 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.Img; import org.argeo.docbook.DbkMsg; import org.argeo.docbook.DbkUtils; import org.argeo.eclipse.ui.MouseDown; import org.argeo.jcr.Jcr; import org.eclipse.rap.rwt.RWT; import org.eclipse.swt.SWT; import org.eclipse.swt.events.MouseAdapter; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.events.ShellEvent; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; /** Dialog to edit a text part. */ class DbkContextMenu { private final AbstractDbkViewer textViewer; private Shell shell; DbkContextMenu(AbstractDbkViewer textViewer, Shell parentShell) { // shell = new Shell(display, SWT.NO_TRIM | SWT.BORDER | SWT.ON_TOP); shell = new Shell(parentShell, SWT.BORDER); // super(display, SWT.NO_TRIM | SWT.BORDER | SWT.ON_TOP); this.textViewer = textViewer; shell.setLayout(new GridLayout()); // shell.setData(RWT.CUSTOM_VARIANT, TEXT_STYLED_TOOLS_DIALOG); shell.addShellListener(new ToolsShellListener()); } void show(EditablePart editablePart, Point location, List availableStyles) { if (shell.isVisible()) shell.setVisible(false); CmsUiUtils.clear(shell); Composite parent = shell; CmsEditable cmsEditable = textViewer.getCmsEditable(); // if (availableStyles.isEmpty()) // return; if (editablePart instanceof Paragraph) { Paragraph paragraph = (Paragraph) editablePart; deletePartB(parent, DbkMsg.deleteParagraph.lead(), paragraph); insertMediaB(parent, DbkMsg.insertMedia.lead(), paragraph); } else if (editablePart instanceof Img) { Img img = (Img) editablePart; deletePartB(parent, DbkMsg.deleteMedia.lead(), img); insertMediaB(parent, DbkMsg.insertMedia.lead(), img); } else if (editablePart instanceof DocBookSectionTitle) { DocBookSectionTitle sectionTitle = (DocBookSectionTitle) editablePart; TextSection section = sectionTitle.getSection(); if (!section.isTitleReadOnly()) { Label deleteB = new Label(shell, SWT.NONE); deleteB.setText(DbkMsg.deleteSection.lead()); deleteB.addMouseListener((MouseDown) (e) -> { textViewer.deleteSection(section); hide(); }); } insertMediaB(parent, DbkMsg.insertMedia.lead(), sectionTitle.getSection(), sectionTitle); } StyledToolMouseListener stml = new StyledToolMouseListener(editablePart); List styleButtons = new ArrayList(); if (cmsEditable.isEditing()) { for (String style : availableStyles) { StyleButton styleButton = new StyleButton(shell, SWT.WRAP); if (!"".equals(style)) styleButton.setStyle(style); else styleButton.setStyle(null); styleButton.setMouseListener(stml); styleButtons.add(styleButton); } } else if (cmsEditable.canEdit()) { // Edit // Label editButton = new Label(shell, SWT.NONE); // editButton.setText("Edit"); // editButton.addMouseListener(stml); } if (editablePart instanceof Paragraph) { final int size = 32; String text = textViewer.getRawParagraphText((Paragraph) editablePart); String textToShow = text.length() > size ? text.substring(0, size - 3) + "..." : text; for (StyleButton styleButton : styleButtons) { styleButton.setText((styleButton.style == null ? "default" : styleButton.style) + " : " + textToShow); } } shell.pack(); shell.layout(); if (editablePart instanceof Control) { int height = shell.getSize().y; int parentShellHeight = shell.getShell().getSize().y; if ((location.y + height) < parentShellHeight) { shell.setLocation(((Control) editablePart).toDisplay(location.x, location.y)); } else { shell.setLocation(((Control) editablePart).toDisplay(location.x, location.y - parentShellHeight)); } } if (shell.getChildren().length != 0) shell.open(); } void hide() { shell.setVisible(false); } protected void insertMediaB(Composite parent, String msg, SectionPart sectionPart) { insertMediaB(parent, msg, sectionPart.getSection(), sectionPart); } protected void insertMediaB(Composite parent, String msg, Section section, NodePart nodePart) { Label insertMediaB = new Label(parent, SWT.NONE); insertMediaB.setText(DbkMsg.insertMedia.lead()); insertMediaB.addMouseListener((MouseDown) (e) -> { Node newNode = DbkUtils.insertImageAfter(nodePart.getNode()); Jcr.save(newNode); textViewer.insertPart(section, newNode); hide(); }); } protected void deletePartB(Composite parent, String msg, SectionPart sectionPart) { Label deleteB = new Label(shell, SWT.NONE); deleteB.setText(msg); deleteB.addMouseListener((MouseDown) (e) -> { textViewer.deletePart(sectionPart); hide(); }); } class StyleButton extends EditableText { private static final long serialVersionUID = 7731102609123946115L; String style; public StyleButton(Composite parent, int style) { super(parent, style); } @Override public void setStyle(String style) { this.style = style; super.setStyle(style); } // private Label label; // // public StyleButton(Composite parent, int swtStyle) { // super(parent, SWT.NONE); // setLayout(new GridLayout()); // label = new Label(this, swtStyle); // } // // public Label getLabel() { // return label; // } } class StyledToolMouseListener extends MouseAdapter { private static final long serialVersionUID = 8516297091549329043L; private EditablePart editablePart; public StyledToolMouseListener(EditablePart editablePart) { super(); this.editablePart = editablePart; } @Override public void mouseDown(MouseEvent e) { // TODO make it more robust. Label sb = (Label) e.getSource(); Object style = sb.getData(RWT.CUSTOM_VARIANT); textViewer.setParagraphStyle((Paragraph) editablePart, style == null ? null : style.toString()); hide(); } } class ToolsShellListener extends org.eclipse.swt.events.ShellAdapter { private static final long serialVersionUID = 8432350564023247241L; @Override public void shellDeactivated(ShellEvent e) { hide(); } } }