/*
 * Copyright 2007 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.elementparsers;

import com.google.gwt.core.ext.UnableToCompleteException;
import com.google.gwt.core.ext.typeinfo.JClassType;
import com.google.gwt.uibinder.rebind.UiBinderWriter;
import com.google.gwt.uibinder.rebind.XMLElement;
import com.google.gwt.uibinder.rebind.XMLElement.Interpreter;
import com.google.gwt.user.client.ui.Image;

import java.util.HashSet;
import java.util.Set;

/**
 * Parses CustomButton widgets.
 */
public class CustomButtonParser implements ElementParser {

  private static final Set<String> faceNames = new HashSet<String>();
  private static final String IMAGE_CLASS = Image.class.getCanonicalName();

  static {
    faceNames.add("upFace");
    faceNames.add("downFace");
    faceNames.add("upHoveringFace");
    faceNames.add("downHoveringFace");
    faceNames.add("upDisabledFace");
    faceNames.add("downDisabledFace");
  }

  public void parse(final XMLElement elem, final String fieldName,
      JClassType type, final UiBinderWriter writer)
      throws UnableToCompleteException {

    /*
     * Parse children. Use an interpreter to leave text in place for
     * HasHTMLParser to find.
     */
    elem.consumeChildElements(new Interpreter<Boolean>() {
      public Boolean interpretElement(XMLElement child)
          throws UnableToCompleteException {
        // CustomButton can only contain Face elements.
        String ns = child.getNamespaceUri();
        String faceName = child.getLocalName();

        if (!ns.equals(elem.getNamespaceUri())) {
          writer.die(elem, "Invalid child namespace: %s", ns);
        }
        if (!faceNames.contains(faceName)) {
          writer.die(elem, "Invalid CustomButton face: %s:%s", ns, faceName);
        }

        HtmlInterpreter interpreter = HtmlInterpreter.newInterpreterForUiObject(
            writer, fieldName);
        String innerHtml = child.consumeInnerHtml(interpreter);
        if (innerHtml.length() > 0) {
          writer.addStatement("%s.%s().setHTML(%s);", fieldName,
              faceNameGetter(faceName), writer.declareTemplateCall(innerHtml));
        }

        if (child.hasAttribute("image")) {
          String image = child.consumeImageResourceAttribute("image");
          writer.addStatement("%s.%s().setImage(new %s(%s));", fieldName,
              faceNameGetter(faceName), IMAGE_CLASS, image);
        }
        return true; // We consumed it
      }
    });
  }

  private String faceNameGetter(String faceName) {
    return "get" + faceName.substring(0, 1).toUpperCase()
        + faceName.substring(1);
  }
}
