<?php
/**
 * Copyright (c) 2014, 2018 Eclipse Foundation and others.
 *
 * This program and the accompanying materials are made
 * available under the terms of the Eclipse Public License 2.0
 * which is available at https://www.eclipse.org/legal/epl-2.0/
 *
 * Contributors:
 *    Christopher Guindon (Eclipse Foundation) - initial API and implementation
 *    Eric Poirier (Eclipse Foundation)
 *
 * SPDX-License-Identifier: EPL-2.0
 */
?>

<div id="midcolumn">
  <h1><?php print $pageTitle;?></h1>
  <p>Many people know Eclipse as an Integrated Development Environment (IDE) for Java.
  However, Eclipse is far more than just a Java IDE.</p>

  <h2>Eclipse is a Java IDE...</h2>
  <p>Eclipse is widely regarded as <i>the</i> Java development environment. It has
  all the bells and whistles, including:</p>
  <ul>
    <li>Language-aware editors, views, ...</li>
    <li>Refactoring support</li>
    <li>Integrated unit testing and debugging</li>
    <li>Incremental compilation and build</li>
    <li>Team development support</li>
    <li>Out of the box support for CVS</li>
  </ul>
  <h2>Eclipse is an IDE Framework...</h2>
  <ul>
    <li>Eclipse + Java Development Tools (JDT) = Java IDE
      <ul>
        <li>First class framework for Java</li>
        <li>Language aware editor</li>
        <li>Refactoring, search</li>
        <li>Incremental build</li>
        <li>Integrated debugging</li>
      </ul>
    </li>
    <li>Eclipse + C/C++ Development Tools (CDT) = C/C++ IDE
      <ul>
        <li>First class framework for C/C++</li>
        <li>Language aware editor</li>
        <li>Refactoring, search</li>
      </ul>
    </li>
    <li>Eclipse + PHP = PHP IDE</li>
    <li>Eclipse + JDT + CDT + PHP = Java, C/C++, PHP IDE</li>
    <li>...</li>
  </ul>

  <h2>Eclipse is a Tools Framework...</h2>
  <p>While Eclipse is an excellent platform for building integrated development
  environments, it is far more general than that; Eclipse is used as a platform
  for tools that are not specifically related to software development.</p>
  <p>The Eclipse platform provides extensibility through Equinox,
  an implementation of the OSGi R4 specification; plug-ins make Eclipse
  whatever you need it to be. Tools extend the Eclipse platform using plug-ins:</p>
  <ul>
    <li>Business Intelligence and Reporting Tools (BIRT)</li>
    <li>Data Tools Platform (<a href="http://www.eclipse.org/datatools/">DTP</a>)</li>
    <li>Test and Performance Tooling Project (TPTP)</li>
    <li>Web Tools Project (WTP)</li>
  </ul>
  <p>Numerous frameworks are provided by Eclipse projects for building tools,
  including:</p>
  <ul>
    <li>Eclipse Communications Framework (<a href="http://www.eclipse.org/ecf/">ECF</a>)</li>
    <li>Graphical Editing Framework (<a href="http://www.eclipse.org/gef/">GEF</a>)</li>
    <li>Eclipse Modeling Framework (<a href="http://www.eclipse.org/emf/">EMF</a>)</li>
    <li>Graphical Modeling Framework (<a href="http://www.eclipse.org/gmf/">GMF</a>)</li>
  </ul>

  <h2>Eclipse is a Application Framework...</h2>
  <p><img src="images/rcp.png" align="right"/>If you exclude the the
  plug-ins that make Eclipse an IDE, including Java language support,
  debugging and team development support, you�re left with a comprehensive
  general application framework that supports a rich user experience. The
  Eclipse Rich Client Platform (RCP) is being used today by many
  open source and commercial products to provide robust, scalable, enterprise-ready
  applications.</p>
  <ul>
    <li>Support for multiple platforms: Linux, Windows, Mac OSX, UNIX, embedded</li>
    <li>Rich widget set, graphics</li>
    <li>Native-OS integration (drag and drop, OLE/XPCOM integration)</li>
    <li>A platform for rich clients</li>
  </ul>

  <h2>Eclipse is an Open Source Project...</h2>
  <p>The "Eclipse" project--responsible for the Eclipse SDK--is just one of many
  projects. Eclipse projects are managed, have schedules and plans, and ship
  real software. The focus of Eclipse projects is to create generally useful
  frameworks and APIs, along with exemplary projects.</p>
  <p>There are nine (9) top level projects:</p>
  <ul>
    <li>Eclipse Project</li>
    <li>Tools</li>
    <li>Web Tools Platform</li>
    <li>Test & Performance Tools Platform</li>
    <li>Business Intelligence and Reporting Tools</li>
    <li>Data Tools Platform</li>
    <li>Device Software Development Platform </li>
    <li>SOA Tools Platform</li>
    <li>Technology (Incubators)</li>
  </ul>
  <p>In addition to the top level projects, there are dozens of sub projects.</p>

  <h2>Eclipse is a Community...</h2>
  <p>All Eclipse projects are available for free download. No registration
  is required; downloads are not tracked and there are no sales calls.
  A large proportion of the community are Eclipse users: people who use
  Eclipse every day to get their job done.</p>
  <p>Eclipse contributors number in the hundreds. There are many different
  kinds of contributions: bug reports, feature requests, patches, code, and
  design. A smaller number of committers are responsible for deciding (and actioning)
  what contributions will be integrated into the project's code base.</p>
  <p>Hundreds of plug-ins are provided by commercial companies, organizations,
  and individuals.</p>
  <p>There are numerous community-supported sources of information about Eclipse:</p>
  <ul>
    <li>Planet Eclipse (www.planeteclipse.org)</li>
    <li>EclipseZone (http://eclipsezone.com)</li>
    <li>EclipseWiki (http://eclipsewiki.editme.com)</li>
    <li>Eclipse Plug-in Central (http://eclipseplugincentral.com)</li>
    <li>Others (http://eclipse.org/community)</li>
  </ul>
  <p>50 million download requests to date.</p>

  <h2>Eclipse is an Eco-System...</h2>
  <p>The Eclipse Eco-system is composed of more than 140 member companies,
  including major Java, Linux and Embedded vendors like BEA, Borland,
  JBoss, IBM, SAP, RedHat, Novell, Wind River, Mentor, ENEA,
  and QNX. These member companies contribute developers and resources to
  Eclipse projects and then use the output of those projects for their
  commercial software offerings.</p>
  <p>Eclipse is focused on nurturing the eco-system to complement, and
  enhance the Eclipse Platform.</p>

  <h2>Eclipse is a Foundation...</h2>
  <p>The Eclipse Foundation was created to manage and direct the ongoing
  development of the Eclipse open source software project. It is
  responsible for providing IT infrastructure required by development teams.
  The Eclipse Foundation is an independent not-for-profit Foundation formed in 2004.</p>

  <h2>Eclipse is all these things...</h2>
  <ul>
    <li>A Java IDE</li>
    <li>An IDE Framework</li>
    <li>A Tools Framework</li>
    <li>An Application Framework</li>
    <li>An Open Source Enabler</li>
    <li>A community</li>
    <li>An eco-system</li>
    <li>A foundation</li>
  </ul>

</div>