Skip to content

Commit f974c0d

Browse files
ricardojlrufinofacchinm
authored andcommittedMay 14, 2019
Base implementation of autocomplete #849
1 parent d644d2a commit f974c0d

10 files changed

+214
-0
lines changed
 

‎app/.classpath

+1
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
<classpathentry kind="lib" path="lib/jsch-0.1.50.jar"/>
4343
<classpathentry kind="lib" path="lib/jssc-2.8.0-arduino3.jar"/>
4444
<classpathentry kind="lib" path="lib/rsyntaxtextarea-3.0.3-SNAPSHOT.jar"/>
45+
<classpathentry kind="lib" path="lib/autocomplete-2.6.1.jar" sourcepath="/media/ricardo/Dados/Workspace/Arduino/arduino-dep/AutoComplete-2.6.1"/>
4546
<classpathentry kind="lib" path="lib/xml-apis-1.3.04.jar"/>
4647
<classpathentry kind="lib" path="lib/xml-apis-ext-1.3.04.jar"/>
4748
<classpathentry kind="lib" path="lib/xmlgraphics-commons-2.0.jar"/>

‎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
editor.base.addEditorFontResizeMouseWheelListener(textarea);
124+
textarea.setupAutoComplete(file.getSketch(), new FakeCompletionProvider());
123125
}
124126

125127
private RSyntaxDocument createDocument(String contents) {

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

+61
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,49 @@
6666

6767
import processing.app.Base;
6868
import processing.app.PreferencesData;
69+
70+
import javax.swing.event.EventListenerList;
71+
import javax.swing.event.HyperlinkEvent;
72+
import javax.swing.event.HyperlinkListener;
73+
import javax.swing.text.BadLocationException;
74+
import javax.swing.text.Segment;
75+
import java.awt.*;
76+
import java.awt.event.MouseEvent;
77+
import java.io.File;
78+
import java.io.FileInputStream;
79+
import java.io.IOException;
80+
import java.net.MalformedURLException;
81+
import java.net.URL;
82+
import java.util.Map;
83+
import java.util.logging.Logger;
84+
85+
import javax.swing.KeyStroke;
86+
import javax.swing.event.EventListenerList;
87+
import javax.swing.event.HyperlinkEvent;
88+
import javax.swing.event.HyperlinkListener;
89+
import javax.swing.text.BadLocationException;
90+
import javax.swing.text.Segment;
91+
92+
import org.apache.commons.compress.utils.IOUtils;
93+
import org.fife.ui.autocomplete.AutoCompletion;
94+
import org.fife.ui.rsyntaxtextarea.LinkGenerator;
95+
import org.fife.ui.rsyntaxtextarea.LinkGeneratorResult;
96+
import org.fife.ui.rsyntaxtextarea.RSyntaxDocument;
97+
import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
98+
import org.fife.ui.rsyntaxtextarea.Style;
99+
import org.fife.ui.rsyntaxtextarea.Theme;
100+
import org.fife.ui.rsyntaxtextarea.Token;
101+
import org.fife.ui.rsyntaxtextarea.TokenImpl;
102+
import org.fife.ui.rsyntaxtextarea.TokenTypes;
103+
import org.fife.ui.rtextarea.RTextArea;
104+
import org.fife.ui.rtextarea.RTextAreaUI;
105+
106+
import cc.arduino.autocomplete.CompletionProvider;
107+
import cc.arduino.autocomplete.rsyntax.SketchCompletionProvider;
108+
import processing.app.Base;
109+
import processing.app.BaseNoGui;
110+
import processing.app.PreferencesData;
111+
import processing.app.Sketch;
69112
import processing.app.helpers.OSUtils;
70113

71114
/**
@@ -79,6 +122,8 @@ public class SketchTextArea extends RSyntaxTextArea {
79122
private final static Logger LOG = Logger.getLogger(SketchTextArea.class.getName());
80123

81124
private PdeKeywords pdeKeywords;
125+
126+
private SketchCompletionProvider completionProvider;
82127

83128
public SketchTextArea(RSyntaxDocument document, PdeKeywords pdeKeywords) throws IOException {
84129
super(document);
@@ -91,6 +136,22 @@ public void setKeywords(PdeKeywords keywords) {
91136
pdeKeywords = keywords;
92137
setLinkGenerator(new DocLinkGenerator(pdeKeywords));
93138
}
139+
140+
public void setupAutoComplete(Sketch sketch, CompletionProvider provider) {
141+
142+
this.completionProvider = new SketchCompletionProvider(sketch, this, provider);
143+
144+
AutoCompletion ac = new AutoCompletion( this.completionProvider);
145+
146+
ac.setAutoActivationEnabled(true);
147+
ac.setShowDescWindow(false);
148+
ac.setAutoCompleteSingleChoices(true);
149+
ac.setParameterAssistanceEnabled(true);
150+
// ac.setParamChoicesRenderer(new CompletionsRenderer());
151+
// ac.setListCellRenderer(new CompletionsRenderer());
152+
ac.install(this);
153+
154+
}
94155

95156
private void installFeatures() throws IOException {
96157
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.