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

import java.util.List;

import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.help.WorkbenchHelp;
import org.eclipse.wst.xsd.ui.internal.XSDEditorContextIds;
import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
import org.eclipse.wst.xsd.ui.internal.util.TypesHelper;
import org.eclipse.wst.xsd.ui.internal.util.ViewUtility;
import org.eclipse.xsd.XSDSchema;

public class TypeSection
{
  /**
   * Constructor for TypeSection.
   * @param parent
   */
  public TypeSection(Composite parent)
  {
  }

  protected Button  simpleType;
  protected Button  userSimpleType;
  protected Button  userComplexType;
  protected Button  noneRadio;
  protected Combo   typeList;
  protected Combo   derivedByCombo;
  protected boolean showUserComplexType = true;
  protected boolean showUserSimpleType  = true;
  protected boolean showNone            = false;
  protected boolean showDerivedBy       = false;
  protected String  derivedByChoices[]  = { "restriction", "extension" };
  public final int  NONE                = 1;
  public final int  BUILT_IN            = 2;
  public final int  SIMPLE              = 3;
  public final int  COMPLEX             = 4;

  String            sectionTitle        = XSDEditorPlugin.getXSDString("_UI_LABEL_TYPE_INFORMATION");
  String            currentObjectUuid   = "";

  /*
   * @see FlatPageSection#createClient(Composite, WidgetFactory)
   */
  public Composite createClient(Composite parent)
  {
    Composite client = new Composite(parent, SWT.NONE);
    GridLayout gl = new GridLayout(1, true);
    gl.verticalSpacing = 0;
    client.setLayout(gl);

    if (showNone)
    {
      noneRadio = ViewUtility.createRadioButton(client, XSDEditorPlugin.getXSDString("_UI_RADIO_NONE"));
      WorkbenchHelp.setHelp(noneRadio, XSDEditorContextIds.XSDE_TYPE_HELPER_NONE);
    }

    simpleType = ViewUtility.createRadioButton(client, XSDEditorPlugin.getXSDString("_UI_RADIO_BUILT_IN_SIMPLE_TYPE"));
    WorkbenchHelp.setHelp(simpleType, XSDEditorContextIds.XSDE_TYPE_HELPER_BUILT_IN);

    if (showUserSimpleType)
    {
      userSimpleType = ViewUtility.createRadioButton(client, XSDEditorPlugin.getXSDString("_UI_RADIO_USER_DEFINED_SIMPLE_TYPE"));
      WorkbenchHelp.setHelp(userSimpleType, XSDEditorContextIds.XSDE_TYPE_HELPER_USER_DEFINED_SIMPLE);
    }

    if (showUserComplexType)
    {
      userComplexType = ViewUtility.createRadioButton(client, XSDEditorPlugin.getXSDString("_UI_RADIO_USER_DEFINED_COMPLEX_TYPE"));
      WorkbenchHelp.setHelp(userComplexType, XSDEditorContextIds.XSDE_TYPE_HELPER_USER_DEFINED_COMPLEX);
    }

    //	  typeList = utility.createComboBox(client);
    //	  WorkbenchHelp.setHelp(typeList, XSDEditorContextIds.XSDE_TYPE_HELPER_TYPE);
    //    utility.createHeadingLabel(client, "Type",null);

    if (showDerivedBy)
    {
      Composite derivedByComposite = ViewUtility.createComposite(client, 2);
      ViewUtility.createLabel(derivedByComposite, XSDEditorPlugin.getXSDString("_UI_LABEL_DERIVED_BY"));
      derivedByCombo = ViewUtility.createComboBox(derivedByComposite);
      populateDerivedByCombo();
      WorkbenchHelp.setHelp(derivedByCombo, XSDEditorContextIds.XSDE_SIMPLE_CONTENT_DERIVED);
      derivedByCombo.setToolTipText(XSDEditorPlugin.getXSDString("_UI_TOOLTIP_DERIVED_BY"));
    }
    // Set the default selection
    if (showNone)
    {
      //		noneRadio.setSelection(true);
      //		typeList.setEnabled(false);
    }
    else
    {
      simpleType.setSelection(true);
    }
    return client;
  }

  public void setIsDerivedBy(boolean derive)
  {
    if (derive)
    {
      sectionTitle = XSDEditorPlugin.getXSDString("_UI_LABEL_BASE_TYPE");
    }
    else
    {
      sectionTitle = XSDEditorPlugin.getXSDString("_UI_LABEL_TYPE_INFORMATION");
    }
    //	setHeaderText(sectionTitle);
  }

  /**
   * Set to true if called by Complex Type & Simple Type
   */
  public void setShowDerivedBy(boolean derive)
  {
    showDerivedBy = derive;
  }

  /**
   * Gets the derivedByField
   * @return Returns a Button
   */
  public Combo getDerivedByCombo()
  {
    return derivedByCombo;
  }

  /**
   * Gets the noneRadio.
   * @return Returns a Button
   */
  public Button getNoneRadio()
  {
    return noneRadio;
  }

  /**
   * Gets the simpleType.
   * @return Returns a Button
   */
  public Button getSimpleType()
  {
    return simpleType;
  }

  /**
   * Gets the userComplexType.
   * @return Returns a Button
   */
  public Button getUserComplexType()
  {
    return userComplexType;
  }

  /**
   * Gets the userSimpleType.
   * @return Returns a Button
   */
  public Button getUserSimpleType()
  {
    return userSimpleType;
  }

  /**
   * Gets the typeList.
   * @return Returns a CCombo
   */
  public Combo getTypeList()
  {
    return typeList;
  }

  /**
   * Populate combo box with built-in simple types
   */
  public void populateBuiltInType(XSDSchema xsdSchema)
  {
    getTypeList().removeAll();
    List items = getBuiltInTypeNamesList(xsdSchema);
    for (int i = 0; i < items.size(); i++)
    {
      getTypeList().add(items.get(i).toString());
    }
  }

  public java.util.List getBuiltInTypeNamesList(XSDSchema xsdSchema)
  {
    TypesHelper helper = new TypesHelper(xsdSchema);
    return helper.getBuiltInTypeNamesList();
  }

  /**
   * Populate combo box with user defined complex types
   */
  public void populateUserComplexType(XSDSchema xsdSchema, boolean showAnonymous)
  {
    getTypeList().removeAll();
    if (showAnonymous)
    {
      getTypeList().add(XSDEditorPlugin.getXSDString("_UI_ANONYMOUS"));
    }

    List items = getUserComplexTypeNamesList(xsdSchema);
    for (int i = 0; i < items.size(); i++)
    {
      getTypeList().add(items.get(i).toString());
    }
  }

  public java.util.List getUserComplexTypeNamesList(XSDSchema xsdSchema)
  {
    TypesHelper helper = new TypesHelper(xsdSchema);
    return helper.getUserComplexTypeNamesList();
  }

  public void populateUserSimpleType(XSDSchema xsdSchema, boolean showAnonymous)
  {
    getTypeList().removeAll();
    if (showAnonymous)
    {
      getTypeList().add(XSDEditorPlugin.getXSDString("_UI_ANONYMOUS"));
    }
    List items = getUserSimpleTypeNamesList(xsdSchema);
    for (int i = 0; i < items.size(); i++)
    {
      getTypeList().add(items.get(i).toString());
    }
  }

  /**
   * Populate combo box with user defined simple types
   */
  public void populateUserSimpleType(XSDSchema xsdSchema)
  {
    getTypeList().removeAll();
    List items = getUserSimpleTypeNamesList(xsdSchema);
    for (int i = 0; i < items.size(); i++)
    {
      getTypeList().add(items.get(i).toString());
    }
  }

  public java.util.List getUserSimpleTypeNamesList(XSDSchema xsdSchema)
  {
    TypesHelper helper = new TypesHelper(xsdSchema);
    return helper.getUserSimpleTypeNamesList();
  }

  public String getPrefix(String ns, XSDSchema xsdSchema)
  {
    TypesHelper helper = new TypesHelper(xsdSchema);
    String key = helper.getPrefix(ns, true);
    return key;
  }

  /**
   * Populate combo box with derived by choices
   */
  protected void populateDerivedByCombo()
  {
    for (int i = 0; i < derivedByChoices.length; i++)
    {
      getDerivedByCombo().add(derivedByChoices[i]);
    }
  }

  /**
   * Gets the showUserComplexType.
   * @return Returns a boolean
   */
  public boolean getShowUserComplexType()
  {
    return showUserComplexType;
  }

  /**
   * Gets the showUserSimpleType.
   * @return Returns a boolean
   */
  public boolean getShowUserSimpleType()
  {
    return showUserSimpleType;
  }

  /**
   * Gets the showNone.
   * @return Returns a boolean
   */
  public boolean getShowNone()
  {
    return showNone;
  }

  /**
   * Sets the showUserComplexType.
   * @param showUserComplexType The showUserComplexType to set
   */
  public void setShowUserComplexType(boolean showUserComplexType)
  {
    this.showUserComplexType = showUserComplexType;
  }

  /**
   * Sets the showUserSimpleType.
   * @param showUserSimpleType The showUserSimpleType to set
   */
  public void setShowUserSimpleType(boolean showUserSimpleType)
  {
    this.showUserSimpleType = showUserSimpleType;
  }

  /**
   * Sets the showNone
   * @param showUserSimpleType The showNone to set
   */
  public void setShowNone(boolean showNone)
  {
    this.showNone = showNone;
  }
}
