blob: f2ab6616f50d64b1a607eabee88c50486cee8b75 [file] [log] [blame]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=Content-Type content="text/html; charset=windows-1252">
<META content="Microsoft FrontPage 6.0" name=GENERATOR></HEAD>
<BODY>
<H1>Universal Welcome</H1>
<H2>Background</H2>
<P>This document represents a description of a new welcome
implementation that will be used by Eclipse products that want to promote contributions
into the Welcome pages. The implementation will be provided by Eclipse platform
and available for use and configuration.</P>
<H2>The Problem</H2>
<P>The Welcome framework in Eclipse provides for defining welcome pages with
unique contribution points or 'anchors'. Other components can provide extensions
that add content into these anchors. Although this mechanism worked well for
closed solutions, it is increasingly hard to maintain for large products. Due to
the 'bottom-up' nature of contributions from clients into the welcome pages, it
is hard to control the final result and resolve conflicting contributions.</P>
<P>Take a provider of a reusable Eclipse feature as an example. He/she has
created a useful feature consisting of a number of plug-ins. The feature can
take part in several products, each one having its own Welcome implementation.
There are several problems that the feature provider will face when creating
Welcome contribution:</P>
<UL>
<LI>Since it must contribute into a number of different products, the feature
must know about the page identifiers for each of the products upfront.
<LI>It is entirely possible that one of the products will have a Welcome
implementation that is completely different from what the feature provider
expects; the contribution will not show up in these products
<LI>Even if the products share a common Welcome implementation, the importance
of the feature (and hence its relative position on the page) is not going to
be the same. The feature can be one of the most important components in the
product, or may be ranked as 'See Also'. Nevertheless, the feature provider is
asked to fully spell out the location on the target page in advance. </LI></UL>
<P>It is clearly obvious that the Welcome contribution of a reusable feature
would be much easier to develop with the following conditions in place:</P>
<UL>
<LI>Common Welcome implementation that can be counted on (as a form of an API)
<LI>Delayed target page resolution (so that the decision of the final position
of the contribution is left to the product assemblers)</LI></UL>
<H2>The Solution</H2>
<P>Based on the conclusions made in the previous section, the User Assistance
team now provides a recommended Welcome implementation that will be used by all products that want
to support better Welcome control. Eclipse Platform and SDK products will switch
to this implementation and others will be encouraged to follow suit.</P>
<P>The universal Welcome solution is based on our experience with Welcome
implementations and the need to have an implementation in place that
contributors can count on. The implementation is built using the current Welcome
framework which has been minimally enhanced to better support it. For this
reason, all existing Welcome implementation will continue to work and clients
will be able to switch to the new model according to their schedules. Of course, as
long as they don't switch, they will not reap the benefits of the new
implementation such as intelligent content merging, new visual solution etc.</P>
<h3>Design Principles</h3>
<P>While designing the universal welcome implementation, we started from the
following principles:</P>
<ol>
<li>Products should be able to point at this implementation without
the need to implement Welcome from scratch</li>
<li>Each product should be able to configure Welcome to a
certain degree (title, branding image, presentation theme)</li>
<li>A number of root pages that cover most of the products' needs will be
provided. However, the list of pages to show will be
configurable.</li>
<li>Visual design of the universal Welcome should be
sufficiently product-agnostic to better suit the increasingly componentized
world. It should work well with both monolithic products and 'best of bread'
Eclipse products composed of components created by different companies.</li>
<li>End-users should also be able to configure universal Welcome in a user-friendly
way.</li>
</ol>
<H3>Hooking to the universal Welcome</H3>
<p>In order to hook to the universal Welcome, developers should have a
product-based Eclipse application. This requires the use of the <b>
org.eclipse.runtime.products</b> extension point (the assumption is that the
product has already been defined):</p>
<blockquote>
<pre>&lt;extension
id=&quot;foo&quot;
point=&quot;org.eclipse.core.runtime.products&quot;&gt;
&lt;product
application=&quot;org.eclipse.ui.ide.workbench&quot;
description=&quot;Product Foo to use for testing the universal intro&quot;
name=&quot;Product Foo&quot;&gt;
&lt;/product&gt;
&lt;/extension&gt;</pre>
</blockquote>
<p>For this example, assume that the extension is define in plugin.xml file
sitting in the bundle with the bundle id of <b>com.example.intro</b>. A
long-existing feature of the Eclipse intro support is the ability to hook
products and intros using the product-intro binding:</p>
<blockquote>
<pre>&lt;extension
point=&quot;org.eclipse.ui.intro&quot;&gt;
&lt;introProductBinding
introId=&quot;org.eclipse.ui.intro.universal&quot;
productId=&quot;com.example.intro.foo&quot;/&gt;
&lt;/extension&gt;</pre>
</blockquote>
<p>The extension above binds the universal intro implementation (<b>org.eclipse.ui.intro.universal</b>)
and our product id.</p>
<p>Universal intro customization is split between product branding properties and
preferences. Product branding properties are set by the product and cannot be
modified. They include product title, branding image and branding image text:</p>
<pre> &lt;product
application=&quot;org.eclipse.ui.ide.workbench&quot;
description=&quot;Product Foo to use for testing the universal intro&quot;
name=&quot;Product Foo&quot;&gt;
&lt;property
name=&quot;introTitle&quot;
value=&quot;Welcome to Product Bar&quot;/&gt;
&lt;property
name=&quot;introBrandingImage&quot;
value=&quot;product:eclipse.png&quot;/&gt;
&lt;property
name=&quot;introBrandingImageText&quot;
value=&quot;XYZ Company&quot;/&gt;
&lt;/product&gt;</pre>
<p>Product properties whose values represent a file name relative to the product
bundle must be qualified with the 'product:' prefix. The following properties are
supported:</p>
<ul>
<li><b>introTitle</b> - the value of the property will be used at the top of
the root page (assuming that the current presentation theme elected to show
the root page title)</li>
<li><b>introBrandingImage</b> - the value of the property represents the
file name of the image to be used as the root page brand mark. The image
should ideally be PNG with alpha blending but other formats are also valid.
Image file names relative to the product bundle must have a 'product:'
prefix.</li>
<li><b>introBrandingImageText</b> - an alternative text to be used for the
branding image.</li>
<li><b>introDescription-&lt;pageId&gt;</b> - an option description text that
appears below the title on each of the sections, where pageId is one of the
values listed further below (e.g. introDescription-overview,
introDescription-samples etc.). This value should be translated in
plugin.properties file.</li>
</ul>
<p>Second half of universal intro variables are accessible as preferences. The
split is due to the fact that these variables can be configured by users and are
exposed in the new Welcome preference page. The initial values for these preferences
should be placed in the 'plugin_customization.ini' file that is referenced from
the product extension. These preferences are:</p>
<ul>
<li><b>org.eclipse.ui.intro.universal/INTRO_ROOT_PAGES</b> - a comma-separated list of
root page identifiers that should be visible in the home page. Valid values
are:<ul>
<li><b>overview</b></li>
<li><b>firststeps</b></li>
<li><b>tutorials</b></li>
<li><b>samples</b></li>
<li><b>whatsnew</b></li>
<li><b>migrate</b></li>
<li><b>webresources</b></li>
</ul>
</li>
<li><b>org.eclipse.ui.intro.universal/INTRO_DATA</b> - a file name pointing at
the XML file with the page layout settings (see more about this below). The
file name relative to the product bundle must have 'product:' prefix.</li>
<li><b>org.eclipse.ui.intro/INTRO_THEME</b> - a unique identifier of the
presentation theme to be used for this product (read more about theme
support in the <a href="#enhancements">section about Welcome framework
enhancements</a> below). <b>Note that this preference comes from 'org.eclipse.ui.intro
plug-in'</b> because active theme selection is performed at the framework
level.</li>
</ul>
<H3>Adding Welcome Customization preference page</H3>
<p>The combination of product properties and default preference values can fully
configure the Universal Welcome if no further customization is desired. For
products that want to allow users to customize Welcome, a preference page is
available. The following code should be added to the product's plugin.xml:</p>
<pre> &lt;extension
point=&quot;org.eclipse.ui.preferencePages&quot;&gt;
&lt;page
category=&quot;org.eclipse.ui.preferencePages.Workbench&quot;
class=&quot;org.eclipse.ui.intro.universal.ExtensionFactory:welcomeCustomization&quot;
id=&quot;com.example.intro.introCustomization&quot;
name=&quot;%introCustomizationPreference.name&quot;&gt;
&lt;keywordReference id=&quot;org.eclipse.ui.ide.appearance&quot;/&gt;
&lt;/page&gt;
&lt;/extension&gt;</pre>
<p>This code will add the Welcome customization preference page:</p>
<p align="center">
<img border="0" src="home-page-prefs.png"></p>
<p align="left">The page allows users to select the presentation theme. The original choice is provided by the
theme preference in the plugin_customization.ini file. In addition, users can choose from the list of available root pages.
Checking the root page causes the related tab to appear at the top of the
dialog.</p>
<p align="left">When saved, this preference page will prefix the variables with
the product id so that it does not interfere with the settings made for other
products in the same workbench. Alternatively, selecting the checkbox above will
not prefix the variables, making the stored settings visible to all the
products.</p>
<H3>Extending the Universal Welcome</H3>
<p>When launching the universal Welcome configured as shown above, you will notice
that all of the second level page that branch off the root page have an empty
content area. This is because shared Welcome does not have content of its own.
These areas are populated using intro config extensions.</p>
<p>The traditional way of contributing config extensions is to specify a full
path of the anchor element in the target page. This method is still supported
but it has proven to be somewhat fragile. As mentioned before, specifying an
exact place where the extension will end up in the target is premature for
extension authors. They may not know all the products in which their extension
will end up, and therefore don't know where they should appear according to each
product's focus. In the universal Welcome, this decision is left to product
authors. Extension authors now have the option of specifying an incomplete
target path, allowing the product author to fill in the blanks.</p>
<p>Config extensions that want to use late target path resolution need to
fulfill three conditions:</p>
<ol>
<li>Config extension needs to specify a unique identifier using the 'id'
attribute. Extensions without the id will be ignored. This is important
because id will be used to refer to the extension by the product author.</li>
<li>Config extension needs to specify a user-friendly name using the 'name'
attribute. This is important if the customization preference page will be
used because extensions will show up in the UI.</li>
<li>The target path should have the following form: &quot;page_id/@&quot; where 'page_id'
is the identifier of the target page. When '/@' is detected in the target
path, an attempt will be made to dynamically resolve the path into the
expected full form.</li>
</ol>
<P>The ability to resolve extension target paths is a new intro support feature
in Eclipse 3.2 added to make universal Welcome more powerful. The feature itself is
generic in that it can be used in other Welcome implementations, not just the
universal one. In Eclipse 3.2, CustomizableIntroPart can accept an optional intro customizer class that can affect its behavior in several ways. One of the roles
of the customizer is to perform late target path resolution. Of course, as far
as product authors are concerned, this is all just implementation detail because
in universal Welcome implementation, late target path resolution is performed using
the data file mentioned earlier. This file is stored using the org.eclipse.ui.intro/INTRO_DATA preference.</P>
<P>The 'INTRO_DATA' file uses XML format and allows product authors to control
the content of the main Welcome pages. Welcome contribution authors are required
to specify only the page Id in their target paths. The rest is defined in this
file. The file contains a sequence of 'page' elements, each containing a number
of 'group' elements. Group elements specify page-relative path and have
contributions for children. Contribution elements are used to specify two
aspects:&nbsp; </P>
<BLOCKQUOTE><PRE>&lt;extensions&gt;
&lt;page id="overview"&gt;
&lt;group path="page-content/top-left"&gt;
&lt;extension id="foo1" importance=&quot;high&quot;/&gt;
&lt;extension id="bar" importance=&quot;high&quot;/&gt;
&lt;extension id=&quot;foo2&quot; importance=&quot;medium&quot;/&gt;
&lt;/group&gt;
&lt;group path="page-content/top-right"&gt;
&lt;extension id="foo3" importance=&quot;low&quot;/&gt;
&lt;extension id="foo4" importance=&quot;low&quot;/&gt;
&lt;extension id=&quot;foo5&quot; importance=&quot;callout&quot;/&gt;
&lt;/group&gt;
&lt;hidden&gt;
&lt;extension id="foo6"/&gt;
&lt;extension id="foo7"/&gt;
&lt;/hidden&gt;
&lt;/page&gt;
&lt;page id="whatsnew"&gt;
...
&lt;/page&gt;
&lt;/extensions&gt;</PRE></BLOCKQUOTE>
<p>In the example above, contributions 'foo1', 'bar' and foo2' will be in the
left, and 'foo3', 'foo4' and 'foo5' in the right column on the page. The
relative order of contributions is also extracted from this file. In addition,
contributions are classified based on the <code>importance</code> attribute that
can have four valid values: <b>high</b>, <b>medium</b>, <b>low</b> and <b>
callout</b>, with <b>low</b> as the default. Each value has matching
presentation that makes it stand out on the page. First three are simply
different levels of importance according to the product author (note that the
same contribution may receive a different importance classification in two
separate products). The last one (<b>callout</b>) is used to single out
contributions that are of a completely different nature (for example, a
contribution that offers links to videos or animation).</p>
<p>Contributions that are not listed are appended after the listed contributions
and assigned a low importance value. This is important for contributions added
after the product has shipped - they still need to show up.</p>
<p>Contributions not relevant to the project can be hidden by explicitly listing
them as children of the 'hidden' element.</p>
<h3>Contributing into extensions</h3>
<p>An extension contributed into one of the root pages can itself contain
anchors, providing for others to add content. This causes a problem because the
final resolved path of the content in the extension is not known in advance. For
this reason, target paths for content in extensions that use late path
resolution must itself be resolved:</p>
<blockquote>
<pre>&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?&gt;
&lt;introContent&gt;
&lt;extensionContent id=&quot;extra&quot; name=&quot;Extra&quot; alt-style=&quot;css/swt.properties&quot; style=&quot;css/overview.css&quot; path=&quot;overview/@&quot;&gt;
&lt;group id=&quot;extra-group&quot; style-id=&quot;content-group&quot;&gt;
&lt;link label=&quot;Extra Overview link&quot; url=&quot;<a href="http://org.eclipse.ui.intro/showPage?id=extraOverview">http://org.eclipse.ui.intro/showPage?id=extraOverview</a>&quot;
id=&quot;extra-overview&quot;&gt;
&lt;text&gt;Showing the third-level extra page for overview&lt;/text&gt;
&lt;/link&gt;
&lt;anchor id=&quot;additions&quot;/&gt;
&lt;/group&gt;
&lt;/extensionContent&gt;
&lt;/introContent&gt;</pre>
</blockquote>
<p>In order to contribute into the anchor 'additions' in the extension above, we
should use the following path: &quot;overview/@extra/extra-group/additions&quot;. The
segment '@extra' will be replaced with the resolved path of the extension with
the id 'extra' in the 'overview' page. For example, if the extension is placed
in the upper left segment of the page, the resolved path will be:
&quot;overview/page-content/upper-left/extra-group/additions&quot;.</p>
<h3>Seeding the introData file</h3>
<p>In addition to providing intro customization to the end users for the first
time, Welcome preference page will allow product authors to create the
introData.xml file to be used for the first startup. The procedure is simple:</p>
<ol>
<li>Launch the product for the first time</li>
<li>Open the Welcome preference page (a quick way to do this is from the
local tool bar of the Welcome view where a new tool bar button opens the
Preferences into the right page)</li>
<li>For each page, manipulate the available extensions by moving them
between the four page quadrants (upper-left, upper-right, lower-left,
lower-right) and the Available list, or moving extensions up or down within
the same list (relative order). Use drag and drop to get the desired
results.</li>
<li>If needed, add the separator between the extension within the quadrant.</li>
<li>All extensions have the default importance setting of 'Low'. To change
it, click on the extension image to get the drop-down list to open and pick
a different setting from the list (e.g. High, Medium or Callout).</li>
<li>Press OK to see the preferences applied to Welcome.</li>
<li>If satisfied, open the preference page again and press 'Save As...'
button.</li>
<li>Store the file as 'introData.xml' in the product plug-in.</li>
<li>Set <b>org.eclipse.ui.intro.universal/INTRO_DATA</b> preference to the value 'product:introData.xml'.</li>
<li>Start the product on a fresh workspace to test if the data from the file
has been picked up.</li>
</ol>
<H3 align="center">
<img border="0" src="page-prefs.png" width="707" height="545"></H3>
<p>List 'Available Extensions' holds all the extensions that are currently
hidden. They can be moved to one of the four quadrants of each page.</p>
<H3>Handling multiple products</H3>
<p>The intent of the shared Welcome implementation is that all products that
want intelligent content merging should point at it instead of creating their own
Welcome. This
implies that it is possible to end up in a situation where multiple products all
pointing at the same shared Welcome coexist in the Eclipse workbench. Intro is
handling this situation as follows:</p>
<ul>
<li>Individual introData files associated with products in the workbench
will all be honored.</li>
<li>Content from multiple products will be merged in the main Welcome pages.
When computing the location and importance of each extension, active product
data will be consulted first. Only when no information is found will other
product data be used. This implies that if the same extension XYZ is marked
as 'low importance' in the active product and 'high importance' in an
inactive product, the active product's setting will be used ('low'). On the
other hand, if XYZ is missing in the active product's data, but is marked as
'high importance' in an inactive product's data, 'high' setting will be
used.</li>
<li>All the single-setting properties
(background, title, branding image) will be taken from the active product
only.</li>
<li>Root pages to show (specified using the <b>org.eclipse.ui.intro/INTRO_ROOT_PAGES</b>
preference) will be computed as a union of root pages in all the products. An
attempt will be made to respect the order of root pages specified by the
active product. Pages missing in the active product's list but existing in
other products in the same workbench will be added at the most logical
place.</li>
</ul>
<p><font color="#800000">[Note: the above currently does not work - only active
product intro data is consulted]</font></p>
<H3>Following links from the main Welcome pages</H3>
<p>Most of the extensions coming into the main Welcome pages offer links to open
further pages contributed by the extensions themselves. It is recommended to
create these pages in such a way as to continue with the shared Welcome visual
design. The main requirement is to show the appropriate navigator at the top of
the page.</p>
<p>It is fairly easy to do that using the 'include' element. The idea is to
include the navigation content at the beginning of contributed page. Unlike the
current Welcome implementation, shared Welcome main pages have navigation
section that is different for each page. For this reason, pages that branch off
these pages should include the navigation from the parent page. For example:</p>
<blockquote>
<pre>&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?&gt;
&lt;introContent&gt;
&lt;extensionContent id=&quot;extra&quot; name=&quot;Extra&quot; alt-style=&quot;css/swt.properties&quot; style=&quot;css/overview.css&quot; path=&quot;overview/@&quot;&gt;
&lt;link label=&quot;Extra Overview link&quot; url=&quot;<a href="http://org.eclipse.ui.intro/showPage?id=extraOverview">http://org.eclipse.ui.intro/showPage?id=extraOverview</a>&quot;
id=&quot;extra-overview&quot;&gt;
&lt;text&gt;Showing the third-level extra page for overview&lt;/text&gt;
&lt;/link&gt;
&lt;/extensionContent&gt;
&lt;page id=&quot;extraOverview&quot; <b>style=&quot;$theme$/html/overview.css&quot;</b> style-id=&quot;page&quot;&gt;
<b>&lt;title style-id=&quot;intro-header&quot;&gt;$introTitle$&lt;/title&gt;</b>
<b>&lt;group id=&quot;extra-group1&quot; filteredFrom=&quot;swt&quot;/&gt;</b>
<b>&lt;include path=&quot;overview/navigation-links&quot;/&gt;</b>
&lt;group id=&quot;page-content&quot;&gt;
&lt;group id=&quot;content-header&quot; label=&quot;EXTRA OVERVIEW&quot; filteredFrom=&quot;swt&quot;&gt;
&lt;/group&gt;
&lt;text style-id=&quot;page-title&quot; id=&quot;page-title&quot; filteredFrom=&quot;html&quot;&gt;EXTRA OVERVIEW&lt;/text&gt;
&lt;text style-id=&quot;page-description&quot; id=&quot;page-description&quot;&gt;Extra overview page description.&lt;/text&gt;
&lt;!-- Add content here --&gt;
&lt;/group&gt;
&lt;/page&gt;
&lt;/introContent&gt;</pre>
</blockquote>
<p>The extension above contributed into the overview page contributes a link
that shows another page whose definition is part of the extension. Note how we
define the title element using substitution variable (the variable will be
resolved based on the product property). We also include the group 'navigation-links' that belongs to the 'overview' page at the
beginning of the page content definition. We also add the 'extra-group1' div
because it is can be used by some themes for adding additional page decoration
(indeed, it is used in 'Purple Mesh' theme for that exact purpose).</p>
<h2><a name="enhancements"></a>Enhancements of the Welcome framework in 3.2</h2>
<p>In order to make universal welcome possible, we made a number of enhancements
in the
Welcome framework. These enhancements are of general nature and are are
applicable to other Welcome implementations:</p>
<ul>
<li><b>configurer</b> attribute added to config element in
'org.eclipse.ui.intro.config' extension point. The variable allows for
plugging in an optional configurer that extends <b>
org.eclipse.ui.intro.config.IntroCofigurer</b> abstract class. This supports
provides for computed group content, substitution variables, target path
resolution etc.</li>
<li><b>computed</b> attribute added to the <code>group</code> element in
the intro content schema. This attribute indicates that the children of the
group will be dynamically computed by the intro configurer.</li>
<li><b>computed</b> attribute added to the <code>launchBar</code> element in
the <b>org.eclipse.ui.intro.config </b>extension point. When true, the
shortcuts will be computed by the intro configurer.</li>
<li><b>bgImage</b> attribute added to the <code>group</code> and <code>page</code>
elements in the intro content schema. It provides for setting the background
image on these elements.</li>
<li><b>id</b> and <b>name</b> attributes added to the extensionContent
element in the intro content schema (see above for explanation).</li>
<li><b>expandable</b> boolean attribute added to the <code>group</code>
element. If <code>true</code>, the group will have the ability to expand and
collapse its children by selecting the title and/or the toggle button.</li>
<li>new element <b>hr</b> to be used for horizontal separators in the
content. Separator style is controlled by the active theme.</li>
</ul>
<h4>Welcome Themes</h4>
<p>New in 3.2 is support for Welcome themes. Themes can be plugged is using the
new element that is part of org.eclipse.ui.intro.configExtension extension
point. Plug-in org.eclipse.ui.intro.universal plugs in two themes:</p>
<pre> &lt;extension
point=&quot;org.eclipse.ui.intro.configExtension&quot;&gt;
&lt;theme
default=&quot;true&quot;
id=&quot;org.eclipse.ui.intro.universal.circles&quot;
name=&quot;%theme.name.circles&quot;
path=&quot;$nl$/themes/circles&quot;
previewImage=&quot;themes/circles/preview.png&quot;&gt;
&lt;property name=&quot;launchbarBackground&quot;
value=&quot;#a1c2cb&quot;/&gt;
&lt;property name=&quot;launchbarOverviewIcon&quot;
value=&quot;$theme$graphics/launchbar/overview16.png&quot;/&gt;
&lt;property name=&quot;launchbarFirststepsIcon&quot;
value=&quot;$theme$graphics/launchbar/firststeps16.png&quot;/&gt;
&lt;property name=&quot;launchbarTutorialsIcon&quot;
value=&quot;$theme$graphics/launchbar/tutorials16.png&quot;/&gt;
&lt;property name=&quot;launchbarSamplesIcon&quot;
value=&quot;$theme$graphics/launchbar/samples16.png&quot;/&gt;
&lt;property name=&quot;launchbarWhatsnewIcon&quot;
value=&quot;$theme$graphics/launchbar/whatsnew16.png&quot;/&gt;
&lt;property name=&quot;launchbarMigrateIcon&quot;
value=&quot;$theme$graphics/launchbar/migrate16.png&quot;/&gt;
&lt;property name=&quot;launchbarWebresourcesIcon&quot;
value=&quot;$theme$graphics/launchbar/webresources16.png&quot;/&gt;
&lt;/theme&gt;
&lt;theme
id=&quot;org.eclipse.ui.intro.universal.purpleMesh&quot;
name=&quot;%theme.name.purpleMesh&quot;
path=&quot;$nl$/themes/purpleMesh&quot;
previewImage=&quot;themes/purpleMesh/preview.png&quot;&gt;
&lt;property name=&quot;launchbarBackground&quot;
value=&quot;#c6c3e8&quot;/&gt;
&lt;property name=&quot;launchbarOverviewIcon&quot;
value=&quot;$theme$graphics/launchbar/overview.gif&quot;/&gt;
&lt;property name=&quot;launchbarFirststepsIcon&quot;
value=&quot;$theme$graphics/launchbar/firststeps16.png&quot;/&gt;
&lt;property name=&quot;launchbarTutorialsIcon&quot;
value=&quot;$theme$graphics/launchbar/tutorials.gif&quot;/&gt;
&lt;property name=&quot;launchbarSamplesIcon&quot;
value=&quot;$theme$graphics/launchbar/samples.gif&quot;/&gt;
&lt;property name=&quot;launchbarWhatsnewIcon&quot;
value=&quot;$theme$graphics/launchbar/whatsnew.gif&quot;/&gt;
&lt;property name=&quot;launchbarMigrateIcon&quot;
value=&quot;$theme$graphics/launchbar/migrate16.png&quot;/&gt;
&lt;property name=&quot;launchbarWebresourcesIcon&quot;
value=&quot;$theme$graphics/launchbar/webresources16.png&quot;/&gt;
&lt;/theme&gt;
&lt;/extension&gt;</pre>
<p>Each theme has a unique identifier, translatable name, preview image and a
path to the root theme folder. Intro plug-in does not provide any UI for theme
manipulation. The only way to select a theme is via the preference
org.eclipse.ui.intro/INTRO_THEME in plugin_customization.ini. </p>
<p>Theme support by itself does not make intro implementations theme-enabled. It
is simply a way of grouping all the presentation files (styles and images) in
one place that can be pointed at or switched as one. Concrete intro
implementations can choose to expose themes in a more substantial way (and in
fact Universal Welcome implementation does exactly that).</p>
<p>Theme-enabled intro implementation must make all the references to style and
presentation resources using the $theme$ substitution variable. Absolute paths
for images, pages, styles etc. will be computed by resolving the substitution
variable using the path of the currently active theme.</p>
<p>&nbsp;</p>
</BODY></HTML>