/*
 * 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.parsers;

import com.google.gwt.core.ext.UnableToCompleteException;
import com.google.gwt.core.ext.typeinfo.JClassType;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.uibinder.rebind.UiBinderWriter;
import com.google.gwt.uibinder.rebind.XMLElement;
import com.google.gwt.user.client.ui.StackLayoutPanel;

/**
 * Parses {@link StackLayoutPanel} widgets.
 */
public class StackLayoutPanelParser implements ElementParser {

  private static final String HEADER_ELEM = "header";
  private static final String STACK_ELEM = "stack";

  public void parse(XMLElement elem, String fieldName, JClassType type,
      UiBinderWriter writer) throws UnableToCompleteException {
    // StackLayoutPanel requires a unit ctor.
    Unit unit = elem.consumeEnumAttribute("unit", Unit.class);
    writer.setFieldInitializerAsConstructor(fieldName, writer.getOracle()
        .findType(StackLayoutPanel.class.getName()), DockLayoutPanelParser
        .getFullyQualifiedEnumName(unit));

    // Parse children.
    for (XMLElement child : elem.consumeChildElements()) {
      // Get the stack element.
      if (!isElementType(elem, child, STACK_ELEM)) {
        writer.die("In %s, Only <stack> children are allowed.", elem);
      }

      XMLElement headerElem = null, widgetElem = null;
      for (XMLElement stackChild : child.consumeChildElements()) {
        // Get the header.
        if (isElementType(elem, stackChild, HEADER_ELEM)) {
          if (headerElem != null) {
            writer.die("In %s, Only one <header> allowed per <stack>", elem);
          }
          headerElem = stackChild;
          continue;
        }

        // Get the widget.
        if (widgetElem != null) {
          writer.die("In %s, Only one child widget allowed per <stack>", elem);
        }
        widgetElem = stackChild;
      }

      double size = headerElem.consumeDoubleAttribute("size");
      XMLElement headerWidgetElem = headerElem.consumeSingleChildElement();
      String headerFieldName = writer.parseElementToField(headerWidgetElem);
      String childFieldName = writer.parseElementToField(widgetElem);

      writer.addStatement("%s.add(%s, %s, %f);", fieldName, childFieldName,
          headerFieldName, size);
    }

    // Emit the layout() call.
    writer.addStatement("%s.layout();", fieldName);
  }

  private boolean isElementType(XMLElement parent, XMLElement child, String type) {
    return child.getNamespaceUri().equals(parent.getNamespaceUri())
        && type.equals(child.getLocalName());
  }
}
