001package org.nasdanika.html.ecore;
002
003import java.util.Collection;
004import java.util.Objects;
005import java.util.function.BiFunction;
006import java.util.function.Function;
007import java.util.function.Predicate;
008
009import org.eclipse.emf.ecore.EClass;
010import org.eclipse.emf.ecore.EClassifier;
011import org.eclipse.emf.ecore.EModelElement;
012import org.eclipse.emf.ecore.ENamedElement;
013import org.eclipse.emf.ecore.EPackage;
014import org.nasdanika.common.Context;
015import org.nasdanika.common.ProgressMonitor;
016import org.nasdanika.exec.content.ContentFactory;
017import org.nasdanika.exec.content.Text;
018import org.nasdanika.html.model.app.Action;
019
020public class EClassifierActionSupplier<T extends EClassifier> extends ENamedElementActionSupplier<T> {
021
022        private Function<String, String> javadocResolver;
023        protected Class<?> instanceClass;
024        protected Function<String, Object> ePackageResolver;
025
026        public EClassifierActionSupplier(
027                        T value, 
028                        Context context, 
029                        java.util.function.Function<EPackage,String> ePackagePathComputer,
030                        java.util.function.Function<String, String> javadocResolver,
031                        java.util.function.Function<String, Object> ePackageResolver,
032                        Predicate<EModelElement> elementPredicate,
033                        BiFunction<ENamedElement, String, String> labelProvider) {
034                super(value, context, ePackagePathComputer, elementPredicate, labelProvider);
035                this.javadocResolver = javadocResolver;
036                this.ePackageResolver = ePackageResolver;
037                instanceClass = getInstanceClass(value, ePackageResolver);
038        }
039        
040        @Override
041        protected void header(Action action, ProgressMonitor progressMonitor) {
042                if (instanceClass != null) {
043                        String instanceClassName = instanceClass.getName();
044                        if (javadocResolver != null) {
045                                instanceClassName = javadocResolver.apply(instanceClassName);
046                        }
047                        
048                        Text text = ContentFactory.eINSTANCE.createText();
049                        text.setContent("<div class='text-monospace'>" + instanceClassName + "</div>");
050                        action.getContent().add(text);
051                }               
052        }
053        
054        @Override
055        public Action execute(EClass contextEClass, ProgressMonitor progressMonitor) {
056                Action action = super.execute(contextEClass, progressMonitor);
057                action.setLocation(eObject.getName() + ".html");
058                action.setId(eObject.eClass().getName() + "-" + encodeEPackage(eObject.getEPackage()) + "-" + eObject.getName());
059                action.getUris().add(eObject.getEPackage().getNsURI() + "#" + eObject.getName());
060                return action;
061        }
062        
063        @Override
064        protected String getDefaultLabel(ProgressMonitor progressMonitor) {
065                return eObject.getName() + typeParameters(eObject);
066        }
067        
068        /**
069         * Finds all type uses in the resourceset. 
070         * @return
071         */
072        protected Collection<EClass> getUses() {
073                return getUses(eObject);
074        }
075        
076}