/*******************************************************************************
 * Copyright (c) 2001, 2007 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.adt.typeviz.design.figures;

import java.util.Iterator;
import org.eclipse.draw2d.ColorConstants;
import org.eclipse.draw2d.Figure;
import org.eclipse.draw2d.Graphics;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.Label;
import org.eclipse.draw2d.ToolbarLayout;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.wst.xsd.ui.internal.adt.typeviz.design.layouts.ColumnData;

public class BoxFigure extends Figure
{
  protected ColumnData columnData = new ColumnData();  
  public HeadingFigure headingFigure;
  protected Figure contentPane;
  
  public boolean isSelected = false;

  public BoxFigure()
  {
    super();
    setBackgroundColor(ColorConstants.white);
    headingFigure = new HeadingFigure();   
    add(headingFigure);

    contentPane = new Figure()
    {
      public void paint(Graphics graphics)
      {
        graphics.fillRectangle(getBounds());
        super.paint(graphics);
        boolean isFirst = false;
        for (Iterator i = getChildren().iterator(); i.hasNext();)
        {
          Figure figure = (Figure) i.next();
          if (isFirst)
          {
            isFirst = false;
          }
          else
          {
            Rectangle r = figure.getBounds();
            graphics.drawLine(r.x, r.y + 1, r.x + r.width, r.y + 1);
          }
        }
      }
    };
    contentPane.setLayoutManager(new ToolbarLayout());
    add(contentPane);
    headingFigure.setForegroundColor(ColorConstants.black); 
  }

  public void paint(Graphics graphics)
  {
    super.paint(graphics);
    /*
    // Fill for the header section
    //
    Rectangle r = getBounds().getCopy();
    graphics.setBackgroundColor(ColorConstants.darkGray);
    Color gradient1 = ColorConstants.lightGray;
    if (isSelected)
    {
      gradient1 = ColorConstants.lightBlue;
    }
    Color gradient2 = ColorConstants.white;
    graphics.setForegroundColor(gradient1);
    graphics.setBackgroundColor(gradient2);
    graphics.fillGradient(r.x + 1, r.y + 1, r.width - 2, nodeNameLabel.getBounds().height - 1, true);
    nodeNameLabel.paint(graphics);
    */
  }

  public IFigure getContentPane()
  {
    return contentPane;
  }

  public Label getNameLabel()
  {
    return headingFigure.getLabel();
  }
  
  public HeadingFigure getHeadingFigure()
  {
    return headingFigure;
  }
  
  public ColumnData getColumnData()
  {
    return columnData;
  }  
}
