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);
}
}
}
}
|