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 226052 | Differences between
and this patch

Collapse All | Expand All

(-)src/org/eclipse/equinox/internal/provisional/p2/ui/query/QueryableMetadataRepositoryManager.java (-12 / +43 lines)
Lines 11-18 Link Here
11
package org.eclipse.equinox.internal.provisional.p2.ui.query;
11
package org.eclipse.equinox.internal.provisional.p2.ui.query;
12
12
13
import java.net.URL;
13
import java.net.URL;
14
import java.util.ArrayList;
14
import java.util.*;
15
import java.util.Arrays;
16
import org.eclipse.core.runtime.*;
15
import org.eclipse.core.runtime.*;
17
import org.eclipse.equinox.internal.p2.core.helpers.ServiceHelper;
16
import org.eclipse.equinox.internal.p2.core.helpers.ServiceHelper;
18
import org.eclipse.equinox.internal.p2.ui.ProvUIActivator;
17
import org.eclipse.equinox.internal.p2.ui.ProvUIActivator;
Lines 61-82 Link Here
61
	 * @return The collector argument
60
	 * @return The collector argument
62
	 */
61
	 */
63
	public Collector query(Query query, Collector result, IProgressMonitor monitor) {
62
	public Collector query(Query query, Collector result, IProgressMonitor monitor) {
64
		ArrayList repoURLs = new ArrayList();
65
		IMetadataRepositoryManager manager = (IMetadataRepositoryManager) ServiceHelper.getService(ProvUIActivator.getContext(), IMetadataRepositoryManager.class.getName());
63
		IMetadataRepositoryManager manager = (IMetadataRepositoryManager) ServiceHelper.getService(ProvUIActivator.getContext(), IMetadataRepositoryManager.class.getName());
66
		if (manager == null) {
64
		if (manager == null) {
67
			ProvUI.reportStatus(new Status(IStatus.ERROR, ProvUIActivator.PLUGIN_ID, ProvUIMessages.ProvisioningUtil_NoRepositoryManager), StatusManager.SHOW | StatusManager.LOG);
65
			ProvUI.reportStatus(new Status(IStatus.ERROR, ProvUIActivator.PLUGIN_ID, ProvUIMessages.ProvisioningUtil_NoRepositoryManager), StatusManager.SHOW | StatusManager.LOG);
68
			return result;
66
			return result;
69
		}
67
		}
68
		List repoURLs = getRepoLocations(manager);
70
69
71
		if (repositories.getMetadataRepositories() != null) {
72
			repoURLs.addAll(Arrays.asList(repositories.getMetadataRepositories()));
73
		} else {
74
			repoURLs.addAll(Arrays.asList(manager.getKnownRepositories(repositories.getRepoFlags())));
75
			if (repositories.getIncludeDisabledRepositories()) {
76
				repoURLs.addAll(Arrays.asList(manager.getKnownRepositories(IMetadataRepositoryManager.REPOSITORIES_DISABLED)));
77
			}
78
79
		}
80
		SubMonitor sub = SubMonitor.convert(monitor, ProvUIMessages.QueryableMetadataRepositoryManager_RepositoryQueryProgress, repoURLs.size() * 2);
70
		SubMonitor sub = SubMonitor.convert(monitor, ProvUIMessages.QueryableMetadataRepositoryManager_RepositoryQueryProgress, repoURLs.size() * 2);
81
		if (sub.isCanceled())
71
		if (sub.isCanceled())
82
			return result;
72
			return result;
Lines 99-102 Link Here
99
		}
89
		}
100
		return result;
90
		return result;
101
	}
91
	}
92
93
	/**
94
	 * Load all of the repositories referenced by this queryable.  This is an expensive operation.
95
	 * @param monitor the progress monitor that should be used
96
	 */
97
	public void loadAll(IProgressMonitor monitor) {
98
		IMetadataRepositoryManager manager = (IMetadataRepositoryManager) ServiceHelper.getService(ProvUIActivator.getContext(), IMetadataRepositoryManager.class.getName());
99
		if (manager == null) {
100
			ProvUI.reportStatus(new Status(IStatus.ERROR, ProvUIActivator.PLUGIN_ID, ProvUIMessages.ProvisioningUtil_NoRepositoryManager), StatusManager.SHOW | StatusManager.LOG);
101
			return;
102
		}
103
		List repoURLs = getRepoLocations(manager);
104
		SubMonitor sub = SubMonitor.convert(monitor, ProvUIMessages.QueryableMetadataRepositoryManager_RepositoryQueryProgress, repoURLs.size() * 2);
105
		if (sub.isCanceled())
106
			return;
107
		for (int i = 0; i < repoURLs.size(); i++) {
108
			if (sub.isCanceled())
109
				return;
110
			try {
111
				manager.loadRepository((URL) repoURLs.get(i), sub.newChild(1));
112
			} catch (ProvisionException e) {
113
				//ignore unavailable repositories
114
				if (e.getStatus().getCode() != ProvisionException.REPOSITORY_NOT_FOUND)
115
					ProvUI.handleException(e, NLS.bind(ProvUIMessages.ProvisioningUtil_LoadRepositoryFailure, repoURLs.get(i)), StatusManager.LOG);
116
			}
117
		}
118
119
	}
120
121
	private List getRepoLocations(IMetadataRepositoryManager manager) {
122
		ArrayList locations = new ArrayList();
123
		if (repositories.getMetadataRepositories() != null) {
124
			locations.addAll(Arrays.asList(repositories.getMetadataRepositories()));
125
		} else {
126
			locations.addAll(Arrays.asList(manager.getKnownRepositories(repositories.getRepoFlags())));
127
			if (repositories.getIncludeDisabledRepositories()) {
128
				locations.addAll(Arrays.asList(manager.getKnownRepositories(IMetadataRepositoryManager.REPOSITORIES_DISABLED)));
129
			}
130
		}
131
		return locations;
132
	}
102
}
133
}
(-)src/org/eclipse/equinox/internal/provisional/p2/ui/ProvisioningOperationRunner.java (-12 / +15 lines)
Lines 140-157 Link Here
140
		job.setUser(op.isUser());
140
		job.setUser(op.isUser());
141
		job.setProperty(OPERATION_KEY, op);
141
		job.setProperty(OPERATION_KEY, op);
142
		job.setProperty(IProgressConstants.ICON_PROPERTY, ProvUIImages.getImageDescriptor(ProvUIImages.IMG_PROFILE));
142
		job.setProperty(IProgressConstants.ICON_PROPERTY, ProvUIImages.getImageDescriptor(ProvUIImages.IMG_PROFILE));
143
		scheduledJobs.add(job);
143
		manageJob(job);
144
		job.addJobChangeListener(new JobChangeAdapter() {
145
			public void done(IJobChangeEvent event) {
146
				scheduledJobs.remove(event.getJob());
147
				if (restartRequested) {
148
					requestRestart(restartRequired);
149
				}
150
			}
151
		});
152
		Object[] listeners = jobListeners.getListeners();
153
		for (int i = 0; i < listeners.length; i++)
154
			job.addJobChangeListener((IJobChangeListener) listeners[i]);
155
		job.schedule();
144
		job.schedule();
156
		return job;
145
		return job;
157
	}
146
	}
Lines 216-219 Link Here
216
		return (Job[]) scheduledJobs.toArray(new Job[scheduledJobs.size()]);
205
		return (Job[]) scheduledJobs.toArray(new Job[scheduledJobs.size()]);
217
	}
206
	}
218
207
208
	public static void manageJob(Job job) {
209
		scheduledJobs.add(job);
210
		job.addJobChangeListener(new JobChangeAdapter() {
211
			public void done(IJobChangeEvent event) {
212
				scheduledJobs.remove(event.getJob());
213
				if (restartRequested) {
214
					requestRestart(restartRequired);
215
				}
216
			}
217
		});
218
		Object[] listeners = jobListeners.getListeners();
219
		for (int i = 0; i < listeners.length; i++)
220
			job.addJobChangeListener((IJobChangeListener) listeners[i]);
221
	}
219
}
222
}
(-)src/org/eclipse/equinox/internal/p2/ui/dialogs/DeferredFetchFilteredTree.java (-6 / +151 lines)
Lines 1-9 Link Here
1
package org.eclipse.equinox.internal.p2.ui.dialogs;
1
package org.eclipse.equinox.internal.p2.ui.dialogs;
2
2
3
import org.eclipse.core.runtime.jobs.IJobChangeEvent;
3
import org.eclipse.core.runtime.*;
4
import org.eclipse.core.runtime.jobs.JobChangeAdapter;
4
import org.eclipse.core.runtime.jobs.*;
5
import org.eclipse.equinox.internal.p2.ui.ProvUIMessages;
5
import org.eclipse.equinox.internal.p2.ui.ProvUIMessages;
6
import org.eclipse.equinox.internal.provisional.p2.ui.ProvisioningOperationRunner;
6
import org.eclipse.equinox.internal.provisional.p2.ui.dialogs.IViewMenuProvider;
7
import org.eclipse.equinox.internal.provisional.p2.ui.dialogs.IViewMenuProvider;
8
import org.eclipse.equinox.internal.provisional.p2.ui.query.QueriedElement;
9
import org.eclipse.equinox.internal.provisional.p2.ui.query.QueryableMetadataRepositoryManager;
7
import org.eclipse.equinox.internal.provisional.p2.ui.viewers.DeferredQueryContentListener;
10
import org.eclipse.equinox.internal.provisional.p2.ui.viewers.DeferredQueryContentListener;
8
import org.eclipse.equinox.internal.provisional.p2.ui.viewers.DeferredQueryContentProvider;
11
import org.eclipse.equinox.internal.provisional.p2.ui.viewers.DeferredQueryContentProvider;
9
import org.eclipse.jface.action.MenuManager;
12
import org.eclipse.jface.action.MenuManager;
Lines 31-36 Link Here
31
 *
34
 *
32
 */
35
 */
33
public class DeferredFetchFilteredTree extends FilteredTree {
36
public class DeferredFetchFilteredTree extends FilteredTree {
37
	private static final long FILTER_DELAY_TIME = 200;
38
	private static final String WAIT_STRING = "Waiting for List";
34
39
35
	ToolBar toolBar;
40
	ToolBar toolBar;
36
	MenuManager menuManager;
41
	MenuManager menuManager;
Lines 40-45 Link Here
40
	IViewMenuProvider viewMenuProvider;
45
	IViewMenuProvider viewMenuProvider;
41
	DeferredQueryContentProvider contentProvider;
46
	DeferredQueryContentProvider contentProvider;
42
	boolean useCheckBoxTree = false;
47
	boolean useCheckBoxTree = false;
48
	InputSchedulingRule filterRule;
49
	String savedFilterText;
50
	Job loadJob;
51
52
	class InputSchedulingRule implements ISchedulingRule {
53
		Object input;
54
55
		InputSchedulingRule(Object input) {
56
			this.input = input;
57
		}
58
59
		/* (non-Javadoc)
60
		 * @see org.eclipse.core.runtime.jobs.ISchedulingRule#contains(org.eclipse.core.runtime.jobs.ISchedulingRule)
61
		 */
62
		public boolean contains(ISchedulingRule rule) {
63
			return rule == this;
64
		}
65
66
		/* (non-Javadoc)
67
		 * @see org.eclipse.core.runtime.jobs.ISchedulingRule#isConflicting(org.eclipse.core.runtime.jobs.ISchedulingRule)
68
		 */
69
		public boolean isConflicting(ISchedulingRule rule) {
70
			if (rule instanceof InputSchedulingRule) {
71
				InputSchedulingRule other = (InputSchedulingRule) rule;
72
				if (input == null)
73
					return other.getInput() == null;
74
				return input.equals(other.getInput());
75
			}
76
			return false;
77
		}
78
79
		Object getInput() {
80
			return input;
81
		}
82
83
		void setInput(Object input) {
84
			this.input = input;
85
		}
86
87
	}
43
88
44
	public DeferredFetchFilteredTree(Composite parent, int treeStyle, PatternFilter filter, final IViewMenuProvider viewMenuProvider, Display display, boolean useCheckBoxViewer) {
89
	public DeferredFetchFilteredTree(Composite parent, int treeStyle, PatternFilter filter, final IViewMenuProvider viewMenuProvider, Display display, boolean useCheckBoxViewer) {
45
		super(parent);
90
		super(parent);
Lines 78-83 Link Here
78
		}
123
		}
79
		if (viewMenuProvider != null)
124
		if (viewMenuProvider != null)
80
			createViewMenu(filterParent);
125
			createViewMenu(filterParent);
126
		filterParent.addDisposeListener(new DisposeListener() {
127
			public void widgetDisposed(DisposeEvent e) {
128
				cancelLoadJob();
129
			}
130
		});
81
		return filterParent;
131
		return filterParent;
82
	}
132
	}
83
133
Lines 121-130 Link Here
121
			public void inputChanged(Viewer v, Object oldInput, Object newInput) {
171
			public void inputChanged(Viewer v, Object oldInput, Object newInput) {
122
				if (newInput == null)
172
				if (newInput == null)
123
					return;
173
					return;
174
				InputSchedulingRule rule = getFilterJobSchedulingRule();
175
				rule.setInput(newInput);
124
				if (showFilterControls && filterText != null && !filterText.isDisposed()) {
176
				if (showFilterControls && filterText != null && !filterText.isDisposed()) {
125
					filterText.setText(getInitialText());
177
					filterText.setText(getInitialText());
126
					filterText.selectAll();
178
					filterText.selectAll();
127
				}
179
				}
180
				contentProvider.setSynchronous(false);
181
				cancelLoadJob();
128
			}
182
			}
129
183
130
		});
184
		});
Lines 138-157 Link Here
138
	protected WorkbenchJob doCreateRefreshJob() {
192
	protected WorkbenchJob doCreateRefreshJob() {
139
		WorkbenchJob job = super.doCreateRefreshJob();
193
		WorkbenchJob job = super.doCreateRefreshJob();
140
		job.addJobChangeListener(new JobChangeAdapter() {
194
		job.addJobChangeListener(new JobChangeAdapter() {
141
			public void aboutToRun(IJobChangeEvent event) {
195
			public void aboutToRun(final IJobChangeEvent event) {
142
				display.syncExec(new Runnable() {
196
				display.syncExec(new Runnable() {
143
					public void run() {
197
					public void run() {
144
						String text = getFilterString();
198
						String text = getFilterString();
145
						// If we are about to filter and there is
199
						// If we are about to filter and there is
146
						// actually filtering to do, set the content
200
						// actually filtering to do, force a load
147
						// provider to synchronous mode.
201
						// of the input and set the content
202
						// provider to synchronous mode.  We want the
203
						// load job to complete before continuing with filtering.
148
						if (text == null || (initialText != null && initialText.equals(text)))
204
						if (text == null || (initialText != null && initialText.equals(text)))
149
							return;
205
							return;
150
						contentProvider.setSynchronous(true);
206
						if (!contentProvider.getSynchronous()) {
207
							if (filterText != null && !filterText.isDisposed()) {
208
								filterText.setEnabled(false);
209
								filterText.setCursor(display.getSystemCursor(SWT.CURSOR_WAIT));
210
								savedFilterText = filterText.getText();
211
								filterText.setText(WAIT_STRING);
212
							}
213
							event.getJob().sleep();
214
							scheduleLoadJob();
215
							event.getJob().wakeUp(FILTER_DELAY_TIME);
216
							contentProvider.setSynchronous(true);
217
						}
218
					}
219
				});
220
			}
221
222
			public void done(IJobChangeEvent event) {
223
				display.asyncExec(new Runnable() {
224
					public void run() {
225
						restoreFilterText();
226
					}
227
				});
228
			}
229
230
			public void awake(IJobChangeEvent event) {
231
				display.asyncExec(new Runnable() {
232
					public void run() {
233
						restoreFilterText();
151
					}
234
					}
152
				});
235
				});
153
			}
236
			}
154
		});
237
		});
238
		job.setRule(getFilterJobSchedulingRule());
155
		return job;
239
		return job;
156
	}
240
	}
241
242
	void restoreFilterText() {
243
		if (filterText != null && !filterText.isDisposed() && !filterText.isEnabled()) {
244
			filterText.setText(savedFilterText);
245
			filterText.setEnabled(true);
246
			filterText.setCursor(null);
247
			filterText.setFocus();
248
			filterText.setSelection(savedFilterText.length(), savedFilterText.length());
249
		}
250
	}
251
252
	InputSchedulingRule getFilterJobSchedulingRule() {
253
		if (filterRule == null) {
254
			Object input = null;
255
			if (getViewer() != null)
256
				input = getViewer().getInput();
257
			filterRule = new InputSchedulingRule(input);
258
		}
259
		return filterRule;
260
	}
261
262
	void scheduleLoadJob() {
263
		cancelLoadJob();
264
		loadJob = new Job("Retrieving List") {
265
			protected IStatus run(IProgressMonitor monitor) {
266
				if (this.getRule() instanceof InputSchedulingRule) {
267
					Object input = ((InputSchedulingRule) this.getRule()).getInput();
268
					if (input instanceof QueriedElement)
269
						if (((QueriedElement) input).getQueryable() instanceof QueryableMetadataRepositoryManager) {
270
							QueryableMetadataRepositoryManager q = (QueryableMetadataRepositoryManager) ((QueriedElement) input).getQueryable();
271
							q.loadAll(monitor);
272
							if (monitor.isCanceled())
273
								return Status.CANCEL_STATUS;
274
						}
275
				}
276
				return Status.OK_STATUS;
277
			}
278
		};
279
		loadJob.setSystem(true);
280
		loadJob.setUser(false);
281
		loadJob.setRule(getFilterJobSchedulingRule());
282
		// Telling the operation runner about it ensures that listeners know we are running
283
		// a provisioning-related job.
284
		ProvisioningOperationRunner.manageJob(loadJob);
285
		loadJob.schedule();
286
	}
287
288
	void cancelLoadJob() {
289
		if (loadJob != null) {
290
			loadJob.cancel();
291
			loadJob = null;
292
		}
293
	}
294
295
	protected void textChanged() {
296
		// Don't refilter if we are merely resetting the filter back
297
		// to what it was before loading repositories
298
		if (filterText.getText().trim().equals(WAIT_STRING))
299
			return;
300
		super.textChanged();
301
	}
157
}
302
}

Return to bug 226052