blob: 5d7dc2767406ec80574667bcf85d2f9bb364baf1 [file] [log] [blame]
/***************************************************************************************************
* Copyright (c) 2006, 2016 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
**************************************************************************************************/
package org.eclipse.ui.intro.config;
import java.util.Map;
import org.eclipse.ui.internal.intro.impl.model.IntroModelRoot;
import org.eclipse.ui.intro.IIntroSite;
/**
* Classes that extend this abstract class are used to configure <code>CustomizableIntroPart</code>.
* Since it is possible for multiple products to use the same intro configuration, this class allows
* them to customize some aspects of the intro content so that it looks different for different
* products even though they all share the same intro implementation and content.
*
* @since 3.2
*/
public abstract class IntroConfigurer {
/**
* The identifier of the named group where the configurer can contribute local tool bar actions.
*
* @see #init(IIntroSite, Map)
*/
public static final String TB_ADDITIONS = "additions"; //$NON-NLS-1$
protected Map<String, String> themeProperties;
protected IIntroSite site;
private IntroModelRoot model;
/**
* Provides the opportunity for the configurer to contribute to the action bars and to fetch
* presentation theme properties.
*
* @param site
* the intro part's site
* @param themeProperties
* properties of the current theme that can be used by the configurer, or
* <code>null</code> if no theme is currently active or the active theme has no
* properties.
*/
public void init(IIntroSite site, Map<String, String> themeProperties) {
this.themeProperties = themeProperties;
this.site = site;
}
/**
* Internal method to associate the corresponding intro configuration model. May be called
* independently of {@link #init(IIntroSite, Map)}.
*
* @noreference
*/
final public void bind(IntroModelRoot model) {
// The configurer may vary its returned results based on the theme
// properties
this.model = model;
if (model != null && model.getTheme() != null) {
themeProperties = model.getTheme().getProperties();
}
}
/**
* Returns the value of the theme property with a given name.
*
* @param name
* the theme property name
* @return the value of the property or <code>null</code> if property is not found, the theme
* does not have properties or no theme is currently active.
*/
protected String getThemeProperty(String name) {
if (themeProperties == null)
return null;
String value = (String)themeProperties.get(name);
if (value != null && model != null)
value = model.resolveVariables(value);
return value;
}
/**
* Returns the value of the variable defined by the configurer. This variable can appear in XML
* content files in attribute names and values of elements. Whenever $variable$ is encountered
* in the content, it is evaluated using this class by passing 'variable' to this method and
* substituting the result in the content.
*
* @param variableName
* the name of the substitution variable
* @return the value to substitute in place of a variable or <code>null</code> if the variable
* cannot be resolved.
*/
public abstract String getVariable(String variableName);
/**
* Returns the children of computed groups. Groups marked as computed will be completed at run
* time when the group is asked to provide children.
*
* @param pageId
* the identifier of the page in which this group appears
* @param groupId
* the identifier of the group group within the page
* @return an array of intro elements for this group. Each intro element should contain only
* legal elements and attributes according to the intro content schema. Returns an empty
* array for no children.
*/
public abstract IntroElement[] getGroupChildren(String pageId, String groupId);
/**
* Returns an array of elements that will be used to build launch bar short cut links. Override
* this method if the intro launch bar has been marked as computed.
*
* @return an array of elements that will be used to dynamically build shortcut links.
*/
public IntroElement[] getLaunchBarShortcuts() {
return new IntroElement[] {};
}
/**
* Resolves an incomplete path in the form "page_id/@" where page_id represents the identifier
* of the target page. The configurator should complete the path according to its internal
* resolution mechanism. The final path must point at an anchor in the referenced page.
*
* @param extensionId
* the id specified for the config extension
* @param path
* the incomplete path specified for the config extension
* @return the complete path that points at the anchor element in the referenced page, or
* <code>null</code> if the path cannot be resolved or the extension should be hidden.
*/
public abstract String resolvePath(String extensionId, String path);
/**
* Returns the style value that will be mixed in with the original style of the extension.
* Themes can use this feature to render certain extensions differently.
*
* @param pageId
* the identifier of the target page that this extension is contributed into
* @param extensionId
* the identifier of the extension to provide the mixin style for.
* @return the style to add to the original extension style or <code>null</code> if no mixin
* style is found for this extension.
*/
public String getMixinStyle(String pageId, String extensionId) {
return null;
}
/**
* Return true if {@code pageId} is the configured start page.
*
* @param pageId
* the page identifier
* @since 3.5
*/
protected boolean isStartPage(String pageId) {
return pageId.equals(model.getStartPageId());
}
}