blob: 8c4323b693e9847b0886e4edcde375752486b11d [file] [log] [blame]
package org.eclipse.dltk.ui.preferences;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.core.resources.IProject;
import org.eclipse.dltk.compiler.util.Util;
import org.eclipse.dltk.core.DLTKContributionExtensionManager;
import org.eclipse.dltk.core.IDLTKContributedExtension;
import org.eclipse.dltk.ui.dialogs.PropertyLinkArea;
import org.eclipse.dltk.ui.util.IStatusChangeListener;
import org.eclipse.dltk.ui.util.SWTFactory;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StackLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.ui.dialogs.PreferenceLinkArea;
import org.eclipse.ui.preferences.IWorkbenchPreferenceContainer;
/**
*/
public abstract class ContributedExtensionOptionsBlock extends
AbstractOptionsBlock {
private Map contribToDescMap = new HashMap();
private ComboViewerBlock viewer;
private Composite descriptionPlace;
public ContributedExtensionOptionsBlock(IStatusChangeListener context,
IProject project, PreferenceKey[] allKeys,
IWorkbenchPreferenceContainer container) {
super(context, project, allKeys, container);
}
// ~ Methods
@Override
public final Control createOptionsBlock(Composite parent) {
Composite composite = SWTFactory.createComposite(parent, parent
.getFont(), 1, 1, GridData.FILL);
createSelectorBlock(composite);
return composite;
}
/**
* Returns the extension manager for the contributed extension.
*/
protected abstract DLTKContributionExtensionManager getExtensionManager();
/**
* Returns the language's nature id.
*/
protected abstract String getNatureId();
/**
* Returns the message that will be used to create the link to the
* preference or property page.
*/
protected abstract String getPreferenceLinkMessage();
/**
* Returns the preference key that will be used to store the contribution
* preference.
*/
protected abstract PreferenceKey getSavedContributionKey();
protected Composite createDescription(Composite parent,
IDLTKContributedExtension contrib) {
Composite composite = SWTFactory.createComposite(parent, parent
.getFont(), 1, 1, GridData.FILL);
String desc = contrib.getDescription();
if (desc == null) {
desc = Util.EMPTY_STRING;
}
SWTFactory.createLabel(composite, desc, 1);
String prefPageId = contrib.getPreferencePageId();
String propPageId = contrib.getPropertyPageId();
// we're a property page
if (isProjectPreferencePage() && hasValidId(propPageId)) {
new PropertyLinkArea(composite, SWT.NONE, propPageId, fProject,
getPreferenceLinkMessage(), getPreferenceContainer());
}
// we're a preference page
if (!isProjectPreferencePage() && hasValidId(prefPageId)) {
new PreferenceLinkArea(composite, SWT.NONE, prefPageId,
getPreferenceLinkMessage(), getPreferenceContainer(), null);
}
return composite;
}
protected void createSelectorBlock(Composite composite) {
final int groupColumns = getSelectorGroupColumns();
// Group
Composite group = createSelectorGroup(composite, groupColumns);
// Name
SWTFactory.createLabel(group, getSelectorNameLabel(), 1);
viewer = createComboViewerBlock(group);
// Description
descriptionPlace = SWTFactory.createComposite(group, group.getFont(),
1, groupColumns, GridData.FILL);
descriptionPlace.setLayout(new StackLayout());
}
protected ComboViewerBlock createComboViewerBlock(Composite group) {
GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
return new ComboViewerBlock(group, gd) {
@Override
protected String getObjectName(Object element) {
final IDLTKContributedExtension item = (IDLTKContributedExtension) element;
if (item.getName() != null && item.getName().length() != 0) {
return item.getName();
}
return item.getClass().getName();
}
@Override
protected void selectedObjectChanged(Object element) {
updateSelection((IDLTKContributedExtension) element);
}
@Override
protected String getObjectId(Object element) {
return ((IDLTKContributedExtension) element).getId();
}
@Override
protected Object getDefaultObject() {
/*
* no preference value has been set so we want a contribution
* that is returned based upon the 'select by priority' logic
*
* this is done to handle the case where the plugin implementor
* did not configure a default value via a preference
* initializer
*/
return getExtensionManager().getPriorityContribution(
getProject(), getNatureId());
}
@Override
protected String getSavedObjectId() {
return getValue(getSavedContributionKey());
}
@Override
protected Object getObjectById(String id) {
return getExtensionManager().getContributionById(id);
}
};
}
protected int getSelectorGroupColumns() {
return 1;
}
protected Composite createSelectorGroup(Composite composite,
int groupColumns) {
return SWTFactory.createGroup(composite, getSelectorGroupLabel(),
groupColumns, 1, GridData.FILL_HORIZONTAL);
}
/**
* Returns the label that will be used for the selector group.
*/
protected abstract String getSelectorGroupLabel();
/**
* Returns the label that will be used for the selector name.
*/
protected abstract String getSelectorNameLabel();
@Override
protected void initialize() {
super.initialize();
IDLTKContributedExtension[] contributions = getExtensionManager()
.getContributions(getNatureId());
for (int i = 0; i < contributions.length; i++) {
IDLTKContributedExtension contrib = contributions[i];
contribToDescMap.put(contrib.getId(), createDescription(
descriptionPlace, contrib));
}
viewer.initialize(contributions);
}
@Override
public void performDefaults() {
super.performDefaults();
viewer.performDefaults();
}
protected final void updateSelection(IDLTKContributedExtension contrib) {
String id = contrib.getId();
setValue(getSavedContributionKey(), id);
Composite composite = (Composite) contribToDescMap.get(id);
((StackLayout) descriptionPlace.getLayout()).topControl = composite;
descriptionPlace.layout();
selectionChanged(contrib);
}
protected void selectionChanged(IDLTKContributedExtension extension) {
// empty, override in descendants
}
protected IDLTKContributedExtension getSelectedExtension() {
return (IDLTKContributedExtension) viewer.getSelectedObject();
}
private boolean hasValidId(String id) {
return (id != null && !"".equals(id)); //$NON-NLS-1$
}
}