/**********************************************************************
 * Copyright (c) 2003, 2004 Geoff Longman and others.
 *
 *   This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 * Geoff Longman - Initial API and implementation
 * IBM - Tightening integration with existing Platform
 **********************************************************************/
package org.eclipse.core.tools.runtime;

import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.content.IContentType;
import org.eclipse.ui.views.properties.*;

/**
 * A read-only IPropertySource for Marker attributes.
 */
public class ContentTypePropertySource implements IPropertySource, IAdaptable {
	final static IPropertyDescriptor UNIQUE_ID = new TextPropertyDescriptor("id", "Unique ID");
	final static IPropertyDescriptor NAME = new TextPropertyDescriptor("name", "Name");
	final static IPropertyDescriptor PARENT_ID = new TextPropertyDescriptor("parent", "Parent ID");
	final static IPropertyDescriptor FILE_NAMES = new TextPropertyDescriptor("file-names", "Associated file names");
	final static IPropertyDescriptor FILE_EXTENSIONS = new TextPropertyDescriptor("file-extensions", "Associated file extensions");
	final static IPropertyDescriptor DEFAULT_CHARSET = new TextPropertyDescriptor("charset", "Default charset");

	final static IPropertyDescriptor[] PROPERTY_DESCRIPTORS = {UNIQUE_ID, NAME, PARENT_ID, FILE_NAMES, FILE_EXTENSIONS, DEFAULT_CHARSET};

	protected IContentType type;

	public ContentTypePropertySource(IContentType type) {
		this.type = type;
	}

	/**
	 * @see org.eclipse.ui.views.properties.IPropertySource#getEditableValue()
	 */
	@Override
	public Object getEditableValue() {
		return null;
	}

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

	/**
	 * @see org.eclipse.ui.views.properties.IPropertySource#getPropertyValue(Object)
	 */
	@Override
	public Object getPropertyValue(Object id) {
		if (id.equals(UNIQUE_ID.getId()))
			return type.getId();
		if (id.equals(NAME.getId()))
			return type.getName();
		if (id.equals(PARENT_ID.getId())) {
			IContentType baseType = type.getBaseType();
			return baseType == null ? null : baseType.getId();
		}
		if (id.equals(FILE_NAMES.getId()))
			return toString(type.getFileSpecs(IContentType.FILE_NAME_SPEC));
		if (id.equals(FILE_EXTENSIONS.getId()))
			return toString(type.getFileSpecs(IContentType.FILE_EXTENSION_SPEC));
		if (id.equals(DEFAULT_CHARSET.getId()))
			return type.getDefaultCharset();
		return null;
	}

	private Object toString(String[] fileNames) {
		if (fileNames.length == 0)
			return ""; //$NON-NLS-1$
		StringBuilder result = new StringBuilder();
		for (String fileName : fileNames) {
			result.append(fileName);
			result.append(',');
		}
		result.deleteCharAt(result.length() - 1);
		return result.toString();
	}

	/**
	 * @see org.eclipse.ui.views.properties.IPropertySource#isPropertySet(Object)
	 */
	@Override
	public boolean isPropertySet(Object id) {
		return true;
	}

	/**
	 * @see org.eclipse.ui.views.properties.IPropertySource#resetPropertyValue(Object)
	 */
	@Override
	public void resetPropertyValue(Object id) {
		// do nothing
	}

	/**
	 * @see org.eclipse.ui.views.properties.IPropertySource#setPropertyValue(Object, Object)
	 */
	@Override
	public void setPropertyValue(Object id, Object value) {
		// do nothing
	}

	@Override
	public boolean equals(Object obj) {
		if (!(obj instanceof ContentTypePropertySource))
			return false;
		return type.getId().equals(((ContentTypePropertySource) obj).type.getId());
	}

	@Override
	public int hashCode() {
		return type.getId().hashCode();
	}

	@Override
	public String toString() {
		return type.getId();
	}

	@Override
	public <T> T getAdapter(Class<T> adapter) {
		if (adapter == IPropertySource.class)
			return adapter.cast(this);
		return null;
	}
}