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%2FDbkContextMenu.java;h=24a759c60ff06c963f2511da6e3fcd1f09ef99a6;hp=928fb7701fcfe755624febe18d0696561ec021be;hb=06db6a211a46ba994d007e30f62704165c413177;hpb=147ada7da5bf6292569f17a53a77fca04c97f707 diff --git a/publishing/org.argeo.publishing.ui/src/org/argeo/docbook/ui/DbkContextMenu.java b/publishing/org.argeo.publishing.ui/src/org/argeo/docbook/ui/DbkContextMenu.java index 928fb77..24a759c 100644 --- a/publishing/org.argeo.publishing.ui/src/org/argeo/docbook/ui/DbkContextMenu.java +++ b/publishing/org.argeo.publishing.ui/src/org/argeo/docbook/ui/DbkContextMenu.java @@ -3,10 +3,23 @@ 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.cms.ui.widgets.TextStyles; +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; @@ -16,114 +29,177 @@ 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.Display; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; /** Dialog to edit a text part. */ class DbkContextMenu implements TextStyles { - private final static String[] DEFAULT_TEXT_STYLES = { TextStyles.TEXT_DEFAULT, TextStyles.TEXT_PRE, - TextStyles.TEXT_QUOTE }; - private final AbstractDbkViewer textViewer; - private List styleButtons = new ArrayList(); - - private Label deleteButton, publishButton, editButton; - - private EditablePart currentTextPart; - private Shell shell; - public DbkContextMenu(AbstractDbkViewer textViewer, Display display) { - shell = new Shell(display, SWT.NO_TRIM | SWT.BORDER | SWT.ON_TOP); + 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); - - StyledToolMouseListener stml = new StyledToolMouseListener(); - if (textViewer.getCmsEditable().isEditing()) { - for (String style : DEFAULT_TEXT_STYLES) { - StyleButton styleButton = new StyleButton(shell, SWT.WRAP); - styleButton.getLabel().setData(RWT.CUSTOM_VARIANT, style); - styleButton.getLabel().setData(RWT.MARKUP_ENABLED, true); - styleButton.getLabel().addMouseListener(stml); - styleButtons.add(styleButton); - } - - // Delete - deleteButton = new Label(shell, SWT.NONE); - deleteButton.setText("Delete"); - deleteButton.addMouseListener(stml); + // shell.setData(RWT.CUSTOM_VARIANT, TEXT_STYLED_TOOLS_DIALOG); - // Publish - publishButton = new Label(shell, SWT.NONE); - publishButton.setText("Publish"); - publishButton.addMouseListener(stml); - } else if (textViewer.getCmsEditable().canEdit()) { - // Edit - editButton = new Label(shell, SWT.NONE); - editButton.setText("Edit"); - editButton.addMouseListener(stml); - } shell.addShellListener(new ToolsShellListener()); } - public void show(EditablePart source, Point location) { + 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); + } - this.currentTextPart = source; + 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 (currentTextPart instanceof Paragraph) { + if (editablePart instanceof Paragraph) { final int size = 32; - String text = textViewer.getRawParagraphText((Paragraph) currentTextPart); + String text = textViewer.getRawParagraphText((Paragraph) editablePart); String textToShow = text.length() > size ? text.substring(0, size - 3) + "..." : text; for (StyleButton styleButton : styleButtons) { - styleButton.getLabel().setText(textToShow); + styleButton.setText((styleButton.style == null ? "default" : styleButton.style) + " : " + textToShow); } } + shell.pack(); shell.layout(); - if (source instanceof Control) - shell.setLocation(((Control) source).toDisplay(location.x, location.y)); - shell.open(); + 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(); + }); + } - class StyleButton extends Composite { + 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; - private Label label; - public StyleButton(Composite parent, int swtStyle) { - super(parent, SWT.NONE); - label = new Label(this, swtStyle); + String style; + + public StyleButton(Composite parent, int style) { + super(parent, style); } - public Label getLabel() { - return label; + @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) { - Object eventSource = e.getSource(); - if (eventSource instanceof StyleButton) { - StyleButton sb = (StyleButton) e.getSource(); - String style = sb.getData(RWT.CUSTOM_VARIANT).toString(); - textViewer.setParagraphStyle((Paragraph) currentTextPart, style); - } else if (eventSource == deleteButton) { - textViewer.deletePart((SectionPart) currentTextPart); - } else if (eventSource == editButton) { - textViewer.getCmsEditable().startEditing(); - } else if (eventSource == publishButton) { - textViewer.getCmsEditable().stopEditing(); - } - shell.setVisible(false); + // 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(); } } @@ -132,7 +208,7 @@ class DbkContextMenu implements TextStyles { @Override public void shellDeactivated(ShellEvent e) { - shell.setVisible(false); + hide(); } }