--- /dev/null
+package org.argeo.entity;
+
+import java.util.List;
+
+/**
+ * A name within a {@link Typology}, used to qualify an entity (categories,
+ * keywords, etc.).
+ */
+public interface Term {
+ String getId();
+
+ String getName();
+
+// String getRelativePath();
+
+ Typology getTypology();
+
+ List<? extends Term> getSubTerms();
+
+ Term getParentTerm();
+
+}
/** Provides optimised access and utilities around terms typologies. */
public interface TermsManager {
- List<String> listAllTerms(String typology);
+ Typology getTypology(String typology);
+
+ Term getTerm(String id);
+
+ List<Term> listAllTerms(String typology);
+
}
--- /dev/null
+package org.argeo.entity;
+
+import java.util.List;
+
+/** A structured and exhaustive set of {@link Term}s. */
+public interface Typology {
+
+ String getId();
+
+ boolean isFlat();
+
+ List<? extends Term> getSubTerms();
+
+}
import javax.jcr.Item;
+import org.argeo.cms.Localized;
import org.argeo.cms.ui.CmsTheme;
import org.argeo.cms.ui.util.CmsIcon;
import org.argeo.cms.ui.viewers.EditablePart;
import org.argeo.cms.ui.widgets.ContextOverlay;
import org.argeo.cms.ui.widgets.StyledControl;
+import org.argeo.entity.Term;
import org.argeo.entity.TermsManager;
+import org.argeo.entity.Typology;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.layout.GridData;
public abstract class AbstractTermsPart extends StyledControl implements EditablePart {
private static final long serialVersionUID = -5497097995341927710L;
protected final TermsManager termsManager;
- protected final String typology;
+ protected final Typology typology;
protected final boolean editable;
protected final CmsTheme theme;
- public AbstractTermsPart(Composite parent, int style, Item item, TermsManager termsManager,
- String typology) {
+ public AbstractTermsPart(Composite parent, int style, Item item, TermsManager termsManager, String typology) {
super(parent, style, item);
- if(item==null)
+ if (item == null)
throw new IllegalArgumentException("Item cannot be null");
this.termsManager = termsManager;
- this.typology = typology;
+ this.typology = termsManager.getTypology(typology);
this.theme = CmsTheme.getCmsTheme(parent);
editable = !(SWT.READ_ONLY == (style & SWT.READ_ONLY));
highlightColor = parent.getDisplay().getSystemColor(SWT.COLOR_GRAY);
}
- protected String getTermLabel(String name) {
- return name;
+ protected String getTermLabel(Term term) {
+ if (term instanceof Localized)
+ return ((Localized) term).lead();
+ else
+ return term.getName();
+
}
protected abstract void refresh(ContextOverlay contextArea, String filter, Text txt);
- protected boolean isTermSelectable(String term) {
+ protected boolean isTermSelectable(Term term) {
return true;
}
- protected void processTermListLabel(String term, Label label) {
+ protected void processTermListLabel(Term term, Label label) {
}
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;
Composite placeholder = new Composite(box, SWT.NONE);
RowLayout rl = new RowLayout(SWT.HORIZONTAL | SWT.WRAP);
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);
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);
});
@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);
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();
});
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)
+ for (String str : curr) {
+ Term term = termsManager.getTerm(str);
+ 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());
+ }
+
}
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;
ToolItem deleteItem = new ToolItem(toolBar, SWT.PUSH);
styleDelete(deleteItem);
deleteItem.addSelectionListener((Selected) (e) -> {
- Jcr.set(getNode(), typology, null);
- Jcr.save(getNode());
+ setValue(null);
stopEditing();
});
ToolItem cancelItem = new ToolItem(toolBar, SWT.PUSH);
} else {
Composite block = new Composite(box, SWT.NONE);
block.setLayout(CmsUiUtils.noSpaceGridLayout(2));
- String currentValue = Jcr.get(getNode(), typology);
+ Term currentValue = getValue();
if (currentValue != null) {
Label lbl = new Label(block, SWT.SINGLE);
String display = getTermLabel(currentValue);
@Override
protected void refresh(ContextOverlay contextArea, String filter, Text txt) {
CmsUiUtils.clear(contextArea);
- List<String> terms = termsManager.listAllTerms(typology);
- terms: for (String term : terms) {
+ List<? extends Term> terms = termsManager.listAllTerms(typology.getId());
+ terms: for (Term term : terms) {
String display = getTermLabel(term);
if (filter != null && !display.toLowerCase().contains(filter))
continue terms;
processTermListLabel(term, termL);
if (isTermSelectable(term))
termL.addMouseListener((MouseDown) (e) -> {
- Jcr.set(getNode(), typology, term);
- Jcr.save(getNode());
+ setValue(term);
contextArea.hide();
stopEditing();
});
// txt.setFocus();
}
+ protected Term getValue() {
+ String property = typology.getId();
+ String id = Jcr.get(getNode(), property);
+ Term term = termsManager.getTerm(id);
+
+ return term;
+ }
+
+ protected void setValue(Term value) {
+ String property = typology.getId();
+ Jcr.set(getNode(), property, value != null ? value.getId() : null);
+ Jcr.save(getNode());
+ }
}
import java.util.ArrayList;
import java.util.List;
+import org.argeo.entity.Term;
+
/**
* A single term. Helper to optimise {@link SuiteTermsManager} implementation.
*/
-class SuiteTerm {
+class SuiteTerm implements Term {
private final String name;
private final String relativePath;
private final SuiteTypology typology;
this.relativePath = relativePath;
int index = relativePath.lastIndexOf('/');
if (index > 0) {
- this.name = relativePath.substring(index);
+ this.name = relativePath.substring(index + 1);
} else {
this.name = relativePath;
}
id = typology.getName() + '/' + relativePath;
}
+ @Override
+ public String getId() {
+ return id;
+ }
+
+ @Override
public String getName() {
return name;
}
return relativePath;
}
- SuiteTypology getTypology() {
+ @Override
+ public SuiteTypology getTypology() {
return typology;
}
- public String getId() {
- return id;
- }
-
- List<SuiteTerm> getSubTerms() {
+ @Override
+ public List<SuiteTerm> getSubTerms() {
return subTerms;
}
- SuiteTerm getParentTerm() {
+ @Override
+ public SuiteTerm getParentTerm() {
return parentTerm;
}
import org.argeo.api.NodeUtils;
import org.argeo.entity.EntityNames;
import org.argeo.entity.EntityType;
+import org.argeo.entity.Term;
import org.argeo.entity.TermsManager;
import org.argeo.jcr.Jcr;
import org.argeo.jcr.JcrException;
}
@Override
- public List<String> listAllTerms(String typology) {
- List<String> res = new ArrayList<>();
+ public List<Term> listAllTerms(String typology) {
+ List<Term> res = new ArrayList<>();
SuiteTypology t = getTypology(typology);
for (SuiteTerm term : t.getAllTerms()) {
- res.add(term.getId());
+ res.add(term);
}
return res;
}
- SuiteTypology getTypology(String typology) {
+ @Override
+ public SuiteTerm getTerm(String termId) {
+ return terms.get(termId);
+ }
+
+ @Override
+ public SuiteTypology getTypology(String typology) {
SuiteTypology t = typologies.get(typology);
if (t == null) {
Node termsNode = Jcr.getNode(adminSession, "SELECT * FROM [{0}] WHERE NAME()=\"{1}\"",
import javax.jcr.Node;
+import org.argeo.entity.Term;
+import org.argeo.entity.Typology;
import org.argeo.jcr.Jcr;
/** A typology. Helper to optimise {@link SuiteTermsManager} implementation. */
-class SuiteTypology {
+class SuiteTypology implements Typology {
private final String name;
private final Node node;
private boolean isFlat = true;
this.name = Jcr.getName(this.node);
}
+ @Override
+ public String getId() {
+ return name;
+ }
+
public String getName() {
return name;
}
isFlat = false;
}
+ @Override
public boolean isFlat() {
return isFlat;
}
+ @Override
public List<SuiteTerm> getSubTerms() {
return subTerms;
}