/*******************************************************************************
 * Copyright (c) 2000, 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.swt.snippets;

/*
 * SWT StyledText snippet: use rise and font with StyleRange. 
 *
 * 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.layout.*;
import org.eclipse.swt.widgets.*;
import org.eclipse.swt.graphics.*;
import org.eclipse.swt.custom.*;

public class Snippet211 {

	static String text = 
		"You can set any font you want in a range. You can also set a baseline rise and all other old features" + 
		" like background and foreground, and mix them any way you want. Totally awesome.";
	
	public static void main(String [] args) {
		Display display = new Display();
		Shell shell = new Shell(display);
		shell.setLayout(new FillLayout());
		StyledText styledText = new StyledText(shell, SWT.WRAP | SWT.BORDER);
		styledText.setText(text);
		FontData data = styledText.getFont().getFontData()[0];
		Font font1 = new Font(display, data.getName(), data.getHeight() * 2, data.getStyle());
		Font font2 = new Font(display, data.getName(), data.getHeight() * 4 / 5, data.getStyle());
		StyleRange[] styles = new StyleRange[8];
		styles[0] = new StyleRange();
		styles[0].font = font1; 
		styles[1] = new StyleRange();
		styles[1].rise = data.getHeight() / 3; 
		styles[2] = new StyleRange();
		styles[2].background = display.getSystemColor(SWT.COLOR_GREEN); 
		styles[3] = new StyleRange();
		styles[3].foreground = display.getSystemColor(SWT.COLOR_MAGENTA); 
		styles[4] = new StyleRange();
		styles[4].font = font2; 
		styles[4].foreground = display.getSystemColor(SWT.COLOR_BLUE);;
		styles[4].underline = true;
		styles[5] = new StyleRange();
		styles[5].rise = -data.getHeight() / 3; 
		styles[5].strikeout = true;
		styles[5].underline = true;
		styles[6] = new StyleRange();
		styles[6].font = font1; 
		styles[6].foreground = display.getSystemColor(SWT.COLOR_YELLOW);
		styles[6].background = display.getSystemColor(SWT.COLOR_BLUE);
		styles[7] = new StyleRange();
		styles[7].rise =  data.getHeight() / 3;
		styles[7].underline = true;
		styles[7].fontStyle = SWT.BOLD;
		styles[7].foreground = display.getSystemColor(SWT.COLOR_RED);
		styles[7].background = display.getSystemColor(SWT.COLOR_BLACK);
		
		int[] ranges = new int[] {16, 4, 61, 13, 107, 10, 122, 10, 134, 3, 143, 6, 160, 7, 168, 7};
		styledText.setStyleRanges(ranges, styles);
		
		shell.setSize(300, 300);
		shell.open();
		while (!shell.isDisposed()) {
			if (!display.readAndDispatch())
				display.sleep();
		}
		font1.dispose();
		font2.dispose();		
		display.dispose();
	}
}
