Fix a crash during CKEditor destruction

The CKEditor must be destroyed before it is detached from the DOM. 
Use parent composite "Dispose" event to destroy it.
Prevent RichTextEditor reparenting as this is not supported by CKEditor.

Change-Id: I86393c8b2b0563e45dd6ebe1e15e04099ea95709
diff --git a/bundles/org.eclipse.rap.nebula.widgets.richtext/src/org/eclipse/nebula/widgets/richtext/RichTextEditor.java b/bundles/org.eclipse.rap.nebula.widgets.richtext/src/org/eclipse/nebula/widgets/richtext/RichTextEditor.java
index bd0871d..9a90114 100644
--- a/bundles/org.eclipse.rap.nebula.widgets.richtext/src/org/eclipse/nebula/widgets/richtext/RichTextEditor.java
+++ b/bundles/org.eclipse.rap.nebula.widgets.richtext/src/org/eclipse/nebula/widgets/richtext/RichTextEditor.java
@@ -193,6 +193,20 @@
     }
   }
 
+  @Override
+  public boolean setParent( Composite parent ) {
+    checkWidget();
+    // CKEditor can't be reparented
+    return false;
+  }
+
+  @Override
+  public boolean isReparentable() {
+    checkWidget();
+    // CKEditor can't be reparented
+    return false;
+  }
+
   private String getCssFont() {
     StringBuilder result = new StringBuilder();
     if( getFont() != null ) {
diff --git a/bundles/org.eclipse.rap.nebula.widgets.richtext/src/resources/RichTextEditor.js b/bundles/org.eclipse.rap.nebula.widgets.richtext/src/resources/RichTextEditor.js
index 0c16203..35f64bc 100644
--- a/bundles/org.eclipse.rap.nebula.widgets.richtext/src/resources/RichTextEditor.js
+++ b/bundles/org.eclipse.rap.nebula.widgets.richtext/src/resources/RichTextEditor.js
@@ -17,11 +17,12 @@
   rwt.define( "rwt.widgets" );
 
   rwt.widgets.RichTextEditor = function( properties ) {
-    bindAll( this, [ "layout", "onReady", "onSend", "onRender" ] );
+    bindAll( this, [ "layout", "onReady", "onSend", "onRender", "destroy" ] );
     this.parent = rap.getObject( properties.parent );
     this.element = document.createElement( "div" );
     this.parent.append( this.element );
     this.parent.addListener( "Resize", this.layout );
+    this.parent.addListener( "Dispose", this.destroy );
     rap.on( "render", this.onRender );
   };
 
diff --git a/bundles/org.eclipse.rap.nebula.widgets.richtext/src/resources/RichTextEditorHandler.js b/bundles/org.eclipse.rap.nebula.widgets.richtext/src/resources/RichTextEditorHandler.js
index 103792d..9f366d3 100644
--- a/bundles/org.eclipse.rap.nebula.widgets.richtext/src/resources/RichTextEditorHandler.js
+++ b/bundles/org.eclipse.rap.nebula.widgets.richtext/src/resources/RichTextEditorHandler.js
@@ -18,8 +18,6 @@
       return new rwt.widgets.RichTextEditor( properties );
     },
 
-    destructor : "destroy",
-
     properties : [ "text", "editable", "font" ]
 
   } );
diff --git a/tests/org.eclipse.rap.nebula.widgets.richtext.test/src/org/eclipse/nebula/widgets/richtext/RichTextEditor_Test.java b/tests/org.eclipse.rap.nebula.widgets.richtext.test/src/org/eclipse/nebula/widgets/richtext/RichTextEditor_Test.java
index 5cdf0f3..bbb1d6c 100644
--- a/tests/org.eclipse.rap.nebula.widgets.richtext.test/src/org/eclipse/nebula/widgets/richtext/RichTextEditor_Test.java
+++ b/tests/org.eclipse.rap.nebula.widgets.richtext.test/src/org/eclipse/nebula/widgets/richtext/RichTextEditor_Test.java
@@ -12,6 +12,7 @@
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertSame;
 import static org.mockito.Matchers.anyString;
 import static org.mockito.Matchers.eq;
 import static org.mockito.Mockito.mock;
@@ -32,6 +33,7 @@
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.graphics.Font;
 import org.eclipse.swt.layout.FillLayout;
+import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Display;
 import org.eclipse.swt.widgets.Shell;
 import org.junit.Before;
@@ -86,7 +88,8 @@
 
     verify( loader ).require( resourceManager.getLocation( "ckeditor/ckeditor.js" ) );
     verify( loader ).require( resourceManager.getLocation( "ckeditor/config.js" ) );
-    verify( loader ).require( resourceManager.getLocation( "ckeditor/handler.js" ) );
+    verify( loader ).require( resourceManager.getLocation( "ckeditor/RichTextEditor.js" ) );
+    verify( loader ).require( resourceManager.getLocation( "ckeditor/RichTextEditorHandler.js" ) );
   }
 
   @Test
@@ -156,6 +159,21 @@
     verify( remoteObject ).destroy();
   }
 
+  @Test
+  public void testIsReparentable() {
+    assertFalse( editor.isReparentable() );
+  }
+
+  @Test
+  public void testSetParent() {
+    Composite newParent = new Composite( shell, SWT.NONE );
+
+    boolean success = editor.setParent( newParent );
+
+    assertFalse( success );
+    assertSame( shell, editor.getParent() );
+  }
+
   private JavaScriptLoader mockJavaScriptLoader() {
     WebClient client = mock( WebClient.class );
     context.replaceClient( client );