package com.google.gwt.sample.showcase.client.content.cell; import java.util.HashSet; import java.util.Set; import com.google.gwt.cell.client.Cell; import com.google.gwt.cell.client.ValueUpdater; import com.google.gwt.dom.client.BrowserEvents; import com.google.gwt.dom.client.Element; import com.google.gwt.dom.client.NativeEvent; import com.google.gwt.event.dom.client.KeyCodes; import com.google.gwt.user.client.ui.HasScrolling; public class Cells { private Cells() {} public static <F, T> Cell<F> adapt(Cell<T> cell, Function<F, T> transform) { return new CellAdapter<F, T>(cell, transform, null); } public static <F, T> Cell<F> adaptWithConstantValue( Cell<T> cell, final T value) { return new CellAdapter<F, T>( cell, new Function<F, T>() { @Override public T apply(F input) { return value; } }, null); } public static <T> Cell<T> makeClickable( Cell<T> cell, final Receiver<T> clickReceiver) { Set<String> events = new HashSet<>(); events.add(BrowserEvents.CLICK); events.add(BrowserEvents.KEYDOWN); return new CellAdapter<T, T>(cell, null, events) { @Override public void onBrowserEvent( Context context, Element parent, T value, NativeEvent event, ValueUpdater<T> valueUpdater) { super.onBrowserEvent(context, parent, value, event, valueUpdater); if (event.getType().equals(BrowserEvents.CLICK) || (event.getType().equals(BrowserEvents.KEYDOWN) && event.getKeyCode() == KeyCodes.KEY_ENTER)) { clickReceiver.accept(value); } } }; } /** * Wrap the given cell so that if * {@link Cell#resetFocus(com.google.gwt.cell.client.Cell.Context, Element, Object)} is * called on it, the wrapped cell will focus itself, but will also make sure that the * browser window doesn't automatically scroll the cell into view. This is handy for * cells that should respond to keyboard commands even when out of view. * * <p>Note that refocusing on top-level cells will happen automatically when a cell widget * is redrawn. One surprising cause of a redraws is that HasDataPresenter optimizes extensions * to a short list by just redoing the whole list. See * {@link com.google.gwt.user.cellview.client.HasDataPresenter#REDRAW_THRESHOLD} for what * can trigger redraws. */ public static <T> Cell<T> makeFocusableWithoutScrolling( Cell<T> cellToWrap, final HasScrolling scrollable) { return new CellAdapter<T, T>(cellToWrap, null, null) { @Override public boolean resetFocus(Context context, Element parent, T value) { int x = scrollable.getHorizontalScrollPosition(); int y = scrollable.getVerticalScrollPosition(); parent.focus(); scrollable.setHorizontalScrollPosition(x); scrollable.setVerticalScrollPosition(y); return true; } }; } }