Skip to content

Commit

Permalink
Base implementation of autocomplete #849
Browse files Browse the repository at this point in the history
  • Loading branch information
ricardojlrufino authored and facchinm committed May 30, 2018
1 parent f4ed232 commit b94a372
Show file tree
Hide file tree
Showing 10 changed files with 204 additions and 1 deletion.
3 changes: 2 additions & 1 deletion app/.classpath
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
<classpathentry kind="src" path="test"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
<classpathentry combineaccessrules="false" kind="src" path="/arduino-core"/>
<classpathentry kind="output" path="bin"/>
<classpathentry kind="lib" path="lib/apple.jar"/>
<classpathentry kind="lib" path="lib/batik-1.8.jar"/>
<classpathentry kind="lib" path="lib/batik-anim-1.8.jar"/>
Expand Down Expand Up @@ -44,6 +43,7 @@
<classpathentry kind="lib" path="lib/jsch-0.1.50.jar"/>
<classpathentry kind="lib" path="lib/jssc-2.8.0-arduino1.jar"/>
<classpathentry kind="lib" path="lib/rsyntaxtextarea-2.6.1.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"/>
Expand All @@ -53,4 +53,5 @@
<classpathentry kind="lib" path="test-lib/fest-swing-1.2.jar"/>
<classpathentry kind="lib" path="test-lib/fest-util-1.1.2.jar"/>
<classpathentry kind="lib" path="test-lib/jcip-annotations-1.0.jar"/>
<classpathentry kind="output" path="bin"/>
</classpath>
Binary file added app/lib/autocomplete-2.6.1.jar
Binary file not shown.
44 changes: 44 additions & 0 deletions app/src/cc/arduino/autocomplete/CompletionContext.java
Original file line number Diff line number Diff line change
@@ -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 changes: 11 additions & 0 deletions app/src/cc/arduino/autocomplete/CompletionProvider.java
Original file line number Diff line number Diff line change
@@ -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 changes: 22 additions & 0 deletions app/src/cc/arduino/autocomplete/FakeCompletionProvider.java
Original file line number Diff line number Diff line change
@@ -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;
}


}
Original file line number Diff line number Diff line change
@@ -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 */;
}

}
Original file line number Diff line number Diff line change
@@ -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('(', ", ", ')');

}



}
2 changes: 2 additions & 0 deletions app/src/processing/app/EditorTab.java
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@
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;
Expand Down Expand Up @@ -120,6 +121,7 @@ public EditorTab(Editor editor, SketchFile file, String contents)
applyPreferences();
add(scrollPane, BorderLayout.CENTER);
textarea.addMouseWheelListener(this);
textarea.setupAutoComplete(file.getSketch(), new FakeCompletionProvider());
}

private RSyntaxDocument createDocument(String contents) {
Expand Down
50 changes: 50 additions & 0 deletions app/src/processing/app/syntax/SketchTextArea.java
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,10 @@

package processing.app.syntax;

import java.awt.Color;
import java.awt.Cursor;
import java.awt.Font;
import java.awt.Insets;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
Expand Down Expand Up @@ -66,6 +70,34 @@
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;

/**
Expand All @@ -79,6 +111,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);
Expand All @@ -91,6 +125,22 @@ public void setKeywords(PdeKeywords keywords) {
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"));
Expand Down
4 changes: 4 additions & 0 deletions arduino-core/src/processing/app/SketchFile.java
Original file line number Diff line number Diff line change
Expand Up @@ -246,6 +246,10 @@ public boolean isModified() {
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
Expand Down

0 comments on commit b94a372

Please sign in to comment.