diff --git a/flatlaf-theme-editor/src/main/java/com/formdev/flatlaf/themeeditor/FlatCompletionProvider.java b/flatlaf-theme-editor/src/main/java/com/formdev/flatlaf/themeeditor/FlatCompletionProvider.java index 5b28894a..e976032a 100644 --- a/flatlaf-theme-editor/src/main/java/com/formdev/flatlaf/themeeditor/FlatCompletionProvider.java +++ b/flatlaf-theme-editor/src/main/java/com/formdev/flatlaf/themeeditor/FlatCompletionProvider.java @@ -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 keys = new HashSet<>(); try { @@ -179,8 +177,11 @@ class FlatCompletionProvider HashSet 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; + } } }