Friday, January 27, 2012

Re: native javascript functions manipulation in java - overlay types

Ok I found more or less how to do what I want, the following registers a click handler in a native DOM object:

public class DomEventTest1 {

public static interface ClickHandler {
void notifyClick(Element source);
}

/** call this directly from your Entry point class */
public static void test(RootPanel rootPanel) {

//create a button using gwt DOM
ButtonElement button1 = Document.get().createPushButtonElement();
button1.setInnerHTML("clickme");
Document.get().getBody().appendChild(button1);

addClickHandler(button1, new ClickHandler() {
@Override
public void notifyClick(Element source) {
System.out.println("CLICKED");
}
});
}
public static native void addClickHandler(Element e, ClickHandler handler)/*-{
//dirty click handler registration, only for testing
e.onclick=function() {
handler.@org.sgx.gwtraphaljstest.client.js.test.DomEventTest1.ClickHandler::notifyClick(Lcom/google/gwt/dom/client/Element;)(this);
}
}-*/;

}


Now two quiestion about jsni.

The first question is: the statement
handler.@org.sgx.gwtraphaljstest.client.js.test.DomEventTest1.ClickHandler::notifyClick(Lcom/google/gwt/dom/client/Element;)(this);
is a valid javascript statement? or is it some internal gwt compiler language that is translated to javascript?

What I would like is to be able of represent any javascript function using java objects, like Runnable or other. The main problem for this is be able to call a java instance method from javascript having the java class name, method name and signature in strings. I would like something like:

public static native void callJavaInstMethod(Object javaThisEl, String className, String methodName, String methodSignature, Object[]params)/*-{
//and here do something like:
javaThisEl.@${className}::${methodName}(${methodSignature})(${params})
}-*/;

I tried to archieve something like this unssuccessfully with eval and other hacks. A method like this, will allow me to represent any javascript function using java objects. For example, instead of writing methods like addClickHandler by hand, I could use an Artificial AbstractRunnable class for represent javascript functions as java objects and do:

button1.addClickHandler(new AbstractRunnable1<Element>(){
public void run(Element e) {
System.out.println("CLICKED");
}
});

Any ideas on how to call a java instance method from native javascript having all the necesary information in Strings ?

Regards, and thanks in advance.

On Thu, 26 Jan 2012 15:42:27 -0200
Sebastian Gurin <sgurin@softpoint.org> wrote:

> Hello all.
>
> I'm trying my first javascript toolkit porting to java in gwt. I think JavaScript Overlay Types is exactly what I need. Everithing seems to be well supported with the exception of javascript functions...
>
> Explanation. The objective behind Overlay Types as I understand is to easily and safely "present" a javascript object in java language. But javascript objects often require the pass of a function as function parameter, for example, subscribing to an event with a javascript function handler:
>
> jQuery(el).click(function(){......});
>
> My question is, can I represent a javascript function in java? for example with a java.lang.Runnable?
>
> My intention is:
>
> public class MyWrapp extends JavaScriptObject {
> public void click(Runnable listener) {
> and here handle somehow the function listener::run
> as a java object functionObject and pass it via jsni like:
> this.click(functionObject);
> }
> }
>
>
> and then in my java code use the wrapper:
>
> MyWrap wrapper = ...;
> wrapper.click(new Runnable(){
> Window.alert("clicked!");
> });
>
>
>
> Note:
> In java2script (a java to javascript compiler similar to GWT), it was not so hard to do this because method functions are implemented inside context objects natively. i.e. In Runnable r, r.run is a javascript function natively, s onatively I can simply perform r.run(), taking care of pointing javascript context object to 'r'.
>
> In GWT this is different, calling r.run() natively must be done with something like:
>
> r.@org.my.Runnable::run()();
>
> I'm still investigating possible sollutions to this problem. Also, I found that the new GWT DOM API (http://google-web-toolkit.googlecode.com/svn/javadoc/latest/com/google/gwt/dom/client/package-tree.html), that I think it is based on Overlay Types doesn't seem to have support for event registration or any task implying javascript function manipulation/presentation in java.
>
> Well, any idea is most welcome. Regards
>
>
> --
> Sebastian Gurin <sgurin@softpoint.org>
>
> --
> You received this message because you are subscribed to the Google Groups "Google Web Toolkit" group.
> To post to this group, send email to google-web-toolkit@googlegroups.com.
> To unsubscribe from this group, send email to google-web-toolkit+unsubscribe@googlegroups.com.
> For more options, visit this group at http://groups.google.com/group/google-web-toolkit?hl=en.
>


--
Sebastian Gurin <sgurin@softpoint.org>

--
You received this message because you are subscribed to the Google Groups "Google Web Toolkit" group.
To post to this group, send email to google-web-toolkit@googlegroups.com.
To unsubscribe from this group, send email to google-web-toolkit+unsubscribe@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/google-web-toolkit?hl=en.

No comments:

Post a Comment