/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package com.eas.grid.cells; import com.google.gwt.cell.client.Cell; import com.google.gwt.cell.client.ValueUpdater; import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.Element; import com.google.gwt.dom.client.NativeEvent; import com.google.gwt.safehtml.client.SafeHtmlTemplates; import com.google.gwt.safehtml.shared.SafeHtml; import com.google.gwt.safehtml.shared.SafeHtmlBuilder; /** * * @author mg * @param <C> * The data object's */ public abstract class DivDecoratorCell<C> implements Cell<C> { public interface Template extends SafeHtmlTemplates { @SafeHtmlTemplates.Template("<div class=\"{0}\" style=\"padding-left: {1}px; position:relative;zoom:1;\"><div>{2}</div></div>") SafeHtml outerDiv(String aClasses, int padding, SafeHtml cellContents); } private static final Template template = GWT.create(Template.class); protected Cell<C> cell; public DivDecoratorCell(Cell<C> aCell) { super(); cell = aCell; } public Cell<C> getCell() { return cell; } public void setCell(Cell<C> aCell) { cell = aCell; } @Override public boolean dependsOnSelection() { return cell.dependsOnSelection(); } @Override public boolean handlesSelection() { return cell.handlesSelection(); } @Override public boolean isEditing(Context context, Element parent, C value) { return cell.isEditing(context, getCellParent(parent), value); } @Override public void onBrowserEvent(Context context, Element parent, C value, NativeEvent event, ValueUpdater<C> valueUpdater) { if (Element.is(event.getEventTarget()) && getCellParent(parent).isOrHasChild(Element.as(event.getEventTarget()))) { if (cell.getConsumedEvents().contains(event.getType())) { cell.onBrowserEvent(context, getCellParent(parent), value, event, valueUpdater); } } else { onNonCellBrowserEvent(context, parent, value, event, valueUpdater); } } protected abstract void onNonCellBrowserEvent(Context context, Element parent, C value, NativeEvent event, ValueUpdater<C> valueUpdater); @Override public void render(Context context, C value, SafeHtmlBuilder sb) { SafeHtmlBuilder cellBuilder = new SafeHtmlBuilder(); cell.render(context, value, cellBuilder); sb.append(template.outerDiv(outerDivClasses(context), outerDivPadding(context), cellBuilder.toSafeHtml())); } @Override public boolean resetFocus(Context context, Element parent, C value) { return cell.resetFocus(context, getCellParent(parent), value); } @Override public void setValue(Context context, Element parent, C value) { cell.setValue(context, getCellParent(parent), value); } /** * Get the parent element of the decorated cell. * * @param parent * the parent of this cell * @return the decorated cell's parent */ protected Element getCellParent(Element parent) { return parent.getFirstChildElement().getFirstChildElement(); } protected abstract int outerDivPadding(Context aContext); protected abstract String outerDivClasses(Context aContext); }