001package org.nasdanika.html.ecore;
002
003import java.util.Collection;
004import java.util.function.BiFunction;
005import java.util.function.Predicate;
006import java.util.stream.Collectors;
007
008import org.eclipse.emf.common.util.EList;
009import org.eclipse.emf.ecore.EClass;
010import org.eclipse.emf.ecore.EEnum;
011import org.eclipse.emf.ecore.EEnumLiteral;
012import org.eclipse.emf.ecore.EModelElement;
013import org.eclipse.emf.ecore.ENamedElement;
014import org.eclipse.emf.ecore.EPackage;
015import org.nasdanika.common.Context;
016import org.nasdanika.common.ProgressMonitor;
017import org.nasdanika.html.Tag;
018import org.nasdanika.html.TagName;
019import org.nasdanika.html.model.app.Action;
020import org.nasdanika.html.model.app.AppFactory;
021import org.nasdanika.html.model.app.SectionStyle;
022
023public class EEnumActionSupplier extends EClassifierActionSupplier<EEnum> {
024
025        public EEnumActionSupplier(
026                        EEnum value, 
027                        Context context, 
028                        java.util.function.Function<EPackage,String> ePackagePathComputer,
029                        java.util.function.Function<String, String> javadocResolver,
030                        java.util.function.Function<String, Object> ePackageResolver,
031                        Predicate<EModelElement> elementPredicate,
032                        BiFunction<ENamedElement, String, String> labelProvider) {
033                super(value, context, ePackagePathComputer, javadocResolver, ePackageResolver, elementPredicate, labelProvider);
034        }
035        
036        @Override
037        public org.nasdanika.html.model.app.Action execute(EClass contextEClass, ProgressMonitor progressMonitor) {
038                Action action = super.execute(contextEClass, progressMonitor);
039                action.setSectionStyle(SectionStyle.HEADER);
040
041                EList<Action> sections = action.getSections();
042                sections.add(createLiteralsAction(contextEClass, progressMonitor));
043                Action usesAction = createUsesAction(contextEClass, progressMonitor);
044                if (usesAction != null) {
045                        sections.add(usesAction);
046                }
047
048                return action;
049        }
050        
051        protected Action createLiteralsAction(EClass contextEClass, ProgressMonitor progressMonitor) {
052                Action literalsAction = AppFactory.eINSTANCE.createAction();
053                literalsAction.setText("Literals");
054                literalsAction.setSectionStyle(SectionStyle.TABLE);
055                EList<Action> literals = literalsAction.getSections();
056                for (EEnumLiteral literal: retainDocumentable(eObject.getELiterals())) {
057                        literals.add(adaptChild(literal).execute(contextEClass, progressMonitor));
058                }
059                return literalsAction;
060        }
061        
062        protected Action createUsesAction(EClass contextEClass, ProgressMonitor progressMonitor) {
063                Collection<EClass> uses = getUses().stream().sorted((a,b) -> a.getName().compareTo(b.getName())).collect(Collectors.toList());
064                if (uses.isEmpty()) {
065                        return null;
066                }
067                Action usesAction = AppFactory.eINSTANCE.createAction();
068                usesAction.setText("Uses");
069                
070                // Uses
071                Tag list = TagName.ul.create();
072                for (EClass use: uses) {
073                        list.content(TagName.li.create(link(use, contextEClass)));
074                }
075                addContent(usesAction, list.toString());
076                
077                return usesAction;
078        }
079
080}