mirror of
https://github.com/JFormDesigner/FlatLaf.git
synced 2025-12-08 06:50:56 +03:00
Theme Editor: auto-completion for keys improved:
- now also contains variables and keys defined in current and base themes - appended " = " - removes some unsupported keys (fonts and input maps)
This commit is contained in:
@@ -21,10 +21,13 @@ import java.io.BufferedReader;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.io.InputStreamReader;
|
import java.io.InputStreamReader;
|
||||||
|
import java.io.StringReader;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.Properties;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import javax.swing.text.BadLocationException;
|
import javax.swing.text.BadLocationException;
|
||||||
import javax.swing.text.JTextComponent;
|
import javax.swing.text.JTextComponent;
|
||||||
@@ -157,6 +160,9 @@ class FlatCompletionProvider
|
|||||||
{
|
{
|
||||||
private static KeyCompletionProvider instance;
|
private static KeyCompletionProvider instance;
|
||||||
|
|
||||||
|
private final Set<String> knownKeys;
|
||||||
|
private Set<String> lastKeys;
|
||||||
|
|
||||||
static KeyCompletionProvider getInstance() {
|
static KeyCompletionProvider getInstance() {
|
||||||
if( instance == null )
|
if( instance == null )
|
||||||
instance = new KeyCompletionProvider();
|
instance = new KeyCompletionProvider();
|
||||||
@@ -164,17 +170,17 @@ class FlatCompletionProvider
|
|||||||
}
|
}
|
||||||
|
|
||||||
KeyCompletionProvider() {
|
KeyCompletionProvider() {
|
||||||
setAutoActivationRules( true, "." );
|
setAutoActivationRules( true, "@." );
|
||||||
|
|
||||||
// load all keys
|
knownKeys = new HashSet<>();
|
||||||
HashSet<String> keys = new HashSet<>();
|
|
||||||
try {
|
try {
|
||||||
try( InputStream in = getClass().getResourceAsStream( "/com/formdev/flatlaf/themeeditor/FlatLafUIKeys.txt" ) ) {
|
try( InputStream in = getClass().getResourceAsStream( "/com/formdev/flatlaf/themeeditor/FlatLafUIKeys.txt" ) ) {
|
||||||
if( in != null ) {
|
if( in != null ) {
|
||||||
try( BufferedReader reader = new BufferedReader( new InputStreamReader( in, "UTF-8" ) ) ) {
|
try( BufferedReader reader = new BufferedReader( new InputStreamReader( in, "UTF-8" ) ) ) {
|
||||||
String key;
|
String key;
|
||||||
while( (key = reader.readLine()) != null ) {
|
while( (key = reader.readLine()) != null ) {
|
||||||
keys.add( key );
|
if( !isIgnored( key ) )
|
||||||
|
knownKeys.add( key );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -183,27 +189,96 @@ class FlatCompletionProvider
|
|||||||
ex.printStackTrace(); // TODO
|
ex.printStackTrace(); // TODO
|
||||||
}
|
}
|
||||||
|
|
||||||
// collect key parts
|
setCompletions( knownKeys );
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isIgnored( String key ) {
|
||||||
|
return key.endsWith( ".font" ) ||
|
||||||
|
key.endsWith( "Font" ) ||
|
||||||
|
key.endsWith( "InputMap" );
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setCompletions( Set<String> keys ) {
|
||||||
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 )
|
||||||
String part = key.substring( 0, delimIndex );
|
keyParts.add( key.substring( 0, delimIndex ) );
|
||||||
if( !keys.contains( part ) )
|
|
||||||
keyParts.add( part );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
completions.clear();
|
||||||
|
|
||||||
// add key parts
|
// add key parts
|
||||||
addWordCompletions( keyParts.toArray( new String[keyParts.size()] ) );
|
for( String key : keyParts )
|
||||||
|
completions.add( new BasicCompletion( this, key ) );
|
||||||
|
|
||||||
// add all keys
|
// add all keys
|
||||||
addWordCompletions( keys.toArray( new String[keys.size()] ) );
|
for( String key : keys ) {
|
||||||
|
if( !keyParts.contains( key ) )
|
||||||
|
completions.add( new BasicCompletion( this, key.concat( " = " ) ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
Collections.sort( completions );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected boolean isValidChar( char ch ) {
|
protected boolean isValidChar( char ch ) {
|
||||||
return super.isValidChar( ch ) || ch == '.';
|
return super.isValidChar( ch ) || ch == '.' || ch == '@';
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected List<Completion> getCompletionsImpl( JTextComponent comp ) {
|
||||||
|
updateCompletions( comp );
|
||||||
|
return super.getCompletionsImpl( comp );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<Completion> getCompletionsAt( JTextComponent comp, Point pt ) {
|
||||||
|
updateCompletions( comp );
|
||||||
|
return super.getCompletionsAt( comp, pt );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<ParameterizedCompletion> getParameterizedCompletions( JTextComponent comp ) {
|
||||||
|
updateCompletions( comp );
|
||||||
|
return super.getParameterizedCompletions( comp );
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateCompletions( JTextComponent comp ) {
|
||||||
|
FlatSyntaxTextArea fsta = (FlatSyntaxTextArea) comp;
|
||||||
|
Set<String> keys = fsta.propertiesSupport.getAllKeys();
|
||||||
|
if( Objects.equals( keys, lastKeys ) )
|
||||||
|
return;
|
||||||
|
lastKeys = keys;
|
||||||
|
|
||||||
|
// get key at current line
|
||||||
|
String keyAtCurrentLine = null;
|
||||||
|
try {
|
||||||
|
int caretPosition = fsta.getCaretPosition();
|
||||||
|
int currentLine = fsta.getLineOfOffset( caretPosition );
|
||||||
|
int lineStart = fsta.getLineStartOffset( currentLine );
|
||||||
|
int lineEnd = fsta.getLineEndOffset( currentLine );
|
||||||
|
String line = fsta.getText( lineStart, lineEnd - lineStart );
|
||||||
|
Properties properties = new Properties();
|
||||||
|
properties.load( new StringReader( line ) );
|
||||||
|
if( !properties.isEmpty() )
|
||||||
|
keyAtCurrentLine = (String) properties.keys().nextElement();
|
||||||
|
} catch( BadLocationException | IOException ex ) {
|
||||||
|
ex.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
Set<String> completionKeys = new HashSet<>( knownKeys );
|
||||||
|
for( String key : keys ) {
|
||||||
|
if( key.startsWith( "*." ) || key.startsWith( "[" ) )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// ignore key at current line
|
||||||
|
if( key.equals( keyAtCurrentLine ) )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
completionKeys.add( key );
|
||||||
|
}
|
||||||
|
setCompletions( completionKeys );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -280,8 +355,9 @@ class FlatCompletionProvider
|
|||||||
private void updateCompletions( JTextComponent comp ) {
|
private void updateCompletions( JTextComponent comp ) {
|
||||||
FlatSyntaxTextArea fsta = (FlatSyntaxTextArea) comp;
|
FlatSyntaxTextArea fsta = (FlatSyntaxTextArea) comp;
|
||||||
Set<String> keys = fsta.propertiesSupport.getAllKeys();
|
Set<String> keys = fsta.propertiesSupport.getAllKeys();
|
||||||
if( keys == lastKeys )
|
if( Objects.equals( keys, lastKeys ) )
|
||||||
return;
|
return;
|
||||||
|
lastKeys = keys;
|
||||||
|
|
||||||
completions.clear();
|
completions.clear();
|
||||||
for( String key : keys ) {
|
for( String key : keys ) {
|
||||||
@@ -296,7 +372,7 @@ class FlatCompletionProvider
|
|||||||
completion.setRelevance( 1 );
|
completion.setRelevance( 1 );
|
||||||
completions.add( completion );
|
completions.add( completion );
|
||||||
}
|
}
|
||||||
Collections.sort(completions);
|
Collections.sort( completions );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user