/*
* Copyright 2013 Guidewire Software, Inc.
*/
package gw.plugin.ij.actions;
import com.google.common.base.Strings;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
import javax.swing.text.PlainDocument;
public class IdentifierTextField extends JTextField {
private final boolean _bAcceptDot;
private final boolean _bAcceptUnderscore;
public IdentifierTextField() {
this(false, true);
}
public IdentifierTextField(boolean bAcceptDot) {
this(bAcceptDot, true);
}
public IdentifierTextField(boolean bAcceptDot, boolean bAcceptUnderscore) {
_bAcceptDot = bAcceptDot;
_bAcceptUnderscore = bAcceptUnderscore;
}
@NotNull
@Override
protected Document createDefaultModel() {
return new IdentifierDocument();
}
private class IdentifierDocument extends PlainDocument {
@Override
public void insertString(int iOffset, String str, AttributeSet a) throws BadLocationException {
if (Strings.isNullOrEmpty(str)) {
return;
}
String strText = IdentifierTextField.this.getText();
StringBuilder strbText = new StringBuilder(Strings.nullToEmpty(strText));
if (iOffset <= strbText.length()) {
strbText.insert(iOffset, str);
} else {
strbText.append(str);
}
if (!isValidIdentifier(strbText, _bAcceptDot) || strbText.toString().contains("$")) {
String validID = makeValidIdentifier(strbText.toString(), _bAcceptDot, _bAcceptUnderscore);
if (!_bAcceptUnderscore) {
validID = validID.replace("$", "");
}
str = validID.substring(iOffset, iOffset + (validID.length() - strText.length()));
}
super.insertString(iOffset, str, a);
}
}
public static boolean isValidIdentifier(@NotNull CharSequence seqId, boolean acceptDot) {
if (seqId.length() == 0 || !Character.isJavaIdentifierStart(seqId.charAt(0))) {
return false;
}
for (int i = 1, iLen = seqId.length(); i < iLen; i++) {
if (acceptDot && (seqId.charAt(i) == '.' || seqId.charAt(i) == '#')) {
continue;
}
if (!Character.isJavaIdentifierPart(seqId.charAt(i))) {
return false;
}
}
return true;
}
public static String makeValidIdentifier(String str, boolean acceptDot, boolean bAcceptUnderscore) {
StringBuilder rtn = new StringBuilder(str);
while (rtn.length() > 0 && (!Character.isJavaIdentifierStart(rtn.charAt(0)) || (!bAcceptUnderscore && rtn.charAt(0) == '_'))) {
rtn.deleteCharAt(0);
}
for (int i = 1; i < rtn.length(); ) {
char c = rtn.charAt(i);
if (acceptDot && (c == '.' || c == '#')) {
i++;
continue;
}
if (!Character.isJavaIdentifierPart(c) || (!bAcceptUnderscore && c == '_')) {
rtn.deleteCharAt(i);
continue;
}
i++;
}
return rtn.toString();
}
}