/*******************************************************************************
 * Copyright (c) 2011, 2012 Ericsson AB 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
 * 
 * Description:
 * 
 * This class encapsulates the properties for the Rule UI model element
 * 
 * Contributors:
 *   Sebastien Dubois - Created for Mylyn Review R4E project
 *   
 ******************************************************************************/

package org.eclipse.mylyn.reviews.r4e.ui.internal.properties.general;

import org.eclipse.mylyn.reviews.r4e.core.model.drules.R4EDesignRuleRank;
import org.eclipse.mylyn.reviews.r4e.ui.internal.model.R4EUIModelElement;
import org.eclipse.mylyn.reviews.r4e.ui.internal.model.R4EUIRule;
import org.eclipse.mylyn.reviews.r4e.ui.internal.utils.R4EUIConstants;
import org.eclipse.mylyn.reviews.r4e.ui.internal.utils.UIUtils;
import org.eclipse.ui.views.properties.IPropertyDescriptor;
import org.eclipse.ui.views.properties.PropertyDescriptor;

/**
 * @author Sebastien Dubois
 * @version $Revision: 1.0 $
 */
public class RuleProperties extends ModelElementProperties {

	// ------------------------------------------------------------------------
	// Constants
	// ------------------------------------------------------------------------

	/**
	 * Field RULE_ID_ID. (value is ""ruleElement.id"")
	 */
	protected static final String RULE_ID_ID = "ruleElement.id";

	/**
	 * Field RULE_ID_PROPERTY_DESCRIPTOR.
	 */
	protected static final PropertyDescriptor RULE_ID_PROPERTY_DESCRIPTOR = new PropertyDescriptor(RULE_ID_ID,
			R4EUIConstants.ID_LABEL);

	/**
	 * Field RULE_TITLE_ID. (value is ""ruleElement.title"")
	 */
	protected static final String RULE_TITLE_ID = "ruleElement.title";

	/**
	 * Field RULE_TITLE_PROPERTY_DESCRIPTOR.
	 */
	protected static final PropertyDescriptor RULE_TITLE_PROPERTY_DESCRIPTOR = new PropertyDescriptor(RULE_TITLE_ID,
			R4EUIConstants.TITLE_LABEL);

	/**
	 * Field RULE_DESCRIPTION_ID. (value is ""ruleElement.description"")
	 */
	protected static final String RULE_DESCRIPTION_ID = "ruleElement.description";

	/**
	 * Field RULE_DESCRIPTION_PROPERTY_DESCRIPTOR.
	 */
	protected static final PropertyDescriptor RULE_DESCRIPTION_PROPERTY_DESCRIPTOR = new PropertyDescriptor(
			RULE_DESCRIPTION_ID, R4EUIConstants.DESCRIPTION_LABEL);

	/**
	 * Field RULE_CLASS_ID. (value is ""ruleElement.class"")
	 */
	protected static final String RULE_CLASS_ID = "ruleElement.class";

	/**
	 * Field RULE_CLASS_PROPERTY_DESCRIPTOR.
	 */
	protected static final PropertyDescriptor RULE_CLASS_PROPERTY_DESCRIPTOR = new PropertyDescriptor(RULE_CLASS_ID,
			R4EUIConstants.CLASS_LABEL);

	/**
	 * Field RULE_RANK_ID. (value is ""ruleElement.rank"")
	 */
	protected static final String RULE_RANK_ID = "ruleElement.rank";

	/**
	 * Field RULE_RANK_PROPERTY_DESCRIPTOR.
	 */
	protected static final PropertyDescriptor RULE_RANK_PROPERTY_DESCRIPTOR = new PropertyDescriptor(RULE_RANK_ID,
			R4EUIConstants.RANK_LABEL);

	/**
	 * Field DESCRIPTORS.
	 */
	private static final IPropertyDescriptor[] DESCRIPTORS = { RULE_ID_PROPERTY_DESCRIPTOR,
			RULE_TITLE_PROPERTY_DESCRIPTOR, RULE_DESCRIPTION_PROPERTY_DESCRIPTOR, RULE_CLASS_PROPERTY_DESCRIPTOR,
			RULE_RANK_PROPERTY_DESCRIPTOR };

	// ------------------------------------------------------------------------
	// Constructors
	// ------------------------------------------------------------------------

	/**
	 * Constructor for ReviewGroupProperties.
	 * 
	 * @param aElement
	 *            R4EUIModelElement
	 */
	public RuleProperties(R4EUIModelElement aElement) {
		super(aElement);
	}

	// ------------------------------------------------------------------------
	// Methods
	// ------------------------------------------------------------------------

	/**
	 * Method getPropertyDescriptors.
	 * 
	 * @return IPropertyDescriptor[]
	 * @see org.eclipse.ui.views.properties.IPropertySource#getPropertyDescriptors()
	 */
	@Override
	public IPropertyDescriptor[] getPropertyDescriptors() {
		return DESCRIPTORS;
	}

	/**
	 * Method getPropertyValue.
	 * 
	 * @param aId
	 *            Object
	 * @return Object
	 * @see org.eclipse.ui.views.properties.IPropertySource#getPropertyValue(Object)
	 */
	@Override
	public Object getPropertyValue(Object aId) {
		if (null != getElement()) {
			if (RULE_ID_ID.equals(aId)) {
				return ((R4EUIRule) getElement()).getRule().getId();
			} else if (RULE_TITLE_ID.equals(aId)) {
				return ((R4EUIRule) getElement()).getRule().getTitle();
			} else if (RULE_DESCRIPTION_ID.equals(aId)) {
				return ((R4EUIRule) getElement()).getRule().getDescription();
			} else if (RULE_CLASS_ID.equals(aId)) {
				return UIUtils.getClasses()[Integer.valueOf(((R4EUIRule) getElement()).getRule().getClass_().getValue())
						.intValue()];
			} else if (RULE_RANK_ID.equals(aId)) {
				//Bug 368865:  Mapping needed for DEPRECATED value to MINOR
				final int rankValue = ((R4EUIRule) getElement()).getRule().getRank().getValue();
				final int intValue = Integer.valueOf(rankValue == R4EDesignRuleRank.R4E_RANK_DEPRECATED_VALUE
						? R4EDesignRuleRank.R4E_RANK_MINOR_VALUE
						: rankValue);
				return UIUtils.getRanks()[intValue];
			}
		}
		return null;
	}
}
