<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<meta name="copyright" content="Copyright (c) Eclipse contributors and others 2013. This page is made available under license. For full details, see the LEGAL section in the documentation that contains this page."/>
<meta http-equiv="Content-Language" content="en-us"/>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
<link rel="stylesheet" href="default_style.css" charset="ISO-8859-1" type="text/css"/>
<style type="text/css">
table.news td {border-top: solid thin black;}
table.news tr {vertical-align: top;}
table.news tr td.section {font-size: 20px; font-weight: bold;}
table.news tr td.title {vertical-align: top; width: 30%; font-weight: bold;}
table.news tr td.content {vertical-align: top; width: 70%;}
</style>
<title>Eclipse Project Kepler - New and Noteworthy</title>
</head>
<body>

<h2>Platform and Equinox API</h2>

<!-- ****************** START OF N&N TABLE ****************** -->
<table class="news" cellpadding="10" cellspacing="0">
<tbody>
  <!-- ******************** Platform ********************** -->
  <tr>
    <td id="Platform" class="section" colspan="2"><h2>Platform Changes</h2></td>
  </tr>
  
  <tr id="e4-api">
    <td class="title">Initial Eclipse 4 API released</td>
    <td class="content">
      The first set of official API based on the new Eclipse Platform 4 architecture is now available. 
      This is the first step in allowing developers to use the new simpler and more powerful mechanisms 
      to build Eclipse plug-ins and applications.
    <p>
      This API is comprised of two basic concepts:
    </p><p>
      <b>The user interface model</b>: The content of this model describes the structure of the user interface.
      The Eclipse Platform reacts to changes in this model by updating the presentation, and the complete
      model is now available through the new API.
    </p><p>
      Note that the model represents everything on the screen and these elements can be modified
      by your code (see the example below).
    </p><p>
      <b>IEclipseContext / Dependency Injection (DI)</b>: Contexts are containers of UI runtime state
      including all the available services. The typical Eclipse Platform 4 pattern is that contributions
      are created and configured through dependency injection based on state and services found in the local
      context for that model element.
    </p><p>
      Here are a few links to more information about the UI Model, the services and DI (the Javadoc and supporting
      Eclipse documentation will be available before Kepler is released):
    </p>
    <ul>
      <li><a href="http://www.eclipsecon.org/2013/sites/eclipsecon.org.2013/files/FormalAPI.pdf">EclipseCon 2013 API Slides</a></li>
      <li><a href="http://www.vogella.com/articles/EclipseRCP/article.html">Lars' RCP Tutorial</a></li>
      <li><a href="http://www.vogella.com/articles/Eclipse4Services/article.html">Lars' Services Tutorial</a></li>
      <li><a href="http://eclipsesource.com/blogs/2013/04/18/eclipse-4-e4-tutorial-behavior-annotations/">Jonas Helming's DI Tutorials</a></li>
    </ul>
    <p>
      There is quite a lot of information already available for Eclipse Platform 4. While parts of the API are just being
      formalized now, most of the concepts and API existed in provisional form in previous Eclipse 4 releases.
    </p><p>
      Just to give a taste of what working in a modeled UI is all about, here's a code snippet showing
      how to get a 'standard' Command handler to toggle the visibility of the 'Quick Access' text field
      that appears in the top trim. First we gain access to the model by getting the MApplication as a
      'service'. Form there we can access the EModelService and use it to find the model element
      representing the search in the UI. Then it's just a simple matter of toggling the element's
      'toBeRendered' flag to get it to (dis)appear.
    </p>
    <pre>
public Object execute(ExecutionEvent e) throws ExecutionException {
  IWorkbenchWindow window = HandlerUtil.getActiveWorkbenchWindowChecked(e);
  MApplication theApp = (MApplication) window.getService(MApplication.class);
  MWindow activeWin = theApp.getSelectedElement();
  EModelService ms = activeWin.getContext().get(EModelService.class);
  EPartService ps = activeWin.getContext().get(EPartService.class);
  MToolControl search = (MToolControl) ms.find("SearchField", activeWin);
  if (search != null) {
    search.setToBeRendered(!search.isToBeRendered());
    window.getShell().layout(true, true);
  }
  return null;
}
      </pre>
    </td>
  </tr>

  <tr id="ua-lucene">
    <td class="title">Migrated to Lucene 3.5</td>
    <td class="content">
      The Eclipse platform help system has migrated from Lucene 2.9.1 to Lucene 3.5.
      This change brings improved performance and many bug fixes in help search.
      Some old help system API related to Lucene has been changed or removed as part
      of this fix. Refer to the platform 4.3 migration guide for more details.
    </td>
  </tr>  
  
  <tr id="ant184">
    <td class="title">Platform updated to Ant 1.8.4</td>
    <td class="content">
      The platform has been updated to use Apache Ant version 1.8.4. To see what is new in version 1.8.4 you can
      check the <a href="http://apache.mirrors.tds.net/ant/README.html">Apache Ant what's new</a>.
    </td>
  </tr> 


  <!-- *********************** SWT *********************** -->
  <tr>
    <td id="SWT" class="section" colspan="2"><h2>SWT Changes</h2></td>
  </tr>

  <tr id="xulrunner64">
    <td class="title">XULRunner on 64-bit Windows</td>
    <td class="content">The browser widget now supports the embedding of XULRunner on Windows x86_64.</td>
  </tr> 

  <tr id="bidi">
    <td class="title">New SWT color constant for hyperlinks</td>
    <td class="content">
     A new constant (SWT_COLOR_LINK_FOREGROUND) has been added that returns the native color of hyperlinks on all platforms.
     <p><img src="images/linkColor.png" alt=""/></p>
    </td>
  </tr>
    
  <tr id="linkColor">
    <td class="title">BIDI Text Direction</td>
    <td class="content">
     New API has been added to allow text direction to be set independent of the widget orientation.
     Note that this API is currently only implemented on Windows. 
     <p>For more info see <a href="http://git.eclipse.org/c/platform/eclipse.platform.swt.git/tree/examples/org.eclipse.swt.snippets/src/org/eclipse/swt/snippets/Snippet364.java">Snippet 364</a>.
     </p>
     <p><img src="images/bidi.png" alt=""/></p>
    </td>
  </tr>

  </tbody>
<!-- ****************** END OF N&N TABLE ****************** -->
</table>

<p align="center"><a href="eclipse-news-part2.html">Previous</a>&nbsp;&nbsp;&nbsp;&nbsp; <a href="eclipse-news-part4.html">Next</a></p>

</body>
</html>