Package com.google.gwt.uibinder.rebind.model

Source Code of com.google.gwt.uibinder.rebind.model.HtmlTemplate

/*
* Copyright 2011 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.model;

import com.google.gwt.uibinder.rebind.IndentedWriter;
import com.google.gwt.uibinder.rebind.Tokenator;
import com.google.gwt.uibinder.rebind.Tokenator.Resolver;

import java.util.ArrayList;
import java.util.List;

/**
* An individual SafeHtml template to be written by UiBinder.
*/
public class HtmlTemplate {
  private final List<String> template = new ArrayList<String>();
  private final String methodName;
  private final ArrayList<HtmlTemplateArgument> methodArgs =
    new ArrayList<HtmlTemplateArgument>();
  private final HtmlTemplates templates;
 
  public HtmlTemplate(String html, Tokenator tokenator, HtmlTemplates templates)
    throws IllegalArgumentException {
    if (html == null) {
      throw new IllegalArgumentException("Template html cannot be null");
    }
    if (tokenator == null) {
      throw new IllegalArgumentException("Template tokenator cannot be null");
    }
    if (templates == null) {
      throw new IllegalArgumentException("HtmlTemplates container cannot be null");
    }
   
    this.templates = templates;
    methodName = "html" + this.templates.nextTemplateId();
   
    populateArgMap(html,tokenator);
   
    template.add("@Template(\"" + addTemplatePlaceholders(html) + "\")");
    template.add("SafeHtml " + methodName + "(" + getTemplateArgs() + ");");
    template.add(" ");
  }
 
  public List<String> getTemplate() {
    return template;
  }
   
  /**
   * Writes all templates to the provided {@link IndentedWriter}.
   *
   * @param w the writer to write the template to
   */
  public void writeTemplate(IndentedWriter w) {
    for (String s : template) {
      w.write(s);
    }
  }

  /**
   * Creates the template method invocation.
   *
   * @return String the template method call with parameters
   */
  public String writeTemplateCall() {
    return "template." + methodName + "(" + getSafeHtmlArgs()
      + ").asString()";
  }

  /**
   *  Replaces string tokens with {} placeholders for SafeHtml templating.
   * 
   * @return the rendering string, with tokens replaced by {} placeholders
   */
  private String addTemplatePlaceholders(String html) {
    String rtn = Tokenator.detokenate(html, new Resolver() {
      int tokenId = 0;
      public String resolveToken(String token) {
        return "{" + tokenId++ + "}";
      }
    });
    return rtn;
  }

  /**
   * Retrieves the arguments for SafeHtml template function call from
   * the {@link Tokenator}.
   */
  private String getSafeHtmlArgs() {
    StringBuilder b = new StringBuilder();
   
    for (HtmlTemplateArgument arg : methodArgs) {
      if (b.length() > 0) {
        b.append(", ");
      }
      b.append(arg.getArg())
    }
     
    return b.toString();
  }
 
  /**
   * Creates the argument string for the generated SafeHtmlTemplate function.
   */
  private String getTemplateArgs() {
    StringBuilder b = new StringBuilder();
    int i = 0;
   
       for (HtmlTemplateArgument arg : methodArgs) {
         if (b.length() > 0) {
           b.append(", ");
         }
        b.append(arg.getType() + " arg" + i);
        i++;
      }
   
    return b.toString();
  }
 
  private void populateArgMap(String s, Tokenator t) {
    if (t != null) {
      List<String> args = t.getOrderedValues(s);
     
      for (String arg : args) {
        if (templates.isSafeConstant(arg)) {
          methodArgs.add(HtmlTemplateArgument.forHtml(arg));
        } else {
          methodArgs.add(HtmlTemplateArgument.forString(arg.substring(4,
              arg.length() - 4)));
        }
      }
    }
  }
}
TOP

Related Classes of com.google.gwt.uibinder.rebind.model.HtmlTemplate

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.