From 62fe0d412eea802492a6d2a3fee8384ec1d685ae Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Thu, 21 Jan 2021 14:53:15 +0100 Subject: [PATCH] Introduce terms editable part. --- org.argeo.entity.ui/bnd.bnd | 3 + .../entity/ui/forms/TermsEditablePart.java | 120 ++++++++++++++++++ .../org/argeo/docbook/ui/DbkContextMenu.java | 3 +- 3 files changed, 124 insertions(+), 2 deletions(-) create mode 100644 org.argeo.entity.ui/src/org/argeo/entity/ui/forms/TermsEditablePart.java diff --git a/org.argeo.entity.ui/bnd.bnd b/org.argeo.entity.ui/bnd.bnd index e69de29..e7cd4cb 100644 --- a/org.argeo.entity.ui/bnd.bnd +++ b/org.argeo.entity.ui/bnd.bnd @@ -0,0 +1,3 @@ +Import-Package:\ +org.eclipse.swt,\ +* \ No newline at end of file diff --git a/org.argeo.entity.ui/src/org/argeo/entity/ui/forms/TermsEditablePart.java b/org.argeo.entity.ui/src/org/argeo/entity/ui/forms/TermsEditablePart.java new file mode 100644 index 0000000..7440822 --- /dev/null +++ b/org.argeo.entity.ui/src/org/argeo/entity/ui/forms/TermsEditablePart.java @@ -0,0 +1,120 @@ +package org.argeo.entity.ui.forms; + +import java.util.List; + +import javax.jcr.Item; + +import org.argeo.cms.ui.forms.FormStyle; +import org.argeo.cms.ui.util.CmsUiUtils; +import org.argeo.cms.ui.viewers.EditablePart; +import org.argeo.cms.ui.widgets.ContextOverlay; +import org.argeo.cms.ui.widgets.StyledControl; +import org.argeo.eclipse.ui.MouseDoubleClick; +import org.argeo.eclipse.ui.MouseDown; +import org.argeo.entity.TermsManager; +import org.argeo.jcr.Jcr; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.FocusEvent; +import org.eclipse.swt.events.FocusListener; +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.Text; + +/** {@link EditablePart} for terms. */ +public class TermsEditablePart extends StyledControl implements EditablePart { + private static final long serialVersionUID = -4961135649177920808L; + private TermsManager termsManager; + private String typology; + + public TermsEditablePart(Composite parent, int style, Item item, TermsManager termsManager, String typology) { + super(parent, style, item); + this.termsManager = termsManager; + this.typology = typology; + } + + @Override + protected Control createControl(Composite box, String style) { + if (isEditing()) { + Text txt = new Text(box, SWT.SINGLE | SWT.BORDER); + CmsUiUtils.style(txt, style == null ? FormStyle.propertyText.style() : style); + + ContextOverlay contextOverlay = new ContextOverlay(txt, SWT.NONE) { + private static final long serialVersionUID = -7980078594405384874L; + + @Override + protected void onHide() { + stopEditing(); + } + }; + contextOverlay.setLayout(new GridLayout()); + // filter + txt.addModifyListener((e) -> { + String filter = txt.getText().toLowerCase(); + if ("".equals(filter.trim())) + filter = null; + refresh(contextOverlay, filter, txt); + }); + txt.addFocusListener(new FocusListener() { + private static final long serialVersionUID = -6024501573409619949L; + + @Override + public void focusLost(FocusEvent event) { +// if (!contextOverlay.isDisposed() && contextOverlay.isShellVisible()) +// getDisplay().asyncExec(() -> stopEditing()); + } + + @Override + public void focusGained(FocusEvent event) { + // txt.setText(""); + if (!contextOverlay.isDisposed() && !contextOverlay.isShellVisible()) + refresh(contextOverlay, null, txt); + } + }); + layout(new Control[] { txt }); + getDisplay().asyncExec(() -> txt.setFocus()); + return txt; + } else { + Label lbl = new Label(box, SWT.SINGLE); + // lbl.setEditable(false); + String currentValue = Jcr.get(getNode(), typology); + if (currentValue != null) { + String display = getTermLabel(currentValue); + lbl.setText(display); + } else + lbl.setText("[" + typology + "]"); + CmsUiUtils.style(lbl, style == null ? FormStyle.propertyText.style() : style); + + lbl.addMouseListener((MouseDoubleClick) (e) -> { + startEditing(); + }); + return lbl; + } + } + + protected String getTermLabel(String name) { + return name; + } + + protected void refresh(ContextOverlay contextArea, String filter, Text txt) { + CmsUiUtils.clear(contextArea); + List terms = termsManager.listAllTerms(typology); + terms: for (String term : terms) { + String display = getTermLabel(term); + if (filter != null && !display.toLowerCase().contains(filter)) + continue terms; + Label termL = new Label(contextArea, SWT.WRAP); + termL.setText(display); + termL.addMouseListener((MouseDown) (e) -> { + Jcr.set(getNode(), typology, term); + Jcr.save(getNode()); + contextArea.hide(); + stopEditing(); + }); + } + contextArea.show(); + // txt.setFocus(); + } + +} 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 24a759c..ef2695a 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 @@ -15,7 +15,6 @@ 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; @@ -33,7 +32,7 @@ import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; /** Dialog to edit a text part. */ -class DbkContextMenu implements TextStyles { +class DbkContextMenu { private final AbstractDbkViewer textViewer; private Shell shell; -- 2.30.2