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

import org.eclipse.swt.graphics.Font;

import org.eclipse.draw2d.ColorConstants;
import org.eclipse.draw2d.FigureCanvas;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.PositionConstants;
import org.eclipse.draw2d.examples.AbstractExample;
import org.eclipse.draw2d.text.BlockFlow;
import org.eclipse.draw2d.text.FlowPage;
import org.eclipse.draw2d.text.InlineFlow;
import org.eclipse.draw2d.text.SimpleTextLayout;
import org.eclipse.draw2d.text.TextFlow;

/**
 * This example shows the basic ways that the draw2d.text figures can be used.
 * 
 * @author hudsonr
 * @since 2.0
 */
public class TextFlowExample extends AbstractExample {

static protected IFigure createAlignmentParagraph() {
	BlockFlow block = new BlockFlow();
	block.setHorizontalAligment(PositionConstants.RIGHT);
	block.add(new TextFlow("An inline flow figure's aligment is determined "
	  + "by the block flow in which it resides. This block is aligned using "));
	TextFlow text = new TextFlow("PositionConstants.RIGHT");
	text.setFont(COURIER);
	block.add(text);
	block.add(new TextFlow(", which results in right text aligment"));
	return block;
}

static protected IFigure createBaselineParagraph() {
	BlockFlow block = new BlockFlow();

	String message[] = {
		"Text fragments ",
		"with different ",
		"Font sizes will ",
		"have their ",
		"baseline ",
		"vertically ",
		"aligned ",
		"within ",
		"the current ",
		"line"
	};

	for (int i=0; i<message.length; i++){
		TextFlow tf = new TextFlow(message[i]);
		//This is a resource leak.
		tf.setFont(new Font(null, "Helvetica", i+8, 0));
		block.add(tf);
	}

	return block;	
}

static protected IFigure createBlockParagraph() {
	BlockFlow blockFlow = new BlockFlow();
	blockFlow.setFont(COURIER);
	TextFlow contents = new TextFlow();
	contents.setLayoutManager(new SimpleTextLayout(contents));
	contents.setText(
	  "/**\n" +
	  " * The SimpleTextLayout only breaks at newlines\n" +
	  " * It can be used to render source code.\r" +
	  " */\r\n" +
	  "public void foo() {\n" + 
	  "    //TABs are not handled currently, only spaces.\n" + 
	  "    System.out.println(\"foo\")\n" +
	  "}"
	);
	blockFlow.add(contents);
	return blockFlow;
}

static protected IFigure createNestedInlineParagraph() {
	BlockFlow blockFlow = new BlockFlow();
	TextFlow text;
	blockFlow.add(new TextFlow("A paragraph can contain multiple children, including"
	  + " nested structure using InlineFlows. "));
	
	InlineFlow inline = new InlineFlow();
	inline.setForegroundColor(ColorConstants.darkBlue());
	inline.add(new TextFlow("This TextFlow is inside an InlineFlow with a blue "
	  + "foreground color. Children can have "));
	text = new TextFlow("Bold ");
	text.setFont(BOLD);
	inline.add(text);
	
	inline.add(new TextFlow("or "));

	text = new TextFlow("Italic ");
	text.setFont(ITALICS);
	inline.add(text);

	inline.add(new TextFlow("Font, or override other inherited attributes."));
	blockFlow.add(inline);
	return blockFlow;
}

static protected IFigure createParagraph() {
	BlockFlow blockFlow = new BlockFlow();
	TextFlow contents = new TextFlow();
	contents.setText("A paragraph is created by using a BlockFlow figure. A "
	  + "paragraph usually wraps to the width of the current page. "
	  + "To see this, try resizing the example's window. "
	  + "The contents of this paragraph were created using a TextFlow figure "
	  + "in its default layout, which breaks at whitespace. "
	  + "a block of text that doesn't wrap can be created by using the "
	  + "SimpleTextLayout on a TextFlow");
	
	blockFlow.add(contents);
	return blockFlow;
}

static protected IFigure createTitle() {
	BlockFlow blockFlow = new BlockFlow();
	TextFlow contents = new TextFlow("Draw2D TextFlow Example");
	contents.setFont(HEADING_1);
	blockFlow.add(contents);
	return blockFlow;
}

/**
 * @see org.eclipse.draw2d.examples.AbstractExample#getContents()
 */
protected IFigure getContents() {
	FlowPage page = new FlowPage();
	page.setOpaque(true);
	page.setBackgroundColor(ColorConstants.white());
	page.add(createTitle());
	page.add(createParagraph());
	page.add(createBlockParagraph());
	page.add(createNestedInlineParagraph());
	page.add(createBaselineParagraph());
	page.add(createAlignmentParagraph());
	return page;
}

public static void main(String[] args) {
	new TextFlowExample().run();
}

/**
 * @see org.eclipse.draw2d.examples.AbstractExample#setFigureCanvas(FigureCanvas)
 */
protected void setFigureCanvas(FigureCanvas canvas) {
	super.setFigureCanvas(canvas);
//	canvas.setVerticalScrollBarVisibility(canvas.ALWAYS);
	canvas.getViewport().setContentsTracksWidth(true);
}

}
