use of com.haulmont.cuba.gui.components.filter.ConditionsTree in project cuba by cuba-platform.
the class WebFilterHelper method initConditionsDragAndDrop.
@Override
public void initConditionsDragAndDrop(final Tree tree, final ConditionsTree conditions) {
final com.vaadin.ui.Tree vTree = tree.unwrap(com.vaadin.ui.Tree.class);
vTree.setDragMode(com.vaadin.ui.Tree.TreeDragMode.NODE);
vTree.setDropHandler(new DropHandler() {
@Override
public void drop(DragAndDropEvent event) {
Transferable t = event.getTransferable();
if (t.getSourceComponent() != vTree)
return;
com.vaadin.ui.Tree.TreeTargetDetails target = (com.vaadin.ui.Tree.TreeTargetDetails) event.getTargetDetails();
VerticalDropLocation location = target.getDropLocation();
Object sourceItemId = t.getData("itemId");
Object targetItemId = target.getItemIdOver();
if (targetItemId == null)
return;
CollectionDatasource datasource = tree.getDatasource();
AbstractCondition sourceCondition = (AbstractCondition) datasource.getItem(sourceItemId);
AbstractCondition targetCondition = (AbstractCondition) datasource.getItem(targetItemId);
Node<AbstractCondition> sourceNode = conditions.getNode(sourceCondition);
Node<AbstractCondition> targetNode = conditions.getNode(targetCondition);
if (isAncestorOf(targetNode, sourceNode))
return;
boolean moveToTheSameParent = Objects.equals(sourceNode.getParent(), targetNode.getParent());
if (location == VerticalDropLocation.MIDDLE) {
if (sourceNode.getParent() == null) {
conditions.getRootNodes().remove(sourceNode);
} else {
sourceNode.getParent().getChildren().remove(sourceNode);
}
targetNode.addChild(sourceNode);
refreshConditionsDs();
tree.expand(targetCondition.getId());
} else {
List<Node<AbstractCondition>> siblings;
if (targetNode.getParent() == null)
siblings = conditions.getRootNodes();
else
siblings = targetNode.getParent().getChildren();
int targetIndex = siblings.indexOf(targetNode);
if (location == VerticalDropLocation.BOTTOM)
targetIndex++;
int sourceNodeIndex;
if (sourceNode.getParent() == null) {
sourceNodeIndex = conditions.getRootNodes().indexOf(sourceNode);
conditions.getRootNodes().remove(sourceNode);
} else {
sourceNodeIndex = sourceNode.getParent().getChildren().indexOf(sourceNode);
sourceNode.getParent().getChildren().remove(sourceNode);
}
// decrease drop position index if dragging from top to bottom inside the same parent node
if (moveToTheSameParent && (sourceNodeIndex < targetIndex))
targetIndex--;
if (targetNode.getParent() == null) {
sourceNode.parent = null;
conditions.getRootNodes().add(targetIndex, sourceNode);
} else {
targetNode.getParent().insertChildAt(targetIndex, sourceNode);
}
refreshConditionsDs();
}
}
protected boolean isAncestorOf(Node childNode, Node possibleParentNode) {
while (childNode.getParent() != null) {
if (childNode.getParent().equals(possibleParentNode))
return true;
childNode = childNode.getParent();
}
return false;
}
protected void refreshConditionsDs() {
tree.getDatasource().refresh(Collections.singletonMap("conditions", conditions));
}
@Override
public AcceptCriterion getAcceptCriterion() {
return new Or(new AbstractSelect.TargetItemIs(vTree, getGroupConditionIds().toArray()), new Not(AbstractSelect.VerticalLocationIs.MIDDLE));
}
protected List<UUID> getGroupConditionIds() {
List<UUID> groupConditions = new ArrayList<>();
List<AbstractCondition> list = conditions.toConditionsList();
for (AbstractCondition condition : list) {
if (condition instanceof GroupCondition)
groupConditions.add(condition.getId());
}
return groupConditions;
}
});
}
Aggregations