mirror of
https://github.com/arduino/Arduino.git
synced 2025-02-26 20:54:22 +01:00
Base implementation of autocomplete #849
This commit is contained in:
parent
831c9bba2a
commit
c84fd1a398
@ -42,6 +42,7 @@
|
|||||||
<classpathentry kind="lib" path="lib/log4j-core-2.12.0.jar"/>
|
<classpathentry kind="lib" path="lib/log4j-core-2.12.0.jar"/>
|
||||||
<classpathentry kind="lib" path="lib/jsch-0.1.50.jar"/>
|
<classpathentry kind="lib" path="lib/jsch-0.1.50.jar"/>
|
||||||
<classpathentry kind="lib" path="lib/rsyntaxtextarea-3.0.3-SNAPSHOT.jar"/>
|
<classpathentry kind="lib" path="lib/rsyntaxtextarea-3.0.3-SNAPSHOT.jar"/>
|
||||||
|
<classpathentry kind="lib" path="lib/autocomplete-2.6.1.jar" sourcepath="/media/ricardo/Dados/Workspace/Arduino/arduino-dep/AutoComplete-2.6.1"/>
|
||||||
<classpathentry kind="lib" path="lib/xml-apis-1.3.04.jar"/>
|
<classpathentry kind="lib" path="lib/xml-apis-1.3.04.jar"/>
|
||||||
<classpathentry kind="lib" path="lib/xml-apis-ext-1.3.04.jar"/>
|
<classpathentry kind="lib" path="lib/xml-apis-ext-1.3.04.jar"/>
|
||||||
<classpathentry kind="lib" path="lib/xmlgraphics-commons-2.0.jar"/>
|
<classpathentry kind="lib" path="lib/xmlgraphics-commons-2.0.jar"/>
|
||||||
|
BIN
app/lib/autocomplete-2.6.1.jar
Executable file
BIN
app/lib/autocomplete-2.6.1.jar
Executable file
Binary file not shown.
44
app/src/cc/arduino/autocomplete/CompletionContext.java
Executable file
44
app/src/cc/arduino/autocomplete/CompletionContext.java
Executable file
@ -0,0 +1,44 @@
|
|||||||
|
package cc.arduino.autocomplete;
|
||||||
|
|
||||||
|
import org.fife.ui.autocomplete.CompletionProvider;
|
||||||
|
|
||||||
|
import processing.app.Sketch;
|
||||||
|
import processing.app.syntax.SketchTextArea;
|
||||||
|
|
||||||
|
public class CompletionContext {
|
||||||
|
|
||||||
|
private Sketch sketch;
|
||||||
|
|
||||||
|
private SketchTextArea textArea;
|
||||||
|
|
||||||
|
private CompletionProvider delegate; // of: AutoComplete/RSyntaxTextArea
|
||||||
|
|
||||||
|
public CompletionContext(Sketch sketch, SketchTextArea textArea,CompletionProvider delegate) {
|
||||||
|
this.sketch = sketch;
|
||||||
|
this.textArea = textArea;
|
||||||
|
this.delegate = delegate;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public String getAlreadyEnteredText() {
|
||||||
|
return delegate.getAlreadyEnteredText(textArea);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getLineNumber() {
|
||||||
|
return textArea.getCaretLineNumber();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public Sketch getSketch() {
|
||||||
|
return sketch;
|
||||||
|
}
|
||||||
|
|
||||||
|
public SketchTextArea getTextArea() {
|
||||||
|
return textArea;
|
||||||
|
}
|
||||||
|
|
||||||
|
public CompletionProvider getDelegate() {
|
||||||
|
return delegate;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
11
app/src/cc/arduino/autocomplete/CompletionProvider.java
Executable file
11
app/src/cc/arduino/autocomplete/CompletionProvider.java
Executable file
@ -0,0 +1,11 @@
|
|||||||
|
package cc.arduino.autocomplete;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.fife.ui.autocomplete.Completion;
|
||||||
|
|
||||||
|
public interface CompletionProvider {
|
||||||
|
|
||||||
|
List<Completion> getSuggestions(CompletionContext context);
|
||||||
|
|
||||||
|
}
|
22
app/src/cc/arduino/autocomplete/FakeCompletionProvider.java
Executable file
22
app/src/cc/arduino/autocomplete/FakeCompletionProvider.java
Executable file
@ -0,0 +1,22 @@
|
|||||||
|
package cc.arduino.autocomplete;
|
||||||
|
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.fife.ui.autocomplete.BasicCompletion;
|
||||||
|
import org.fife.ui.autocomplete.Completion;
|
||||||
|
|
||||||
|
public class FakeCompletionProvider implements CompletionProvider {
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<Completion> getSuggestions(CompletionContext context) {
|
||||||
|
List<Completion> list = new LinkedList<>();
|
||||||
|
list.add(new BasicCompletion(context.getDelegate(), "Text: " + context.getAlreadyEnteredText()));
|
||||||
|
list.add(new BasicCompletion(context.getDelegate(), "Line: " + context.getLineNumber()));
|
||||||
|
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
36
app/src/cc/arduino/autocomplete/rsyntax/CompletionProviderBridge.java
Executable file
36
app/src/cc/arduino/autocomplete/rsyntax/CompletionProviderBridge.java
Executable file
@ -0,0 +1,36 @@
|
|||||||
|
package cc.arduino.autocomplete.rsyntax;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import javax.swing.text.JTextComponent;
|
||||||
|
|
||||||
|
import org.fife.ui.autocomplete.Completion;
|
||||||
|
import org.fife.ui.autocomplete.DefaultCompletionProvider;
|
||||||
|
|
||||||
|
import cc.arduino.autocomplete.CompletionContext;
|
||||||
|
import cc.arduino.autocomplete.CompletionProvider;
|
||||||
|
|
||||||
|
public class CompletionProviderBridge extends DefaultCompletionProvider{
|
||||||
|
|
||||||
|
private CompletionProvider provider;
|
||||||
|
|
||||||
|
private CompletionContext context;
|
||||||
|
|
||||||
|
public CompletionProviderBridge(CompletionContext context, CompletionProvider provider) {
|
||||||
|
this.provider = provider;
|
||||||
|
this.context = context;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<Completion> getCompletionsImpl(JTextComponent comp) {
|
||||||
|
return provider.getSuggestions(context);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected boolean isValidChar(char ch) {
|
||||||
|
return super.isValidChar(ch) || '.' == ch || '>' == ch || '-' == ch || '<' == ch || '#' == ch || ':' == ch /**|| getParameterListStart() == ch */;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
33
app/src/cc/arduino/autocomplete/rsyntax/SketchCompletionProvider.java
Executable file
33
app/src/cc/arduino/autocomplete/rsyntax/SketchCompletionProvider.java
Executable file
@ -0,0 +1,33 @@
|
|||||||
|
package cc.arduino.autocomplete.rsyntax;
|
||||||
|
|
||||||
|
import org.fife.ui.autocomplete.LanguageAwareCompletionProvider;
|
||||||
|
|
||||||
|
import cc.arduino.autocomplete.CompletionContext;
|
||||||
|
import cc.arduino.autocomplete.CompletionProvider;
|
||||||
|
import processing.app.Sketch;
|
||||||
|
import processing.app.syntax.SketchTextArea;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* CompletionProvider for Arduino/CPP Language. <br/>
|
||||||
|
* Setup basic logic for completions using {@link LanguageAwareCompletionProvider}
|
||||||
|
* Filtering and decision will appear in the autocomplete dialog by implementations of: {@link CompletionProvider}. <br/>
|
||||||
|
*
|
||||||
|
* @author Ricardo JL Rufino (ricardo@criativasoft.com.br)
|
||||||
|
* @date 28/04/2017
|
||||||
|
*/
|
||||||
|
public class SketchCompletionProvider extends LanguageAwareCompletionProvider{
|
||||||
|
|
||||||
|
public SketchCompletionProvider(Sketch sketch, SketchTextArea textArea, CompletionProvider provider) {
|
||||||
|
|
||||||
|
CompletionContext context = new CompletionContext(sketch, textArea, this);
|
||||||
|
|
||||||
|
setDefaultCompletionProvider(new CompletionProviderBridge(context, provider));
|
||||||
|
// provider.setParameterChoicesProvider(new ParameterChoicesProvider(this));
|
||||||
|
// provider.setParameterizedCompletionParams('(', ", ", ')');
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -65,6 +65,7 @@ import org.fife.ui.rtextarea.Gutter;
|
|||||||
import org.fife.ui.rtextarea.RTextScrollPane;
|
import org.fife.ui.rtextarea.RTextScrollPane;
|
||||||
|
|
||||||
import cc.arduino.UpdatableBoardsLibsFakeURLsHandler;
|
import cc.arduino.UpdatableBoardsLibsFakeURLsHandler;
|
||||||
|
import cc.arduino.autocomplete.FakeCompletionProvider;
|
||||||
import processing.app.helpers.DocumentTextChangeListener;
|
import processing.app.helpers.DocumentTextChangeListener;
|
||||||
import processing.app.syntax.ArduinoTokenMakerFactory;
|
import processing.app.syntax.ArduinoTokenMakerFactory;
|
||||||
import processing.app.syntax.PdeKeywords;
|
import processing.app.syntax.PdeKeywords;
|
||||||
@ -119,6 +120,7 @@ public class EditorTab extends JPanel implements SketchFile.TextStorage {
|
|||||||
applyPreferences();
|
applyPreferences();
|
||||||
add(scrollPane, BorderLayout.CENTER);
|
add(scrollPane, BorderLayout.CENTER);
|
||||||
editor.base.addEditorFontResizeMouseWheelListener(textarea);
|
editor.base.addEditorFontResizeMouseWheelListener(textarea);
|
||||||
|
textarea.setupAutoComplete(file.getSketch(), new FakeCompletionProvider());
|
||||||
}
|
}
|
||||||
|
|
||||||
private RSyntaxDocument createDocument(String contents) {
|
private RSyntaxDocument createDocument(String contents) {
|
||||||
|
@ -66,6 +66,49 @@ import org.fife.ui.rtextarea.RTextAreaUI;
|
|||||||
|
|
||||||
import processing.app.Base;
|
import processing.app.Base;
|
||||||
import processing.app.PreferencesData;
|
import processing.app.PreferencesData;
|
||||||
|
|
||||||
|
import javax.swing.event.EventListenerList;
|
||||||
|
import javax.swing.event.HyperlinkEvent;
|
||||||
|
import javax.swing.event.HyperlinkListener;
|
||||||
|
import javax.swing.text.BadLocationException;
|
||||||
|
import javax.swing.text.Segment;
|
||||||
|
import java.awt.*;
|
||||||
|
import java.awt.event.MouseEvent;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.net.MalformedURLException;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
|
import javax.swing.KeyStroke;
|
||||||
|
import javax.swing.event.EventListenerList;
|
||||||
|
import javax.swing.event.HyperlinkEvent;
|
||||||
|
import javax.swing.event.HyperlinkListener;
|
||||||
|
import javax.swing.text.BadLocationException;
|
||||||
|
import javax.swing.text.Segment;
|
||||||
|
|
||||||
|
import org.apache.commons.compress.utils.IOUtils;
|
||||||
|
import org.fife.ui.autocomplete.AutoCompletion;
|
||||||
|
import org.fife.ui.rsyntaxtextarea.LinkGenerator;
|
||||||
|
import org.fife.ui.rsyntaxtextarea.LinkGeneratorResult;
|
||||||
|
import org.fife.ui.rsyntaxtextarea.RSyntaxDocument;
|
||||||
|
import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
|
||||||
|
import org.fife.ui.rsyntaxtextarea.Style;
|
||||||
|
import org.fife.ui.rsyntaxtextarea.Theme;
|
||||||
|
import org.fife.ui.rsyntaxtextarea.Token;
|
||||||
|
import org.fife.ui.rsyntaxtextarea.TokenImpl;
|
||||||
|
import org.fife.ui.rsyntaxtextarea.TokenTypes;
|
||||||
|
import org.fife.ui.rtextarea.RTextArea;
|
||||||
|
import org.fife.ui.rtextarea.RTextAreaUI;
|
||||||
|
|
||||||
|
import cc.arduino.autocomplete.CompletionProvider;
|
||||||
|
import cc.arduino.autocomplete.rsyntax.SketchCompletionProvider;
|
||||||
|
import processing.app.Base;
|
||||||
|
import processing.app.BaseNoGui;
|
||||||
|
import processing.app.PreferencesData;
|
||||||
|
import processing.app.Sketch;
|
||||||
import processing.app.helpers.OSUtils;
|
import processing.app.helpers.OSUtils;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -79,6 +122,8 @@ public class SketchTextArea extends RSyntaxTextArea {
|
|||||||
private final static Logger LOG = Logger.getLogger(SketchTextArea.class.getName());
|
private final static Logger LOG = Logger.getLogger(SketchTextArea.class.getName());
|
||||||
|
|
||||||
private PdeKeywords pdeKeywords;
|
private PdeKeywords pdeKeywords;
|
||||||
|
|
||||||
|
private SketchCompletionProvider completionProvider;
|
||||||
|
|
||||||
public SketchTextArea(RSyntaxDocument document, PdeKeywords pdeKeywords) throws IOException {
|
public SketchTextArea(RSyntaxDocument document, PdeKeywords pdeKeywords) throws IOException {
|
||||||
super(document);
|
super(document);
|
||||||
@ -91,6 +136,22 @@ public class SketchTextArea extends RSyntaxTextArea {
|
|||||||
pdeKeywords = keywords;
|
pdeKeywords = keywords;
|
||||||
setLinkGenerator(new DocLinkGenerator(pdeKeywords));
|
setLinkGenerator(new DocLinkGenerator(pdeKeywords));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setupAutoComplete(Sketch sketch, CompletionProvider provider) {
|
||||||
|
|
||||||
|
this.completionProvider = new SketchCompletionProvider(sketch, this, provider);
|
||||||
|
|
||||||
|
AutoCompletion ac = new AutoCompletion( this.completionProvider);
|
||||||
|
|
||||||
|
ac.setAutoActivationEnabled(true);
|
||||||
|
ac.setShowDescWindow(false);
|
||||||
|
ac.setAutoCompleteSingleChoices(true);
|
||||||
|
ac.setParameterAssistanceEnabled(true);
|
||||||
|
// ac.setParamChoicesRenderer(new CompletionsRenderer());
|
||||||
|
// ac.setListCellRenderer(new CompletionsRenderer());
|
||||||
|
ac.install(this);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
private void installFeatures() throws IOException {
|
private void installFeatures() throws IOException {
|
||||||
setTheme(PreferencesData.get("editor.syntax_theme", "default"));
|
setTheme(PreferencesData.get("editor.syntax_theme", "default"));
|
||||||
|
@ -246,6 +246,10 @@ public class SketchFile {
|
|||||||
public boolean equals(Object o) {
|
public boolean equals(Object o) {
|
||||||
return (o instanceof SketchFile) && file.equals(((SketchFile) o).file);
|
return (o instanceof SketchFile) && file.equals(((SketchFile) o).file);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Sketch getSketch() {
|
||||||
|
return sketch;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Load this piece of code from a file and return the contents. This
|
* Load this piece of code from a file and return the contents. This
|
||||||
|
Loading…
x
Reference in New Issue
Block a user