<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Language" content="en-us" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="stylesheet" href="style.css" type="text/css" title="main" media="screen" />
<title>Eclipse Project Oxygen (4.7) M6 News</title>
</head>
<body>
<h1>Eclipse Project Oxygen (4.7) M6 - New and Noteworthy</h1>
<p>Here are some of the more noteworthy things available in the Oxygen milestone build M6
  which is now available for <a href="http://download.eclipse.org/eclipse/downloads/#4.7_Stable_Builds" target="_top">download</a>.
  <br/>
  We also recommend to read the Tips and Tricks, either via <b>Help &gt; Tips and Tricks...</b> or online for
  <a href="http://help.eclipse.org/topic/org.eclipse.platform.doc.user/tips/platform_tips.html">Platform</a>,
  <a href="http://help.eclipse.org/topic/org.eclipse.jdt.doc.user/tips/jdt_tips.html">JDT</a>, and
  <a href="http://help.eclipse.org/topic/org.eclipse.pde.doc.user/tips/pde_tips.htm">PDE</a>.
</p>

<ul>
  <li><a href="#Platform">Platform</a></li>
  <li><a href="#JDT">JDT</a></li>
  <li><a href="#PDE">PDE</a></li>
  <li><a href="#Platform-Dev">Platform Developers</a></li>
  <li><a href="#Equinox">Equinox</a></li>
</ul>

<table class="news">
  <colgroup>
    <col class="title" />
    <col />
  </colgroup>


  <tr>
    <td colspan="2" class="section" id="Platform">Platform</td>
  </tr>

  <tr id="patch-diff-generic-editor-extension">
    <td class="title">Generic editor can now read patch and diff files</td>
    <td class="content">
      An extension was provided to the generic editor so that it now can provide syntax highlighting for files with the <b>.patch</b>
      or <b>.diff</b> extension. Right-click the file and choose <b>Open with > Generic Text Editor</b> to see the editor in action.
      <p>
      	<img src="images/patch-diff-editor.png" alt="" />
      </p>
    </td>
  </tr>

  <tr id="improved-exit-and-restart-dialog">
    <td class="title">Improved exit and restart dialogs</td>
    <td class="content">
      The exit and restart dialogs now use verbs instead of OK/No/Yes, which makes the dialogs more direct and specific.
      <p>
      	<img src="images/confirm-exit-dialog-small.png" alt="" />
      </p>
      <p>
      	<img src="images/p2-restart-dialog-small.png" alt="" />
      </p>
    </td>
  </tr>


  <tr>
    <td colspan="2" class="section" id="JDT">JDT</td>
  </tr>

  <tr id="hidpi-jdt-icons">
    <td class="title">HiDPI JDT icons</td>
    <td class="content">
      Composite icons such as Java element icons with modifier overlays are now rendered in high resolution
      in environments that support HiDPI images.
      <p>
      <img src="images/jdt-composite-images-hidpi.png" alt="" width="479"
      style="image-rendering:-moz-crisp-edges;image-rendering:-o-crisp-edges;image-rendering:crisp-edges;"/>
      </p>
      <p><b>Update:</b> On <b>macOS</b>, a <a href="https://bugs.eclipse.org/513637">bug</a> was found when
      running with a non-Retina display as main screen and a <b>Retina display as secondary screen</b>.
      If you're affected, please update the Eclipse SDK to a recent I-build (such as I20170318-2000) from<br/>
      <a href="http://download.eclipse.org/eclipse/updates/4.7-I-builds/">http://download.eclipse.org/eclipse/updates/4.7-I-builds/</a>
      </p>
    </td>
  </tr>

  <tr id="unlikely-argument-types">
    <td class="title">Warnings for unlikely argument types</td>
    <td class="content">
      Many developers have learned the hard way, that certain uses of Java collections that pass the compiler's
      type check, may still contain "type errors", resulting in unexpected runtime behaviour. 
      A new analysis has been added to the Eclipse compiler for Java that will detect the most common bugs in this area.
      <p>
      	The common reason behind this problem is the fact that not all methods of those collection types make use of generics in the way one might expect.
      	As a result it is possible to create a <code>Set&lt;Short></code>, whose <code>add(Short)</code> method will only accept arguments of type <code>Short</code>,
      	yet method <code>remove(Object)</code> will happily accept literally any argument, because the method's parameter has type <code>Object</code>.
      </p> 
      <p>
      	Here is a code snippet that seems to add and remove the same element from the set, but at a closer look the <code>remove</code> call has no effect.
      	What is difficult to see for the naked eye is now flagged by a new warning:
      </p> 
      <p>
      	<a href="images/unlikely1.txt"><img src="images/unlikely1-basic.png" alt="Warning on last line: Unlikely argument type int for remove(Object) on a Collection&lt;Short&gt;" /></a>
      </p>
      <p>
      	In a simple world, this would be all there is to say, but over time people have developed various code patterns
      	that rely on these overly general signatures. Consider the following use of subtyping:
      </p>
      <p>
      	<a href="images/unlikely2.txt"><img src="images/unlikely2-number-allowed.png" alt="" /></a>
      </p>
      <p>
      	Depending on your coding style this may or may not be accepted as a legitimate short hand for:
      	<br/><code style="margin-left:2em;">if (n instanceof Short) set.remove((Short) n);</code><br/>
      	To reduce the churn caused by the new analysis, we developed some heuristics that filter out cases where types are "sufficiently similar",
      	so the above goes unwarned.
      </p>
      <p>
      	As with any heuristic, there is no clear line. This implies that the compiler may show "unwanted" warnings, 
      	or filter out invocations that are in fact bugs. For the former case, <code>@SuppressWarnings("unlikely-arg-type")</code>
      	will document the exception both for the user and for the compiler. For the latter case, we provide an option to tighten
      	the rules, namely to apply strict type compatibility checks instead of said heuristics. For this extra scrutiny you may enable
      	the sub-option <b>Perform strict analysis against the expected type</b> in <b>Preferences &gt; Java &gt; Compiler &gt; Errors/Warnings &gt; Potential programming problems</b>.
      </p>
      <p>
      	<img src="images/unlikely3-options.png" alt="Preference options" />
      </p>
<!-- 
      With this option enabled, above usage is flagged indeed (and the same for less obvious cases, which would be filtered out by the heuristics):
      <p>
      	<a href="images/unlikely4.txt"><img src="images/unlikely4-number-strict.png" alt="" /></a>
      </p>
 -->
      Similarly, a check with default severity "Info" is offered for unlikely invocations of <code>java.lang.Object.equals(Object)</code> and 
      <code>java.util.Objects.equals(Object,Object)</code>. 
      <p>
      	<a href="images/unlikely5.txt"><img src="images/unlikely5-equals.png" alt="Info on last line: Unlikely argument type for equals(): Name seems to be unrelated to String" /></a>
      </p>
    </td>
  </tr>

   <tr id="watchpoint-condition">
    <td class="title">Conditional watchpoint</td>
    <td class="content">
      Like for line breakpoints, conditions can now also be added to <b>Watchpoints</b>,
      where the old value of the field can be used as part of the condition.
      <p>
      	<img src="images/watchpoint-condition.png" alt="" />
      </p>
    </td>
  </tr>

  <tr id="formatter">
    <td class="title">Code formatter: new way to count comment width</td>
    <td class="content">
      A new option has been added in the code formatter profile editor that makes the formatter
      <b>count a comment's width from its starting position</b> instead of the beginning of the line.
      This allows more space for comments in heavily indented blocks of code and for line comments
      added to the right of some code, but at the same time keeps comments that start at the beginning
      of the line from getting too wide and uncomfortable to read.
      <p>You can change this setting in the <b>Comments</b> section, under the <b>Line width</b> group:</p>
      <p><img src="images/formatter-comment-width-ui.png" alt="" /></p>
      <p><a href="images/formatter-comment-width-preview.txt"><img src="images/formatter-comment-width-preview.png" alt="" /></a></p>
    </td>
  </tr>

  <tr>
    <td colspan="2" class="section" id="PDE">PDE</td>
  </tr>

  <tr id="p2-inf-editor">
    <td class="title">p2.inf files open in Properties editor</td>
    <td class="content">
      The default editor associated with <code>p2.inf</code> files is now the <b>Properties File Editor</b>.
    </td>
  </tr>
    
  <tr id="quickfix-also-adds-import-statement">
    <td class="title"> Quick Fix to add bundle or package adds import statement</td>
    <td class="content">
      The <b>Quick Fix</b> that adds an <code>Import-Package</code> or <code>Require-Bundle</code> dependency
      in the <code>MANIFEST.MF</code> now also adds the relevant import statement for the unresolved type in the Java editor.
    </td>
  </tr>
  
  <tr id="option-for-field-addition-to-annotation">
    <td class="title">API Tools: option for field addition to an annotation</td>
    <td class="content">
      On the <b>Plug-in Development &gt; API Errors/Warnings</b> preference page in the <b>API Compatibility</b> tab,
      there is a new option in the <b>Annotation</b> section to control the severity of a "field addition to annotation".
      <p>
        <img src="images/pde-field-addition-to-annotation.png" alt=""/>
      </p>
    </td>
   </tr>
  
  <tr id="ds-annotations">
    <td class="title">Declarative Services Annotations v1.3</td>
    <td class="content">
    	Version 1.3 of OSGi Declarative Services delivers a number of improvements, including
    	Component Property Types for strongly-typed configuration parameter handling,
    	Field Strategy for dependency injection, service/reference scoping, and others.
    	<p>
    	PDE now supports the enhanced annotations and new usage options. It generates component
    	properties from any Component Property Types that you may use in your component lifecycle
    	methods. It also creates reference entries from <code>@Reference</code> annotations
    	specified directly in <code>@Component</code> as well as annotated member fields. New
    	reference event method signatures are also supported.
    	</p>
    	<p>
			<img src="images/ds-annotations.png" alt="" />
    	</p>
		<p>
		To enable this feature, go to <b>Preferences</b> or <b>Project Properties &gt; Plug-in Development &gt; DS Annotations</b>
		and check <b>Generate descriptors from annotated sources</b>. 
		</p>
    </td>
  </tr>

  <tr>
    <td colspan="2" class="section" id="Platform-Dev">Platform Developers</td>
  </tr>

  <tr id="hidpi-composite-images">
    <td class="title">CompositeImageDescriptor HiDPI-ready</td>
    <td class="content">
      The <code>ImageDescriptor</code> and <code>CompositeImageDescriptor</code> classes in
      <code>org.eclipse.jface.resource</code> are now fully ready for HiDPI images. In
      Neon (4.6), only <code>ImageDescriptor#createFromURL(URL)</code>
      <a href="../../4.6/platform_isv.php#high-dpi-icons">supported high-resolution images</a>.
      <p>
      Clients that use <code>DecorationOverlayIcon</code> will get HiDPI support for free.
      Subclasses of <code>CompositeImageDescriptor</code> will have to update their implementation of
      <code>#drawCompositeImage(int, int)</code> to use the new <code>#drawImage(ImageDataProvider, int, int)</code>
      method to draw the elements of the composite image.
      </p>
      Old code:
      <pre>
protected void drawCompositeImage(int width, int height) {
	// draw overlay in top-right corner:
	<b>ImageData</b> imageData = myImageDescriptor.<b>getImageData()</b>;
	drawImage(imageData, width - imageData<b>.width</b>, 0);
}
      </pre>
      HiDPI-aware code:
      <pre>
protected void drawCompositeImage(int width, int height) {
	// draw overlay in top-right corner:
	<b>CachedImageDataProvider</b> provider =
		<b>createCachedImageDataProvider</b>(myImageDescriptor);
	drawImage(provider, width - provider<b>.getWidth()</b>, 0);
}
      </pre>
      <p>
      Hint: Use <code>CompositeImageDescriptor<span style="visibility:hidden">&shy;</span>#createCachedImageDataProvider(<span style="visibility:hidden">&shy;</span>Image<span style="visibility:hidden">&shy;</span>/ImageDescriptor)</code> to create an
      <code>ImageDataProvider</code>. To calculate the width and height of the image
      that is about to be drawn, you can use
      <code>CachedImageDataProvider<span style="visibility:hidden">&shy;</span>#getWidth()/<span style="visibility:hidden">&shy;</span>getHeight()</code>. These methods
      already return values in SWT points, so that your code doesn't have to
      deal with device-dependent pixel coordinates.
      </p>
    </td>
  </tr>

  <tr id="swt-table-header-styling">
    <td class="title">SWT Table header colors</td>
    <td class="content">
       Support for custom table header foreground and background colors has been added on Windows and Linux (GTK3) platforms.
       <p>
       	APIs for Table header foreground color:<br/>
       	<code>Table#getHeaderForeground()</code><br/>
       	<code>Table#setHeaderForeground(Color)</code><br/>
       </p>
       <p>
       	APIs for Table header background color:<br/>
       	<code>Table#getHeaderBackground()</code><br/>
       	<code>Table#setHeaderBackground(Color)</code><br/>
       </p>
       Screen-shot of an SWT Table with customized header on Linux (GTK3):
       <p>
      	<img src="images/table-header-colors.png" alt="" />
      </p>
    </td>
  </tr>
  
  <tr id="accessibletablelistener-getcaption-deprecated">
    <td class="title">AccessibleTableListener<span style="visibility:hidden">&shy;</span>#getCaption(..) deprecated</td>
    <td class="content">
      The <code>AccessibleTableListener#getCaption(AccessibleTableEvent)</code> method corresponds to the 
      <code>IAccessibleTable2::caption</code> method, which has been deprecated by the IA2 accessibility specification 
      implemented by SWT Accessibility. Instead, an <code>IA2_RELATION_LABELED_BY</code> relation should be used to create a 
      relation between the table and its caption.
    </td>
  </tr>

  <tr id="accessibletablelistener-getsummary-deprecated">
    <td class="title">AccessibleTableListener<span style="visibility:hidden">&shy;</span>#getSummary(..) deprecated</td>
    <td class="content">
      The <code>AccessibleTableListener#getSummary(AccessibleTableEvent)</code> method corresponds to the 
      <code>IAccessibleTable2::summary</code> method, which has been deprecated by the IA2 accessibility specification 
      implemented by SWT Accessibility. Instead, an <code>IA2_RELATION_DESCRIBED_BY</code> relation should be used
      to create a relation between the table and its summary.
    </td>
  </tr>

  <tr id="di-extension-separation">
    <td class="title">Separation of DI extension annotations and supplier</td>
    <td class="content">
      The annotations specified in <code>org.eclipse.e4.core.di.extensions</code> and the corresponding <code>ExtendedObjectSupplier</code> implementations have been separated.
	  The annotations are still available in the <code>org.eclipse.e4.core.di.extensions</code> bundle. The <code>ExtendedObjectSupplier</code> implementations have beend moved 
	  to the new <code>org.eclipse.e4.core.di.extensions.supplier</code> bundle. This makes it easier for platform adopters to change the default implementation by providing a 
	  replacement for the supplier bundle.
	  <p>
	  For <b>plug-in based products</b> this means that the new <code>org.eclipse.e4.core.di.extensions.supplier</code> bundle needs to be added
	  the list of included plug-ins. <b>Feature based products</b> should not notice the split.
	  </p>
	  <p><b>Note:</b> As part of the re-organization, <code>org.eclipse.e4.core.di.extensions.EventUtils</code> (only intended to be used for internal testing), was moved to
	  <code>org.eclipse.e4.core.di.internal.extensions.util.EventUtils</code> in the new bundle.</p>
    </td>
  </tr>

  <tr id="di-extension-service">
    <td class="title">@Service annotation available in DI extensions</td>
    <td class="content">
      The <code>@Service</code> annotation has been added to <code>org.eclipse.e4.core.di.extensions</code>. You can use this annotation to get OSGi services injected by supporting additional service specific features
	  like getting services with higher service ranking injected automatically, to get the list of services injected for the given type, and to filter for a specific filter by providing an OSGi
	  LDAP filter.
	  <pre>public class MyPart {
		   
    // highest ranked service
	
    @Inject
    @Service
    MyOsgiService service;
			
}
</pre>
	  <pre>public class MyPart {

    // all services sorted by ranking

    @Inject
    @Service
    List&lt;MyOsgiService&gt; service; 
		
}</pre>
	  
<pre>public class MyPart {
		    
    // get the highest ranked service that has
    // the component property connection=online set		
	
    @Inject
    @Service(filterExpression="(connection=online)") 
    MyOsgiService service;
			
}</pre>
    </td>
  </tr>
  <tr id="imperative-expressions">
    <td class="title">Imperative Expressions</td>
    <td class="content">
You can now define visible-when expressions for menu items and tool items in an Eclipse 4 fashion by using
<code>ImperativeExpression</code>s rather than <code>CoreExpression</code>s.
<p>
 <img src="images/imperative-expression.png" alt="" />
</p>
ImperativeExpressions reference a POJO class with a method being annotated with the new <code>@Evaluate</code> annotation.

<pre>public class TestExpression {
   @Evaluate
   public boolean isVisible(EPartService partService,
          @Optional @Named("myValueToBeChecked") String myValueToBeChecked) {

      return "expectedValue".equals(myValueToBeChecked) &amp;&amp;
         !partService.getDirtyParts().isEmpty();
   }
}</pre>
The tracking property causes to track the values which are injected so that the visible state will be evaluated on eclipse context changes,
 e.g, when the "myValueToBeChecked" value in the context is changed, the visibility check will be run once more.
    </td>
  </tr>


  <tr>
    <td colspan="2" class="section" id="Equinox">Equinox</td>
  </tr>

  <tr id="tracing-consolelog">
    <td class="title">Tracing honors -consoleLog</td>
    <td class="content">
      When the <code>-consoleLog</code> runtime option is specified on the command line, the Eclipse debug tracing 
      framework will send trace messages to System.out too (typically back to the command shell, if any).
      This is especially handy when debugging Eclipse from Eclipse with tracing enabled, so no extra trace file
      needs to be opened to check tracing output, and tracing output appears together with all other debug output
      in the Console view.
    </td>
  </tr>


  <tr>
    <td colspan="2"/>
  </tr>
</table>

<p>The above features are just the ones that are new since the previous milestone
build. Summaries for earlier Oxygen milestone builds:</p>
<ul>
  <li><a href="https://www.eclipse.org/eclipse/news/4.7/M5/">News for Eclipse Oxygen milestone build M5</a></li>
  <li><a href="https://www.eclipse.org/eclipse/news/4.7/M4/">News for Eclipse Oxygen milestone build M4</a></li>
  <li><a href="https://www.eclipse.org/eclipse/news/4.7/M3/">News for Eclipse Oxygen milestone build M3</a></li>
  <li><a href="https://www.eclipse.org/eclipse/news/4.7/M2/">News for Eclipse Oxygen milestone build M2</a></li>
  <li><a href="https://www.eclipse.org/eclipse/news/4.7/M1/">News for Eclipse Oxygen milestone build M1</a></li>
</ul>

</body>
</html>
