Project

General

Profile

Download (10.1 KB) Statistics
| Branch: | Tag: | Revision:
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;
13

    
14
import java.util.Arrays;
15
import java.util.Iterator;
16
import java.util.LinkedHashSet;
17
import java.util.Set;
18

    
19
import org.eclipse.core.runtime.SafeRunner;
20
import org.eclipse.jface.viewers.TreePath;
21
import org.eclipse.osgi.util.NLS;
22

    
23
import org.eclipse.ui.internal.navigator.extensions.NavigatorContentDescriptor;
24
import org.eclipse.ui.internal.navigator.extensions.NavigatorContentExtension;
25
import org.eclipse.ui.navigator.INavigatorContentDescriptor;
26
import org.eclipse.ui.navigator.INavigatorPipelineService;
27
import org.eclipse.ui.navigator.IPipelinedTreeContentProvider;
28
import org.eclipse.ui.navigator.PipelinedShapeModification;
29
import org.eclipse.ui.navigator.PipelinedViewerUpdate;
30

    
31
/**
32
 * @since 3.2
33
 * 
34
 */
35
public class NavigatorPipelineService implements INavigatorPipelineService {
36

    
37
	private NavigatorContentService contentService;
38

    
39
	/**
40
	 * Create a pipeline assistant for the given content service.
41
	 * 
42
	 * @param aContentService
43
	 *            The content service that will drive this pipeline assistant.
44
	 */
45
	public NavigatorPipelineService(NavigatorContentService aContentService) {
46
		contentService = aContentService;
47
	}
48

    
49
	public PipelinedShapeModification interceptAdd(
50
			PipelinedShapeModification anAddModification) {
51
		
52
		ContributorTrackingSet trackedSet =(ContributorTrackingSet) anAddModification.getChildren();
53
		
54
		Set contentDescriptors = contentService.findDescriptorsByTriggerPoint(anAddModification.getParent(), !NavigatorContentService.CONSIDER_OVERRIDES);
55
		
56
		
57
		for (Iterator descriptorsItr = contentDescriptors.iterator(); descriptorsItr.hasNext();) {
58
			INavigatorContentDescriptor descriptor = (INavigatorContentDescriptor) descriptorsItr.next();
59
			pipelineInterceptAdd(anAddModification, trackedSet, descriptor);
60
		}
61
		return anAddModification;
62
	}
63
 
64
	private void pipelineInterceptAdd(final PipelinedShapeModification anAddModification,
65
			final ContributorTrackingSet trackedSet, final INavigatorContentDescriptor descriptor) {
66
		if (descriptor.hasOverridingExtensions()) {
67
			Set overridingDescriptors = descriptor.getOverriddingExtensions();
68
			for (Iterator overridingDescriptorsItr = overridingDescriptors.iterator(); overridingDescriptorsItr
69
					.hasNext();) {
70
				INavigatorContentDescriptor overridingDescriptor = (INavigatorContentDescriptor) overridingDescriptorsItr
71
						.next();
72
				if (contentService.isVisible(overridingDescriptor.getId())
73
						&& contentService.isActive(overridingDescriptor.getId())) {
74
					trackedSet.setContributor((NavigatorContentDescriptor) overridingDescriptor,
75
							(NavigatorContentDescriptor) descriptor);
76
					final NavigatorContentExtension extension = contentService
77
							.getExtension(overridingDescriptor);
78
					if (extension.internalGetContentProvider().isPipelined()) {
79
						SafeRunner.run(new NavigatorSafeRunnable() {
80
							public void run() throws Exception {
81
								((IPipelinedTreeContentProvider) extension
82
										.internalGetContentProvider())
83
										.interceptAdd(anAddModification);
84
							}
85

    
86
							public void handleException(Throwable e) {
87
								NavigatorPlugin.logError(0, NLS.bind(
88
										CommonNavigatorMessages.Exception_Invoking_Extension,
89
										new Object[] { extension.getDescriptor().getId(), null }),
90
										e);
91
							}
92
						});
93
					}
94
					trackedSet.setContributor(null, null);
95
					pipelineInterceptAdd(anAddModification, trackedSet, overridingDescriptor);
96
				}
97
			}
98
		}
99
	}
100

    
101
	public PipelinedShapeModification interceptRemove(
102
			PipelinedShapeModification aRemoveModification) {
103
		
104
		ContributorTrackingSet trackedSet =(ContributorTrackingSet) aRemoveModification.getChildren();
105

    
106
		Set interestedExtensions = new LinkedHashSet();
107
		for (Iterator iter = trackedSet.iterator(); iter.hasNext();) {
108
			Object element = (Object) iter.next();
109
			if(element instanceof TreePath) {
110
				interestedExtensions.addAll(contentService.findOverrideableContentExtensionsForPossibleChild(((TreePath)element).getLastSegment()));
111
			} else {
112
				interestedExtensions = contentService.findOverrideableContentExtensionsForPossibleChild(element);
113
				
114
			}
115
		}
116
		for (Iterator overridingExtensionsIter = interestedExtensions.iterator(); overridingExtensionsIter.hasNext();)
117
			pipelineInterceptRemove(aRemoveModification, trackedSet, (NavigatorContentExtension) overridingExtensionsIter.next());
118
		return aRemoveModification;
119
	}
120
	
121
	private void pipelineInterceptRemove(final PipelinedShapeModification aRemoveModification,
122
			final ContributorTrackingSet trackedSet,
123
			final NavigatorContentExtension overrideableExtension) {
124

    
125
		final Set overridingExtensions = new LinkedHashSet();
126
		overridingExtensions.addAll(Arrays.asList(overrideableExtension
127
				.getOverridingExtensions()));
128

    
129
		for (Iterator extensionsItr = overridingExtensions.iterator(); extensionsItr
130
				.hasNext();) {
131
			final NavigatorContentExtension overridingExtension = (NavigatorContentExtension) extensionsItr
132
					.next();
133
			trackedSet.setContributor((NavigatorContentDescriptor) overridingExtension
134
					.getDescriptor(), null);
135
			if (overridingExtension.internalGetContentProvider().isPipelined()) {
136
				SafeRunner.run(new NavigatorSafeRunnable() {
137
					public void run() throws Exception {
138
						((IPipelinedTreeContentProvider) overridingExtension
139
								.internalGetContentProvider()).interceptRemove(aRemoveModification);
140
					}
141

    
142
					public void handleException(Throwable e) {
143
						NavigatorPlugin.logError(0, NLS.bind(
144
								CommonNavigatorMessages.Exception_Invoking_Extension, new Object[] {
145
										overridingExtension.getDescriptor().getId(), null }), e);
146
					}
147
				});
148
			}
149
			trackedSet.setContributor(null, null);
150
			if (overridingExtension.getDescriptor().hasOverridingExtensions())
151
				pipelineInterceptRemove(aRemoveModification, trackedSet, overridingExtension);
152
		}
153

    
154
	}
155

    
156
	public boolean interceptRefresh(
157
			PipelinedViewerUpdate aRefreshSynchronization) {
158
 
159
		boolean pipelined = false;
160
		Object refreshable = null;
161
		Set overrideableExtensions = new LinkedHashSet();
162
		for (Iterator iter = aRefreshSynchronization.getRefreshTargets().iterator(); iter.hasNext();) {
163
			refreshable = iter.next();
164
			overrideableExtensions.addAll(contentService.findOverrideableContentExtensionsForPossibleChild(refreshable));
165
		}
166
		for (Iterator overrideableExtensionItr = overrideableExtensions.iterator(); overrideableExtensionItr.hasNext();) {
167
			pipelined |= pipelineInterceptRefresh((NavigatorContentExtension) overrideableExtensionItr.next(), aRefreshSynchronization, refreshable);
168
		}
169

    
170
		return pipelined;
171
		
172
	}
173

    
174
	private boolean pipelineInterceptRefresh(final NavigatorContentExtension overrideableExtension,
175
			final PipelinedViewerUpdate aRefreshSynchronization, final Object refreshable) {
176

    
177
		final boolean[] intercepted = new boolean[1];
178

    
179
		final NavigatorContentExtension[] overridingExtensions = overrideableExtension
180
				.getOverridingExtensions();
181
		for (int i = 0; i < overridingExtensions.length; i++) {
182
			final NavigatorContentExtension nceLocal = overridingExtensions[i];
183
			if (nceLocal.internalGetContentProvider().isPipelined()) {
184
				SafeRunner.run(new NavigatorSafeRunnable() {
185
					public void run() throws Exception {
186
						intercepted[0] |= ((IPipelinedTreeContentProvider) nceLocal
187
								.internalGetContentProvider())
188
								.interceptRefresh(aRefreshSynchronization);
189

    
190
						if (nceLocal.getDescriptor().hasOverridingExtensions())
191
							intercepted[0] |= pipelineInterceptRefresh(nceLocal,
192
									aRefreshSynchronization, refreshable);
193
					}
194

    
195
					public void handleException(Throwable e) {
196
						NavigatorPlugin.logError(0, NLS.bind(
197
								CommonNavigatorMessages.Exception_Invoking_Extension, new Object[] {
198
										nceLocal.getDescriptor().getId(), refreshable }), e);
199
					}
200
				});
201
			}
202
		}
203

    
204
		return intercepted[0];
205
	}	
206

    
207
	public boolean interceptUpdate(
208
			PipelinedViewerUpdate anUpdateSynchronization) {
209
		 
210
		boolean pipelined = false;
211
		Object refreshable = null;
212

    
213
		Set overrideableExtensions = new LinkedHashSet();
214
		for (Iterator iter = anUpdateSynchronization.getRefreshTargets().iterator(); iter.hasNext();) {
215
			refreshable = iter.next();
216
			overrideableExtensions.addAll(contentService.findOverrideableContentExtensionsForPossibleChild(refreshable));
217
		}
218
		for (Iterator overrideableExtensionItr = overrideableExtensions.iterator(); overrideableExtensionItr.hasNext();) {
219
			pipelined |= pipelineInterceptUpdate((NavigatorContentExtension) overrideableExtensionItr.next(), anUpdateSynchronization, refreshable);
220
		}
221

    
222
		return pipelined;
223
		
224
	}
225

    
226
	private boolean pipelineInterceptUpdate(final NavigatorContentExtension overrideableExtension,
227
			final PipelinedViewerUpdate anUpdateSynchronization, final Object refreshable) {
228

    
229
		final boolean[] intercepted = new boolean[1];
230
		final NavigatorContentExtension[] overridingExtensions = overrideableExtension
231
				.getOverridingExtensions();
232
		for (int i = 0; i < overridingExtensions.length; i++) {
233
			if (overridingExtensions[i].internalGetContentProvider().isPipelined()) {
234
				final NavigatorContentExtension nceLocal = overridingExtensions[i];
235
				SafeRunner.run(new NavigatorSafeRunnable() {
236
					public void run() throws Exception {
237
						intercepted[0] |= ((IPipelinedTreeContentProvider) nceLocal
238
								.internalGetContentProvider())
239
								.interceptUpdate(anUpdateSynchronization);
240

    
241
						if (nceLocal.getDescriptor().hasOverridingExtensions())
242
							intercepted[0] |= pipelineInterceptUpdate(nceLocal,
243
									anUpdateSynchronization, refreshable);
244
					}
245

    
246
					public void handleException(Throwable e) {
247
						NavigatorPlugin.logError(0, NLS.bind(
248
								CommonNavigatorMessages.Exception_Invoking_Extension, new Object[] {
249
										nceLocal.getDescriptor().getId(), refreshable }), e);
250
					}
251
				});
252

    
253
			}
254
		}
255

    
256
		return intercepted[0];
257
	}
258

    
259
}
(21-21/31)