Skip to content

Commit 8166ed7

Browse files
ricardojlrufinofacchinm
authored andcommittedJun 12, 2018
Base implementation of autocomplete #849
1 parent c5c0faa commit 8166ed7

10 files changed

+204
-1
lines changed
 

‎app/.classpath

+2-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
<classpathentry kind="src" path="test"/>
55
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
66
<classpathentry combineaccessrules="false" kind="src" path="/arduino-core"/>
7-
<classpathentry kind="output" path="bin"/>
87
<classpathentry kind="lib" path="lib/apple.jar"/>
98
<classpathentry kind="lib" path="lib/batik-1.8.jar"/>
109
<classpathentry kind="lib" path="lib/batik-anim-1.8.jar"/>
@@ -44,6 +43,7 @@
4443
<classpathentry kind="lib" path="lib/jsch-0.1.50.jar"/>
4544
<classpathentry kind="lib" path="lib/jssc-2.8.0-arduino1.jar"/>
4645
<classpathentry kind="lib" path="lib/rsyntaxtextarea-2.6.1.jar"/>
46+
<classpathentry kind="lib" path="lib/autocomplete-2.6.1.jar" sourcepath="/media/ricardo/Dados/Workspace/Arduino/arduino-dep/AutoComplete-2.6.1"/>
4747
<classpathentry kind="lib" path="lib/xml-apis-1.3.04.jar"/>
4848
<classpathentry kind="lib" path="lib/xml-apis-ext-1.3.04.jar"/>
4949
<classpathentry kind="lib" path="lib/xmlgraphics-commons-2.0.jar"/>
@@ -53,4 +53,5 @@
5353
<classpathentry kind="lib" path="test-lib/fest-swing-1.2.jar"/>
5454
<classpathentry kind="lib" path="test-lib/fest-util-1.1.2.jar"/>
5555
<classpathentry kind="lib" path="test-lib/jcip-annotations-1.0.jar"/>
56+
<classpathentry kind="output" path="bin"/>
5657
</classpath>

‎app/lib/autocomplete-2.6.1.jar

148 KB
Binary file not shown.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package cc.arduino.autocomplete;
2+
3+
import org.fife.ui.autocomplete.CompletionProvider;
4+
5+
import processing.app.Sketch;
6+
import processing.app.syntax.SketchTextArea;
7+
8+
public class CompletionContext {
9+
10+
private Sketch sketch;
11+
12+
private SketchTextArea textArea;
13+
14+
private CompletionProvider delegate; // of: AutoComplete/RSyntaxTextArea
15+
16+
public CompletionContext(Sketch sketch, SketchTextArea textArea,CompletionProvider delegate) {
17+
this.sketch = sketch;
18+
this.textArea = textArea;
19+
this.delegate = delegate;
20+
}
21+
22+
23+
public String getAlreadyEnteredText() {
24+
return delegate.getAlreadyEnteredText(textArea);
25+
}
26+
27+
public int getLineNumber() {
28+
return textArea.getCaretLineNumber();
29+
}
30+
31+
32+
public Sketch getSketch() {
33+
return sketch;
34+
}
35+
36+
public SketchTextArea getTextArea() {
37+
return textArea;
38+
}
39+
40+
public CompletionProvider getDelegate() {
41+
return delegate;
42+
}
43+
44+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package cc.arduino.autocomplete;
2+
3+
import java.util.List;
4+
5+
import org.fife.ui.autocomplete.Completion;
6+
7+
public interface CompletionProvider {
8+
9+
List<Completion> getSuggestions(CompletionContext context);
10+
11+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package cc.arduino.autocomplete;
2+
3+
import java.util.LinkedList;
4+
import java.util.List;
5+
6+
import org.fife.ui.autocomplete.BasicCompletion;
7+
import org.fife.ui.autocomplete.Completion;
8+
9+
public class FakeCompletionProvider implements CompletionProvider {
10+
11+
12+
@Override
13+
public List<Completion> getSuggestions(CompletionContext context) {
14+
List<Completion> list = new LinkedList<>();
15+
list.add(new BasicCompletion(context.getDelegate(), "Text: " + context.getAlreadyEnteredText()));
16+
list.add(new BasicCompletion(context.getDelegate(), "Line: " + context.getLineNumber()));
17+
18+
return list;
19+
}
20+
21+
22+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package cc.arduino.autocomplete.rsyntax;
2+
3+
import java.util.List;
4+
5+
import javax.swing.text.JTextComponent;
6+
7+
import org.fife.ui.autocomplete.Completion;
8+
import org.fife.ui.autocomplete.DefaultCompletionProvider;
9+
10+
import cc.arduino.autocomplete.CompletionContext;
11+
import cc.arduino.autocomplete.CompletionProvider;
12+
13+
public class CompletionProviderBridge extends DefaultCompletionProvider{
14+
15+
private CompletionProvider provider;
16+
17+
private CompletionContext context;
18+
19+
public CompletionProviderBridge(CompletionContext context, CompletionProvider provider) {
20+
this.provider = provider;
21+
this.context = context;
22+
}
23+
24+
25+
@Override
26+
public List<Completion> getCompletionsImpl(JTextComponent comp) {
27+
return provider.getSuggestions(context);
28+
29+
}
30+
31+
@Override
32+
protected boolean isValidChar(char ch) {
33+
return super.isValidChar(ch) || '.' == ch || '>' == ch || '-' == ch || '<' == ch || '#' == ch || ':' == ch /**|| getParameterListStart() == ch */;
34+
}
35+
36+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package cc.arduino.autocomplete.rsyntax;
2+
3+
import org.fife.ui.autocomplete.LanguageAwareCompletionProvider;
4+
5+
import cc.arduino.autocomplete.CompletionContext;
6+
import cc.arduino.autocomplete.CompletionProvider;
7+
import processing.app.Sketch;
8+
import processing.app.syntax.SketchTextArea;
9+
10+
11+
/**
12+
* CompletionProvider for Arduino/CPP Language. <br/>
13+
* Setup basic logic for completions using {@link LanguageAwareCompletionProvider}
14+
* Filtering and decision will appear in the autocomplete dialog by implementations of: {@link CompletionProvider}. <br/>
15+
*
16+
* @author Ricardo JL Rufino (ricardo@criativasoft.com.br)
17+
* @date 28/04/2017
18+
*/
19+
public class SketchCompletionProvider extends LanguageAwareCompletionProvider{
20+
21+
public SketchCompletionProvider(Sketch sketch, SketchTextArea textArea, CompletionProvider provider) {
22+
23+
CompletionContext context = new CompletionContext(sketch, textArea, this);
24+
25+
setDefaultCompletionProvider(new CompletionProviderBridge(context, provider));
26+
// provider.setParameterChoicesProvider(new ParameterChoicesProvider(this));
27+
// provider.setParameterizedCompletionParams('(', ", ", ')');
28+
29+
}
30+
31+
32+
33+
}

‎app/src/processing/app/EditorTab.java

+2
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@
6666
import org.fife.ui.rtextarea.RTextScrollPane;
6767

6868
import cc.arduino.UpdatableBoardsLibsFakeURLsHandler;
69+
import cc.arduino.autocomplete.FakeCompletionProvider;
6970
import processing.app.helpers.DocumentTextChangeListener;
7071
import processing.app.syntax.ArduinoTokenMakerFactory;
7172
import processing.app.syntax.PdeKeywords;
@@ -120,6 +121,7 @@ public EditorTab(Editor editor, SketchFile file, String contents)
120121
applyPreferences();
121122
add(scrollPane, BorderLayout.CENTER);
122123
textarea.addMouseWheelListener(this);
124+
textarea.setupAutoComplete(file.getSketch(), new FakeCompletionProvider());
123125
}
124126

125127
private RSyntaxDocument createDocument(String contents) {

‎app/src/processing/app/syntax/SketchTextArea.java

+50
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@
3030

3131
package processing.app.syntax;
3232

33+
import java.awt.Color;
34+
import java.awt.Cursor;
35+
import java.awt.Font;
36+
import java.awt.Insets;
3337
import java.awt.event.InputEvent;
3438
import java.awt.event.KeyEvent;
3539
import java.awt.event.MouseEvent;
@@ -66,6 +70,34 @@
6670
import java.net.URL;
6771
import java.util.Map;
6872
import java.util.logging.Logger;
73+
74+
import javax.swing.KeyStroke;
75+
import javax.swing.event.EventListenerList;
76+
import javax.swing.event.HyperlinkEvent;
77+
import javax.swing.event.HyperlinkListener;
78+
import javax.swing.text.BadLocationException;
79+
import javax.swing.text.Segment;
80+
81+
import org.apache.commons.compress.utils.IOUtils;
82+
import org.fife.ui.autocomplete.AutoCompletion;
83+
import org.fife.ui.rsyntaxtextarea.LinkGenerator;
84+
import org.fife.ui.rsyntaxtextarea.LinkGeneratorResult;
85+
import org.fife.ui.rsyntaxtextarea.RSyntaxDocument;
86+
import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
87+
import org.fife.ui.rsyntaxtextarea.Style;
88+
import org.fife.ui.rsyntaxtextarea.Theme;
89+
import org.fife.ui.rsyntaxtextarea.Token;
90+
import org.fife.ui.rsyntaxtextarea.TokenImpl;
91+
import org.fife.ui.rsyntaxtextarea.TokenTypes;
92+
import org.fife.ui.rtextarea.RTextArea;
93+
import org.fife.ui.rtextarea.RTextAreaUI;
94+
95+
import cc.arduino.autocomplete.CompletionProvider;
96+
import cc.arduino.autocomplete.rsyntax.SketchCompletionProvider;
97+
import processing.app.Base;
98+
import processing.app.BaseNoGui;
99+
import processing.app.PreferencesData;
100+
import processing.app.Sketch;
69101
import processing.app.helpers.OSUtils;
70102

71103
/**
@@ -79,6 +111,8 @@ public class SketchTextArea extends RSyntaxTextArea {
79111
private final static Logger LOG = Logger.getLogger(SketchTextArea.class.getName());
80112

81113
private PdeKeywords pdeKeywords;
114+
115+
private SketchCompletionProvider completionProvider;
82116

83117
public SketchTextArea(RSyntaxDocument document, PdeKeywords pdeKeywords) throws IOException {
84118
super(document);
@@ -91,6 +125,22 @@ public void setKeywords(PdeKeywords keywords) {
91125
pdeKeywords = keywords;
92126
setLinkGenerator(new DocLinkGenerator(pdeKeywords));
93127
}
128+
129+
public void setupAutoComplete(Sketch sketch, CompletionProvider provider) {
130+
131+
this.completionProvider = new SketchCompletionProvider(sketch, this, provider);
132+
133+
AutoCompletion ac = new AutoCompletion( this.completionProvider);
134+
135+
ac.setAutoActivationEnabled(true);
136+
ac.setShowDescWindow(false);
137+
ac.setAutoCompleteSingleChoices(true);
138+
ac.setParameterAssistanceEnabled(true);
139+
// ac.setParamChoicesRenderer(new CompletionsRenderer());
140+
// ac.setListCellRenderer(new CompletionsRenderer());
141+
ac.install(this);
142+
143+
}
94144

95145
private void installFeatures() throws IOException {
96146
setTheme(PreferencesData.get("editor.syntax_theme", "default"));

‎arduino-core/src/processing/app/SketchFile.java

+4
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,10 @@ public boolean isModified() {
246246
public boolean equals(Object o) {
247247
return (o instanceof SketchFile) && file.equals(((SketchFile) o).file);
248248
}
249+
250+
public Sketch getSketch() {
251+
return sketch;
252+
}
249253

250254
/**
251255
* Load this piece of code from a file and return the contents. This

0 commit comments

Comments
 (0)
Failed to load comments.