1
0
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:
ricardo.jl.rufino@gmail.com 2017-04-29 12:09:41 -03:00 committed by Martino Facchin
parent 831c9bba2a
commit c84fd1a398
10 changed files with 214 additions and 0 deletions

View File

@ -42,6 +42,7 @@
<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/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-ext-1.3.04.jar"/>
<classpathentry kind="lib" path="lib/xmlgraphics-commons-2.0.jar"/>

BIN
app/lib/autocomplete-2.6.1.jar Executable file

Binary file not shown.

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

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

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

View 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 */;
}
}

View 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('(', ", ", ')');
}
}

View File

@ -65,6 +65,7 @@ import org.fife.ui.rtextarea.Gutter;
import org.fife.ui.rtextarea.RTextScrollPane;
import cc.arduino.UpdatableBoardsLibsFakeURLsHandler;
import cc.arduino.autocomplete.FakeCompletionProvider;
import processing.app.helpers.DocumentTextChangeListener;
import processing.app.syntax.ArduinoTokenMakerFactory;
import processing.app.syntax.PdeKeywords;
@ -119,6 +120,7 @@ public class EditorTab extends JPanel implements SketchFile.TextStorage {
applyPreferences();
add(scrollPane, BorderLayout.CENTER);
editor.base.addEditorFontResizeMouseWheelListener(textarea);
textarea.setupAutoComplete(file.getSketch(), new FakeCompletionProvider());
}
private RSyntaxDocument createDocument(String contents) {

View File

@ -66,6 +66,49 @@ import org.fife.ui.rtextarea.RTextAreaUI;
import processing.app.Base;
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;
/**
@ -79,6 +122,8 @@ public class SketchTextArea extends RSyntaxTextArea {
private final static Logger LOG = Logger.getLogger(SketchTextArea.class.getName());
private PdeKeywords pdeKeywords;
private SketchCompletionProvider completionProvider;
public SketchTextArea(RSyntaxDocument document, PdeKeywords pdeKeywords) throws IOException {
super(document);
@ -91,6 +136,22 @@ public class SketchTextArea extends RSyntaxTextArea {
pdeKeywords = keywords;
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 {
setTheme(PreferencesData.get("editor.syntax_theme", "default"));

View File

@ -246,6 +246,10 @@ public class SketchFile {
public boolean equals(Object o) {
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