Initial Import
diff --git a/presentations/eclipse-con/2008/plugins/org.eclipse.browser.cheatsheets/.project b/presentations/eclipse-con/2008/plugins/org.eclipse.browser.cheatsheets/.project
new file mode 100644
index 0000000..e5a4ce6
--- /dev/null
+++ b/presentations/eclipse-con/2008/plugins/org.eclipse.browser.cheatsheets/.project
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipsecon.cheatsheets</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+	</natures>
+</projectDescription>
diff --git a/presentations/eclipse-con/2008/plugins/org.eclipse.browser.cheatsheets/META-INF/MANIFEST.MF b/presentations/eclipse-con/2008/plugins/org.eclipse.browser.cheatsheets/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..efba518
--- /dev/null
+++ b/presentations/eclipse-con/2008/plugins/org.eclipse.browser.cheatsheets/META-INF/MANIFEST.MF
@@ -0,0 +1,11 @@
+Manifest-Version: 1.0
+Ant-Version: Apache Ant 1.7.0
+Created-By: 1.6.0_01-b06 (Sun Microsystems Inc.)
+Bundle-ManifestVersion: 2
+Bundle-Name: %Bundle-Name.0
+Bundle-SymbolicName: org.eclipse.browser.cheatsheets;singleton:=true
+Bundle-Version: 2.0.0
+Require-Bundle: org.eclipse.ui.cheatsheets
+Bundle-Vendor: %Bundle-Vendor.0
+Bundle-Localization: plugin
+
diff --git a/presentations/eclipse-con/2008/plugins/org.eclipse.browser.cheatsheets/build.properties b/presentations/eclipse-con/2008/plugins/org.eclipse.browser.cheatsheets/build.properties
new file mode 100644
index 0000000..78166e3
--- /dev/null
+++ b/presentations/eclipse-con/2008/plugins/org.eclipse.browser.cheatsheets/build.properties
@@ -0,0 +1,4 @@
+bin.includes = META-INF/,\
+               plugin.xml,\
+               cheatsheets/,\
+               plugin.properties
diff --git a/presentations/eclipse-con/2008/plugins/org.eclipse.browser.cheatsheets/cheatsheets/Part_I/view-extension.xml b/presentations/eclipse-con/2008/plugins/org.eclipse.browser.cheatsheets/cheatsheets/Part_I/view-extension.xml
new file mode 100644
index 0000000..0b78fab
--- /dev/null
+++ b/presentations/eclipse-con/2008/plugins/org.eclipse.browser.cheatsheets/cheatsheets/Part_I/view-extension.xml
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<cheatsheet title="Create the Eclipse Browser view">
+   <intro>
+      <description>
+         This cheat sheet will demonstrate how to import, modify and test the Eclipse Browser plug-in.
+<br/>
+<br/>
+To learn more about using cheat sheets, click the help button in the top right corner (?).
+      </description>
+   </intro>
+   <item title="Open the Plug-in Development perspective" dialog="false" skip="true" href="/org.eclipse.pde.doc.user/guide/tools/views/views.htm">
+      <description>
+         To open the plug-in development perspective, select <b>Window-&gt;Open Perspective-&gt;Other...</b> and choose <b>Plug-in Development</b>.
+<br/>
+<br/>
+Alternatively, click the following button to perform the task:
+      </description>
+      <command serialization="org.eclipse.ui.perspectives.showPerspective(org.eclipse.ui.perspectives.showPerspective.perspectiveId=org.eclipse.pde.ui.PDEPerspective)" confirm="false">
+      </command>
+   </item>
+   <item title="Import the Eclipse Browser plug-in" dialog="true" skip="false" href="/org.eclipse.pde.doc.user/guide/tools/import_wizards/import_plugins.htm">
+      <description>
+         To import the sample plug-in for this tutorial, perform the following steps:
+      </description>
+      <subitem label="Select &quot;File-&gt;Import...&quot; from the main menu to bring up the Import wizard.  Expand the &quot;Plug-in Development&quot; category, and choose &quot;Plug-ins and Fragments&quot;.  Press &quot;Next&quot;." skip="true">
+         <command serialization="org.eclipse.ui.file.import(importWizardId=org.eclipse.pde.ui.PluginImportWizard)" confirm="false">
+         </command>
+      </subitem>
+      <subitem label="Select the &quot;Projects with source folders&quot; radio button in the &quot;Import As&quot; section towards the bottom of the page.  Press &quot;Next&quot;." skip="false">
+      </subitem>
+      <subitem label="Select the &quot;org.eclipse.browser&quot; plug-in in the &quot;Plug-ins and Fragments found&quot; table.  Click the &quot;Add--&gt;&quot; button to move it to the table on the right .  Press &quot;Finish&quot;." skip="false">
+      </subitem>
+   </item>
+   <item title="Open the plug-in manifest editor" dialog="false" skip="true" href="/org.eclipse.pde.doc.user/guide/tools/editors/manifest_editor/editor.htm">
+      <description>
+         Expand the <b>org.eclipse.browser</b> project in the <b>Package Explorer</b> view and double-click on the <b>plugin.xml</b> file.
+         <br/>
+         <br/>
+Alternatively, click the following button to perform the task:
+      </description>
+      <command serialization="org.eclipse.ui.navigate.openResource(filePath=/org.eclipse.browser/plugin.xml)" confirm="false">
+      </command>
+   </item>
+   <item title="Define a view extension" dialog="true" skip="false" href="/org.eclipse.pde.doc.user/guide/tools/editors/manifest_editor/extensions.htm">
+      <description>
+         To define a view extension, perform the following steps:
+      </description>
+      <subitem label="On the &quot;Extensions&quot; page of the plug-in manifest editor, press the &quot;Add...&quot; button to open the &quot;New Extension&quot; wizard." skip="false">
+      </subitem>
+      <subitem label="Select &quot;org.eclipse.ui.views&quot; from the &quot;Extension Points&quot; list box and press &quot;Finish&quot;." skip="false">
+      </subitem>
+      <subitem label="Right-click on the &quot;org.eclipse.ui.views&quot; node and select &quot;New-&gt;view&quot; from the context menu." skip="false">
+      </subitem>
+      <subitem label="Replace the content of the &quot;id&quot; text box under &quot;Extension Element Details&quot; with &quot;org.eclipse.browser.view&quot;." skip="false">
+      </subitem>
+      <subitem label="Replace the content of the &quot;name&quot; text box with &quot;Eclipse Browser&quot;." skip="false">
+      </subitem>
+      <subitem label="Replace the content of the &quot;class&quot; text box with &quot;org.eclipse.browser.view.ui.EclipseBrowserView&quot;." skip="false">
+      </subitem>
+      <subitem label="Replace the content of the &quot;icon&quot; text box with &quot;icons/eclipse_icon.gif&quot;." skip="false">
+      </subitem>
+      <subitem label="Select &quot;File-&gt;Save&quot; from the main menu." skip="false">
+      </subitem>
+   </item>
+   <item title="Test the plug-in" dialog="false" skip="false" href="/org.eclipse.pde.doc.user/guide/tools/launchers/eclipse_application_launcher.htm">
+      <description>
+         To test your plug-in, perform the following steps:
+      </description>
+      <subitem label="On the &quot;Overview&quot; page of the plug-in manifest editor, click the &quot;Launch an Eclipse application&quot; hyperlink under the &quot;Testing&quot; heading to launch a second instance of Eclipse." skip="false">
+      </subitem>
+      <subitem label="In the second Eclipse instance, dismiss the Intro by clicking on the &quot;Go to the Workbench&quot; image.  Select &quot;Window-&gt;Show View-&gt;Other...&quot; from the top level menu." skip="false">
+      </subitem>
+      <subitem label="Under the &quot;Other&quot; category, select the &quot;Eclipse Browser&quot; view and press OK.  This will open the Eclipse Browser view at the bottom right." skip="false">
+      </subitem>
+      <subitem label="Drag the Eclipse Browser view and stack it over the Outline view on the left of the workbench window." skip="false">
+      </subitem>
+      <subitem label="Explore the various sections of the view depicting the structure of the Eclipse Project.  Double-click on links and nodes to open the associated web pages in an embedded browser." skip="false">
+      </subitem>
+      <subitem label="Select &quot;File-&gt;Exit&quot; from the main menu to close the second Eclipse instance." skip="false">
+      </subitem>
+   </item>
+</cheatsheet>
diff --git a/presentations/eclipse-con/2008/plugins/org.eclipse.browser.cheatsheets/cheatsheets/Part_II/application-extension.xml b/presentations/eclipse-con/2008/plugins/org.eclipse.browser.cheatsheets/cheatsheets/Part_II/application-extension.xml
new file mode 100644
index 0000000..eb4c0ed
--- /dev/null
+++ b/presentations/eclipse-con/2008/plugins/org.eclipse.browser.cheatsheets/cheatsheets/Part_II/application-extension.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<cheatsheet title="Create an RCP application">
+   <intro>
+      <description>
+         This tutorial will demonstrate how to turn the Eclipse Browser plug-in into a minimal RCP application.
+<br/>
+<br/>
+To learn more about using cheat sheets, click the help button in the top right corner (?).
+      </description>
+   </intro>
+   <item title="Copy the Application class" dialog="true" skip="false">
+      <description>
+         The Application class is the entry point to the RCP application.  It has already been implemented for you.  To copy it, perform the following steps:
+      </description>
+      <subitem label="Expand the &quot;org.eclipse.browser/solutions/PartII&quot; folder and select the &apos;Application.java&apos; file inside that folder." skip="false">
+      </subitem>
+      <subitem label="Right-click on the Application.java file and select &apos;Copy&apos; from the context menu." skip="false">
+      </subitem>
+      <subitem label="Right-click on the &quot;org.eclipse.browser.application&quot; package under &apos;org.eclipse.browser/src&apos; and select &quot;Paste&quot; from the context menu." skip="false">
+      </subitem>
+   </item>
+   <item title="Open the plug-in manifest editor" dialog="false" skip="true" href="/org.eclipse.pde.doc.user/guide/tools/editors/manifest_editor/editor.htm">
+      <description>
+         To open the plug-in manifest editor (if it is not already open), expand the <b>org.eclipse.browser</b> tree in the <b>Package Explorer</b> view and double-click on the <b>plugin.xml</b> file.
+<br/>
+<br/>
+Alternatively, click the following button to perform the task:
+      </description>
+      <command serialization="org.eclipse.ui.navigate.openResource(filePath=/org.eclipse.browser/plugin.xml)" confirm="false">
+      </command>
+   </item>
+   <item title="Define an application extension" dialog="true" skip="false" href="/org.eclipse.pde.doc.user/guide/tools/editors/manifest_editor/extensions.htm">
+      <description>
+         To define an application extension, perform the following steps:
+      </description>
+      <subitem label="On the &quot;Extensions&quot; page of the plug-in manifest editor, press the &quot;Add...&quot; button to open the &quot;New Extension&quot; wizard." skip="false">
+      </subitem>
+      <subitem label="Select &quot;org.eclipse.core.runtime.applications&quot; from the &quot;Extension Points&quot; list box and press &quot;Finish&quot;." skip="false">
+      </subitem>
+      <subitem label="Make sure the &apos;org.eclipse.core.runtime.applications&apos; node is selected in the &apos;All Extensions&apos; viewer." skip="false">
+      </subitem>
+      <subitem label="In the &quot;Extension Details&quot; section, set the contents of the &quot;ID&quot; field to &quot;application&quot;" skip="false">
+      </subitem>
+      <subitem label="Right-click on the &quot;(application)&quot; node in the &quot;All Extensions&quot; section and select &quot;New-&gt;run&quot; from the context menu." skip="false">
+      </subitem>
+      <subitem label="Replace the content of the &quot;class&quot; text box with &quot;org.eclipse.browser.application.Application&quot;." skip="false">
+      </subitem>
+      <subitem label="Select &quot;File-&gt;Save&quot; from the main menu." skip="false">
+      </subitem>
+   </item>
+   <item title="Run the application" dialog="false" skip="false" href="/org.eclipse.pde.doc.user/guide/tools/launchers/eclipse_application_launcher.htm">
+      <description>
+         To run the RCP application,  perform the following steps:
+      </description>
+      <subitem label="On the &quot;Overview&quot; page of the plug-in manifest editor, click the &quot;Launch an Eclipse application&quot; hyperlink under the &quot;Testing&quot; heading to launch the RCP application." skip="false">
+      </subitem>
+      <subitem label="Note the standalone window containing File and Help menus, and the Eclipse Browser view occupies the entire window area.  This is your minimal RCP application." skip="false">
+      </subitem>
+      <subitem label="Select &quot;File-&gt;Exit&quot; from the main menu to exit the application." skip="false">
+      </subitem>
+   </item>
+</cheatsheet>
diff --git a/presentations/eclipse-con/2008/plugins/org.eclipse.browser.cheatsheets/cheatsheets/Part_II/product-export.xml b/presentations/eclipse-con/2008/plugins/org.eclipse.browser.cheatsheets/cheatsheets/Part_II/product-export.xml
new file mode 100644
index 0000000..a8c3d65
--- /dev/null
+++ b/presentations/eclipse-con/2008/plugins/org.eclipse.browser.cheatsheets/cheatsheets/Part_II/product-export.xml
@@ -0,0 +1,130 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<cheatsheet title="Create an Eclipse Product">
+   <intro>
+      <description>
+         This tutorial will demonstrate how to use the RCP tooling in PDE to create a fully-branded product.
+<br/>
+<br/>
+To learn more about using cheat sheets, click the help button in the top right corner (?).
+      </description>
+   </intro>
+   <item title="Create the product configuration" dialog="true" skip="false" href="/org.eclipse.pde.doc.user/guide/tools/file_wizards/new_product_config.htm">
+      <description>
+         To create the product configuration, perform the following steps:
+      </description>
+      <subitem label="Select &quot;File-&gt;New-&gt;Product Configuration&quot; from the main menu to bring up the &quot;New Product Configuration&quot; wizard." skip="true">
+         <command serialization="org.eclipse.ui.newWizard(newWizardId=org.eclipse.pde.ui.NewProductConfigurationWizard)" confirm="false">
+         </command>
+      </subitem>
+      <subitem label="In the &quot;New Product Configuration wizard&quot;, select the &quot;org.eclipse.browser&quot; project as the parent folder, then input &quot;browser.product&quot; into the &quot;File name&quot; text box.  Press &quot;Finish&quot;." skip="false">
+      </subitem>
+   </item>
+   <item title="Define the product" dialog="true" skip="false" href="/org.eclipse.pde.doc.user/guide/tools/editors/product_editor/overview.htm">
+      <description>
+         To define the product, perform the following steps:
+      </description>
+      <subitem label="On the &quot;Overview&quot; page of the product editor, input &quot;Eclipse Browser Product&quot; into the &quot;Product Name&quot; text box." skip="false">
+      </subitem>
+      <subitem label="Press the &quot;New...&quot; button next to the &quot;Product ID&quot; drop down menu to open the &quot;New Product Definition&quot; dialog box." skip="false">
+      </subitem>
+      <subitem label="Select &quot;org.eclipse.browser.application&quot; from the list of available applications in the &quot;Application&quot; section.  Press &quot;Finish&quot;." skip="false">
+      </subitem>
+   </item>
+   <item title="Specify the constituent plug-ins" dialog="false" skip="false" href="/org.eclipse.pde.doc.user/guide/tools/editors/product_editor/configuration.htm">
+      <description>
+         To specify the plug-ins that make up the product, perform the following steps:
+      </description>
+      <subitem label="On the &quot;Configuration&quot; tab of the product editor, press &quot;Add...&quot; in the &quot;Plug-ins and Fragments&quot; section." skip="false">
+      </subitem>
+      <subitem label="In the plug-in selection dialog, select &quot;org.eclipse.browser&quot; and press OK." skip="false">
+      </subitem>
+      <subitem label="Press &quot;Add Required Plug-ins&quot; to include in the list all the plug-ins that need to be present for the org.eclipse.browser plug-in to run." skip="false">
+      </subitem>
+   </item>
+   <item title="Add window images" dialog="true" skip="false" href="/org.eclipse.pde.doc.user/guide/tools/editors/product_editor/branding.htm">
+      <description>
+         To add window images, perform the following steps:
+      </description>
+      <subitem label="Select the &quot;Branding&quot; page of the product editor." skip="false">
+      </subitem>
+      <subitem label="In the &quot;Window Images&quot; section, press the &quot;Browse...&quot; button adjacent to the &quot;16x16&quot; text box to select the &quot;/org.eclipse.browser/branding/world_16-16_windows.gif&quot; image.  Press &quot;OK&quot;." skip="false">
+      </subitem>
+      <subitem label="In the &quot;Window Images&quot; section, press the &quot;Browse...&quot; button adjacent to the &quot;32x32&quot; text box to select the &quot;/org.eclipse.browser/branding/world_32-32_windows.gif&quot; image.  Press &quot;OK&quot;." skip="false">
+      </subitem>
+   </item>
+   <item title="Customize the About dialog" dialog="true" skip="false" href="/org.eclipse.pde.doc.user/guide/tools/editors/product_editor/branding.htm">
+      <description>
+         To customize the About dialog, perform the following steps:
+      </description>
+      <subitem label="In the &quot;About Text&quot; section, press the &quot;Browse...&quot; button adjacent to the &quot;Image&quot; text box to select the &quot;/org.eclipse.browser/branding/world_about.gif&quot; image.  Press &quot;OK&quot;." skip="false">
+      </subitem>
+      <subitem label="In the &quot;Text&quot; area, input &quot;This is a blurb about my Eclipse Browser Product&quot;." skip="false">
+      </subitem>
+   </item>
+   <item title="Run the RCP product" dialog="false" skip="false" href="/org.eclipse.pde.doc.user/guide/tools/editors/product_editor/overview.htm">
+      <description>
+         To run the RCP product, perform the following steps:
+      </description>
+      <subitem label="Save the &quot;browser.product&quot; file via File &gt; Save from the main menu." skip="false">
+      </subitem>
+      <subitem label="On the &quot;Overview&quot; page of the product editor, click the &quot;Launch the product&quot; hyperlink under the &quot;Testing&quot; heading.  Note the splash screen upon launching." skip="false">
+      </subitem>
+      <subitem label="Note how the application window now has the title &quot;Eclipse Browser Product&quot;  in the title bar." skip="true">
+      </subitem>
+      <subitem label="Note how the application window has an image depicting the world in the top-left corner.  The same image appears in the task bar at the bottom." skip="true">
+      </subitem>
+      <subitem label="Press Alt-Tab (on Windows) to see your RCP application among the list of running applications, represented with a larger 48x48 icon." skip="true">
+      </subitem>
+      <subitem label="Bring up the &quot;About&quot; dialog by selecting &quot;Help &gt; About Eclipse Browser Product&quot; from the main menu of the application window.  Verify that you see your custom text and image in the &quot;About&quot; dialog." skip="false">
+      </subitem>
+      <subitem label="Exit the RCP application via &quot;File &gt; Exit&quot; from the main menu of the application window." skip="false">
+      </subitem>
+   </item>
+   <item title="Customize the launcher (Windows Only)" dialog="true" skip="false" href="/org.eclipse.pde.doc.user/guide/tools/editors/product_editor/launcher.htm">
+      <description>
+         To customize the launcher, perform the following steps:
+      </description>
+      <subitem label="Select the &quot;Launcher&quot; page of the product editor." skip="false">
+      </subitem>
+      <subitem label="Input &quot;browser&quot; into the &quot;Launcher Name&quot; text box under the &quot;Program Launcher&quot; heading." skip="false">
+      </subitem>
+      <subitem label="Select the &quot;win32&quot; tab under the &quot;Program Launcher&quot; heading and select the &quot;Use a single ICO file containing 7 images as specified above&quot; radio button." skip="true">
+      </subitem>
+      <subitem label="Press the &quot;Browse...&quot; button adjacent to the &quot;File&quot; text box to select the &quot;/org.eclipse.browser/branding/world_launcher.ico&quot; file.  Press &quot;OK&quot;." skip="true">
+      </subitem>
+      <subitem label="Select &quot;File-&gt;Save&quot; from the main menu." skip="false">
+      </subitem>
+   </item>
+   <item title="Export the product" dialog="true" skip="false" href="/org.eclipse.pde.doc.user/guide/tools/editors/product_editor/overview.htm">
+      <description>
+         To export the plug-in based product, perform the following steps:
+      </description>
+      <subitem label="Select the &quot;Overview&quot; page of the product editor." skip="false">
+      </subitem>
+      <subitem label="Click the &quot;Eclipse Product export wizard&quot; hyperlink under the &quot;Exporting&quot; heading to bring up the &quot;Eclipse Product&quot; export wizard." skip="true">
+         <command serialization="org.eclipse.ui.file.export(exportWizardId=org.eclipse.pde.ui.productExportWizard)" confirm="false">
+         </command>
+      </subitem>
+      <subitem label="Input &quot;browser&quot; in the &quot;Root directory&quot; text field contained in the &quot;Product Configuration&quot; section." skip="false">
+      </subitem>
+      <subitem label="Input a destination directory in the &quot;Directory&quot; text fiedl in the &quot;Destination&quot; section (e.g. &quot;C:\destination&quot; for Windows) and press &quot;Finish&quot;." skip="false">
+      </subitem>
+   </item>
+   <item title="Browse the finished product" dialog="true" skip="false">
+      <description>
+         To browse the exported plug-in based product directory, perform the following steps:
+      </description>
+      <subitem label="Navigate your file system to the destination directory specified in the previous step (e.g. &quot;C:\destination&quot; for Windows)" skip="false">
+      </subitem>
+      <subitem label="Note the presence of the &quot;browser&quot; subdirectory.  Expand it and examine the structure of your product.  A &quot;plugins&quot; subdirectory containing all plug-ins, a &quot;configuration&quot; containing metadata." skip="true">
+      </subitem>
+      <subitem label="Note the custom &quot;browser&quot; launcher with a branded icon (&quot;browser.exe&quot; on Windows)  at the root of the &quot;browser&quot; directory." skip="true">
+      </subitem>
+      <subitem label="Double-click on the &quot;browser&quot; executable to launch the product." skip="false">
+      </subitem>
+      <subitem label="Observe the RCP product you created that is fully executable outside the Eclipse workspace." skip="true">
+      </subitem>
+      <subitem label="Exit the product via &quot;File &gt; Exit&quot; from the main menu." skip="false">
+      </subitem>
+   </item>
+</cheatsheet>
diff --git a/presentations/eclipse-con/2008/plugins/org.eclipse.browser.cheatsheets/cheatsheets/Part_II/rcpapp-composite.xml b/presentations/eclipse-con/2008/plugins/org.eclipse.browser.cheatsheets/cheatsheets/Part_II/rcpapp-composite.xml
new file mode 100644
index 0000000..00e45ff
--- /dev/null
+++ b/presentations/eclipse-con/2008/plugins/org.eclipse.browser.cheatsheets/cheatsheets/Part_II/rcpapp-composite.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<compositeCheatsheet name="Create the Eclipse Browser RCP Application">
+   <taskGroup kind="set" name="Create the Eclipse Browser RCP application" skip="false">
+      <intro>
+         This cheat sheet will guide you through the individual steps to create a standalone fully-branded Eclipse Browser product using the Plug-in Development Environment (PDE).
+<br/>
+<br/>
+To assist you along the way, wizards and commands will be available for you to launch automatically.
+      </intro>
+      <onCompletion>
+         Congratulations!  You just created a standalone, fully-branded RCP product using PDE.
+      </onCompletion>
+      <task kind="cheatsheet" name="Create an RCP application" skip="false">
+         <intro>
+            This tutorial will demonstrate how to turn the Eclipse Browser plug-in into a minimal RCP application.
+         </intro>
+         <onCompletion>
+            Congratulations!  You just create an RCP application for the Eclipse Browser plug-in!
+         </onCompletion>
+         <param name="path" value="application-extension.xml">
+         </param>
+      </task>
+      <task kind="cheatsheet" name="Create an Eclipse Product" skip="false">
+         <intro>
+            This tutorial will demonstrate how to use the RCP tooling in PDE to create a fully-branded product.
+         </intro>
+         <onCompletion>
+            Congratulations!  You created a fully-branded standalone Eclipse product!
+         </onCompletion>
+         <param name="path" value="product-export.xml">
+         </param>
+      </task>
+   </taskGroup>
+</compositeCheatsheet>
diff --git a/presentations/eclipse-con/2008/plugins/org.eclipse.browser.cheatsheets/plugin.properties b/presentations/eclipse-con/2008/plugins/org.eclipse.browser.cheatsheets/plugin.properties
new file mode 100644
index 0000000..3aff1be
--- /dev/null
+++ b/presentations/eclipse-con/2008/plugins/org.eclipse.browser.cheatsheets/plugin.properties
@@ -0,0 +1,3 @@
+# properties file for org.eclipsecon.cheatsheets
+Bundle-Vendor.0 = Eclipse.org
+Bundle-Name.0 = Eclipse Browser Cheatsheets Plug-in
\ No newline at end of file
diff --git a/presentations/eclipse-con/2008/plugins/org.eclipse.browser.cheatsheets/plugin.xml b/presentations/eclipse-con/2008/plugins/org.eclipse.browser.cheatsheets/plugin.xml
new file mode 100644
index 0000000..96da382
--- /dev/null
+++ b/presentations/eclipse-con/2008/plugins/org.eclipse.browser.cheatsheets/plugin.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.2"?>
+<plugin>
+   <extension
+         point="org.eclipse.ui.cheatsheets.cheatSheetContent">
+      <cheatsheet
+            category="org.eclipse.browser.cheatsheets.category"
+            contentFile="cheatsheets/Part_I/view-extension.xml"
+            id="org.eclipse.browser.cheatsheets.view"
+            name="Part I: Creating the Eclipse Browser Plug-in">
+         <description>
+            This cheat sheet helps you to create a plug-in that contributes an Eclipse Browser view to the Eclipse SDK.
+         </description>
+      </cheatsheet>
+   </extension>
+   <extension
+         point="org.eclipse.ui.cheatsheets.cheatSheetContent">
+       <cheatsheet
+            category="org.eclipse.browser.cheatsheets.category"
+            composite="true"
+            contentFile="cheatsheets/Part_II/rcpapp-composite.xml"
+            id="org.eclipse.browser.cheatsheets.rcp"
+            name="Part II: Creating the Eclipse Browser RCP Application">
+          <description>
+             This cheat sheet helps you to create a standalone, fully-branded Eclipse Browser rich client application.
+          </description>
+      </cheatsheet>
+   </extension>
+   <extension
+         point="org.eclipse.ui.cheatsheets.cheatSheetContent">
+      <category
+            id="org.eclipse.browser.cheatsheets.category"
+            name="Fundamentals of Plug-in and RCP Development">
+      </category>
+   </extension>
+
+</plugin>
diff --git a/presentations/eclipse-con/2008/plugins/org.eclipse.browser/.classpath b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/.classpath
new file mode 100644
index 0000000..52165ec
--- /dev/null
+++ b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src/"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.4"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/presentations/eclipse-con/2008/plugins/org.eclipse.browser/.project b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/.project
new file mode 100644
index 0000000..d97fa86
--- /dev/null
+++ b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipsecon.browser</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.pde.PluginNature</nature>
+	</natures>
+</projectDescription>
diff --git a/presentations/eclipse-con/2008/plugins/org.eclipse.browser/.settings/org.eclipse.jdt.core.prefs b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..ff0be22
--- /dev/null
+++ b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+#Sun May 20 20:53:59 EDT 2007
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2
+org.eclipse.jdt.core.compiler.compliance=1.4
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=warning
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=warning
+org.eclipse.jdt.core.compiler.source=1.3
diff --git a/presentations/eclipse-con/2008/plugins/org.eclipse.browser/META-INF/MANIFEST.MF b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..404afac
--- /dev/null
+++ b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/META-INF/MANIFEST.MF
@@ -0,0 +1,19 @@
+Manifest-Version: 1.0
+Ant-Version: Apache Ant 1.7.0
+Created-By: 1.6.0_01-b06 (Sun Microsystems Inc.)
+Bundle-ManifestVersion: 2
+Bundle-Name: %bundle.name
+Bundle-SymbolicName: org.eclipse.browser;singleton:=true
+Bundle-Version: 1.0.0
+Bundle-Activator: org.eclipse.browser.view.BrowserPlugin
+Bundle-Localization: plugin
+Export-Package: org.eclipse.browser.application,org.eclipse.browser.vi
+ ew,org.eclipse.browser.view.model,org.eclipse.browser.view.ui,org.ecl
+ ipse.browser.view.ui.actions,org.eclipse.browser.view.ui.listeners,or
+ g.eclipse.browser.view.ui.providers,org.eclipse.browser.view.ui.secti
+ ons,org.eclipse.browser.view.util
+Require-Bundle: org.eclipse.ui,org.eclipse.core.runtime,org.eclipse.ui
+ .forms
+Bundle-RequiredExecutionEnvironment: J2SE-1.4
+Eclipse-LazyStart: true
+
diff --git a/presentations/eclipse-con/2008/plugins/org.eclipse.browser/branding/world_16-16_windows.gif b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/branding/world_16-16_windows.gif
new file mode 100644
index 0000000..9efc8bb
--- /dev/null
+++ b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/branding/world_16-16_windows.gif
Binary files differ
diff --git a/presentations/eclipse-con/2008/plugins/org.eclipse.browser/branding/world_32-32_windows.gif b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/branding/world_32-32_windows.gif
new file mode 100644
index 0000000..2345f74
--- /dev/null
+++ b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/branding/world_32-32_windows.gif
Binary files differ
diff --git a/presentations/eclipse-con/2008/plugins/org.eclipse.browser/branding/world_about.gif b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/branding/world_about.gif
new file mode 100644
index 0000000..633ad3d
--- /dev/null
+++ b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/branding/world_about.gif
Binary files differ
diff --git a/presentations/eclipse-con/2008/plugins/org.eclipse.browser/branding/world_launcher.ico b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/branding/world_launcher.ico
new file mode 100644
index 0000000..06ae1c4
--- /dev/null
+++ b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/branding/world_launcher.ico
Binary files differ
diff --git a/presentations/eclipse-con/2008/plugins/org.eclipse.browser/build.properties b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/build.properties
new file mode 100644
index 0000000..6bc0db7
--- /dev/null
+++ b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/build.properties
@@ -0,0 +1,12 @@
+source.. = src/
+bin.includes = META-INF/,\
+               branding/,\
+               build.properties,\
+               data/,\
+               icons/,\
+               .,\
+               plugin.properties,\
+               plugin.xml,\
+               schema/,\
+               solutions/,\
+               splash.bmp
diff --git a/presentations/eclipse-con/2008/plugins/org.eclipse.browser/data/eclipse_project_links.xml b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/data/eclipse_project_links.xml
new file mode 100644
index 0000000..98d065d
--- /dev/null
+++ b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/data/eclipse_project_links.xml
@@ -0,0 +1,174 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!-- Link -->	  
+<project 
+   name="Eclipse Project" 
+   link="http://www.eclipse.org/eclipse/"
+   description="Open source industry platform for the development of highly integrated tools"
+   xsi:noNamespaceSchemaLocation="project_links.xsd"
+   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+
+   <!-- Link -->	
+   <subproject 
+      name="Platform" 
+      link="http://www.eclipse.org/platform/"
+      description="Set of frameworks and common services">
+
+      <!-- Link -->		
+      <component 
+         name="Ant" 
+         link="http://dev.eclipse.org/viewcvs/index.cgi/platform-ant-home/main.html?view=co"
+         description="Platform Ant integration">
+      </component>		
+   		
+      <!-- Link -->		
+      <component 
+         name="Core" 
+         link="http://www.eclipse.org/eclipse/platform-core/"
+         description="Platform runtime and resource management">
+      </component>	
+
+      <!-- Link -->		
+      <component 
+         name="CVS" 
+         link="http://www.eclipse.org/eclipse/platform-cvs/"
+         description="Platform CVS integration">
+      </component>	
+      
+      <!-- Link -->		
+      <component 
+         name="Debug" 
+         link="http://www.eclipse.org/eclipse/debug/index.php"
+         description="Generic execution debug framework">
+      </component>	
+
+      <!-- Link -->		
+      <component 
+         name="Releng" 
+         link="http://www.eclipse.org/eclipse/platform-releng/index.html"
+         description="Release Engineering">
+      </component>	
+
+      <!-- Link -->		
+      <component 
+         name="Search" 
+         link="http://www.eclipse.org/eclipse/platform-search/"
+         description="Integrated search facility">
+      </component>	
+
+      <!-- Link -->		
+      <component 
+         name="SWT" 
+         link="http://www.eclipse.org/swt/"
+         description="Standard Widget Toolkit">
+      </component>	
+
+      <!-- Link -->		
+      <component 
+         name="Team/Compare" 
+         link="http://www.eclipse.org/eclipse/platform-team/"
+         description="Generic team and compare support frameworks">
+      </component>	
+
+      <!-- Link -->		
+      <component 
+         name="Text" 
+         link="http://www.eclipse.org/eclipse/platform-text/"
+         description="Text editor framework">
+      </component>	
+
+      <!-- Link -->		
+      <component 
+         name="User Assistance" 
+         link="http://www.eclipse.org/eclipse/platform-ua/main.html"
+         description="Help system, initial user experience, cheat sheets">
+      </component>	
+
+      <!-- Link -->		
+      <component 
+         name="UI" 
+         link="http://dev.eclipse.org/viewcvs/index.cgi/platform-ui-home/main.html?view=co"
+         description="Platform User Interface">
+      </component>	
+
+      <!-- Link -->		
+      <component 
+         name="Update" 
+         link="http://dev.eclipse.org/viewcvs/index.cgi/platform-update-home/main.html?view=co"
+         description="Dynamic update, install, and field service">
+      </component>	
+
+   </subproject>		
+
+   <!-- Link -->		
+   <subproject 
+      name="Equinox" 
+      link="http://www.eclipse.org/equinox/"
+      description="An OSGi framework for Eclipse">
+   </subproject>	
+   
+   <!-- Link -->		
+   <subproject 
+      name="JDT" 
+      link="http://www.eclipse.org/jdt/"
+      description="Java Development Tools">
+
+      <!-- Link -->		
+      <component 
+         name="APT" 
+         link="http://www.eclipse.org/jdt/apt/index.html"
+         description="Java 5.0 annotation processing infrastructure">
+      </component>
+
+      <!-- Link -->		
+      <component 
+         name="Core" 
+         link="http://www.eclipse.org/jdt/core/index.php"
+         description="Java IDE headless infrastructure">
+      </component>
+
+      <!-- Link -->		
+      <component 
+         name="Debug" 
+         link="http://www.eclipse.org/eclipse/debug/index.php"
+         description="Debug support for Java">
+      </component>
+
+      <!-- Link -->		
+      <component 
+         name="UI" 
+         link="http://www.eclipse.org/jdt/ui/index.php "
+         description="Java IDE User Interface">
+      </component>                  
+   
+   </subproject>	
+
+   <!-- Link -->		
+   <subproject 
+      name="PDE" 
+      link="http://www.eclipse.org/pde/"
+      description="Plug-in Development Environment">
+
+      <!-- Link -->		
+      <component 
+         name="Build" 
+         link="http://www.eclipse.org/pde/pde-build/"
+         description="PDE Build">
+      </component>
+
+      <!-- Link -->		
+      <component 
+         name="UI" 
+         link="http://www.eclipse.org/pde/pde-ui/"
+         description="PDE User Interface">
+      </component>
+   
+   </subproject>	      
+
+</project>
+
+
+
+
+	
+		
\ No newline at end of file
diff --git a/presentations/eclipse-con/2008/plugins/org.eclipse.browser/data/project_links.xsd b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/data/project_links.xsd
new file mode 100644
index 0000000..99e9fa3
--- /dev/null
+++ b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/data/project_links.xsd
@@ -0,0 +1,104 @@
+<?xml version="1.0"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+   <xs:annotation>
+      <xs:documentation xml:lang="en">
+         Schema for specifying project and component link hierarchies
+      </xs:documentation>
+   </xs:annotation>
+
+   <!-- Attributes ///////////////////////////////////////////////////////// -->
+
+   <xs:attributeGroup name="link_attributes">
+      <xs:attribute ref="name" use="required"/>
+      <xs:attribute ref="link" use="required"/>
+      <xs:attribute ref="description" use="required"/>
+   </xs:attributeGroup>
+
+   <xs:attribute 
+      name="name" 
+      type="xs:normalizedString">
+      <xs:annotation>
+         <xs:documentation xml:lang="en">
+            Attribute for specifying the project or component name
+         </xs:documentation>
+      </xs:annotation>
+   </xs:attribute>
+
+   <xs:attribute 
+      name="link" 
+      type="xs:anyURI">
+      <xs:annotation>
+         <xs:documentation xml:lang="en">
+            Attribute for specifying the URI to a project or component web site
+         </xs:documentation>
+      </xs:annotation>
+   </xs:attribute>
+
+   <xs:attribute 
+      name="description" 
+      type="xs:normalizedString">
+      <xs:annotation>
+         <xs:documentation xml:lang="en">
+            Attribute for specifying the project or component description
+         </xs:documentation>
+      </xs:annotation>
+   </xs:attribute>
+
+   <!-- Elements /////////////////////////////////////////////////////////// -->
+
+   <xs:element 
+      name="link_element" 
+      abstract="true"/>
+
+   <xs:element 
+      name="project"
+      substitutionGroup="link_element">
+      <xs:annotation>
+         <xs:documentation xml:lang="en">
+            Element for specifying a project containing one or more sub-projects
+         </xs:documentation>
+      </xs:annotation>
+      <xs:complexType>
+         <xs:sequence>
+            <xs:element ref="subproject" minOccurs="0" maxOccurs="unbounded"/>
+         </xs:sequence>
+         <xs:attributeGroup ref="link_attributes"/>
+      </xs:complexType>
+   </xs:element>
+
+   <xs:element 
+      name="subproject"
+      substitutionGroup="link_element">
+      <xs:annotation>
+         <xs:documentation xml:lang="en">
+            Element for specifying a sub-project containing one or more 
+            sub-projects or components
+         </xs:documentation>
+      </xs:annotation>
+      <xs:complexType>
+         <xs:sequence>
+            <xs:element ref="subproject" minOccurs="0" maxOccurs="unbounded"/>
+            <xs:element ref="component" minOccurs="0" maxOccurs="unbounded"/>
+         </xs:sequence>
+         <xs:attributeGroup ref="link_attributes"/>
+      </xs:complexType>
+   </xs:element>
+
+   <xs:element 
+      name="component"
+      substitutionGroup="link_element">
+      <xs:annotation>
+         <xs:documentation xml:lang="en">
+            Element for specifying a component containing one or more components
+         </xs:documentation>
+      </xs:annotation>
+      <xs:complexType>
+         <xs:sequence>
+            <xs:element ref="component" minOccurs="0" maxOccurs="unbounded"/>
+         </xs:sequence>
+         <xs:attributeGroup ref="link_attributes"/>
+      </xs:complexType>
+   </xs:element>
+
+</xs:schema>
diff --git a/presentations/eclipse-con/2008/plugins/org.eclipse.browser/icons/collapse_all_mini.gif b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/icons/collapse_all_mini.gif
new file mode 100644
index 0000000..e53f3b5
--- /dev/null
+++ b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/icons/collapse_all_mini.gif
Binary files differ
diff --git a/presentations/eclipse-con/2008/plugins/org.eclipse.browser/icons/component_node.gif b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/icons/component_node.gif
new file mode 100644
index 0000000..f31a02a
--- /dev/null
+++ b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/icons/component_node.gif
Binary files differ
diff --git a/presentations/eclipse-con/2008/plugins/org.eclipse.browser/icons/discovery.gif b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/icons/discovery.gif
new file mode 100644
index 0000000..ec6cca4
--- /dev/null
+++ b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/icons/discovery.gif
Binary files differ
diff --git a/presentations/eclipse-con/2008/plugins/org.eclipse.browser/icons/eclipse_icon.gif b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/icons/eclipse_icon.gif
new file mode 100644
index 0000000..34fb3c9
--- /dev/null
+++ b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/icons/eclipse_icon.gif
Binary files differ
diff --git a/presentations/eclipse-con/2008/plugins/org.eclipse.browser/icons/eclipse_logo.png b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/icons/eclipse_logo.png
new file mode 100644
index 0000000..cbe6072
--- /dev/null
+++ b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/icons/eclipse_logo.png
Binary files differ
diff --git a/presentations/eclipse-con/2008/plugins/org.eclipse.browser/icons/external_browser.gif b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/icons/external_browser.gif
new file mode 100644
index 0000000..363ffaf
--- /dev/null
+++ b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/icons/external_browser.gif
Binary files differ
diff --git a/presentations/eclipse-con/2008/plugins/org.eclipse.browser/icons/google.gif b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/icons/google.gif
new file mode 100644
index 0000000..a024af5
--- /dev/null
+++ b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/icons/google.gif
Binary files differ
diff --git a/presentations/eclipse-con/2008/plugins/org.eclipse.browser/icons/project_node.gif b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/icons/project_node.gif
new file mode 100644
index 0000000..eb7b90c
--- /dev/null
+++ b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/icons/project_node.gif
Binary files differ
diff --git a/presentations/eclipse-con/2008/plugins/org.eclipse.browser/icons/subproject_node.gif b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/icons/subproject_node.gif
new file mode 100644
index 0000000..d71af7a
--- /dev/null
+++ b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/icons/subproject_node.gif
Binary files differ
diff --git a/presentations/eclipse-con/2008/plugins/org.eclipse.browser/plugin.properties b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/plugin.properties
new file mode 100644
index 0000000..4c0203b
--- /dev/null
+++ b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/plugin.properties
@@ -0,0 +1,21 @@
+###############################################################################
+# Copyright (c) 2006, 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
+###############################################################################
+bundle.name = Browser Plug-in
+category.name.browser = EclipseCon
+view.name = Eclipse Browser
+perspective.name = Main Perspective
+link.object.description.eclipse.downloads = Web site for downloading Eclipse distributions, SDKs and bundles
+link.object.name.eclipse.downloads = Eclipse Downloads
+link.object.description.eclipse.bugs = Web site for managing Eclipse project bug reports
+link.object.name.eclipse.bugs = Eclipse Bugs
+link.object.description.eclipsepedia = The Eclipse.org Wiki
+link.object.name.eclipsepedia = Eclipsepedia
+usefulLink.extPoint = Useful Links
\ No newline at end of file
diff --git a/presentations/eclipse-con/2008/plugins/org.eclipse.browser/plugin.xml b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/plugin.xml
new file mode 100644
index 0000000..a6ca583
--- /dev/null
+++ b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/plugin.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.2"?>
+<plugin>
+   <extension-point id="usefulLinks" name="%usefulLink.extPoint" schema="schema/usefulLinks.exsd"/>
+   <extension
+         point="org.eclipse.browser.usefulLinks">
+      <linkObject
+            link="http://www.eclipse.org/downloads/"
+            name="%link.object.name.eclipse.downloads"
+            description="%link.object.description.eclipse.downloads">
+      </linkObject>
+      <linkObject
+            link="https://bugs.eclipse.org/bugs/"
+            name="%link.object.name.eclipse.bugs"
+            description="%link.object.description.eclipse.bugs">
+      </linkObject>
+      <linkObject
+            link="http://wiki.eclipse.org/index.php/Main_Page"
+            name="%link.object.name.eclipsepedia"
+            description="%link.object.description.eclipsepedia">
+      </linkObject>         
+   </extension>
+   <extension
+         point="org.eclipse.ui.perspectives">
+      <perspective
+            class="org.eclipse.browser.application.Perspective"
+            icon="icons/eclipse_icon.gif"
+            id="org.eclipse.browser.perspective"
+            name="%perspective.name">
+      </perspective>
+   </extension>
+ 
+</plugin>
diff --git a/presentations/eclipse-con/2008/plugins/org.eclipse.browser/schema/usefulLinks.exsd b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/schema/usefulLinks.exsd
new file mode 100644
index 0000000..717a9ff
--- /dev/null
+++ b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/schema/usefulLinks.exsd
@@ -0,0 +1,146 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.browser">
+<annotation>
+      <appInfo>
+         <meta.schema plugin="org.eclipse.browser" id="usefulLinks" name="Useful Links"/>
+      </appInfo>
+      <documentation>
+         &lt;p&gt;
+This extension point is used to add additional links to the Useful Links section of the Links view.
+&lt;/p&gt;
+      </documentation>
+   </annotation>
+
+   <element name="extension">
+      <complexType>
+         <sequence minOccurs="1" maxOccurs="unbounded">
+            <element ref="linkObject"/>
+         </sequence>
+         <attribute name="point" type="string" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="id" type="string">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="name" type="string">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+               <appInfo>
+                  <meta.attribute translatable="true"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <element name="linkObject">
+      <complexType>
+         <sequence>
+         </sequence>
+         <attribute name="name" type="string" use="required">
+            <annotation>
+               <documentation>
+                  a translatable name to be displayed in the Links View.
+               </documentation>
+               <appInfo>
+                  <meta.attribute translatable="true"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+         <attribute name="link" type="string" use="required">
+            <annotation>
+               <documentation>
+                  URL of the link
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="description" type="string" use="required">
+            <annotation>
+               <documentation>
+                  A description of the link.
+               </documentation>
+               <appInfo>
+                  <meta.attribute translatable="true"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="since"/>
+      </appInfo>
+      <documentation>
+         1.0.0
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="examples"/>
+      </appInfo>
+      <documentation>
+         &lt;p&gt;
+The following is an example of the extension point:
+&lt;pre&gt;
+   &lt;extension
+         point=&quot;org.eclipse.browser.usefulLinks&quot;&gt;
+      &lt;linkObject
+            link=&quot;http://www.eclipse.org/downloads/&quot;
+            name=&quot;Eclipse Downloads&quot;&gt;
+         &lt;description&gt;
+            Web site for downloading Eclipse distributions, SDKs and bundles
+         &lt;/description&gt;
+      &lt;/linkObject&gt;
+   &lt;/extension&gt;
+&lt;/pre&gt;
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="apiInfo"/>
+      </appInfo>
+      <documentation>
+         
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="implementation"/>
+      </appInfo>
+      <documentation>
+         &lt;p&gt;
+The Browser plug-in&apos;s plugin.xml includes two usefulLinks extensions.
+&lt;/p&gt;
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="copyright"/>
+      </appInfo>
+      <documentation>
+         Copyright (c) 2007 IBM Corporation and others.
+&lt;br&gt;
+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 
+&lt;a href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;.
+      </documentation>
+   </annotation>
+
+</schema>
diff --git a/presentations/eclipse-con/2008/plugins/org.eclipse.browser/solutions/Exercise1a/plugin.xml b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/solutions/Exercise1a/plugin.xml
new file mode 100644
index 0000000..952c5f1
--- /dev/null
+++ b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/solutions/Exercise1a/plugin.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.2"?>
+<plugin>
+   <extension-point id="usefulLinks" name="%usefulLink.extPoint" schema="schema/usefulLinks.exsd"/>
+   <extension
+         point="org.eclipse.browser.usefulLinks">
+      <linkObject
+            link="http://www.eclipse.org/downloads/"
+            name="%link.object.name.eclipse.downloads">
+         <description>
+            %link.object.description.eclipse.downloads
+         </description>
+      </linkObject>
+      <linkObject
+            link="https://bugs.eclipse.org/bugs/"
+            name="%link.object.name.eclipse.bugs">
+         <description>
+			%link.object.description.eclipse.bugs         
+         </description>
+      </linkObject>
+      <linkObject
+            link="http://wiki.eclipse.org/index.php/Main_Page"
+            name="%link.object.name.eclipsepedia">
+         <description>
+            %link.object.description.eclipsepedia
+         </description>
+      </linkObject>         
+   </extension>
+   <extension
+         point="org.eclipse.ui.perspectives">
+      <perspective
+            class="org.eclipse.browser.application.Perspective"
+            icon="icons/eclipse_icon.gif"
+            id="org.eclipse.browser.perspective"
+            name="%perspective.name">
+      </perspective>
+   </extension>
+
+   <extension
+         point="org.eclipse.ui.views">
+      <view
+            class="org.eclipse.browser.view.ui.EclipseBrowserView"
+            icon="icons/eclipse_icon.gif"
+            id="org.eclipse.browser.view"
+            name="%view.name">
+      </view>
+   </extension>
+ 
+</plugin>
diff --git a/presentations/eclipse-con/2008/plugins/org.eclipse.browser/solutions/Exercise2a/plugin.xml b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/solutions/Exercise2a/plugin.xml
new file mode 100644
index 0000000..cff89c4
--- /dev/null
+++ b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/solutions/Exercise2a/plugin.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.2"?>
+<plugin>
+   <extension-point id="usefulLinks" name="%usefulLink.extPoint" schema="schema/usefulLinks.exsd"/>
+   <extension
+         point="org.eclipse.browser.usefulLinks">
+      <linkObject
+            link="http://www.eclipse.org/downloads/"
+            name="%link.object.name.eclipse.downloads">
+         <description>
+            %link.object.description.eclipse.downloads
+         </description>
+      </linkObject>
+      <linkObject
+            link="https://bugs.eclipse.org/bugs/"
+            name="%link.object.name.eclipse.bugs">
+         <description>
+			%link.object.description.eclipse.bugs         
+         </description>
+      </linkObject>
+      <linkObject
+            link="http://wiki.eclipse.org/index.php/Main_Page"
+            name="%link.object.name.eclipsepedia">
+         <description>
+            %link.object.description.eclipsepedia
+         </description>
+      </linkObject>         
+   </extension>
+   <extension
+         point="org.eclipse.ui.perspectives">
+      <perspective
+            class="org.eclipse.browser.application.Perspective"
+            icon="icons/eclipse_icon.gif"
+            id="org.eclipse.browser.perspective"
+            name="%perspective.name">
+      </perspective>
+   </extension>
+
+   <extension
+         point="org.eclipse.ui.views">
+      <view
+            class="org.eclipse.browser.view.ui.EclipseBrowserView"
+            icon="icons/eclipse_icon.gif"
+            id="org.eclipse.browser.view"
+            name="%view.name">
+      </view>
+   </extension>
+   <extension
+         id="application"
+         point="org.eclipse.core.runtime.applications">
+      <application>
+         <run
+               class="org.eclipse.browser.application.Application">
+         </run>
+      </application>
+   </extension>
+ 
+</plugin>
diff --git a/presentations/eclipse-con/2008/plugins/org.eclipse.browser/solutions/Exercise2b/browser.product b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/solutions/Exercise2b/browser.product
new file mode 100644
index 0000000..c6c57b4
--- /dev/null
+++ b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/solutions/Exercise2b/browser.product
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?pde version="3.1"?>
+
+<product name="Eclipse Browser Product" id="org.eclipse.browser.product" application="org.eclipse.browser.application" useFeatures="false">
+
+   <aboutInfo>
+      <image path="/org.eclipse.browser/branding/world_about.gif"/>
+      <text>
+         This is a blurb about my product.
+      </text>
+   </aboutInfo>
+
+   <configIni use="default"/>
+
+   <launcherArgs>
+   </launcherArgs>
+
+   <windowImages i16="/org.eclipse.browser/branding/world_16-16_windows.gif" i32="/org.eclipse.browser/branding/world_32-32_windows.gif"/>
+
+   <launcher name="browser">
+      <solaris/>
+      <win useIco="true">
+         <ico path="/org.eclipse.browser/branding/world_launcher.ico"/>
+         <bmp/>
+      </win>
+   </launcher>
+
+   <vm>
+   </vm>
+
+   <plugins>
+      <plugin id="com.ibm.icu"/>
+      <plugin id="org.eclipse.browser"/>
+      <plugin id="org.eclipse.core.commands"/>
+      <plugin id="org.eclipse.core.contenttype"/>
+      <plugin id="org.eclipse.core.expressions"/>
+      <plugin id="org.eclipse.core.jobs"/>
+      <plugin id="org.eclipse.core.runtime"/>
+      <plugin id="org.eclipse.core.runtime.compatibility.auth"/>
+      <plugin id="org.eclipse.core.runtime.compatibility.registry" fragment="true"/>
+      <plugin id="org.eclipse.equinox.common"/>
+      <plugin id="org.eclipse.equinox.preferences"/>
+      <plugin id="org.eclipse.equinox.registry"/>
+      <plugin id="org.eclipse.help"/>
+      <plugin id="org.eclipse.jface"/>
+      <plugin id="org.eclipse.osgi"/>
+      <plugin id="org.eclipse.swt"/>
+      <plugin id="org.eclipse.swt.win32.win32.x86" fragment="true"/>
+      <plugin id="org.eclipse.ui"/>
+      <plugin id="org.eclipse.ui.forms"/>
+      <plugin id="org.eclipse.ui.workbench"/>
+   </plugins>
+
+</product>
diff --git a/presentations/eclipse-con/2008/plugins/org.eclipse.browser/solutions/Exercise2b/plugin.xml b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/solutions/Exercise2b/plugin.xml
new file mode 100644
index 0000000..84e2ed0
--- /dev/null
+++ b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/solutions/Exercise2b/plugin.xml
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.2"?>
+<plugin>
+   <extension-point id="usefulLinks" name="%usefulLink.extPoint" schema="schema/usefulLinks.exsd"/>
+   <extension
+         point="org.eclipse.browser.usefulLinks">
+      <linkObject
+            link="http://www.eclipse.org/downloads/"
+            name="%link.object.name.eclipse.downloads">
+         <description>
+            %link.object.description.eclipse.downloads
+         </description>
+      </linkObject>
+      <linkObject
+            link="https://bugs.eclipse.org/bugs/"
+            name="%link.object.name.eclipse.bugs">
+         <description>
+			%link.object.description.eclipse.bugs         
+         </description>
+      </linkObject>
+      <linkObject
+            link="http://wiki.eclipse.org/index.php/Main_Page"
+            name="%link.object.name.eclipsepedia">
+         <description>
+            %link.object.description.eclipsepedia
+         </description>
+      </linkObject>         
+   </extension>
+   <extension
+         point="org.eclipse.ui.perspectives">
+      <perspective
+            class="org.eclipse.browser.application.Perspective"
+            icon="icons/eclipse_icon.gif"
+            id="org.eclipse.browser.perspective"
+            name="%perspective.name">
+      </perspective>
+   </extension>
+
+   <extension
+         point="org.eclipse.ui.views">
+      <view
+            class="org.eclipse.browser.view.ui.EclipseBrowserView"
+            icon="icons/eclipse_icon.gif"
+            id="org.eclipse.browser.view"
+            name="%view.name">
+      </view>
+   </extension>
+   <extension
+         id="application"
+         point="org.eclipse.core.runtime.applications">
+      <application>
+         <run
+               class="org.eclipse.browser.application.Application">
+         </run>
+      </application>
+   </extension>
+   <extension
+         id="product"
+         point="org.eclipse.core.runtime.products">
+      <product
+            application="org.eclipse.browser.application"
+            name="Eclipse Browser Product">
+         <property
+               name="appName"
+               value="Eclipse Browser Product">
+         </property>
+         <property
+               name="aboutImage"
+               value="branding/world_about.gif">
+         </property>
+         <property
+               name="aboutText"
+               value="This is a blurb about my product.">
+         </property>
+         <property
+               name="windowImages"
+               value="branding/world_16-16_windows.gif,branding/world_32-32_windows.gif">
+         </property>
+      </product>
+   </extension>
+
+</plugin>
diff --git a/presentations/eclipse-con/2008/plugins/org.eclipse.browser/solutions/Part_I/plugin.xml b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/solutions/Part_I/plugin.xml
new file mode 100644
index 0000000..952c5f1
--- /dev/null
+++ b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/solutions/Part_I/plugin.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.2"?>
+<plugin>
+   <extension-point id="usefulLinks" name="%usefulLink.extPoint" schema="schema/usefulLinks.exsd"/>
+   <extension
+         point="org.eclipse.browser.usefulLinks">
+      <linkObject
+            link="http://www.eclipse.org/downloads/"
+            name="%link.object.name.eclipse.downloads">
+         <description>
+            %link.object.description.eclipse.downloads
+         </description>
+      </linkObject>
+      <linkObject
+            link="https://bugs.eclipse.org/bugs/"
+            name="%link.object.name.eclipse.bugs">
+         <description>
+			%link.object.description.eclipse.bugs         
+         </description>
+      </linkObject>
+      <linkObject
+            link="http://wiki.eclipse.org/index.php/Main_Page"
+            name="%link.object.name.eclipsepedia">
+         <description>
+            %link.object.description.eclipsepedia
+         </description>
+      </linkObject>         
+   </extension>
+   <extension
+         point="org.eclipse.ui.perspectives">
+      <perspective
+            class="org.eclipse.browser.application.Perspective"
+            icon="icons/eclipse_icon.gif"
+            id="org.eclipse.browser.perspective"
+            name="%perspective.name">
+      </perspective>
+   </extension>
+
+   <extension
+         point="org.eclipse.ui.views">
+      <view
+            class="org.eclipse.browser.view.ui.EclipseBrowserView"
+            icon="icons/eclipse_icon.gif"
+            id="org.eclipse.browser.view"
+            name="%view.name">
+      </view>
+   </extension>
+ 
+</plugin>
diff --git a/presentations/eclipse-con/2008/plugins/org.eclipse.browser/solutions/Part_II/Application.java b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/solutions/Part_II/Application.java
new file mode 100644
index 0000000..44e4c62
--- /dev/null
+++ b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/solutions/Part_II/Application.java
@@ -0,0 +1,46 @@
+package org.eclipse.browser.application;
+
+import org.eclipse.equinox.app.IApplication;
+import org.eclipse.equinox.app.IApplicationContext;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * This class controls all aspects of the application's execution
+ */
+public class Application implements IApplication {
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.equinox.app.IApplication#start(org.eclipse.equinox.app.IApplicationContext)
+	 */
+	public Object start(IApplicationContext context) throws Exception {
+		Display display = PlatformUI.createDisplay();
+		try {
+			int returnCode = PlatformUI.createAndRunWorkbench(display, new BrowserWorkbenchAdvisor());
+			if (returnCode == PlatformUI.RETURN_RESTART)
+				return IApplication.EXIT_RESTART;
+			else
+				return IApplication.EXIT_OK;
+		} finally {
+			display.dispose();
+		}
+		
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.equinox.app.IApplication#stop()
+	 */
+	public void stop() {
+		final IWorkbench workbench = PlatformUI.getWorkbench();
+		if (workbench == null)
+			return;
+		final Display display = workbench.getDisplay();
+		display.syncExec(new Runnable() {
+			public void run() {
+				if (!display.isDisposed())
+					workbench.close();
+			}
+		});
+	}
+}
diff --git a/presentations/eclipse-con/2008/plugins/org.eclipse.browser/solutions/Part_II/browser.product b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/solutions/Part_II/browser.product
new file mode 100644
index 0000000..d2dba11
--- /dev/null
+++ b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/solutions/Part_II/browser.product
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?pde version="3.1"?>
+
+<product name="Eclipse Browser Product" id="org.eclipse.browser.product" application="org.eclipse.browser.application" useFeatures="false">
+
+   <aboutInfo>
+      <image path="/org.eclipse.browser/branding/world_about.gif"/>
+      <text>
+         This is a blurb about my product.
+      </text>
+   </aboutInfo>
+
+   <configIni use="default"/>
+
+   <launcherArgs>
+   </launcherArgs>
+
+   <windowImages i16="/org.eclipse.browser/branding/world_16-16_windows.gif" i32="/org.eclipse.browser/branding/world_32-32_windows.gif"/>
+
+   <launcher name="browser">
+      <solaris/>
+      <win useIco="true">
+         <ico path="/org.eclipse.browser/branding/world_launcher.ico"/>
+         <bmp/>
+      </win>
+   </launcher>
+
+   <vm>
+   </vm>
+
+   <plugins>
+      <plugin id="com.ibm.icu"/>
+      <plugin id="org.eclipse.browser"/>
+      <plugin id="org.eclipse.core.commands"/>
+      <plugin id="org.eclipse.core.contenttype"/>
+      <plugin id="org.eclipse.core.databinding"/>
+      <plugin id="org.eclipse.core.expressions"/>
+      <plugin id="org.eclipse.core.jobs"/>
+      <plugin id="org.eclipse.core.runtime"/>
+      <plugin id="org.eclipse.core.runtime.compatibility.registry" fragment="true"/>
+      <plugin id="org.eclipse.equinox.app"/>
+      <plugin id="org.eclipse.equinox.common"/>
+      <plugin id="org.eclipse.equinox.preferences"/>
+      <plugin id="org.eclipse.equinox.registry"/>
+      <plugin id="org.eclipse.help"/>
+      <plugin id="org.eclipse.jface"/>
+      <plugin id="org.eclipse.jface.databinding"/>
+      <plugin id="org.eclipse.osgi"/>
+      <plugin id="org.eclipse.swt"/>
+      <plugin id="org.eclipse.swt.win32.win32.x86" fragment="true"/>
+      <plugin id="org.eclipse.ui"/>
+      <plugin id="org.eclipse.ui.forms"/>
+      <plugin id="org.eclipse.ui.workbench"/>
+   </plugins>
+
+</product>
diff --git a/presentations/eclipse-con/2008/plugins/org.eclipse.browser/solutions/Part_II/plugin.xml b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/solutions/Part_II/plugin.xml
new file mode 100644
index 0000000..f76ef1e
--- /dev/null
+++ b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/solutions/Part_II/plugin.xml
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.2"?>
+<plugin>
+   <extension-point id="usefulLinks" name="%usefulLink.extPoint" schema="schema/usefulLinks.exsd"/>
+   <extension
+         point="org.eclipse.browser.usefulLinks">
+      <linkObject
+            link="http://www.eclipse.org/downloads/"
+            name="%link.object.name.eclipse.downloads">
+         <description>
+            %link.object.description.eclipse.downloads
+         </description>
+      </linkObject>
+      <linkObject
+            link="https://bugs.eclipse.org/bugs/"
+            name="%link.object.name.eclipse.bugs">
+         <description>
+			%link.object.description.eclipse.bugs         
+         </description>
+      </linkObject>
+      <linkObject
+            link="http://wiki.eclipse.org/index.php/Main_Page"
+            name="%link.object.name.eclipsepedia">
+         <description>
+            %link.object.description.eclipsepedia
+         </description>
+      </linkObject>         
+   </extension>
+   <extension
+         point="org.eclipse.ui.perspectives">
+      <perspective
+            class="org.eclipse.browser.application.Perspective"
+            icon="icons/eclipse_icon.gif"
+            id="org.eclipse.browser.perspective"
+            name="%perspective.name">
+      </perspective>
+   </extension>
+
+   <extension
+         point="org.eclipse.ui.views">
+      <view
+            class="org.eclipse.browser.view.ui.EclipseBrowserView"
+            icon="icons/eclipse_icon.gif"
+            id="org.eclipse.browser.view"
+            name="%view.name">
+      </view>
+   </extension>
+   <extension
+         id="application"
+         point="org.eclipse.core.runtime.applications">
+      <application>
+         <run
+               class="org.eclipse.browser.application.Application">
+         </run>
+      </application>
+   </extension>
+   <extension
+         id="product"
+         point="org.eclipse.core.runtime.products">
+      <product
+            application="org.eclipse.browser.application"
+            name="Eclipse Browser Product">
+         <property
+               name="appName"
+               value="Eclipse Browser Product">
+         </property>
+         <property
+               name="aboutImage"
+               value="branding/world_about.gif">
+         </property>
+         <property
+               name="aboutText"
+               value="This is a blurb about my product.">
+         </property>
+         <property
+               name="windowImages"
+               value="branding/world_16-16_windows.gif,branding/world_32-32_windows.gif">
+         </property>
+      </product>
+   </extension>
+ 
+</plugin>
diff --git a/presentations/eclipse-con/2008/plugins/org.eclipse.browser/splash.bmp b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/splash.bmp
new file mode 100644
index 0000000..a2c6103
--- /dev/null
+++ b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/splash.bmp
Binary files differ
diff --git a/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/application/Application.java b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/application/Application.java
new file mode 100644
index 0000000..da40027
--- /dev/null
+++ b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/application/Application.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Copyright (c) 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
+ *******************************************************************************/
+package org.eclipse.browser.application;
+
+import org.eclipse.core.runtime.IPlatformRunnable;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * This class controls all aspects of the application's execution
+ */
+public class Application implements IPlatformRunnable {
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.core.runtime.IPlatformRunnable#run(java.lang.Object)
+	 */
+	public Object run(Object args) throws Exception {
+		Display display = PlatformUI.createDisplay();
+		try {
+			int returnCode = PlatformUI.createAndRunWorkbench(display, new BrowserWorkbenchAdvisor());
+			if (returnCode == PlatformUI.RETURN_RESTART) {
+				return IPlatformRunnable.EXIT_RESTART;
+			}
+			return IPlatformRunnable.EXIT_OK;
+		} finally {
+			display.dispose();
+		}
+	}
+}
diff --git a/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/application/BrowserActionBarAdvisor.java b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/application/BrowserActionBarAdvisor.java
new file mode 100644
index 0000000..ecbb4ce
--- /dev/null
+++ b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/application/BrowserActionBarAdvisor.java
@@ -0,0 +1,68 @@
+/*******************************************************************************
+ * Copyright (c) 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
+ *******************************************************************************/
+package org.eclipse.browser.application;
+
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.ui.IWorkbenchActionConstants;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.actions.ActionFactory;
+import org.eclipse.ui.actions.ActionFactory.IWorkbenchAction;
+import org.eclipse.ui.application.ActionBarAdvisor;
+import org.eclipse.ui.application.IActionBarConfigurer;
+
+/**
+ * An action bar advisor is responsible for creating, adding, and disposing of
+ * the actions added to a workbench window. Each window will be populated with
+ * new actions.
+ */
+public class BrowserActionBarAdvisor extends ActionBarAdvisor {
+
+	// Actions - important to allocate these only in makeActions, and then use
+	// them
+	// in the fill methods. This ensures that the actions aren't recreated
+	// when fillActionBars is called with FILL_PROXY.
+	private IWorkbenchAction exitAction;
+	private IWorkbenchAction aboutAction;
+
+	public BrowserActionBarAdvisor(IActionBarConfigurer configurer) {
+		super(configurer);
+	}
+
+	protected void makeActions(final IWorkbenchWindow window) {
+		// Creates the actions and registers them.
+		// Registering is needed to ensure that key bindings work.
+		// Registering also provides automatic disposal of the actions when
+		// the window is closed.
+
+		exitAction = ActionFactory.QUIT.create(window);
+		register(exitAction);
+
+		aboutAction = ActionFactory.ABOUT.create(window);
+		register(aboutAction);
+	}
+
+	protected void fillMenuBar(IMenuManager menuBar) {
+		MenuManager fileMenu = new MenuManager("&File",
+				IWorkbenchActionConstants.M_FILE);
+		MenuManager helpMenu = new MenuManager("&Help",
+				IWorkbenchActionConstants.M_HELP);
+
+		menuBar.add(fileMenu);
+		menuBar.add(helpMenu);
+
+		// Add Exit action to 'File' menu
+		fileMenu.add(exitAction);
+		// Add 'About' action to 'Help' menu
+		helpMenu.add(aboutAction);
+	}
+
+}
diff --git a/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/application/BrowserWorkbenchAdvisor.java b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/application/BrowserWorkbenchAdvisor.java
new file mode 100644
index 0000000..a28905e
--- /dev/null
+++ b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/application/BrowserWorkbenchAdvisor.java
@@ -0,0 +1,27 @@
+/*******************************************************************************
+ * Copyright (c) 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
+ *******************************************************************************/
+package org.eclipse.browser.application;
+
+import org.eclipse.browser.view.BrowserPlugin;
+import org.eclipse.ui.application.IWorkbenchWindowConfigurer;
+import org.eclipse.ui.application.WorkbenchAdvisor;
+import org.eclipse.ui.application.WorkbenchWindowAdvisor;
+
+public class BrowserWorkbenchAdvisor extends WorkbenchAdvisor {
+
+    public WorkbenchWindowAdvisor createWorkbenchWindowAdvisor(IWorkbenchWindowConfigurer configurer) {
+        return new BrowserWorkbenchWindowAdvisor(configurer);
+    }
+
+	public String getInitialWindowPerspectiveId() {
+		return BrowserPlugin.PERSPECTIVE_ID;
+	}
+}
diff --git a/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/application/BrowserWorkbenchWindowAdvisor.java b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/application/BrowserWorkbenchWindowAdvisor.java
new file mode 100644
index 0000000..d2d39af
--- /dev/null
+++ b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/application/BrowserWorkbenchWindowAdvisor.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (c) 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
+ *******************************************************************************/
+package org.eclipse.browser.application;
+
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.ui.application.ActionBarAdvisor;
+import org.eclipse.ui.application.IActionBarConfigurer;
+import org.eclipse.ui.application.IWorkbenchWindowConfigurer;
+import org.eclipse.ui.application.WorkbenchWindowAdvisor;
+
+public class BrowserWorkbenchWindowAdvisor extends WorkbenchWindowAdvisor {
+
+    public BrowserWorkbenchWindowAdvisor(IWorkbenchWindowConfigurer configurer) {
+        super(configurer);
+    }
+
+    public ActionBarAdvisor createActionBarAdvisor(IActionBarConfigurer configurer) {
+        return new BrowserActionBarAdvisor(configurer);
+    }
+    
+    /**
+     * Standard procedure for setting size and title of RCP application
+     */
+    public void preWindowOpen() {
+        IWorkbenchWindowConfigurer configurer = getWindowConfigurer();
+        configurer.setInitialSize(new Point(400, 750));
+        configurer.setShowCoolBar(false);
+        configurer.setShowStatusLine(false);
+    }
+
+}
diff --git a/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/application/Perspective.java b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/application/Perspective.java
new file mode 100644
index 0000000..456bddb
--- /dev/null
+++ b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/application/Perspective.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 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
+ *******************************************************************************/
+package org.eclipse.browser.application;
+
+import org.eclipse.browser.view.BrowserPlugin;
+import org.eclipse.ui.IPageLayout;
+import org.eclipse.ui.IPerspectiveFactory;
+import org.eclipse.ui.IViewLayout;
+
+public class Perspective implements IPerspectiveFactory {
+
+	public void createInitialLayout(IPageLayout layout) {
+		layout.setEditorAreaVisible(false);
+		layout.setFixed(true);
+		
+		layout.addStandaloneView(BrowserPlugin.VIEW_ID, true, IPageLayout.LEFT, 1.0f, layout.getEditorArea());
+		IViewLayout vLayout = layout.getViewLayout(BrowserPlugin.VIEW_ID);
+		vLayout.setCloseable(false);
+	}
+
+}
diff --git a/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/BrowserMessages.java b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/BrowserMessages.java
new file mode 100644
index 0000000..686c1c7
--- /dev/null
+++ b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/BrowserMessages.java
@@ -0,0 +1,99 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 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
+ *******************************************************************************/
+
+package org.eclipse.browser.view;
+
+import org.eclipse.osgi.util.NLS;
+
+/**
+ * BrowserMessages
+ *
+ */
+public class BrowserMessages extends NLS {
+	
+	private static final String BUNDLE_NAME = "org.eclipse.browser.view.messages"; //$NON-NLS-1$
+
+	public static String CollapseAction_actionDescCollapseAll;
+
+	public static String CollapseAction_actionNameCollapseAll;
+
+	public static String LinkHandler_errorAttributeMissing;
+
+	public static String LinkHandler_errorUnrecognizedElement;
+
+	public static String EclipseBrowserView_errorMissingModelFile;
+
+	public static String EclipseBrowserView_errorModelLoad;
+
+	public static String EclipseBrowserView_sectionDescProjectLinks;
+
+	public static String EclipseBrowserView_sectionDescSearch;
+
+	public static String EclipseBrowserView_sectionDescUsefulLinks;
+
+	public static String EclipseBrowserView_sectionTitleProjectLinks;
+
+	public static String EclipseBrowserView_sectionTitleSearch;
+
+	public static String EclipseBrowserView_sectionTitleUsefulLinks;
+
+	public static String EclipseBrowserView_title;
+
+	public static String SearchSection_buttonNameSearch;
+
+	public static String ExternalBrowserAction_actionNameExternalBrowser;
+
+	public static String ExternalBrowserAction_toolTipExternalBrowser;
+
+	public static String FormTextHyperlinkListener_errorCannotResolveHref;
+
+	public static String GoogleSearchLinkManager_linkDescriptionGoogleSearch;
+
+	public static String GoogleSearchLinkManager_linkNameGoogleSearch;
+
+	public static String ImageLinkManager_linkDescEclipse;
+
+	public static String ImageLinkManager_linkDescGoogle;
+
+	public static String ImageLinkManager_linkNameEclipse;
+
+	public static String ImageLinkManager_linkNameGoogle;
+
+	public static String OpenLinkAction_actionNameOpenLink;
+
+	public static String OpenLinkAction_errorLinkAction;
+
+	public static String OpenLinkAction_errorUrlMalformed;
+
+	public static String OpenLinkAction_errorUrlNotSpecified;
+
+	public static String OpenLinkAction_errorWorkbenchInitialization;
+
+	public static String OpenLinkAction_toolTipOpenLink;
+
+	public static String UsefulLinkManager_errorRequiredAttributeMissing;
+
+	public static String UsefulLinkManager_errorMissingAttribute;
+
+	public static String UsefulLinkManager_defaultMsgDescriptionNotSpecified;
+	
+	static {
+		// initialize resource bundle
+		NLS.initializeMessages(BUNDLE_NAME, BrowserMessages.class);
+	}
+
+	/**
+	 * 
+	 */
+	private BrowserMessages() {
+		// NO-OP
+	}
+}
diff --git a/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/BrowserPlugin.java b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/BrowserPlugin.java
new file mode 100644
index 0000000..d3d2e8a
--- /dev/null
+++ b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/BrowserPlugin.java
@@ -0,0 +1,212 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 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
+ *******************************************************************************/
+
+package org.eclipse.browser.view;
+
+import java.lang.reflect.InvocationTargetException;
+
+import org.eclipse.browser.view.util.UsefulLinkManager;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.dialogs.ErrorDialog;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.resource.ImageRegistry;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The activator class controls the plug-in life cycle
+ */
+public class BrowserPlugin extends AbstractUIPlugin {
+	
+	public static String PERSPECTIVE_ID = "org.eclipse.browser.perspective"; //$NON-NLS-1$
+	public static String VIEW_ID = "org.eclipse.browser.view"; //$NON-NLS-1$
+
+	private static BrowserPlugin plugin;
+	
+	private UsefulLinkManager fUsefulLinkManager;
+	
+	/**
+	 * The constructor
+	 */
+	public BrowserPlugin() {
+		fUsefulLinkManager = null;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
+	 */
+	public void start(BundleContext context) throws Exception {
+		super.start(context);
+		plugin = this;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
+	 */
+	public void stop(BundleContext context) throws Exception {
+		plugin = null;
+		super.stop(context);
+	}
+
+	/**
+	 * Returns the shared instance
+	 *
+	 * @return the shared instance
+	 */
+	public static BrowserPlugin getDefault() {
+		return plugin;
+	}
+
+	/**
+	 * @return
+	 */
+	public static UsefulLinkManager getUsefulLinkManager() {
+		return getDefault().createUsefulLinkManager();
+	}
+	
+	/**
+	 * @return
+	 */
+	public UsefulLinkManager createUsefulLinkManager() {
+		if (fUsefulLinkManager == null) {
+			fUsefulLinkManager = new UsefulLinkManager();
+		}
+		return fUsefulLinkManager;
+	}
+	
+	/**
+	 * Returns an image descriptor for the image file at the given
+	 * plug-in relative path
+	 *
+	 * @param path the path
+	 * @return the image descriptor
+	 */
+	public static ImageDescriptor getImageDescriptor(String path) {
+		return imageDescriptorFromPlugin(getPluginID(), path);
+	}
+
+	/**
+	 * @param imagePath
+	 * @return
+	 */
+	public static Image getImage(String imagePath) {
+		ImageRegistry registry = getDefault().getImageRegistry();
+		
+		Image image = registry.get(imagePath);
+		
+		if (image != null) {
+			return image;
+		}
+		
+		ImageDescriptor descriptor = getImageDescriptor(imagePath);
+			
+		if (descriptor == null) {
+			return null;
+		}
+		
+		image = descriptor.createImage();
+		registry.put(imagePath, image);
+		
+		return image;
+	}		
+	
+	/**
+	 * @return
+	 */
+	public static String getPluginID() {
+		return getDefault().getBundle().getSymbolicName();
+	}
+	
+	/**
+	 * @return
+	 */
+	public static Shell getActiveWorkbenchShell() {
+		IWorkbenchWindow window = getActiveWorkbenchWindow();
+		if (window == null) {
+			return null;
+		}
+		return window.getShell();
+	}
+	
+	/**
+	 * @return
+	 */
+	public static IWorkbenchWindow getActiveWorkbenchWindow() {
+		return getDefault().getWorkbench().getActiveWorkbenchWindow();
+	}	
+
+	/**
+	 * @param title
+	 * @param message
+	 * @param e
+	 */
+	public static void openErrorDialog(String title, String message, IStatus status) {
+		ErrorDialog.openError(
+				getActiveWorkbenchShell(), 
+				title,
+				message,
+				status);
+	}	
+	
+	/**
+	 * @param title
+	 * @param message
+	 * @param e
+	 */
+	public static void logException(final String title,
+			String message, Throwable e) {
+		if (e instanceof InvocationTargetException) {
+			e = ((InvocationTargetException) e).getTargetException();
+		}
+		IStatus status = null;
+		if (e instanceof CoreException) {
+			status = ((CoreException) e).getStatus();
+		} else {
+			if (message == null) {
+				message = e.getMessage();
+			}
+			if (message == null) {
+				message = e.toString();
+			}
+			status = new Status(IStatus.ERROR, getPluginID(), IStatus.OK,
+					message, e);
+		}
+		Display display = getStandardDisplay();
+		final IStatus fstatus = status;
+		display.asyncExec(new Runnable() {
+			public void run() {
+				openErrorDialog(title, null, fstatus);
+			}
+		});
+	}	
+
+	/**
+	 * Returns the standard display to be used. The method first checks, if the
+	 * thread calling this method has an associated disaply. If so, this display
+	 * is returned. Otherwise the method returns the default display.
+	 */
+	public static Display getStandardDisplay() {
+		Display display;
+		display = Display.getCurrent();
+		if (display == null)
+			display = Display.getDefault();
+		return display;
+	}	
+	
+}
diff --git a/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/BrowserPluginImages.java b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/BrowserPluginImages.java
new file mode 100644
index 0000000..b79de8c
--- /dev/null
+++ b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/BrowserPluginImages.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 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
+ *******************************************************************************/
+
+package org.eclipse.browser.view;
+
+/**
+ * BrowserPluginImages
+ *
+ */
+public class BrowserPluginImages {
+
+	public static final String F_ICONS_PATH = "icons/"; //$NON-NLS-1$
+	
+	public static final String F_IMAGE_PATH_LINK = F_ICONS_PATH
+			+ "discovery.gif"; //$NON-NLS-1$	
+
+	public static final String F_IMAGE_PATH_ECLIPSE_LOGO = F_ICONS_PATH
+			+ "eclipse_logo.png"; //$NON-NLS-1$		
+
+	public static final String F_IMAGE_PATH_COLLAPSE = F_ICONS_PATH
+			+ "collapse_all_mini.gif"; //$NON-NLS-1$
+
+	public static final String F_IMAGE_PATH_EXTERNAL_BROWSER = F_ICONS_PATH
+			+ "external_browser.gif"; //$NON-NLS-1$
+
+	public static final String F_IMAGE_PATH_GOOGLE = F_ICONS_PATH
+			+ "google.gif"; //$NON-NLS-1$
+
+	public static final String F_IMAGE_PATH_PROJECT_NODE = F_ICONS_PATH
+			+ "project_node.gif"; //$NON-NLS-1$
+
+	public static final String F_IMAGE_PATH_SUBPROJECT_NODE = F_ICONS_PATH
+			+ "subproject_node.gif"; //$NON-NLS-1$
+
+	public static final String F_IMAGE_PATH_COMPONENT_NODE = F_ICONS_PATH
+			+ "component_node.gif"; //$NON-NLS-1$
+
+	/**
+	 * 
+	 */
+	private BrowserPluginImages() {
+		// NO-OP
+	}
+
+}
diff --git a/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/messages.properties b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/messages.properties
new file mode 100644
index 0000000..e5d4085
--- /dev/null
+++ b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/messages.properties
@@ -0,0 +1,42 @@
+###############################################################################
+# Copyright (c) 2005, 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
+###############################################################################
+LinkHandler_errorAttributeMissing=ERROR: Attribute missing
+EclipseBrowserView_sectionTitleUsefulLinks=Useful Links
+EclipseBrowserView_sectionDescUsefulLinks=Click on a link to open the associated web site in a browser.
+EclipseBrowserView_sectionTitleProjectLinks=Project Links
+EclipseBrowserView_sectionDescProjectLinks=Double-click on a node to open the associated web site in a browser.
+EclipseBrowserView_sectionTitleSearch=Search
+EclipseBrowserView_sectionDescSearch=Enter a query into the text field and press enter to perform a Google search.
+EclipseBrowserView_title=Eclipse Browser
+EclipseBrowserView_errorMissingModelFile=Cannot find model XML file: ''{0}''
+SearchSection_buttonNameSearch=Search
+EclipseBrowserView_errorModelLoad=Model load failure
+LinkHandler_errorUnrecognizedElement=ERROR: Unrecognized element: ''{0}''
+ExternalBrowserAction_actionNameExternalBrowser=Use External Browser
+ExternalBrowserAction_toolTipExternalBrowser=Use an external browser to open links
+OpenLinkAction_actionNameOpenLink=Open Link
+OpenLinkAction_toolTipOpenLink=Open the ''{0}'' link in a browser
+OpenLinkAction_errorLinkAction=Open link action failed
+OpenLinkAction_errorUrlNotSpecified=URL was not specified.
+OpenLinkAction_errorUrlMalformed=URL is malformed.
+OpenLinkAction_errorWorkbenchInitialization=Workbench part could not be initialized.
+CollapseAction_actionNameCollapseAll=Collapse All
+CollapseAction_actionDescCollapseAll=Collapse all tree nodes
+FormTextHyperlinkListener_errorCannotResolveHref=Cannot resolve hyperlink href 
+GoogleSearchLinkManager_linkNameGoogleSearch=Google Search
+GoogleSearchLinkManager_linkDescriptionGoogleSearch=Google search engine
+ImageLinkManager_linkNameEclipse=Eclipse
+ImageLinkManager_linkDescEclipse=Eclipse.org web site
+ImageLinkManager_linkNameGoogle=Google
+ImageLinkManager_linkDescGoogle=Google search engine
+UsefulLinkManager_errorRequiredAttributeMissing=Required ''{0}'' attribute not specified
+UsefulLinkManager_errorMissingAttribute=Missing attribute: ''{0}''
+UsefulLinkManager_defaultMsgDescriptionNotSpecified=Description not specified.
\ No newline at end of file
diff --git a/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/model/ComponentLink.java b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/model/ComponentLink.java
new file mode 100644
index 0000000..8873452
--- /dev/null
+++ b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/model/ComponentLink.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 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
+ *******************************************************************************/
+
+package org.eclipse.browser.view.model;
+
+/**
+ * ComponentLink
+ *
+ */
+public class ComponentLink extends LinkObject {
+
+	/**
+	 * @param link
+	 * @param name
+	 * @param description
+	 */
+	public ComponentLink(LinkModel model, LinkObject parent) {
+		super(model, parent);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.browser.view.model.LinkObject#getType()
+	 */
+	public int getType() {
+		return F_TYPE_COMPONENT;
+	}
+
+}
diff --git a/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/model/LinkHandler.java b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/model/LinkHandler.java
new file mode 100644
index 0000000..7c715bf
--- /dev/null
+++ b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/model/LinkHandler.java
@@ -0,0 +1,145 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 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
+ *******************************************************************************/
+
+package org.eclipse.browser.view.model;
+
+import java.io.StringReader;
+import java.util.Stack;
+
+import org.eclipse.browser.view.BrowserMessages;
+import org.eclipse.osgi.util.NLS;
+import org.xml.sax.Attributes;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.DefaultHandler;
+
+/**
+ * LinkHandler
+ *
+ */
+public class LinkHandler extends DefaultHandler {
+
+	public final static String F_ELEMENT_PROJECT = "project"; //$NON-NLS-1$
+	
+	public final static String F_ELEMENT_SUBPROJECT = "subproject"; //$NON-NLS-1$
+	
+	public final static String F_ELEMENT_COMPONENT = "component"; //$NON-NLS-1$
+	
+	public final static String F_ATTRIBUTE_NAME = "name"; //$NON-NLS-1$
+
+	public final static String F_ATTRIBUTE_LINK = "link"; //$NON-NLS-1$
+
+	public final static String F_ATTRIBUTE_DESCRIPTION = "description"; //$NON-NLS-1$
+	
+	private Stack fLinkObjectStack;
+	
+	private LinkObject fRoot;	
+	
+	private LinkModel fModel;
+	
+	/**
+	 * 
+	 */
+	public LinkHandler(LinkModel model) {
+		fModel = model;
+		fLinkObjectStack = null;
+	}
+	
+	/**
+	 * @return
+	 */
+	public LinkObject getRootLinkObject() {
+		return fRoot;
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.xml.sax.helpers.DefaultHandler#startDocument()
+	 */
+	public void startDocument() throws SAXException {
+		fLinkObjectStack = new Stack();
+		fRoot = null;
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.xml.sax.helpers.DefaultHandler#startElement(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
+	 */
+	public void startElement(String uri, String localName, String name,
+			Attributes attributes) throws SAXException {
+
+		LinkObject linkObject = null;
+		LinkObject parent = null;
+		
+		// Get the attributes
+		String attr_name = attributes.getValue(F_ATTRIBUTE_NAME);
+		String attr_link = attributes.getValue(F_ATTRIBUTE_LINK);
+		String attr_description = attributes.getValue(F_ATTRIBUTE_DESCRIPTION);
+		// Ensure the attributes are all defined
+		if ((attr_name == null) ||
+				(attr_link == null) ||
+				(attr_description == null)) {
+			throw new SAXException(BrowserMessages.LinkHandler_errorAttributeMissing);
+		}
+
+		// Get the parent object
+		// If the stack is empty, then we have a root node
+		if (fLinkObjectStack.empty() == false) {
+			parent = (LinkObject)fLinkObjectStack.peek();
+		}
+		// Build the model
+		// Process project, subproject or component elements
+		if (name.equals(F_ELEMENT_PROJECT)) {
+			linkObject = fModel.getModelFactory().createProjectLink();
+			fRoot = linkObject;
+		} else if (name.equals(F_ELEMENT_SUBPROJECT)) {
+			// Project element
+			linkObject = fModel.getModelFactory().createSubProjectLink(parent);
+			parent.addFieldChild(linkObject);
+		} else if (name.equals(F_ELEMENT_COMPONENT)) {
+			// Component element
+			linkObject = fModel.getModelFactory().createComponentLink(parent);
+			parent.addFieldChild(linkObject);
+		} else {
+			// Unrecognized element
+			throw new SAXException(
+					NLS.bind(BrowserMessages.LinkHandler_errorUnrecognizedElement, name));
+		}		
+		// Set the link object fields
+		linkObject.setFieldName(attr_name);
+		linkObject.setFieldLink(attr_link);
+		linkObject.setFieldDescription(attr_description);
+		
+		// Add this object to the top of the stack
+		// Children from future startElement events will be added as children
+		// to this object
+		fLinkObjectStack.push(linkObject);
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.xml.sax.helpers.DefaultHandler#endElement(java.lang.String, java.lang.String, java.lang.String)
+	 */
+	public void endElement(String uri, String localName, String name)
+			throws SAXException {
+		// Remove the top object off the stack
+		// We are done processing that object and its children
+		fLinkObjectStack.pop();
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.xml.sax.helpers.DefaultHandler#resolveEntity(java.lang.String, java.lang.String)
+	 */
+	public InputSource resolveEntity(String publicId, String systemId) throws SAXException {
+		// Prevent the resolution of external entities in order to
+		// prevent the parser from accessing the Internet
+		// This will prevent huge workbench performance degradations and hangs
+		return new InputSource(new StringReader("")); //$NON-NLS-1$
+	}	
+	
+}
diff --git a/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/model/LinkModel.java b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/model/LinkModel.java
new file mode 100644
index 0000000..02e6770
--- /dev/null
+++ b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/model/LinkModel.java
@@ -0,0 +1,133 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 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
+ *******************************************************************************/
+
+package org.eclipse.browser.view.model;
+
+import java.io.BufferedInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+
+import org.eclipse.core.runtime.CoreException;
+import org.xml.sax.SAXException;
+
+
+/**
+ * EclipseProjectLinkModel
+ *
+ */
+public class LinkModel {
+
+	private URL fModelURL;
+	
+	private LinkObject fRoot;
+	
+	private SAXParserFactory fParserFactory;
+	
+	private SAXParser fParser;
+	
+	private LinkHandler fParserHandler;
+	
+	private LinkModelFactory fModelFactory;
+	
+	/**
+	 * 
+	 */
+	public LinkModel(URL file) {
+		fModelURL = file;
+		
+		initialize();
+	}
+
+	/**
+	 * @return
+	 */
+	public LinkObject getRootLinkObject() {
+		return fRoot;
+	}
+	
+	/**
+	 * 
+	 */
+	private void initialize() {
+		fRoot = null;
+		fParserFactory = null;
+		fParser = null;
+		fParserHandler = null;
+	}
+	
+	/**
+	 * @return
+	 */
+	private SAXParserFactory getSAXParserFactory() {
+		if (fParserFactory == null) {
+			fParserFactory = SAXParserFactory.newInstance();
+			fParserFactory.setNamespaceAware(true);
+			fParserFactory.setValidating(true);
+		}
+		return fParserFactory;
+	}
+	
+	/**
+	 * @return
+	 */
+	private SAXParser getSAXParser() throws ParserConfigurationException,
+			SAXException {
+		if (fParser == null) {
+			fParser = getSAXParserFactory().newSAXParser();
+		}
+		return fParser;
+	}
+
+	/**
+	 * @return
+	 */
+	private LinkHandler getSAXHandler() {
+		if (fParserHandler == null) {
+			fParserHandler = new LinkHandler(this);
+		}
+		return fParserHandler;
+	}
+
+	/**
+	 * @return
+	 */
+	public LinkModelFactory getModelFactory() {
+		if (fModelFactory == null) {
+			fModelFactory = new LinkModelFactory(this);
+		}
+		return fModelFactory;
+	}	
+	
+	/**
+	 * @throws CoreException
+	 */
+	public void load() throws IOException, ParserConfigurationException, SAXException {
+		
+		InputStream stream = null;
+		try {
+			stream = new BufferedInputStream(fModelURL.openStream());
+			SAXParser parser = getSAXParser();
+			LinkHandler handler = getSAXHandler();
+			parser.parse(stream, handler);
+			fRoot = handler.getRootLinkObject();
+		} finally {
+			if (stream != null) {
+				stream.close();
+			}
+		}	
+	} 
+	
+}
diff --git a/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/model/LinkModelFactory.java b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/model/LinkModelFactory.java
new file mode 100644
index 0000000..86d505b
--- /dev/null
+++ b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/model/LinkModelFactory.java
@@ -0,0 +1,52 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 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
+ *******************************************************************************/
+
+package org.eclipse.browser.view.model;
+
+/**
+ * LinkModelFactory
+ *
+ */
+public class LinkModelFactory {
+
+	private LinkModel fModel;
+	
+	/**
+	 * 
+	 */
+	public LinkModelFactory(LinkModel model) {
+		fModel = model;
+	}
+
+	/**
+	 * @param parent
+	 * @return
+	 */
+	public LinkObject createProjectLink() {
+		return new ProjectLink(fModel);
+	}	
+	
+	/**
+	 * @param parent
+	 * @return
+	 */
+	public LinkObject createComponentLink(LinkObject parent) {
+		return new ComponentLink(fModel, parent);
+	}
+	
+	/**
+	 * @param parent
+	 * @return
+	 */
+	public LinkObject createSubProjectLink(LinkObject parent) {
+		return new SubProjectLink(fModel, parent);
+	}
+}
diff --git a/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/model/LinkObject.java b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/model/LinkObject.java
new file mode 100644
index 0000000..c843d9c
--- /dev/null
+++ b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/model/LinkObject.java
@@ -0,0 +1,143 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 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
+ *******************************************************************************/
+
+package org.eclipse.browser.view.model;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * EclipseProjectLinkObject
+ *
+ */
+public abstract class LinkObject {
+
+	public final static int F_TYPE_PROJECT = 0x01;	
+	
+	public final static int F_TYPE_SUBPROJECT = 0x02;
+	
+	public final static int F_TYPE_COMPONENT = 0x04;
+	
+	private ArrayList fFieldChildren;
+	
+	private String fFieldLink;
+
+	private String fFieldDescription;
+	
+	private String fFieldName;
+	
+	private LinkObject fParent;
+	
+	private LinkModel fModel;
+	
+	/**
+	 * @param link
+	 * @param name
+	 */
+	public LinkObject(LinkModel model, LinkObject parent) {
+		fModel = model;
+		fParent = parent;
+		fFieldChildren = new ArrayList();
+	}
+	
+	/**
+	 * @param child
+	 */
+	public void addFieldChild(LinkObject child) {
+		fFieldChildren.add(child);
+	}
+	
+	/**
+	 * @return
+	 */
+	public List getFieldChildren() {
+		return fFieldChildren;
+	}
+	
+	/**
+	 * @return
+	 */
+	public String getFieldName() {
+		return fFieldName;
+	}
+	
+	/**
+	 * @return
+	 */
+	public String getFieldLink() {
+		return fFieldLink;
+	}
+	
+	/**
+	 * @return
+	 */
+	public String getFieldDescription() {
+		return fFieldDescription;
+	}
+
+	/**
+	 * @param name
+	 */
+	public void setFieldName(String name) {
+		fFieldName = name;
+	}
+	
+	/**
+	 * @param link
+	 */
+	public void setFieldLink(String link) {
+		fFieldLink = link;
+	}
+	
+	/**
+	 * @param description
+	 */
+	public void setFieldDescription(String description) {
+		fFieldDescription = description;
+	}	
+	
+	/**
+	 * @return
+	 */
+	public LinkObject getParent() {
+		return fParent;
+	}
+	
+	/* (non-Javadoc)
+	 * @see java.lang.Object#toString()
+	 */
+	public String toString() {
+		return fFieldName;
+	}
+	
+	/**
+	 * @return
+	 */
+	public boolean hasChildren() {
+		if (fFieldChildren.size() > 0) {
+			return true;
+		}
+		return false;
+	}
+	
+	/**
+	 * @return
+	 */
+	public LinkModel getModel() {
+		return fModel;
+	}
+	
+	/**
+	 * @return
+	 */
+	public abstract int getType();
+	
+}
diff --git a/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/model/ProjectLink.java b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/model/ProjectLink.java
new file mode 100644
index 0000000..08c291b
--- /dev/null
+++ b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/model/ProjectLink.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 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
+ *******************************************************************************/
+
+package org.eclipse.browser.view.model;
+
+/**
+ * ProjectLink
+ *
+ */
+public class ProjectLink extends LinkObject {
+
+	/**
+	 * @param link
+	 * @param name
+	 * @param description
+	 */
+	public ProjectLink(LinkModel model) {
+		super(model, null);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.browser.view.model.LinkObject#getType()
+	 */
+	public int getType() {
+		return F_TYPE_PROJECT;
+	}
+
+}
diff --git a/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/model/SubProjectLink.java b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/model/SubProjectLink.java
new file mode 100644
index 0000000..a3db5b0
--- /dev/null
+++ b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/model/SubProjectLink.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 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
+ *******************************************************************************/
+
+package org.eclipse.browser.view.model;
+
+/**
+ * ProjectLink
+ *
+ */
+public class SubProjectLink extends LinkObject {
+
+	/**
+	 * @param link
+	 * @param name
+	 * @param description
+	 */
+	public SubProjectLink(LinkModel model, LinkObject parent) {
+		super(model, parent);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.browser.view.model.LinkObject#getType()
+	 */
+	public int getType() {
+		return F_TYPE_SUBPROJECT;
+	}
+
+}
diff --git a/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/ui/EclipseBrowserView.java b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/ui/EclipseBrowserView.java
new file mode 100644
index 0000000..753b0d6
--- /dev/null
+++ b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/ui/EclipseBrowserView.java
@@ -0,0 +1,296 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 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
+ *******************************************************************************/
+
+package org.eclipse.browser.view.ui;
+
+import java.net.URL;
+
+import org.eclipse.browser.view.BrowserMessages;
+import org.eclipse.browser.view.BrowserPlugin;
+import org.eclipse.browser.view.BrowserPluginImages;
+import org.eclipse.browser.view.model.LinkModel;
+import org.eclipse.browser.view.ui.actions.IExtensibleAction;
+import org.eclipse.browser.view.ui.actions.OpenLinkAction;
+import org.eclipse.browser.view.ui.listeners.FormTextHyperlinkListener;
+import org.eclipse.browser.view.ui.listeners.SashFormControlListener;
+import org.eclipse.browser.view.ui.sections.ProjectLinksSection;
+import org.eclipse.browser.view.ui.sections.SearchSection;
+import org.eclipse.browser.view.ui.sections.UsefulLinksSection;
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.IToolBarManager;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.SashForm;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.IActionBars;
+import org.eclipse.ui.forms.HyperlinkGroup;
+import org.eclipse.ui.forms.ManagedForm;
+import org.eclipse.ui.forms.widgets.ExpandableComposite;
+import org.eclipse.ui.forms.widgets.Form;
+import org.eclipse.ui.forms.widgets.FormText;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.eclipse.ui.forms.widgets.ScrolledForm;
+import org.eclipse.ui.forms.widgets.Section;
+import org.eclipse.ui.part.ViewPart;
+
+/**
+ * EclipseBrowserView
+ *
+ */
+public class EclipseBrowserView extends ViewPart {
+	
+	private ProjectLinksSection fEclipseProjectLinksSection;
+	
+	private UsefulLinksSection fEclipseUsefulLinksSection;
+	
+	private SearchSection fEclipseSearchSection;
+
+	private ManagedForm fManagedForm;
+	
+	private final static String F_DEFAULT_MODEL_FILE = "/data/eclipse_project_links.xml"; //$NON-NLS-1$
+													   
+	private FormToolkit fToolkit;
+	
+	private LinkModel fModel;
+
+	private FormText fEclipseImageFormText;	
+
+	private Composite fBaseComposite;
+	
+	private OpenLinkAction fOpenLinkAction = new OpenLinkAction();
+
+	private SashForm fSashForm;
+	
+	public EclipseBrowserView() {
+	}
+
+	public void createPartControl(Composite parent) {		
+		if (createDefaultModel()) {
+			createUI(parent);
+			createListeners();
+			contributeToActionBars();
+		}
+	}
+
+	private void createUI(Composite parent) {
+		createUIToolkit(parent);
+		fBaseComposite = createUIComposite(parent, 3, 8, GridData.FILL_HORIZONTAL);
+		createUISashForm();
+		createUIHeader();
+		createUIBody();
+		createUIFooter();
+
+		fToolkit.adapt(fSashForm, true, true);
+	}
+
+	private void createUIFooter() {
+		Composite parent = createUIComposite(fSashForm, 0, 0, GridData.FILL_HORIZONTAL);
+		createUISeparator(parent);
+		createUIFormTextEclipseImage(parent);		
+	}
+
+	private void createUIBody() {
+		ScrolledForm form = createUIScrolledForm(fSashForm, 0, 0, GridData.FILL_BOTH);
+		fManagedForm = new ManagedForm(fToolkit, form);
+		createUISectionProjectLinks(form.getBody());
+		if (BrowserPlugin.getUsefulLinkManager().getUsefulLinksCount() > 0) {
+			createUISectionUsefulLinks(form.getBody());
+		}
+		createUISectionSearch(form.getBody());
+	}
+	
+	private void createUIHeader() {
+		Form form = createUIForm(fSashForm, 0, 0, GridData.FILL_BOTH);
+		form.setText(BrowserMessages.EclipseBrowserView_title);
+	}
+
+	private void createUISashForm() {
+		fSashForm = new SashForm (fBaseComposite, SWT.VERTICAL);
+		fSashForm.setLayoutData(new GridData(GridData.FILL_BOTH));
+	}
+
+	private void createListeners() {
+		fEclipseProjectLinksSection.createListeners();
+		fEclipseUsefulLinksSection.createListeners();
+		fEclipseSearchSection.createListeners();
+		createListenersFormTextEclipseImage();
+		createListenersSashForm();
+	}
+	
+	private void createListenersSashForm() {
+		fSashForm.addControlListener(new SashFormControlListener());		
+	}
+
+	private void createListenersFormTextEclipseImage() {
+		fEclipseImageFormText.addHyperlinkListener(
+				new FormTextHyperlinkListener(this));
+	}
+	
+	private void createUISectionUsefulLinks(Composite parent) {
+		int style = Section.DESCRIPTION | ExpandableComposite.TITLE_BAR
+				| ExpandableComposite.TWISTIE;
+		fEclipseUsefulLinksSection = new UsefulLinksSection(this,
+				parent, fToolkit, style, BrowserMessages.EclipseBrowserView_sectionTitleUsefulLinks,
+				BrowserMessages.EclipseBrowserView_sectionDescUsefulLinks);
+		fEclipseUsefulLinksSection.createUI();		
+	}
+
+	private void createUISectionProjectLinks(Composite parent) {
+		int style = Section.DESCRIPTION | ExpandableComposite.TITLE_BAR;
+		fEclipseProjectLinksSection = new ProjectLinksSection(this, parent, fToolkit, style, BrowserMessages.EclipseBrowserView_sectionTitleProjectLinks, BrowserMessages.EclipseBrowserView_sectionDescProjectLinks);
+		fEclipseProjectLinksSection.createUI();
+	}
+
+	private void createUISectionSearch(Composite parent) {
+		int style = Section.DESCRIPTION | ExpandableComposite.TITLE_BAR
+				| ExpandableComposite.TWISTIE;
+		fEclipseSearchSection = new SearchSection(this, parent,
+				fToolkit, style, BrowserMessages.EclipseBrowserView_sectionTitleSearch,
+				BrowserMessages.EclipseBrowserView_sectionDescSearch);
+		fEclipseSearchSection.createUI();			
+	}
+	
+	private void createUIToolkit(Composite parent) {
+		fToolkit = new FormToolkit(parent.getDisplay());
+		fToolkit.getColors().initializeSectionToolBarColors();
+		fToolkit.getHyperlinkGroup().setHyperlinkUnderlineMode(
+				HyperlinkGroup.UNDERLINE_HOVER);
+	}
+
+	private Composite createUIComposite(Composite parent, int marginWidth,
+			int marginHeight, int style) {
+		Composite composite = fToolkit.createComposite(parent);
+		GridLayout layout = new GridLayout();
+		layout.marginWidth = marginWidth;
+		layout.marginHeight = marginHeight;		
+		composite.setLayout(layout);
+		GridData data = new GridData(style);
+		composite.setLayoutData(data);	
+		return composite;
+	}
+	
+	private ScrolledForm createUIScrolledForm(Composite parent,
+			int marginWidth, int marginHeight, int style) {
+		ScrolledForm form = fToolkit.createScrolledForm(parent);
+		GridLayout layout = new GridLayout();
+		layout.marginWidth = marginWidth;
+		layout.marginHeight = marginHeight;		
+		form.getBody().setLayout(layout);
+		GridData data = new GridData(style);		
+		form.getBody().setLayoutData(data);	
+		return form;
+	}
+
+	private Form createUIForm(Composite parent,
+			int marginWidth, int marginHeight, int style) {
+		Form form = fToolkit.createForm(parent);
+		GridLayout layout = new GridLayout();
+		layout.marginWidth = marginWidth;
+		layout.marginHeight = marginHeight;		
+		form.getBody().setLayout(layout);
+		GridData data = new GridData(style);		
+		form.getBody().setLayoutData(data);	
+		return form;
+	}	
+	
+	private void createUISeparator(Composite parent) {
+		Composite separator = fToolkit.createCompositeSeparator(parent);
+		GridData data = new GridData(GridData.FILL_HORIZONTAL);
+		data.heightHint = 1;
+		separator.setLayoutData(data);		
+	}
+	
+	private void createUIFormTextEclipseImage(Composite parent) {	
+		fEclipseImageFormText = fToolkit.createFormText(parent, true);
+		String text = "<form><p><br/><a href=\"eclipse.org\"><img href=\"eclipse\"/></a></p></form>"; //$NON-NLS-1$
+		fEclipseImageFormText.marginHeight = 0;
+		fEclipseImageFormText.setText(text, true, false);
+		fEclipseImageFormText.setImage("eclipse", BrowserPlugin.getImage(BrowserPluginImages.F_IMAGE_PATH_ECLIPSE_LOGO)); //$NON-NLS-1$
+		
+	}
+	
+	private boolean createDefaultModel() {	
+		URL url = BrowserPlugin.getDefault().getBundle().getEntry(F_DEFAULT_MODEL_FILE);
+		// Ensure the model XML file was found in the bundle
+		if (url == null) {
+			String message = NLS.bind(
+					BrowserMessages.EclipseBrowserView_errorMissingModelFile, 
+					url.toString());
+			BrowserPlugin.logException(BrowserMessages.EclipseBrowserView_errorModelLoad, message, new Exception(message));
+			return false;
+		}
+		// Try to load the model
+		try {
+			// Resolve the URL into a path
+			URL modelFile = FileLocator.resolve(url);
+			// Create the model
+			fModel = new LinkModel(modelFile);
+			// Load the model
+			fModel.load();			
+		} catch (Exception e) {
+			BrowserPlugin.logException(BrowserMessages.EclipseBrowserView_errorModelLoad, e.getMessage(), e);
+			return false;
+		}
+		
+		return true;
+	}
+
+	private void contributeToActionBars() {
+		IActionBars bars = getViewSite().getActionBars();
+		fillLocalPullDown(bars.getMenuManager());
+		fillLocalToolBar(bars.getToolBarManager());
+	}
+
+	private void fillLocalPullDown(IMenuManager manager) {
+		if (fOpenLinkAction instanceof IExtensibleAction) {
+			Action[] actions = ((IExtensibleAction)fOpenLinkAction).getActions();
+			if (actions.length > 1) {
+				for (int i = 0; i < actions.length; i++)
+					manager.add(actions[i]);
+			}
+			if (actions.length > 0) {
+				actions[0].setChecked(true);
+			}
+		}
+	}
+	
+	private void fillLocalToolBar(IToolBarManager manager) {
+		manager.add(fOpenLinkAction);
+	}
+
+	/**
+	 * Passing the focus request to the project links section
+	 */
+	public void setFocus() {
+		fEclipseProjectLinksSection.setFocus();
+	}
+
+	public OpenLinkAction getOpenLinkAction() {
+		return fOpenLinkAction;
+	}
+	
+	public LinkModel getModel() {
+		return fModel;
+	}
+	
+	public ManagedForm getManagedForm() {
+		return fManagedForm;
+	}
+
+	public void dispose() {
+		fManagedForm.dispose();
+		super.dispose();
+	}
+}
diff --git a/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/ui/actions/CollapseAction.java b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/ui/actions/CollapseAction.java
new file mode 100644
index 0000000..bffbaf6
--- /dev/null
+++ b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/ui/actions/CollapseAction.java
@@ -0,0 +1,78 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 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
+ *******************************************************************************/
+package org.eclipse.browser.view.ui.actions;
+
+import org.eclipse.browser.view.BrowserMessages;
+import org.eclipse.browser.view.BrowserPlugin;
+import org.eclipse.browser.view.BrowserPluginImages;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.TreeViewer;
+
+public class CollapseAction extends Action {
+
+	private TreeViewer fTreeViewer;
+	
+	private Object fTreeObject;
+	
+	/**
+	 * @param treeViewer
+	 * @param treeObject
+	 */
+	public CollapseAction() {
+		super(BrowserMessages.CollapseAction_actionNameCollapseAll, IAction.AS_PUSH_BUTTON);
+		fTreeObject = null;
+		fTreeViewer = null;
+		initialize();
+	}
+
+	/**
+	 * 
+	 */
+	private void initialize() {
+		setToolTipText(BrowserMessages.CollapseAction_actionDescCollapseAll);
+		setImageDescriptor(
+				BrowserPlugin.getImageDescriptor(BrowserPluginImages.F_IMAGE_PATH_COLLAPSE));
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.action.Action#run()
+	 */
+	public void run() {
+		
+		if (fTreeViewer == null) {
+			return;
+		} else if (fTreeObject == null) {
+			fTreeViewer.collapseAll();
+		} else {
+			// Redraw modification needed to avoid flicker
+			// Collapsing to a specific level does not work			
+			fTreeViewer.getControl().setRedraw(false);
+			fTreeViewer.collapseAll();
+			fTreeViewer.expandToLevel(fTreeObject, 1);
+			fTreeViewer.getControl().setRedraw(true);
+		}
+	}
+	
+	/**
+	 * @param treeViewer
+	 */
+	public void setTreeViewer(TreeViewer treeViewer) {
+		fTreeViewer = treeViewer;
+	}
+
+	/**
+	 * @param treeObject
+	 */
+	public void setTreeObject(Object treeObject) {
+		fTreeObject = treeObject;
+	}
+}
diff --git a/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/ui/actions/ExtensibleOpenLinkAction.java b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/ui/actions/ExtensibleOpenLinkAction.java
new file mode 100644
index 0000000..4831c6b
--- /dev/null
+++ b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/ui/actions/ExtensibleOpenLinkAction.java
@@ -0,0 +1,120 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 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
+ *******************************************************************************/
+
+package org.eclipse.browser.view.ui.actions;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.TreeMap;
+
+import org.eclipse.browser.view.BrowserMessages;
+import org.eclipse.browser.view.BrowserPlugin;
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtensionRegistry;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
+
+
+public class ExtensibleOpenLinkAction extends OpenLinkAction implements IExtensibleAction {
+	
+	private static String POINT_ID = "org.eclipse.browser.htmlBrowsers";
+	private static String ATT_ID = "id";
+	private static String ATT_NAME = "name";
+	private static String ATT_CLASS = "class";
+	
+	private Map fBrowserMap;
+	private String fCurrentBrowserId;
+	
+	class OpenBrowserAction extends Action {
+		
+		public OpenBrowserAction(String id, String name) {
+			super(name, IAction.AS_RADIO_BUTTON);
+			setId(id);
+		}	
+		
+		public void setChecked(boolean checked) {
+			if (checked)
+				setCurrentBrowserId(getId());			
+		}
+		
+	}
+	
+	public boolean isExtensible() {
+		return true;
+	}
+
+	public void setCurrentBrowserId(String id) {
+		fCurrentBrowserId = id;
+	}
+	
+	public Action[] getActions() {
+		if (fBrowserMap == null)
+			loadElements();
+		Map result = new TreeMap();
+		Iterator iter = fBrowserMap.values().iterator();
+		while (iter.hasNext()) {
+			IConfigurationElement element = (IConfigurationElement)iter.next();
+			String name = element.getAttribute(ATT_NAME);
+			String id = element.getAttribute(ATT_ID);
+			result.put(name, new OpenBrowserAction(id, name));
+		}
+		return (Action[]) result.values().toArray(new Action[result.size()]);
+	}
+	
+	private void loadElements() {
+		fBrowserMap = new HashMap();
+		IExtensionRegistry registry = Platform.getExtensionRegistry();
+		IConfigurationElement[] elements = registry.getConfigurationElementsFor(POINT_ID);
+		for (int i = 0; i < elements.length; i++) {
+			String id = elements[i].getAttribute(ATT_ID);
+			if (id == null 
+					|| elements[i].getAttribute(ATT_NAME) == null 
+					|| elements[i].getAttribute(ATT_CLASS) == null)
+				continue;
+			fBrowserMap.put(id, elements[i]);
+		}
+		
+	}
+	
+	public void run() {
+		if (fBrowserMap == null)
+			loadElements();
+		
+		Assert.isNotNull(fCurrentBrowserId);
+		
+		Object value = fBrowserMap.get(fCurrentBrowserId);
+		try {
+			if (value instanceof IHTMLBrowser) {
+				((IHTMLBrowser)value).openURL(new URL(getLink()));
+			} else if (value instanceof IConfigurationElement) {
+				try {
+					IConfigurationElement element = (IConfigurationElement)value;
+					Object result = element.createExecutableExtension(ATT_CLASS);
+					if (result instanceof IHTMLBrowser) {
+						fBrowserMap.put(fCurrentBrowserId, result);
+						((IHTMLBrowser)result).openURL(new URL(getLink()));
+					} else {
+						fBrowserMap.remove(fCurrentBrowserId);
+					}
+				} catch (CoreException e) {
+				}			
+			}
+		} catch (MalformedURLException e) {
+			BrowserPlugin.logException(BrowserMessages.OpenLinkAction_errorLinkAction, BrowserMessages.OpenLinkAction_errorUrlMalformed, e);			
+		}
+	}
+}
diff --git a/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/ui/actions/ExternalBrowserAction.java b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/ui/actions/ExternalBrowserAction.java
new file mode 100644
index 0000000..e3f6000
--- /dev/null
+++ b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/ui/actions/ExternalBrowserAction.java
@@ -0,0 +1,65 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 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
+ *******************************************************************************/
+
+package org.eclipse.browser.view.ui.actions;
+
+import org.eclipse.browser.view.BrowserMessages;
+import org.eclipse.browser.view.BrowserPlugin;
+import org.eclipse.browser.view.BrowserPluginImages;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
+
+/**
+ * ExternalBrowserAction
+ *
+ */
+public class ExternalBrowserAction extends Action {
+
+	private OpenLinkAction fOpenLinkAction;
+	
+	/**
+	 * 
+	 */
+	public ExternalBrowserAction(OpenLinkAction action) {
+		super(BrowserMessages.ExternalBrowserAction_actionNameExternalBrowser, IAction.AS_CHECK_BOX);
+		fOpenLinkAction = action;
+		initialize();
+	}
+
+	/**
+	 * 
+	 */
+	private void initialize() {
+		setToolTipText(BrowserMessages.ExternalBrowserAction_toolTipExternalBrowser);
+		setImageDescriptor(
+				BrowserPlugin.getImageDescriptor(BrowserPluginImages.F_IMAGE_PATH_EXTERNAL_BROWSER));
+		//
+		setChecked(fOpenLinkAction.getUseExternalBrowser());
+	}
+
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.action.Action#run()
+	 */
+	public void run() {
+
+		boolean useExternal = fOpenLinkAction.getUseExternalBrowser();
+		//
+		if (useExternal) {
+			useExternal = false;
+		} else {
+			useExternal = true;
+		}
+		//
+		fOpenLinkAction.setUseExternalBrowser(useExternal);
+	}
+
+}
diff --git a/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/ui/actions/IExtensibleAction.java b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/ui/actions/IExtensibleAction.java
new file mode 100644
index 0000000..25fed90
--- /dev/null
+++ b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/ui/actions/IExtensibleAction.java
@@ -0,0 +1,19 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 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
+ *******************************************************************************/
+package org.eclipse.browser.view.ui.actions;
+
+import org.eclipse.jface.action.Action;
+
+public interface IExtensibleAction {
+	
+	Action[] getActions();
+
+}
diff --git a/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/ui/actions/IHTMLBrowser.java b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/ui/actions/IHTMLBrowser.java
new file mode 100644
index 0000000..1e5f917
--- /dev/null
+++ b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/ui/actions/IHTMLBrowser.java
@@ -0,0 +1,20 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 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
+ *******************************************************************************/
+package org.eclipse.browser.view.ui.actions;
+
+import java.net.URL;
+
+
+public interface IHTMLBrowser {
+	
+	void openURL(URL url);
+
+}
diff --git a/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/ui/actions/InternalBrowser.java b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/ui/actions/InternalBrowser.java
new file mode 100644
index 0000000..331794c
--- /dev/null
+++ b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/ui/actions/InternalBrowser.java
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 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
+ *******************************************************************************/
+package org.eclipse.browser.view.ui.actions;
+
+import java.net.URL;
+
+import org.eclipse.browser.view.BrowserMessages;
+import org.eclipse.browser.view.BrowserPlugin;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.browser.IWebBrowser;
+import org.eclipse.ui.browser.IWorkbenchBrowserSupport;
+
+public class InternalBrowser implements IHTMLBrowser {
+
+	public void openURL(URL url) {
+		try {
+			IWorkbenchBrowserSupport support = 
+				PlatformUI.getWorkbench().getBrowserSupport();
+			
+			int style = IWorkbenchBrowserSupport.AS_EDITOR | 
+				IWorkbenchBrowserSupport.STATUS;
+			IWebBrowser browser = support.createBrowser(
+					style,
+					"org.eclipse.pde",  //$NON-NLS-1$
+					url.toString(), 
+					url.toString());
+			browser.openURL(url);
+		} catch (PartInitException e) {
+			BrowserPlugin.logException(BrowserMessages.OpenLinkAction_errorLinkAction, BrowserMessages.OpenLinkAction_errorWorkbenchInitialization, e);
+		}
+	}
+
+}
diff --git a/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/ui/actions/OpenLinkAction.java b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/ui/actions/OpenLinkAction.java
new file mode 100644
index 0000000..cdf4377
--- /dev/null
+++ b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/ui/actions/OpenLinkAction.java
@@ -0,0 +1,108 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 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
+ *******************************************************************************/
+
+package org.eclipse.browser.view.ui.actions;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import org.eclipse.browser.view.BrowserMessages;
+import org.eclipse.browser.view.BrowserPlugin;
+import org.eclipse.browser.view.BrowserPluginImages;
+import org.eclipse.browser.view.model.LinkObject;
+import org.eclipse.jface.action.Action;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.browser.IWebBrowser;
+import org.eclipse.ui.browser.IWorkbenchBrowserSupport;
+
+public class OpenLinkAction extends Action {
+	
+	private String fLink;
+	
+	private String fName;
+	
+	public OpenLinkAction() {
+		fLink = null;
+		fName = null;
+		setImageDescriptor(
+				BrowserPlugin.getImageDescriptor(BrowserPluginImages.F_IMAGE_PATH_LINK));
+		setText(BrowserMessages.OpenLinkAction_actionNameOpenLink);
+	}
+	
+	/**
+	 * @param linkObject
+	 */
+	public void setLink(String link) {
+		fLink = link;
+	}
+	
+	public String getLink() {
+		return fLink;
+	}
+	
+	/**
+	 * @param name
+	 */
+	public void setName(String name) {
+		fName = name;
+	}
+	
+	/**
+	 * @param linkObject
+	 */
+	public void update(LinkObject linkObject) {
+		if (linkObject == null) {
+			setToolTipText(null);
+			setLink(null);
+			setName(null);
+		} else {
+			setToolTipText(NLS.bind(
+					BrowserMessages.OpenLinkAction_toolTipOpenLink, 
+					linkObject.getFieldName()));
+			setLink(linkObject.getFieldLink());
+			setName(linkObject.getFieldName());
+		}
+	}
+	
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.action.Action#run()
+	 */
+	public void run() {
+		//
+		if ((fLink == null) ||
+				(fLink.length() == 0)) {
+			BrowserPlugin.logException(BrowserMessages.OpenLinkAction_errorLinkAction, BrowserMessages.OpenLinkAction_errorUrlNotSpecified, new Exception(fName));
+			return;
+		}
+		//
+		try {
+			IWorkbenchBrowserSupport support = 
+				PlatformUI.getWorkbench().getBrowserSupport();
+			
+			int style = IWorkbenchBrowserSupport.AS_EDITOR | 
+				IWorkbenchBrowserSupport.STATUS;
+			IWebBrowser browser = support.createBrowser(
+					style,
+					"org.eclipse.pde",  //$NON-NLS-1$
+					fName, 
+					fName);
+			browser.openURL(new URL(fLink));
+		} catch (MalformedURLException e) {
+			BrowserPlugin.logException(BrowserMessages.OpenLinkAction_errorLinkAction, BrowserMessages.OpenLinkAction_errorUrlMalformed, e);
+		} catch (PartInitException e) {
+			BrowserPlugin.logException(BrowserMessages.OpenLinkAction_errorLinkAction, BrowserMessages.OpenLinkAction_errorWorkbenchInitialization, e);
+		}
+	}
+	
+}
diff --git a/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/ui/listeners/FormTextHyperlinkListener.java b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/ui/listeners/FormTextHyperlinkListener.java
new file mode 100644
index 0000000..4d2b884
--- /dev/null
+++ b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/ui/listeners/FormTextHyperlinkListener.java
@@ -0,0 +1,141 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 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
+ *******************************************************************************/
+
+package org.eclipse.browser.view.ui.listeners;
+
+import org.eclipse.browser.view.BrowserMessages;
+import org.eclipse.browser.view.BrowserPlugin;
+import org.eclipse.browser.view.model.LinkObject;
+import org.eclipse.browser.view.ui.EclipseBrowserView;
+import org.eclipse.browser.view.util.ImageLinkManager;
+import org.eclipse.ui.forms.events.HyperlinkEvent;
+import org.eclipse.ui.forms.events.IHyperlinkListener;
+
+/**
+ * FormTextHyperlinkListener
+ *
+ */
+public class FormTextHyperlinkListener implements IHyperlinkListener {
+
+	private EclipseBrowserView fView;
+	
+	private LinkObject fCurrentLinkObject;
+	
+	/**
+	 * @param view
+	 */
+	public FormTextHyperlinkListener(EclipseBrowserView view) {
+		fView = view;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.forms.events.IHyperlinkListener#linkActivated(org.eclipse.ui.forms.events.HyperlinkEvent)
+	 */
+	public void linkActivated(HyperlinkEvent e) {
+		handleLinkActivatedFormText(e);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.forms.events.IHyperlinkListener#linkEntered(org.eclipse.ui.forms.events.HyperlinkEvent)
+	 */
+	public void linkEntered(HyperlinkEvent e) {
+		handleLinkEnteredFormText(e);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.forms.events.IHyperlinkListener#linkExited(org.eclipse.ui.forms.events.HyperlinkEvent)
+	 */
+	public void linkExited(HyperlinkEvent e) {
+		handleLinkExitedFormText();
+	}
+
+	/**
+	 * 
+	 */
+	private void handleLinkExitedFormText() {
+		fView.getViewSite().getActionBars().getStatusLineManager().setMessage(null);
+	}
+
+	/**
+	 * @param e
+	 */
+	private void handleLinkEnteredFormText(HyperlinkEvent e) {
+
+		fCurrentLinkObject = null;
+		StringBuffer message = new StringBuffer();
+		// 
+		fCurrentLinkObject = resolveHrefUsefulLinks(e.getHref());
+		//
+		if (fCurrentLinkObject == null) {
+			fCurrentLinkObject = resolveHrefImageLinks(e.getHref());
+		}
+		//
+		if (fCurrentLinkObject != null) {
+			message.append(fCurrentLinkObject.getFieldName());
+			message.append(" - [ "); //$NON-NLS-1$
+			message.append(fCurrentLinkObject.getFieldLink());
+			message.append(" ] - "); //$NON-NLS-1$
+			message.append(fCurrentLinkObject.getFieldDescription());
+		}
+		
+		fView.getViewSite().getActionBars().getStatusLineManager().setMessage(
+				message.toString());
+	}		
+	
+	/**
+	 * @param e
+	 */
+	private void handleLinkActivatedFormText(HyperlinkEvent e) {
+		// 
+		if (fCurrentLinkObject == null) {
+			BrowserPlugin.logException(
+					BrowserMessages.OpenLinkAction_errorLinkAction, 
+					BrowserMessages.FormTextHyperlinkListener_errorCannotResolveHref + e.getHref(), 
+					new Exception());		
+		}
+		//
+		fView.getOpenLinkAction().update(fCurrentLinkObject);
+		fView.getOpenLinkAction().run();		
+	}		
+	
+	/**
+	 * @param href
+	 * @return
+	 */
+	private LinkObject resolveHrefUsefulLinks(Object href) {
+		LinkObject[] linkObjects = 
+			BrowserPlugin.getUsefulLinkManager().getUsefulLinks(fView.getModel());
+		//
+		for (int i = 0; i < linkObjects.length; i++) {
+			String thisHref = 
+				new Integer(linkObjects[i].getFieldLink().hashCode()).toString();
+			if (href.equals(thisHref)) {
+				return linkObjects[i];
+			}
+		}	
+		return null;
+	}
+	
+	/**
+	 * @param href
+	 * @return
+	 */
+	private LinkObject resolveHrefImageLinks(Object href) {
+		//
+		if (href.equals("eclipse.org")) { //$NON-NLS-1$
+			return ImageLinkManager.getEclipseImageLink(fView.getModel());
+		} else if (href.equals("google.com")) { //$NON-NLS-1$
+			return ImageLinkManager.getGoogleImageLink(fView.getModel());
+		}
+		return null;
+	}
+	
+}
diff --git a/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/ui/listeners/HandCursorDisposeListener.java b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/ui/listeners/HandCursorDisposeListener.java
new file mode 100644
index 0000000..b3c872f
--- /dev/null
+++ b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/ui/listeners/HandCursorDisposeListener.java
@@ -0,0 +1,45 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 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
+ *******************************************************************************/
+
+package org.eclipse.browser.view.ui.listeners;
+
+import org.eclipse.browser.view.ui.sections.ProjectLinksSection;
+import org.eclipse.swt.events.DisposeEvent;
+import org.eclipse.swt.events.DisposeListener;
+import org.eclipse.swt.graphics.Cursor;
+
+/**
+ * HandCursorDisposeListener
+ *
+ */
+public class HandCursorDisposeListener implements DisposeListener {
+
+	private ProjectLinksSection fSection;		
+
+	/**
+	 * @param view
+	 */
+	public HandCursorDisposeListener(ProjectLinksSection section) {
+		fSection = section;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.events.DisposeListener#widgetDisposed(org.eclipse.swt.events.DisposeEvent)
+	 */
+	public void widgetDisposed(DisposeEvent e) {
+		Cursor handCursor = fSection.getHandCursor();
+		if ((handCursor != null) &&
+				(handCursor.isDisposed() == false)) {
+			handCursor.dispose();
+		}
+	}
+
+}
diff --git a/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/ui/listeners/SashFormControlListener.java b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/ui/listeners/SashFormControlListener.java
new file mode 100644
index 0000000..308593a
--- /dev/null
+++ b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/ui/listeners/SashFormControlListener.java
@@ -0,0 +1,87 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 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
+ *******************************************************************************/
+
+package org.eclipse.browser.view.ui.listeners;
+
+import org.eclipse.swt.custom.SashForm;
+import org.eclipse.swt.events.ControlEvent;
+import org.eclipse.swt.events.ControlListener;
+
+/**
+ * SashFormControlListener
+ *
+ */
+public class SashFormControlListener implements ControlListener {
+
+	private int fCurrentHeight;
+	
+	private final float F_HEADER_HEIGHT_LIMIT = 30;
+
+	private final float F_FOOTER_HEIGHT_LIMIT = 55;
+	
+	
+	/**
+	 * 
+	 */
+	public SashFormControlListener() {
+		fCurrentHeight = 0;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.events.ControlListener#controlMoved(org.eclipse.swt.events.ControlEvent)
+	 */
+	public void controlMoved(ControlEvent e) {
+		// NO-OP
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.events.ControlListener#controlResized(org.eclipse.swt.events.ControlEvent)
+	 */
+	public void controlResized(ControlEvent e) {
+		//
+		if ((e.widget instanceof SashForm) == false) {
+			return;
+		}
+		
+		SashForm sashForm = (SashForm)e.widget;
+		fCurrentHeight = sashForm.getClientArea().height;
+		
+		int header_weight = 1;
+		int body_weight = 0;
+		int footer_weight = 0;
+		
+		if (fCurrentHeight <= F_HEADER_HEIGHT_LIMIT) {
+			// NO-OP
+		} else if (fCurrentHeight <= (F_FOOTER_HEIGHT_LIMIT + F_HEADER_HEIGHT_LIMIT)) {
+			header_weight = calculateWeight(F_HEADER_HEIGHT_LIMIT);
+			footer_weight = calculateWeight(fCurrentHeight - F_HEADER_HEIGHT_LIMIT);
+		} else {
+			header_weight = calculateWeight(F_HEADER_HEIGHT_LIMIT);
+			footer_weight = calculateWeight(F_FOOTER_HEIGHT_LIMIT);
+			body_weight = calculateWeight(fCurrentHeight - F_FOOTER_HEIGHT_LIMIT - F_HEADER_HEIGHT_LIMIT);
+		}
+		
+		sashForm.setWeights(new int[] {header_weight, body_weight, footer_weight});
+
+	}
+
+	/**
+	 * @param limit
+	 * @return
+	 */
+	private int calculateWeight(float limit) {
+		if (fCurrentHeight == 0) {
+			return 1;
+		}
+		return Math.round((limit / fCurrentHeight) * 100);
+	}	
+	
+}
diff --git a/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/ui/listeners/SearchButtonSelectionListener.java b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/ui/listeners/SearchButtonSelectionListener.java
new file mode 100644
index 0000000..c2ba5e1
--- /dev/null
+++ b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/ui/listeners/SearchButtonSelectionListener.java
@@ -0,0 +1,59 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 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
+ *******************************************************************************/
+
+package org.eclipse.browser.view.ui.listeners;
+
+import org.eclipse.browser.view.ui.sections.SearchSection;
+import org.eclipse.browser.view.util.GoogleSearchLinkManager;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+
+/**
+ * SearchButtonSelectionListener
+ *
+ */
+public class SearchButtonSelectionListener extends SelectionAdapter {
+
+	private SearchSection fSection;	
+	
+	/**
+	 * @param view
+	 */
+	public SearchButtonSelectionListener(SearchSection section) {
+		fSection = section;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
+	 */
+	public void widgetSelected(SelectionEvent e) {
+		handleButtonSelectedSearch();
+	}	
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.events.SelectionAdapter#widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent)
+	 */
+	public void widgetDefaultSelected(SelectionEvent e) {
+		handleButtonSelectedSearch();
+	}
+
+	/**
+	 * 
+	 */
+	private void handleButtonSelectedSearch() {
+		fSection.getView().getOpenLinkAction().update(
+				GoogleSearchLinkManager.getGoogleSearchLink(
+						fSection.getView().getModel(), 
+						fSection.getSearchTextField().getText()));
+		fSection.getView().getOpenLinkAction().run();				
+	}	
+	
+}
diff --git a/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/ui/listeners/SearchTextKeyListener.java b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/ui/listeners/SearchTextKeyListener.java
new file mode 100644
index 0000000..19ffcc1
--- /dev/null
+++ b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/ui/listeners/SearchTextKeyListener.java
@@ -0,0 +1,69 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 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
+ *******************************************************************************/
+
+package org.eclipse.browser.view.ui.listeners;
+
+
+import org.eclipse.browser.view.ui.sections.SearchSection;
+import org.eclipse.browser.view.util.GoogleSearchLinkManager;
+import org.eclipse.swt.events.KeyAdapter;
+import org.eclipse.swt.events.KeyEvent;
+
+/**
+ * SearchTextKeyListener
+ *
+ */
+public class SearchTextKeyListener extends KeyAdapter {
+
+	private static final int F_DEC_ESCAPE = 27;
+	
+	private SearchSection fSection;		
+	
+	/**
+	 * @param view
+	 */
+	public SearchTextKeyListener(SearchSection section) {
+		fSection = section;
+	}
+
+	/* (non-Javadoc)
+	 * @see java.awt.event.KeyAdapter#keyReleased(java.awt.event.KeyEvent)
+	 */
+	public void keyReleased(KeyEvent e) {
+		handleKeyReleasedTextSearch(e);
+	}	
+	
+	/**
+	 * @param e
+	 */
+	private void handleKeyReleasedTextSearch(KeyEvent e) {
+		if ((e.character == '\r') ||
+				(e.character == '\n')) {
+			// ENTER
+			handleEnterTypedSearch();
+		} else if (e.character == F_DEC_ESCAPE) {
+			// DEC 27: ESC
+			fSection.getSearchTextField().setText(""); //$NON-NLS-1$
+		}
+	}	
+	
+	/**
+	 * 
+	 */
+	private void handleEnterTypedSearch() {
+		fSection.getView().getOpenLinkAction().update(
+				GoogleSearchLinkManager.getGoogleSearchLink(
+						fSection.getView().getModel(), 
+						fSection.getSearchTextField().getText()));
+		fSection.getView().getOpenLinkAction().run();				
+	}	
+	
+}
diff --git a/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/ui/listeners/TreeDoubleClickListener.java b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/ui/listeners/TreeDoubleClickListener.java
new file mode 100644
index 0000000..ef5ca12
--- /dev/null
+++ b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/ui/listeners/TreeDoubleClickListener.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 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
+ *******************************************************************************/
+
+package org.eclipse.browser.view.ui.listeners;
+
+import org.eclipse.browser.view.ui.sections.ProjectLinksSection;
+import org.eclipse.jface.viewers.DoubleClickEvent;
+import org.eclipse.jface.viewers.IDoubleClickListener;
+
+/**
+ * TreeDoubleClickListener
+ *
+ */
+public class TreeDoubleClickListener implements IDoubleClickListener {
+
+	private ProjectLinksSection fSection;		
+	
+	/**
+	 * @param view
+	 */
+	public TreeDoubleClickListener(ProjectLinksSection section) {
+		fSection = section;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.IDoubleClickListener#doubleClick(org.eclipse.jface.viewers.DoubleClickEvent)
+	 */
+	public void doubleClick(DoubleClickEvent event) {
+		fSection.getView().getOpenLinkAction().run();
+	}
+
+}
diff --git a/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/ui/listeners/TreeManagerMenuListener.java b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/ui/listeners/TreeManagerMenuListener.java
new file mode 100644
index 0000000..ec9f733
--- /dev/null
+++ b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/ui/listeners/TreeManagerMenuListener.java
@@ -0,0 +1,51 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 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
+ *******************************************************************************/
+
+package org.eclipse.browser.view.ui.listeners;
+
+import org.eclipse.browser.view.ui.sections.ProjectLinksSection;
+import org.eclipse.jface.action.IMenuListener;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.ui.IWorkbenchActionConstants;
+
+/**
+ * TreeManagerMenuListener
+ *
+ */
+public class TreeManagerMenuListener implements IMenuListener {
+
+	private ProjectLinksSection fSection;		
+	
+	/**
+	 * @param view
+	 */
+	public TreeManagerMenuListener(ProjectLinksSection section) {
+		fSection = section;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.action.IMenuListener#menuAboutToShow(org.eclipse.jface.action.IMenuManager)
+	 */
+	public void menuAboutToShow(IMenuManager manager) {
+		fillContextMenu(manager);
+	}
+
+	/**
+	 * @param manager
+	 */
+	private void fillContextMenu(IMenuManager manager) {
+		manager.add(fSection.getView().getOpenLinkAction());
+		// Other plug-ins can contribute thier actions here
+		manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
+	}	
+	
+}
diff --git a/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/ui/listeners/TreeSelectionChangedListener.java b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/ui/listeners/TreeSelectionChangedListener.java
new file mode 100644
index 0000000..dfe2b78
--- /dev/null
+++ b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/ui/listeners/TreeSelectionChangedListener.java
@@ -0,0 +1,61 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 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
+ *******************************************************************************/
+
+package org.eclipse.browser.view.ui.listeners;
+
+import org.eclipse.browser.view.model.LinkObject;
+import org.eclipse.browser.view.ui.sections.ProjectLinksSection;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+
+/**
+ * TreeSelectionChangedListener
+ *
+ */
+public class TreeSelectionChangedListener implements ISelectionChangedListener {
+
+	private ProjectLinksSection fView;		
+
+	/**
+	 * @param view
+	 */
+	public TreeSelectionChangedListener(ProjectLinksSection view) {
+		fView = view;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
+	 */
+	public void selectionChanged(SelectionChangedEvent event) {
+		LinkObject linkObject = getSelectedLinkObject();
+		fView.getView().getOpenLinkAction().update(linkObject);	
+		updateLinkDescriptionText(linkObject);
+	}
+	
+	/**
+	 * @return
+	 */
+	private LinkObject getSelectedLinkObject() {
+		ISelection selection = fView.getTreeViewer().getSelection();
+		Object object = ((IStructuredSelection)selection).getFirstElement();
+		return (LinkObject)object;
+	}	
+	
+	/**
+	 * @param linkObject
+	 */
+	private void updateLinkDescriptionText(LinkObject linkObject) {
+		fView.getLinkDescriptionTextField().setText(
+				linkObject.getFieldDescription());
+	}	
+}
diff --git a/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/ui/providers/BrowserContentProvider.java b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/ui/providers/BrowserContentProvider.java
new file mode 100644
index 0000000..725ad40
--- /dev/null
+++ b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/ui/providers/BrowserContentProvider.java
@@ -0,0 +1,88 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 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
+ *******************************************************************************/
+
+package org.eclipse.browser.view.ui.providers;
+
+import org.eclipse.browser.view.model.LinkModel;
+import org.eclipse.browser.view.model.LinkObject;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+
+/**
+ * BrowserContentProvider
+ *
+ */
+public class BrowserContentProvider implements
+		IStructuredContentProvider, ITreeContentProvider {
+
+	/**
+	 * 
+	 */
+	public BrowserContentProvider() {
+		// NO-OP
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
+	 */
+	public Object[] getElements(Object inputElement) {
+		if (inputElement instanceof LinkModel) {
+			return new Object[]{((LinkModel)inputElement).getRootLinkObject()};
+		}
+		return new Object[0];
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
+	 */
+	public void dispose() {
+		// NO-OP
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
+	 */
+	public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+		// NO-OP
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
+	 */
+	public Object[] getChildren(Object parentElement) {
+		if (parentElement instanceof LinkObject) {
+			return ((LinkObject)parentElement).getFieldChildren().toArray();
+		}
+		return new Object[0];
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
+	 */
+	public Object getParent(Object element) {
+		if (element instanceof LinkObject) {
+			return ((LinkObject)element).getParent();
+		}
+		return null;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
+	 */
+	public boolean hasChildren(Object element) {
+		if (element instanceof LinkObject) {
+			return ((LinkObject)element).hasChildren();
+		}		
+		return false;
+	}
+
+}
diff --git a/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/ui/providers/BrowserLabelProvider.java b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/ui/providers/BrowserLabelProvider.java
new file mode 100644
index 0000000..9187e84
--- /dev/null
+++ b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/ui/providers/BrowserLabelProvider.java
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 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
+ *******************************************************************************/
+
+package org.eclipse.browser.view.ui.providers;
+
+import org.eclipse.browser.view.BrowserPlugin;
+import org.eclipse.browser.view.BrowserPluginImages;
+import org.eclipse.browser.view.model.LinkObject;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.ui.ISharedImages;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * BrowserLabelProvider
+ *
+ */
+public class BrowserLabelProvider extends LabelProvider {
+
+	/**
+	 * 
+	 */
+	public BrowserLabelProvider() {
+		// NO-OP
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.LabelProvider#getImage(java.lang.Object)
+	 */
+	public Image getImage(Object element) {
+		//
+		if ((element instanceof LinkObject) == false) {
+			return PlatformUI.getWorkbench().getSharedImages().getImage(
+					ISharedImages.IMG_OBJS_ERROR_TSK);
+		}
+		
+		LinkObject linkObject = (LinkObject)element;
+		//
+		if (linkObject.getType() == LinkObject.F_TYPE_PROJECT) {
+			return BrowserPlugin.getImage(
+					BrowserPluginImages.F_IMAGE_PATH_PROJECT_NODE);
+		} else if (linkObject.getType() == LinkObject.F_TYPE_SUBPROJECT) {
+			return BrowserPlugin.getImage(
+					BrowserPluginImages.F_IMAGE_PATH_SUBPROJECT_NODE);
+		} else if (linkObject.getType() == LinkObject.F_TYPE_COMPONENT) {
+			return BrowserPlugin.getImage(
+					BrowserPluginImages.F_IMAGE_PATH_COMPONENT_NODE);
+		} else {
+			return PlatformUI.getWorkbench().getSharedImages().getImage(
+					ISharedImages.IMG_OBJS_ERROR_TSK);
+		}
+		
+	}
+	
+}
diff --git a/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/ui/sections/LinkSection.java b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/ui/sections/LinkSection.java
new file mode 100644
index 0000000..c7afc40
--- /dev/null
+++ b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/ui/sections/LinkSection.java
@@ -0,0 +1,91 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 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
+ *******************************************************************************/
+
+package org.eclipse.browser.view.ui.sections;
+
+import org.eclipse.browser.view.ui.EclipseBrowserView;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.forms.SectionPart;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+
+/**
+ * LinkSection
+ *
+ */
+public abstract class LinkSection extends SectionPart {
+
+	private EclipseBrowserView fView;	
+	
+	private FormToolkit fToolkit;	
+	
+	public LinkSection(EclipseBrowserView view, Composite parent, 
+			FormToolkit toolkit, int style,
+			String text, String description) {
+		super(parent, toolkit, style);
+		fToolkit = toolkit;
+		fView = view;
+		initialize(fView.getManagedForm());
+		customizeUISection(text, description);
+	}
+	
+	/**
+	 * 
+	 */
+	public abstract void createUI();
+	
+	/**
+	 * 
+	 */
+	public abstract void createListeners();
+
+	/**
+	 * @param text
+	 * @param description
+	 */
+	private void customizeUISection(String text, String description) {
+		getSection().clientVerticalSpacing = 4;
+		getSection().marginHeight = 3;
+		getSection().marginWidth = 5; 
+		getSection().setText(text);
+		getSection().setDescription(description);
+		getSection().setExpanded(true);
+		GridData data = new GridData(GridData.FILL_HORIZONTAL);
+		getSection().setLayoutData(data);
+	}		
+
+	/**
+	 * @param parent
+	 * @param columns
+	 * @return
+	 */
+	protected Composite createUISectionContainer(Composite parent, int columns) {
+		Composite container = fToolkit.createComposite(parent);
+		GridLayout layout = new GridLayout(columns, false);
+		container.setLayout(layout);
+		return container;		
+	}		
+	
+	/**
+	 * @return
+	 */
+	public EclipseBrowserView getView() {
+		return fView;
+	}		
+	
+	/**
+	 * @return
+	 */
+	public FormToolkit getToolkit() {
+		return fToolkit;
+	}
+}
diff --git a/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/ui/sections/ProjectLinksSection.java b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/ui/sections/ProjectLinksSection.java
new file mode 100644
index 0000000..ced834b
--- /dev/null
+++ b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/ui/sections/ProjectLinksSection.java
@@ -0,0 +1,226 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 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
+ *******************************************************************************/
+
+package org.eclipse.browser.view.ui.sections;
+
+import org.eclipse.browser.view.ui.EclipseBrowserView;
+import org.eclipse.browser.view.ui.actions.CollapseAction;
+import org.eclipse.browser.view.ui.listeners.HandCursorDisposeListener;
+import org.eclipse.browser.view.ui.listeners.TreeDoubleClickListener;
+import org.eclipse.browser.view.ui.listeners.TreeManagerMenuListener;
+import org.eclipse.browser.view.ui.listeners.TreeSelectionChangedListener;
+import org.eclipse.browser.view.ui.providers.BrowserContentProvider;
+import org.eclipse.browser.view.ui.providers.BrowserLabelProvider;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.action.ToolBarManager;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Cursor;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.swt.widgets.ToolBar;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+
+/**
+ * ProjectLinksSection
+ *
+ */
+public class ProjectLinksSection extends LinkSection {
+
+	private TreeViewer fTreeViewer;
+	
+	private CollapseAction fCollapseAction;
+	
+	private Text fLinkDescriptionText;
+	
+	private ToolBar fSectionToolbar;
+
+	private Cursor fHandCursor;	
+	
+	private MenuManager fTreeMenuManager;
+	
+	/**
+	 * @param view
+	 * @param parent
+	 * @param toolkit
+	 * @param style
+	 * @param text
+	 * @param description
+	 */
+	public ProjectLinksSection(EclipseBrowserView view, Composite parent,
+			FormToolkit toolkit, int style, String text, String description) {
+		super(view, parent, toolkit, style, text, description);
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.browser.view.ui.EclipseLinkSection#createUI()
+	 */
+	public void createUI() {
+		//
+		Composite client = createUISectionContainer(getSection(), 1);
+		//
+		createActions();
+		//
+		createUITreeViewer(client);
+		//
+		createUIContextMenuTree();
+		//
+		createUISectionToolbar();
+		//
+		createUITextLinkDescription(client);
+		
+		getToolkit().paintBordersFor(client);
+		getSection().setClient(client);
+		
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.browser.view.ui.EclipseLinkSection#createListeners()
+	 */
+	public void createListeners() {
+		//
+		createListenersTreeViewer();
+		//
+		createListenersTreeMenuManager();
+		//
+		createListenersSectionToolbar();
+	}
+
+	/**
+	 * 
+	 */
+	private void createActions() {
+		//
+		fCollapseAction = new CollapseAction();
+	}	
+	
+	/**
+	 * 
+	 */
+	private void createUITextLinkDescription(Composite parent) {
+		int style = SWT.MULTI | SWT.READ_ONLY | SWT.WRAP;
+		fLinkDescriptionText = getToolkit().createText(parent, "", style); //$NON-NLS-1$
+		fLinkDescriptionText.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_DARK_GRAY));
+		GridData data = new GridData(GridData.FILL_HORIZONTAL);
+		data.widthHint = 10;
+		data.heightHint = 30;
+		fLinkDescriptionText.setLayoutData(data);		
+	}
+
+	/**
+	 * 
+	 */
+	private void createUISectionToolbar() {
+		
+		ToolBarManager toolBarManager = new ToolBarManager(SWT.FLAT);
+		fSectionToolbar = toolBarManager.createControl(getSection());
+		fHandCursor = new Cursor(Display.getCurrent(), SWT.CURSOR_HAND);
+		fSectionToolbar.setCursor(fHandCursor);
+		fCollapseAction.setTreeViewer(fTreeViewer);
+		fCollapseAction.setTreeObject(getView().getModel().getRootLinkObject());
+		toolBarManager.add(fCollapseAction);
+		toolBarManager.update(true);
+		getSection().setTextClient(fSectionToolbar);
+	}			
+	
+	/**
+	 * @param parent
+	 */
+	private void createUITreeViewer(Composite parent) {
+		
+		fTreeViewer = new TreeViewer(parent, 
+				SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
+		fTreeViewer.setContentProvider(new BrowserContentProvider());
+		fTreeViewer.setLabelProvider(new BrowserLabelProvider());
+		fTreeViewer.setComparator(null);
+		fTreeViewer.setAutoExpandLevel(2);
+		fTreeViewer.setInput(getView().getModel());		
+
+		int style = GridData.FILL_HORIZONTAL | GridData.FILL_VERTICAL;
+		GridData data = new GridData(style);
+		data.heightHint = 150;
+		fTreeViewer.getTree().setLayoutData(data);
+		
+	}
+
+	/**
+	 * 
+	 */
+	private void createUIContextMenuTree() {
+		fTreeMenuManager = new MenuManager("#PopupMenu"); //$NON-NLS-1$
+		fTreeMenuManager.setRemoveAllWhenShown(true);
+		Menu menu = fTreeMenuManager.createContextMenu(fTreeViewer.getControl());
+		fTreeViewer.getControl().setMenu(menu);
+	}
+	
+	/**
+	 * @return
+	 */
+	public Cursor getHandCursor() {
+		return fHandCursor;
+	}
+
+	/**
+	 * @return
+	 */
+	public TreeViewer getTreeViewer() {
+		return fTreeViewer;
+	}
+	
+	/**
+	 * @return
+	 */
+	public Text getLinkDescriptionTextField() {
+		return fLinkDescriptionText;
+	}	
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.forms.SectionPart#setFocus()
+	 */
+	public void setFocus() {
+		if (fTreeViewer != null) {
+			fTreeViewer.getControl().setFocus();
+		}
+	}
+	
+	/**
+	 * 
+	 */
+	private void createListenersTreeViewer() {
+		//
+		fTreeViewer.addDoubleClickListener(new TreeDoubleClickListener(this));
+		// 
+		fTreeViewer.addSelectionChangedListener(
+				new TreeSelectionChangedListener(this));
+	}
+	
+	/**
+	 * 
+	 */
+	private void createListenersSectionToolbar() {
+		// Cursor needs to be explicitly disposed
+		fSectionToolbar.addDisposeListener(new HandCursorDisposeListener(this));		
+	}
+
+	/**
+	 * 
+	 */
+	private void createListenersTreeMenuManager() {
+		fTreeMenuManager.addMenuListener(new TreeManagerMenuListener(this));		
+		// Listener must be added before registering the context menu; 
+		// otherwise and error will show up in the log
+		getView().getSite().registerContextMenu(fTreeMenuManager, fTreeViewer);		
+	}	
+
+}
diff --git a/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/ui/sections/SearchSection.java b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/ui/sections/SearchSection.java
new file mode 100644
index 0000000..2d83f7b
--- /dev/null
+++ b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/ui/sections/SearchSection.java
@@ -0,0 +1,150 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 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
+ *******************************************************************************/
+
+package org.eclipse.browser.view.ui.sections;
+
+import org.eclipse.browser.view.BrowserMessages;
+import org.eclipse.browser.view.BrowserPlugin;
+import org.eclipse.browser.view.BrowserPluginImages;
+import org.eclipse.browser.view.ui.EclipseBrowserView;
+import org.eclipse.browser.view.ui.listeners.FormTextHyperlinkListener;
+import org.eclipse.browser.view.ui.listeners.SearchButtonSelectionListener;
+import org.eclipse.browser.view.ui.listeners.SearchTextKeyListener;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.forms.widgets.FormText;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+
+/**
+ * SearchSection
+ *
+ */
+public class SearchSection extends LinkSection {
+
+	private Text fSearchText;
+	
+	private Button fSearchButton;
+	
+	private FormText fGoogleImageFormText;		
+	
+	/**
+	 * @param view
+	 * @param parent
+	 * @param toolkit
+	 * @param style
+	 * @param text
+	 * @param description
+	 */
+	public SearchSection(EclipseBrowserView view, Composite parent,
+			FormToolkit toolkit, int style, String text, String description) {
+		super(view, parent, toolkit, style, text, description);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.browser.view.ui.EclipseLinkSection#createUI()
+	 */
+	public void createUI() {
+		//
+		Composite client = createUISectionContainer(getSection(), 4);
+		//
+		createUIFormTextGoogleImage(client);
+		//
+		createUITextSearch(client);
+		//
+		createUIButtonSearch(client);
+		
+		getToolkit().paintBordersFor(client);
+		getSection().setClient(client);		
+	}	
+	
+	/**
+	 * @param parent
+	 */
+	private void createUIButtonSearch(Composite parent) {
+		fSearchButton = getToolkit().createButton(parent, BrowserMessages.SearchSection_buttonNameSearch, SWT.PUSH);
+		GridData data = new GridData(GridData.VERTICAL_ALIGN_CENTER);
+		fSearchButton.setLayoutData(data);
+	}
+
+	/**
+	 * @param parent
+	 */
+	private void createUITextSearch(Composite parent) {
+		fSearchText = getToolkit().createText(parent, "", SWT.NONE); //$NON-NLS-1$
+		fSearchText.setTextLimit(256);
+		GridData data = new GridData(GridData.FILL_HORIZONTAL);
+		data.widthHint = 10;
+		fSearchText.setLayoutData(data);
+	}
+
+	/**
+	 * @param parent
+	 */
+	private void createUIFormTextGoogleImage(Composite parent) {
+		//fToolkit.createLabel(parent, "Google: ");
+		fGoogleImageFormText = getToolkit().createFormText(parent, true);
+		// Bug in forms
+		String text = "<form><p><span color=\"default\">.</span><a href=\"google.com\"><img href=\"google\"/></a></p></form>"; //$NON-NLS-1$
+		fGoogleImageFormText.marginHeight = 0;
+		fGoogleImageFormText.setColor("default", Display.getCurrent().getSystemColor(SWT.COLOR_WHITE)); //$NON-NLS-1$
+		fGoogleImageFormText.setText(text, true, false);
+		fGoogleImageFormText.setImage("google", BrowserPlugin.getImage(BrowserPluginImages.F_IMAGE_PATH_GOOGLE)); //$NON-NLS-1$
+		GridData data = new GridData(GridData.VERTICAL_ALIGN_CENTER);
+		fGoogleImageFormText.setLayoutData(data);
+	}	
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.browser.view.ui.EclipseLinkSection#createListeners()
+	 */
+	public void createListeners() {
+		//
+		createListenersFormTextGoogleImage();
+		//
+		createListenersTextSearch();
+		//
+		createListenersButtonSearch();
+	}
+
+	/**
+	 * 
+	 */
+	private void createListenersTextSearch() {
+		fSearchText.addKeyListener(new SearchTextKeyListener(this));
+	}
+
+	/**
+	 * 
+	 */
+	private void createListenersButtonSearch() {
+		fSearchButton.addSelectionListener(
+				new SearchButtonSelectionListener(this));
+	}
+	
+	/**
+	 * 
+	 */
+	private void createListenersFormTextGoogleImage() {
+		fGoogleImageFormText.addHyperlinkListener(
+				new FormTextHyperlinkListener(getView()));		
+	}
+	
+	/**
+	 * @return
+	 */
+	public Text getSearchTextField() {
+		return fSearchText;
+	}	
+
+}
diff --git a/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/ui/sections/UsefulLinksSection.java b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/ui/sections/UsefulLinksSection.java
new file mode 100644
index 0000000..4c442bc
--- /dev/null
+++ b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/ui/sections/UsefulLinksSection.java
@@ -0,0 +1,102 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 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
+ *******************************************************************************/
+
+package org.eclipse.browser.view.ui.sections;
+
+import org.eclipse.browser.view.BrowserPlugin;
+import org.eclipse.browser.view.BrowserPluginImages;
+import org.eclipse.browser.view.model.LinkObject;
+import org.eclipse.browser.view.ui.EclipseBrowserView;
+import org.eclipse.browser.view.ui.listeners.FormTextHyperlinkListener;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.forms.widgets.FormText;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+
+/**
+ * UsefulLinksSection
+ *
+ */
+public class UsefulLinksSection extends LinkSection {
+	
+	private FormText fUsefulLinksFormText;	
+	
+	/**
+	 * @param view
+	 * @param parent
+	 * @param toolkit
+	 * @param style
+	 * @param text
+	 * @param description
+	 */
+	public UsefulLinksSection(EclipseBrowserView view, Composite parent,
+			FormToolkit toolkit, int style, String text, String description) {
+		super(view, parent, toolkit, style, text, description);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.browser.view.ui.EclipseLinkSection#createUI()
+	 */
+	public void createUI() {
+		//
+		Composite client = createUISectionContainer(getSection(), 1);
+		//
+		createUIFormTextLinks(client);
+		getToolkit().paintBordersFor(client);
+		getSection().setClient(client);
+	}
+
+	/**
+	 * @param parent
+	 */
+	private void createUIFormTextLinks(Composite parent) {
+		LinkObject[] linkObjects = 
+			BrowserPlugin.getUsefulLinkManager().getUsefulLinks(getView().getModel());
+		StringBuffer formTextBuffer = new StringBuffer("<form>"); //$NON-NLS-1$
+		//
+		for (int i = 0; i < linkObjects.length; i++) {
+			formTextBuffer.append("<li style=\"image\" value=\"world\" bindent=\"5\">"); //$NON-NLS-1$
+			formTextBuffer.append("<a href=\""); //$NON-NLS-1$
+			formTextBuffer.append(linkObjects[i].getFieldLink().hashCode());
+			formTextBuffer.append("\">"); //$NON-NLS-1$
+			formTextBuffer.append(linkObjects[i].getFieldName());
+			formTextBuffer.append("</a></li>"); //$NON-NLS-1$
+		}
+		formTextBuffer.append("</form>"); //$NON-NLS-1$
+		
+		//		
+		fUsefulLinksFormText = getToolkit().createFormText(parent, true);
+		fUsefulLinksFormText.marginHeight = 2;		
+		fUsefulLinksFormText.setText(formTextBuffer.toString(), true, false);
+		fUsefulLinksFormText.setImage("world", BrowserPlugin.getImage(BrowserPluginImages.F_IMAGE_PATH_LINK)); //$NON-NLS-1$
+	}	
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.browser.view.ui.EclipseLinkSection#createListeners()
+	 */
+	public void createListeners() {
+		//
+		createListenersFormTextLinks();
+	}	
+	
+	/**
+	 * 
+	 */
+	private void createListenersFormTextLinks() {
+		//
+		if (fUsefulLinksFormText == null) {
+			return;
+		}
+		//
+		fUsefulLinksFormText.addHyperlinkListener(
+				new FormTextHyperlinkListener(getView()));
+	}
+	
+}
diff --git a/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/util/GoogleSearchLinkManager.java b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/util/GoogleSearchLinkManager.java
new file mode 100644
index 0000000..c647252
--- /dev/null
+++ b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/util/GoogleSearchLinkManager.java
@@ -0,0 +1,125 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 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
+ *******************************************************************************/
+
+package org.eclipse.browser.view.util;
+
+import org.eclipse.browser.view.BrowserMessages;
+import org.eclipse.browser.view.model.LinkModel;
+import org.eclipse.browser.view.model.LinkObject;
+
+/**
+ * ImageLinkManager
+ *
+ */
+public class GoogleSearchLinkManager {
+
+	private static final char F_PERCENTAGE = '%';
+
+	private static final int F_DEC_LOWER_Z = 122;
+
+	private static final int F_DEC_LOWER_A = 97;
+
+	private static final int F_DEC_UPPER_Z = 90;
+
+	private static final int F_DEC_UPPER_A = 65;
+
+	private static final int F_DEC_NINE = 57;
+
+	private static final int F_DEC_ZERO = 48;
+
+	private static final int F_DEC_SPACE = 32;
+
+	public final static String F_GOOGLE_QUERY_URL = "http://www.google.com/search?q="; //$NON-NLS-1$
+	
+	private LinkObject fGoogleSearchLink;
+	
+	private static GoogleSearchLinkManager fInstance;
+	
+	/**
+	 * 
+	 */
+	protected GoogleSearchLinkManager() {
+		fGoogleSearchLink = null;
+	}
+
+	/**
+	 * @return
+	 */
+	public static GoogleSearchLinkManager getInstance() {
+		if (fInstance == null) {
+			fInstance = new GoogleSearchLinkManager();
+		}
+		return fInstance;
+	}
+	
+	/**
+	 * @param model
+	 * @return
+	 */
+	public static LinkObject getGoogleSearchLink(LinkModel model, String searchText) {
+		return getInstance().createGoogleSearchLink(model, searchText);
+	}
+	
+	/**
+	 * @param model
+	 * @return
+	 */
+	public LinkObject createGoogleSearchLink(LinkModel model, String searchText) {
+		
+		// Assemble search query URL
+		String full_url = F_GOOGLE_QUERY_URL + encodeSearchText(searchText);
+		// Create a new google search link if none exists; otherwise, resue the
+		// old one
+		if (fGoogleSearchLink == null) {
+			fGoogleSearchLink = model.getModelFactory().createComponentLink(null);
+			fGoogleSearchLink.setFieldName(BrowserMessages.GoogleSearchLinkManager_linkNameGoogleSearch);
+			fGoogleSearchLink.setFieldLink(full_url);
+			fGoogleSearchLink.setFieldDescription(BrowserMessages.GoogleSearchLinkManager_linkDescriptionGoogleSearch);			
+		} else {
+			fGoogleSearchLink.setFieldLink(full_url);
+		}
+		return fGoogleSearchLink;
+	}
+
+	/**
+	 * @param searchText
+	 * @return
+	 */
+	private String encodeSearchText(String searchText) {
+		StringBuffer buffer = new StringBuffer();
+		char previous_char = F_DEC_SPACE;
+		for (int i = 0; i < searchText.length(); i++) {
+			char current_char = searchText.charAt(i);
+			// Cannot use Character class for tests
+			// See URL specification: http://www.ietf.org/rfc/rfc1738.txt
+			// DEC 48 to 57:  0 to 9
+			// DEC 65 to 90:  A to Z
+			// DEC 97 to 122: a to z
+			// DEC 32: space
+			if ((current_char == F_DEC_SPACE) && (previous_char == F_DEC_SPACE)) {
+				// Ignore consecutive spaces
+			} else if (((current_char >= F_DEC_ZERO) && (current_char <= F_DEC_NINE)) ||
+					(current_char >= F_DEC_UPPER_A) && (current_char <= F_DEC_UPPER_Z) ||
+					(current_char >= F_DEC_LOWER_A) && (current_char <= F_DEC_LOWER_Z)) {
+				// Append the alphanumeric character as is
+				buffer.append(current_char);
+			} else {
+				// Encode the non-alphanumeric character into its hex value
+				buffer.append(F_PERCENTAGE);
+				buffer.append(Integer.toHexString(current_char));
+			}
+			
+			previous_char = current_char;
+		}
+		return buffer.toString();
+	}	
+	
+}
diff --git a/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/util/ImageLinkManager.java b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/util/ImageLinkManager.java
new file mode 100644
index 0000000..d5543cf
--- /dev/null
+++ b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/util/ImageLinkManager.java
@@ -0,0 +1,92 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 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
+ *******************************************************************************/
+
+package org.eclipse.browser.view.util;
+
+import org.eclipse.browser.view.BrowserMessages;
+import org.eclipse.browser.view.model.LinkModel;
+import org.eclipse.browser.view.model.LinkObject;
+
+/**
+ * ImageLinkManager
+ *
+ */
+public class ImageLinkManager {
+
+	private LinkObject fEclipseImageLink;
+	
+	private LinkObject fGoogleImageLink;
+	
+	private static ImageLinkManager fInstance;
+	
+	/**
+	 * 
+	 */
+	protected ImageLinkManager() {
+		fEclipseImageLink = null;
+		fGoogleImageLink = null;
+	}
+
+	/**
+	 * @return
+	 */
+	public static ImageLinkManager getInstance() {
+		if (fInstance == null) {
+			fInstance = new ImageLinkManager();
+		}
+		return fInstance;
+	}
+	
+	/**
+	 * @param model
+	 * @return
+	 */
+	public static LinkObject getEclipseImageLink(LinkModel model) {
+		return getInstance().createEclipseImageLink(model);
+	}
+	
+	/**
+	 * @param model
+	 * @return
+	 */
+	public LinkObject createEclipseImageLink(LinkModel model) {
+		if (fEclipseImageLink == null) {
+			fEclipseImageLink = model.getModelFactory().createComponentLink(null);
+			fEclipseImageLink.setFieldName(BrowserMessages.ImageLinkManager_linkNameEclipse);
+			fEclipseImageLink.setFieldLink("http://www.eclipse.org/"); //$NON-NLS-1$
+			fEclipseImageLink.setFieldDescription(BrowserMessages.ImageLinkManager_linkDescEclipse);				
+		}
+		return fEclipseImageLink;
+	}
+
+	/**
+	 * @param model
+	 * @return
+	 */
+	public static LinkObject getGoogleImageLink(LinkModel model) {
+		return getInstance().createGoogleImageLink(model);
+	}
+	
+	/**
+	 * @param model
+	 * @return
+	 */
+	public LinkObject createGoogleImageLink(LinkModel model) {
+		if (fGoogleImageLink == null) {
+			fGoogleImageLink = model.getModelFactory().createComponentLink(null);
+			fGoogleImageLink.setFieldName(BrowserMessages.ImageLinkManager_linkNameGoogle);
+			fGoogleImageLink.setFieldLink("http://www.google.com/"); //$NON-NLS-1$
+			fGoogleImageLink.setFieldDescription(BrowserMessages.ImageLinkManager_linkDescGoogle);			
+		}
+		return fGoogleImageLink;
+	}	
+
+}
diff --git a/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/util/UsefulLinkManager.java b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/util/UsefulLinkManager.java
new file mode 100644
index 0000000..5c949d9
--- /dev/null
+++ b/presentations/eclipse-con/2008/plugins/org.eclipse.browser/src/org/eclipse/browser/view/util/UsefulLinkManager.java
@@ -0,0 +1,123 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 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
+ *******************************************************************************/
+
+package org.eclipse.browser.view.util;
+
+import org.eclipse.browser.view.BrowserMessages;
+import org.eclipse.browser.view.BrowserPlugin;
+import org.eclipse.browser.view.model.LinkModel;
+import org.eclipse.browser.view.model.LinkObject;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtensionRegistry;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.osgi.util.NLS;
+
+/**
+ * UsefulLinkManager
+ *
+ */
+public class UsefulLinkManager {
+
+	public static final String F_POINT_ID = "org.eclipse.browser.usefulLinks";	 //$NON-NLS-1$
+	
+	public static final String F_ELEMENT_LINK_OBJECT = "linkObject"; //$NON-NLS-1$
+	
+	public static final String F_ATTRIBUTE_NAME = "name"; //$NON-NLS-1$
+	
+	public static final String F_ATTRIBUTE_LINK = "link"; //$NON-NLS-1$
+	
+	public static final String F_ATTRIBUTE_DESCRIPTION = "description"; //$NON-NLS-1$
+	
+	/**
+	 * 
+	 */
+	public UsefulLinkManager() {
+		// NO-OP
+	}
+
+	/**
+	 * @return
+	 */
+	public LinkObject[] getUsefulLinks(LinkModel model) {
+		
+		IConfigurationElement[] elements = getElementsFromRegistry();
+		//
+		LinkObject[] linkObjects = new LinkObject[elements.length];
+		//
+		for (int i = 0; i < elements.length; i++) {
+			//
+			if (elements[i].getName().equals(F_ELEMENT_LINK_OBJECT) ==  false) {
+				continue;
+			}
+			
+			linkObjects[i] = model.getModelFactory().createComponentLink(null);
+
+			String name = elements[i].getAttribute(F_ATTRIBUTE_NAME);
+			String link = elements[i].getAttribute(F_ATTRIBUTE_LINK);
+			String description = elements[i].getAttribute(F_ATTRIBUTE_DESCRIPTION);
+			//
+			if ((name == null) ||
+					(name.length() == 0)) {
+				BrowserPlugin.logException(
+						NLS.bind(
+								BrowserMessages.UsefulLinkManager_errorRequiredAttributeMissing, 
+								F_ATTRIBUTE_NAME), 
+						NLS.bind(
+								BrowserMessages.UsefulLinkManager_errorMissingAttribute, 
+								F_ATTRIBUTE_NAME), 
+						new Exception());
+			}
+			//
+			if ((link == null) ||
+					(link.length() == 0)) {
+				BrowserPlugin.logException(
+						NLS.bind(
+								BrowserMessages.UsefulLinkManager_errorRequiredAttributeMissing, 
+								F_ATTRIBUTE_LINK), 
+						NLS.bind(
+								BrowserMessages.UsefulLinkManager_errorMissingAttribute, 
+								F_ATTRIBUTE_LINK), 
+						new Exception());
+			}
+			//
+			if ((description == null) ||
+					(description.length() == 0)) {
+				description = BrowserMessages.UsefulLinkManager_defaultMsgDescriptionNotSpecified;
+			}
+			//
+			linkObjects[i].setFieldName(name);
+			linkObjects[i].setFieldLink(link);
+			linkObjects[i].setFieldDescription(description);				
+		}
+		
+		return linkObjects;
+	}
+
+	/**
+	 * @return
+	 */
+	private IConfigurationElement[] getElementsFromRegistry() {
+		//
+		IExtensionRegistry registry = Platform.getExtensionRegistry();
+		//
+		IConfigurationElement[] elements = 
+			registry.getConfigurationElementsFor(F_POINT_ID);
+		return elements;
+	}
+	
+	/**
+	 * @return
+	 */
+	public int getUsefulLinksCount() {
+		return getElementsFromRegistry().length;
+	}
+	
+}
diff --git a/presentations/eclipse-con/2008/slides/PDE 101.ppt b/presentations/eclipse-con/2008/slides/PDE 101.ppt
new file mode 100644
index 0000000..75d9a0b
--- /dev/null
+++ b/presentations/eclipse-con/2008/slides/PDE 101.ppt
Binary files differ
diff --git a/presentations/eclipse-con/2008/slides/PDE 201.ppt b/presentations/eclipse-con/2008/slides/PDE 201.ppt
new file mode 100644
index 0000000..75d9a0b
--- /dev/null
+++ b/presentations/eclipse-con/2008/slides/PDE 201.ppt
Binary files differ