/*******************************************************************************
 * 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.graph.editparts;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.eclipse.draw2d.ColorConstants;
import org.eclipse.draw2d.Figure;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.Label;
import org.eclipse.draw2d.MarginBorder;
import org.eclipse.draw2d.RectangleFigure;
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.gef.EditPart;
import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
import org.eclipse.wst.xsd.ui.internal.graph.GraphicsConstants;
import org.eclipse.wst.xsd.ui.internal.graph.figures.ContainerFigure;
import org.eclipse.wst.xsd.ui.internal.graph.figures.FillLayout;
import org.eclipse.wst.xsd.ui.internal.graph.figures.RoundedLineBorder;
import org.eclipse.wst.xsd.ui.internal.graph.model.Category;
import org.eclipse.wst.xsd.ui.internal.graph.model.XSDModelAdapterFactory;
import org.eclipse.xsd.XSDSchema;

public class SchemaEditPart extends BaseEditPart
{
  protected ContainerFigure containerFigure;
  protected Label label;

  //protected ContainerFigure childExpansionContainer;
  public IFigure getContentPane()
  {
    return containerFigure;
  }

  protected IFigure createFigure()
  {
    ContainerFigure outer = new ContainerFigure();
    outer.setBorder(new RoundedLineBorder(1, 6));
    outer.setForegroundColor(categoryBorderColor);
    FillLayout fillLayout = new FillLayout(4);
    outer.setLayoutManager(fillLayout); 
    //outer.getContainerLayout().setHorizontal(false);
    
    ContainerFigure r = new ContainerFigure();  
    r.setOutline(false);
    r.setMinimumSize(new Dimension(0, 0));
    r.setFill(true);
    r.setBackgroundColor(GraphicsConstants.elementBackgroundColor);
    outer.add(r);
    
	final int theMinHeight = 200;
    FillLayout outerLayout = new FillLayout()
    {
      protected Dimension calculatePreferredSize(IFigure parent, int width, int height)
      {
        Dimension d = super.calculatePreferredSize(parent, width, height);
        d.union(new Dimension(100, theMinHeight));
        return d;
      }
    };
    outerLayout.setHorizontal(false);
    outer.setLayoutManager(outerLayout);
    
    label = new Label();
    label.setForegroundColor(ColorConstants.black);
    label.setBorder(new MarginBorder(2, 4, 2, 4));    
    r.add(label);
    
    RectangleFigure line = new RectangleFigure();
    line.setPreferredSize(20, 1);
    outer.add(line);
    
    containerFigure = new ContainerFigure();
    //containerFigure.setBackgroundColor(ColorConstants.red);
    containerFigure.setBorder(new MarginBorder(4, 4, 4, 4));
    fillLayout = new FillLayout(4);
    containerFigure.setLayoutManager(fillLayout);
    //containerFigure.setLayoutManager(new FillLayout(false));
    /*
     * FlowLayout layout1 = new FlowLayout(false); layout1.setMajorSpacing(0);
     * layout1.setMinorSpacing(0); layout1.setStretchMinorAxis(true);
     * containerFigure.setLayoutManager(layout1);
     */
    outer.add(containerFigure);
    //childExpansionContainer = new ContainerFigure();
    //childExpansionContainer.getContainerLayout().setHorizontal(false);
    //childExpansionContainer.setOutlined(true);
    return outer;
  }

  protected List getModelChildren()
  {
    XSDSchema schema = (XSDSchema) getModel();
    List list = new ArrayList();
    list.add(CategoryRowEditPart.DIRECTIVES_AND_NOTATIONS);
    list.add(CategoryRowEditPart.ELEMENTS_AND_TYPES);
    list.add(CategoryRowEditPart.MODEL_GROUPS_AND_ATTRIBUTES);      
    return list;
  }

  protected EditPart createChild(Object model)
  {
    CategoryRowEditPart result = new CategoryRowEditPart();
    result.setModel(model);
    result.setParent(this);
    result.setSchema((XSDSchema)getModel());
    return result;
  }
  

  protected void refreshVisuals()
  {
    super.refreshVisuals();
    String targetNamespaceValue = ((XSDSchema)getModel()).getTargetNamespace();
    if (targetNamespaceValue == null || targetNamespaceValue.length() == 0)
    {
      targetNamespaceValue = XSDEditorPlugin.getXSDString("_UI_GRAPH_XSDSCHEMA_NO_NAMESPACE");
    }     
    label.setText(XSDEditorPlugin.getXSDString("_UI_GRAPH_XSDSCHEMA") + " : " + targetNamespaceValue);
  }
}

class CategoryRowEditPart extends BaseEditPart
{  
  public static final int[] ELEMENTS_AND_TYPES = {Category.ELEMENTS, Category.TYPES };
  public static final int[] DIRECTIVES_AND_NOTATIONS =  {Category.DIRECTIVES, Category.NOTATIONS };
  public static final int[] MODEL_GROUPS_AND_ATTRIBUTES = {Category.GROUPS, Category.ATTRIBUTES};//, Category.COMPLEX_TYPES };
  
  protected XSDSchema schema;
  protected Figure contentPane;
  
  protected IFigure createFigure()
  {
    ContainerFigure containerFigure = new ContainerFigure();
    //containerFigure.setBackgroundColor(ColorConstants.red);
    containerFigure.setFill(true);
    containerFigure.setBorder(new MarginBorder(4, 4, 4, 4));
    org.eclipse.wst.xsd.ui.internal.gef.util.figures.FillLayout fillLayout = new org.eclipse.wst.xsd.ui.internal.gef.util.figures.FillLayout(4);
    fillLayout.setHorizontal(true);
    containerFigure.setLayoutManager(fillLayout);
    //containerFigure.setLayoutManager(new FillLayout(4));
    return containerFigure;
  }
  
  /* (non-Javadoc)
   * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#getContentPane()
   */
  public IFigure getContentPane()
  {
    return super.getContentPane();
  }

  public XSDSchema getSchema()
  {
    return schema;
  }

  public void setSchema(XSDSchema schema)
  {
    this.schema = schema;
  }
  

  protected List getModelChildren()
  {
    List categoryList = (List) XSDModelAdapterFactory.getAdapter(schema).getProperty(schema, "groups");
    return filterCategoryList(categoryList);
  }
  
  protected List filterCategoryList(List list)
  {
    List result = new ArrayList();
    int[] categoryTypes = (int[])getModel();
    for (Iterator i = list.iterator(); i.hasNext(); )
    {
      Category category = (Category)i.next();
      if (isMatching(categoryTypes, category))
      {
        result.add(category);
      }
    }
    return result;
  }
  
  private boolean isMatching(int[] categoryTypes, Category category)
  {
    boolean result = false;
    for (int i = 0; i < categoryTypes.length; i++)
    {
      if (categoryTypes[i] == category.getGroupType())
      {
        result = true;
        break;
      }
    }
    return result;
  }
}