/*******************************************************************************
 * Copyright (c) 2005 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.draw2d.examples.tree;

import org.eclipse.swt.graphics.Color;

import org.eclipse.draw2d.AbstractBorder;
import org.eclipse.draw2d.Border;
import org.eclipse.draw2d.ColorConstants;
import org.eclipse.draw2d.CompoundBorder;
import org.eclipse.draw2d.Figure;
import org.eclipse.draw2d.Graphics;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.Label;
import org.eclipse.draw2d.MarginBorder;
import org.eclipse.draw2d.StackLayout;
import org.eclipse.draw2d.geometry.Insets;
import org.eclipse.draw2d.geometry.PointList;
import org.eclipse.draw2d.geometry.Rectangle;

/**
 * 
 * @author hudsonr
 * Created on Apr 22, 2003
 */
public class PageNode extends Figure {

private boolean selected;
	static final Color gradient1 = new Color(null, 232,232,240);
static final Color gradient2 = new Color(null, 176,184,216);
static final Color corner1 = new Color(null, 200, 208, 223);
static final Color corner2 = new Color(null, 160, 172, 200);
static final Color blue = new Color(null, 152,168,200);
static final Color shadow = new Color(null, 202,202,202);

static final int CORNER_SIZE = 10;
static final Border BORDER = new CompoundBorder(
	new FoldedPageBorder(),
	new MarginBorder(4,4,8,3));

static class FoldedPageBorder extends AbstractBorder {
	static final PointList CORNER_ERASE;
	static final PointList CORNER_PAINT;
	static {
		CORNER_ERASE = new PointList(3);
		CORNER_ERASE.addPoint(1,0);
		CORNER_ERASE.addPoint(1, CORNER_SIZE + 1);
		CORNER_ERASE.addPoint(-CORNER_SIZE, 0);
		CORNER_PAINT = new PointList(3);
		CORNER_PAINT.addPoint(-CORNER_SIZE, 0);
		CORNER_PAINT.addPoint(0, CORNER_SIZE);
		CORNER_PAINT.addPoint(-CORNER_SIZE, CORNER_SIZE);
	}
	
	static final Insets insets = new Insets(CORNER_SIZE,2,4,4);

	public Insets getInsets(IFigure figure) {
		return insets;
	}

	public void paint(IFigure figure, Graphics g, Insets insets) {
		Rectangle r = getPaintRectangle(figure, insets);

		g.setLineWidth(4);
		r.resize(-2, -2);
		g.setForegroundColor(shadow);
		g.drawLine(r.x+3, r.bottom(), r.right() - 1, r.bottom());
		g.drawLine(r.right(), r.y + 3 + CORNER_SIZE, r.right(), r.bottom() - 1);
		
		g.restoreState();
		r.resize(-1, -1);
		g.drawRectangle(r);
		g.setForegroundColor(blue);
		g.drawRectangle(r.x + 1, r.y+1, r.width - 2, r.height - 2);
		g.translate(r.getTopRight());
		g.fillPolygon(CORNER_ERASE);
		g.setBackgroundColor(corner1);
		g.fillPolygon(CORNER_PAINT);
		g.setForegroundColor(figure.getForegroundColor());
		g.drawPolygon(CORNER_PAINT);
		g.restoreState();
		g.setForegroundColor(corner2);
		g.drawLine(
			r.right() - CORNER_SIZE + 1,
			r.y + 2,
			r.right() - 2,
			r.y + CORNER_SIZE-1);
	}
}

private Label label = new Label();

public PageNode(String text) {
	this();
	label.setText(text);
}

public PageNode() {
	setBorder(BORDER);
	setLayoutManager(new StackLayout());
	add(label);
}

/**
 * @see org.eclipse.draw2d.Figure#paintFigure(org.eclipse.draw2d.Graphics)
 */
protected void paintFigure(Graphics g) {
	super.paintFigure(g);
	if (selected) {
		g.setForegroundColor(ColorConstants.menuBackgroundSelected());
		g.setBackgroundColor(ColorConstants.titleGradient());
	} else {
		g.setForegroundColor(gradient1);
		g.setBackgroundColor(gradient2);
	}
	g.fillGradient(getBounds().getResized(-3, -3), true);
}

public void setSelected(boolean value) {
	this.selected = value;
	if (selected)
		label.setForegroundColor(ColorConstants.white());
	else
		label.setForegroundColor(null);
	repaint();
}

/**
 * @see java.lang.Object#toString()
 */
public String toString() {
	return ((Label)getChildren().get(0)).getText();
}

}
