/*
* Copyright 2011 John Ahlroos
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package fi.jasoft.dragdroplayouts.drophandlers;
import com.vaadin.event.dd.DragAndDropEvent;
import com.vaadin.terminal.Sizeable;
import com.vaadin.terminal.gwt.client.MouseEventDetails;
import com.vaadin.ui.AbsoluteLayout.ComponentPosition;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.Component;
import com.vaadin.ui.ComponentContainer;
import fi.jasoft.dragdroplayouts.DDAbsoluteLayout;
import fi.jasoft.dragdroplayouts.DDGridLayout;
import fi.jasoft.dragdroplayouts.DDGridLayout.GridLayoutTargetDetails;
import fi.jasoft.dragdroplayouts.events.LayoutBoundTransferable;
/**
* A default drop handler for GridLayout
*/
@SuppressWarnings("serial")
public class DefaultGridLayoutDropHandler extends
AbstractDefaultLayoutDropHandler {
private final Alignment dropAlignment;
/**
* Constructor
*
* @param dropCellAlignment
* The cell alignment of the component after it has been dropped
*/
public DefaultGridLayoutDropHandler(Alignment dropCellAlignment) {
this.dropAlignment = dropCellAlignment;
}
/*
* (non-Javadoc)
*
* @see
* fi.jasoft.dragdroplayouts.drophandlers.AbstractDefaultLayoutDropHandler
* #handleComponentReordering(com.vaadin.event.dd.DragAndDropEvent)
*/
@Override
protected void handleComponentReordering(DragAndDropEvent event) {
GridLayoutTargetDetails details = (GridLayoutTargetDetails) event
.getTargetDetails();
DDGridLayout layout = (DDGridLayout) details.getTarget();
LayoutBoundTransferable transferable = (LayoutBoundTransferable) event
.getTransferable();
Component comp = transferable.getComponent();
layout.removeComponent(comp);
int row = details.getOverRow();
int column = details.getOverColumn();
addComponent(event, comp, column, row);
}
/*
* (non-Javadoc)
*
* @see
* fi.jasoft.dragdroplayouts.drophandlers.AbstractDefaultLayoutDropHandler
* #handleDropFromLayout(com.vaadin.event.dd.DragAndDropEvent)
*/
@Override
protected void handleDropFromLayout(DragAndDropEvent event) {
LayoutBoundTransferable transferable = (LayoutBoundTransferable) event
.getTransferable();
GridLayoutTargetDetails details = (GridLayoutTargetDetails) event
.getTargetDetails();
DDGridLayout layout = (DDGridLayout) details.getTarget();
Component source = event.getTransferable().getSourceComponent();
Component comp = transferable.getComponent();
if (comp == layout) {
// Dropping myself on myself, if parent is absolute layout then
// move
if (comp.getParent() instanceof DDAbsoluteLayout) {
MouseEventDetails mouseDown = transferable.getMouseDownEvent();
MouseEventDetails mouseUp = details.getMouseEvent();
int movex = mouseUp.getClientX() - mouseDown.getClientX();
int movey = mouseUp.getClientY() - mouseDown.getClientY();
DDAbsoluteLayout parent = (DDAbsoluteLayout) comp.getParent();
ComponentPosition position = parent.getPosition(comp);
float x = position.getLeftValue() + movex;
float y = position.getTopValue() + movey;
position.setLeft(x, Sizeable.UNITS_PIXELS);
position.setTop(y, Sizeable.UNITS_PIXELS);
return;
}
} else {
// Check that we are not dragging an outer layout into an inner
// layout
Component parent = layout.getParent();
while (parent != null) {
if (parent == comp) {
return;
}
parent = parent.getParent();
}
// Remove component from its source
if (source instanceof ComponentContainer) {
ComponentContainer sourceLayout = (ComponentContainer) source;
sourceLayout.removeComponent(comp);
}
}
int row = details.getOverRow();
int column = details.getOverColumn();
addComponent(event, comp, column, row);
}
protected void addComponent(DragAndDropEvent event, Component component,
int column, int row) {
GridLayoutTargetDetails details = (GridLayoutTargetDetails) event
.getTargetDetails();
DDGridLayout layout = (DDGridLayout) details.getTarget();
// If no components exist in the grid, then just add the
// component
if (!layout.getComponentIterator().hasNext()) {
layout.addComponent(component, column, row);
return;
}
// If component was dropped on top of another component, abort
if (layout.getComponent(column, row) != null) {
return;
}
// Add the component
layout.addComponent(component, column, row);
// Add component alignment if given
if (dropAlignment != null) {
layout.setComponentAlignment(component, dropAlignment);
}
}
}