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