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}