我想通过几个偏好设置我的Xtext验证器,但我找不到办法。
我在某处可以做一个例子吗?
答案 0 :(得分:3)
这并不像看起来那么简单:
import org.apache.log4j.Logger;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.ProjectScope;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.preferences.IPreferencesService;
import org.eclipse.core.runtime.preferences.IScopeContext;
import org.eclipse.emf.common.util.URI;
import com.google.inject.Singleton;
@Singleton
public class I18nPreferences {
private final static Logger log = Logger.getLogger( I18nPreferences.class );
public final static String I18N_QUALIFIER = "com.pany.eclipse.dsl.Dsl"; // name of the prefs file without extension
public final static String VALIDATION_IGNORE_PATTERN_KEY = "validation.ignore";
/** Get validation configuration for a resource */
public ValidationConfiguration validationConfiguration( URI uri ) {
// URI looks like this:
// platform:/resource/project/src/.../file.dsl
log.debug( "Search config for " + uri );
ValidationConfiguration config = new ValidationConfiguration();
IPreferencesService service = Platform.getPreferencesService();
if( null == service ) {
// Probably not running under Eclipse
log.debug( "No IPreferencesService" );
return config;
}
String platformString = uri.toPlatformString( true );
if( null == platformString ) {
// Probably not running from the Eclipse UI. Might be a unit test or something
return config;
}
IWorkspace workspace = ResourcesPlugin.getWorkspace();
String s = uri.isPlatformResource() ? uri.toPlatformString( true ) : uri.toString();
Path path = new Path( s );
IResource resource = workspace.getRoot().getFile( path );
IProject project = null == resource ? null : resource.getProject();
if( null == resource || null == project ) {
log.debug( "Can't locate project " + uri + " in workspace" );
return config;
}
log.debug( "Loading preferences for " + project.getName() );
IScopeContext[] contexts = { new ProjectScope( resource.getProject() ) };
String defaultValue = "";
String patterns = service.getString( I18N_QUALIFIER, VALIDATION_IGNORE_PATTERN_KEY, defaultValue, contexts );
log.debug( "Found pattern: " + patterns );
config.setIgnoreString( patterns );
return config;
}
}
答案 1 :(得分:0)
至少有两种可能性:
将验证器移至ui项目并直接使用首选项。
在运行时项目中使用#isEnabled(..)创建一个类似ValidatorGuard的接口,其默认实现返回'true'/使用一些属性。在UI项目中实现该接口,您也可以从PreferenceStore读取信息以确定某些验证的启用状态。