/*******************************************************************************
 * Copyright (c) 2000, 2003 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials 
 * are made available under the terms of the Common Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/cpl-v10.html
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.ui.tests.propertysheet;

import java.util.ArrayList;
import java.util.Random;

import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.widgets.Display;

import org.eclipse.jface.viewers.StructuredSelection;

import org.eclipse.ui.IViewPart;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.tests.SelectionProviderView;
import org.eclipse.ui.tests.util.UITestCase;
import org.eclipse.ui.views.properties.ColorPropertyDescriptor;
import org.eclipse.ui.views.properties.IPropertyDescriptor;
import org.eclipse.ui.views.properties.IPropertySource;
import org.eclipse.ui.views.properties.TextPropertyDescriptor;
/**
 *  The class implements a test for the workbench's default
 * property sheet page. It does this by firing a sequence of 
 * selection events. The property sheet view receives these events 
 * and displays the properties for the selected objects.
 * We are able to test the property sheet code which displays 
 * properties and handles the transition to another set of 
 * properties.
 */

public class PropertySheetAuto extends UITestCase {
	
	/**
	 * This car serves as a simple porperty source.
	 * The only interesting behavior it has is that if
	 * one of its properties has a "null" value then
	 * it does not include that property in its list
	 * of property descriptors.
	 */
	private class Car implements IPropertySource {
		private int modelYear = 0;
		private RGB color = null;
		private String manufacturer = null;
		private String model = null;
		private double engineSize = 0.0;
		
		// property ids
		private final static String prefix = "org.eclipse.ui.tests.standardcomponents.propertysheetauto.";
		private final static String MODEL_YEAR = prefix + "modelyear";
		private final static String COLOR = prefix + "color";
		private final static String MANUFACTURER = prefix + "manufacturer";
		private final static String MODEL = prefix + "model";
		private final static String ENGINE_SIZE = prefix + "enginesize";
		
		private IPropertyDescriptor[] descriptors;
		
		public Car(int carModelYear, RGB carColor, 
			String carManufacturer, String carModel, double carEngineSize) {
			modelYear = carModelYear;
			color = carColor;
			manufacturer = carManufacturer;
			model = carModel;
			engineSize = carEngineSize;
			
			createDescriptors();
		}
		/** 
		 * Creates the property descriptors.
		 * If one of the properties has a "null" value then
		 * that property is not included in the list of
	 	 * property descriptors.
	 	 */
		private void createDescriptors() {
			ArrayList list = new ArrayList(5);
			if (modelYear != 0)
				list.add(new TextPropertyDescriptor(MODEL_YEAR, "model year"));
			if (color != null)
				list.add(new ColorPropertyDescriptor(COLOR, "color"));
			if (manufacturer != null) 
				list.add(new TextPropertyDescriptor(MANUFACTURER, "make"));
			if (model != null)
				list.add(new TextPropertyDescriptor(MODEL, "model"));
			if (engineSize != 0.0)
				list.add(new TextPropertyDescriptor(ENGINE_SIZE, "engine"));
			descriptors = (IPropertyDescriptor[])list.toArray(new IPropertyDescriptor[list.size()]);
		}	
		public Object getEditableValue() {
			return this;
		}
		public IPropertyDescriptor[] getPropertyDescriptors() {
			return descriptors;
		}
		public Object getPropertyValue(Object id) {
			if (id.equals(MODEL_YEAR))
				return Integer.toString(modelYear);
			if (id.equals(COLOR))
				return color;
			if (id.equals(MANUFACTURER))
				return manufacturer;
			if (id.equals(MODEL))
				return model;
			if (id.equals(ENGINE_SIZE))
				return Double.toString(engineSize);
			return null;
		}
		public boolean isPropertySet(Object id) {
			return false;	
		}
		public void resetPropertyValue(Object id) {
			return;
		}
		public void setPropertyValue(Object id, Object value) {
			if (id.equals(MODEL_YEAR))
				modelYear = new Integer((String)value).intValue();
			if (id.equals(COLOR))
				color = (RGB)value;
			if (id.equals(MANUFACTURER))
				manufacturer = (String)value;
			if (id.equals(MODEL))
				model = (String)value;
			if (id.equals(ENGINE_SIZE))
				engineSize = new Double((String)value).doubleValue();
		}	
		public String toString() {
			StringBuffer s = new StringBuffer();
			s.append("<");
			if (modelYear != 0) {
				s.append(modelYear);
				s.append(" ");
			}
			if (color != null) {
				s.append(color);
				s.append(" ");
			}
			if (manufacturer != null) {
				s.append(manufacturer);
				s.append(" ");
			}
			if (model != null) {
				s.append(model);
				s.append(" ");
			}
			if (engineSize != 0.0) {
				s.append(engineSize);
				s.append(" ");
			}
			s.append(">");
			return s.toString();
		}
	}
	private IWorkbenchPage activePage;
	private IWorkbenchWindow workbenchWindow;
	private SelectionProviderView selectionProviderView;
	private Car[] cars;
	private	Random random = new Random();
	private static final int NUMBER_OF_CARS = 10;
	private static final int NUMBER_OF_SELECTIONS = 100;
	private static final String[] makers = new String[] {"Ford", "GM", "Chrysler", "BMW", "Toyota", "Nissan", "Honda", "Volvo"};
	private static final String[] models = new String[] {"Thunderbird", "Deville", "Viper", "320i", "Camry", "Ultima", "Prelude", "V70"};
	public PropertySheetAuto(String name) {
		super(name);
	}
	/** 
	 * Creates a array of car objects
	 */
	private void createCars() {
		cars = new Car[NUMBER_OF_CARS];
		for (int i = 0; i < cars.length; i++) {		
			cars[i] = createCar();
		}
	} 
	/**
	 * Creates a car initialized with random values
	 */
	private Car createCar() {
		int modelYear = 0;
		RGB color = null;
		String manufacturer = null;
		String model = null;
		double engineSize = 0.0;
		// only set 25% of the properties
		int FACTOR = 4;
		if (random.nextInt(FACTOR) < FACTOR - 1)
			modelYear = 1990 + random.nextInt(15);	
		if (random.nextInt(FACTOR) < FACTOR - 1)
			color = new RGB(random.nextInt(256), random.nextInt(256), random.nextInt(256));
		if (random.nextInt(FACTOR) < FACTOR - 1)
			manufacturer = makers[random.nextInt(makers.length)];
		if (random.nextInt(FACTOR) < FACTOR - 1)
			model = models[random.nextInt(models.length)];
		if (random.nextInt(FACTOR) < FACTOR - 1)
			engineSize = random.nextDouble() * 6;
		return new Car(modelYear, color, manufacturer, model, engineSize);
	}	

	protected void doSetUp() throws Exception {
		super.doSetUp();
		workbenchWindow = openTestWindow();
		activePage = workbenchWindow.getActivePage();
	}
			
	protected IWorkbenchPart createTestPart(IWorkbenchPage page) throws Throwable {
		IViewPart view = page.showView("org.eclipse.ui.views.PropertySheet");
		selectionProviderView = (SelectionProviderView)page.showView(SelectionProviderView.ID);
		return view;
		
	}
			
	/** 
	 * Supply selection events with a random car selection
	 */
	public void testInput() throws Throwable {
		createTestPart(activePage);
		createCars();
		for (int i=0; i < NUMBER_OF_SELECTIONS; i++) {
			// create the selection
			int numberToSelect = random.nextInt(NUMBER_OF_CARS - 2);
			ArrayList selection = new ArrayList(numberToSelect);
			while (selection.size() < numberToSelect) {
				int j = random.nextInt(NUMBER_OF_CARS);
				if (!selection.contains(cars[j]))
					selection.add(cars[j]);
			}
			StructuredSelection structuredSelection = new StructuredSelection(selection);
			// fire the selection	
			selectionProviderView.setSelection(structuredSelection);
			while(Display.getCurrent().readAndDispatch());
		}
	}
}

  