/** * Copyright (C) 2014 BonitaSoft S.A. * BonitaSoft, 32 rue Gustave Eiffel - 38000 Grenoble * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2.0 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.bonitasoft.console.client.mvp; import com.google.gwt.cell.client.AbstractCell; 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.InputElement; import com.google.gwt.dom.client.NativeEvent; import com.google.gwt.dom.client.NodeList; import com.google.gwt.event.shared.GwtEvent; import com.google.gwt.safehtml.shared.SafeHtml; import com.google.gwt.safehtml.shared.SafeHtmlBuilder; import org.bonitasoft.console.client.mvp.event.DirtyInputEvent; import org.bonitasoft.console.client.mvp.event.DirtyInputHandler; import org.bonitasoft.web.toolkit.client.eventbus.MainEventBus; /** * @author Vincent Elcrin */ public abstract class TemplateRepeat<T> extends AbstractCell<T> { private String style; private GwtEvent.Type<DirtyInputHandler<T>> dirtyInputEventType = new GwtEvent.Type<DirtyInputHandler<T>>(); public TemplateRepeat(String style) { super(BrowserEvents.CLICK, BrowserEvents.KEYUP); this.style = style; } public String getStyle() { return style; } @Override public void render(Context context, T value, SafeHtmlBuilder sb) { if (value == null) { return; } sb.append(render(context, value)); } public abstract SafeHtml render(Cell.Context context, T value); @Override public void onBrowserEvent(Context context, Element parent, T item, NativeEvent event, ValueUpdater<T> valueUpdater) { Element element = Element.as(event.getEventTarget()); if (element.getTagName().equalsIgnoreCase(InputElement.TAG)) { final InputElement input = InputElement.as(element); notify(context, event, input, item); } super.onBrowserEvent(context, parent, item, event, valueUpdater); } @Override public boolean isEditing(Context context, Element parent, T value) { return true; } public void listen(DirtyInputHandler<T> handler) { MainEventBus.getInstance().addHandler(dirtyInputEventType, handler); } private void notify(Context context, NativeEvent event, InputElement input, T item) { MainEventBus.getInstance().fireEventFromSource(new DirtyInputEvent<T>(dirtyInputEventType, event, context, input, item), this); } @Override public boolean resetFocus(Context context, Element parent, T value) { final NodeList<Element> elements = parent.getElementsByTagName("input"); if (elements.getLength() > 0) { InputElement.as(elements.getItem(0)).focus(); return true; } return false; } }