/*******************************************************************************
 * Copyright (c) 2006, 2015 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.texteditor.rulers;

import java.util.Collections;
import java.util.LinkedHashSet;
import java.util.Set;

import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.InvalidRegistryObjectException;

/**
 * Describes the placement specification of a contribution to the
 * <code>org.eclipse.ui.texteditor.rulerColumns</code> extension point.
 *
 * @since 3.3
 */
public final class RulerColumnPlacement {
	/** The extension schema name of the id attribute. */
	private static final String ID= "id"; //$NON-NLS-1$
	/** The extension schema name of the optional gravity attribute. */
	private static final String GRAVITY= "gravity"; //$NON-NLS-1$
	/** The extension schema name of the before element. */
	private static final String BEFORE= "before"; //$NON-NLS-1$
	/** The extension schema name of the after element. */
	private static final String AFTER= "after"; //$NON-NLS-1$

	/** The placement gravity. */
	private final float fGravity;
	/** The placement constraints. */
	private final Set<RulerColumnPlacementConstraint> fConstraints;

	public RulerColumnPlacement() {
		fGravity= 1f;
		fConstraints= Collections.emptySet();
	}

	public RulerColumnPlacement(IConfigurationElement element) throws InvalidRegistryObjectException, CoreException {
		Assert.isLegal(element != null);
		ExtensionPointHelper helper= new ExtensionPointHelper(element);

		fGravity= helper.getDefaultAttribute(GRAVITY, 1f);
		if (fGravity < 0 || fGravity > 1)
			helper.fail(RulerColumnMessages.RulerColumnPlacement_illegal_gravity_msg);
		fConstraints= readIds(element.getChildren());
	}

	private Set<RulerColumnPlacementConstraint> readIds(IConfigurationElement[] children) throws CoreException {
		Set<RulerColumnPlacementConstraint> constraints= new LinkedHashSet<>((int) (children.length / 0.75) + 1, 0.75f);
		for (int i= 0; i < children.length; i++) {
			IConfigurationElement child= children[i];
			String name= child.getName();
			ExtensionPointHelper childHelper= new ExtensionPointHelper(child);
			boolean before;
			if (AFTER.equals(name))
				before= false;
			else if (BEFORE.equals(name))
				before= true;
			else {
				childHelper.fail(RulerColumnMessages.RulerColumnPlacement_illegal_child_msg);
				continue;
			}
			constraints.add(new RulerColumnPlacementConstraint(childHelper.getNonNullAttribute(ID), before));
		}
		return Collections.unmodifiableSet(constraints);
	}

	/**
	 * The gravity of the placement specification, a float in the range <code>[0, 1]</code>.
	 *
	 * @return the gravity of the placement specification
	 */
	public float getGravity() {
		return fGravity;
	}

	/**
	 * Returns the placement constraints in the order that they appear in the extension declaration.
	 *
	 * @return the unmodifiable set of placement constraints in the order that they appear in the
	 *         extension declaration
	 */
	public Set<RulerColumnPlacementConstraint> getConstraints() {
		return fConstraints;
	}
}
