package org.ovirt.engine.ui.common.widget.table.cell;
import java.util.HashSet;
import java.util.Set;
import org.ovirt.engine.ui.common.utils.ElementIdUtils;
import org.ovirt.engine.ui.common.utils.ElementTooltipUtils;
import org.ovirt.engine.ui.common.widget.tooltip.ProvidesTooltipForObject;
import org.ovirt.engine.ui.uicommonweb.models.EntityModel;
import org.ovirt.engine.ui.uicompat.external.StringUtils;
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;
import com.google.gwt.user.client.DOM;
import com.google.gwt.view.client.CellPreviewEvent;
/**
* <p>
* Base class for all Cells that would otherwise extend GWT CheckboxCell.
* Supports rendering Element ids via the oVirt Element-ID framework.
* </p>
*/
public class CheckboxCell extends com.google.gwt.cell.client.CheckboxCell implements Cell<Boolean>, EventHandlingCell,
ProvidesTooltipForObject<Boolean> {
interface CellTemplate extends SafeHtmlTemplates {
@Template("<input id=\"{0}\" type=\"checkbox\" tabindex=\"-1\" checked style=\"{1}\"/>")
SafeHtml inputChecked(String id, String style);
@Template("<input id=\"{0}\" type=\"checkbox\" tabindex=\"-1\" style=\"{1}\"/>")
SafeHtml inputUnchecked(String id, String style);
}
private static final CellTemplate templates = GWT.create(CellTemplate.class);
private String elementIdPrefix = DOM.createUniqueId(); // default
private String columnId;
private SafeHtml label;
private String additionalStyles;
private SafeHtml tooltipFallback;
public CheckboxCell(boolean dependsOnSelection, boolean handlesSelection) {
super(dependsOnSelection, handlesSelection);
}
@Override
public Set<String> getConsumedEvents() {
HashSet<String> set = new HashSet<>(super.getConsumedEvents());
set.addAll(ElementTooltipUtils.HANDLED_CELL_EVENTS);
return set;
}
/**
* Override the normal render to pass along an id.
*
* @see com.google.gwt.cell.client.AbstractCell#render(com.google.gwt.cell.client.Cell.Context, java.lang.Object, com.google.gwt.safehtml.shared.SafeHtmlBuilder)
*/
public final void render(Context context, Boolean value, SafeHtmlBuilder sb) {
String id = ElementIdUtils.createTableCellElementId(getElementIdPrefix(), getColumnId(), context);
render(context, value, sb, id);
}
/**
* Render the cell. Using the value, the id, and the context, append some HTML to the
* SafeHtmlBuilder that will show in the cell when it is rendered.
*
* Override this and use the id in your render.
*
* @see org.ovirt.engine.ui.common.widget.table.cell.Cell#render(com.google.gwt.cell.client.Cell.Context, java.lang.Object, com.google.gwt.safehtml.shared.SafeHtmlBuilder, java.lang.String)
*/
// TODO-GWT: copied from GWT CheckboxCell, with ID injected. Keep in sync on GWT upgrade.
public void render(Context context, Boolean value, SafeHtmlBuilder sb, String id) {
// Get the view data.
Object key = context.getKey();
Boolean viewData = getViewData(key);
if (viewData != null && viewData.equals(value)) {
clearViewData(key);
viewData = null;
}
if (value != null && ((viewData != null) ? viewData : value)) {
sb.append(templates.inputChecked(id, getAdditionalStyles()));
} else {
sb.append(templates.inputUnchecked(id, getAdditionalStyles()));
}
if (getLabel() != null && !StringUtils.isEmpty(getLabel().asString())) {
sb.append(getLabel());
}
}
public Set<String> getParentConsumedEvents() {
return super.getConsumedEvents();
}
public SafeHtml getLabel() {
return label;
}
public void setLabel(SafeHtml newLabel) {
label = newLabel;
}
public void setElementIdPrefix(String elementIdPrefix) {
this.elementIdPrefix = elementIdPrefix;
}
public void setColumnId(String columnId) {
this.columnId = columnId;
}
public String getElementIdPrefix() {
return elementIdPrefix;
}
public String getColumnId() {
return columnId;
}
public String getAdditionalStyles() {
String result = additionalStyles;
if (result == null) {
result = ""; //$NON-NLS-1$
}
return result;
}
public void setAdditionalStyles(String styles) {
additionalStyles = styles;
}
@Override
public void onBrowserEvent(Context context, Element parent, Boolean value,
NativeEvent event, ValueUpdater<Boolean> valueUpdater) {
ElementTooltipUtils.handleCellEvent(event, parent, getTooltip(value));
super.onBrowserEvent(context, parent, value, event, valueUpdater);
}
public SafeHtml getTooltip(Boolean value) {
return tooltipFallback;
}
@Override
public void setTooltipFallback(SafeHtml tooltipFallback) {
this.tooltipFallback = tooltipFallback;
}
@Override
public boolean handlesEvent(CellPreviewEvent<EntityModel> event) {
return true;
}
}