| <div> |
| |
| <h3>Heads up: Webkit bug, affects Chrome, Safari and Opera</h3> |
| |
| <p> |
| Recently, a <a href="https://bugs.webkit.org/show_bug.cgi?id=125070">bug</a> has been introduced |
| in WebKit that leads to RAP UIs becoming partly invisible when a Canvas widget is included. |
| This problem also affects earlier versions of RAP running in recent WebKit-based browsers. |
| A workaround is outlined in <?=bug(428717)?>, but didn't make it into this milestone. |
| We're confident to include it in M3. For older versions of RAP, please visit the |
| <a href="https://wiki.eclipse.org/RAP/FAQ#Widgets_disappearing_in_Google_Chrome.2C_Safari_or_Opera">FAQ</a> |
| for workarounds that you can apply yourself. |
| </p> |
| |
| <h3>Drag&Drop Support for Client Files</h3> |
| |
| <p> |
| You can now allow users to upload files from their desktop by dropping them onto a widget. |
| To do so, you use the SWT Drag&Drop API with the transfer type |
| <code>ClientFileTransfer</code>. |
| The following example shows how to enable a Label to accept files: |
| </p> |
| |
| <pre lang="java"> |
| Label dropLabel = new Label( parent, SWT.BORDER ); |
| dropLabel.setText( "Drop files here" ); |
| DropTarget dropTarget = new DropTarget( dropLabel, DND.DROP_MOVE ); |
| dropTarget.setTransfer( new Transfer[]{ ClientFileTransfer.getInstance() } ); |
| dropTarget.addDropListener( new DropTargetAdapter() { |
| @Override |
| public void drop( DropTargetEvent event ) { |
| filesDropped( (ClientFile[])event.data ); |
| } |
| } ); |
| </pre> |
| |
| <p> |
| The <code>event.data</code> field will contain an array of <code>ClientFile</code>s, that |
| provide information on the dropped files. |
| It's an array because the user can also select and drag multiple files. |
| To actually upload the dropped files, the new client service <code>ClientFileUploader</code> |
| can be used: |
| </p> |
| |
| <pre> |
| ClientFileUploader uploader = RWT.getClient().getService( ClientFileUploader.class ); |
| uploader.submit( uploadUrl, clientFiles ); |
| </pre> |
| |
| <p> |
| Finally, you have to accept and store the files on the server. |
| The fileupload component in the <a href="http://eclipse.org/rap/incubator/">RAP Incubator</a> |
| can be used to handle uploads in RAP easily. |
| The <code>FileDialog</code>, also in the RAP Incubator, now also accepts dropped files. |
| </p> |
| |
| <h3>New API for Singletons</h3> |
| |
| <p> |
| We already provide the class <em>SingletonUtil</em> to facilitate the conversion of classic |
| singletons to UISession-scoped singletons for use in RAP's multi-user environment. |
| This class has a new method named <em>getUniqueInstance</em> that accepts a UISession instance |
| as a parameter. You can obtain a unique instance of a given class for the current UISession like so: |
| </p> |
| |
| <pre lang="java"> |
| public static MySingleton getInstance() { |
| UISession uiSession = RWT.getUISession(); |
| return SingletonUtil.getUniqueInstance( MySingleton.class, uiSession ); |
| } |
| </pre> |
| |
| <p> |
| In this case, the method is equivalent to the existing method <code>getSessionInstance()</code>. |
| However, with the additional parameter, it allows you to obtain the singleton instance |
| for a given UISession <em>even from another thread</em> without having to wrap your code |
| in a runnable and pass it to <code>uiSession.exec()</code>. |
| To prepare your singleton for access from background threads, you may consider adding a |
| parameter to the getInstance method as shown below. |
| This pattern also allows for better unit tests. |
| </p> |
| |
| <pre lang="java"> |
| private static MySingleton getInstance( UISession uiSession ) { |
| return SingletonUtil.getUniqueInstance( MySingleton.class, uiSession ); |
| } |
| </pre> |
| |
| <p> |
| The old method <code>getSessionInstance()</code> still exists and delegates to the new one, |
| so you should be able to adjust your code using an “Inline Method” refactoring. |
| </p> |
| |
| <h3>Support for Application Singletons</h3> |
| |
| <p> |
| Similar to UISession singletons, you can now also create singletons with application scope. |
| Whenever you run multiple RAP applications in a single VM, there may be classes in a shared |
| bundle that should have exactly one instance per application. |
| </p> |
| |
| <pre lang="java"> |
| ApplicationContext context = RWT.getApplicationContext(); |
| SingletonUtil.getUniqueInstance( MySingleton.class, applicationContext ); |
| </pre> |
| |
| </div> |