<div>

  <h2>Re-Parenting Support</h2>

  <p>
    The method <code>Control.setParent()</code> is now fully implemented and will move a control
    from one parent to another. To indicate that the re-parenting was successful, the method will
    return <code>true</code>. We implemented re-parenting in order to better support the E4 UI.
  </p>

  <p>
    Be aware you must not try to replace the parent of a control that is attached to another widget
    using a <code>setControl()</code> method (e.g. a CoolItem, an ExpandItem, or a ScrolledComposite).
    Those cases are neither supported by SWT nor by RAP.
  </p>

  <h2>New client service StartupParameters</h2>

  <p>
    In RAP 2.x, you could access URL parameters by calling <code>RWT.getRequest().getParameter(name)</code>.
    The problem with this approach was that it only worked in the first request.
    Moreover, <code>RWT.getRequest()</code> returns the actual XHR request, not the request that
    returned the HTML page. That's why using this method in application code is not recommended.
  </p>
  <p>
    Now there is a client service named <code>StartupParameters</code> that provides access to those
    startup parameters. Since this service interface is also implemented by <code>AbstractEntryPoint</code>,
    you can access the methods <code>getParameter()</code>, <code>getParameterNames()</code>,
    and <code>getParameterValues()</code> directly in your entrypoint:
  </p>

  <pre lang="java">
public class MyEntryPoint extends AbstractEntryPoint {

  @Override
  protected void createContents(Composite parent) {
    String foo = getParameter("foo");
    ...
  </pre>

  <h2>Move to Java 7</h2>

  <p>
    As many other Eclipse projects, we recently decided to raise the minimal execution environment
    to Java 7.
    Since Jetty 9 and even some parts of Equinox now depend on Java 7, it became almost impossible
    to run and test RAP with Java 5.
    Moving to Java 7 makes our life easier and allows us to make use of some new features.
    With modern JREs being available even for embedded platforms, so we think that we won't
    exclude anyone by this move.
  </p>

  <p>
    The Bundle-RequiredExecutionEnvironment (BREE) of all bundles has been updated to <em>JavaSE-1.7</em>.
  </p>

  <h2>Goodbye quirksmode!</h2>

  <p>
    RAP used to enable the so-called quirksmode in HTML in order to avoid glitches in old
    IE versions. With the end of support for antique browsers, RAP now uses the HTML5
    <code>&lt;!DOCTYPE html&gt;</code> declaration that enables standard mode in all browsers.
  </p>

  <h2>Performance optimizations</h2>

  <p>
    We started to work on a couple of performance optimizations, namely by reducing the number of
    short living objects created during request processing. This reduces the load by the garbage
    collection.
    Moreover, we reworked the session initialization and removed the need for a transient
    UI session when delivering the HTML, which also removes some load from the server.
    Some more optimizations are planned for 3.0.
  </p>

</div>
