Introduce terms editable part.
authorMathieu Baudier <mbaudier@argeo.org>
Thu, 21 Jan 2021 13:53:15 +0000 (14:53 +0100)
committerMathieu Baudier <mbaudier@argeo.org>
Thu, 21 Jan 2021 13:53:15 +0000 (14:53 +0100)
org.argeo.entity.ui/bnd.bnd
org.argeo.entity.ui/src/org/argeo/entity/ui/forms/TermsEditablePart.java [new file with mode: 0644]
publishing/org.argeo.publishing.ui/src/org/argeo/docbook/ui/DbkContextMenu.java

index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..e7cd4cb4e8bbdd106f55bfa1375a79a6184d8baa 100644 (file)
@@ -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 (file)
index 0000000..7440822
--- /dev/null
@@ -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<String> 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();
+       }
+
+}
index 24a759c60ff06c963f2511da6e3fcd1f09ef99a6..ef2695a778831db7518994d820472bd3fa286bd0 100644 (file)
@@ -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;