Skip to content
This repository has been archived by the owner on Apr 3, 2018. It is now read-only.

Commit

Permalink
LANG: refactor pref component validation, part 2.
Browse files Browse the repository at this point in the history
  • Loading branch information
bruno-medeiros committed Oct 13, 2015
1 parent 5ab6e9c commit e362189
Show file tree
Hide file tree
Showing 24 changed files with 353 additions and 189 deletions.
Expand Up @@ -25,15 +25,15 @@
import melnorme.lang.ide.core.utils.operation.EclipseCancelMonitor; import melnorme.lang.ide.core.utils.operation.EclipseCancelMonitor;
import melnorme.lang.ide.core.utils.process.AbstractRunProcessTask; import melnorme.lang.ide.core.utils.process.AbstractRunProcessTask;
import melnorme.lang.ide.core.utils.process.AbstractRunProcessTask.ProcessStartHelper; import melnorme.lang.ide.core.utils.process.AbstractRunProcessTask.ProcessStartHelper;
import melnorme.lang.tooling.data.PathValidator; import melnorme.lang.tooling.data.IValidatedField;
import melnorme.lang.tooling.data.StatusException; import melnorme.lang.tooling.data.StatusException;
import melnorme.lang.tooling.data.StatusLevel; import melnorme.lang.tooling.data.StatusLevel;
import melnorme.lang.tooling.ops.IOperationHelper; import melnorme.lang.tooling.ops.IOperationHelper;
import melnorme.lang.tooling.ops.util.PathValidator;
import melnorme.lang.utils.ProcessUtils; import melnorme.lang.utils.ProcessUtils;
import melnorme.utilbox.concurrency.ICancelMonitor; import melnorme.utilbox.concurrency.ICancelMonitor;
import melnorme.utilbox.concurrency.OperationCancellation; import melnorme.utilbox.concurrency.OperationCancellation;
import melnorme.utilbox.core.CommonException; import melnorme.utilbox.core.CommonException;
import melnorme.utilbox.fields.IValidatedField;
import melnorme.utilbox.misc.ListenerListHelper; import melnorme.utilbox.misc.ListenerListHelper;
import melnorme.utilbox.misc.Location; import melnorme.utilbox.misc.Location;
import melnorme.utilbox.process.ExternalProcessHelper.ExternalProcessResult; import melnorme.utilbox.process.ExternalProcessHelper.ExternalProcessResult;
Expand Down
Expand Up @@ -29,6 +29,7 @@
import org.osgi.framework.BundleException; import org.osgi.framework.BundleException;


import melnorme.lang.ide.core.LangCore; import melnorme.lang.ide.core.LangCore;
import melnorme.lang.tooling.data.IStatusMessage;
import melnorme.lang.tooling.data.StatusException; import melnorme.lang.tooling.data.StatusException;
import melnorme.lang.tooling.data.StatusLevel; import melnorme.lang.tooling.data.StatusLevel;
import melnorme.utilbox.concurrency.OperationCancellation; import melnorme.utilbox.concurrency.OperationCancellation;
Expand Down Expand Up @@ -110,7 +111,7 @@ public static void checkMonitorCancelation_OCE(IProgressMonitor progressMonitor)
} }
} }


public static int statusLevelToEclipseSeverity(StatusException se) { public static int statusLevelToEclipseSeverity(IStatusMessage se) {
return statusLevelToEclipseSeverity(se.getStatusLevel()); return statusLevelToEclipseSeverity(se.getStatusLevel());
} }


Expand Down
Expand Up @@ -24,9 +24,9 @@
import melnorme.lang.ide.core.LangCore; import melnorme.lang.ide.core.LangCore;
import melnorme.lang.ide.core.operations.AbstractToolManager; import melnorme.lang.ide.core.operations.AbstractToolManager;
import melnorme.lang.ide.core.utils.process.AbstractRunProcessTask; import melnorme.lang.ide.core.utils.process.AbstractRunProcessTask;
import melnorme.lang.tooling.data.PathValidator; import melnorme.lang.tooling.data.IValidatedField;
import melnorme.lang.tooling.ops.util.PathValidator;
import melnorme.utilbox.core.CommonException; import melnorme.utilbox.core.CommonException;
import melnorme.utilbox.fields.IValidatedField;
import melnorme.utilbox.misc.Location; import melnorme.utilbox.misc.Location;


/** /**
Expand Down
Expand Up @@ -11,13 +11,12 @@
package melnorme.lang.ide.ui.preferences; package melnorme.lang.ide.ui.preferences;




import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;

import melnorme.lang.ide.core.operations.ToolchainPreferences; import melnorme.lang.ide.core.operations.ToolchainPreferences;
import melnorme.lang.ide.ui.LangUIPlugin; import melnorme.lang.ide.ui.LangUIPlugin;
import melnorme.lang.ide.ui.preferences.common.AbstractComponentsPrefPage; import melnorme.lang.ide.ui.preferences.common.AbstractComponentsPrefPage;
import melnorme.lang.tooling.data.PathValidator;

import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;


public abstract class LangRootPreferencePage extends AbstractComponentsPrefPage { public abstract class LangRootPreferencePage extends AbstractComponentsPrefPage {


Expand All @@ -32,16 +31,15 @@ public LangRootPreferencePage() {
protected LangSDKConfigBlock createLangSDKConfigBlock() { protected LangSDKConfigBlock createLangSDKConfigBlock() {
LangSDKConfigBlock langSDKConfigBlock = doCreateLangSDKConfigBlock(); LangSDKConfigBlock langSDKConfigBlock = doCreateLangSDKConfigBlock();


connectStringField(ToolchainPreferences.SDK_PATH, langSDKConfigBlock.getLocationField(), addValidationStatusField(langSDKConfigBlock.validation);
getSDKValidator());
addStringComponent(ToolchainPreferences.SDK_PATH, langSDKConfigBlock.getLocationField());


return langSDKConfigBlock; return langSDKConfigBlock;
} }


protected abstract LangSDKConfigBlock doCreateLangSDKConfigBlock(); protected abstract LangSDKConfigBlock doCreateLangSDKConfigBlock();


protected abstract PathValidator getSDKValidator();

@Override @Override
protected Control createContents(Composite parent) { protected Control createContents(Composite parent) {
return langSDKConfigBlock.createComponent(parent); return langSDKConfigBlock.createComponent(parent);
Expand Down
Expand Up @@ -13,27 +13,34 @@
import org.eclipse.jface.layout.GridLayoutFactory; import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Composite;


import melnorme.lang.tooling.ops.util.PathValidator;
import melnorme.util.swt.SWTFactoryUtil; import melnorme.util.swt.SWTFactoryUtil;
import melnorme.util.swt.components.AbstractComponentExt; import melnorme.util.swt.components.AbstractComponentExt;
import melnorme.util.swt.components.FieldComponent; import melnorme.util.swt.components.FieldComponent;
import melnorme.util.swt.components.fields.ButtonTextField; import melnorme.util.swt.components.fields.ButtonTextField;
import melnorme.util.swt.components.fields.DirectoryTextField; import melnorme.util.swt.components.fields.DirectoryTextField;


public abstract class LangSDKConfigBlock extends AbstractComponentExt { public abstract class LangSDKConfigBlock extends ValidatedConfigBlock {


public final LanguageSDKLocationGroup sdkLocationGroup = createSDKLocationGroup(); public final LanguageSDKLocationGroup sdkLocationGroup = createSDKLocationGroup2();


public LangSDKConfigBlock() { public LangSDKConfigBlock() {
} }


protected LanguageSDKLocationGroup createSDKLocationGroup() { protected LanguageSDKLocationGroup createSDKLocationGroup2() {
return new LanguageSDKLocationGroup(); LanguageSDKLocationGroup sdkLocationGroup = new LanguageSDKLocationGroup();

validation.addValidatedField(sdkLocationGroup.sdkLocationField, getSDKValidator());

return sdkLocationGroup;
} }


public FieldComponent<String> getLocationField() { public FieldComponent<String> getLocationField() {
return sdkLocationGroup.sdkLocationField; return sdkLocationGroup.sdkLocationField;
} }


protected abstract PathValidator getSDKValidator();

@Override @Override
public int getPreferredLayoutColumns() { public int getPreferredLayoutColumns() {
return 1; return 1;
Expand Down
@@ -0,0 +1,25 @@
/*******************************************************************************
* Copyright (c) 2015 Bruno Medeiros and other Contributors.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Bruno Medeiros - initial API and implementation
*******************************************************************************/
package melnorme.lang.ide.ui.preferences;


import melnorme.lang.tooling.data.MultipleFieldValidation;
import melnorme.util.swt.components.AbstractComponentExt;

public abstract class ValidatedConfigBlock extends AbstractComponentExt {

public final MultipleFieldValidation validation = new MultipleFieldValidation();

public ValidatedConfigBlock() {
super();
}

}
@@ -0,0 +1,90 @@
/*******************************************************************************
* Copyright (c) 2015 Bruno Medeiros and other Contributors.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Bruno Medeiros - initial API and implementation
*******************************************************************************/
package melnorme.lang.ide.ui.preferences.common;


import static melnorme.utilbox.core.Assert.AssertNamespace.assertFail;

import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.swt.widgets.Composite;

import melnorme.lang.tooling.data.IStatusMessage;
import melnorme.lang.tooling.data.IValidationSource;
import melnorme.lang.tooling.data.StatusLevel;
import melnorme.utilbox.collections.ArrayList2;
import melnorme.utilbox.fields.IDomainField;

public abstract class AbstractComponentPrefPage2 extends AbstractLangPreferencesPage {

private final ArrayList2<IValidationSource> validators = new ArrayList2<>();

public AbstractComponentPrefPage2() {
super(null);
}

public AbstractComponentPrefPage2(IPreferenceStore store) {
super(store);
}

@Override
public final void createControl(Composite parent) {
super.createControl(parent);
updateStatusMessage();
}

public void addValidationSource(IValidationSource validationSource) {
validators.add(validationSource);
}

public void addValidationStatusField(IDomainField<IStatusMessage> statusField) {
IValidationSource validationSource;

if(statusField instanceof IValidationSource) {
validationSource = (IValidationSource) statusField;
} else {
validationSource = new IValidationSource() {
@Override
public IStatusMessage getValidationStatus() {
return statusField.getFieldValue();
}
};
}
addValidationSource(validationSource);
statusField.addListener(() -> updateStatusMessage());
}

protected void updateStatusMessage() {
if(!isControlCreated()) {
return;
}

IStatusMessage status = IValidationSource.getHighestStatus(validators);
if(status == null) {
setMessage(null);
setValid(true);
} else {
setMessage(status.getMessage(), statusLevelToMessageType(status.getStatusLevel()));
setValid(status.getStatusLevel() != StatusLevel.ERROR);
}
}

public static int statusLevelToMessageType(StatusLevel statusLevel) {
switch (statusLevel) {
case OK: return IMessageProvider.NONE;
case INFO: return IMessageProvider.INFORMATION;
case WARNING: return IMessageProvider.WARNING;
case ERROR: return IMessageProvider.ERROR;
}
throw assertFail();
}

}

0 comments on commit e362189

Please sign in to comment.