<?php

require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/app.class.php");
require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/nav.class.php");
require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/menu.class.php");

$App 	= new App();
$Nav	= new Nav();
$Menu 	= new Menu();

include($App->getProjectCommon());

#
# Begin: page-specific settings.  Change these.
$pageTitle 		= "Installing Mobile Tools for Java<sup><small>TM</small></sup>";
$pageKeywords	= "mobile, java, tools";
$pageAuthor		= "Diego Madruga Sandin";


# Paste your HTML content between the EOHTML markers!
$html = <<<EOHTML

<div id="maincontent">
	<div id="midcolumn">
        <h1>$pageTitle</h1>
        <p>This document provides instructions on how to install or upgrade
           the MTJ plug-in/feature set. In addition, once you have finished the
           installation itself, you will need to configure MTJ's settings as well as
           some Eclipse settings.
         </p>
		<h3 id="step0">Before you begin</h3>
		<ol>
			<li>
			<p>Please make sure you have all the <a href="/mtj/development/tutorial/prerequisites.php">prerequisites</a>.
			</p>
			</li>
			<li>
			<p>If you have been using Eclipse without MTJ to do J2ME
			development using a Wireless Toolkit, your Eclipse project may need
			some classpath changes.</p>
			</li>
		</ol>
		<h3 id="step1">Install the Wireless Toolkit(s)</h3>
		<p>Install any of the wireless toolkits you want to use. When you do
		this, make note of the base directory into which each is installed, as
		you will need this information when you configure MTJ.</p>
		<p>Unix users - if you install a Wireless Toolkit for use by more
		than one user on your system, please ensure that all the users have the
		appropriate read and execute permissions on the contents of the toolkit.
		For example, WTK's contain a preverifier that MTJ will need to access
		during the build process. If the user doing the build does not have
		execute permissions on the preverifier, the build will fail. Similarly,
		if the user does not have execute permissions on the emulator, he or she
		will not be able to test the build.</p>
		<h3 id="step2a">Installing via the MTJ Update site</h3>
		<p>
		<ol>
			<li>Please visit <a href="/mtj/download/update.php">
			the update page</a> to get update sites URLs</li>
			<li>Please refer Eclipse help document or visit <a
				href="http://help.eclipse.org/" target="blank">Eclipse Help web
			site</a>, select Workbench User Guide &gt; Tasks &gt; Updating and
			installing software document node for information about how to install
			software.</li>
		</ol>
		<strong>Note:</strong>
		If you would like to take advantage of MTJ's support for preprocessing,
		it is imperative that MTJ be installed into the same directory structure
		as your base Eclipse installation. For instance, if your base Eclipse
		installation (not your workspace) is installed to C:\software\eclipse,
		you will need to make sure that you install MTJ into
		C:\software\eclipse.
		</p>
		
		<h3 id="step2b">Configuring Preprocessor Support</h3>
		<p>Due to limitations in the extensibility of the Eclipse Java
		Compiler (see <a
			href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=116143"
			target="blank">Bug 116143</a> for further information), it is necessary
		for MTJ to hook into the Eclipse platform at a lower level in order to
		provide preprocessor support. If you would like to take advantage of
		MTJ's support for preprocessing, a few extra changes need to be made to
		your Eclipse installation.</p>
		<ol>
			<li>MTJ should be installed into the same directory structure as
			your base Eclipse installation. When the installation has completed,
			the org.eclipse.mtj.core.hooks_[version].jar file must be located in
			the same directory as the org.eclipse.osgi_[version].jar.</li>
			<li>The Eclipse configuration file must be altered to reference
			the MTJ framework hooks bundle.
			<ol>
				<li>Locate the file config.ini. This file is located in the
				&lt;eclipse install&gt;/configuration directory.</li>
				<li>Edit the config.ini with your favorite text editor.</li>
				<li>Add the following property definition to the configuration file.<br>
				<pre>osgi.framework.extensions=org.eclipse.mtj.core.hooks</pre>
				If the property already exists, append <code>",org.eclipse.mtj.core.hooks"
				</code> to the end of the current property definition.<br>
				<br>
				It is very important that the line be added before the end-of-file
				marker. Failure to properly place the new line before the end-of-file
				marker could cause your Eclipse workbench to fail to start.</li>
				<li>Save the configuration file.</li>
				<li>Restart Eclipse.</li>
			</ol>
			</li>
		</ol>
		<p>You will be warned if you have projects that are configured for
		preprocessing, but the necessary configuration changes have not been
		made. In this case, a warning will be written to the Eclipse workspace
		log file with text similar to <br>
		<i>"Preprocessor invoked, but hook is not installed. Consult the
		installation instructions for MTJ."</i><br>
         
    </div>    
	<div id="rightcolumn">
        <div class="sideitem">
        	<h6>Getting started</h6>
        	<ul>				
        		
        		<a href="/mtj/development/tutorial/prerequisites.php" target="_self">Prerequisites</a>
        		</li>
        	</ul>
        	<ul>
        	    				
        		<a href="/mtj/development/tutorial/supported.php" target="_self">Supported Wireless Toolkits</a>
        		</li>
        	</ul>
        	<ul>
        	    			
        		<a href="/mtj/development/tutorial/installation.php" target="_self">Installation Instructions</a>
        		<ul>
        			<li><a href="#step0">Before you begin</a></li>
					<li><a href="#step1">Install the Wireless Toolkit(s)</a></li>
					<li><a href="#step2a">Installing via the MTJ Update site</a></li>
					<li><a href="#step2b">Configuring Preprocessor Support</a></li>
        		</ul>
        		</li>
        	</ul>
        	<ul>				
        		<a href="/mtj/development/tutorial/removal.php" target="_self">Removal Instructions</a>
        		</li>
        	</ul>
        </div>
	</div>
</div>

EOHTML;


# Generate the web page
$App->generatePage($theme, $Menu, $Nav, $pageAuthor, $pageKeywords, $pageTitle, $html);
?>
