Make multi terms more robust when an existing term has changed.
[gpl/argeo-suite.git] / core / org.argeo.entity.ui / src / org / argeo / entity / ui / forms / MultiTermsPart.java
index 1a12e90f2a5d458aaf6eb88ce5c65d603d417b96..436cc17b89457e9e99c62ccfd65fca6249873953 100644 (file)
@@ -5,6 +5,8 @@ import java.util.List;
 
 import javax.jcr.Item;
 
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 import org.argeo.cms.ui.forms.FormStyle;
 import org.argeo.cms.ui.util.CmsUiUtils;
 import org.argeo.cms.ui.viewers.EditablePart;
@@ -12,6 +14,7 @@ import org.argeo.cms.ui.widgets.ContextOverlay;
 import org.argeo.eclipse.ui.MouseDoubleClick;
 import org.argeo.eclipse.ui.MouseDown;
 import org.argeo.eclipse.ui.Selected;
+import org.argeo.entity.Term;
 import org.argeo.entity.TermsManager;
 import org.argeo.jcr.Jcr;
 import org.eclipse.swt.SWT;
@@ -29,6 +32,7 @@ import org.eclipse.swt.widgets.ToolItem;
 /** {@link EditablePart} for multiple terms. */
 public class MultiTermsPart extends AbstractTermsPart {
        private static final long serialVersionUID = -4961135649177920808L;
+       private final static Log log = LogFactory.getLog(MultiTermsPart.class);
 
        public MultiTermsPart(Composite parent, int style, Item item, TermsManager termsManager, String typology) {
                super(parent, style, item, termsManager, typology);
@@ -37,11 +41,12 @@ public class MultiTermsPart extends AbstractTermsPart {
        @Override
        protected Control createControl(Composite box, String style) {
                Composite placeholder = new Composite(box, SWT.NONE);
-               RowLayout rl = new RowLayout(SWT.HORIZONTAL | SWT.WRAP);
+               RowLayout rl = new RowLayout(SWT.HORIZONTAL);
+               rl.wrap = true;
                placeholder.setLayout(rl);
-               List<String> currentValue = Jcr.getMultiple(getNode(), typology);
+               List<Term> currentValue = getValue();
                if (currentValue != null && !currentValue.isEmpty())
-                       for (String value : currentValue) {
+                       for (Term value : currentValue) {
                                Composite block = new Composite(placeholder, SWT.NONE);
                                block.setLayout(CmsUiUtils.noSpaceGridLayout(3));
                                Label lbl = new Label(block, SWT.SINGLE);
@@ -58,14 +63,13 @@ public class MultiTermsPart extends AbstractTermsPart {
                                        styleDelete(deleteItem);
                                        deleteItem.addSelectionListener((Selected) (e) -> {
                                                // we retrieve them again here because they may have changed
-                                               List<String> curr = Jcr.getMultiple(getNode(), typology);
-                                               List<String> newValue = new ArrayList<>();
-                                               for (String v : curr) {
+                                               List<Term> curr = getValue();
+                                               List<Term> newValue = new ArrayList<>();
+                                               for (Term v : curr) {
                                                        if (!v.equals(value))
                                                                newValue.add(v);
                                                }
-                                               Jcr.set(getNode(), typology, newValue);
-                                               Jcr.save(getNode());
+                                               setValue(newValue);
                                                block.dispose();
                                                layout(true, true);
                                        });
@@ -143,9 +147,9 @@ public class MultiTermsPart extends AbstractTermsPart {
        @Override
        protected void refresh(ContextOverlay contextArea, String filter, Text txt) {
                CmsUiUtils.clear(contextArea);
-               List<String> terms = termsManager.listAllTerms(typology);
-               List<String> currentValue = Jcr.getMultiple(getNode(), typology);
-               terms: for (String term : terms) {
+               List<? extends Term> terms = termsManager.listAllTerms(typology.getId());
+               List<Term> currentValue = getValue();
+               terms: for (Term term : terms) {
                        if (currentValue != null && currentValue.contains(term))
                                continue terms;
                        String display = getTermLabel(term);
@@ -156,13 +160,12 @@ public class MultiTermsPart extends AbstractTermsPart {
                        processTermListLabel(term, termL);
                        if (isTermSelectable(term))
                                termL.addMouseListener((MouseDown) (e) -> {
-                                       List<String> newValue = new ArrayList<>();
-                                       List<String> curr = Jcr.getMultiple(getNode(), typology);
+                                       List<Term> newValue = new ArrayList<>();
+                                       List<Term> curr = getValue();
                                        if (currentValue != null)
                                                newValue.addAll(curr);
                                        newValue.add(term);
-                                       Jcr.set(getNode(), typology, newValue);
-                                       Jcr.save(getNode());
+                                       setValue(newValue);
                                        contextArea.hide();
                                        stopEditing();
                                });
@@ -170,4 +173,30 @@ public class MultiTermsPart extends AbstractTermsPart {
                contextArea.show();
        }
 
+       protected List<Term> getValue() {
+               String property = typology.getId();
+               List<String> curr = Jcr.getMultiple(getNode(), property);
+               List<Term> res = new ArrayList<>();
+               if (curr != null)
+                       terms: for (String str : curr) {
+                               Term term = termsManager.getTerm(str);
+                               if (term == null) {
+                                       log.warn("Ignoring term " + str + " as it was not found.");
+                                       continue terms;
+                               }
+                               res.add(term);
+                       }
+               return res;
+       }
+
+       protected void setValue(List<Term> value) {
+               String property = typology.getId();
+               List<String> ids = new ArrayList<>();
+               for (Term term : value) {
+                       ids.add(term.getId());
+               }
+               Jcr.set(getNode(), property, ids);
+               Jcr.save(getNode());
+       }
+
 }