blob: cb6771b3c3f18bf65934572705ef5c5b3bde569f [file] [log] [blame]
package org.eclipse.dltk.ui.preferences;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.dltk.internal.ui.preferences.PropertyAndPreferencePage;
import org.eclipse.dltk.ui.util.IStatusChangeListener;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.preferences.IWorkbenchPreferenceContainer;
/**
* Generic base class for preference pages that may also be used as a property
* pages to allow project specific configurations.
*
* <p>
* A number of {@link AbstractOptionsBlock} implementations already exist that
* can be used to provide standard preference options for source parsers,
* debugging engines, etc.
* </p>
*/
public abstract class AbstractConfigurationBlockPropertyAndPreferencePage
extends PropertyAndPreferencePage {
private AbstractOptionsBlock block;
public AbstractConfigurationBlockPropertyAndPreferencePage() {
setDescription();
setPreferenceStore();
}
@Override
public final void createControl(Composite parent) {
// create the configuration block here so the page works as both types
IWorkbenchPreferenceContainer container = (IWorkbenchPreferenceContainer) getContainer();
block = createOptionsBlock(getNewStatusChangedListener(), getProject(),
container);
// calls createPreferenceContent(Composite)
super.createControl(parent);
String helpId = isProjectPreferencePage() ? getProjectHelpId()
: getHelpId();
PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(), helpId);
}
@Override
public final void dispose() {
if (block != null) {
block.dispose();
}
super.dispose();
}
@Override
public final void performApply() {
if (block != null) {
block.performApply();
}
}
@Override
public final boolean performOk() {
if ((block != null) && !block.performOk()) {
return false;
}
return super.performOk();
}
@Override
public final void setElement(IAdaptable element) {
super.setElement(element);
// no description for property page
setDescription(null);
}
/**
* Creates the specific set of preference control widgets for the given
* property page.
*
* <p>
* Sub-classes should use an existing <code>AbstractOptionsBlock</code>
* Implementation if one is available for the type of preference page they
* wish to implement. See the individual implementations for details on what
* type of preference/property page they may be used to create.
* </p>
*/
protected abstract AbstractOptionsBlock createOptionsBlock(
IStatusChangeListener newStatusChangedListener, IProject project,
IWorkbenchPreferenceContainer container);
/**
* Returns the preference page help id
*/
protected abstract String getHelpId();
/**
* Returns the property page help id
*/
protected abstract String getProjectHelpId();
/**
* Sub-class implementations should make a call to
* {@link #setDescription(String)} to set the description for the page.
*/
protected abstract void setDescription();
/**
* Sub-class implementations should make a call to
* {@link #setPreferenceStore(org.eclipse.jface.preference.IPreferenceStore)}
* to set the preference store for the page.
*/
protected abstract void setPreferenceStore();
@Override
protected final Control createPreferenceContent(Composite composite) {
return block.createContents(composite);
}
@Override
protected final void enableProjectSpecificSettings(
boolean useProjectSpecificSettings) {
super.enableProjectSpecificSettings(useProjectSpecificSettings);
if (block != null) {
block.useProjectSpecificSettings(useProjectSpecificSettings);
}
}
@Override
protected final boolean hasProjectSpecificOptions(IProject project) {
return block.hasProjectSpecificOptions(project);
}
@Override
protected final void performDefaults() {
super.performDefaults();
if (block != null) {
block.performDefaults();
}
}
}