package org.gwtoolbox.widget.client.panel.dashboard;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.MouseDownEvent;
import com.google.gwt.event.dom.client.MouseMoveEvent;
import com.google.gwt.event.dom.client.MouseUpEvent;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.user.client.Element;
import com.google.gwt.user.client.Event;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.SimplePanel;
import com.google.gwt.user.client.ui.Widget;
import org.gwtoolbox.commons.ui.client.event.CommonMouseHandler;
import org.gwtoolbox.widget.client.panel.contentpanel.ContentPanel;
/**
* @author Uri Boness
*/
public class DashboardWidget extends Composite {
private ContentPanel main;
public DashboardWidget(String name, Widget content, DashboardDragController controller) {
main = new ContentPanel(name);
main.setCollapsable(true);
main.setContent(content);
main.addTitleMouseHandler(new DnDListener(this, controller));
SimplePanel panel = new SimplePanel();
panel.setWidget(main);
main.setWidth("100%");
initWidget(panel);
setStylePrimaryName("DashboardWidget");
}
public void addTool(ContentPanel.Tool tool, ClickHandler clickHandler) {
main.addTool(tool, clickHandler);
}
//============================================== Inner Classes =====================================================
private static class DnDListener extends CommonMouseHandler {
private SimplePanel placeHolder;
private final DashboardWidget widget;
private final DashboardDragController controller;
private Point lastDragPoint;
private HandlerRegistration eventPreviewHandlerRegistration;
private DnDListener(DashboardWidget widget, DashboardDragController controller) {
this.widget = widget;
this.controller = controller;
}
@Override
public void onMouseDown(MouseDownEvent event) {
Element element = event.getNativeEvent().getEventTarget().cast();
int left = widget.getAbsoluteLeft();
int top = widget.getAbsoluteTop();
int width = widget.getOffsetWidth();
// keeping the placeholder of the widget and hiding it. If the widget drop is rejected
// it will be put back in this placeholder and will be shown in its original place.
placeHolder = (SimplePanel) widget.getParent();
placeHolder.setVisible(false);
widget.setWidth(width + "px");
RootPanel.get().add(widget, left + 5, top - 5);
widget.addStyleDependentName("drag");
lastDragPoint = new Point(event.getClientX(), event.getClientY());
Event.setCapture(element);
controller.handleDashboardWidgetMove(widget);
eventPreviewHandlerRegistration = Event.addNativePreviewHandler(new Event.NativePreviewHandler() {
public void onPreviewNativeEvent(Event.NativePreviewEvent event) {
event.getNativeEvent().preventDefault();
}
});
}
@Override
public void onMouseMove(MouseMoveEvent event) {
if (lastDragPoint == null) { // currently not dragging
return;
}
int x = event.getClientX();
int y = event.getClientY();
int left = widget.getAbsoluteLeft();
int top = widget.getAbsoluteTop();
int deltaX = x - lastDragPoint.getX();
int deltaY = y - lastDragPoint.getY();
RootPanel.get().setWidgetPosition(widget, left + deltaX, top + deltaY);
lastDragPoint = new Point(x, y);
controller.handleDashboardWidgetMove(widget);
}
@Override
public void onMouseUp(MouseUpEvent event) {
if (lastDragPoint == null) { // currently not dragging
return;
}
Element element = event.getNativeEvent().getEventTarget().cast();
lastDragPoint = null;
Event.releaseCapture(element);
widget.removeStyleDependentName("drag");
RootPanel.get().remove(widget);
try {
controller.handleDashboardWidgetDrop(widget);
placeHolder.removeFromParent();
} catch (DropVetoException dve) {
// putting the widget back to its original place
placeHolder.setWidget(widget);
placeHolder.setVisible(true);
}
placeHolder = null;
if (eventPreviewHandlerRegistration != null) {
eventPreviewHandlerRegistration.removeHandler();
}
}
}
}