/*******************************************************************************
 * 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.swt.widgets.Label;
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)
  {
    //	FlatViewUtility utility = new FlatViewUtility(XSDEditor.isFlatLook());
    ViewUtility utility = new ViewUtility();

    // Composite client = utility.createComposite(parent, 1);
    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);
      Label derivedByLabel = 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;
  }
}
