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

Collapse All | Expand All

(-)Eclipse UI/org/eclipse/ui/internal/incubator/CtrlEAction.java (-2 / +7 lines)
Lines 20-25 Link Here
20
import org.eclipse.core.commands.ExecutionEvent;
20
import org.eclipse.core.commands.ExecutionEvent;
21
import org.eclipse.core.runtime.Assert;
21
import org.eclipse.core.runtime.Assert;
22
import org.eclipse.jface.dialogs.IDialogSettings;
22
import org.eclipse.jface.dialogs.IDialogSettings;
23
import org.eclipse.jface.dialogs.PopupDialog;
23
import org.eclipse.jface.resource.DeviceResourceException;
24
import org.eclipse.jface.resource.DeviceResourceException;
24
import org.eclipse.jface.resource.ImageDescriptor;
25
import org.eclipse.jface.resource.ImageDescriptor;
25
import org.eclipse.jface.resource.JFaceResources;
26
import org.eclipse.jface.resource.JFaceResources;
Lines 83-101 Link Here
83
		if (window == null) {
84
		if (window == null) {
84
			return null;
85
			return null;
85
		}
86
		}
86
87
		
87
		if (providers == null) {
88
		if (providers == null) {
88
			providers = new AbstractProvider[] { new PreviousPicksProvider(),
89
			providers = new AbstractProvider[] { new PreviousPicksProvider(),
89
					new EditorProvider(), new ViewProvider(),
90
					new EditorProvider(), new ViewProvider(),
90
					new PerspectiveProvider(), new CommandProvider(),
91
					new PerspectiveProvider(), new CommandProvider(),
91
					new ActionProvider(), new WizardProvider(),
92
					new ActionProvider(), new WizardProvider(),
92
					new PreferenceProvider(), new PropertiesProvider() };
93
					new PreferenceProvider(), new PropertiesProvider() };
93
94
			
94
			providerMap = new HashMap();
95
			providerMap = new HashMap();
95
			for (int i = 0; i < providers.length; i++) {
96
			for (int i = 0; i < providers.length; i++) {
96
				providerMap.put(providers[i].getId(), providers[i]);
97
				providerMap.put(providers[i].getId(), providers[i]);
97
			}
98
			}
98
		}
99
		}
100
		
101
		PopupDialog popupDialog = new QuickAccessDialog(window, providers);
102
		popupDialog.open();
103
		if(true) return null;
99
104
100
		FilteringInfoPopup popup = new QuickAccessPopup(ProgressManagerUtil
105
		FilteringInfoPopup popup = new QuickAccessPopup(ProgressManagerUtil
101
				.getDefaultParent(), providers);
106
				.getDefaultParent(), providers);
(-)Eclipse UI/org/eclipse/ui/internal/incubator/AbstractElement.java (+25 lines)
Lines 11-16 Link Here
11
11
12
package org.eclipse.ui.internal.incubator;
12
package org.eclipse.ui.internal.incubator;
13
13
14
import java.util.StringTokenizer;
15
14
import org.eclipse.jface.resource.ImageDescriptor;
16
import org.eclipse.jface.resource.ImageDescriptor;
15
17
16
/**
18
/**
Lines 30-35 Link Here
30
	}
32
	}
31
	
33
	
32
	/**
34
	/**
35
	 * @return a string containing the first character of every word for
36
	 * camel case checking.
37
	 */
38
	private static String getCamelCase(String label) {
39
		StringTokenizer tokenizer = new StringTokenizer(label);
40
		StringBuffer camelCase = new StringBuffer();
41
		while(tokenizer.hasMoreTokens()) {
42
			String word = tokenizer.nextToken();
43
			camelCase.append(word.charAt(0));
44
		}
45
		return camelCase.toString();
46
	}
47
48
	final String[] getMatchLabels() {
49
		String sortLabel = getSortLabel();
50
		String camelCase = getCamelCase(sortLabel);
51
		String combinedLabel = provider.getName()
52
				+ " " + getLabel(); //$NON-NLS-1$
53
		String combinedCamelCase = getCamelCase(combinedLabel);
54
		return (new String[] { sortLabel, camelCase, combinedLabel, combinedCamelCase });
55
	}
56
	
57
	/**
33
	 * Returns the label to be displayed to the user.
58
	 * Returns the label to be displayed to the user.
34
	 * 
59
	 * 
35
	 * @return the label
60
	 * @return the label
(-)Eclipse UI/org/eclipse/ui/internal/incubator/AbstractProvider.java (+19 lines)
Lines 11-16 Link Here
11
11
12
package org.eclipse.ui.internal.incubator;
12
package org.eclipse.ui.internal.incubator;
13
13
14
import java.util.Arrays;
15
import java.util.Comparator;
16
14
import org.eclipse.jface.resource.ImageDescriptor;
17
import org.eclipse.jface.resource.ImageDescriptor;
15
18
16
/**
19
/**
Lines 19-24 Link Here
19
 */
22
 */
20
public abstract class AbstractProvider {
23
public abstract class AbstractProvider {
21
24
25
	private AbstractElement[] sortedElements;
26
22
	/**
27
	/**
23
	 * Returns the unique ID of this provider.
28
	 * Returns the unique ID of this provider.
24
	 * 
29
	 * 
Lines 47-52 Link Here
47
	 */
52
	 */
48
	public abstract AbstractElement[] getElements();
53
	public abstract AbstractElement[] getElements();
49
54
55
	public AbstractElement[] getElementsSorted() {
56
		if (sortedElements == null) {
57
			sortedElements = getElements();
58
			Arrays.sort(sortedElements, new Comparator() {
59
				public int compare(Object o1, Object o2) {
60
					AbstractElement e1 = (AbstractElement) o1;
61
					AbstractElement e2 = (AbstractElement) o2;
62
					return e1.getLabel().compareTo(e2.getLabel());
63
				}
64
			});
65
		}
66
		return sortedElements;
67
	}
68
	
50
	/**
69
	/**
51
	 * Returns the element for the given ID if available, or null if no matching
70
	 * Returns the element for the given ID if available, or null if no matching
52
	 * element is available.
71
	 * element is available.
(-)Eclipse (+590 lines)
Added Link Here
1
package org.eclipse.ui.internal.incubator;
2
3
import java.util.ArrayList;
4
import java.util.HashMap;
5
import java.util.LinkedList;
6
import java.util.Map;
7
8
import org.eclipse.core.runtime.Assert;
9
import org.eclipse.jface.dialogs.Dialog;
10
import org.eclipse.jface.dialogs.IDialogSettings;
11
import org.eclipse.jface.dialogs.PopupDialog;
12
import org.eclipse.jface.layout.GridDataFactory;
13
import org.eclipse.jface.layout.TableColumnLayout;
14
import org.eclipse.jface.resource.DeviceResourceException;
15
import org.eclipse.jface.resource.FontDescriptor;
16
import org.eclipse.jface.resource.ImageDescriptor;
17
import org.eclipse.jface.resource.JFaceResources;
18
import org.eclipse.jface.resource.LocalResourceManager;
19
import org.eclipse.jface.viewers.ColumnWeightData;
20
import org.eclipse.swt.SWT;
21
import org.eclipse.swt.events.KeyEvent;
22
import org.eclipse.swt.events.KeyListener;
23
import org.eclipse.swt.events.ModifyEvent;
24
import org.eclipse.swt.events.ModifyListener;
25
import org.eclipse.swt.graphics.Color;
26
import org.eclipse.swt.graphics.Font;
27
import org.eclipse.swt.graphics.FontMetrics;
28
import org.eclipse.swt.graphics.GC;
29
import org.eclipse.swt.graphics.Image;
30
import org.eclipse.swt.graphics.Point;
31
import org.eclipse.swt.graphics.Rectangle;
32
import org.eclipse.swt.graphics.TextLayout;
33
import org.eclipse.swt.graphics.TextStyle;
34
import org.eclipse.swt.widgets.Composite;
35
import org.eclipse.swt.widgets.Control;
36
import org.eclipse.swt.widgets.Event;
37
import org.eclipse.swt.widgets.Listener;
38
import org.eclipse.swt.widgets.Table;
39
import org.eclipse.swt.widgets.TableColumn;
40
import org.eclipse.swt.widgets.TableItem;
41
import org.eclipse.swt.widgets.Text;
42
import org.eclipse.ui.IWorkbenchPage;
43
import org.eclipse.ui.IWorkbenchWindow;
44
import org.eclipse.ui.internal.IWorkbenchGraphicConstants;
45
import org.eclipse.ui.internal.WorkbenchImages;
46
import org.eclipse.ui.internal.WorkbenchPlugin;
47
import org.eclipse.ui.internal.misc.StringMatcher;
48
import org.eclipse.ui.internal.progress.ProgressManagerUtil;
49
50
/**
51
 * @since 3.3
52
 * 
53
 */
54
public class QuickAccessDialog extends PopupDialog {
55
	private static final int MAX_COUNT_PER_PROVIDER = 5;
56
	private static final int MAX_COUNT_TOTAL = 20;
57
58
	private Text filterText;
59
60
	private AbstractProvider[] providers;
61
	private IWorkbenchWindow window;
62
63
	private Table table;
64
65
	private LocalResourceManager resourceManager = new LocalResourceManager(
66
			JFaceResources.getResources());
67
68
	private static final String TEXT_ARRAY = "textArray"; //$NON-NLS-1$
69
	private static final String TEXT_ENTRIES = "textEntries"; //$NON-NLS-1$
70
	private static final String ORDERED_PROVIDERS = "orderedProviders"; //$NON-NLS-1$
71
	private static final String ORDERED_ELEMENTS = "orderedElements"; //$NON-NLS-1$
72
	static final int MAXIMUM_NUMBER_OF_ELEMENTS = 60;
73
	static final int MAXIMUM_NUMBER_OF_TEXT_ENTRIES_PER_ELEMENT = 3;
74
75
	protected String rememberedText;
76
77
	protected Map textMap = new HashMap();
78
79
	protected Map elementMap = new HashMap();
80
81
	private LinkedList previousPicksList = new LinkedList();
82
83
	protected Map providerMap;
84
85
	/**
86
	 * @param parent
87
	 * @param providers
88
	 */
89
	QuickAccessDialog(IWorkbenchWindow window, AbstractProvider[] providers) {
90
		super(ProgressManagerUtil.getDefaultParent(), SWT.RESIZE, true, true,
91
				true, true, "Foo", "boo"); //$NON-NLS-1$ //$NON-NLS-2$
92
		this.window = window;
93
		this.providers = providers;
94
		providers[0] = new PreviousPicksProvider();
95
		providerMap = new HashMap();
96
		for (int i = 0; i < providers.length; i++) {
97
			providerMap.put(providers[i].getId(), providers[i]);
98
		}
99
		restoreDialog();
100
	}
101
102
	protected Control createTitleControl(Composite parent) {
103
		filterText = new Text(parent, SWT.NONE);
104
105
		GC gc = new GC(parent);
106
		gc.setFont(parent.getFont());
107
		FontMetrics fontMetrics = gc.getFontMetrics();
108
		gc.dispose();
109
110
		GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).grab(true,
111
				false).hint(SWT.DEFAULT,
112
				Dialog.convertHeightInCharsToPixels(fontMetrics, 1)).applyTo(
113
				filterText);
114
115
		filterText.addKeyListener(new KeyListener() {
116
			public void keyPressed(KeyEvent e) {
117
				if (e.keyCode == 0x0D) {
118
					AbstractElement selectedElement = null;
119
					if (table.getSelectionCount() == 1) {
120
						selectedElement = ((TableEntry) table.getSelection()[0]
121
								.getData()).element;
122
					}
123
					close();
124
					if (selectedElement != null) {
125
						handleElementSelected(selectedElement);
126
					}
127
				}
128
				if (e.keyCode == SWT.ARROW_DOWN)
129
					table.setFocus();
130
					if (table.getItemCount() > 1) {
131
						table.setSelection(1);
132
					}
133
				if (e.keyCode == SWT.ARROW_UP)
134
					table.setFocus();
135
				if (e.character == 0x1B) // ESC
136
					close();
137
			}
138
139
			public void keyReleased(KeyEvent e) {
140
				// do nothing
141
			}
142
		});
143
		filterText.addModifyListener(new ModifyListener() {
144
			public void modifyText(ModifyEvent e) {
145
				String text = ((Text) e.widget).getText();
146
				int length = text.length();
147
				if (length > 0) {
148
					if (text.charAt(length - 1) != '*') {
149
						text = text + '*';
150
					}
151
					if (text.charAt(0) != '*') {
152
						text = '*' + text;
153
					}
154
				}
155
				refreshTable(text);
156
			}
157
		});
158
159
		return filterText;
160
	}
161
162
	/*
163
	 * (non-Javadoc)
164
	 * 
165
	 * @see org.eclipse.jface.dialogs.PopupDialog#createDialogArea(org.eclipse.swt.widgets.Composite)
166
	 */
167
	protected Control createDialogArea(Composite parent) {
168
		Composite composite = (Composite) super.createDialogArea(parent);
169
		TableColumnLayout tableColumnLayout = new TableColumnLayout();
170
		composite.setLayout(tableColumnLayout);
171
		table = new Table(composite, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL
172
				| SWT.FULL_SELECTION);
173
		tableColumnLayout.setColumnData(new TableColumn(table, SWT.NONE),
174
				new ColumnWeightData(0, 120));
175
		tableColumnLayout.setColumnData(new TableColumn(table, SWT.NONE),
176
				new ColumnWeightData(100, 100));
177
		// table.addListener(SWT.MeasureItem, new Listener() {
178
		// public void handleEvent(Event event) {
179
		// TableEntry entry = (TableEntry) event.item.getData();
180
		// }
181
		// });
182
		// TextLayout layout = new TextLayout(table.getDisplay());
183
		final TextLayout textLayout = new TextLayout(table.getDisplay());
184
		Font boldFont = resourceManager.createFont(FontDescriptor.createFrom(table.getFont()).setStyle(SWT.BOLD));
185
		final TextStyle boldStyle = new TextStyle(boldFont, null, null);
186
		Listener listener = new Listener() {
187
			public void handleEvent(Event event) {
188
				Color oldForeground = event.gc.getForeground();
189
				TableEntry entry = (TableEntry) event.item.getData();
190
				switch (event.type) {
191
				case SWT.MeasureItem:
192
					switch (event.index) {
193
					case 0:
194
						if (entry.firstInCategory) {
195
							textLayout.setText(entry.provider.getName());
196
						}
197
						break;
198
					case 1:
199
						Image image = getImage(entry.element);
200
						Rectangle imageRect = image.getBounds();
201
						event.width += imageRect.width + 2;
202
						event.height = Math.max(event.height, imageRect.height + 2);
203
						textLayout.setText(entry.element.getLabel());
204
						String filter = filterText.getText();
205
						int filterIndex = entry.element.getLabel().indexOf(filter);
206
						if (filterIndex != -1) {
207
							textLayout.setStyle(boldStyle, filterIndex, filterIndex + filter.length() - 1);
208
						}
209
						break;
210
					}
211
					Rectangle rect = textLayout.getBounds();
212
					event.width += rect.width;
213
					event.height = Math.max(event.height, rect.height + 2);
214
					break;
215
				case SWT.PaintItem:
216
					boolean selected  = (event.detail & SWT.SELECTED) != 0;
217
					boolean hasFocus = table.isFocusControl();
218
					event.gc.setForeground(table
219
							.getDisplay()
220
							.getSystemColor(
221
									hasFocus && selected ? SWT.COLOR_LIST_SELECTION_TEXT
222
											: SWT.COLOR_LIST_FOREGROUND));
223
					switch (event.index) {
224
					case 0:
225
						if (entry.firstInCategory) {
226
							textLayout.setText(entry.provider.getName());
227
							textLayout.draw(event.gc, event.x+1, event.y+1);
228
						}
229
						break;
230
					case 1:
231
						Image image = getImage(entry.element);
232
						event.gc.drawImage(image, event.x + 1, event.y + 1);
233
						textLayout.setText(entry.element.getLabel());
234
						String filter = filterText.getText();
235
						int filterIndex = entry.element.getLabel().toLowerCase().indexOf(filter.toLowerCase());
236
						if (filterIndex != -1) {
237
							textLayout.setStyle(boldStyle, filterIndex, filterIndex + filter.length() - 1);
238
						}
239
						textLayout.draw(event.gc, event.x+3+image.getBounds().width, event.y+2);
240
						break;
241
					}
242
					if (entry.lastInCategory) {
243
						event.gc.setForeground(event.item.getDisplay()
244
								.getSystemColor(SWT.COLOR_GRAY));
245
						int x = event.x;
246
						if (event.index == 0) {
247
							x = 0;
248
						}
249
						event.gc.drawLine(x, event.y + event.height - 1, x
250
								+ ((TableItem) event.item).getParent()
251
										.getColumn(event.index).getWidth(),
252
								event.y + event.height - 1);
253
					}
254
					event.gc.setForeground(oldForeground);
255
					break;
256
				case SWT.EraseItem:
257
					Rectangle bounds = event.getBounds();
258
					if ((event.detail & SWT.SELECTED) != 0) {
259
						Color oldBackground = event.gc.getBackground();
260
261
						final int background = table.isFocusControl() ? SWT.COLOR_LIST_SELECTION
262
								: SWT.COLOR_WIDGET_BACKGROUND;
263
						event.gc.setBackground(event.item.getDisplay()
264
								.getSystemColor(background));
265
						event.gc.setForeground(event.item.getDisplay()
266
								.getSystemColor(SWT.COLOR_LIST_SELECTION_TEXT));
267
						event.gc.fillRectangle(bounds);
268
						/* restore the old GC colors */
269
						event.gc.setForeground(oldForeground);
270
						event.gc.setBackground(oldBackground);
271
						/* ensure that default selection is not drawn */
272
						event.detail &= ~SWT.SELECTED;
273
					}
274
					break;
275
				}
276
			}
277
		};
278
		table.addListener(SWT.MeasureItem, listener);
279
		table.addListener(SWT.EraseItem, listener);
280
		table.addListener(SWT.PaintItem, listener);
281
		refreshTable(""); //$NON-NLS-1$
282
		return composite;
283
	}
284
285
	private static class TableEntry {
286
		boolean firstInCategory;
287
		boolean lastInCategory;
288
		AbstractElement element;
289
		AbstractProvider provider;
290
291
		TableEntry(boolean firstInCategory, AbstractElement element,
292
				AbstractProvider provider) {
293
			this.firstInCategory = firstInCategory;
294
			this.element = element;
295
			this.provider = provider;
296
		}
297
	}
298
299
	/**
300
	 * 
301
	 */
302
	private void refreshTable(String filter) {
303
		TableItem[] items = table.getItems();
304
		StringMatcher stringMatcher = new StringMatcher(filter, true, false);
305
		int countTotal = 0;
306
		TableEntry lastEntry = null;
307
		for (int i = 0; i < providers.length && countTotal < MAX_COUNT_TOTAL; i++) {
308
			int countPerProvider = 0;
309
			AbstractProvider provider = providers[i];
310
			if (filter.length() > 0
311
					|| provider instanceof PreviousPicksProvider) {
312
				AbstractElement[] elements = provider.getElementsSorted();
313
				element_loop: for (int j = 0; j < elements.length
314
						&& countPerProvider < MAX_COUNT_PER_PROVIDER
315
						&& countTotal < MAX_COUNT_TOTAL; j++) {
316
					AbstractElement element = elements[j];
317
					String[] matchLabels = element.getMatchLabels();
318
					for (int k = 0; k < matchLabels.length; k++) {
319
						if (stringMatcher.match(matchLabels[k])
320
								|| filter.length() == 0) {
321
							boolean firstInCategory = countPerProvider == 0;
322
							if (firstInCategory && lastEntry!=null) {
323
								lastEntry.lastInCategory = true;
324
							}
325
							TableEntry entry = new TableEntry(firstInCategory,
326
									element, provider);
327
							lastEntry = entry;
328
							TableItem item;
329
							if (countTotal < items.length) {
330
								item = items[countTotal];
331
							} else {
332
								item = new TableItem(table, SWT.NONE);
333
							}
334
							item.setData(entry);
335
//							if (firstInCategory) {
336
//								item.setText(0, provider.getName());
337
//							} else {
338
//								item.setText(0, ""); //$NON-NLS-1$
339
//							}
340
//							item.setText(1, element.getLabel());
341
//							item.setImage(1, getImage(element));
342
							countPerProvider++;
343
							countTotal++;
344
							continue element_loop;
345
						}
346
					}
347
				}
348
			}
349
		}
350
		if (lastEntry!=null) {
351
			lastEntry.lastInCategory = true;
352
		}
353
		if (countTotal < items.length) {
354
			table.remove(countTotal, items.length - 1);
355
		}
356
		if (countTotal > 0) {
357
			table.setSelection(0);
358
		} else {
359
			table.deselectAll();
360
		}
361
	}
362
363
	Image getImage(AbstractElement element) {
364
		Image image = findOrCreateImage(element.getImageDescriptor());
365
		if (image == null) {
366
			image = WorkbenchImages
367
					.getImage(IWorkbenchGraphicConstants.IMG_OBJ_ELEMENT);
368
		}
369
		return image;
370
	}
371
372
	private Image findOrCreateImage(ImageDescriptor imageDescriptor) {
373
		if (imageDescriptor == null) {
374
			return null;
375
		}
376
		Image image = (Image) resourceManager.find(imageDescriptor);
377
		if (image == null) {
378
			try {
379
				image = resourceManager.createImage(imageDescriptor);
380
			} catch (DeviceResourceException e) {
381
				WorkbenchPlugin.log(e);
382
			}
383
		}
384
		return image;
385
	}
386
387
	protected Control getFocusControl() {
388
		return filterText;
389
	}
390
391
	public boolean close() {
392
		storeDialog(getDialogSettings());
393
		if (resourceManager != null) {
394
			resourceManager.dispose();
395
			resourceManager = null;
396
		}
397
		return super.close();
398
	}
399
400
	protected Point getInitialSize() {
401
		if (!getPersistBounds()) {
402
			return new Point(400, 400);
403
		}
404
		return super.getInitialSize();
405
	}
406
407
	protected Point getInitialLocation(Point initialSize) {
408
		if (!getPersistBounds()) {
409
			Point size = new Point(400, 400);
410
			Rectangle parentBounds = getParentShell().getBounds();
411
			int x = parentBounds.x + parentBounds.width / 2 - size.x / 2;
412
			int y = parentBounds.y + parentBounds.height / 2 - size.y / 2;
413
			return new Point(x, y);
414
		}
415
		return super.getInitialLocation(initialSize);
416
	}
417
418
	protected IDialogSettings getDialogSettings() {
419
		final IDialogSettings workbenchDialogSettings = WorkbenchPlugin
420
				.getDefault().getDialogSettings();
421
		IDialogSettings result = workbenchDialogSettings.getSection(getId());
422
		if (result == null) {
423
			result = workbenchDialogSettings.addNewSection(getId());
424
		}
425
		return result;
426
	}
427
428
	protected String getId() {
429
		return "org.eclipse.ui.internal.QuickAccess"; //$NON-NLS-1$
430
	}
431
432
	private void storeDialog(IDialogSettings dialogSettings) {
433
		String[] orderedElements = new String[previousPicksList.size()];
434
		String[] orderedProviders = new String[previousPicksList.size()];
435
		String[] textEntries = new String[previousPicksList.size()];
436
		ArrayList arrayList = new ArrayList();
437
		for (int i = 0; i < orderedElements.length; i++) {
438
			AbstractElement abstractElement = (AbstractElement) previousPicksList
439
					.get(i);
440
			ArrayList elementText = (ArrayList) textMap.get(abstractElement);
441
			Assert.isNotNull(elementText);
442
			orderedElements[i] = abstractElement.getId();
443
			orderedProviders[i] = abstractElement.getProvider().getId();
444
			arrayList.addAll(elementText);
445
			textEntries[i] = elementText.size() + ""; //$NON-NLS-1$
446
		}
447
		String[] textArray = (String[]) arrayList.toArray(new String[arrayList
448
				.size()]);
449
		dialogSettings.put(ORDERED_ELEMENTS, orderedElements);
450
		dialogSettings.put(ORDERED_PROVIDERS, orderedProviders);
451
		dialogSettings.put(TEXT_ENTRIES, textEntries);
452
		dialogSettings.put(TEXT_ARRAY, textArray);
453
	}
454
455
	private void restoreDialog() {
456
		IDialogSettings dialogSettings = getDialogSettings();
457
		if (dialogSettings != null) {
458
			String[] orderedElements = dialogSettings
459
					.getArray(ORDERED_ELEMENTS);
460
			String[] orderedProviders = dialogSettings
461
					.getArray(ORDERED_PROVIDERS);
462
			String[] textEntries = dialogSettings.getArray(TEXT_ENTRIES);
463
			String[] textArray = dialogSettings.getArray(TEXT_ARRAY);
464
			elementMap = new HashMap();
465
			textMap = new HashMap();
466
			previousPicksList = new LinkedList();
467
			if (orderedElements != null && orderedProviders != null
468
					&& textEntries != null && textArray != null) {
469
				int arrayIndex = 0;
470
				for (int i = 0; i < orderedElements.length; i++) {
471
					AbstractProvider abstractProvider = (AbstractProvider) providerMap
472
							.get(orderedProviders[i]);
473
					int numTexts = Integer.parseInt(textEntries[i]);
474
					if (abstractProvider != null) {
475
						AbstractElement abstractElement = abstractProvider
476
								.getElementForId(orderedElements[i]);
477
						if (abstractElement != null) {
478
							ArrayList arrayList = new ArrayList();
479
							for (int j = arrayIndex; j < arrayIndex + numTexts; j++) {
480
								arrayList.add(textArray[j]);
481
								elementMap.put(textArray[j], abstractElement);
482
							}
483
							textMap.put(abstractElement, arrayList);
484
							previousPicksList.add(abstractElement);
485
						}
486
					}
487
					arrayIndex += numTexts;
488
				}
489
			}
490
		}
491
	}
492
493
	protected void handleElementSelected(Object selectedElement) {
494
		IWorkbenchPage activePage = window.getActivePage();
495
		if (activePage != null) {
496
			if (selectedElement instanceof AbstractElement) {
497
				addPreviousPick(selectedElement);
498
				storeDialog(getDialogSettings());
499
				AbstractElement element = (AbstractElement) selectedElement;
500
				element.execute();
501
			}
502
		}
503
	}
504
505
	/**
506
	 * @param element
507
	 */
508
	private void addPreviousPick(Object element) {
509
		// previousPicksList:
510
		// Remove element from previousPicksList so there are no duplicates
511
		// If list is max size, remove last(oldest) element
512
		// Remove entries for removed element from elementMap and textMap
513
		// Add element to front of previousPicksList
514
		previousPicksList.remove(element);
515
		if (previousPicksList.size() == MAXIMUM_NUMBER_OF_ELEMENTS) {
516
			Object removedElement = previousPicksList.removeLast();
517
			ArrayList removedList = (ArrayList) textMap.remove(removedElement);
518
			for (int i = 0; i < removedList.size(); i++) {
519
				elementMap.remove(removedList.get(i));
520
			}
521
		}
522
		previousPicksList.addFirst(element);
523
524
		// textMap:
525
		// Get list of strings for element from textMap
526
		// Create new list for element if there isn't one and put
527
		// element->textList in textMap
528
		// Remove rememberedText from list
529
		// If list is max size, remove first(oldest) string
530
		// Remove text from elementMap
531
		// Add rememberedText to list of strings for element in textMap
532
		ArrayList textList = (ArrayList) textMap.get(element);
533
		if (textList == null) {
534
			textList = new ArrayList();
535
			textMap.put(element, textList);
536
		}
537
		textList.remove(rememberedText);
538
		if (textList.size() == MAXIMUM_NUMBER_OF_TEXT_ENTRIES_PER_ELEMENT) {
539
			Object removedText = textList.remove(0);
540
			elementMap.remove(removedText);
541
		}
542
		textList.add(rememberedText);
543
544
		// elementMap:
545
		// Put rememberedText->element in elementMap
546
		// If it replaced a different element update textMap and
547
		// PreviousPicksList
548
		Object replacedElement = elementMap.put(rememberedText, element);
549
		if (replacedElement != null && !replacedElement.equals(element)) {
550
			textList = (ArrayList) textMap.get(replacedElement);
551
			if (textList != null) {
552
				textList.remove(rememberedText);
553
				if (textList.isEmpty()) {
554
					textMap.remove(replacedElement);
555
					previousPicksList.remove(replacedElement);
556
				}
557
			}
558
		}
559
	}
560
561
	private class PreviousPicksProvider extends AbstractProvider {
562
563
		public AbstractElement getElementForId(String id) {
564
			return null;
565
		}
566
567
		public AbstractElement[] getElements() {
568
			return (AbstractElement[]) previousPicksList
569
					.toArray(new AbstractElement[previousPicksList.size()]);
570
		}
571
572
		public AbstractElement[] getElementsSorted() {
573
			return getElements();
574
		}
575
576
		public String getId() {
577
			return "org.eclipse.ui.previousPicks"; //$NON-NLS-1$
578
		}
579
580
		public ImageDescriptor getImageDescriptor() {
581
			return WorkbenchImages
582
					.getImageDescriptor(IWorkbenchGraphicConstants.IMG_OBJ_NODE);
583
		}
584
585
		public String getName() {
586
			return IncubatorMessages.CtrlEAction_Previous;
587
		}
588
	}
589
590
}

Return to bug 183679