<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>

<head>
<title>Install Wizard (Oomph Setup Documentation)</title>

<link rel="stylesheet" href="../../book.css">

<noscript></noscript>
<script type="text/javascript">
function windowTitle()
{
    if (location.href.indexOf('is-external=true') == -1) {
        parent.document.title="Install Wizard (Oomph Setup Documentation)";
    }
}
</script>

<link rel="stylesheet" href="../../editor.css">

<script src="http://code.jquery.com/jquery-1.11.1.min.js"></script>

<script src="http://code.jquery.com/ui/1.11.0/jquery-ui.min.js"></script>

<link rel="stylesheet" href="http://code.jquery.com/ui/1.11.1/themes/smoothness/jquery-ui.css">

<script>
$(function() {
$( ".resizable" ).resizable({ handles:"s,e,se", autoHide:true });
});
</script>

<script type="text/javascript">
function maximize(id)
{
  e = document.getElementById('max_' + id);
  c1 = document.getElementById('editor_content_1_' + id);
  c2 = document.getElementById('editor_content_2_' + id);
  pv = document.getElementById('max_pv_' + id);
  if (e.className == 'max')
  {
    e.className = 'rst';
    e.setAttribute('title', 'Restore');
    c1.setAttribute('style_orig', c1.getAttribute('style'));
    c1.setAttribute('style', 'border:2px solid #99b4d1; border-top:none;');
    c2.setAttribute('style', '');
    if (pv != null)
    {
      pv.setAttribute('width_orig', pv.getAttribute('width'));
      pv.setAttribute('width', '');
    }
  }
  else
  {
    e.className = 'max';
    e.setAttribute('title', 'Maximize');
    c1.setAttribute('style', c1.getAttribute('style_orig'));
    c1.setAttribute('style_orig', '');
    c2.setAttribute('style', 'overflow:scroll; width:100%; height:100%;');
    if (pv != null)
    {
      pv.setAttribute('width', pv.getAttribute('width_orig'));
      pv.setAttribute('width_orig', '');
    }
  }
}
</script>
</head>

<body bgcolor="white" onload="windowTitle();">
<!-- <div class="help_breadcrumbs breadcrumbs_top"><a href="../../Overview.html" title="Oomph Setup Documentation">Oomph Setup Documentation</a> > <a href="../index.html" title="Category in Oomph Setup Documentation">User Guide</a> > <a href="index.html" title="Category in Oomph Setup Documentation">Wizards and Wizard Pages</a></div> -->

<table border="0">
	<tr>
		<td width="100%"><h1>Install Wizard</h1></td>
		<td align="right" valign="middle" nowrap><a href="index.html" title="Backward to Wizards and Wizard Pages"><img src="../../../images/backward.png" border="0"></a>&nbsp;<a href="DocImportWizard.html" title="Forward to Import Wizard"><img src="../../../images/forward.png" border="0"></a></td>
	</tr>
</table>
<p>
 The install wizard is the basis for Oomph's bootstrap-<a href="../../concepts/DocTask.html#DocTrigger" title="Chapter in Oomph Setup Documentation">triggered</a>, automated installation and provisioning process.
 

<div style="display: inline-block"><img src="../../../images/trees/30xrELXA4PEQ6rtR5ibuOtGByiI=.png"/></div>

 </p>
 <p>
 


<p>
The wizards's footer contains the following:

<a id="DocInstallWizard_2_table"/><table class="bullets">
<tr>
<td><img src="../../../images/trees/sHgxVOWhebWGeG4VPfi04TEWk0s=.png"/></td>
<td>


Brings up this help.



</td>
</tr>
<tr>
<td><img src="../../../images/trees/wvN6HibX-aeSTivHqduoRbHU5go=.png"/></td>
<td>


Navigates to the previous page.



</td>
</tr>
<tr>
<td><img src="../../../images/trees/5ppp1pM9_DzrpsUYFxo9LM2a6IQ=.png"/></td>
<td>


Navigates to the next page.



</td>
</tr>
<tr>
<td><img src="../../../images/trees/IbtoiKhSpXd4w9r_gYSbX1evYDc=.png"/></td>
<td>


Completes the wizard, performing any final actions.



</td>
</tr>
<tr>
<td><img src="../../../images/trees/6AEYv1O6zoEl3yp2A7vRBHZeSAo=.png"/></td>
<td>


Closes the wizard, taking no further action.



</td>
</tr>
<tr>
<td><img src="../../../images/trees/7GBW0o_q3lAPMC0kyJInPGwrZLU=.png"/></td>
<td>
Brings up the equivalent of Eclipse's <span class="selectstep">Window</span>&nbsp;&rarr; <span class="selectstep">Preferences&hellip;</span>&nbsp;&rarr; <span class="selectstep">General</span>&nbsp;&rarr; <span class="selectstep">Network&nbsp;Connections</span> preferences.
 Configuration of the network proxies is a necessary first step for users working in an environment behind a fire wall;
 none of Oomph's Internet-hosed resources will be accessible without that configuration.
 All the configured network settings will be propagated to the installed product.

</td>
</tr>
<tr>
<td><img src="../../../images/trees/ew5C1Mp70QovHSwVdDgQXIXHjJE=.png"/></td>
<td>
Brings up the equivalent of Eclipse's <span class="selectstep">Window</span>&nbsp;&rarr; <span class="selectstep">Preferences&hellip;</span>&nbsp;&rarr; <span class="selectstep">General</span>&nbsp;&rarr; <span class="selectstep">Network&nbsp;Connections</span>&nbsp;&rarr; <span class="selectstep">SSH2</span> preferences.
 Confirming the SSH2 settings during initial installation is a good idea when using any technologies that are based on SSH access,
 for example, if you plan to clone Git projects via public-key encryption.
 All the configured SSH2 settings will be propagated to the installed product.

</td>
</tr>
<tr>
<td><img src="../../../images/trees/V-kh8PYyH3eki_hWca__jwYm5Fg=.png"/></td>
<td>
Updates the installer itself to the last Internet-hosted version.
 The wizard always checks whether updates are available.
 If so, this button is animated, otherwise it's disabled.

</td>
</tr>
<tr>
<td><img src="../../../images/trees/F3Ep2SiFFeUJwDapoSXIrKThfs8=.png"/></td>
<td>
Indicates which version, along with which build of that version, you're currently using.
 This is particularly useful when reporting problems.
 It acts as a link that brings up the about dialog.

</td>
</tr>
</table>
<p>

 </p>
 <p>
 The following downloads are available for this Eclipse RCP application.
 <ul>
 <li>
 <a rel="nofollow" href="http://download.eclipse.org/oomph/products/org.eclipse.oomph.setup.installer.product-win32.win32.x86_64.zip">Windows 64 bit</a>
 </li>
 <li>
 <a rel="nofollow" href="http://download.eclipse.org/oomph/products/org.eclipse.oomph.setup.installer.product-win32.win32.x86.zip">Windows 32 bit</a>
 </li>
 <li>
 <a rel="nofollow" href="http://download.eclipse.org/oomph/products/org.eclipse.oomph.setup.installer.product-macosx.cocoa.x86_64.tar.gz">Mac OS 64 bit</a>
 </li>
 <li>
 <a rel="nofollow" class="external log" href="http://download.eclipse.org/oomph/products/org.eclipse.oomph.setup.installer.product-linux.gtk.x86_64.zip">Linux 64 bit</a>
 </li>
 <li>
 <a rel="nofollow" class="external log" href="http://download.eclipse.org/oomph/products/org.eclipse.oomph.setup.installer.product-linux.gtk.x86.zip">Linux 32 bit</a>
 </li>
 </ul>
 This download can be "installed" just like <a href="https://wiki.eclipse.org/Eclipse/Installation">Eclipse itself</a>.
 </p>

<p align="right">
<a href="index.html" title="Backward to Wizards and Wizard Pages"><img src="../../../images/backward.png" border="0"></a>&nbsp;<a href="DocImportWizard.html" title="Forward to Import Wizard"><img src="../../../images/forward.png" border="0"></a></p>
<!-- <div class="help_breadcrumbs breadcrumbs_bottom"><a href="../../Overview.html" title="Oomph Setup Documentation">Oomph Setup Documentation</a> > <a href="../index.html" title="Category in Oomph Setup Documentation">User Guide</a> > <a href="index.html" title="Category in Oomph Setup Documentation">Wizards and Wizard Pages</a></div> -->

<div class="copyright">Copyright (c) 2014 Eike Stepper (Loehne, Germany) and others.<br>All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v2.0 which accompanies this distribution, and is available at http://www.eclipse.org/legal/epl-v20.html</div>
</body>
</html>
