Hi Reinier, So are you saying I can't use EventListener to somehow implement double/right click support in Tree widgets and convert the Event to a TreeItem?
Moreover are you saying that double/right click support cannot be implemented using GWT? Unless I want to start over and re-implement widgets? I understand what I am looking for is very Swing/desktop app centric rather than the norm on the web. However that is exactly what I have been asked to do. If you had to had to have double/right click Tree widget support how could you/I get the TreeItem the user operated on? If Google could do it for single click I don't see why the same is not possible for other operations. -Dave On Mon, Dec 22, 2008 at 4:49 PM, Reinier Zwitserloot <reini...@gmail.com>wrote: > > 1) You can use something called 'anonymous inner classes'. google it. > They look something like this: > > someButton.addClickListener(new ClickListener() { public void onClick > () { > /* code that runs when someButton is clicked goes here. */ > }}); > > This does produce 2 class files, but this is an utterly irrelevant > implementation detail of the JVM. GWT doesn't even give a crap about > these; it generates JS files directly from the java sources, and the > class files are there only because some IDEs don't work well without > them, and the hosted mode debug tool needs them. Whining about this is > pointless, as its a fact of life of the JVM platform. It also seems a > bit pointless to whine about: Who cares about how many class files are > involved? > > 2) the web doesn't work with generic 'I want every event ever' style > event catching. You can only sign up for a few events. The ones GWT > has nice abstractions for (all the 'specific' listeners) are the ones > that work reliably and similarly on all supported GWT platforms. There > are a select few event types that are non-standard and aren't > generally available on GWT's widget (the most famous one is probably > doubleclick), and there are a few widgets that don't have an > addXListener for something they do support. EventListener and the > Event class are LOW LEVEL SUPPORT classes - you do not use them in > normal code, only in library code. They are used by GWT's own widgets. > You should use them if you're building your own widget from scratch > (but not when you're compositing them from other GWT widgets). If you > aren't doing that, then you shouldn't be using them. They aren't drop > in replacements to do 'catch all events' code. > > In general, you should not use the stuff that isn't supported. If, > however, you must, then you can. This involves messing with the DOM.* > utility methods and generally means you need to know what you're > doing. Remember, GWT is a *LEAKY* abstraction. Using GWT when you > don't have a clue about how html, the dom, and javascript work, is not > a supported use case. GWT is useful because it makes web development > easier. That's a long way of saying: Tough cookies, go learn how the > web works, then come back. > > Once you've figured that all out, this is how you can hack GWT: > > 1. use DOM/Widget.sinkEvents to set up a listener on the DOM side for > the specific event you're interested in. > > 2. Use the EventListener raw interface / override onEvent from the > Widget class and check the Event code to know what just happened. The > 'Event' class is a javascript/java interactivity tool, just like the > JavaScriptObject class. You are NOT supposed to do anything with it in > java code; you pass it into JSNI methods and then the JSNI code does > something with it. This interface also provides you with a few useful > parameters, such as the sending object. > > 3. As a general rule, using one event listener to handle events coming > from multiple objects, is bad design. Use as many anonymous inner > classes as you need, instead. This is only acceptable in certain > situations that involve arrays of 100% similar widgets (such as a blog > engine where you have a list of checkbox widgets, one for each tag, > where the tags on any given post are completely dynamic - for example, > set by the user when he wrote the post. Then it can make sense to have > just one event listener for the whole lot, and check which widget > caused the event to respond appropriately). > > 4. When using anonymous inner classes for event handlers with more > than one method (such as the keyboard listener which has keyUp, > keyDown, keyPress), but you only care about one of those, use the > XListenerAdapter class instead of the interface. Make sure you use the > @Override annotation on the one method you're overriding when you do > this, or bad things happen when you typo the method name > (specifically: nothing happens at all, which means you have to go on a > bug hunting spree to figure out why nothing is happening. It can take > a while to realize you typoed the method name. With an @Override in > place, the compiler will refuse to compile your code right from the > get go. Much easier to find that mistake now.) > > Example situation: I have a cancel button and an ok button. > > DO THIS: > > cancelButton.addClickListener(new ClickListener() { public void onClick > (Widget w) { > dialog.close(); > Messaging.flashWarning("Sign-up cancelled."); > }}); > > okButton.addClickListener(new ClickListener() { public void onClick > (Widget w) { > okButton.setEnabled(false); > dialog.showSpinner(); > sendRegistrationRequest(emailBox.getText(), new > RegistrationRequestHandler() { > @Override public void requestAccepted() { > dialog.close(); > Messaging.showMessage("Congratulations! You've signed up > to our service!"); > } > > @Override public void requestDenied(String reason) { > dialog.close(); > Messaging.showError("Whoops - we can't process your sign > up request, because " + reason); > } > }); > }}); > > > do NOT do: > > myClickListener = new MySignupDialogClickListener(); > cancelButton.addClickListener(myClickListener); > okButton.addClickListener(myClickListener); > > and then in MySignupDialogClickListener: > > public void onClick(Widget w) { > if ( w == SignupDialog.getInstance().okButton ) handleOkButton(); > else if ( w == SignupDialog.getInstance().cancelButton) > handleCancelButton(); > } > > > > That last one is very ugly, a massive waste of time (it violates DRY > principle much more), separates two related code snippets for > absolutely no good reason whatsoever, is a pain to add new things to, > and did I mention it was ugly? Don't do it. > > On Dec 22, 4:37 am, "David H. Cook" <david.hubert.c...@gmail.com> > wrote: > > The more code I implement and the more event-related APIs > > I look at in GWT, the more confused I get. After > > looking at complete examples about 'listeners' on website such as: > http://examples.roughian.com/index.htm#Listeners~Summary<http://examples.roughian.com/index.htm#Listeners%7ESummary> > > or posts in this group, I conclude that the most general > > is an 'EventListener', because then I can get at ANY/ALL events > > that I might be interested in, as it's method gets 'Event e' > > as an input param. But, what seems to me like > > a real NEGATIVE is that I must 'extend' (sub-class) an object > > to use EventListener, right? > > > > Now, if I only care about a 'click', then I do NOT need to extend, > > because there are 'clicklisteners', which listen for just ONE event > > type...'click'. But, if I want, say, 'double-click', well, there > > are NOT any 'double-click' listeners, so it seems that I'll need > > to use the more general EventListener. > > > > That would be reasonable/acceptable if there was just > > ONE object that I wanted/needed to extend in a given app. > > But, let's say, I care about 'doubleclicks' from 3 different > > objects in the same app...anchors, tabs, and images. > > (Maybe not the best examples, but bear with me.) > > So, it seems that now I need to extend three objects, so I'll > > need 3 java classes (and thus, ...3 FILES...one class per file). > > [Some posts/examples mention 'widget builders' as a separate > > class of developer. But, I don't want to build new 'widgets'... > > I just want a write a simple app. > > > > Somehow, the APIs seem to be making things unnecessarily 'complex', > > when I compare this to how easy it was to implement events > > in javascript language (before I started using GWT). And, its > > beginning to seem like the designers of the event-model/event-apis in > > GWT > > might have miss-designed the APIs?! (I wasn't around at the > > beginning, so I don't know how the event-APIs looked in version 1.00.) > > > > Both the author of roughian website and other posters all seem to > > bemoan > > this need to extend, but all say it is necessary. For example, > > roughian > > says: > > > > [Notes: > > This is something you should only use if you are subclassing a widget > > - it's not much use otherwise, > > you can't addEventListener() to anything I'm aware of. > > So, as a builder of widgets, you'd use this to pick up events and use > > them in ways > > that you can't do with the ordinarily supported event interfaces] > > > > Clearly, I (and others?) must all be missing something. Where have I > > gone wrong? > > > --~--~---------~--~----~------------~-------~--~----~ 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+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/Google-Web-Toolkit?hl=en -~----------~----~----~----~------~----~------~--~---