001: /*******************************************************************************
002: * Copyright (c) 2007 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.ArrayList;
013: import java.util.List;
014:
015: import org.eclipse.core.runtime.Assert;
016: import org.eclipse.core.runtime.CoreException;
017: import org.eclipse.core.runtime.IAdaptable;
018:
019: import org.eclipse.jface.preference.IPreferenceStore;
020:
021: import org.eclipse.jface.text.IRegion;
022: import org.eclipse.jface.text.ITextViewer;
023: import org.eclipse.jface.text.hyperlink.AbstractHyperlinkDetector;
024: import org.eclipse.jface.text.hyperlink.IHyperlink;
025: import org.eclipse.jface.text.hyperlink.IHyperlinkDetector;
026: import org.eclipse.jface.text.hyperlink.IHyperlinkDetectorExtension;
027: import org.eclipse.jface.text.hyperlink.IHyperlinkDetectorExtension2;
028:
029: /**
030: * Hyperlink detector registry that manages the detectors
031: * contributed by the <code>org.eclipse.ui.workbench.texteditor.hyperlinkDetectors</code> extension point for
032: * targets contributed by the <code>org.eclipse.ui.workbench.texteditor.hyperlinkDetectorTargets</code> extension point.
033: *
034: * @since 3.3
035: */
036: public final class HyperlinkDetectorRegistry {
037:
038: /**
039: * Delegate for contributed hyperlink detectors.
040: */
041: private class HyperlinkDetectorDelegate implements
042: IHyperlinkDetector, IHyperlinkDetectorExtension,
043: IHyperlinkDetectorExtension2 {
044:
045: private HyperlinkDetectorDescriptor fHyperlinkDescriptor;
046: private AbstractHyperlinkDetector fHyperlinkDetector;
047: private boolean fFailedDuringCreation = false;
048: private IAdaptable fContext;
049: private int fStateMask;
050: private boolean fIsEnabled;
051:
052: private HyperlinkDetectorDelegate(
053: HyperlinkDetectorDescriptor descriptor) {
054: fHyperlinkDescriptor = descriptor;
055: if (fPreferenceStore != null) {
056: fStateMask = fPreferenceStore
057: .getInt(fHyperlinkDescriptor.getId()
058: + HyperlinkDetectorDescriptor.STATE_MASK_POSTFIX);
059: fIsEnabled = !fPreferenceStore
060: .getBoolean(fHyperlinkDescriptor.getId());
061: }
062: }
063:
064: /*
065: * @see org.eclipse.jface.text.hyperlink.IHyperlinkDetector#detectHyperlinks(org.eclipse.jface.text.ITextViewer, org.eclipse.jface.text.IRegion, boolean)
066: */
067: public IHyperlink[] detectHyperlinks(ITextViewer textViewer,
068: IRegion region, boolean canShowMultipleHyperlinks) {
069: if (!isEnabled())
070: return null;
071:
072: if (!fFailedDuringCreation && fHyperlinkDetector == null) {
073: try {
074: fHyperlinkDetector = fHyperlinkDescriptor
075: .createHyperlinkDetector();
076: } catch (CoreException ex) {
077: fFailedDuringCreation = true;
078: }
079: if (fHyperlinkDetector != null && fContext != null)
080: fHyperlinkDetector.setContext(fContext);
081: }
082: if (fHyperlinkDetector != null)
083: return fHyperlinkDetector.detectHyperlinks(textViewer,
084: region, canShowMultipleHyperlinks);
085:
086: return null;
087: }
088:
089: private boolean isEnabled() {
090: return fIsEnabled;
091: }
092:
093: private void setContext(IAdaptable context) {
094: fContext = context;
095: }
096:
097: /*
098: * @see org.eclipse.jface.text.hyperlink.IHyperlinkDetectorExtension#dispose()
099: */
100: public void dispose() {
101: if (fHyperlinkDetector != null) {
102: fHyperlinkDetector.dispose();
103: fHyperlinkDetector = null;
104: }
105: fHyperlinkDescriptor = null;
106: fContext = null;
107: }
108:
109: /*
110: * @see org.eclipse.jface.text.hyperlink.IHyperlinkDetectorExtension#getStateMask()
111: * @since 3.3
112: */
113: public int getStateMask() {
114: return fStateMask;
115: }
116:
117: }
118:
119: private HyperlinkDetectorDescriptor[] fHyperlinkDetectorDescriptors;
120: private IPreferenceStore fPreferenceStore;
121:
122: /**
123: * Creates a new hyperlink detector registry.
124: */
125: public HyperlinkDetectorRegistry() {
126: }
127:
128: /**
129: * Creates a new hyperlink detector registry that controls
130: * hyperlink enablement via the given preference store.
131: * <p>
132: * The hyperlink detector id is used as preference key.
133: * The value is of type <code>Boolean</code> where
134: * <code>false</code> means that the hyperlink detector is active.
135: * </p>
136: *
137: * @param preferenceStore the preference store to be used
138: */
139: public HyperlinkDetectorRegistry(IPreferenceStore preferenceStore) {
140: fPreferenceStore = preferenceStore;
141: }
142:
143: /**
144: * Returns all hyperlink detectors contributed to the workbench.
145: *
146: * @return an array of hyperlink detector descriptors
147: */
148: public synchronized HyperlinkDetectorDescriptor[] getHyperlinkDetectorDescriptors() {
149: initHyperlinkDetectorDescriptors();
150: HyperlinkDetectorDescriptor[] result = new HyperlinkDetectorDescriptor[fHyperlinkDetectorDescriptors.length];
151: System.arraycopy(fHyperlinkDetectorDescriptors, 0, result, 0,
152: fHyperlinkDetectorDescriptors.length);
153: return result;
154: }
155:
156: /**
157: * Initializes the hyperlink detector descriptors.
158: */
159: private synchronized void initHyperlinkDetectorDescriptors() {
160: if (fHyperlinkDetectorDescriptors == null)
161: fHyperlinkDetectorDescriptors = HyperlinkDetectorDescriptor
162: .getContributedHyperlinkDetectors();
163: }
164:
165: /*
166: * @see org.eclipse.jface.text.hyperlink.IHyperlinkDetectorRegistry#createHyperlinkDetectors(java.lang.String[], org.eclipse.core.runtime.IAdaptable)
167: */
168: public IHyperlinkDetector[] createHyperlinkDetectors(
169: String targetId, IAdaptable context) {
170: Assert.isLegal(targetId != null);
171: initHyperlinkDetectorDescriptors();
172:
173: List result = new ArrayList();
174: for (int i = 0; i < fHyperlinkDetectorDescriptors.length; i++) {
175: if (targetId.equals(fHyperlinkDetectorDescriptors[i]
176: .getTargetId())) {
177: HyperlinkDetectorDelegate detector = new HyperlinkDetectorDelegate(
178: fHyperlinkDetectorDescriptors[i]);
179: result.add(detector);
180: detector.setContext(context);
181: }
182: }
183: return (IHyperlinkDetector[]) result
184: .toArray(new IHyperlinkDetector[result.size()]);
185: }
186:
187: }
|