/*******************************************************************************
 * Copyright (c) 2000, 2006 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.swt.snippets;
/* 
 * example snippet: StyledText bulleted list example
 *
 * For a list of all SWT example snippets see
 * http://www.eclipse.org/swt/snippets/
 * 
 * @since 3.2
 */

import org.eclipse.swt.*;
import org.eclipse.swt.widgets.*;
import org.eclipse.swt.custom.*;
import org.eclipse.swt.graphics.*;
import org.eclipse.swt.layout.*;

public class Snippet222 {
	
public static void main(String[] args) {	
	Display display = new Display();
	Shell shell = new Shell(display);
	shell.setText("StyledText Bullet Example");
	shell.setLayout(new FillLayout());
	final StyledText styledText = new StyledText (shell, SWT.FULL_SELECTION | SWT.BORDER | SWT.WRAP | SWT.V_SCROLL);
	StringBuffer text = new StringBuffer();
	text.append("Here is StyledText with some bulleted lists:\n\n");
	for (int i = 0; i < 4; i++) text.append("Red Bullet List Item " + i + "\n");
	text.append("\n");
	for (int i = 0; i < 2; i++) text.append("Numbered List Item " + i + "\n");
	for (int i = 0; i < 4; i++) text.append("Sub List Item " + i + "\n");
	for (int i = 0; i < 2; i++) text.append("Numbered List Item " + (2 + i) + "\n");
	text.append("\n");
	for (int i = 0; i < 4; i++) text.append("Custom Draw List Item " + i + "\n");	
	styledText.setText(text.toString());
		
	StyleRange style0 = new StyleRange();
	style0.metrics = new GlyphMetrics(0, 0, 40);
	style0.foreground = display.getSystemColor(SWT.COLOR_RED);
	Bullet bullet0 = new Bullet (style0);
	StyleRange style1 = new StyleRange();
	style1.metrics = new GlyphMetrics(0, 0, 50);
	style1.foreground = display.getSystemColor(SWT.COLOR_BLUE);
	Bullet bullet1 = new Bullet (ST.BULLET_NUMBER | ST.BULLET_TEXT, style1);
	bullet1.text = ".";
	StyleRange style2 = new StyleRange();
	style2.metrics = new GlyphMetrics(0, 0, 80);
	style2.foreground = display.getSystemColor(SWT.COLOR_GREEN);
	Bullet bullet2 = new Bullet (ST.BULLET_TEXT, style2);
	bullet2.text = "\u2713";
	StyleRange style3 = new StyleRange();
	style3.metrics = new GlyphMetrics(0, 0, 50);
	Bullet bullet3 = new Bullet (ST.BULLET_CUSTOM, style2);

	styledText.setLineBullet(2, 4, bullet0);
	styledText.setLineBullet(7, 2, bullet1);
	styledText.setLineBullet(9, 4, bullet2);
	styledText.setLineBullet(13, 2, bullet1);
	styledText.setLineBullet(16, 4, bullet3);

	styledText.addPaintObjectListener(new PaintObjectListener() {
		public void paintObject(PaintObjectEvent event) {
			Display display = event.display;
			StyleRange style = event.style;
			Font font = style.font;
			if (font == null) font = styledText.getFont();
			TextLayout layout = new TextLayout(display);
			layout.setAscent(event.ascent);
			layout.setDescent(event.descent);
			layout.setFont(font);
			layout.setText("\u2023 1." + event.bulletIndex + ")");
			layout.draw(event.gc, event.x + 10, event.y);
			layout.dispose();
		}
	});
	shell.open();
	while (!shell.isDisposed()) {
		if (!display.readAndDispatch()) display.sleep();
	}
	display.dispose ();
}
}
