/*******************************************************************************
 * Copyright (c) 2001, 2004 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.wst.xsd.ui.internal.actions;
import java.util.List;

import org.eclipse.jface.action.Action;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.widgets.Display;
import org.eclipse.wst.sse.core.format.IStructuredFormatProcessor;
import org.eclipse.wst.xml.core.document.XMLModel;
import org.eclipse.wst.xml.core.document.XMLNode;
import org.eclipse.wst.xml.core.format.FormatProcessorXML;
import org.eclipse.wst.xml.core.internal.document.DocumentImpl;
import org.eclipse.xsd.XSDConcreteComponent;
import org.eclipse.xsd.XSDSchema;
import org.eclipse.xsd.util.XSDConstants;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.Text;

public class CreateElementAction extends Action
{
  protected String description;
  protected Element parentNode;

  protected ISelectionProvider selectionProvider;
  protected XSDSchema xsdSchema;
  
  /**
   * Constructor for CreateElementAction.
   */
  public CreateElementAction()
  {
    super();
  }
  /**
   * Constructor for CreateElementAction.
   * @param text
   */
  public CreateElementAction(String text)
  {
    super(text);
  }
  /**
   * Constructor for CreateElementAction.
   * @param text
   * @param image
   */
  public CreateElementAction(String text, ImageDescriptor image)
  {
    super(text, image);
  }

  public void setXSDSchema(XSDSchema xsdSchema)
  {
    this.xsdSchema = xsdSchema;
  }
  
  public void setSelectionProvider(ISelectionProvider selectionProvider)
  {
    this.selectionProvider = selectionProvider;
  }
  
  /**
   * Gets the parentNode.
   * @return Returns a Element
   */
  public Element getParentNode()
  {
    return parentNode;
  }

  /**
   * Sets the parentNode.
   * @param parentNode The parentNode to set
   */
  public void setParentNode(Element parentNode)
  {
    this.parentNode = parentNode;
  }

  boolean isGlobal = false;
  
  public void setIsGlobal(boolean isGlobal)
  {
    this.isGlobal = isGlobal;
  }
  
  public boolean getIsGlobal()
  {
    return isGlobal;
  }

  protected Node relativeNode;
  protected String elementTag;
  public void setElementTag(String elementTag)
  {
    this.elementTag = elementTag;
  }
  
  public DocumentImpl getDocument()
  {
    return (DocumentImpl) getParentNode().getOwnerDocument();
  }
    
  public void beginRecording(String description)
  {
    getDocument().getModel().beginRecording(this, description);
  }
  
  public void endRecording()
  {
    DocumentImpl doc = (DocumentImpl) getDocument();
    
    doc.getModel().endRecording(this);    
  }
  
  public Element createAndAddNewChildElement()
  {
    String prefix = parentNode.getPrefix();
    prefix = (prefix == null) ? "" : (prefix + ":");
    Element childNode = getDocument().createElementNS(XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001, prefix + elementTag);
    if (getAttributes() != null)
    {
      List attributes = getAttributes();
      for (int i = 0; i < attributes.size(); i++)
      {
        DOMAttribute attr = (DOMAttribute) attributes.get(i);
        childNode.setAttribute(attr.getName(), attr.getValue());
      }
    }
    if (getRelativeNode() == null)
    {
      parentNode.appendChild(childNode);
    }
    else
    {
      ((Element)parentNode).insertBefore(childNode,getRelativeNode());
    }
    
    if (isGlobal && getRelativeNode() == null)
    {
      Text textNode = getDocument().createTextNode("\n\n");
      parentNode.appendChild(textNode);
    }
    else if (isGlobal && getRelativeNode() != null)
    {
      Text textNode = getDocument().createTextNode("\n\n");
      parentNode.insertBefore(textNode, getRelativeNode());
    }

    formatChild(childNode);
    
    return childNode;
  }    
    
  protected void formatChild(Element child)
  {
    if (child instanceof XMLNode)
    {
      XMLModel model = ((XMLNode)child).getModel();
      try
      {
        // tell the model that we are about to make a big model change
        model.aboutToChangeModel();
        
	      IStructuredFormatProcessor formatProcessor = new FormatProcessorXML();
		    formatProcessor.formatNode(child);
      }
      finally
      {
        // tell the model that we are done with the big model change
        model.changedModel(); 
      }
    }
  }
  /*
   * @see IAction#run()
   */
  public void run()
  {
    beginRecording(getDescription());
    Element child = createAndAddNewChildElement();
    endRecording();

    if (selectionProvider != null)
    {
      final XSDConcreteComponent comp = xsdSchema.getCorrespondingComponent(child);
//      selectionProvider.setSelection(new StructuredSelection(comp));
      
    Runnable runnable = new Runnable()
    {
      public void run()
      {
        selectionProvider.setSelection(new StructuredSelection(comp));
      }
    };
    Display.getDefault().timerExec(50,runnable);

    }
  }

  /**
   * Gets the relativeNode.
   * @return Returns a Element
   */
  public Node getRelativeNode()
  {
    return relativeNode;
  }

  /**
   * Sets the relativeNode.
   * @param relativeNode The relativeNode to set
   */
  public void setRelativeNode(Node relativeNode)
  {
    this.relativeNode = relativeNode;
  }

  /**
   * Gets the description.
   * @return Returns a String
   */
  public String getDescription()
  {
    if (description == null)
    {
      return getText();
    }
    return description;
  }

  /**
   * Sets the description.
   * @param description The description to set
   */
  public void setDescription(String description)
  {
    this.description = description;
  }

  protected List attributes;
  /**
   * Gets the nameAttribute.
   * @return Returns a String
   */
  public List getAttributes()
  {
    return attributes;
  }

  /**
   * Sets the attributes.
   * @param attributes The attributes to set
   */
  public void setAttributes(List attributes)
  {
    this.attributes = attributes;
  }
}
