Difference between revisions of "JFace Data Binding/Rhino"
m (→XWT/Javascript) |
m (→XWT/Javascript) |
||
Line 97: | Line 97: | ||
xmlns:r="http://www.eclipse.org/rhino"> | xmlns:r="http://www.eclipse.org/rhino"> | ||
<r:script> | <r:script> | ||
− | + | function Person(name) { | |
− | + | this.name = name | |
− | + | }; | |
+ | var person = new Person('Simon') | ||
<r:script> | <r:script> | ||
<Shell.layout> | <Shell.layout> | ||
<FillLayout/> | <FillLayout/> | ||
</Shell.layout> | </Shell.layout> | ||
− | <Text /> | + | <Text text="{binding source=person path=name}" /> |
</Shell> | </Shell> | ||
</source> | </source> |
Revision as of 11:19, 18 March 2009
Contents
Target
The goal of JFace Data Binding/Rhino is to support bindings to Rhino Javascript Scriptable Object. See (for the moment) TK-UI SVN but we are discussing with the Eclipse Team on where it can be made available.
JFace Data Binding/Rhino need Rhino 1.6.6, because to detect the change of the property of Javascript Object (thank's to Simon Kaegi), the Rhino observable value use getter/setter ScriptableObject#setGetterOrSetter(....) to fire JFace Databinding event.
Use-case
Take a simple example. Imagine you have this script :
function Person(name) { this.name = name }; var person = new Person('Simon')
And you wish bind the property 'name' of the scriptable object person with SWT Text.
On load form page, SWT Text has 'Simon' value. When user type 'Boris' into SWT Text, it update property 'name' of the scriptable object person with 'Boris' value.
RhinoObservables
Like another JFace Databinding implementations (SWT, Beans, Pojo...), Rhino bindings project give you several JFace IObservableValue and IObservableList Rhino implementations accessible via the IObservable factory org.eclipse.core.databinding.rhino.RhinoObservables.
Here the code of the scriptable object Person binding wich use RhinoObservables :
// 1. Prepare script to excecute String script = "function Person(name) {this.name = name}; " + " var person = new Person('Simon')"; // 2. Load Rhino script by using ImporterTopLevel ScriptableObject global = null; try { Context cx = ContextFactory.getGlobal().enterContext(); global = new ImporterTopLevel(cx); cx.evaluateString(global, script, null, 0, null); } finally { Context.exit(); } // 3. Get UI observable IObservableValue uiObservable = SWTObservables.observeText(textWidget, SWT.Modify); // 4. Get Rhino observable IObservableValue rhinoObservable = RhinoObservables.observeValue(global, "person", "name"); // 5. Bind JS Person#name with SWT Text DataBindingContext bindingContext = new DataBindingContext(); bindingContext.bindValue(uiObservable, rhinoObservable, null, null);
Why JFace Rhino Databinding?
You can tell you, why I need JFace Rhino Databinding, into which context? I will try to explain step by step why I think JFace Rhino Databinding could be used.
Eclipse E4/Declarative UI
One Eclipse E4 target is to have declarative UI capability. XWT is a proposition about declarative UI. If you want display SWT Text, you can write this XML content :
<Shell xmlns="http://www.eclipse.org/xwt/presentation" xmlns:x="http://www.eclipse.org/xwt"> <Shell.layout> <FillLayout/> </Shell.layout> <Text /> </Shell>
XWT/Bean binding
XWT support Beans bindind with declarative mean. For instance if we bind the text attribute of Text to a property “Name” of a Bean Person, here is the data binding expression:
...
<Text text="{binding path=Name}"/>
...
Internally, XWT use JFace Databinding to manage binding, so we can extend it to manage any bindings (EMF, DOM...).
XWT/Javascript
XWT has intention to support Javascript (see Bug 266772). If we take the below [[#Use-case] with XWT we could write this :
<Shell xmlns="http://www.eclipse.org/xwt/presentation" xmlns:x="http://www.eclipse.org/xwt" xmlns:r="http://www.eclipse.org/rhino"> <r:script> function Person(name) { this.name = name }; var person = new Person('Simon') <r:script> <Shell.layout> <FillLayout/> </Shell.layout> <Text text="{binding source=person path=name}" /> </Shell>