blob: a9290d11ebee670ba295f5aa017f919cb1f9d237 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2007 IBM Corporation and others.
* 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:
* IBM Corporation - initial API and implementation
* Les Jones <lesojones@gmail.com> - bug 208531
*******************************************************************************/
package org.eclipse.pde.ui.templates;
import java.util.Hashtable;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.pde.core.plugin.IPluginModelBase;
import org.eclipse.pde.ui.IFieldData;
/**
* This class adds a notion of options to the default template section
* implementation. Options have values and visual presence that allows users to
* change them. When a section is configured with a number of options, they
* become available to the code generator and can take part in conditional code
* emitting.
* <p>
* This class is typically used in conjunction with
* <samp>OptionTemplateWizardPage </samp>. The later is capable of creating UI
* based on the list of options it was given, thus simplifying new template
* section creation.
*
* @since 2.0
*/
public abstract class BaseOptionTemplateSection extends AbstractTemplateSection {
private Hashtable options = new Hashtable();
/**
* Adds a boolean option with a provided name, label and initial value.
*
* @param name
* the unique name of the option (can be used as a variable in
* conditional code emitting and variable substitution)
* @param label
* presentable name of the option
* @param value
* initial value of the option
* @param pageIndex
* a zero-based index of a page where this option should appear
* @return the newly created option
*/
protected TemplateOption addOption(String name, String label, boolean value, int pageIndex) {
BooleanOption option = new BooleanOption(this, name, label);
registerOption(option, value ? Boolean.TRUE : Boolean.FALSE, pageIndex);
return option;
}
/**
* Adds a string option with a provided name, label and initial value.
*
* @param name
* the unique name of the option (can be used as a variable in
* conditional code emitting and variable substitution)
* @param label
* presentable name of the option
* @param value
* initial value of the option
* @param pageIndex
* a zero-based index of a page where this option should appear
* @return the newly created option
*/
protected TemplateOption addOption(String name, String label, String value, int pageIndex) {
StringOption option = new StringOption(this, name, label);
registerOption(option, value, pageIndex);
return option;
}
/**
* Adds a choice option with a provided name, label, list of choices and the
* initial value (choice).
*
* @param name
* the unique name of the option (can be used as a variable in
* conditional code emitting and variable substitution)
* @param label
* presentable name of the option
* @param choices
* an array of choices that the user will have when setting the
* value of the option. Each array position should accept an
* array of String objects of size 2, the first being the unique
* name and the second the presentable label of the choice.
* @param value
* initial value (choice) of the option
* @param pageIndex
* a zero-based index of a page where this option should appear
* @return the newly created option
*/
protected TemplateOption addOption(String name, String label, String[][] choices, String value, int pageIndex) {
AbstractChoiceOption option;
if (choices.length == 2)
option = new RadioChoiceOption(this, name, label, choices);
else
option = new ComboChoiceOption(this, name, label, choices);
registerOption(option, value, pageIndex);
return option;
}
/**
* Force a combo choice representation.
* Radio buttons look bad - even if only two options specified.
* @param name
* @param label
* @param choices
* @param value
* @param pageIndex
* @return the newly created option
*/
protected ComboChoiceOption addComboChoiceOption(String name, String label, String[][] choices, String value, int pageIndex) {
ComboChoiceOption option = new ComboChoiceOption(this, name, label, choices);
registerOption(option, value, pageIndex);
return option;
}
/**
* Adds a blank field with a default height to provide spacing.
*
* @param pageIndex
* a zero-based index of a page where this option should appear
* @return the newly created option
*/
protected TemplateOption addBlankField(int pageIndex) {
BlankField field = new BlankField(this);
registerOption(field, "", pageIndex); //$NON-NLS-1$
return field;
}
/**
* Adds a blank field with a specific height to provide spacing.
*
* @param height
* specifies the height of the blank field in pixels
* @param pageIndex
* a zero-based index of a page where this option should appear
* @return the newly created option
*/
protected TemplateOption addBlankField(int height, int pageIndex) {
BlankField field = new BlankField(this, height);
registerOption(field, "", pageIndex); //$NON-NLS-1$
return field;
}
/**
* Initializes the option with a given unique name with the provided value.
* The value will be set only if the option has not yet been initialized.
*
* @param name
* option unique name
* @param value
* the initial value of the option
*/
protected void initializeOption(String name, Object value) {
TemplateOption option = getOption(name);
if (option != null) {
// Only initialize options that have no value set
if (option.getValue() == null)
option.setValue(value);
}
}
/**
* Returns a string value of the option with a given name. The option with
* that name must exist and must be registered as a string option to begin
* with.
*
* @param name
* the unique name of the option
* @return the string value of the option with a given name or <samp>null
* </samp> if not found.
*/
public String getStringOption(String name) {
TemplateOption option = (TemplateOption) options.get(name);
if (option != null) {
if (option instanceof StringOption) {
return ((StringOption) option).getText();
} else if (option instanceof AbstractChoiceOption) {
// This situation covers both Combos and Radio buttons
Object value = option.getValue();
if (value instanceof String) {
return (String) value;
} else if (value != null) {
return value.toString();
}
}
}
return null;
}
/**
* Returns a boolean value of the option with a given name. The option with
* that name must exist and must be registered as a boolean option to begin
* with.
*
* @param key
* the unique name of the option
* @return the boolean value of the option with a given name or <samp>null
* </samp> if not found.
*/
public boolean getBooleanOption(String key) {
TemplateOption option = (TemplateOption) options.get(key);
if (option != null && option instanceof BooleanOption) {
return ((BooleanOption) option).isSelected();
}
return false;
}
/**
* Enables the option with a given name. The exact effect of the method
* depends on the option type, but the end-result should always be the same -
* users should not be able to modify values of disabled options. This
* method has no effect if the option with a given name is not found.
*
* @param name
* the unique name of the option
* @param enabled
* the enable state that the option should have
*/
public void setOptionEnabled(String name, boolean enabled) {
TemplateOption option = (TemplateOption) options.get(name);
if (option != null)
option.setEnabled(enabled);
}
/**
* Returns the value of the option with a given name. The actual type of the
* returned object depends on the option type.
*
* @param name
* the name of the option
* @return the current value of the option with a specified name or
* <samp>null </samp> if not found or not applicable.
*/
public Object getValue(String name) {
TemplateOption option = (TemplateOption) options.get(name);
if (option != null)
return option.getValue();
return super.getValue(name);
}
/**
* Returns true if this template depends on values set in the parent wizard.
* Values in the parent wizard include plug-in id, plug-in name, plug-in
* class name, plug-in provider etc. If the template does depend on these
* values, <samp>initializeFields </samp> will be called when the page is
* made visible in the forward direction (going from the first page to the
* pages owned by this template). If the page is never shown (Finish is
* pressed before the page is made visible at least once),
* <samp>initializeFields </samp> will be called with the model object
* instead during template execution. The same method will also be called
* when the template is created within the context of the plug-in manifest
* editor, because plug-in model already exists at that time.
*
* @return <code>true</code> if this template depends on the data set in
* the parent wizard, <code>false</code> otherwise.
*/
public boolean isDependentOnParentWizard() {
return false;
}
/**
* Initializes options in the wizard page using the data provided by the
* method parameters. Some options may depend on the user selection in the
* common wizard pages before template page has been shown (for example,
* plug-in ID, plug-in name etc.). This method allows options to initialize
* in respect to these values.
* <p>
* The method is called before the actual plug-in has been built.
* </p>
*
* @param data
* plug-in data as defined in the common plug-in project wizard
* pages
*/
protected void initializeFields(IFieldData data) {
}
/**
* Initializes options in the wizard page using the data provided by the
* method parameters. Some options may depend on the user selection in the
* common wizard pages before template page has been shown (for example,
* plug-in ID, plug-in name etc.). This method allows options to initialize
* in respect to these values.
* <p>
* This method is called after the plug-in has already been created or as
* part of new extension creation (inside the manifest editor). Either way,
* the plug-in properties in the model have been fully set and the model can
* be used to initialize options that cannot be initialized independently.
*
* @param model
* the model of the plug-in manifest file.
*/
public void initializeFields(IPluginModelBase model) {
}
/**
* Subclasses must implement this method in order to validate options whose
* value have been changed by the user. The subclass can elect to validate
* the option on its own, or to also check validity of other options in
* relation to the new value of this one.
*
* @param changed
* the option whose value has been changed by the user
*/
public abstract void validateOptions(TemplateOption changed);
/**
* Expands variable substitution to include all string options defined in
* this template.
*
* @see AbstractTemplateSection#getReplacementString(String, String)
*/
public String getReplacementString(String fileName, String key) {
String value = getStringOption(key);
if (value != null)
return value;
return super.getReplacementString(fileName, key);
}
/**
* Modifies the superclass implementation by adding the initialization step
* before commencing execution. This is important because some options may
* not be initialized and users may choose to press 'Finish' before the
* wizard page where the options are were shown for the first time.
*/
public void execute(IProject project, IPluginModelBase model, IProgressMonitor monitor) throws CoreException {
initializeFields(model);
super.execute(project, model, monitor);
}
/**
* Registers the provided option and sets the initial value.
*
* @param option
* the option to register
* @param value
* the initial value
* @param pageIndex
* the page index to which this option belongs
*/
protected void registerOption(TemplateOption option, Object value, int pageIndex) {
option.setValue(value);
options.put(option.getName(), option);
}
private TemplateOption getOption(String key) {
return (TemplateOption) options.get(key);
}
}