/*
* 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.eas.grid.RenderedCellContext;
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.core.client.Scheduler;
import com.google.gwt.core.client.Scheduler.ScheduledCommand;
import com.google.gwt.dom.client.BrowserEvents;
import com.google.gwt.dom.client.Document;
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.safecss.shared.SafeStyles;
import com.google.gwt.safecss.shared.SafeStylesBuilder;
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.safehtml.shared.SafeUri;
import com.google.gwt.user.client.ui.HasText;
import com.google.gwt.user.client.ui.HasValue;
import com.google.gwt.user.client.ui.Widget;
/**
*
* @author mg
*/
public class RenderedEditorCell<T> extends WidgetEditorCell<T> {
public interface PaddedCell extends SafeHtmlTemplates {
public static PaddedCell INSTANCE = GWT.create(PaddedCell.class);
@Template("<div class=\"grid-cell-anchor\"></div><img class=\"grid-cell-image\" style=\"{0}\" src=\"{1}\"></img><div id=\"{2}\" class=\"grid-cell-text\" style=\"{0}\">{3}</div>")
public SafeHtml generate(SafeStyles aStyle, SafeUri aImgSrc, String aId, SafeHtml aContent);
@Template("<div class=\"grid-cell-anchor\"></div><img class=\"grid-cell-image\" style=\"{0}\"></img><div id=\"{1}\" class=\"grid-cell-text\" style=\"{0}\">{2}</div>")
public SafeHtml generate(SafeStyles aStyle, String aId, SafeHtml aContent);
}
public interface EditorCloser {
public void closed(Element aTable);
}
protected CellRenderer<T> renderer;
protected CellHasReadonly readonly;
protected EditorCloser onEditorClose;
public RenderedEditorCell(Widget aEditor) {
super(aEditor, BrowserEvents.DBLCLICK, BrowserEvents.KEYDOWN, BrowserEvents.FOCUS, BrowserEvents.BLUR);
}
public EditorCloser getOnEditorClose() {
return onEditorClose;
}
public void setOnEditorClose(EditorCloser aValue) {
onEditorClose = aValue;
}
public CellRenderer<T> getRenderer() {
return renderer;
}
public void setRenderer(CellRenderer<T> aRenderer) {
renderer = aRenderer;
}
public CellHasReadonly getReadonly() {
return readonly;
}
public void setReadonly(CellHasReadonly aValue) {
readonly = aValue;
}
@Override
public void render(final Context context, final T value, SafeHtmlBuilder sb) {
String viewDataId = "";
if (isEditing(context, null, value)) {
final ViewData<T> viewData = getViewData(context.getKey());
viewDataId = viewData.id;
Scheduler.get().scheduleDeferred(new ScheduledCommand() {
@Override
public void execute() {
if (isEditing(context, null, value)) {
Element identifiedCellTextSection = Document.get().getElementById(viewData.id);
if (identifiedCellTextSection != null) {
identifiedCellTextSection.blur();
Element table = identifiedCellTextSection;
while (table != null && !"table".equalsIgnoreCase(table.getTagName())) {
table = table.getParentElement();
}
final Element table1 = table;
if (identifiedCellTextSection.getOwnerDocument() == Document.get()) {
startEditing(context, identifiedCellTextSection.getParentElement(), table1.getParentElement(), value, viewData.updater, new Runnable() {
public void run() {
if (onEditorClose != null && table1 != null) {
onEditorClose.closed(table1);
}
}
});
}
}
}
}
});
}
if (renderer == null || !renderer.render(context, viewDataId, value, sb)) {
SafeHtmlBuilder content = new SafeHtmlBuilder();
renderCell(context, value, content);
sb.append(PaddedCell.INSTANCE.generate(new SafeStylesBuilder().toSafeStyles(), viewDataId, content.toSafeHtml()));
}
}
protected void renderCell(Context context, T value, SafeHtmlBuilder sb) {
if (editor != null) {
String display = null;
T oldValue = ((HasValue<T>) editor).getValue();
((HasValue<T>) editor).setValue(value);
try {
display = ((HasText) editor).getText();
} finally {
((HasValue<T>) editor).setValue(oldValue);
}
sb.appendEscaped(display != null ? display : "");
} else {
sb.appendEscaped(value != null ? value.toString() : "");
}
}
public void onBrowserEvent(Cell.Context context, Element parent, T value, NativeEvent event, ValueUpdater<T> valueUpdater) {
if (readonly == null || !readonly.isReadonly()) {
if (!isEditing(context, parent, value)) {
String type = event.getType();
int keyCode = event.getKeyCode();
boolean editToggleKeys = BrowserEvents.KEYDOWN.equals(type) && (keyCode == KeyCodes.KEY_ENTER || keyCode == KeyCodes.KEY_F2);
if (BrowserEvents.DBLCLICK.equals(type) || editToggleKeys) {
// Switch to edit mode.
ViewData<T> viewData = new ViewData<>(Document.get().createUniqueId(), valueUpdater);
setViewData(context.getKey(), viewData);
setValue(new RenderedCellContext(context.getIndex(), context.getColumn(), context.getKey()), parent, value);
}
}
}
}
}