Skip to main content
aboutsummaryrefslogtreecommitdiffstats
blob: de6b1d618bc33f1d66ee1597f71224300830f88c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
/*******************************************************************************
 * Copyright (c) 2019 Red Hat Inc.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *******************************************************************************/
package org.eclipse.text.quicksearch.internal.ui;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.text.TextSelection;
import org.eclipse.osgi.util.NLS;
import org.eclipse.text.quicksearch.internal.core.LineItem;
import org.eclipse.text.quicksearch.internal.core.QuickTextQuery;
import org.eclipse.text.quicksearch.internal.core.QuickTextSearchRequestor;
import org.eclipse.text.quicksearch.internal.core.QuickTextSearcher;
import org.eclipse.text.quicksearch.internal.core.priority.PriorityFunction;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.ide.IDE;
import org.eclipse.ui.quickaccess.IQuickAccessComputer;
import org.eclipse.ui.quickaccess.IQuickAccessComputerExtension;
import org.eclipse.ui.quickaccess.QuickAccessElement;
import org.eclipse.ui.texteditor.ITextEditor;

public class QuickSearchQuickAccessComputer extends QuickTextSearchRequestor implements IQuickAccessComputer, IQuickAccessComputerExtension {

	private static final int MAX_ENTRIES = 20;
	private static final long TIMEOUT = 200;
	private PriorityFunction priorities;

	public QuickSearchQuickAccessComputer() {
		priorities = new QuickSearchContext(PlatformUI.getWorkbench().getActiveWorkbenchWindow()).createPriorityFun();
	}

	@Override public QuickAccessElement[] computeElements(String query, IProgressMonitor monitor) {
		List<LineItem> matches = Collections.synchronizedList(new ArrayList<>());
		QuickTextSearcher searcher = new QuickTextSearcher(new QuickTextQuery("", false), priorities, 100, new QuickTextSearchRequestor() { //$NON-NLS-1$
				@Override public void add(LineItem match) {
					matches.add(match);
				}

				@Override public void clear() {
					matches.clear();
				}

				@Override public void revoke(LineItem line) {
					matches.remove(line);
				}
		});
		searcher.setMaxResults(MAX_ENTRIES);
		searcher.setQuery(new QuickTextQuery(query, false), true);
		long start = System.currentTimeMillis();
		while (matches.size() < 20 && !searcher.isDone() && System.currentTimeMillis() - start < TIMEOUT) {
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
				QuickSearchActivator.log(e);
			}
		}
		searcher.cancel();
		return matches.stream().map(LineItemQuickAccessElement::new).toArray(QuickAccessElement[]::new);
	}

	@Override public QuickAccessElement[] computeElements() {
		return new QuickAccessElement[0];
	}

	@Override public void resetState() {
		// stateless

	}

	@Override public boolean needsRefresh() {
		return false;
	}

	private class LineItemQuickAccessElement extends QuickAccessElement {

		private final LineItem item;

		public LineItemQuickAccessElement(LineItem item) {
			this.item = item;
		}

		@Override public String getLabel() {
			return NLS.bind(Messages.quickAccessMatch, item.getText(), item.getFile().getName());
		}

		@Override public ImageDescriptor getImageDescriptor() {
			return null;
		}

		@Override public String getId() {
			return item.getFile().getFullPath().toString() + '[' + item.getOffset() + ':' + (item.getOffset() + item.getText().length() - 1) + ']';
		}

		@Override public void execute() {
			IEditorPart part;
			try {
				part = IDE.openEditor(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(), item.getFile());
				if (part instanceof ITextEditor) {
					((ITextEditor) part).getSelectionProvider().setSelection(new TextSelection(item.getOffset(), item.getText().length()));
				}
			} catch (PartInitException e) {
				QuickSearchActivator.log(e);
			}
		}

	}

}

Back to the top