<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>ECF New and Noteworthy</title>
<link rel="stylesheet" href="http://www.eclipse.org/default_style.css" type="text/css">

</head>

<body bgcolor="#FFFFFF">
<table border=0 cellspacing=5 cellpadding=2 width="100%">
  <tbody>
    <tr>
      <td width="69%" class="bannertext">
        <font class="indextop style">eclipse communication framework</font>
        <br><br>
        <font class="indexsub">an eclipse technology subproject</font>
        <br><br>
        <font class="indextop style2">New and Noteworthy</font><br>0.9.5 Stable Release</font>
        <br><br><br>
        Return to <a href="downloads.php">ECF download page</a></br>
        Return to <a href="comm_resources.php">ECF communication resources page</a>
        <br><br>
        <a href="NewAndNoteworthy_0.4.0.html">New and Noteworthy for 0.4.0</a><br>
        <a href="NewAndNoteworthy_0.5.2.html">New and Noteworthy for 0.5.2</a><br>
        <a href="NewAndNoteworthy_0.5.4.html">New and Noteworthy for 0.5.4</a><br>
        <a href="NewAndNoteworthy_0.6.0.html">New and Noteworthy for 0.6.0</a><br>
        <a href="NewAndNoteworthy_0.6.2.html">New and Noteworthy for 0.6.2</a><br>
        <a href="NewAndNoteworthy_0.7.0.html">New and Noteworthy for 0.7.0</a><br>
        <a href="NewAndNoteworthy_0.7.5.html">New and Noteworthy for 0.7.5</a><br>
        <a href="NewAndNoteworthy_0.7.6.html">New and Noteworthy for 0.7.6</a><br>
        <a href="NewAndNoteworthy_0.8.0.html">New and Noteworthy for 0.8.0</a><br>
        <a href="NewAndNoteworthy_0.8.1.html">New and Noteworthy for 0.8.1</a><br>
        <a href="NewAndNoteworthy_0.8.2.html">New and Noteworthy for 0.8.2</a><br>
        <a href="NewAndNoteworthy_0.8.4.html">New and Noteworthy for 0.8.4</a><br>
        <a href="NewAndNoteworthy_0.8.5.html">New and Noteworthy for 0.8.5</a><br>
        <a href="NewAndNoteworthy_0.8.6.html">New and Noteworthy for 0.8.6</a><br>
        <a href="NewAndNoteworthy_0.8.7.html">New and Noteworthy for 0.8.7</a><br>
        <a href="NewAndNoteworthy_0.8.9.html">New and Noteworthy for 0.8.9</a><br>
        <a href="NewAndNoteworthy_0.9.0.html">New and Noteworthy for 0.9.0</a><br>
        <a href="NewAndNoteworthy_0.9.1.html">New and Noteworthy for 0.9.1</a><br>
        <a href="NewAndNoteworthy_0.9.2.html">New and Noteworthy for 0.9.2</a><br>
        <a href="NewAndNoteworthy_0.9.3.html">New and Noteworthy for 0.9.3</a><br>
        <a href="NewAndNoteworthy_0.9.4.html">New and Noteworthy for 0.9.4</a><br>
      </td>
      <td width="31%">
        <div align="center">
          <img src="../images/Idea.jpg" width="120" height="86" hspace="50" align="middle">
        </div>
      </td>
    </tr>
  </tbody>
</table>

<hr>

<table>
  <TR><TD colSpan=2><H2>API Enhancements</H2></TD>

  <TR>
    <TD vAlign=top align=left width="30%">
    <p><br></p>
        <P align=left>
	<B>Refactoring to Support JFace Content Providers</B>
        </P>
    </TD>
    <TD vAlign=top width="70%">
      <p><br></p>
      The presence API (plugin: <b>org.eclipse.ecf.presence</b>) has been enhanced to support JFace viewers.  Specifically,
      the roster interface classes (IRosterManager, IRoster, IRosterEntry, IRosterGroup, IRosterItem) have been enhanced
      so that they can easily be used as the basis of an JFace ITreeContentProvider.  This allows the
      use and automatic update of a roster (buddy) list by an ECF provider that implements the presence API (e.g. the XMPP provider).  For example, here is code in the new plugin 
      <b>org.eclipse.ecf.presence.ui</b> that creates a tree viewer to display multiple rosters:
      <pre>
      	protected void setupTreeViewer(Composite parent) {
		    treeViewer = new TreeViewer(parent, SWT.BORDER | SWT.MULTI
				| SWT.V_SCROLL);
		    getSite().setSelectionProvider(treeViewer);
		    multiRosterContentProvider = new MultiRosterContentProvider();
		    multiRosterLabelProvider = new MultiRosterLabelProvider();
		    treeViewer.setLabelProvider(multiRosterLabelProvider);
		    treeViewer.setContentProvider(multiRosterContentProvider);
		    treeViewer.setInput(new Object());
	    }
      </pre>
      With this approach, the UI/viewer code does not need to know anything about the messaging to change/update the roster
      model.  This model is managed by the ECF provider (XMPP) and when 
      The MultiRosterContentProvider class (and others to support this new approach) are available
      in the (new) plugin:  <b>org.eclipse.ecf.presence.ui</b>.  See the classes in the <a href="http://www.eclipse.org/ecf/org.eclipse.ecf.docs/api/org/eclipse/ecf/presence/ui/package-summary.html">org.eclipse.ecf.presence.ui package</a>
      for example usage and reusable base classes.
      
      <p></p>
    </tr>

  <TR>
    <TD vAlign=top align=left width="30%">
    <p><br></p>
        <P align=left>
	<B>IRCLib Update</B>
        </P>
    </TD>
    <TD vAlign=top width="70%">
      <p><br></p>
      The IRC provider plugin (<b>org.eclipse.ecf.provider.irc</b>) is based upon the IRCLib by Christoph Schwering.  This 
      library was update from 1.04 to 1.10 with specific improvements to support ECF usage.
      <p></p>
    </tr>

  <TR>
    <TD vAlign=top align=left width="30%">
    <p><br></p>
        <P align=left>
	<B>Filetransfer Provider Uses Apache HttpClient 3.0.1</B>
        </P>
    </TD>
    <TD vAlign=top width="70%">
      <p><br></p>
      The filetransfer provider implementation (plugin <b>org.eclipse.ecf.provider.filetransfer</b>) previously was based
      upon the JDK <b>java.net.URLConnection</b> class for http file transfer support.  Now this plugin uses the Apache
      HttpClient code v3.0.1.  API was added to support the use of http authentication and http proxies.
      <p></p>
    </tr>

  <TR>
    <TD vAlign=top align=left width="30%">
    <p><br></p>
        <P align=left>
	<B>Overall Improvements to Presence API</B>
        </P>
    </TD>
    <TD vAlign=top width="70%">
      <p><br></p>
      A number of improvements were made by refactoring the presence API (plugin: <b>org.eclipse.ecf.presence</b>).  Interface and 
      class names were changed for more consistency, interfaces and classes were moved around, and the API was simplified in many
      ways.  For details see bug:  <a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=167363">#167363</a>
      <p></p>
    </tr>

</table>

</body>
</<bhtml>