/*******************************************************************************
 * Copyright (c) 2004 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.wst.html.ui.contentproperties.ui;



import java.util.Enumeration;
import java.util.Iterator;

import org.eclipse.wst.common.encoding.CommonCharsetNames;
import org.eclipse.wst.css.core.metamodel.CSSProfile;
import org.eclipse.wst.css.core.metamodel.CSSProfileRegistry;
import org.eclipse.wst.html.core.document.HTMLDocumentTypeEntry;
import org.eclipse.wst.html.core.document.HTMLDocumentTypeRegistry;
import org.eclipse.wst.sse.ui.contentproperties.ui.ComboList;
import org.eclipse.wst.sse.ui.nls.ResourceHandler;

public final class ContentSettingsRegistry {

	private static final String NONE = ResourceHandler.getString("UI_none"); //$NON-NLS-1$

	public static String maxLengthStringInHTMLDocumentTypeRegistry = ""; //$NON-NLS-1$
	public static String maxLengthStringInCharacterCodeRegistry = ""; //$NON-NLS-1$

	private ContentSettingsRegistry() {
	}

	public static void setHTMLDocumentTypeRegistryInto(ComboList combo) {
		combo.add(NONE, ""); //$NON-NLS-1$
		HTMLDocumentTypeRegistry reg = HTMLDocumentTypeRegistry.getInstance();
		Enumeration e = reg.getEntries();
		while (e.hasMoreElements()) {
			HTMLDocumentTypeEntry entry = (HTMLDocumentTypeEntry) e.nextElement();
			String publicId = entry.getPublicId();
			String displayName = entry.getDisplayName();
			if (displayName != null) {
				combo.add(displayName, publicId);
				if (displayName.length() > maxLengthStringInHTMLDocumentTypeRegistry.length())
					maxLengthStringInHTMLDocumentTypeRegistry = displayName;
			}
			else
				combo.add(publicId, publicId);
			if (publicId.length() > maxLengthStringInHTMLDocumentTypeRegistry.length())
				maxLengthStringInHTMLDocumentTypeRegistry = publicId;
			if (entry.getSystemId() == null)
				continue; // if HTML entry
			if (entry.getSystemId().length() > maxLengthStringInHTMLDocumentTypeRegistry.length())
				maxLengthStringInHTMLDocumentTypeRegistry = entry.getSystemId();
		}

		combo.sortByKey(1);
	}

	public static void setCSSMetaModelRegistryInto(ComboList combo) {
		 combo.add(NONE, ""); //$NON-NLS-1$
		 CSSProfileRegistry reg = CSSProfileRegistry.getInstance();
		 Iterator i = reg.getProfiles();
		 while (i.hasNext()) {
		 	CSSProfile profile = (CSSProfile) i.next();
		 	String id = profile.getProfileID();
		 	String name = profile.getProfileName();
		 	combo.add(name, id);
		 }
		 combo.sortByKey(1);
	}

	public static void setDeviceProfileRegistryInto(ComboList combo) {
		combo.add(NONE, ""); //$NON-NLS-1$
		DeviceProfileEntryProvider reg = DeviceProfileEntryProviderBuilder.getEntryProvider();
		if (reg == null) {
			return;
		}
		Iterator profiles = reg.getDeviceProfileEntries();
		if (profiles == null) {
			reg.release();
			return;
		}
		DeviceProfileEntry entry;
		while (profiles.hasNext()) {
			entry = (DeviceProfileEntry) profiles.next();
			combo.add(entry.getEntryName(), entry.getEntryId());
			entry.release();
		}
		reg.release();
		combo.sortByKey(1);
	}

	public static String getSystemIdFrom(String publicId) {
		if (publicId == null || publicId.length() == 0)
			return null;
		HTMLDocumentTypeRegistry reg = HTMLDocumentTypeRegistry.getInstance();
		Enumeration e = reg.getEntries();
		while (e.hasMoreElements()) {
			HTMLDocumentTypeEntry entry = (HTMLDocumentTypeEntry) e.nextElement();
			if (entry.getPublicId().equals(publicId))
				return entry.getSystemId();
		}
		return null;
	}

	public static void setContentTypeInto(ComboList combo) {
		String[] type = {"", //$NON-NLS-1$
					"application/xhtml+xml", //$NON-NLS-1$
					"application/xml", //$NON-NLS-1$
					"text/html", //$NON-NLS-1$
					"text/xml",}; //$NON-NLS-1$
		String[] displayName = {NONE, "application/xhtml+xml", //$NON-NLS-1$
		//$NON-NLS-1$
					"application/xml", //$NON-NLS-1$
					"text/html", //$NON-NLS-1$
					"text/xml",}; //$NON-NLS-1$
		for (int i = 0; i < type.length; i++) {
			if (displayName[i] != null && displayName[i].length() != 0)
				combo.add(displayName[i], type[i]);
			else
				combo.add(type[i], type[i]);
		}

	}

	public static void setCharacterCodeInto(ComboList combo) {
		combo.add(NONE, ""); //$NON-NLS-1$
		String max = ""; //$NON-NLS-1$
		//CommonCharsetNames encoding = new CommonCharsetNames();
		String[] charCode = CommonCharsetNames.getCommonCharsetNames();
		for (int i = 0; i < charCode.length; i++) {
			String displayName = CommonCharsetNames.getDisplayString(charCode[i]);
			if (displayName != null && displayName.length() != 0) {
				combo.add(displayName, charCode[i]);
				int n_byte = displayName.getBytes().length;
				if (max.getBytes().length < n_byte)
					max = displayName;
			}
			else
				combo.add(charCode[i], charCode[i]);
		}
		/*	
		 charCode = encoding.getSupportedJavaEncodings();
		 for(int i=0;i<charCode.length;i++){
		 String displayName = encoding.getDisplayString(charCode[i]);
		 if (displayName!=null && displayName.length()!=0)
		 combo.add(displayName,charCode[i]);
		 else
		 combo.add(charCode[i],charCode[i]);
		 }
		 */
		//	combo.sortByKey(1);
		maxLengthStringInCharacterCodeRegistry = max;
	}

	public static void setLanguageInto(ComboList combo) {
		String[] lang = {"", //$NON-NLS-1$
					"java", //$NON-NLS-1$
					"javascript",}; //$NON-NLS-1$
		String[] displayName = {NONE, "java", //$NON-NLS-1$
		//$NON-NLS-1$
					"javascript",}; //$NON-NLS-1$
		for (int i = 0; i < lang.length; i++) {
			if (displayName[i] != null && displayName[i].length() != 0)
				combo.add(displayName[i], lang[i]);
			else
				combo.add(lang[i], lang[i]);
		}
	}

}