com.eas.grid.cells.RenderedEditorCell.java Source code

Java tutorial

Introduction

Here is the source code for com.eas.grid.cells.RenderedEditorCell.java

Source

/*
 * 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);
                }
            }
        }
    }

}