001: /*******************************************************************************
002: * Copyright (c) 2000, 2006 IBM Corporation and others.
003: * All rights reserved. This program and the accompanying materials
004: * are made available under the terms of the Eclipse Public License v1.0
005: * which accompanies this distribution, and is available at
006: * http://www.eclipse.org/legal/epl-v10.html
007: *
008: * Contributors:
009: * IBM Corporation - initial API and implementation
010: *******************************************************************************/package org.eclipse.ui.texteditor;
011:
012: import java.util.HashMap;
013: import java.util.Iterator;
014: import java.util.Map;
015:
016: import org.eclipse.jface.text.source.Annotation;
017:
018: import org.eclipse.ui.internal.editors.text.EditorsPlugin;
019: import org.eclipse.ui.internal.texteditor.*;
020:
021: /**
022: * Provides the strategy for finding the annotation preference for a given
023: * annotation.
024: *
025: * @since 3.0
026: */
027: public class AnnotationPreferenceLookup {
028:
029: /** The map between annotation types and annotation preference fragments. */
030: private Map fFragments;
031:
032: /**
033: * Creates a new annotation preference lookup object.
034: */
035: public AnnotationPreferenceLookup() {
036: }
037:
038: /**
039: * Returns the annotation preference of a given annotation.
040: *
041: * @param annotation the annotation
042: * @return the annotation preference for the given annotation or <code>null</code>
043: */
044: public AnnotationPreference getAnnotationPreference(
045: Annotation annotation) {
046: return getAnnotationPreference(annotation.getType());
047: }
048:
049: /**
050: * Returns the annotation preference defined for the given annotation type.
051: *
052: * @param annotationType the annotation type
053: * @return the annotation preference for the given annotation type or <code>null</code>
054: */
055: public AnnotationPreference getAnnotationPreference(
056: String annotationType) {
057: if (annotationType == null
058: || annotationType == Annotation.TYPE_UNKNOWN)
059: return null;
060:
061: AnnotationTypeHierarchy hierarchy = getAnnotationTypeHierarchy();
062: AnnotationType type = hierarchy
063: .getAnnotationType(annotationType);
064: AnnotationPreference preference = type.getPreference();
065: if (preference == null) {
066: preference = new DelegatingAnnotationPreference(type, this );
067: type.setAnnotationPreference(preference);
068: }
069:
070: return preference;
071: }
072:
073: /**
074: * Returns the annotation preference fragment defined for the given
075: * annotation type.
076: * <p>
077: * For internal use only. Not intended to be called by clients.
078: *
079: * @param annotationType the annotation type
080: * @return the defined annotation preference fragment
081: */
082: public AnnotationPreference getAnnotationPreferenceFragment(
083: String annotationType) {
084: Map fragments = getPreferenceFragments();
085: return (AnnotationPreference) fragments.get(annotationType);
086: }
087:
088: /**
089: * Returns the annotation type hierarchy and creates it when not yet done.
090: *
091: * @return the annotation type hierarchy
092: */
093: private AnnotationTypeHierarchy getAnnotationTypeHierarchy() {
094: return EditorsPlugin.getDefault().getAnnotationTypeHierarchy();
095: }
096:
097: /**
098: * Returns a map between annotation type names and annotation preference
099: * fragments and creates it if not yet done.
100: *
101: * @return the map between annotation type names and annotation preference fragments
102: */
103: private synchronized Map getPreferenceFragments() {
104: if (fFragments == null) {
105: fFragments = new HashMap();
106: MarkerAnnotationPreferences p = new MarkerAnnotationPreferences();
107: Iterator e = p.getAnnotationPreferenceFragments()
108: .iterator();
109: while (e.hasNext()) {
110: AnnotationPreference fragment = (AnnotationPreference) e
111: .next();
112: Object annotationType = fragment.getAnnotationType();
113: AnnotationPreference preference = (AnnotationPreference) fFragments
114: .get(annotationType);
115: if (preference == null)
116: fFragments.put(annotationType, fragment);
117: else
118: preference.merge(fragment);
119: }
120: }
121: return fFragments;
122: }
123: }
|