package org.jactr.eclipse.ui.preferences;
import java.util.ArrayList;
import java.util.Collection;
import org.eclipse.jdt.internal.ui.text.PreferencesAdapter;
import org.eclipse.jface.preference.BooleanFieldEditor;
import org.eclipse.jface.preference.ComboFieldEditor;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
import org.jactr.eclipse.core.CorePlugin;
import org.jactr.eclipse.core.bundles.descriptors.UnitCompilerDescriptor;
import org.jactr.eclipse.core.bundles.registry.UnitCompilerRegistry;
import org.jactr.eclipse.ui.UIPlugin;
import org.jactr.io.compiler.IReportableUnitCompiler;
public class UnitCompilersPreferencePage extends PreferencePage implements
IWorkbenchPreferencePage
{
private Collection<UnitCompilerControl> _compilers = new ArrayList<UnitCompilerControl>();
private PreferencesAdapter _adapter = new PreferencesAdapter(
CorePlugin
.getDefault()
.getPluginPreferences());
@Override
protected Control createContents(Composite parent)
{
Composite entryTable = new Composite(parent, SWT.VERTICAL);
GridLayout layout = new GridLayout();
entryTable.setLayout(layout);
for (UnitCompilerDescriptor desc : UnitCompilerRegistry.getRegistry()
.getAllDescriptors())
if (!desc.isInWorkspace())
{
UnitCompilerControl control = new UnitCompilerControl(desc);
_compilers.add(control);
control.createControl(entryTable, _adapter);
control.load();
}
return entryTable;
}
@Override
protected void performDefaults()
{
for (UnitCompilerControl control : _compilers)
control.loadDefaults();
}
@Override
public boolean performOk()
{
for (UnitCompilerControl control : _compilers)
control.store();
return super.performOk();
}
public void init(IWorkbench workbench)
{
setPreferenceStore(_adapter);
}
private class UnitCompilerControl
{
private UnitCompilerDescriptor _descriptor;
private BooleanFieldEditor _enabledField;
private ComboFieldEditor _levelField;
public UnitCompilerControl(UnitCompilerDescriptor descriptor)
{
_descriptor = descriptor;
}
public UnitCompilerDescriptor getDescriptor()
{
return _descriptor;
}
public Control createControl(Composite parent, IPreferenceStore store)
{
Composite group = new Composite(parent, SWT.BORDER);
GridLayout layout = new GridLayout(2, false);
group.setLayout(layout);
Composite enable = new Composite(group, SWT.NONE);
GridData gd = new GridData();
enable.setLayoutData(gd);
_enabledField = new BooleanFieldEditor(_descriptor.getClassName()
+ ".enabled", _descriptor.getName(), enable);
_enabledField.setPreferenceStore(store);
store.setDefault(_descriptor.getClassName() + ".enabled", _descriptor
.isDefaultEnabled());
IReportableUnitCompiler.Level[] levelValues = IReportableUnitCompiler.Level
.values();
String[][] levels = new String[levelValues.length][2];
for (int i = 0; i < levelValues.length; i++)
{
levels[i][0] = levelValues[i].toString();
levels[i][1] = levelValues[i].name();
}
final Composite comboParent = new Composite(group, SWT.NONE);
gd = new GridData();
gd.horizontalAlignment = SWT.LEFT;
comboParent.setLayoutData(gd);
_levelField = new ComboFieldEditor(_descriptor.getClassName() + ".level",
"Report Level", levels, comboParent);
_levelField.setPreferenceStore(store);
store.setDefault(_descriptor.getClassName() + ".level", _descriptor
.getReportLevel().name());
_enabledField.setPropertyChangeListener(new IPropertyChangeListener() {
public void propertyChange(PropertyChangeEvent event)
{
_levelField.setEnabled(_enabledField.getBooleanValue(), comboParent);
}
});
return group;
}
public void load()
{
_levelField.load();
_enabledField.load();
}
public void loadDefaults()
{
_levelField.loadDefault();
_enabledField.loadDefault();
}
public void store()
{
_levelField.store();
_enabledField.store();
}
}
}