blob: ac2ce07873ef437443d10a2db32ebb2a3b8c1772 [file] [log] [blame]
package org.eclipse.dltk.tcl.internal.ui.preferences;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ProjectScope;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.core.runtime.preferences.IEclipsePreferences;
import org.eclipse.dltk.core.DLTKCore;
import org.eclipse.dltk.core.IScriptProject;
import org.eclipse.dltk.core.environment.EnvironmentManager;
import org.eclipse.dltk.core.environment.IEnvironment;
import org.eclipse.dltk.internal.core.search.ProjectIndexerManager;
import org.eclipse.dltk.tcl.core.TclPlugin;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.ui.dialogs.PropertyPage;
import org.osgi.service.prefs.BackingStoreException;
public class TclEnvironmentPropertyPage extends PropertyPage {
private static class ProjectIndexJob extends Job {
private final IProject project;
public ProjectIndexJob(IProject project) {
super(NLS.bind(
TclPreferencesMessages.TclEnvironmentPropertyPage_IndexingJobName,
project.getName()));
this.project = project;
}
@Override
protected IStatus run(IProgressMonitor monitor) {
ProjectIndexerManager.indexProject(project);
return Status.OK_STATUS;
}
}
private Combo fEnvironments;
private IEnvironment[] environments;
private Button indexerEnabled;
private Button builderEnabled;
private Button localValidator;
@Override
protected Control createContents(Composite parent) {
final Composite composite = new Composite(parent, SWT.NONE);
composite.setLayout(new GridLayout(2, false));
Label label = new Label(composite, SWT.NONE);
label.setText(
TclPreferencesMessages.TclEnvironmentPropertyPage_environmentLabel);
fEnvironments = new Combo(composite, SWT.DROP_DOWN | SWT.READ_ONLY);
fEnvironments.setLayoutData(
new GridData(SWT.FILL, SWT.DEFAULT, true, false));
environments = EnvironmentManager.getEnvironments();
final String[] items = new String[environments.length + 1];
items[0] = TclPreferencesMessages.TclEnvironmentPropertyPage_detectAutomatically;
final IProject project = getElement().getAdapter(IProject.class);
final String envId = getCurrentEnvironment(project);
int selection = 0;
for (int i = 0; i < environments.length; i++) {
final IEnvironment env = environments[i];
items[i + 1] = env.getName();
if (envId != null && envId.equals(env.getId())) {
selection = i + 1;
}
}
fEnvironments.setItems(items);
fEnvironments.select(selection);
final IScriptProject scriptProject = DLTKCore.create(project);
indexerEnabled = new Button(composite, SWT.CHECK);
final GridData indexerData = new GridData(GridData.FILL_HORIZONTAL);
indexerData.horizontalSpan = 2;
indexerEnabled.setLayoutData(indexerData);
indexerEnabled.setText(
TclPreferencesMessages.TclEnvironmentPropertyPage_IndexerEnabled);
indexerEnabled.setSelection(!DLTKCore.DISABLED.equals(
scriptProject.getOption(DLTKCore.INDEXER_ENABLED, false)));
builderEnabled = new Button(composite, SWT.CHECK);
final GridData builderData = new GridData(GridData.FILL_HORIZONTAL);
builderData.horizontalSpan = 2;
builderEnabled.setLayoutData(builderData);
builderEnabled.setText(
TclPreferencesMessages.TclEnvironmentPropertyPage_BuilderEnabled);
builderEnabled.setSelection(!DLTKCore.DISABLED.equals(
scriptProject.getOption(DLTKCore.BUILDER_ENABLED, false)));
localValidator = new Button(composite, SWT.CHECK);
final GridData localData = new GridData(GridData.FILL_HORIZONTAL);
localData.horizontalSpan = 2;
localValidator.setLayoutData(localData);
localValidator.setText(
TclPreferencesMessages.TclEnvironmentPropertyPage_localTclChecker);
localValidator.setSelection(DLTKCore.ENABLED.equals(
new ProjectScope(project).getNode(TclPlugin.PLUGIN_ID).get(
TclPlugin.PREF_LOCAL_VALIDATOR, DLTKCore.DISABLED)));
return composite;
}
@Override
public boolean performOk() {
final IProject project = getElement().getAdapter(IProject.class);
final int selection = fEnvironments.getSelectionIndex();
try {
if (selection <= 0) {
EnvironmentManager.setEnvironmentId(project, null);
} else if (selection <= environments.length) {
EnvironmentManager.setEnvironment(project,
environments[selection - 1]);
}
} catch (CoreException e) {
// TODO
return false;
}
final IScriptProject scriptProject = DLTKCore.create(project);
final boolean newIndexer = indexerEnabled.getSelection();
final boolean wasIndexer = !DLTKCore.DISABLED.equals(
scriptProject.getOption(DLTKCore.INDEXER_ENABLED, false));
if (wasIndexer != newIndexer) {
scriptProject.setOption(DLTKCore.INDEXER_ENABLED,
newIndexer ? DLTKCore.ENABLED : DLTKCore.DISABLED);
if (newIndexer) {
new ProjectIndexJob(project).schedule(500);
}
}
final boolean newBuilder = builderEnabled.getSelection();
final boolean wasBuilder = !DLTKCore.DISABLED.equals(
scriptProject.getOption(DLTKCore.BUILDER_ENABLED, false));
if (wasBuilder != newBuilder) {
scriptProject.setOption(DLTKCore.BUILDER_ENABLED,
newBuilder ? DLTKCore.ENABLED : DLTKCore.DISABLED);
if (!newBuilder) {
new ProjectBuildJob(project).schedule(500);
}
}
final IEclipsePreferences node = new ProjectScope(project)
.getNode(TclPlugin.PLUGIN_ID);
node.put(TclPlugin.PREF_LOCAL_VALIDATOR,
localValidator.getSelection() ? DLTKCore.ENABLED
: DLTKCore.DISABLED);
try {
node.flush();
} catch (BackingStoreException e) {
// TODO Auto-generated catch block
}
return super.performOk();
}
private String getCurrentEnvironment(final IProject project) {
return EnvironmentManager.getEnvironmentId(project, false);
}
}