jsyntaxpane.actions.CompleteWordAction Maven / Gradle / Ivy
/*
* Copyright 2008 Ayman Al-Sairafi [email protected]
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License
* at http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package jsyntaxpane.actions;
import java.awt.event.ActionEvent;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.text.JTextComponent;
import jsyntaxpane.SyntaxDocument;
import jsyntaxpane.Token;
import jsyntaxpane.actions.gui.ComboCompletionDialog;
import jsyntaxpane.util.StringUtils;
/**
* This action will try to complete the word at the cursor by
* looking for a matching word in this document that starts with
* the same letters.
*
* This makes use of the SyntaxDocument.getWordAt, which requires
* a Regexp Pattern. The Pattern should match any word regardless of
* the Tokens.
*
* This Regexp is configurable with {@code ACTION_NAME.WordsRegexp}.
* The default Regexp is \w+ (any word char)
*
* @author Ayman Al-Sairafi
*/
public class CompleteWordAction extends DefaultSyntaxAction {
public CompleteWordAction() {
super("COMPLETE_WORD");
}
@Override
public void actionPerformed(JTextComponent target, SyntaxDocument sdoc,
int dot, ActionEvent e) {
Token current = sdoc.getWordAt(dot, wordsPattern);
if (current == null) {
return;
}
String cw = current.getString(sdoc);
target.select(current.start, current.end());
sdoc.readLock();
List matches = new ArrayList();
Matcher m = sdoc.getMatcher(wordsPattern, 0, current.start);
addWords(m, cw, matches);
m = sdoc.getMatcher(wordsPattern, current.end(), sdoc.getLength() - current.end());
addWords(m, cw, matches);
sdoc.readUnlock();
if (matches.size() == 0) {
return;
}
if (matches.size() == 1) {
target.replaceSelection(matches.get(0));
return;
}
if (dlg == null) {
dlg = new ComboCompletionDialog(target);
}
dlg.displayFor(cw, matches);
}
public void setWordsRegexp(String value) {
wordsPattern = Pattern.compile(value);
}
/**
* Add words from the matcher m that match the word abbr to matches
* List
* @param m matcher instance, could be null, to iterate through
* @param abbr abbriviated word
* @param matches List of matches
*/
private void addWords(Matcher m, String abbr, List matches) {
while (m != null && m.find()) {
String word = m.group();
if (StringUtils.camelCaseMatch(word, abbr)) {
if (!matches.contains(word)) {
matches.add(word);
}
}
}
}
private ComboCompletionDialog dlg;
private Pattern wordsPattern = DEFAULT_WORDS_REGEXP;
private static final Pattern DEFAULT_WORDS_REGEXP = Pattern.compile("\\w+");
}
© 2015 - 2024 Weber Informatics LLC | Privacy Policy