Indice dei tutorials: http://gheryd.blogspot.com/2011/06/javascript-gwt-tutorials.html
Mi è capitato di avere l'esigenza di nascondere degli item del widget tree di gwt, come nell'esempio seguente:
Ho risolto questo problema estendendo la classe Tree (api tree). Con un override del metodo "onBrowserEvent", intercetto l'evento prima che venga gestito dalla classe Tree.
Se l'evento è relativo alla tastiera (keyboard event) , allora l'oggetto "event" viene salvato e poi inoltrato alla metodo analogo della classe madre che procederà quindi nella selezione.
Dato che questo evento scatena una chiamata di eventuali SelectionHandler registrati, quanto istanzio la classe TreeExt, occorre necessariamente aggiungere l'handler in cui verrà verificato se l'item selezionato è nascosto (hidden). In tal caso viene chiamato il metodo fireLastEvent che di fatto è come se l'utente ripremesse lo stesso tasto. Quindi l'ultimo evento da tastiera verrà scatenato ripetutamente via codice finchè non verrà selezionato un item visibile.
Mi è capitato di avere l'esigenza di nascondere degli item del widget tree di gwt, come nell'esempio seguente:
Tree tree = new Tree(); TreeItem root = new TreeItem("root"); tree.addItem(root); for(int i=0;i<10;i++) root.addItem( new TreeItem( "item_"+i ) ); root.getItem(5).setVisible(false);L'item con indice 5 viene nascosto, ma se si usano i tasti freccia su e giu, è selezionabile come tutti gli altri. Chiaramente questo non ha senso. Quindi ritengo questo un bug!
Ho risolto questo problema estendendo la classe Tree (api tree). Con un override del metodo "onBrowserEvent", intercetto l'evento prima che venga gestito dalla classe Tree.
Se l'evento è relativo alla tastiera (keyboard event) , allora l'oggetto "event" viene salvato e poi inoltrato alla metodo analogo della classe madre che procederà quindi nella selezione.
Dato che questo evento scatena una chiamata di eventuali SelectionHandler registrati, quanto istanzio la classe TreeExt, occorre necessariamente aggiungere l'handler in cui verrà verificato se l'item selezionato è nascosto (hidden). In tal caso viene chiamato il metodo fireLastEvent che di fatto è come se l'utente ripremesse lo stesso tasto. Quindi l'ultimo evento da tastiera verrà scatenato ripetutamente via codice finchè non verrà selezionato un item visibile.
public class TreeExt extends Tree { private Event lastEvent = null; TreeExt() {} @Override public void onBrowserEvent(Event event) { int eventType = DOM.eventGetType(event); lastEvent = (eventType== Event.ONKEYPRESS || eventType == Event.ONKEYDOWN) ? event : null; super.onBrowserEvent(event); } public void fireLastEvent(){ if( lastEvent !=null ) { super.onBrowserEvent(lastEvent); } } }
// Example final TreeExt t = new TreeExt(); t.addSelectionHandler( new SelectionHandler() { @Override public void onSelection(SelectionEvent event) { TreeItem item = event.getSelectedItem(); if( !item.isVisible() ) { //Window.alert("not visible"); t.fireLastEvent(); return; } //TODO handle event for visible item } });E' possile sovrascrivere il metodo addSelectionHandler per fare in modo che sia la stessa classe TreeExt a controllare se l'item è visibile- Il codice per chi utilizza questa classe sarebbe più pulito ed elegante. Beh, se questo tocco di eleganza vi gusta allora provateci ;)
Nessun commento:
Posta un commento