/*******************************************************************************
 * Copyright (c) 2001, 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
 *     Jens Lukowski/Innoopract - initial renaming/restructuring
 *     
 *******************************************************************************/
package org.eclipse.wst.sse.ui.taginfo;

import java.util.HashMap;
import java.util.StringTokenizer;

import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.wst.sse.ui.internal.SSEUIPlugin;
import org.eclipse.wst.sse.ui.preferences.CommonEditorPreferenceNames;

/**
 * Manages text hovers for Structured Text editors
 * 
 * @author amywu
 */
public class TextHoverManager {
	/**
	 * Contains description of a text hover
	 */
	public class TextHoverDescriptor {
		private String fDescription;
		private boolean fEnabled;
		private String fId;
		private String fLabel;
		private String fModifierString;

		/**
		 * @param id
		 * @param label
		 * @param desc
		 */
		public TextHoverDescriptor(String id, String label, String desc) {
			fId = id;
			fLabel = label;
			fDescription = desc;
		}

		/**
		 * @param id
		 * @param label
		 * @param desc
		 * @param enabled
		 * @param modifierString
		 */
		public TextHoverDescriptor(String id, String label, String desc, boolean enabled, String modifierString) {
			fId = id;
			fLabel = label;
			fDescription = desc;
			fEnabled = enabled;
			fModifierString = modifierString;
		}

		/**
		 * @return Returns the fDescription.
		 */
		public String getDescription() {
			return fDescription;
		}

		/**
		 * @return Returns the fId.
		 */
		public String getId() {
			return fId;
		}

		/**
		 * @return Returns the fLabel
		 */
		public String getLabel() {
			return fLabel;
		}

		/**
		 * @return Returns the fModifierString.
		 */
		public String getModifierString() {
			return fModifierString;
		}

		/**
		 * @return Returns the fEnabled.
		 */
		public boolean isEnabled() {
			return fEnabled;
		}

		/**
		 * @param enabled
		 *            The fEnabled to set.
		 */
		public void setEnabled(boolean enabled) {
			fEnabled = enabled;
		}

		/**
		 * @param modifierString
		 *            The fModifierString to set.
		 */
		public void setModifierString(String modifierString) {
			fModifierString = modifierString;
		}
	}

	public static final String ANNOTATION_HOVER = "annotationHover"; //$NON-NLS-1$

	// list of different types of Source editor hovers
	public static final String COMBINATION_HOVER = "combinationHover"; //$NON-NLS-1$
	// hover descriptions are in .properties file with the key in the form of
	// "[id].desc"
	private static final String DESCRIPTION_KEY = ".desc"; //$NON-NLS-1$
	public static final String DOCUMENTATION_HOVER = "documentationHover"; //$NON-NLS-1$
	public static final String HOVER_ATTRIBUTE_SEPARATOR = "|"; //$NON-NLS-1$
	public static final String HOVER_SEPARATOR = ";"; //$NON-NLS-1$

	// hover labels are in .properties file with the key in the form of
	// "[id].label"
	private static final String LABEL_KEY = ".label"; //$NON-NLS-1$

	public static final String NO_MODIFIER = "0"; //$NON-NLS-1$
	public static final String PROBLEM_HOVER = "problemHover"; //$NON-NLS-1$
	public static final String[] TEXT_HOVER_IDS = new String[]{COMBINATION_HOVER, PROBLEM_HOVER, DOCUMENTATION_HOVER, ANNOTATION_HOVER};
	/**
	 * Current list of Structured Text editor text hovers
	 */
	private TextHoverDescriptor[] fTextHovers;

	public TextHoverManager() {
		super();
	}

	/**
	 * Generate a list of text hover descriptors from the given delimited
	 * string
	 * 
	 * @param textHoverStrings
	 * @return
	 */
	public TextHoverDescriptor[] generateTextHoverDescriptors(String textHoverStrings) {
		StringTokenizer st = new StringTokenizer(textHoverStrings, HOVER_SEPARATOR);

		// read from preference and load id-descriptor mapping to a hash table
		HashMap idToModifier = new HashMap(st.countTokens());
		while (st.hasMoreTokens()) {
			String textHoverString = st.nextToken();
			StringTokenizer st2 = new StringTokenizer(textHoverString, HOVER_ATTRIBUTE_SEPARATOR);
			if (st2.countTokens() == 3) {
				String id = st2.nextToken();
				boolean enabled = Boolean.valueOf(st2.nextToken()).booleanValue();
				String modifierString = st2.nextToken();
				if (modifierString.equals(NO_MODIFIER))
					modifierString = ""; //$NON-NLS-1$

				TextHoverDescriptor descriptor = new TextHoverDescriptor(id, SSEUIPlugin.getResourceString("%" + id + LABEL_KEY), SSEUIPlugin.getResourceString("%" + id + DESCRIPTION_KEY), enabled, modifierString);
				// should check to see if ids appear more than once
				idToModifier.put(id, descriptor);
			}
		}

		// go through all defined text hovers and match with their preference
		TextHoverDescriptor[] descriptors = new TextHoverDescriptor[TEXT_HOVER_IDS.length];
		for (int i = 0; i < TEXT_HOVER_IDS.length; i++) {
			TextHoverDescriptor desc = (TextHoverDescriptor) idToModifier.get(TEXT_HOVER_IDS[i]);
			if (desc != null) {
				descriptors[i] = desc;
			} else {
				descriptors[i] = new TextHoverDescriptor(TEXT_HOVER_IDS[i], SSEUIPlugin.getResourceString("%" + TEXT_HOVER_IDS[i] + LABEL_KEY), SSEUIPlugin.getResourceString("%" + TEXT_HOVER_IDS + DESCRIPTION_KEY));
			}
		}
		return descriptors;
	}

	private IPreferenceStore getPreferenceStore() {
		return SSEUIPlugin.getDefault().getPreferenceStore();
	}


	/**
	 * Returns the text hovers for Structured Text editor. If fTextHover has
	 * not been initialied, it will be initialized.
	 * 
	 * @return Returns the fTextHovers.
	 */
	public TextHoverDescriptor[] getTextHovers() {
		if (fTextHovers == null) {
			String textHoverStrings = getPreferenceStore().getString(CommonEditorPreferenceNames.EDITOR_TEXT_HOVER_MODIFIERS);
			fTextHovers = generateTextHoverDescriptors(textHoverStrings);
		}
		return fTextHovers;
	}

	/**
	 * Sets fTextHovers to null so that next time getTextHovers is called,
	 * fTextHovers will be populated with the latest preferences.
	 */
	public void resetTextHovers() {
		fTextHovers = null;
	}
}
