package com.codeaffine.extras.test.util;
import static java.util.stream.Collectors.toList;
import java.util.Collection;
import java.util.List;
import java.util.Objects;
import java.util.function.Predicate;
import com.codeaffine.eclipse.core.runtime.Extension;
import com.codeaffine.eclipse.core.runtime.RegistryAdapter;
public class KeyBindingInspector {
public static final String DEFAULT_SCHEME_ID = "org.eclipse.ui.defaultAcceleratorConfiguration";
private static final String BINDINGS_EP = "org.eclipse.ui.bindings";
private static final String SEQUENCE = "sequence";
private static final String PLATFORM = "platform";
private static final String SCHEME_ID = "schemeId";
private static final String COMMAND_ID = "commandId";
private static final String CONTEXT_ID = "contextId";
private static final String PARAMETER = "parameter";
private static final String ID = "id";
private static final String VALUE = "value";
public static KeyBindingInfo keyBindingFor( String keySequence ) {
return keyBindingFor( keySequence, null );
}
public static KeyBindingInfo keyBindingFor( String keySequence, String platform ) {
Extension extension = readKeyBindingExtension( keySequence, platform );
KeyBindingInfo result = null;
if( extension != null ) {
result = new KeyBindingInfo();
result.setSchemeId( extension.getAttribute( SCHEME_ID ) );
result.setCommandId( extension.getAttribute( COMMAND_ID ) );
result.setContextId( extension.getAttribute( CONTEXT_ID ) );
result.setPlatform( extension.getAttribute( PLATFORM ) );
result.setParameters( getParameters( extension ) );
}
return result;
}
private static ParameterInfo[] getParameters( Extension extension ) {
Collection<Extension> elements = extension.getChildren( PARAMETER );
List<ParameterInfo> list
= elements.stream().map( KeyBindingInspector::toParameterInfo ).collect( toList() );
return list.toArray( new ParameterInfo[ list.size() ] );
}
private static Extension readKeyBindingExtension( String keySequence, String platform ) {
return readKeyBindingExtension( new KeyBindingPredicate( keySequence, platform ) );
}
private static Extension readKeyBindingExtension( Predicate<Extension> predicate ) {
return new RegistryAdapter().readExtension( BINDINGS_EP ).thatMatches( predicate ).process();
}
private static ParameterInfo toParameterInfo( Extension extension ) {
return new ParameterInfo( extension.getAttribute( ID ), extension.getAttribute( VALUE ) );
}
private KeyBindingInspector() {}
private static class KeyBindingPredicate implements Predicate<Extension> {
private final String keySequence;
private final String platform;
KeyBindingPredicate( String keySequence, String platform ) {
this.keySequence = keySequence;
this.platform = platform;
}
@Override
public boolean test( Extension input ) {
String keySequenceAttr = input.getAttribute( SEQUENCE );
String platformAttr = input.getAttribute( PLATFORM );
return Objects.equals( keySequence, keySequenceAttr )
&& Objects.equals( platform, platformAttr );
}
}
}