Theme Editor:

- auto-activate key completion on any letter
- special completion provider for references
This commit is contained in:
Karl Tauber
2020-07-08 19:15:52 +02:00
parent 990da2b412
commit c404a0d1a9

View File

@@ -42,6 +42,7 @@ class FlatCompletionProvider
extends CompletionProviderBase
{
private KeyCompletionProvider keyProvider;
private ReferenceCompletionProvider referenceProvider;
private ValueCompletionProvider valueProvider;
FlatCompletionProvider() {
@@ -72,18 +73,9 @@ class FlatCompletionProvider
}
@Override
public boolean isAutoActivateOkay( JTextComponent tc ) {
int caretPosition = tc.getCaretPosition();
if( caretPosition <= 0 )
return false;
try {
char ch = tc.getText( caretPosition - 1, 1 ).charAt( 0 );
return ch == '$';
} catch( BadLocationException | IndexOutOfBoundsException ex ) {
// ignore
return false;
}
public boolean isAutoActivateOkay( JTextComponent comp ) {
CompletionProvider provider = getProviderFor( comp );
return (provider != null) ? provider.isAutoActivateOkay( comp ) : null;
}
private CompletionProvider getProviderFor( JTextComponent comp ) {
@@ -117,7 +109,7 @@ class FlatCompletionProvider
return getValueProvider();
case '$':
return getKeyProvider();
return getReferenceProvider();
case ' ':
case '\t':
@@ -134,30 +126,36 @@ class FlatCompletionProvider
private CompletionProvider getKeyProvider() {
if( keyProvider == null )
keyProvider = KeyCompletionProvider.getInstance();
keyProvider = new KeyCompletionProvider();
return keyProvider;
}
private CompletionProvider getReferenceProvider() {
if( referenceProvider == null )
referenceProvider = new ReferenceCompletionProvider();
return referenceProvider;
}
private CompletionProvider getValueProvider() {
if( valueProvider == null )
valueProvider = new ValueCompletionProvider();
return valueProvider;
}
//---- class KeyCompletionProvider ----------------------------------------
//---- class KnownKeysCompletionProvider ----------------------------------
private static class KeyCompletionProvider
private static final class KnownKeysCompletionProvider
extends DefaultCompletionProvider
{
private static KeyCompletionProvider instance;
private static KnownKeysCompletionProvider instance;
static KeyCompletionProvider getInstance() {
static KnownKeysCompletionProvider getInstance() {
if( instance == null )
instance = new KeyCompletionProvider();
instance = new KnownKeysCompletionProvider();
return instance;
}
KeyCompletionProvider() {
KnownKeysCompletionProvider() {
// load all keys
HashSet<String> keys = new HashSet<>();
try {
@@ -179,8 +177,11 @@ class FlatCompletionProvider
HashSet<String> keyParts = new HashSet<>();
for( String key : keys ) {
int delimIndex = key.length() + 1;
while( (delimIndex = key.lastIndexOf( '.', delimIndex - 1 )) >= 0 )
keyParts.add( key.substring( 0, delimIndex + 1 ) );
while( (delimIndex = key.lastIndexOf( '.', delimIndex - 1 )) >= 0 ) {
String part = key.substring( 0, delimIndex );
if( !keys.contains( part ) )
keyParts.add( part );
}
}
// add key parts
@@ -196,6 +197,51 @@ class FlatCompletionProvider
}
}
//---- class KeyCompletionProvider ----------------------------------------
private static class KeyCompletionProvider
extends DefaultCompletionProvider
{
KeyCompletionProvider() {
setParent( KnownKeysCompletionProvider.getInstance() );
}
@Override
protected boolean isValidChar( char ch ) {
return super.isValidChar( ch ) || ch == '.';
}
@Override
public boolean isAutoActivateOkay( JTextComponent comp ) {
int caretPosition = comp.getCaretPosition();
if( caretPosition <= 0 )
return false;
try {
char ch = comp.getText( caretPosition - 1, 1 ).charAt( 0 );
return isAutoActivateOkay( ch );
} catch( BadLocationException | IndexOutOfBoundsException ex ) {
// ignore
return false;
}
}
protected boolean isAutoActivateOkay( char ch ) {
return Character.isLetter( ch ) || ch == '.';
}
}
//---- class ReferenceCompletionProvider ----------------------------------
private static class ReferenceCompletionProvider
extends KeyCompletionProvider
{
@Override
protected boolean isAutoActivateOkay( char ch ) {
return ch == '$' || super.isAutoActivateOkay( ch );
}
}
//---- class ValueCompletionProvider --------------------------------------
private static class ValueCompletionProvider
@@ -254,5 +300,10 @@ class FlatCompletionProvider
f.setParams( params );
addCompletion( f );
}
@Override
public boolean isAutoActivateOkay( JTextComponent tc ) {
return false;
}
}
}