001package org.nasdanika.html.ecore; 002 003import java.util.function.BiFunction; 004import java.util.function.Predicate; 005 006import org.eclipse.emf.common.util.EList; 007import org.eclipse.emf.ecore.EAttribute; 008import org.eclipse.emf.ecore.EClass; 009import org.eclipse.emf.ecore.EModelElement; 010import org.eclipse.emf.ecore.ENamedElement; 011import org.eclipse.emf.ecore.EPackage; 012import org.eclipse.emf.ecore.EReference; 013import org.nasdanika.common.Context; 014import org.nasdanika.common.ProgressMonitor; 015import org.nasdanika.html.bootstrap.Table; 016import org.nasdanika.ncore.util.NcoreUtil; 017 018public class EReferenceActionSupplier extends EStructuralFeatureActionSupplier<EReference> { 019 020 public EReferenceActionSupplier( 021 EReference value, 022 Context context, 023 java.util.function.Function<EPackage,String> ePackagePathComputer, 024 Predicate<EModelElement> elementPredicate, 025 BiFunction<ENamedElement, String, String> labelProvider) { 026 super(value, context, ePackagePathComputer, elementPredicate, labelProvider); 027 } 028 029 @Override 030 protected Table propertiesTable(EClass contextEClass, ProgressMonitor monitor) { 031 Table propertiesTable = super.propertiesTable(contextEClass, monitor); 032 EReference opposite = NcoreUtil.getOpposite(eObject); 033 if (opposite != null) { 034 addRow(propertiesTable, "Opposite").add(link(opposite, contextEClass)); 035 } 036 EList<EAttribute> eKeys = eObject.getEKeys(); 037 if (!eKeys.isEmpty()) { 038 if (eKeys.size() == 1) { 039 addRow(propertiesTable, "Key").add(eKeys.get(0).getName()); 040 } else { 041 StringBuilder vb = new StringBuilder("<ol>"); 042 eKeys.forEach(eKey -> vb.append("<li>").append(eKey.getName()).append("</li>")); 043 vb.append("</ol>"); 044 addRow(propertiesTable, "Key").add(vb.toString()); 045 } 046 } 047 return propertiesTable; 048 } 049 050}