/* * Copyright 2009 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.uibinder.rebind; import com.google.gwt.core.ext.UnableToCompleteException; import com.google.gwt.core.ext.typeinfo.JClassType; import com.google.gwt.core.ext.typeinfo.TypeOracle; import com.google.gwt.resources.client.ClientBundle; import com.google.gwt.resources.client.DataResource; import com.google.gwt.resources.client.ImageResource; import com.google.gwt.resources.client.CssResource.Import; import com.google.gwt.resources.client.ImageResource.ImageOptions; import com.google.gwt.resources.client.ImageResource.RepeatStyle; import com.google.gwt.uibinder.rebind.model.ImplicitClientBundle; import com.google.gwt.uibinder.rebind.model.ImplicitCssResource; import com.google.gwt.uibinder.rebind.model.ImplicitDataResource; import com.google.gwt.uibinder.rebind.model.ImplicitImageResource; import java.util.Collection; import java.util.Set; /** * Writes source implementing an {@link ImplicitClientBundle}. */ public class BundleWriter { private final ImplicitClientBundle bundleClass; private final IndentedWriter writer; private final PrintWriterManager writerManager; private final TypeOracle types; private final MortalLogger logger; private final JClassType clientBundleType; private final JClassType dataResourceType; private final JClassType imageOptionType; private final JClassType imageResourceType; private final JClassType repeatStyleType; private final JClassType importAnnotationType; public BundleWriter(ImplicitClientBundle bundleClass, PrintWriterManager writerManager, TypeOracle types, MortalLogger logger) { this.bundleClass = bundleClass; this.writer = new IndentedWriter( writerManager.makePrintWriterFor(bundleClass.getClassName())); this.writerManager = writerManager; this.types = types; this.logger = logger; clientBundleType = types.findType(ClientBundle.class.getName()); dataResourceType = types.findType(DataResource.class.getCanonicalName()); imageOptionType = types.findType(ImageOptions.class.getCanonicalName()); imageResourceType = types.findType(ImageResource.class.getCanonicalName()); repeatStyleType = types.findType(RepeatStyle.class.getCanonicalName()); importAnnotationType = types.findType(Import.class.getCanonicalName()); } public void write() throws UnableToCompleteException { writeBundleClass(); for (ImplicitCssResource css : bundleClass.getCssMethods()) { new CssResourceWriter(css, types, writerManager.makePrintWriterFor(css.getClassName()), logger).write(); } } private void writeBundleClass() { // Package declaration String packageName = bundleClass.getPackageName(); if (packageName.length() > 0) { writer.write("package %1$s;", packageName); writer.newline(); } // Imports writer.write("import %s;", clientBundleType.getQualifiedSourceName()); writer.write("import %s;", dataResourceType.getQualifiedSourceName()); writer.write("import %s;", imageResourceType.getQualifiedSourceName()); writer.write("import %s;", imageOptionType.getQualifiedSourceName()); writer.write("import %s;", importAnnotationType.getQualifiedSourceName()); writer.newline(); // Open interface writer.write("public interface %s extends ClientBundle {", bundleClass.getClassName()); writer.indent(); // Write css methods for (ImplicitCssResource css : bundleClass.getCssMethods()) { writeCssSource(css); writeCssImports(css); writer.write("%s %s();", css.getClassName(), css.getName()); writer.newline(); } // Write data methods for (ImplicitDataResource data : bundleClass.getDataMethods()) { writer.write("@Source(\"%s\")", data.getSource()); writer.write("%s %s();", dataResourceType.getName(), data.getName()); writer.newline(); } writeImageMethods(); // Close interface. writer.outdent(); writer.write("}"); } private void writeCssImports(ImplicitCssResource css) { Set<JClassType> importTypes = css.getImports(); int numImports = importTypes.size(); if (numImports > 0) { if (numImports == 1) { writer.write("@Import(%s.class)", importTypes.iterator().next().getQualifiedSourceName()); } else { StringBuffer b = new StringBuffer(); for (JClassType importType : importTypes) { if (b.length() > 0) { b.append(", "); } b.append(importType.getQualifiedSourceName()).append(".class"); } writer.write("@Import({%s})", b); } } } private void writeCssSource(ImplicitCssResource css) { Collection<String> sources = css.getSource(); if (sources.size() == 1) { writer.write("@Source(\"%s\")", sources.iterator().next()); } else { StringBuffer b = new StringBuffer(); for (String s : sources) { if (b.length() > 0) { b.append(", "); } b.append('"').append(s).append('"'); } writer.write("@Source({%s})", b); } } private void writeImageMethods() { for (ImplicitImageResource image : bundleClass.getImageMethods()) { if (null != image.getSource()) { writer.write("@Source(\"%s\")", image.getSource()); } writeImageOptionsAnnotation(image.getFlipRtl(), image.getRepeatStyle()); writer.write("%s %s();", imageResourceType.getName(), image.getName()); } } private void writeImageOptionsAnnotation(Boolean flipRtl, RepeatStyle repeatStyle) { if (flipRtl != null || repeatStyle != null) { StringBuilder b = new StringBuilder("@ImageOptions("); if (null != flipRtl) { b.append("flipRtl=").append(flipRtl); if (repeatStyle != null) { b.append(", "); } } if (repeatStyle != null) { b.append(String.format("repeatStyle=%s.%s", repeatStyleType.getName(), repeatStyle.toString())); } b.append(")"); writer.write(b.toString()); } } }