/*******************************************************************************
 * Copyright (c) 2000, 2008 IBM Corporation 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:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.ui.texteditor;

import java.util.HashMap;
import java.util.Map;

import org.osgi.framework.Bundle;

import org.eclipse.swt.graphics.RGB;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.Platform;

import org.eclipse.jface.resource.ImageDescriptor;

import org.eclipse.ui.internal.texteditor.TextEditorPlugin;


/**
 * An annotation preference provides all the information required for handing
 * the preferences for the presentation of annotations of a specified type. The
 * type can be changed and retrieved using the <code>getAnnotationType</code>
 * and <code>setAnnotationType</code> methods. For each preference, getter and
 * setter methods are provided.
 * <p>
 * Preferences that may be changed by the user also have a corresponding key
 * that can be used to obtain the currently set value from an
 * <code>IPreferenceStore</code>.
 * </p>
 * <h3>The following annotation preferences are covered:</h3>
 * <h4>Display Preferences controlling how and where annotations are shown</h4>
 * <ul>
 * <li>as text background highlighting (and respective preference key),</li>
 * <li>as text decorations (and respective preference key),</li>
 * <li>on the overview ruler (and respective preference key),</li>
 * <li>on the overview ruler header,</li>
 * <li>on the vertical ruler (and respective preference key),</li>
 * </ul>
 * <h4>Additional Display Preferences</h4>
 * <ul>
 * <li>the base color for annotations of this type (and respective preference
 * key),
 * <li>the style of text decorations that are drawn (and respective preference
 * key),</li>
 * <li>the annotation image provider,</li>
 * <li>the quick fix image descriptor,</li>
 * <li>the image descriptor,</li>
 * <li>the symbolic image name,</li>
 * <li>the presentation layer.</li>
 * </ul>
 * <h4>Navigation Preferences</h4>
 * <ul>
 * <li>whether included in the "Go to Next Annotation" navigation action (and
 * respective preference key),</li>
 * <li>whether included in the "Go to Previous Annotation" navigation action
 * (and respective preference key),</li>
 * <li>whether to be shown in the "Go to Next/Previous Annotation" navigation
 * toolbar drop down (and respective preference key).</li>
 * </ul>
 * <h4>Preference Page Preferences</h4>
 * <ul>
 * <li>whether the annotation type should be included on the generic annotation
 * preference page,</li>
 * <li>preference label.</li>
 * </ul>
 *
 * @since 2.1
 */
public class AnnotationPreference {

	/* String constants for style enumeration */

	/**
	 * Constant defining no decoration for the show in text style preference.
	 * @since 3.0
	 */
	public static final String STYLE_NONE= "NONE"; //$NON-NLS-1$
	/**
	 * Constant defining squiggly decoration for the show in text style preference.
	 * @since 3.0
	 */
	public static final String STYLE_SQUIGGLES= "SQUIGGLES"; //$NON-NLS-1$
	/**
	 * Constant defining the native problem underline decoration for the show in
	 * text style preference.
	 * <p>
	 * The look of this style is platform dependent.
	 * </p>
	 * @since 3.4
	 */
	public static final String STYLE_PROBLEM_UNDERLINE= "PROBLEM_UNDERLINE"; //$NON-NLS-1$

	/**
	 * Constant defining box decoration for the show in text style preference.
	 * @since 3.0
	 */
	public static final String STYLE_BOX= "BOX"; //$NON-NLS-1$

	/**
	 * Constant defining dashed box decoration for the show in text style preference.
	 * @since 3.3
	 */
	public static final String STYLE_DASHED_BOX= "DASHED_BOX"; //$NON-NLS-1$

	/**
	 * Constant defining underline decoration for the show in text style preference.
	 * @since 3.0
	 */
	public static final String STYLE_UNDERLINE= "UNDERLINE"; //$NON-NLS-1$
	/**
	 * Constant defining i-beam decoration for the show in text style preference.
	 * @since 3.0
	 */
	public static final String STYLE_IBEAM= "IBEAM"; //$NON-NLS-1$

	/* IDs for presentation preference attributes */

	/**
	 * The image to be used for drawing in the vertical ruler.
	 * @since 3.0
	 */
	protected static final Object IMAGE_DESCRIPTOR= new Object();
	/**
	 * The Quick Fix image to be used for drawing in the vertical ruler.
	 * @since 3.2
	 */
	protected static final Object QUICK_FIX_IMAGE_DESCRIPTOR= new Object();
	/**
	 * The preference label.
	 * @since 3.0
	 */
	protected static final Object PREFERENCE_LABEL= new Object();
	/**
	 * The presentation layer.
	 * @since 3.0
	 */
	protected static final Object PRESENTATION_LAYER= new Object();
	/**
	 * The symbolic name of the image to be drawn in the vertical ruler.
	 * @since 3.0
	 */
	protected static final Object SYMBOLIC_IMAGE_NAME= new Object();
	/**
	 * Indicates whether the annotation type contributed to the overview ruler's header.
	 * @since 3.0
	 */
	protected static final Object HEADER_VALUE= new Object();
	/**
	 * The annotation image provider.
	 * @since 3.0
	 */
	protected static final Object IMAGE_PROVIDER= new Object();
	/**
	 * The value for the includeOnPreferencePage property.
	 * @since 3.0
	 */
	protected static final Object INCLUDE_ON_PREFERENCE_PAGE= new Object();

	/* IDs for preference store access and initialization */

	/**
	 * The preference key for the visibility inside text.
	 * @since 3.0
	 */
	protected static final Object TEXT_PREFERENCE_KEY= new Object();
	/**
	 * The visibility inside text.
	 * @since 3.0
	 */
	protected static final Object TEXT_PREFERENCE_VALUE= new Object();
	/**
	 * The preference key for the presentation color.
	 * @since 3.0
	 */
	protected static final Object COLOR_PREFERENCE_KEY= new Object();
	/** The presentation color.
	 * @since 3.0
	 */
	protected static final Object COLOR_PREFERENCE_VALUE= new Object();
	/**
	 * The preference key for highlighting inside text.
	 * @since 3.0
	 */
	protected static final Object HIGHLIGHT_PREFERENCE_KEY= new Object();
	/**
	 * The value for highlighting inside text.
	 * @since 3.0
	 */
	protected static final Object HIGHLIGHT_PREFERENCE_VALUE= new Object();
	/**
	 * The preference key for go to next navigation enablement.
	 * @since 3.0
	 */
	protected static final Object IS_GO_TO_NEXT_TARGET_KEY= new Object();
	/**
	 * The value for go to next navigation enablement.
	 * @since 3.0
	 */
	protected static final Object IS_GO_TO_NEXT_TARGET_VALUE= new Object();
	/**
	 * The preference key for go to previous navigation enablement.
	 * @since 3.0
	 */
	protected static final Object IS_GO_TO_PREVIOUS_TARGET_KEY= new Object();
	/**
	 * The value for go to previous navigation enablement.
	 * @since 3.0
	 */
	protected static final Object IS_GO_TO_PREVIOUS_TARGET_VALUE= new Object();
	/**
	 * The preference key for the visibility in the vertical ruler.
	 * @since 3.0
	 */
	protected static final Object VERTICAL_RULER_PREFERENCE_KEY= new Object();
	/**
	 * The visibility in the vertical ruler.
	 * @since 3.0
	 */
	protected static final Object VERTICAL_RULER_PREFERENCE_VALUE= new Object();
	/**
	 * The preference key for the visibility in the overview ruler.
	 * @since 3.0
	 */
	protected static final Object OVERVIEW_RULER_PREFERENCE_KEY= new Object();
	/**
	 * The visibility in the overview ruler.
	 * @since 3.0
	 */
	protected static final Object OVERVIEW_RULER_PREFERENCE_VALUE= new Object();
	/**
	 * The preference key for the visibility in the next/previous drop down toolbar action.
	 * @since 3.0
	 */
	protected static final Object SHOW_IN_NAVIGATION_DROPDOWN_KEY= new Object();
	/**
	 * The value for the visibility in the next/previous drop down toolbar action.
	 * @since 3.0
	 */
	protected static final Object SHOW_IN_NAVIGATION_DROPDOWN_VALUE= new Object();
	/**
	 * The preference key for the decoration style.
	 * @since 3.0
	 */
	protected static final Object TEXT_STYLE_PREFERENCE_KEY= new Object();
	/**
	 * The value for the text decoration style.
	 * @since 3.0
	 */
	protected static final Object TEXT_STYLE_PREFERENCE_VALUE= new Object();

	/**
	 * Array of all supported attributes.
	 * @since 3.0
	 */
	protected static final Object[] ATTRIBUTES= new Object[] {
			IMAGE_DESCRIPTOR,
			QUICK_FIX_IMAGE_DESCRIPTOR,
			PREFERENCE_LABEL,
			PRESENTATION_LAYER,
			SYMBOLIC_IMAGE_NAME,
			HEADER_VALUE,
			IMAGE_PROVIDER,
			TEXT_PREFERENCE_KEY,
			TEXT_PREFERENCE_VALUE,
			COLOR_PREFERENCE_KEY,
			COLOR_PREFERENCE_VALUE,
			HIGHLIGHT_PREFERENCE_KEY,
			HIGHLIGHT_PREFERENCE_VALUE,
			IS_GO_TO_NEXT_TARGET_KEY,
			IS_GO_TO_NEXT_TARGET_VALUE,
			IS_GO_TO_PREVIOUS_TARGET_KEY,
			IS_GO_TO_PREVIOUS_TARGET_VALUE,
			VERTICAL_RULER_PREFERENCE_KEY,
			VERTICAL_RULER_PREFERENCE_VALUE,
			OVERVIEW_RULER_PREFERENCE_KEY,
			OVERVIEW_RULER_PREFERENCE_VALUE,
			SHOW_IN_NAVIGATION_DROPDOWN_KEY,
			SHOW_IN_NAVIGATION_DROPDOWN_VALUE,
			TEXT_STYLE_PREFERENCE_KEY,
			TEXT_STYLE_PREFERENCE_VALUE,
			INCLUDE_ON_PREFERENCE_PAGE
	};

	/** The annotation type */
	private Object fAnnotationType;
	/** The marker type */
	private String fMarkerType;
	/** The marker severity */
	private int fSeverity;
	/**
	 * The annotation image provider.
	 * @since 3.0
	 */
	public IAnnotationImageProvider fAnnotationImageProvider;
	/**
	 * The configuration element from which to create the annotation image provider.
	 * @since 3.0
	 */
	public IConfigurationElement fConfigurationElement;
	/**
	 * The name of the attribute used to load the annotation image provider
	 * from the configuration element.
	 * @since 3.0
	 */
	public String fAnnotationImageProviderAttribute;
	/**
	 * The map of attributes.
	 * @since 3.0
	 */
	private Map<Object, Object> fAttributes= new HashMap<>();



	/**
	 * Creates a new un-initialized annotation preference. Note that instances
	 * with a <code>null</code> annotation type are invalid and should not be
	 * used.
	 */
	public AnnotationPreference() {
	}

	/**
	 * Creates a new annotation preference for the given annotation type.
	 *
	 * @param annotationType the annotation type
	 * @param colorKey the preference key for the presentation color
	 * @param textKey the preference key for the visibility inside text
	 * @param overviewRulerKey the preference key for the visibility in the
	 *        overview ruler
	 * @param presentationLayer the presentation layer
	 */
	public AnnotationPreference(Object annotationType, String colorKey, String textKey, String overviewRulerKey, int presentationLayer) {
		fAnnotationType= annotationType;
		setValue(COLOR_PREFERENCE_KEY, colorKey);
		setValue(TEXT_PREFERENCE_KEY, textKey);
		setValue(OVERVIEW_RULER_PREFERENCE_KEY, overviewRulerKey);
		setValue(PRESENTATION_LAYER, presentationLayer);
	}

	/**
	 * Sets the given value for the given attribute.
	 *
	 * @param attribute the attribute
	 * @param value the attribute value
	 * @since 3.0
	 */
	protected void setValue(Object attribute, Object value) {
		fAttributes.put(attribute, value);
	}

	/**
	 * Sets the given value for the given attribute.
	 *
	 * @param attribute the attribute
	 * @param value the attribute value
	 * @since 3.0
	 */
	protected void setValue(Object attribute, int value) {
		fAttributes.put(attribute, Integer.valueOf(value));
	}

	/**
	 * Sets the given value for the given attribute.
	 *
	 * @param attribute the attribute
	 * @param value the attribute value
	 * @since 3.0
	 */
	protected void setValue(Object attribute, boolean value) {
		fAttributes.put(attribute, value ? Boolean.TRUE : Boolean.FALSE);
	}

	/**
	 * Returns the value of the given attribute as string.
	 *
	 * @param attribute the attribute
	 * @return the attribute value
	 * @since 3.0
	 */
	protected String getStringValue(Object attribute) {
		Object value= fAttributes.get(attribute);
		if (value instanceof String)
			return (String) value;
		return null;
	}

	/**
	 * Returns the value of the given attribute as boolean.
	 *
	 * @param attribute the attribute
	 * @return the attribute value
	 * @since 3.0
	 */
	protected boolean getBooleanValue(Object attribute) {
		Object value= fAttributes.get(attribute);
		if (value instanceof Boolean)
			return ((Boolean) value).booleanValue();
		return false;
	}

	/**
	 * Returns the value of the given attribute as integer.
	 *
	 * @param attribute the attribute
	 * @return the attribute value
	 * @since 3.0
	 */
	protected int getIntegerValue(Object attribute) {
		Object value= fAttributes.get(attribute);
		if (value instanceof Integer)
			return ((Integer) value).intValue();
		return 0;
	}

	/**
	 * Returns the value of the given attribute.
	 *
	 * @param attribute the attribute
	 * @return the attribute value
	 * @since 3.0
	 */
	public Object getValue(Object attribute) {
		return fAttributes.get(attribute);
	}

	/**
	 * Returns whether the given attribute is defined.
	 *
	 * @param attribute the attribute
	 * @return <code>true</code> if the attribute has a value <code>false</code> otherwise
	 * @since 3.0
	 */
	public boolean hasValue(Object attribute) {
		return fAttributes.get(attribute) != null;
	}

	/**
	 * Returns whether the given string is a preference key.
	 *
	 * @param key the string to test
	 * @return <code>true</code> if the string is a preference key
	 */
	public boolean isPreferenceKey(String key) {
		if (key == null)
			return false;

		return key.equals(getStringValue(COLOR_PREFERENCE_KEY)) ||
				key.equals(getStringValue(OVERVIEW_RULER_PREFERENCE_KEY)) ||
				key.equals(getStringValue(TEXT_PREFERENCE_KEY)) ||
				key.equals(getStringValue(HIGHLIGHT_PREFERENCE_KEY)) ||
				key.equals(getStringValue(TEXT_STYLE_PREFERENCE_KEY)) ||
				key.equals(getStringValue(VERTICAL_RULER_PREFERENCE_KEY));
	}

	/**
	 * Returns the annotation type. Should not be null in a completely set up
	 * instance.
	 *
	 * @return the annotation type, <code>null</code> if the receiver has not
	 *         been initialized yet
	 */
	public Object getAnnotationType() {
		return fAnnotationType;
	}

	/**
	 * Returns the marker type.
	 *
	 * @return the marker type, or <code>null</code> if none is set
	 * @deprecated since 3.0
	 */
	@Deprecated
	public String getMarkerType() {
		return fMarkerType;
	}

	/**
	 * Returns the marker severity.
	 *
	 * @return the marker severity
	 * @deprecated since 3.0
	 */
	@Deprecated
	public int getSeverity() {
		return fSeverity;
	}

	/**
	 * Sets the annotation type. Note that instances with a <code>null</code>
	 * annotation type are considered invalid and should not be used with the
	 * framework.
	 *
	 * @param annotationType the annotation type
	 */
	public void setAnnotationType(Object annotationType) {
		fAnnotationType= annotationType;
	}

	/**
	 * Sets the marker type.
	 *
	 * @param markerType the marker type
	 */
	public void setMarkerType(String markerType) {
		fMarkerType= markerType;
	}

	/**
	 * Sets the marker severity.
	 *
	 * @param severity the marker severity
	 */
	public void setSeverity(int severity) {
		fSeverity= severity;
	}

	/**
	 * Returns the preference key for the presentation color.
	 *
	 * @return the preference key for the presentation color or <code>null</code>
	 *         if none is set
	 */
	public String getColorPreferenceKey() {
		return getStringValue(COLOR_PREFERENCE_KEY);
	}

	/**
	 * Returns the default presentation color.
	 *
	 * @return the default presentation color or <code>null</code> if none is
	 *         set
	 */
	public RGB getColorPreferenceValue() {
		return (RGB) getValue(COLOR_PREFERENCE_VALUE);
	}

	/**
	 * Returns the presentation string for this annotation type.
	 *
	 * @return the presentation string for this annotation type or <code>null</code>
	 *         if none is set
	 */
	public String getPreferenceLabel() {
		return getStringValue(PREFERENCE_LABEL);
	}

	/**
	 * Returns the preference key for the visibility in the overview ruler.
	 *
	 * @return the preference key for the visibility in the overview ruler or
	 *         <code>null</code> if none is set
	 */
	public String getOverviewRulerPreferenceKey() {
		return getStringValue(OVERVIEW_RULER_PREFERENCE_KEY);
	}

	/**
	 * Returns the default visibility in the overview ruler.
	 *
	 * @return the default visibility in the overview ruler
	 */
	public boolean getOverviewRulerPreferenceValue() {
		return getBooleanValue(OVERVIEW_RULER_PREFERENCE_VALUE);
	}

	/**
	 * Returns the preference key for the visibility in the vertical ruler.
	 *
	 * @return the preference key for the visibility in the vertical ruler or
	 *         <code>null</code> if none is set
	 * @since 3.0
	 */
	public String getVerticalRulerPreferenceKey() {
		return getStringValue(VERTICAL_RULER_PREFERENCE_KEY);
	}

	/**
	 * Returns the default visibility in the vertical ruler.
	 *
	 * @return the default visibility in the vertical ruler
	 * @since 3.0
	 */
	public boolean getVerticalRulerPreferenceValue() {
		return getBooleanValue(VERTICAL_RULER_PREFERENCE_VALUE);
	}

	/**
	 * Returns the presentation layer.
	 *
	 * @return the presentation layer
	 */
	public int getPresentationLayer() {
		return getIntegerValue(PRESENTATION_LAYER);
	}

	/**
	 * Returns the preference key for the visibility inside text.
	 *
	 * @return the preference key for the visibility inside text or <code>null</code>
	 *         if none is set
	 */
	public String getTextPreferenceKey() {
		return getStringValue(TEXT_PREFERENCE_KEY);
	}

	/**
	 * Returns the default visibility inside text.
	 *
	 * @return the default visibility inside text
	 */
	public boolean getTextPreferenceValue() {
		return getBooleanValue(TEXT_PREFERENCE_VALUE);
	}

	/**
	 * Returns the preference key for highlighting inside text.
	 *
	 * @return the preference key for highlighting inside text or <code>null</code>
	 *         if none is set
	 * @since 3.0
	 */
	public String getHighlightPreferenceKey() {
		return getStringValue(HIGHLIGHT_PREFERENCE_KEY);
	}

	/**
	 * Returns the default value for highlighting inside text.
	 *
	 * @return the default value for highlighting inside text
	 * @since 3.0
	 */
	public boolean getHighlightPreferenceValue() {
		return getBooleanValue(HIGHLIGHT_PREFERENCE_VALUE);
	}

	/**
	 * Returns whether the annotation type contributes to the header of the overview ruler.
	 *
	 * @return <code>true</code> if the annotation type contributes to the header of the overview ruler
	 */
	public boolean contributesToHeader() {
		return getBooleanValue(HEADER_VALUE);
	}

	/**
	 * Sets the preference key for the presentation color.
	 *
	 * @param colorKey the preference key
	 */
	public void setColorPreferenceKey(String colorKey) {
		setValue(COLOR_PREFERENCE_KEY, colorKey);
	}

	/**
	 * Sets the default presentation color.
	 *
	 * @param colorValue the default color
	 */
	public void setColorPreferenceValue(RGB colorValue) {
		setValue(COLOR_PREFERENCE_VALUE, colorValue);
	}

	/**
	 * Sets the presentation label of this annotation type.
	 *
	 * @param label the presentation label
	 */
	public void setPreferenceLabel(String label) {
		setValue(PREFERENCE_LABEL, label);
	}

	/**
	 * Sets the preference key for the visibility in the overview ruler.
	 *
	 * @param overviewRulerKey the preference key
	 */
	public void setOverviewRulerPreferenceKey(String overviewRulerKey) {
		setValue(OVERVIEW_RULER_PREFERENCE_KEY, overviewRulerKey);
	}

	/**
	 * Sets the default visibility in the overview ruler.
	 *
	 * @param overviewRulerValue <code>true</code> if visible by default, <code>false</code> otherwise
	 */
	public void setOverviewRulerPreferenceValue(boolean overviewRulerValue) {
		setValue(OVERVIEW_RULER_PREFERENCE_VALUE, overviewRulerValue);
	}

	/**
	 * Sets the preference key for the visibility in the vertical ruler.
	 *
	 * @param verticalRulerKey the preference key
	 * @since 3.0
	 */
	public void setVerticalRulerPreferenceKey(String verticalRulerKey) {
		setValue(VERTICAL_RULER_PREFERENCE_KEY, verticalRulerKey);
	}

	/**
	 * Sets the default visibility in the vertical ruler.
	 *
	 * @param verticalRulerValue <code>true</code> if visible by default, <code>false</code> otherwise
	 * @since 3.0
	 */
	public void setVerticalRulerPreferenceValue(boolean verticalRulerValue) {
		setValue(VERTICAL_RULER_PREFERENCE_VALUE, verticalRulerValue);
	}

	/**
	 * Sets the presentation layer.
	 *
	 * @param presentationLayer the presentation layer
	 */
	public void setPresentationLayer(int presentationLayer) {
		setValue(PRESENTATION_LAYER, presentationLayer);
	}

	/**
	 * Sets the preference key for the visibility of squiggles inside text.
	 *
	 * @param textKey the preference key
	 */
	public void setTextPreferenceKey(String textKey) {
		setValue(TEXT_PREFERENCE_KEY, textKey);
	}

	/**
	 * Sets the default visibility inside text.
	 *
	 * @param textValue <code>true</code> if visible by default, <code>false</code> otherwise
	 */
	public void setTextPreferenceValue(boolean textValue) {
		setValue(TEXT_PREFERENCE_VALUE, textValue);
	}

	/**
	 * Sets the preference key for highlighting inside text.
	 *
	 * @param highlightKey the preference key
	 * @since 3.0
	 */
	public void setHighlightPreferenceKey(String highlightKey) {
		setValue(HIGHLIGHT_PREFERENCE_KEY, highlightKey);
	}

	/**
	 * Sets the default value for highlighting inside text.
	 *
	 * @param highlightValue <code>true</code> if highlighted in text by default, <code>false</code> otherwise
	 * @since 3.0
	 */
	public void setHighlightPreferenceValue(boolean highlightValue) {
		setValue(HIGHLIGHT_PREFERENCE_VALUE, highlightValue);
	}

	/**
	 * Sets whether the annotation type contributes to the overview ruler's header.
	 *
	 * @param contributesToHeader <code>true</code> if in header, <code>false</code> otherwise
	 */
	public void setContributesToHeader(boolean contributesToHeader) {
		setValue(HEADER_VALUE, contributesToHeader);
	}

	/**
	 * Returns the default value for go to next navigation enablement.
	 *
	 * @return <code>true</code> if enabled by default
	 * @since 3.0
	 */
	public boolean isGoToNextNavigationTarget() {
		return getBooleanValue(IS_GO_TO_NEXT_TARGET_VALUE);
	}

	/**
	 * Sets the default value for go to next navigation enablement.
	 *
	 * @param isGoToNextNavigationTarget <code>true</code> if enabled by default
	 * @since 3.0
	 */
	public void setIsGoToNextNavigationTarget(boolean isGoToNextNavigationTarget) {
		setValue(IS_GO_TO_NEXT_TARGET_VALUE, isGoToNextNavigationTarget);
	}

	/**
	 * Returns the preference key for go to next navigation enablement.
	 *
	 * @return the preference key or <code>null</code> if the key is undefined
	 * @since 3.0
	 */
	public String getIsGoToNextNavigationTargetKey() {
		return getStringValue(IS_GO_TO_NEXT_TARGET_KEY);
	}

	/**
	 * Sets the preference key for go to next navigation enablement.
	 *
	 * @param isGoToNextNavigationTargetKey <code>true</code> if enabled by default
	 * @since 3.0
	 */
	public void setIsGoToNextNavigationTargetKey(String isGoToNextNavigationTargetKey) {
		setValue(IS_GO_TO_NEXT_TARGET_KEY, isGoToNextNavigationTargetKey);
	}

	/**
	 * Returns the default value for go to previous navigation enablement.
	 *
	 * @return <code>true</code> if enabled by default
	 * @since 3.0
	 */
	public boolean isGoToPreviousNavigationTarget() {
		return getBooleanValue(IS_GO_TO_PREVIOUS_TARGET_VALUE);
	}

	/**
	 * Sets the default value for go to previous navigation enablement.
	 *
	 * @param isGoToPreviousNavigationTarget <code>true</code> if enabled by default
	 * @since 3.0
	 */
	public void setIsGoToPreviousNavigationTarget(boolean isGoToPreviousNavigationTarget) {
		setValue(IS_GO_TO_PREVIOUS_TARGET_VALUE, isGoToPreviousNavigationTarget);
	}

	/**
	 * Returns the preference key for go to previous navigation enablement.
	 *
	 * @return the preference key or <code>null</code> if the key is undefined
	 * @since 3.0
	 */
	public String getIsGoToPreviousNavigationTargetKey() {
		return getStringValue(IS_GO_TO_PREVIOUS_TARGET_KEY);
	}

	/**
	 * Sets the preference key for go to previous navigation enablement.
	 *
	 * @param isGoToPreviousNavigationTargetKey the preference key
	 * @since 3.0
	 */
	public void setIsGoToPreviousNavigationTargetKey(String isGoToPreviousNavigationTargetKey) {
		setValue(IS_GO_TO_PREVIOUS_TARGET_KEY, isGoToPreviousNavigationTargetKey);
	}

	/**
	 * Returns the preference key for the visibility in the next/previous drop down toolbar action.
	 *
	 * @return the preference key or <code>null</code> if the key is undefined
	 * @since 3.0
	 */
	public String getShowInNextPrevDropdownToolbarActionKey() {
		return getStringValue(SHOW_IN_NAVIGATION_DROPDOWN_KEY);
	}

	/**
	 * Sets the preference key for the visibility in the next/previous drop down toolbar action.
	 *
	 * @param showInNextPrevDropdownToolbarActionKey the preference key
	 * @since 3.0
	 */
	public void setShowInNextPrevDropdownToolbarActionKey(String showInNextPrevDropdownToolbarActionKey) {
		setValue(SHOW_IN_NAVIGATION_DROPDOWN_KEY, showInNextPrevDropdownToolbarActionKey);
	}

	/**
	 * Returns the default value for the visibility in the next/previous drop down toolbar action.
	 *
	 * @return <code>true</code> if enabled by default
	 * @since 3.0
	 */
	public boolean isShowInNextPrevDropdownToolbarAction() {
		return getBooleanValue(SHOW_IN_NAVIGATION_DROPDOWN_VALUE);
	}

	/**
	 * Sets the default value for the visibility in the next/previous drop down toolbar action.
	 *
	 * @param showInNextPrevDropdownToolbarAction <code>true</code> if enabled by default
	 * @since 3.0
	 */
	public void setShowInNextPrevDropdownToolbarAction(boolean showInNextPrevDropdownToolbarAction) {
		setValue(SHOW_IN_NAVIGATION_DROPDOWN_VALUE, showInNextPrevDropdownToolbarAction);
	}

	/**
	 * Sets the preference key for the text style property.
	 *
	 * @param key the new key
	 * @since 3.0
	 */
	public void setTextStylePreferenceKey(String key) {
		setValue(TEXT_STYLE_PREFERENCE_KEY, key);
	}

	/**
	 * Returns the preference key for the decoration style used when the annotation is shown in text.
	 *
	 * @return the preference key for the decoration style or <code>null</code> if the key is undefined
	 * @since 3.0
	 */
	public String getTextStylePreferenceKey() {
		return getStringValue(TEXT_STYLE_PREFERENCE_KEY);
	}

	/**
	 * Returns the value for the decoration style used when the annotation is shown in text.
	 *
	 * @return the value for the decoration style or <code>null</code> if the key is undefined
	 * @since 3.0
	 */
	public String getTextStyleValue() {
		return getStringValue(TEXT_STYLE_PREFERENCE_VALUE);
	}

	/**
	 * Sets the value for the text style property.
	 *
	 * @param value the new text decoration style
	 * @since 3.0
	 */
	public void setTextStyleValue(String value) {
		if (!STYLE_NONE.equals(value) && !STYLE_BOX.equals(value) && !STYLE_DASHED_BOX.equals(value)
				&& !STYLE_IBEAM.equals(value) && !STYLE_SQUIGGLES.equals(value)
				&& !STYLE_PROBLEM_UNDERLINE.equals(value) && !STYLE_UNDERLINE.equals(value))
			throw new IllegalArgumentException();

		setValue(TEXT_STYLE_PREFERENCE_VALUE, value);
	}

	/**
	 * Returns the image descriptor for the image to be drawn in the vertical ruler. The provided
	 * image is only used, if <code>getAnnotationImageProvider</code> returns <code>null</code>.
	 *
	 * @return the image descriptor or <code>null</code>
	 * @since 3.0
	 */
	public ImageDescriptor getImageDescriptor() {
		return (ImageDescriptor) getValue(IMAGE_DESCRIPTOR);
	}

	/**
	 * Sets the image descriptor for the image to be drawn in the vertical ruler.
	 *
	 * @param descriptor the image descriptor
	 * @since 3.0
	 */
	public void setImageDescriptor(ImageDescriptor descriptor) {
		setValue(IMAGE_DESCRIPTOR, descriptor);
	}

	/**
	 * Returns the symbolic name of the image to be drawn in the vertical ruler.
	 * The image is only used if <code>getImageDescriptor</code> returns <code>null</code>.
	 *
	 * @return the symbolic name of the image or <code>null</code>
	 * @since 3.0
	 */
	public String getSymbolicImageName() {
		return getStringValue(SYMBOLIC_IMAGE_NAME);
	}

	/**
	 * Sets the symbolic name of the image to be drawn in the vertical ruler.
	 *
	 * @param symbolicImageName the symbolic image name
	 * @since 3.0
	 */
	public void setSymbolicImageName(String symbolicImageName) {
		setValue(SYMBOLIC_IMAGE_NAME, symbolicImageName);
	}

	/**
	 * Returns the annotation image provider. If no default annotation image
	 * provider has been set, this method checks whether the annotation image
	 * provider data has been set. If so, an annotation image provider is
	 * created if the configuration element's plug-in is loaded. When an
	 * annotation image provider has been created successfully, it is set as
	 * the default annotation image provider.
	 *
	 * @return the annotation image provider
	 * @since 3.0
	 */
	public IAnnotationImageProvider getAnnotationImageProvider() {
		if (fAnnotationImageProvider == null) {
			if (fConfigurationElement != null && fAnnotationImageProviderAttribute != null) {
				Bundle bundle= Platform.getBundle( fConfigurationElement.getContributor().getName());
				if (bundle != null && bundle.getState() == Bundle.ACTIVE) {
					try {
						fAnnotationImageProvider= (IAnnotationImageProvider) fConfigurationElement.createExecutableExtension(fAnnotationImageProviderAttribute);
					} catch (CoreException x) {
						TextEditorPlugin.getDefault().getLog().log(x.getStatus());
					}
				}
			}
		}
		return fAnnotationImageProvider;
	}

	/**
	 * Sets the annotation image provider who provides images for annotations
	 * of the specified annotation type.
	 *
	 * @param provider the annotation image provider
	 * @since 3.0
	 */
	public void setAnnotationImageProvider(IAnnotationImageProvider provider) {
		fAnnotationImageProvider= provider;
		setValue(IMAGE_PROVIDER, provider != null);
	}

	/**
	 * Sets the data needed to create the annotation image provider.
	 *
	 * @param configurationElement the configuration element
	 * @param annotationImageProviderAttribute the attribute of the
	 *            configuration element
	 * @since 3.0
	 */
	public void setAnnotationImageProviderData(IConfigurationElement configurationElement, String annotationImageProviderAttribute) {
		fConfigurationElement= configurationElement;
		fAnnotationImageProviderAttribute= annotationImageProviderAttribute;
		setValue(IMAGE_PROVIDER, annotationImageProviderAttribute != null);
	}

	/**
	 * Sets the property of this annotation preference whether it should be included
	 * on the default annotation preference page.
	 *
	 * @param includeOnPreferencePage the new value
	 * @since 3.0
	 */
	public void setIncludeOnPreferencePage(boolean includeOnPreferencePage) {
		setValue(INCLUDE_ON_PREFERENCE_PAGE, includeOnPreferencePage);
	}

	/**
	 * Returns the property of the receiver of whether it should be included on
	 * the default annotation preference page.
	 *
	 * @return the includeOnPreferencePage property
	 * @since 3.0
	 */
	public boolean isIncludeOnPreferencePage() {
		Object value= fAttributes.get(INCLUDE_ON_PREFERENCE_PAGE);
		if (value instanceof Boolean)
			return ((Boolean) value).booleanValue();
		return true;
	}

	/**
	 * Merges the values of the given preference into this preference. Existing
	 * values will not be overwritten. Subclasses may extend.
	 *
	 * @param preference the preference to merge into this preference
	 * @since 3.0
	 */
	public void merge(AnnotationPreference preference) {
		if (!getAnnotationType().equals(preference.getAnnotationType()))
			return;

		for (int i= 0; i < ATTRIBUTES.length; i++) {
			if (!hasValue(ATTRIBUTES[i]))
				setValue(ATTRIBUTES[i], preference.getValue(ATTRIBUTES[i]));
		}

		if (fAnnotationImageProvider == null)
			fAnnotationImageProvider= preference.fAnnotationImageProvider;
		if (fConfigurationElement == null)
			fConfigurationElement= preference.fConfigurationElement;
		if (fAnnotationImageProviderAttribute == null)
			fAnnotationImageProviderAttribute= preference.fAnnotationImageProviderAttribute;
	}

	/**
	 * Sets the Quick Fix image descriptor for the image to be drawn in the vertical ruler.
	 *
	 * @param descriptor the image descriptor
	 * @since 3.2
	 */
	public void setQuickFixImageDescriptor(ImageDescriptor descriptor) {
		setValue(QUICK_FIX_IMAGE_DESCRIPTOR, descriptor);
	}

	/**
	 * Returns the Quick Fix image descriptor for the image to be drawn in the vertical ruler. The provided
	 * image is only used, if <code>getAnnotationImageProvider</code> returns <code>null</code>.
	 *
	 * @return the image descriptor or <code>null</code>
	 * @since 3.2
	 */
	public ImageDescriptor getQuickFixImageDescriptor() {
		return (ImageDescriptor) getValue(QUICK_FIX_IMAGE_DESCRIPTOR);
	}

}
