/*******************************************************************************
 * Copyright (c) 2002, 2004 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.ui.internal.cheatsheets.views;

import java.util.*;
import java.util.ArrayList;

import org.eclipse.swt.graphics.*;
import org.eclipse.swt.widgets.*;
import org.eclipse.ui.internal.cheatsheets.*;
import org.eclipse.ui.internal.cheatsheets.ICheatSheetResource;
import org.eclipse.ui.internal.cheatsheets.data.*;

public class CheatSheetPage extends Page {
	// Colors
	// Active color's RGB value
	protected final RGB activeRGB = new RGB(232, 242, 254);
	protected Color activeColor;
	// Alternating color's RGB value
	protected final RGB alternateRGB = new RGB(244, 244, 244);
	protected Color alternateColor;

	private CheatSheet cheatSheet;
	private ArrayList viewItemList;
	private CheatSheetViewer viewer;

	public CheatSheetPage(CheatSheet cheatSheet, ArrayList viewItemList, CheatSheetViewer cheatSheetViewer) {
		super();
		this.cheatSheet = cheatSheet;
		this.viewItemList = viewItemList;
		this.viewer = cheatSheetViewer;
	}

	public void createPart(Composite parent) {
		super.createPart(parent);
	}

	/**
	 * Creates the main composite area of the view.
	 *
	 * @param parent the SWT parent for the title area composite
	 * @return the created info area composite
	 */
	protected void createInfoArea(Composite parent) {
		CheatSheetStopWatch.startStopWatch("CheatSheetPage.createInfoArea()"); //$NON-NLS-1$
		super.createInfoArea(parent);
		CheatSheetStopWatch.printLapTime("CheatSheetPage.createInfoArea()", "Time in CheatSheetPage.createInfoArea() after super.createInfoArea(): "); //$NON-NLS-1$ //$NON-NLS-2$
	
		IntroItem intro = new IntroItem(toolkit, form, cheatSheet.getIntroItem(), activeColor, viewer);
		CheatSheetStopWatch.printLapTime("CheatSheetPage.createInfoArea()", "Time in CheatSheetPage.createInfoArea() after new IntroItem(): "); //$NON-NLS-1$ //$NON-NLS-2$
	
		intro.setItemColor(intro.alternateColor);
		intro.setBold(true);
		viewItemList.add(intro);
			
		CheatSheetStopWatch.printLapTime("CheatSheetPage.createInfoArea()", "Time in CheatSheetPage.createInfoArea() before add loop: "); //$NON-NLS-1$ //$NON-NLS-2$
		//Get the content info from the parser.  This makes up all items except the intro item.
		ArrayList items = cheatSheet.getItems();
		for (int i = 0; i < items.size(); i++) {
			Color color = (i%2) == 0 ? backgroundColor : alternateColor;

			CoreItem coreItem = new CoreItem(toolkit, form, (org.eclipse.ui.internal.cheatsheets.data.Item)items.get(i), color, viewer);
			viewItemList.add(coreItem);
		}
		CheatSheetStopWatch.printLapTime("CheatSheetPage.createInfoArea()", "Time in CheatSheetPage.createInfoArea(): "); //$NON-NLS-1$ //$NON-NLS-2$
	}

	/**
	 * Creates the cheatsheet's title areawhich will consists
	 * of a title and image.
	 *
	 * @param parent the SWT parent for the title area composite
	 */
	protected String getTitle() {
		if(cheatSheet != null && cheatSheet.getTitle() != null)
			return cheatSheet.getTitle();
		else
			return ICheatSheetResource.EMPTY_STRING;
	}

	public void dispose() {
		super.dispose();

		if (alternateColor != null)
			alternateColor.dispose();

		if (activeColor != null)
			activeColor.dispose();
	}

	protected void init(Display display) {
		super.init(display);

		activeColor = new Color(display, activeRGB);
		alternateColor = new Color(display, alternateRGB);
	}
	
	public void initialized() {
		for (Iterator iter = viewItemList.iterator(); iter.hasNext();) {
			ViewItem item = (ViewItem) iter.next();
			item.initialized();
		}
	}
}
