/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package com.eas.grid;
import com.eas.grid.columns.header.HeaderNode;
import com.eas.ui.PublishedColor;
import com.eas.ui.PublishedFont;
import com.eas.ui.XDataTransfer;
import com.google.gwt.cell.client.AbstractCell;
import com.google.gwt.cell.client.Cell.Context;
import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.BrowserEvents;
import com.google.gwt.dom.client.Element;
import com.google.gwt.dom.client.EventTarget;
import com.google.gwt.dom.client.NativeEvent;
import com.google.gwt.resources.client.ClientBundle;
import com.google.gwt.resources.client.CssResource;
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
import com.google.gwt.safehtml.shared.SafeHtmlUtils;
import com.google.gwt.user.cellview.client.AbstractCellTable;
import com.google.gwt.user.cellview.client.Column;
import com.google.gwt.user.cellview.client.Header;
public class DraggableHeader<T> extends Header<String> implements HasColumn<T> {
protected String title;
protected PublishedColor background;
protected PublishedColor foreground;
protected PublishedFont font;
protected GridSection<T> table;
protected Element hostElement;
protected Column<T, ?> column;
protected HeaderNode<T> headerNode;
protected boolean moveable = true;
protected boolean resizable = true;
public DraggableHeader(String aTitle, GridSection<T> aTable, Column<T, ?> aColumn, HeaderNode<T> aHeaderNode) {
this(aTitle, aTable, aColumn, aTable != null ? aTable.getElement() : null, aHeaderNode);
}
protected DraggableHeader(String aTitle, GridSection<T> aTable, Column<T, ?> aColumn, Element aHostElement, HeaderNode<T> aHeaderNode) {
super(new HeaderCell());
if (aTitle == null || aColumn == null) {
throw new NullPointerException();
}
title = aTitle;
column = aColumn;
table = aTable;
hostElement = aHostElement;
headerNode = aHeaderNode;
}
@Override
public Column<T, ?> getColumn() {
return column;
}
public HeaderNode<T> getHeaderNode() {
return headerNode;
}
public AbstractCellTable<T> getTable() {
return table;
}
public void setTable(GridSection<T> aValue) {
table = aValue;
hostElement = table != null ? table.getElement() : null;
}
@Override
public String getValue() {
return title;
}
public String getTitle() {
return title;
}
public void setTitle(String aValue) {
title = aValue;
}
public PublishedColor getBackground() {
return background;
}
public void setBackground(PublishedColor aValue) {
background = aValue;
}
public PublishedColor getForeground() {
return foreground;
}
public void setForeground(PublishedColor aValue) {
foreground = aValue;
}
public PublishedFont getFont() {
return font;
}
public void setFont(PublishedFont aValue) {
font = aValue;
}
public boolean isResizable() {
return resizable;
}
public void setResizable(boolean aValue) {
resizable = aValue;
}
public boolean isMoveable() {
return moveable;
}
public void setMoveable(boolean aValue) {
moveable = aValue;
}
@Override
public void onBrowserEvent(Context context, Element targetCell, NativeEvent event) {
if (BrowserEvents.DRAGSTART.equals(event.getType())) {
event.stopPropagation();
EventTarget et = event.getEventTarget();
if (Element.is(et)) {
DraggedColumn<?> col = new DraggedColumn<>(column, this, table, targetCell, Element.as(et));
if ((col.isMove() && moveable) || (col.isResize() && resizable)) {
event.getDataTransfer().<XDataTransfer> cast().setEffectAllowed("move");
DraggedColumn.instance = col;
event.getDataTransfer().setData(
"Text",
(table != null ? "grid-section-" + table.hashCode() : "not leaf") + "; column-" + (DraggedColumn.instance.isMove() ? "moved" : "resized")
+ (table != null ? ":" + table.getColumnIndex(column) : ""));
} else {
event.getDataTransfer().<XDataTransfer> cast().setEffectAllowed("none");
}
}
}
super.onBrowserEvent(context, targetCell, event);
}
public interface GridResources extends ClientBundle {
static final GridResources instance = GWT.create(GridResources.class);
public GridStyles header();
}
public interface GridStyles extends CssResource {
public String gridHeaderMover();
public String gridHeaderResizer();
}
public static GridStyles headerStyles = GridResources.instance.header();
private static class HeaderCell extends AbstractCell<String> {
public HeaderCell() {
super(BrowserEvents.DRAGSTART);
}
@Override
public void render(Context context, String value, SafeHtmlBuilder sb) {
headerStyles.ensureInjected();// ondragenter=\"event.preventDefault();\"
// ondragover=\"event.preventDefault();\"
// ondrop=\"event.preventDefault();\"
sb.append(SafeHtmlUtils.fromTrustedString("<div class=\"grid-column-header-content\"; style=\"position:relative;\">"))
.append(value.startsWith("<html>") ? SafeHtmlUtils.fromTrustedString(value.substring(6)) : SafeHtmlUtils.fromString(value)).append(SafeHtmlUtils.fromTrustedString("</div>"))
.append(SafeHtmlUtils.fromTrustedString("<span draggable=\"true\" class=\"" + headerStyles.gridHeaderMover() + " grid-header-mover\"></span>"))
.append(SafeHtmlUtils.fromTrustedString("<span draggable=\"true\" class=\"" + headerStyles.gridHeaderResizer() + " grid-header-resizer\"></span>"));
}
}
}