001: /*******************************************************************************
002: * Copyright (c) 2006, 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.internal.navigator.extensions;
011:
012: import java.util.ArrayList;
013: import java.util.HashMap;
014: import java.util.LinkedHashSet;
015: import java.util.List;
016: import java.util.Map;
017: import java.util.Set;
018:
019: import org.eclipse.jface.viewers.IStructuredSelection;
020: import org.eclipse.jface.viewers.StructuredSelection;
021: import org.eclipse.ui.IEditorInput;
022: import org.eclipse.ui.internal.navigator.NavigatorContentService;
023: import org.eclipse.ui.navigator.ILinkHelper;
024:
025: /**
026: * @since 3.2
027: *
028: */
029: public class LinkHelperService {
030:
031: private static final ILinkHelper[] CANT_GET_NO_HELP = new ILinkHelper[0];
032:
033: private NavigatorContentService contentService;
034:
035: private final Map linkHelpers = new HashMap();
036:
037: /**
038: * @param aContentService
039: * The associated content service for this link helper service.
040: */
041: public LinkHelperService(NavigatorContentService aContentService) {
042: contentService = aContentService;
043: }
044:
045: /**
046: *
047: * @param anObject
048: * An object from the viewer
049: * @return An array of link helpers that know about elements in the
050: * selection or null
051: */
052: public ILinkHelper[] getLinkHelpersFor(Object anObject) {
053:
054: LinkHelperDescriptor[] descriptors = LinkHelperManager
055: .getInstance().getLinkHelpersFor(anObject,
056: contentService);
057: if (descriptors.length == 0) {
058: return CANT_GET_NO_HELP;
059: }
060:
061: Set helpers = new LinkedHashSet();
062: for (int i = 0; i < descriptors.length; i++) {
063: helpers.add(getLinkHelper(descriptors[i]));
064: }
065: if (helpers.size() == 0)
066: return CANT_GET_NO_HELP;
067: return (ILinkHelper[]) helpers.toArray(new ILinkHelper[helpers
068: .size()]);
069:
070: }
071:
072: /**
073: *
074: * @param input
075: * The Editor input from the active viewer.
076: * @return An array of link helpers that know about elements in the
077: * selection or null
078: */
079: public ILinkHelper[] getLinkHelpersFor(IEditorInput input) {
080: LinkHelperDescriptor[] descriptors = LinkHelperManager
081: .getInstance().getLinkHelpersFor(input, contentService);
082: if (descriptors.length == 0) {
083: return CANT_GET_NO_HELP;
084: }
085:
086: Set helpers = new LinkedHashSet();
087: for (int i = 0; i < descriptors.length; i++) {
088: helpers.add(getLinkHelper(descriptors[i]));
089: }
090: if (helpers.size() == 0)
091: return CANT_GET_NO_HELP;
092: return (ILinkHelper[]) helpers.toArray(new ILinkHelper[helpers
093: .size()]);
094: }
095:
096: private ILinkHelper getLinkHelper(LinkHelperDescriptor descriptor) {
097: ILinkHelper helper = (ILinkHelper) linkHelpers.get(descriptor);
098: if (helper == null) {
099: synchronized (this ) {
100: if (helper == null) {
101: linkHelpers.put(descriptor, helper = descriptor
102: .createLinkHelper());
103: }
104: }
105: }
106: return helper;
107: }
108:
109: /**
110: * Return a selection that contains the elements that the given editor input
111: * represent.
112: * @param input the editor input
113: * @return a selection that contains the elements that the given editor input
114: * represent
115: */
116: public IStructuredSelection getSelectionFor(IEditorInput input) {
117: ILinkHelper[] helpers = getLinkHelpersFor(input);
118:
119: IStructuredSelection selection = StructuredSelection.EMPTY;
120: IStructuredSelection newSelection = StructuredSelection.EMPTY;
121:
122: for (int i = 0; i < helpers.length; i++) {
123: selection = helpers[i].findSelection(input);
124: if (selection != null && !selection.isEmpty()) {
125: newSelection = mergeSelection(newSelection, selection);
126: }
127: }
128: return newSelection;
129: }
130:
131: private IStructuredSelection mergeSelection(
132: IStructuredSelection aBase,
133: IStructuredSelection aSelectionToAppend) {
134: if (aBase == null || aBase.isEmpty()) {
135: return (aSelectionToAppend != null) ? aSelectionToAppend
136: : StructuredSelection.EMPTY;
137: } else if (aSelectionToAppend == null
138: || aSelectionToAppend.isEmpty()) {
139: return aBase;
140: } else {
141: List newItems = new ArrayList(aBase.toList());
142: newItems.addAll(aSelectionToAppend.toList());
143: return new StructuredSelection(newItems);
144: }
145: }
146: }
|