[gwt-contrib] Re: GWT 1.5 long JSNIs vs. Dates.

2008-08-29 Thread Ray Cromwell

This is related to the issue I discussed in another email about common
subexpression elimination and wrappers.

If I had a Layer interface/delegator which delegated to a GWT.create()
call which returns a JSO, the JSO would still need to implement an
interface. Imagine that I want to turn this:

layer.ctx.moveTo(100,100);

into

ctx.moveTo(100,00);

I can do this today with a JSO that overlays the JS object returned
from element.getContext('2d');

However, if I want to have a drawing interface that might use JSOs
targeting Canvas, Flash, or SVG objects in the browser, I'm guessing
you're talking about doing something like this:

public class Canvas {
   CanvasJSO impl = GWT.create(CanvasImpl.class);
   public void moveTo(int x, int y) { impl.moveTo(x,y); }
}

Great, this will get perfectly inlined to ctx.moveTo(x,y);

The problem is, how do I make a do I make a GWT.create() call return
disjoint JSO types that are usable by a single delegator?

In the above, you see that I am declaring the impl field as a
CanvasJSO. But if GWT.create(CanvasImpl.class) can also return a
FlashJSO or a SVGJSO, which have native canvas emulation, what do I
declare the type of this impl field as?  I can't make those three JSOs
implement an interface, nor can I make them inherit from a abstract
base class, or use overrides.

The current solution is not to use JSOs but to use wrappers, which
means all those methods end up looking like this:

function moveTo(this$static, x, y) {
  this$static.ctx.moveTo(x,y);
}

where ultimately, the JsInliner reduces this to:

localVar.ctx.moveTo(x,y);

It's not terrible, but I was looking for a way to remove the wrapper
references until CSE appears in the compiler.

-Ray
On Fri, Aug 29, 2008 at 11:47 AM, Scott Blum [EMAIL PROTECTED] wrote:
 Ray, can you help me understand why the delegator pattern doesn't do it for
 you?  Take for example the 1.5 dom.client library, if you look at
 Element/Node you'll notice several calls that are delegated to
 dom.client.DOMImpl, which is deferred bound.

 On Fri, Aug 29, 2008 at 3:36 AM, Ray Cromwell [EMAIL PROTECTED] wrote:

 Your example looks correct. I heavily 'drank the koolaid of Overlay
 types earlier this year and have not regretted it. To the extend that
 there are areas where I'd like to use them, but can't, because of
 their inability to implement interfaces

 . In particular, when using Deferred Binding to wrap native browser
 objects, sometimes I need a JSO created differently for each DB. Each
 JSO is effectively final because only one  concrete type of the
 interface ever exists in any permutation, so theoretically it's
 possible for the JSO design to work within these restrictions, but a
 little hairy. (essentially, if type-tightening fails, you're screwed)

 The classic example is Canvas drawing. I have an interface which
 exports drawing methods (moveTo, lineTo, transform, etc) One
 implementation might be a wrapper around the CanvasRenderingContext2D
 from the CANVAS tag. Another might be a Flash, SVG, or Silverlight
 implementation.


 -Ray

 On Fri, Aug 29, 2008 at 12:26 AM, Ian Petersen [EMAIL PROTECTED] wrote:
 
  On Fri, Aug 29, 2008 at 3:05 AM, Reinier Zwitserloot
  [EMAIL PROTECTED] wrote:
  I don't use GWT-Serialization to talk to my server. The server sends
  timestamps as milliseconds. I'd like to turn these milliseconds into
  javascript Date objects.
 
  How do I accomplish this?
 
  As I mentioned when long emulation was on the table, timestamps are
  one of those numbers which are not representable with ints, but they
  fit perfectly in the range where doubles still represent integral
  numbers without loss of precision.
 
  I don't think you want to use longs--someone measured them at 250
  times slower than JS doubles, or something like that.  I think you
  want the following:
 
  public final class JSDate extends JSO {
 
   protected JSDate() {
   }
 
   public static native create(double millis) /*-{
 return new Date(millis);
   }-*/;
 
   // implement relevant date methods here, like getYear:
 
   public native int getYear() /*-{
 return this.getYear();
   }-*/;
  }
 
  Not sure though--I haven't used the new overlay stuff myself, and I
  typed the above directly into the browser without testing.
 
  Ian
 
  
 




 


--~--~-~--~~~---~--~~
http://groups.google.com/group/Google-Web-Toolkit-Contributors
-~--~~~~--~~--~--~---



[gwt-contrib] Re: GWT 1.5 long JSNIs vs. Dates.

2008-08-29 Thread Scott Blum
What about this?
public final class Canvas extends JavaScriptObject {
  private static CanvasImpl impl = GWT.create(CanvasImpl.class);

  public static Canvas create()  {
return impl.create();
  }

  public void moveTo(int x, int y)  {
return impl.moveTo(this, x, y);
  }
}

Then you just create several subclasses of CanvasImpl, for Canvas, Flash,
SVG, etc.

--~--~-~--~~~---~--~~
http://groups.google.com/group/Google-Web-Toolkit-Contributors
-~--~~~~--~~--~--~---



[gwt-contrib] Re: GWT 1.5 long JSNIs vs. Dates.

2008-08-29 Thread Reinier Zwitserloot

I apologize for being an idiot. The answer is was looking for 'use a
'double' instead of a 'long' - you said it yourself - dumbass!'.

Eh, it had been a long day. Thanks for all the hints, at any rate. And
extra points for Ian for showing yet another way in which JSOs are
cool.

On Aug 29, 9:26 am, Ian Petersen [EMAIL PROTECTED] wrote:
 On Fri, Aug 29, 2008 at 3:05 AM, Reinier Zwitserloot [EMAIL PROTECTED] 
 wrote:
  I don't use GWT-Serialization to talk to my server. The server sends
  timestamps as milliseconds. I'd like to turn these milliseconds into
  javascript Date objects.

  How do I accomplish this?

  As I mentioned when long emulation was on the table, timestamps are
  one of those numbers which are not representable with ints, but they
  fit perfectly in the range where doubles still represent integral
  numbers without loss of precision.

 I don't think you want to use longs--someone measured them at 250
 times slower than JS doubles, or something like that.  I think you
 want the following:

 public final class JSDate extends JSO {

   protected JSDate() {
   }

   public static native create(double millis) /*-{
     return new Date(millis);
   }-*/;

   // implement relevant date methods here, like getYear:

   public native int getYear() /*-{
     return this.getYear();
   }-*/;

 }

 Not sure though--I haven't used the new overlay stuff myself, and I
 typed the above directly into the browser without testing.

 Ian
--~--~-~--~~~---~--~~
http://groups.google.com/group/Google-Web-Toolkit-Contributors
-~--~~~~--~~--~--~---