/*******************************************************************************
 * Copyright (c) 2000, 2009 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.test.internal.performance.results.model;

import java.util.Vector;

import org.eclipse.test.internal.performance.data.Dim;
import org.eclipse.test.internal.performance.results.db.AbstractResults;
import org.eclipse.test.internal.performance.results.db.BuildResults;
import org.eclipse.ui.views.properties.IPropertyDescriptor;
import org.eclipse.ui.views.properties.PropertyDescriptor;
import org.eclipse.ui.views.properties.TextPropertyDescriptor;

public class DimResultsElement extends ResultsElement {

	Dim dim;

	// Property descriptors
    static final String P_ID_DIMENSION = "DimResultsElement.dim"; //$NON-NLS-1$
    static final String P_ID_COUNT = "DimResultsElement.count"; //$NON-NLS-1$
    static final String P_ID_AVERAGE = "DimResultsElement.average"; //$NON-NLS-1$
    static final String P_ID_STDDEV = "DimResultsElement.stddev"; //$NON-NLS-1$
    static final String P_ID_ERROR= "DimResultsElement.error"; //$NON-NLS-1$
    static final String P_ID_HAD_VALUES = "DimResultsElement.hadvalues"; //$NON-NLS-1$

    static final String P_STR_DIMENSION = "dimension"; //$NON-NLS-1$
    static final String P_STR_COUNT= "count"; //$NON-NLS-1$
    static final String P_STR_AVERAGE = "average"; //$NON-NLS-1$
    static final String P_STR_STDDEV = "std dev"; //$NON-NLS-1$
    static final String P_STR_ERROR = "error"; //$NON-NLS-1$
    static final String P_STR_HAD_VALUES = "had values"; //$NON-NLS-1$

	private static final TextPropertyDescriptor DIMENSION_DESCRIPTOR = new TextPropertyDescriptor(P_ID_DIMENSION, P_STR_DIMENSION);
	private static final PropertyDescriptor DIM_COUNT_DESCRIPTOR = new PropertyDescriptor(P_ID_COUNT, P_STR_COUNT);
	private static final PropertyDescriptor DIM_AVERAGE_DESCRIPTOR = new PropertyDescriptor(P_ID_AVERAGE, P_STR_AVERAGE);
	private static final PropertyDescriptor DIM_STDDEV_DESCRIPTOR = new PropertyDescriptor(P_ID_STDDEV, P_STR_STDDEV);
	private static final PropertyDescriptor DIM_ERROR_DESCRIPTOR = new PropertyDescriptor(P_ID_ERROR, P_STR_ERROR);
	private static final PropertyDescriptor DIM_HAD_VALUES_DESCRIPTOR = new PropertyDescriptor(P_ID_HAD_VALUES, P_STR_HAD_VALUES);

    private static Vector DESCRIPTORS;
    static Vector initDescriptors(int status) {
        DESCRIPTORS = new Vector();
		// Status category
		DESCRIPTORS.add(getInfosDescriptor(status));
		DESCRIPTORS.add(getWarningsDescriptor(status));
		DESCRIPTORS.add(ERROR_DESCRIPTOR);
		ERROR_DESCRIPTOR.setCategory("Status");
		// Results category
        DESCRIPTORS.addElement(DIMENSION_DESCRIPTOR);
		DIMENSION_DESCRIPTOR.setCategory("Results");
        DESCRIPTORS.addElement(DIM_COUNT_DESCRIPTOR);
		DIM_COUNT_DESCRIPTOR.setCategory("Results");
        DESCRIPTORS.addElement(DIM_AVERAGE_DESCRIPTOR);
		DIM_AVERAGE_DESCRIPTOR.setCategory("Results");
        DESCRIPTORS.addElement(DIM_STDDEV_DESCRIPTOR);
		DIM_STDDEV_DESCRIPTOR.setCategory("Results");
        DESCRIPTORS.addElement(DIM_ERROR_DESCRIPTOR);
		DIM_ERROR_DESCRIPTOR.setCategory("Results");
        DESCRIPTORS.addElement(DIM_HAD_VALUES_DESCRIPTOR);
		DIM_HAD_VALUES_DESCRIPTOR.setCategory("Results");
		// Survey category
		DESCRIPTORS.add(COMMENT_DESCRIPTOR);
		COMMENT_DESCRIPTOR.setCategory("Survey");
        return DESCRIPTORS;
   	}
    static Vector getDescriptors() {
    	return DESCRIPTORS;
	}

public DimResultsElement(AbstractResults results, ResultsElement parent, Dim d) {
	super(results, parent);
	this.dim = d;
}

ResultsElement createChild(AbstractResults testResults) {
	return null;
}

private BuildResults getBuildResults() {
	return (BuildResults) this.results;
}

public String getLabel(Object o) {
	return this.dim.getName();
}

/* (non-Javadoc)
 * @see org.eclipse.ui.views.properties.IPropertySource#getPropertyDescriptors()
 */
public IPropertyDescriptor[] getPropertyDescriptors() {
	Vector descriptors = getDescriptors();
	if (descriptors == null) {
		descriptors = initDescriptors(getStatus());
	}
	int size = descriptors.size();
	IPropertyDescriptor[] descriptorsArray = new IPropertyDescriptor[size];
	descriptorsArray[0] = getInfosDescriptor(getStatus());
	descriptorsArray[1] = getWarningsDescriptor(getStatus());
	for (int i=2; i<size; i++) {
		descriptorsArray[i] = (IPropertyDescriptor) descriptors.get(i);
	}
	return descriptorsArray;
}

/* (non-Javadoc)
 * @see org.eclipse.ui.views.properties.IPropertySource#getPropertyValue(java.lang.Object)
 */
public Object getPropertyValue(Object propKey) {
	BuildResults buildResults = getBuildResults();
    if (propKey.equals(P_ID_DIMENSION)) {
    	return  this.dim.getDescription();
    }
    if (propKey.equals(P_ID_COUNT)) {
	    long count = buildResults.getCount(this.dim.getId());
	    return new Double(count);
    }
    if (propKey.equals(P_ID_AVERAGE))
        return new Double(buildResults.getValue(this.dim.getId()));
    if (propKey.equals(P_ID_STDDEV))
        return new Double(buildResults.getDeviation(this.dim.getId()));
    if (propKey.equals(P_ID_ERROR))
        return new Double(buildResults.getError(this.dim.getId()));
    if (propKey.equals(P_ID_HAD_VALUES))
        return new Boolean(buildResults.hadValues());
    return super.getPropertyValue(propKey);
}

}
