diff --git a/factor/ExternalFactor.java b/factor/ExternalFactor.java
index daee80bf60..2a09a539c1 100644
--- a/factor/ExternalFactor.java
+++ b/factor/ExternalFactor.java
@@ -252,13 +252,16 @@ public class ExternalFactor extends DefaultVocabularyLookup
/* We can't send words across the socket at this point in
human history, because of USE: issues. so we send name/vocab
pairs. */
- Cons moreCompletions = (Cons)parseObject(eval(
+
+ String result = eval(
FactorReader.unparseObject(word)
+ " "
+ FactorReader.unparseObject(Boolean.valueOf(anywhere))
+ " "
+ FactorReader.unparseObject(use)
- + " completions .")).car;
+ + " completions .");
+
+ Cons moreCompletions = (Cons)parseObject(result).car;
while(moreCompletions != null)
{
diff --git a/factor/jedit/AbstractCompletion.java b/factor/jedit/AbstractCompletion.java
index bf5eeaea39..91a53223bd 100644
--- a/factor/jedit/AbstractCompletion.java
+++ b/factor/jedit/AbstractCompletion.java
@@ -43,12 +43,10 @@ public abstract class AbstractCompletion extends SideKickCompletion
protected FactorParsedData data;
//{{{ AbstractCompletion constructor
- public AbstractCompletion(View view, Object[] items,
- FactorParsedData data)
+ public AbstractCompletion(View view, FactorParsedData data)
{
this.view = view;
textArea = view.getTextArea();
- this.items = Arrays.asList(items);
this.data = data;
} //}}}
@@ -58,6 +56,16 @@ public abstract class AbstractCompletion extends SideKickCompletion
return MiscUtilities.getLongestPrefix(items,false);
} //}}}
+ //{{{ updateInPlace() method
+ /**
+ * @return If this returns false, then we create a new completion
+ * object after user input.
+ */
+ public boolean updateInPlace(EditPane editPane, int caret)
+ {
+ return false;
+ } //}}}
+
//{{{ handleKeystroke() method
public boolean handleKeystroke(int selectedIndex, char keyChar)
{
diff --git a/factor/jedit/FactorPlugin.props b/factor/jedit/FactorPlugin.props
index ef7d095892..0e1fd16609 100644
--- a/factor/jedit/FactorPlugin.props
+++ b/factor/jedit/FactorPlugin.props
@@ -2,7 +2,7 @@
plugin.factor.jedit.FactorPlugin.activate=startup
plugin.factor.jedit.FactorPlugin.name=Factor
-plugin.factor.jedit.FactorPlugin.version=0.73
+plugin.factor.jedit.FactorPlugin.version=0.74
plugin.factor.jedit.FactorPlugin.author=Slava Pestov
plugin.factor.jedit.FactorPlugin.docs=/doc/jedit/index.html
@@ -57,11 +57,11 @@ factor-restart.label=Restart Factor
sidekick.parser.factor.label=Factor
mode.factor.sidekick.parser=factor
-factor.completion.in=IN: {0}\
-factor.completion.def={0} {1}
+factor.completion.in=IN: {0}\
+factor.completion.def={0} {1}
factor.completion.stack={0} ( {1})
-factor.completion.method=M: {0} {1}
-factor.completion.constructor=C: {0}
+factor.completion.method=M: {0} {1}
+factor.completion.constructor=C: {0}
# Dialog boxes
factor.status.inserted-use=Using {0}
diff --git a/factor/jedit/FactorSideKickParser.java b/factor/jedit/FactorSideKickParser.java
index 0a9f4e8833..39b7cd1c32 100644
--- a/factor/jedit/FactorSideKickParser.java
+++ b/factor/jedit/FactorSideKickParser.java
@@ -214,7 +214,7 @@ public class FactorSideKickParser extends SideKickParser
} //}}}
//{{{ isWhitespace() method
- private boolean isWhitespace(char ch)
+ private static boolean isWhitespace(char ch)
{
return (ReadTable.DEFAULT_READTABLE.getCharacterType(ch)
== ReadTable.WHITESPACE);
@@ -233,6 +233,28 @@ public class FactorSideKickParser extends SideKickParser
return false;
} //}}}
+ //{{{ getCompletionWord() method
+ public static String getCompletionWord(EditPane editPane, int caret)
+ {
+ Buffer buffer = editPane.getBuffer();
+ int caretLine = buffer.getLineOfOffset(caret);
+ int lineStart = buffer.getLineStartOffset(caretLine);
+ String text = buffer.getText(lineStart,caret - lineStart);
+
+ int wordStart = 0;
+ for(int i = text.length() - 1; i >= 0; i--)
+ {
+ char ch = text.charAt(i);
+ if(isWhitespace(ch))
+ {
+ wordStart = i + 1;
+ break;
+ }
+ }
+
+ return text.substring(wordStart);
+ } //}}}
+
//{{{ complete() method
/**
* Returns completions suitable for insertion at the specified position.
@@ -255,74 +277,17 @@ public class FactorSideKickParser extends SideKickParser
if(ruleset == null)
return null;
- Buffer buffer = editPane.getBuffer();
-
- // first, we get the word before the caret
- int caretLine = buffer.getLineOfOffset(caret);
- int lineStart = buffer.getLineStartOffset(caretLine);
- String text = buffer.getText(lineStart,caret - lineStart);
-
- /* Don't complete in the middle of a word */
- /* int lineEnd = buffer.getLineEndOffset(caretLine) - 1;
- if(caret != lineEnd)
- {
- String end = buffer.getText(caret,lineEnd - caret);
- if(!isWhitespace(end.charAt(0)))
- return null;
- } */
-
- int wordStart = 0;
- for(int i = text.length() - 1; i >= 0; i--)
- {
- char ch = text.charAt(i);
- if(isWhitespace(ch))
- {
- wordStart = i + 1;
- break;
- }
- }
-
- String word = text.substring(wordStart);
+ String word = getCompletionWord(editPane,caret);
/* Don't complete empty string */
if(word.length() == 0)
return null;
+ View view = editPane.getView();
+
if(ruleset.equals("factor::USING"))
- return vocabComplete(editPane,data,word,caret);
+ return new FactorVocabCompletion(view,word,data);
else
- return wordComplete(editPane,data,word,caret);
- } //}}}
-
- //{{{ vocabComplete() method
- private SideKickCompletion vocabComplete(EditPane editPane,
- FactorParsedData data, String vocab, int caret)
- {
- String[] completions = FactorPlugin.getVocabCompletions(
- vocab,false);
-
- if(completions.length == 0)
- return null;
- else
- {
- return new FactorVocabCompletion(editPane.getView(),
- completions,vocab,data);
- }
- } //}}}
-
- //{{{ wordComplete() method
- private SideKickCompletion wordComplete(EditPane editPane,
- FactorParsedData data, String word, int caret)
- {
- FactorWord[] completions = FactorPlugin.toWordArray(
- FactorPlugin.getWordCompletions(word,false));
-
- if(completions.length == 0)
- return null;
- else
- {
- return new FactorWordCompletion(editPane.getView(),
- completions,word,data);
- }
+ return new FactorWordCompletion(view,word,data);
} //}}}
}
diff --git a/factor/jedit/FactorVocabCompletion.java b/factor/jedit/FactorVocabCompletion.java
index 6ea308c0f7..e50d23574f 100644
--- a/factor/jedit/FactorVocabCompletion.java
+++ b/factor/jedit/FactorVocabCompletion.java
@@ -41,10 +41,12 @@ public class FactorVocabCompletion extends AbstractCompletion
private String vocab;
//{{{ FactorVocabCompletion constructor
- public FactorVocabCompletion(View view, String[] items,
- String vocab, FactorParsedData data)
+ public FactorVocabCompletion(View view, String vocab, FactorParsedData data)
{
- super(view,items,data);
+ super(view,data);
+ String[] completions = FactorPlugin.getVocabCompletions(
+ vocab,false);
+ this.items = Arrays.asList(completions);
this.vocab = vocab;
} //}}}
@@ -87,9 +89,4 @@ public class FactorVocabCompletion extends AbstractCompletion
return true;
}
}
-
- public ListCellRenderer getRenderer()
- {
- return new DefaultListCellRenderer();
- }
}
diff --git a/factor/jedit/FactorWordCompletion.java b/factor/jedit/FactorWordCompletion.java
index d6f1e12ec4..0e4c9a7861 100644
--- a/factor/jedit/FactorWordCompletion.java
+++ b/factor/jedit/FactorWordCompletion.java
@@ -41,13 +41,39 @@ public class FactorWordCompletion extends AbstractCompletion
private String word;
//{{{ FactorWordCompletion constructor
- public FactorWordCompletion(View view, FactorWord[] items,
- String word, FactorParsedData data)
+ public FactorWordCompletion(View view, String word, FactorParsedData data)
{
- super(view,items,data);
+ super(view,data);
+
+ FactorWord[] completions = FactorPlugin.toWordArray(
+ FactorPlugin.getWordCompletions(word,false));
+
+ this.items = Arrays.asList(completions);
this.word = word;
} //}}}
+ /**
+ * @return If this returns false, then we create a new completion
+ * object after user input.
+ */
+ public boolean updateInPlace(EditPane editPane, int caret)
+ {
+ String word = FactorSideKickParser.getCompletionWord(editPane,caret);
+
+ List newItems = new ArrayList();
+ Iterator iter = items.iterator();
+ while(iter.hasNext())
+ {
+ FactorWord w = (FactorWord)iter.next();
+ if(w.name.startsWith(word))
+ newItems.add(w);
+ }
+
+ items = newItems;
+
+ return true;
+ }
+
public void insert(int index)
{
FactorWord selected = ((FactorWord)get(index));
@@ -58,7 +84,6 @@ public class FactorWordCompletion extends AbstractCompletion
try
{
buffer.beginCompoundEdit();
-
textArea.setSelectedText(insert);
if(!FactorPlugin.isUsed(view,selected.vocabulary))
FactorPlugin.insertUse(view,selected.vocabulary);
diff --git a/factor/jedit/FactorWordRenderer.java b/factor/jedit/FactorWordRenderer.java
index 948ca27cb0..5770fec3fe 100644
--- a/factor/jedit/FactorWordRenderer.java
+++ b/factor/jedit/FactorWordRenderer.java
@@ -39,33 +39,24 @@ public class FactorWordRenderer extends DefaultListCellRenderer
//{{{ getWordHTMLString() method
public static String getWordHTMLString(FactorWord word, boolean showIn)
{
- String defStr = jEdit.getProperty(
- "factor.completion.def",
- new String[] {
- MiscUtilities.charsToEntities(word.getDefiner().name),
- MiscUtilities.charsToEntities(word.name)
- });
+ String str = jEdit.getProperty("factor.completion.def",
+ new String[] { word.getDefiner().name,word.name });
- String in;
if(showIn)
{
- in = jEdit.getProperty("factor.completion.in",
+ str = jEdit.getProperty("factor.completion.in",
new Object[] {
MiscUtilities.charsToEntities(word.vocabulary)
- });
+ }) + str;
}
- else
- in = "";
-
- String html = "" + in + defStr;
if(word.stackEffect != null)
{
- html = jEdit.getProperty("factor.completion.stack",
- new String[] { html, word.stackEffect });
+ str = jEdit.getProperty("factor.completion.stack",
+ new String[] { str, word.stackEffect });
}
- return html;
+ return str;
} //}}}
private FactorSideKickParser parser;