package org.ovirt.engine.ui.common.widget.table;
import org.ovirt.engine.ui.common.widget.table.header.ResizableHeader;
import com.google.gwt.dom.client.BrowserEvents;
import com.google.gwt.dom.client.Element;
import com.google.gwt.dom.client.NativeEvent;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.user.cellview.client.Column;
import com.google.gwt.user.client.Event;
import com.google.gwt.user.client.Event.NativePreviewEvent;
import com.google.gwt.user.client.Event.NativePreviewHandler;
/**
* Handles mouse move events during column resize operation, updating column width according to current mouse position.
*
* @param <T>
* Table row data type.
*/
public class ColumnResizeHandler<T> implements NativePreviewHandler {
//The offset to stop the header from jumping when starting to drag.
private static final int DRAG_AREA_OFFSET = ResizableHeader.RESIZE_BAR_WIDTH / 2 + 1;
private final Element headerElement;
private final Column<T, ?> column;
private final HasResizableColumns<T> table;
// Used to release native event handler after we are done with column resizing
private final HandlerRegistration eventHandler;
public ColumnResizeHandler(Element headerElement, Column<T, ?> column, HasResizableColumns<T> table) {
this.headerElement = headerElement;
this.column = column;
this.table = table;
this.eventHandler = Event.addNativePreviewHandler(this);
// Indicate resize start
table.onResizeStart(column, headerElement);
}
@Override
public void onPreviewNativeEvent(NativePreviewEvent event) {
NativeEvent nativeEvent = event.getNativeEvent();
nativeEvent.preventDefault();
nativeEvent.stopPropagation();
if (BrowserEvents.MOUSEMOVE.equals(nativeEvent.getType())) {
// Calculate display-relative column width
int absoluteLeft = headerElement.getAbsoluteLeft();
int clientX = nativeEvent.getClientX();
int displayColumnWidth = clientX - absoluteLeft + DRAG_AREA_OFFSET;
// Adjust column width as necessary
int minimumColumnWidth = table.getMinimumColumnWidth(column);
displayColumnWidth = displayColumnWidth < minimumColumnWidth ? minimumColumnWidth : displayColumnWidth;
// Resize the column
table.resizeColumn(column, displayColumnWidth);
}
else if (BrowserEvents.MOUSEUP.equals(nativeEvent.getType())) {
// Release native event handler
eventHandler.removeHandler();
// Indicate resize end
table.onResizeEnd(column, headerElement);
}
}
}