/** * */ package com.google.gwt.chrome.crx.linker.emiter; import java.io.PrintWriter; import java.util.ArrayList; import java.util.List; import com.google.gwt.chrome.crx.client.PageAction; import com.google.gwt.chrome.crx.linker.artifact.PageActionArtifact; import com.google.gwt.core.ext.GeneratorContext; import com.google.gwt.core.ext.TreeLogger; import com.google.gwt.core.ext.UnableToCompleteException; import com.google.gwt.core.ext.typeinfo.JClassType; import com.google.gwt.core.ext.typeinfo.JMethod; import com.google.gwt.user.rebind.ClassSourceFileComposerFactory; import com.google.gwt.user.rebind.SourceWriter; /** * @author webdizz * */ public class PageActionEmiter extends BrowserActionEmiter { /* * (non-Javadoc) * * @see * com.google.gwt.chrome.crx.linker.emiter.Emiter#emit(com.google.gwt.core * .ext.TreeLogger, com.google.gwt.core.ext.GeneratorContext, * com.google.gwt.core.ext.typeinfo.JClassType, java.lang.String) */ @Override public String emit(final TreeLogger logger, final GeneratorContext context, final JClassType userType, final String typeName) throws UnableToCompleteException { PageAction.ManifestInfo spec = userType.getAnnotation(PageAction.ManifestInfo.class); Validator<PageAction.ManifestInfo> validator; validator = new Validator<PageAction.ManifestInfo>(logger, PageAction.class.getName(), typeName); validator.ensureAnnotatedWithManifest(spec); JMethod[] methods = userType.getMethods(); List<String> iconFiles = new ArrayList<String>(); List<String> iconMethods = new ArrayList<String>(); processIconMethods(methods, iconFiles, iconMethods); validator.ensureActionHasIcon(iconFiles); if ("".equals(spec.popup())) { PageActionArtifact artifact; artifact = new PageActionArtifact(spec.pageActionId(), spec.name(), iconFiles.toArray(new String[0])); context.commitArtifact(logger, artifact); } else { PageActionArtifact artifact; String[] files = iconFiles.toArray(new String[0]); artifact = new PageActionArtifact(spec.pageActionId(), spec.name(), files, spec.popup()); context.commitArtifact(logger, artifact); } return emitPageActionCode(logger, context, userType, spec.pageActionId(), spec.name(), iconMethods, iconFiles, spec.popup()); } private String emitPageActionCode(TreeLogger logger, GeneratorContext context, JClassType userType, String pageActionId, String name, List<String> icons, List<String> iconPaths, String popup) { final String subclassName = createSubclassName(userType.getSimpleSourceName()); final String packageName = userType.getPackage().getName(); final ClassSourceFileComposerFactory f = new ClassSourceFileComposerFactory(packageName, subclassName); f.setSuperclass(userType.getQualifiedSourceName()); final PrintWriter pw = context.tryCreate(logger, packageName, subclassName); if (pw != null) { final SourceWriter sw = f.createSourceWriter(context, pw); // Impls for the getters for id and name. emitIdGetter(sw, pageActionId); emitNameGetter(sw, name); if (null != popup) { sw.println("public String getPopup() {"); sw.println(" return \"" + popup + "\";"); sw.println("}"); } emitIcons(sw, icons, iconPaths); sw.commit(logger); } return f.getCreatedClassName(); } }