Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read this important communication.
View | Details | Raw Unified | Return to bug 228022 | Differences between
and this patch

Collapse All | Expand All

(-)schema/navigatorContent.exsd (+12 lines)
Lines 134-139 Link Here
134
               </restriction>
134
               </restriction>
135
            </simpleType>
135
            </simpleType>
136
         </attribute>
136
         </attribute>
137
         <attribute name="appearsBefore" type="string">
138
            <annotation>
139
               <documentation>
140
                  Specifies the ID of the navigator content that this navigator content appears before.  This navigator content will be processed before the specified navigator content is processed.
141
&lt;br/&gt;&lt;br/&gt;
142
The overall order in which the navigator content extensions are processed is calculated by first sorting all of the NCEs by priority, and then rearranging them according to the &lt;b&gt;appearsBefore&lt;/b&gt; relationship. Once the overall order is determined, a unique sequence number is assigned to each navigator content descriptior which is available through the API.
143
               </documentation>
144
               <appInfo>
145
                  <meta.attribute kind="identifier" basedOn="org.eclipse.ui.navigator.navigatorContent/navigatorContent/@id"/>
146
               </appInfo>
147
            </annotation>
148
         </attribute>
137
         <attribute name="contentProvider" type="string">
149
         <attribute name="contentProvider" type="string">
138
            <annotation>
150
            <annotation>
139
               <documentation>
151
               <documentation>
(-)src/org/eclipse/ui/internal/navigator/NavigatorContentService.java (-7 / +7 lines)
Lines 44-50 Link Here
44
44
45
import org.eclipse.ui.IMemento;
45
import org.eclipse.ui.IMemento;
46
import org.eclipse.ui.internal.navigator.dnd.NavigatorDnDService;
46
import org.eclipse.ui.internal.navigator.dnd.NavigatorDnDService;
47
import org.eclipse.ui.internal.navigator.extensions.ExtensionPriorityComparator;
47
import org.eclipse.ui.internal.navigator.extensions.ExtensionSequenceNumberComparator;
48
import org.eclipse.ui.internal.navigator.extensions.NavigatorContentDescriptor;
48
import org.eclipse.ui.internal.navigator.extensions.NavigatorContentDescriptor;
49
import org.eclipse.ui.internal.navigator.extensions.NavigatorContentDescriptorManager;
49
import org.eclipse.ui.internal.navigator.extensions.NavigatorContentDescriptorManager;
50
import org.eclipse.ui.internal.navigator.extensions.NavigatorContentExtension;
50
import org.eclipse.ui.internal.navigator.extensions.NavigatorContentExtension;
Lines 538-546 Link Here
538
			boolean toRespectViewerRoots) {
538
			boolean toRespectViewerRoots) {
539
539
540
		SortedSet rootExtensions = new TreeSet(
540
		SortedSet rootExtensions = new TreeSet(
541
				ExtensionPriorityComparator.INSTANCE);
541
				ExtensionSequenceNumberComparator.INSTANCE);
542
		if (toRespectViewerRoots
542
		if (toRespectViewerRoots
543
				&& viewerDescriptor.hasOverriddenRootExtensions()) {
543
				/*&& viewerDescriptor.hasOverriddenRootExtensions()*/) {
544
544
545
			NavigatorContentDescriptor[] descriptors = CONTENT_DESCRIPTOR_REGISTRY
545
			NavigatorContentDescriptor[] descriptors = CONTENT_DESCRIPTOR_REGISTRY
546
					.getAllContentDescriptors();
546
					.getAllContentDescriptors();
Lines 576-582 Link Here
576
	public Set findOverrideableContentExtensionsForPossibleChild(
576
	public Set findOverrideableContentExtensionsForPossibleChild(
577
			Object anElement) {
577
			Object anElement) {
578
		Set overrideableExtensions = new TreeSet(
578
		Set overrideableExtensions = new TreeSet(
579
				ExtensionPriorityComparator.INSTANCE);
579
				ExtensionSequenceNumberComparator.INSTANCE);
580
		Set descriptors = findDescriptorsWithPossibleChild(anElement, false);
580
		Set descriptors = findDescriptorsWithPossibleChild(anElement, false);
581
		for (Iterator iter = descriptors.iterator(); iter.hasNext();) {
581
		for (Iterator iter = descriptors.iterator(); iter.hasNext();) {
582
			INavigatorContentDescriptor descriptor = (INavigatorContentDescriptor) iter
582
			INavigatorContentDescriptor descriptor = (INavigatorContentDescriptor) iter
Lines 776-782 Link Here
776
		// Here we use the cache, since objects are inserted into the
776
		// Here we use the cache, since objects are inserted into the
777
		// cache in response to the trigger point
777
		// cache in response to the trigger point
778
		NavigatorContentDescriptor descriptor = getSourceOfContribution(anElement);
778
		NavigatorContentDescriptor descriptor = getSourceOfContribution(anElement);
779
		Set result = new TreeSet(ExtensionPriorityComparator.INSTANCE);
779
		Set result = new TreeSet(ExtensionSequenceNumberComparator.INSTANCE);
780
		if (descriptor != null) {
780
		if (descriptor != null) {
781
			result.add(descriptor);
781
			result.add(descriptor);
782
		}
782
		}
Lines 816-822 Link Here
816
	public Set findDescriptorsWithPossibleChild(Object anElement,
816
	public Set findDescriptorsWithPossibleChild(Object anElement,
817
			boolean toComputeOverrides) {
817
			boolean toComputeOverrides) {
818
		// Don't use the cache which is only used for triggerPoints
818
		// Don't use the cache which is only used for triggerPoints
819
		Set result = new TreeSet(ExtensionPriorityComparator.INSTANCE);
819
		Set result = new TreeSet(ExtensionSequenceNumberComparator.INSTANCE);
820
		result.addAll(CONTENT_DESCRIPTOR_REGISTRY
820
		result.addAll(CONTENT_DESCRIPTOR_REGISTRY
821
				.findDescriptorsForPossibleChild(anElement, assistant,
821
				.findDescriptorsForPossibleChild(anElement, assistant,
822
						toComputeOverrides));
822
						toComputeOverrides));
Lines 1196-1202 Link Here
1196
		if (theDescriptors.size() == 0) {
1196
		if (theDescriptors.size() == 0) {
1197
			return Collections.EMPTY_SET;
1197
			return Collections.EMPTY_SET;
1198
		}
1198
		}
1199
		Set resultInstances = new TreeSet(ExtensionPriorityComparator.INSTANCE);
1199
		Set resultInstances = new TreeSet(ExtensionSequenceNumberComparator.INSTANCE);
1200
		for (Iterator descriptorIter = theDescriptors.iterator(); descriptorIter
1200
		for (Iterator descriptorIter = theDescriptors.iterator(); descriptorIter
1201
				.hasNext();) {
1201
				.hasNext();) {
1202
			NavigatorContentExtension extension = getExtension(
1202
			NavigatorContentExtension extension = getExtension(
(-)src/org/eclipse/ui/internal/navigator/NavigatorSaveablesService.java (-2 / +2 lines)
Lines 36-42 Link Here
36
import org.eclipse.ui.Saveable;
36
import org.eclipse.ui.Saveable;
37
import org.eclipse.ui.SaveablesLifecycleEvent;
37
import org.eclipse.ui.SaveablesLifecycleEvent;
38
import org.eclipse.ui.internal.navigator.VisibilityAssistant.VisibilityListener;
38
import org.eclipse.ui.internal.navigator.VisibilityAssistant.VisibilityListener;
39
import org.eclipse.ui.internal.navigator.extensions.ExtensionPriorityComparator;
39
import org.eclipse.ui.internal.navigator.extensions.ExtensionSequenceNumberComparator;
40
import org.eclipse.ui.internal.navigator.extensions.NavigatorContentDescriptor;
40
import org.eclipse.ui.internal.navigator.extensions.NavigatorContentDescriptor;
41
import org.eclipse.ui.internal.navigator.extensions.NavigatorContentExtension;
41
import org.eclipse.ui.internal.navigator.extensions.NavigatorContentExtension;
42
import org.eclipse.ui.navigator.INavigatorContentDescriptor;
42
import org.eclipse.ui.navigator.INavigatorContentDescriptor;
Lines 436-442 Link Here
436
		// TODO optimize this
436
		// TODO optimize this
437
		if (saveablesProviders == null) {
437
		if (saveablesProviders == null) {
438
			inactivePluginsWithSaveablesProviders = new HashMap();
438
			inactivePluginsWithSaveablesProviders = new HashMap();
439
			saveablesProviderMap = new TreeMap(ExtensionPriorityComparator.INSTANCE);
439
			saveablesProviderMap = new TreeMap(ExtensionSequenceNumberComparator.INSTANCE);
440
			INavigatorContentDescriptor[] descriptors = contentService
440
			INavigatorContentDescriptor[] descriptors = contentService
441
					.getActiveDescriptorsWithSaveables();
441
					.getActiveDescriptorsWithSaveables();
442
			List result = new ArrayList();
442
			List result = new ArrayList();
(-)src/org/eclipse/ui/internal/navigator/dnd/CommonDropDescriptorManager.java (-2 / +2 lines)
Lines 20-26 Link Here
20
import java.util.TreeMap;
20
import java.util.TreeMap;
21
21
22
import org.eclipse.core.runtime.IConfigurationElement;
22
import org.eclipse.core.runtime.IConfigurationElement;
23
import org.eclipse.ui.internal.navigator.extensions.ExtensionPriorityComparator;
23
import org.eclipse.ui.internal.navigator.extensions.ExtensionSequenceNumberComparator;
24
import org.eclipse.ui.internal.navigator.extensions.INavigatorContentExtPtConstants;
24
import org.eclipse.ui.internal.navigator.extensions.INavigatorContentExtPtConstants;
25
import org.eclipse.ui.internal.navigator.extensions.NavigatorContentRegistryReader;
25
import org.eclipse.ui.internal.navigator.extensions.NavigatorContentRegistryReader;
26
import org.eclipse.ui.navigator.INavigatorContentDescriptor;
26
import org.eclipse.ui.navigator.INavigatorContentDescriptor;
Lines 40-46 Link Here
40
	 * A map of (INavigatorContentDescriptor,
40
	 * A map of (INavigatorContentDescriptor,
41
	 * CommonDropAdapterDescriptor)-pairs.
41
	 * CommonDropAdapterDescriptor)-pairs.
42
	 */
42
	 */
43
	private final Map dropDescriptors = new TreeMap(ExtensionPriorityComparator.INSTANCE);
43
	private final Map dropDescriptors = new TreeMap(ExtensionSequenceNumberComparator.INSTANCE);
44
44
45
	/**
45
	/**
46
	 * 
46
	 * 
(-)src/org/eclipse/ui/internal/navigator/extensions/ExtensionPriorityComparator.java (-82 lines)
Removed Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2006, 2008 IBM Corporation and others.
3
 * All rights reserved. This program and the accompanying materials
4
 * are made available under the terms of the Eclipse Public License v1.0
5
 * which accompanies this distribution, and is available at
6
 * http://www.eclipse.org/legal/epl-v10.html
7
 *
8
 * Contributors:
9
 *     IBM Corporation - initial API and implementation
10
 *******************************************************************************/
11
12
package org.eclipse.ui.internal.navigator.extensions;
13
14
import java.util.Comparator;
15
16
import org.eclipse.ui.navigator.INavigatorContentDescriptor;
17
import org.eclipse.ui.navigator.INavigatorContentExtension;
18
19
/**
20
 * @since 3.2
21
 * 
22
 */
23
public class ExtensionPriorityComparator implements Comparator {
24
25
	/**
26
	 * The initialized singleton instance.
27
	 */
28
	public static final ExtensionPriorityComparator INSTANCE = new ExtensionPriorityComparator(true);
29
30
	/**
31
	 * The initialized singleton instance.
32
	 */
33
	public static final ExtensionPriorityComparator DESCENDING = new ExtensionPriorityComparator(false);
34
	
35
	private final int sortAscending;
36
	
37
	/**
38
	 * Creates an instance that sorts according to the given boolean flag.
39
	 * 
40
	 * @param toSortAscending
41
	 *            <code>true</code> for ascending sort order or
42
	 *            <code>false</code> for descending sort order.
43
	 */
44
	public ExtensionPriorityComparator(boolean toSortAscending) {
45
		sortAscending = toSortAscending ? 1 : -1; 
46
	}
47
48
	/*
49
	 * (non-Javadoc)
50
	 * 
51
	 * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
52
	 */
53
	public int compare(Object o1, Object o2) {
54
55
		INavigatorContentDescriptor lvalue = null;
56
		INavigatorContentDescriptor rvalue = null;
57
58
		if (o1 instanceof INavigatorContentDescriptor) {
59
			lvalue = (INavigatorContentDescriptor) o1;
60
		} else if (o1 instanceof INavigatorContentExtension) {
61
			lvalue = ((INavigatorContentExtension) o1).getDescriptor();
62
		}
63
64
		if (o2 instanceof INavigatorContentDescriptor) {
65
			rvalue = (INavigatorContentDescriptor) o2;
66
		} else if (o2 instanceof INavigatorContentExtension) {
67
			rvalue = ((INavigatorContentExtension) o2).getDescriptor();
68
		}
69
70
		if (lvalue == null || rvalue == null) {
71
			return  -1 * sortAscending;
72
		}
73
74
		int c = lvalue.getPriority() - rvalue.getPriority();
75
		if (c != 0) {
76
			return c * sortAscending;
77
		}
78
		return lvalue.getId().compareTo(rvalue.getId()) * sortAscending;
79
80
	}
81
82
}
(-)src/org/eclipse/ui/internal/navigator/extensions/ExtensionSequenceNumberComparator.java (+82 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2006, 2010 IBM Corporation and others.
3
 * All rights reserved. This program and the accompanying materials
4
 * are made available under the terms of the Eclipse Public License v1.0
5
 * which accompanies this distribution, and is available at
6
 * http://www.eclipse.org/legal/epl-v10.html
7
 *
8
 * Contributors:
9
 *     IBM Corporation - initial API and implementation
10
 *******************************************************************************/
11
12
package org.eclipse.ui.internal.navigator.extensions;
13
14
import java.util.Comparator;
15
16
import org.eclipse.ui.navigator.INavigatorContentDescriptor;
17
import org.eclipse.ui.navigator.INavigatorContentExtension;
18
19
/**
20
 * @since 3.2
21
 * 
22
 */
23
public class ExtensionSequenceNumberComparator implements Comparator {
24
25
	/**
26
	 * The initialized singleton instance.
27
	 */
28
	public static final ExtensionSequenceNumberComparator INSTANCE = new ExtensionSequenceNumberComparator(true);
29
30
	/**
31
	 * The initialized singleton instance.
32
	 */
33
	public static final ExtensionSequenceNumberComparator DESCENDING = new ExtensionSequenceNumberComparator(false);
34
	
35
	private final int sortAscending;
36
	
37
	/**
38
	 * Creates an instance that sorts according to the given boolean flag.
39
	 * 
40
	 * @param toSortAscending
41
	 *            <code>true</code> for ascending sort order or
42
	 *            <code>false</code> for descending sort order.
43
	 */
44
	public ExtensionSequenceNumberComparator(boolean toSortAscending) {
45
		sortAscending = toSortAscending ? 1 : -1; 
46
	}
47
48
	/*
49
	 * (non-Javadoc)
50
	 * 
51
	 * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
52
	 */
53
	public int compare(Object o1, Object o2) {
54
55
		INavigatorContentDescriptor lvalue = null;
56
		INavigatorContentDescriptor rvalue = null;
57
58
		if (o1 instanceof INavigatorContentDescriptor) {
59
			lvalue = (INavigatorContentDescriptor) o1;
60
		} else if (o1 instanceof NavigatorContentExtension) {
61
			lvalue = ((NavigatorContentExtension) o1).getDescriptor();
62
		}
63
64
		if (o2 instanceof INavigatorContentDescriptor) {
65
			rvalue = (INavigatorContentDescriptor) o2;
66
		} else if (o2 instanceof INavigatorContentExtension) {
67
			rvalue = ((NavigatorContentExtension) o2).getDescriptor();
68
		}
69
70
		if (lvalue == null || rvalue == null) {
71
			return  -1 * sortAscending;
72
		}
73
74
		int c = lvalue.getSequenceNumber() - rvalue.getSequenceNumber();
75
		if (c != 0) {
76
			return c * sortAscending;
77
		}
78
		return 0;
79
80
	}
81
82
}
(-)src/org/eclipse/ui/internal/navigator/extensions/NavigatorContentDescriptor.java (-2 / +38 lines)
Lines 63-68 Link Here
63
63
64
	private int priority = Priority.NORMAL_PRIORITY_VALUE;
64
	private int priority = Priority.NORMAL_PRIORITY_VALUE;
65
65
66
	/**
67
	 * This is calculated based on the priority and appearsBeforeId when all of the descriptors
68
	 * are first loaded. This is what's used to sort on after that.
69
	 */
70
	private int sequenceNumber;
71
	
72
	private String appearsBeforeId;
73
66
	private Expression enablement;
74
	private Expression enablement;
67
75
68
	private Expression possibleChildren;
76
	private Expression possibleChildren;
Lines 134-139 Link Here
134
		return priority;
142
		return priority;
135
	}
143
	}
136
144
145
	
146
	/**
147
	 * @return the sequence number
148
	 */
149
	public int getSequenceNumber() {
150
		return sequenceNumber;
151
	}
152
153
	
154
	void setSequenceNumber(int num) {
155
		sequenceNumber = num;
156
	}
157
	
158
	/**
159
	 * 
160
	 * @return The value specified by the <i>appearsBefore</i> attribute of the
161
	 *         &lt;navigatorContent/&gt; element.
162
	 */
163
	public String getAppearsBeforeId() {
164
		return appearsBeforeId;
165
	}
166
	
137
	/**
167
	/**
138
	 * Parses the configuration element.
168
	 * Parses the configuration element.
139
	 * 
169
	 * 
Lines 163-168 Link Here
163
		providesSaveables = (providesSaveablesString != null && providesSaveablesString
193
		providesSaveables = (providesSaveablesString != null && providesSaveablesString
164
				.length() > 0) ? Boolean.valueOf(providesSaveablesString)
194
				.length() > 0) ? Boolean.valueOf(providesSaveablesString)
165
						.booleanValue() : false;
195
						.booleanValue() : false;
196
		appearsBeforeId = configElement.getAttribute(ATT_APPEARS_BEFORE);
166
197
167
		if (priorityString != null) {
198
		if (priorityString != null) {
168
			try {
199
			try {
Lines 173-178 Link Here
173
				priority = Priority.NORMAL_PRIORITY_VALUE;
204
				priority = Priority.NORMAL_PRIORITY_VALUE;
174
			}
205
			}
175
		}
206
		}
207
		
208
		// We start with this because the sort ExtensionPriorityComparator works 
209
		// from the sequenceNumber
210
		sequenceNumber = priority;
211
		
176
		if (id == null) {
212
		if (id == null) {
177
			throw new WorkbenchException(NLS.bind(
213
			throw new WorkbenchException(NLS.bind(
178
					CommonNavigatorMessages.Attribute_Missing_Warning,
214
					CommonNavigatorMessages.Attribute_Missing_Warning,
Lines 423-429 Link Here
423
	 */
459
	 */
424
	public Set getOverriddingExtensions() {
460
	public Set getOverriddingExtensions() {
425
		if (overridingExtensions == null) {
461
		if (overridingExtensions == null) {
426
			overridingExtensions = new TreeSet(ExtensionPriorityComparator.DESCENDING);
462
			overridingExtensions = new TreeSet(ExtensionSequenceNumberComparator.DESCENDING);
427
		}
463
		}
428
		return overridingExtensions;
464
		return overridingExtensions;
429
	}
465
	}
Lines 453-459 Link Here
453
	 * @see java.lang.Object#toString()
489
	 * @see java.lang.Object#toString()
454
	 */
490
	 */
455
	public String toString() {
491
	public String toString() {
456
		return "Content[" + id + ", \"" + name + "\"]"; //$NON-NLS-1$ //$NON-NLS-2$//$NON-NLS-3$
492
		return "Content[" + id  + "(" + sequenceNumber + ") " + ", \"" + name + "\"]"; //$NON-NLS-1$ //$NON-NLS-2$//$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
457
	}
493
	}
458
	
494
	
459
	/* (non-Javadoc)
495
	/* (non-Javadoc)
(-)src/org/eclipse/ui/internal/navigator/extensions/NavigatorContentDescriptorManager.java (-4 / +49 lines)
Lines 15-20 Link Here
15
import java.util.HashMap;
15
import java.util.HashMap;
16
import java.util.HashSet;
16
import java.util.HashSet;
17
import java.util.Iterator;
17
import java.util.Iterator;
18
import java.util.LinkedList;
19
import java.util.List;
18
import java.util.Map;
20
import java.util.Map;
19
import java.util.Set;
21
import java.util.Set;
20
import java.util.TreeSet;
22
import java.util.TreeSet;
Lines 133-139 Link Here
133
		NavigatorContentDescriptor[] finalDescriptors = new NavigatorContentDescriptor[allDescriptors
135
		NavigatorContentDescriptor[] finalDescriptors = new NavigatorContentDescriptor[allDescriptors
134
				.size()];
136
				.size()];
135
		finalDescriptors = (NavigatorContentDescriptor[]) allDescriptors.values().toArray(finalDescriptors);
137
		finalDescriptors = (NavigatorContentDescriptor[]) allDescriptors.values().toArray(finalDescriptors);
136
		Arrays.sort(finalDescriptors, ExtensionPriorityComparator.INSTANCE);
138
		Arrays.sort(finalDescriptors, ExtensionSequenceNumberComparator.INSTANCE);
137
		return finalDescriptors;
139
		return finalDescriptors;
138
	}
140
	}
139
141
Lines 145-151 Link Here
145
		NavigatorContentDescriptor[] finalDescriptors = new NavigatorContentDescriptor[saveablesProviderDescriptors
147
		NavigatorContentDescriptor[] finalDescriptors = new NavigatorContentDescriptor[saveablesProviderDescriptors
146
				.size()];
148
				.size()];
147
		saveablesProviderDescriptors.toArray(finalDescriptors);
149
		saveablesProviderDescriptors.toArray(finalDescriptors);
148
		Arrays.sort(finalDescriptors, ExtensionPriorityComparator.INSTANCE);
150
		Arrays.sort(finalDescriptors, ExtensionSequenceNumberComparator.INSTANCE);
149
		return finalDescriptors;
151
		return finalDescriptors;
150
	}
152
	}
151
153
Lines 195-201 Link Here
195
		EvaluationCache cache = getEvaluationCache(
197
		EvaluationCache cache = getEvaluationCache(
196
				cachedEvaluations, aVisibilityAssistant);
198
				cachedEvaluations, aVisibilityAssistant);
197
199
198
		Set descriptors = new TreeSet(ExtensionPriorityComparator.INSTANCE);
200
		Set descriptors = new TreeSet(ExtensionSequenceNumberComparator.INSTANCE);
199
		NavigatorContentDescriptor[] cachedDescriptors = null;
201
		NavigatorContentDescriptor[] cachedDescriptors = null;
200
		if ((cachedDescriptors = cache.getDescriptors(anElement)) != null) {
202
		if ((cachedDescriptors = cache.getDescriptors(anElement)) != null) {
201
			descriptors.addAll(Arrays.asList(cachedDescriptors));
203
			descriptors.addAll(Arrays.asList(cachedDescriptors));
Lines 256-262 Link Here
256
258
257
				boolean isOverridden;
259
				boolean isOverridden;
258
260
259
				Set overridingDescriptors = new TreeSet(ExtensionPriorityComparator.INSTANCE);
261
				Set overridingDescriptors = new TreeSet(ExtensionSequenceNumberComparator.INSTANCE);
260
				isOverridden = addDescriptorsConsideringOverrides(anElement, descriptor.getOverriddingExtensions(),
262
				isOverridden = addDescriptorsConsideringOverrides(anElement, descriptor.getOverriddingExtensions(),
261
						aVisibilityAssistant, overridingDescriptors, possibleChild);
263
						aVisibilityAssistant, overridingDescriptors, possibleChild);
262
264
Lines 426-431 Link Here
426
			}
428
			}
427
		}
429
		}
428
	}
430
	}
431
	
432
	private int findId(List list, String id) {
433
		for (int i = 0, len = list.size(); i < len; i++) {
434
			NavigatorContentDescriptor desc = (NavigatorContentDescriptor) list.get(i);
435
			if (desc.getId().equals(id))
436
				return i;
437
		}
438
		throw new RuntimeException("Can't find id: " + id); //$NON-NLS-1$
439
	}
440
	
441
	private void computeSequenceNumbers() {
442
		NavigatorContentDescriptor[] descs = getAllContentDescriptors();
443
444
		LinkedList list = new LinkedList();
445
		for (int i = 0; i < descs.length; i++) {
446
			list.add(descs[i]);
447
		}
448
		
449
		boolean changed = true;
450
		while (changed) {
451
			changed = false;
452
			for (int i = 0, len = list.size(); i < len; i++) {
453
				NavigatorContentDescriptor desc = (NavigatorContentDescriptor) list.get(i);
454
				if (desc.getAppearsBeforeId() != null) {
455
					int beforeInd = findId(list, desc.getAppearsBeforeId());
456
					if (beforeInd < i) {
457
						list.add(beforeInd, desc);
458
						list.remove(i + 1);
459
						changed = true;
460
					}
461
				}
462
			}
463
		}
464
		
465
		for (int i = 0, len = list.size(); i < len; i++) {
466
			NavigatorContentDescriptor desc = (NavigatorContentDescriptor) list.get(i);
467
			desc.setSequenceNumber(i);
468
			if (Policy.DEBUG_EXTENSION_SETUP) {
469
				System.out.println("Descriptors by sequence: " + desc); //$NON-NLS-1$
470
			}
471
		}
472
	}
429
473
430
	private ImageRegistry getImageRegistry() {
474
	private ImageRegistry getImageRegistry() {
431
		if (imageRegistry == null) {
475
		if (imageRegistry == null) {
Lines 444-449 Link Here
444
		 */
488
		 */
445
		public void readRegistry() {
489
		public void readRegistry() {
446
			super.readRegistry();
490
			super.readRegistry();
491
			computeSequenceNumbers();
447
			computeOverrides();
492
			computeOverrides();
448
		}
493
		}
449
494
(-)src/org/eclipse/ui/navigator/CommonViewerSorter.java (-34 / +29 lines)
Lines 74-80 Link Here
74
			return 0;
74
			return 0;
75
75
76
		INavigatorContentDescriptor source = getSource(element);
76
		INavigatorContentDescriptor source = getSource(element);
77
		return source != null ? source.getPriority() : Priority.NORMAL_PRIORITY_VALUE;
77
		return source != null ? source.getSequenceNumber() : Priority.NORMAL_PRIORITY_VALUE;
78
	}
78
	}
79
79
80
	private void logMissingExtension(Object parent, Object object) {
80
	private void logMissingExtension(Object parent, Object object) {
Lines 104-146 Link Here
104
			return -1;
104
			return -1;
105
		}
105
		}
106
106
107
		// shortcut if contributed by same source
107
		ViewerSorter sorter = null;
108
		if(sourceOfLvalue == sourceOfRvalue) {
109
			ViewerSorter sorter = sorterService.findSorter(sourceOfLvalue, parent, e1, e2);
110
			if (sorter != null) {
111
				return sorter.compare(viewer, e1, e2);
112
			}
113
		} 
114
108
115
		boolean flags[] = new boolean[4];
109
		// shortcut if contributed by same source
116
		flags[0] = sourceOfLvalue.isTriggerPoint(e1);
110
		if (sourceOfLvalue == sourceOfRvalue) {
117
		flags[1] = sourceOfLvalue.isTriggerPoint(e2);
111
			sorter = sorterService.findSorter(sourceOfLvalue, parent, e1, e2);
118
		flags[2] = sourceOfRvalue.isTriggerPoint(e1);
112
		} else {
119
		flags[3] = sourceOfRvalue.isTriggerPoint(e2);
120
		
121
		int whoknows  = 0;		 
122
		whoknows  = whoknows  | (flags[0] & flags[1] ? LEFT_UNDERSTANDS : 0); 
123
		whoknows  = whoknows  | (flags[2] & flags[3] ? RIGHT_UNDERSTANDS : 0); 
124
		
125
113
126
		ViewerSorter sorter = null;
114
			boolean flags[] = new boolean[4];
127
		
115
			flags[0] = sourceOfLvalue.isTriggerPoint(e1);
128
		switch(whoknows) {
116
			flags[1] = sourceOfLvalue.isTriggerPoint(e2);
129
			case BOTH_UNDERSTAND: 
117
			flags[2] = sourceOfRvalue.isTriggerPoint(e1);
130
				sorter = sourceOfLvalue.getPriority() > sourceOfRvalue.getPriority() ? 
118
			flags[3] = sourceOfRvalue.isTriggerPoint(e2);
131
						sorterService.findSorter(sourceOfLvalue, parent, e1, e2) : 
119
132
						sorterService.findSorter(sourceOfRvalue, parent, e1, e2);
120
			int whoknows = 0;
121
			whoknows = whoknows | (flags[0] & flags[1] ? LEFT_UNDERSTANDS : 0);
122
			whoknows = whoknows | (flags[2] & flags[3] ? RIGHT_UNDERSTANDS : 0);
123
124
			switch (whoknows) {
125
			case BOTH_UNDERSTAND:
126
				sorter = sourceOfLvalue.getSequenceNumber() > sourceOfRvalue.getSequenceNumber() ? sorterService
127
						.findSorter(sourceOfLvalue, parent, e1, e2)
128
						: sorterService.findSorter(sourceOfRvalue, parent, e1, e2);
129
				break;
130
			case LEFT_UNDERSTANDS:
131
				sorter = sorterService.findSorter(sourceOfLvalue, parent, e1, e2);
133
				break;
132
				break;
134
			case LEFT_UNDERSTANDS: 
133
			case RIGHT_UNDERSTANDS:
135
				sorter =  sorterService.findSorter(sourceOfLvalue,
134
				sorter = sorterService.findSorter(sourceOfRvalue, parent, e1, e2);
136
					parent, e1, e2) ;
135
				break;
137
					break;
136
			}
138
			case RIGHT_UNDERSTANDS: 
139
				sorter =  sorterService.findSorter(sourceOfRvalue,
140
					parent, e1, e2) ;
141
					break;
142
		}
137
		}
143
		 
138
144
		if (sorter != null) {
139
		if (sorter != null) {
145
			return sorter.compare(viewer, e1, e2);
140
			return sorter.compare(viewer, e1, e2);
146
		}
141
		}
(-)src/org/eclipse/ui/navigator/INavigatorContentDescriptor.java (-1 / +22 lines)
Lines 56-62 Link Here
56
	 *         if no priority was specified.
56
	 *         if no priority was specified.
57
	 */
57
	 */
58
	int getPriority();
58
	int getPriority();
59
59
	
60
	/**
61
	 * Returns the extension that this extension must appear before.
62
	 * 
63
	 * @return The value specified by the <i>appearsBefore</i> attribute of the
64
	 *         &lt;navigatorContent/&gt; element.
65
	 *         
66
	 * @since 3.5        
67
	 */
68
	public String getAppearsBeforeId();
69
	
70
	/**
71
	 * Returns the unique sequence number of this extension.  This is calculated based on
72
	 * the priority and the appears before and represents the order the extension will appear
73
	 * relative to the other extensions
74
	 * 
75
	 * @return The sequence number of the extension
76
	 *         
77
	 * @since 3.5        
78
	 */
79
	public int getSequenceNumber();
80
	
60
	/**
81
	/**
61
	 * The enabledByDefault attribute specifies whether an extension should be
82
	 * The enabledByDefault attribute specifies whether an extension should be
62
	 * activated in the context of a viewer automatically. Users may override
83
	 * activated in the context of a viewer automatically. Users may override
(-)plugin.xml (+50 lines)
Lines 222-229 Link Here
222
      	 </actionProvider>
222
      	 </actionProvider>
223
223
224
      </navigatorContent>
224
      </navigatorContent>
225
226
227
      <navigatorContent
228
            name="Unsorted Resources"
229
            priority="low"
230
            icon="$nl$/icons/full/eview16/resource_persp.gif"
231
            activeByDefault="true"
232
			            contentProvider="org.eclipse.ui.internal.navigator.resources.workbench.ResourceExtensionContentProvider"
233
            			labelProvider="org.eclipse.ui.internal.navigator.resources.workbench.ResourceExtensionLabelProvider"			
234
            id="org.eclipse.ui.tests.navigator.resourceContent.unsorted">         
235
         <enablement>
236
		         <or>         
237
		            <adapt type="org.eclipse.core.resources.IProject" /> 
238
		            <instanceof 
239
		                  	value="org.eclipse.core.resources.IResource" /> 
240
		         </or>
241
         </enablement>
242
	  </navigatorContent>
225
      
243
      
226
      <navigatorContent
244
      <navigatorContent
245
            id="org.eclipse.ui.tests.navigator.testSimpleChildrenContent1"
246
            contentProvider="org.eclipse.ui.tests.navigator.extension.TestSimpleChildrenContentProvider1"
247
            labelProvider="org.eclipse.ui.tests.navigator.extension.TestLabelProviderBlue"
248
            name="Test Simple Children 1">
249
	     <enablement>
250
            <instanceof value="org.eclipse.core.resources.IProject"/>
251
         </enablement>            
252
      </navigatorContent>
253
254
      <navigatorContent
255
            appearsBefore="org.eclipse.ui.tests.navigator.testSimpleChildrenContent1"
256
            contentProvider="org.eclipse.ui.tests.navigator.extension.TestSimpleChildrenContentProvider2"
257
            id="org.eclipse.ui.tests.navigator.testSimpleChildrenContent2"
258
            labelProvider="org.eclipse.ui.tests.navigator.extension.TestLabelProviderCyan"
259
            name="Test Simple Children 2">
260
	     <enablement>
261
            <instanceof value="org.eclipse.core.resources.IProject"/>
262
         </enablement>            
263
      </navigatorContent>
264
265
      <navigatorContent
266
            appearsBefore="org.eclipse.ui.tests.navigator.testSimpleChildrenContent2"
267
            contentProvider="org.eclipse.ui.tests.navigator.extension.TestSimpleChildrenContentProvider3"
268
            id="org.eclipse.ui.tests.navigator.testSimpleChildrenContent3"
269
            labelProvider="org.eclipse.ui.tests.navigator.extension.TestLabelProviderPlainRed"
270
            name="Test Simple Children 3">
271
	     <enablement>
272
            <instanceof value="org.eclipse.core.resources.IProject"/>
273
         </enablement>            
274
      </navigatorContent>
275
276
      <navigatorContent
227
            id="org.eclipse.ui.tests.navigator.testContent2"
277
            id="org.eclipse.ui.tests.navigator.testContent2"
228
            contentProvider="org.eclipse.ui.tests.navigator.extension.TestContentProvider"
278
            contentProvider="org.eclipse.ui.tests.navigator.extension.TestContentProvider"
229
            labelProvider="org.eclipse.ui.tests.navigator.extension.TestLabelProviderBlue"
279
            labelProvider="org.eclipse.ui.tests.navigator.extension.TestLabelProviderBlue"
(-)src/org/eclipse/ui/tests/navigator/NavigatorTestBase.java (+6 lines)
Lines 74-79 Link Here
74
	public static final String TEST_CONTENT_WITH = "org.eclipse.ui.tests.navigator.testContentWith";
74
	public static final String TEST_CONTENT_WITH = "org.eclipse.ui.tests.navigator.testContentWith";
75
	public static final String TEST_CONTENT_NO_CHILDREN = "org.eclipse.ui.tests.navigator.testContentNoChildren";
75
	public static final String TEST_CONTENT_NO_CHILDREN = "org.eclipse.ui.tests.navigator.testContentNoChildren";
76
76
77
	public static final String TEST_CONTENT_RESOURCE_UNSORTED = "org.eclipse.ui.tests.navigator.resourceContent.unsorted";
78
79
	public static final String TEST_SIMPLE_CHILDREN1 = "org.eclipse.ui.tests.navigator.testSimpleChildrenContent1";
80
	public static final String TEST_SIMPLE_CHILDREN2 = "org.eclipse.ui.tests.navigator.testSimpleChildrenContent2";
81
	public static final String TEST_SIMPLE_CHILDREN3 = "org.eclipse.ui.tests.navigator.testSimpleChildrenContent3";
82
	
77
	public static final String TEST_CONTENT_M12_VIEW = "org.eclipse.ui.tests.navigator.M12View";
83
	public static final String TEST_CONTENT_M12_VIEW = "org.eclipse.ui.tests.navigator.M12View";
78
	public static final String TEST_CONTENT_M12_M1_CONTENT = "org.eclipse.ui.tests.navigator.m12.M1";
84
	public static final String TEST_CONTENT_M12_M1_CONTENT = "org.eclipse.ui.tests.navigator.m12.M1";
79
	public static final String TEST_CONTENT_M12_M1_CONTENT_FIRST_CLASS = "org.eclipse.ui.tests.navigator.m12.M1FirstClass";
85
	public static final String TEST_CONTENT_M12_M1_CONTENT_FIRST_CLASS = "org.eclipse.ui.tests.navigator.m12.M1FirstClass";
(-)src/org/eclipse/ui/tests/navigator/ProgrammaticOpenTest.java (+37 lines)
Lines 21-26 Link Here
21
import org.eclipse.ui.tests.navigator.extension.TestLabelProviderBlue;
21
import org.eclipse.ui.tests.navigator.extension.TestLabelProviderBlue;
22
import org.eclipse.ui.tests.navigator.extension.TestLabelProviderCyan;
22
import org.eclipse.ui.tests.navigator.extension.TestLabelProviderCyan;
23
import org.eclipse.ui.tests.navigator.extension.TestLabelProviderStyledGreen;
23
import org.eclipse.ui.tests.navigator.extension.TestLabelProviderStyledGreen;
24
import org.eclipse.ui.tests.navigator.extension.TestSimpleChildrenContentProvider;
24
import org.eclipse.ui.tests.navigator.extension.TestSorterData;
25
import org.eclipse.ui.tests.navigator.extension.TestSorterData;
25
26
26
public class ProgrammaticOpenTest extends NavigatorTestBase {
27
public class ProgrammaticOpenTest extends NavigatorTestBase {
Lines 152-155 Link Here
152
		checkItems(rootItems, TestLabelProviderBlue.instance);
153
		checkItems(rootItems, TestLabelProviderBlue.instance);
153
	}
154
	}
154
155
156
	// bug 228022 add ordering of content
157
	public void testNceOrdering() throws Exception {
158
		_contentService.bindExtensions(new String[] { 
159
				COMMON_NAVIGATOR_RESOURCE_EXT, TEST_SIMPLE_CHILDREN1 }, false);
160
		_contentService.getActivationService().activateExtensions(
161
				new String[] {  COMMON_NAVIGATOR_RESOURCE_EXT, TEST_SIMPLE_CHILDREN1 }, true);
162
163
		TreeItem[] rootItems = _viewer.getTree().getItems();
164
		_viewer.expandAll();
165
166
		assertEquals("10", rootItems[0].getItems()[0].getText());
167
168
		_contentService.bindExtensions(new String[] { TEST_SIMPLE_CHILDREN3 }, false);
169
		_contentService.getActivationService().activateExtensions(
170
				new String[] { TEST_SIMPLE_CHILDREN3 }, false);
171
172
		_viewer.expandAll();
173
174
		assertEquals("30", rootItems[0].getItems()[0].getText());
175
		assertEquals("10", rootItems[0].getItems()[TestSimpleChildrenContentProvider.NUM_ITEMS]
176
				.getText());
177
178
		_contentService.bindExtensions(new String[] { TEST_SIMPLE_CHILDREN2 }, false);
179
		_contentService.getActivationService().activateExtensions(
180
				new String[] { TEST_SIMPLE_CHILDREN2 }, false);
181
182
		_viewer.expandAll();
183
184
		assertEquals("30", rootItems[0].getItems()[0].getText());
185
		assertEquals("20", rootItems[0].getItems()[TestSimpleChildrenContentProvider.NUM_ITEMS]
186
				.getText());
187
		assertEquals("10", rootItems[0].getItems()[TestSimpleChildrenContentProvider.NUM_ITEMS * 2]
188
				.getText());
189
190
	}
191
155
}
192
}
(-)src/org/eclipse/ui/tests/navigator/extension/TestLabelProvider.java (-1 / +1 lines)
Lines 96-102 Link Here
96
		if (element instanceof IResource) {
96
		if (element instanceof IResource) {
97
			return getColorName() + ((IResource) element).getName();
97
			return getColorName() + ((IResource) element).getName();
98
		}
98
		}
99
		return null;
99
		return element.toString();
100
	}
100
	}
101
101
102
	public String getDescription(Object anElement) {
102
	public String getDescription(Object anElement) {
(-)src/org/eclipse/ui/tests/navigator/extension/TestSimpleChildrenContentProvider.java (+79 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2010 Oakland Software Incorporated and others.
3
 * All rights reserved. This program and the accompanying materials
4
 * are made available under the terms of the Eclipse Public License v1.0
5
 * which accompanies this distribution, and is available at
6
 * http://www.eclipse.org/legal/epl-v10.html
7
 *
8
 * Contributors:
9
 *     Francis Upton IV, Oakland Software - initial API and implementation
10
 ******************************************************************************/
11
package org.eclipse.ui.tests.navigator.extension;
12
13
import java.util.ArrayList;
14
import java.util.List;
15
16
import org.eclipse.core.resources.IResource;
17
import org.eclipse.jface.viewers.ITreeContentProvider;
18
import org.eclipse.jface.viewers.Viewer;
19
20
/**
21
 * Provides some children for a given resource.
22
 */
23
public class TestSimpleChildrenContentProvider implements ITreeContentProvider {
24
25
	public static final int NUM_ITEMS = 4;
26
27
	public String _name;
28
29
	private Object[] _children;
30
31
	public class SimpleChild {
32
		public String _name;
33
		public Object _parent;
34
35
		public String toString() {
36
			return _name;
37
		}
38
	}
39
40
	public TestSimpleChildrenContentProvider() {
41
	}
42
43
	public Object[] getElements(Object inputElement) {
44
		return getChildren(inputElement);
45
	}
46
47
	public Object[] getChildren(Object parentElement) {
48
		if (parentElement instanceof IResource) {
49
			if (_children == null) {
50
				List l = new ArrayList();
51
				for (int i = 0; i < NUM_ITEMS; i++) {
52
					SimpleChild child = new SimpleChild();
53
					child._parent = parentElement;
54
					child._name = _name + i;
55
					l.add(child);
56
				}
57
				_children = l.toArray();
58
			}
59
			return _children;
60
		}
61
		return new Object[] {};
62
	}
63
64
	public Object getParent(Object element) {
65
		SimpleChild child = (SimpleChild) element;
66
		return child._parent;
67
	}
68
69
	public boolean hasChildren(Object element) {
70
		return true;
71
	}
72
73
	public void inputChanged(Viewer aViewer, Object oldInput, Object newInput) {
74
		_children = null;
75
	}
76
77
	public void dispose() {
78
	}
79
}
(-)src/org/eclipse/ui/tests/navigator/extension/TestSimpleChildrenContentProvider1.java (+9 lines)
Added Link Here
1
package org.eclipse.ui.tests.navigator.extension;
2
3
public class TestSimpleChildrenContentProvider1 extends TestSimpleChildrenContentProvider {
4
5
	public TestSimpleChildrenContentProvider1() {
6
		_name = "1";
7
	}
8
9
}
(-)src/org/eclipse/ui/tests/navigator/extension/TestSimpleChildrenContentProvider2.java (+9 lines)
Added Link Here
1
package org.eclipse.ui.tests.navigator.extension;
2
3
public class TestSimpleChildrenContentProvider2 extends TestSimpleChildrenContentProvider {
4
5
	public TestSimpleChildrenContentProvider2() {
6
		_name = "2";
7
	}
8
9
}
(-)src/org/eclipse/ui/tests/navigator/extension/TestSimpleChildrenContentProvider3.java (+9 lines)
Added Link Here
1
package org.eclipse.ui.tests.navigator.extension;
2
3
public class TestSimpleChildrenContentProvider3 extends TestSimpleChildrenContentProvider {
4
5
	public TestSimpleChildrenContentProvider3() {
6
		_name = "3";
7
	}
8
9
}

Return to bug 228022