<?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());    # All on the same line to unclutter the user's desktop'

$pageTitle 		= "Eclipse Development Process";
$pageKeywords	= "development process";
$pageAuthor		= "Bjorn Freeman-Benson Jan 2006";

ob_start();
?>
    <div id="maincontent">
	<div id="midcolumn">
		
<h2>Project Home Page</h2>

<p>The project status information is stored and used in a number of places:</p>

<ol>
  <li>The Eclipse Foundation's internal database of projects. (<a href="project-status-infrastructure-page1.php">see
    &quot;how to&quot; page 1</a>)</li>
  <li>The project's own <code>project-info/</code> directory. (<a href="project-status-infrastructure-page2.php">see
    &quot;how to&quot; page 2</a>)</li>
  <li>The project's own <code> index.php</code> home page. (the topic of this
    page)</li>
  <li>Other project pages (<a href="project-status-infrastructure-page4.php">see
    &quot;how to&quot; page 4</a>)</li>
</ol>

<h3>3. Project Home Page</h3>
<p>The format and content of the project's pages, including their home page, is
under the sole control of the project's Committers<sup>1</sup> with two
exceptions:</p>
<ol>
  <li>The Planning Council <a href="/org/councils/20050823PCMinutes.html">requires</a>
    that each project have a standard set of top-of-the-left-nav navigation
    elements so that common information, such as <i> where to find downloads </i> and
    <i> how
    to get started with the project</i>, is easily and consistently available on all
    project home pages.&nbsp;<p align="center">
    <img border="0" src="images/common-left-nav.gif" width="149" height="393"><p>
 The data to populate the common nav items comes from the <code>/project-info/</code> 
 directory (see <a href="project-status-infrastructure-page2.php">page 2</a>), and the PHP to create these common nav items on the
    home page is as follows (include this code before the <code> $App-&gt;generate_page(...)</code> and
    before any project-specific $Nav items are added:<pre style="border: thin 1px dashed; background-color: ivory; 
padding-top: 2px; 
padding-left: 2px;
padding-right: 2px;
padding-bottom: 2px">require_once($_SERVER['DOCUMENT_ROOT'] . &quot;/projects/common/project-info.class.php&quot;);
$projectInfo = new ProjectInfo(&quot;<i>the project's Foundation database key</i>&quot;);
$projectInfo-&gt;generate_common_nav( $Nav );</pre>
    <p>Alternatively, the project could decide to have the standard set of left-nav
    items on all its pages (we encourage but do not require this). To
    accomplish this, simply put the code in the <code>_projectCommon.php</code>
    file.</p>
    <p>The generate_common_nav() method takes three optional parameters: names of functions to add
    project-specific items to end of the Users, Integrators, and Contributors sections of the left nav.
    For example:<pre style="border: thin 1px dashed; background-color: ivory; 
padding-top: 2px; 
padding-left: 2px;
padding-right: 2px;
padding-bottom: 2px">function add2users() {
   global $Nav;
   $Nav->addCustomNav("FAQ", "/dash/user-faq.php", "", 2);
}   
function add2contributors() {
   global $Nav;
   $Nav->addCustomNav("UML diagrams", "/webtools/uml-designs.php", "", 2);
}
$projectInfo-&gt;generate_common_nav( $Nav, "add2users", NULL, "add2contributors" );</pre>
    </p>
  </li>
  <li>If the project is in the <a href="/projects/dev_process/validation-phase.php">Incubation
    Phase</a>, the project must show the appropriate text and (recommended, but optional) the <a href="/projects/gazoo.php">appropriate
    graphic</a> on its home page. Typically this is placed at the bottom of the right column,
    although it is required to be &quot;above the fold&quot; on a 1280x1024
    display. The HTML to show the graphic is:
<pre style="border: thin 1px dashed; background-color: ivory; 
padding-top: 2px; 
padding-left: 2px;
padding-right: 2px;
padding-bottom: 2px">&lt;div id=&quot;rightcolumn&quot;&gt;
 ...
 &lt;div class=&quot;sideitem&quot;&gt;
   &lt;h6&gt;Incubation&lt;/h6&gt;
   &lt;div align=&quot;center&quot;&gt;&lt;a href=&quot;/projects/gazoo.php&quot;&gt;&lt;img 
        align=&quot;center&quot; src=&quot;/images/gazoo-incubation.jpg&quot; 
        border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
 &lt;/div&gt;
 ...
&lt;/div&gt;</pre>
The HTML to show the text is:
<pre style="border: thin 1px dashed; background-color: ivory; 
padding-top: 2px; 
padding-left: 2px;
padding-right: 2px;
padding-bottom: 2px">&lt;div id=&quot;rightcolumn&quot;&gt;
 ...
 &lt;div class=&quot;sideitem&quot;&gt;
   &lt;h6&gt;Project Status&lt;/h6&gt;
   &lt;ul&gt;
     &lt;li&gt;This project is in the 
     &lt;a href=&quot;/projects/dev_process/validation-phase.php&quot;&gt;Incubation Phase&lt;/a&gt;
     &lt;/li&gt;
   &lt;/ul&gt;
 ...
&lt;/div&gt;</pre>
  </li>
</ol>

<p align="right"><a href="project-status-infrastructure-page2.php"><img border="0" src="images/prior_step_button.jpg"></a>&nbsp;
&nbsp;<a href="project-status-infrastructure-page4.php"><img border="0" src="images/next_step_button.jpg"></a></p>

<p><sup>1</sup> Subject, of course, to common sense provisions about truth, decency, project
relevance, security issues, etc.</p>

</div>
</div>

<?php
	# Paste your HTML content between the EOHTML markers!	
	$html = ob_get_contents();
	ob_end_clean();

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