package org.activityinfo.ui.client.component.importDialog.validation.cells;
import com.google.gwt.cell.client.AbstractSafeHtmlCell;
import com.google.gwt.cell.client.ValueUpdater;
import com.google.gwt.dom.client.Element;
import com.google.gwt.dom.client.NativeEvent;
import com.google.gwt.event.logical.shared.CloseEvent;
import com.google.gwt.event.logical.shared.CloseHandler;
import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.gwt.safehtml.shared.SafeHtml;
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
import com.google.gwt.text.shared.SafeHtmlRenderer;
import com.google.gwt.text.shared.SimpleSafeHtmlRenderer;
import com.google.gwt.user.client.Event;
import com.google.gwt.user.client.Event.NativePreviewEvent;
import com.google.gwt.user.client.ui.PopupPanel;
import com.google.gwt.user.client.ui.PopupPanel.PositionCallback;
import static com.google.gwt.dom.client.BrowserEvents.CLICK;
import static com.google.gwt.dom.client.BrowserEvents.KEYDOWN;
public class PopupEditorCell extends AbstractSafeHtmlCell<String> {
private static final int ESCAPE = 27;
private final CellPopup popupWidget;
private int offsetX = 10;
private int offsetY = 10;
private Element lastParent;
private PopupPanel panel;
/**
* Constructs a new DatePickerCell that uses the given date/time format and
* {@link SafeHtmlRenderer}.
*
* @param format a {@link DateTimeFormat} instance
* @param renderer a {@link SafeHtmlRenderer SafeHtmlRenderer<String>} instance
*/
public PopupEditorCell(CellPopup popupWidget) {
super(SimpleSafeHtmlRenderer.getInstance(), CLICK, KEYDOWN);
this.popupWidget = popupWidget;
this.panel = new PopupPanel(true, true) {
@Override
protected void onPreviewNativeEvent(NativePreviewEvent event) {
if (Event.ONKEYUP == event.getTypeInt()) {
if (event.getNativeEvent().getKeyCode() == ESCAPE) {
// Dismiss when escape is pressed
panel.hide();
}
}
}
};
panel.addCloseHandler(new CloseHandler<PopupPanel>() {
public void onClose(CloseEvent<PopupPanel> event) {
if (lastParent != null && !event.isAutoClosed()) {
// Refocus on the containing cell after the user selects a value, but
// not if the popup is auto closed.
lastParent.focus();
}
lastParent = null;
}
});
panel.add(popupWidget);
// Hide the panel and call valueUpdater.update when a date is selected
// datePicker.addValueChangeHandler(new ValueChangeHandler<Date>() {
// public void onValueChange(ValueChangeEvent<Date> event) {
// // Remember the values before hiding the popup.
// Element cellParent = lastParent;
// Date oldValue = lastValue;
// Object key = lastKey;
// int index = lastIndex;
// int column = lastColumn;
// panel.hide();
//
// // Update the cell and value updater.
// Date date = event.getValue();
// setViewData(key, date);
// setValue(new Context(index, column, key), cellParent, oldValue);
// if (valueUpdater != null) {
// valueUpdater.update(date);
// }
// }
// });
}
@Override
public void onBrowserEvent(Context context, Element parent, String value,
NativeEvent event, ValueUpdater<String> valueUpdater) {
super.onBrowserEvent(context, parent, value, event, valueUpdater);
if (CLICK.equals(event.getType())) {
showPopup(parent, value);
}
}
@Override
protected void onEnterKeyDown(Context context, Element parent, String value,
NativeEvent event, ValueUpdater<String> valueUpdater) {
showPopup(parent, value);
}
private void showPopup(Element parent, String value) {
this.lastParent = parent;
popupWidget.prepare(value);
panel.setPopupPositionAndShow(new PositionCallback() {
public void setPosition(int offsetWidth, int offsetHeight) {
panel.setPopupPosition(lastParent.getAbsoluteLeft() + offsetX,
lastParent.getAbsoluteTop() + offsetY);
}
});
}
@Override
protected void render(Context context, SafeHtml value, SafeHtmlBuilder sb) {
if (value != null) {
sb.append(value);
}
}
}