/*
* (c) Copyright 2010-2011 AgileBirds
*
* This file is part of OpenFlexo.
*
* OpenFlexo is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* OpenFlexo is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with OpenFlexo. If not, see <http://www.gnu.org/licenses/>.
*
*/
package org.openflexo.wkf.controller;
import org.openflexo.components.browser.BrowserElement;
import org.openflexo.components.browser.ProjectBrowser;
import org.openflexo.components.browser.dnd.TreeDropTarget;
import org.openflexo.components.browser.view.BrowserView.FlexoJTree;
import org.openflexo.components.browser.wkf.FlexoProcessNodeElement;
import org.openflexo.components.browser.wkf.ProcessElement;
import org.openflexo.components.browser.wkf.ProcessFolderElement;
import org.openflexo.components.browser.wkf.WorkflowElement;
import org.openflexo.foundation.wkf.FlexoFolderContainerNode;
import org.openflexo.foundation.wkf.FlexoProcess;
import org.openflexo.foundation.wkf.FlexoProcessNode;
import org.openflexo.foundation.wkf.FlexoWorkflow;
import org.openflexo.foundation.wkf.ProcessFolder;
import org.openflexo.foundation.wkf.action.AddToProcessFolder;
import org.openflexo.foundation.wkf.action.MoveFlexoProcess;
import org.openflexo.foundation.wkf.action.MoveProcessFolder;
import org.openflexo.foundation.wkf.action.RemoveFromProcessFolder;
/**
*
* @author gpolet
*
*/
public class WKFTreeDropTarget extends TreeDropTarget {
public WKFTreeDropTarget(FlexoJTree tree, ProjectBrowser browser) {
super(tree, browser);
}
@Override
public boolean targetAcceptsSource(BrowserElement target, BrowserElement source) {
FlexoProcess srcProcess = null;
FlexoProcessNode srcNode = null;
ProcessFolder srcFolder = null;
FlexoProcess targetProcess = null;
FlexoProcessNode targetNode = null;
FlexoWorkflow targetWKF = null;
ProcessFolder targetFolder = null;
if (source instanceof ProcessElement) {
srcProcess = ((ProcessElement) source).getFlexoProcess();
srcNode = srcProcess.getProcessNode();
} else if (source instanceof FlexoProcessNodeElement) {
srcNode = ((FlexoProcessNodeElement) source).getProcessNode();
srcProcess = srcNode.getProcess();
} else if (source instanceof ProcessFolderElement) {
srcFolder = ((ProcessFolderElement) source).getFolder();
}
if (target instanceof ProcessElement) {
targetProcess = ((ProcessElement) target).getFlexoProcess();
targetNode = targetProcess.getProcessNode();
} else if (target instanceof FlexoProcessNodeElement) {
targetNode = ((FlexoProcessNodeElement) target).getProcessNode();
targetProcess = targetNode.getProcess();
} else if (target instanceof WorkflowElement) {
targetWKF = ((WorkflowElement) target).getFlexoWorkflow();
} else if (target instanceof ProcessFolderElement) {
targetFolder = ((ProcessFolderElement) target).getFolder();
}
if (srcProcess != null) {
if (targetProcess != null) {
if (srcNode.getParentFolder() != null && srcNode.getParentFolder().getProcessNode() == targetNode) {
// folder
return true;
}
if (srcProcess.isAcceptableAsParentProcess(targetProcess)) {
return true;
}
} else if (targetFolder != null) {
if (targetFolder.getProcessNode() == srcNode.getFatherProcessNode()) {
return true;
}
} else if (targetWKF != null) {
if (srcProcess.isAcceptableAsParentProcess(null)) {
return true;
}
}
} else if (srcFolder != null) {
FlexoFolderContainerNode targetWKFNode = null;
if (targetNode != null) {
targetWKFNode = targetNode;
} else if (targetFolder != null) {
if (srcFolder.isAcceptableParentFolder(targetFolder)) {
targetWKFNode = targetFolder;
}
}
if (targetWKFNode != null) { // Move folder
FlexoProcess targetParentProcess = targetWKFNode.getProcessNode().getProcess();
if (canMoveFolder(srcFolder, targetParentProcess)) {
return true;
}
}
}
return false;
}
@Override
public boolean handleDrop(BrowserElement source, BrowserElement target) {
FlexoProcess srcProcess = null;
FlexoProcessNode srcNode = null;
ProcessFolder srcFolder = null;
FlexoProcess targetProcess = null;
FlexoProcessNode targetNode = null;
FlexoWorkflow targetWKF = null;
ProcessFolder targetFolder = null;
if (source instanceof ProcessElement) {
srcProcess = ((ProcessElement) source).getFlexoProcess();
srcNode = srcProcess.getProcessNode();
} else if (source instanceof FlexoProcessNodeElement) {
srcNode = ((FlexoProcessNodeElement) source).getProcessNode();
srcProcess = srcNode.getProcess();
} else if (source instanceof ProcessFolderElement) {
srcFolder = ((ProcessFolderElement) source).getFolder();
}
if (target instanceof ProcessElement) {
targetProcess = ((ProcessElement) target).getFlexoProcess();
targetNode = targetProcess.getProcessNode();
} else if (target instanceof FlexoProcessNodeElement) {
targetNode = ((FlexoProcessNodeElement) target).getProcessNode();
targetProcess = targetNode.getProcess();
} else if (target instanceof WorkflowElement) {
targetWKF = ((WorkflowElement) target).getFlexoWorkflow();
} else if (target instanceof ProcessFolderElement) {
targetFolder = ((ProcessFolderElement) target).getFolder();
}
if (srcProcess != null) {
if (targetProcess != null) {
if (srcNode.getParentFolder() != null && srcNode.getParentFolder().getProcessNode() == targetNode) { // Remove process from
// folder
RemoveFromProcessFolder remove = RemoveFromProcessFolder.actionType.makeNewAction(srcNode, null, _browser.getEditor());
return remove.doAction().hasActionExecutionSucceeded();
}
if (srcProcess.isAcceptableAsParentProcess(targetProcess)) {
MoveFlexoProcess moveProcessAction = MoveFlexoProcess.actionType.makeNewAction(srcProcess, null, _browser.getEditor());
moveProcessAction.setNewParentProcess(targetProcess);
moveProcessAction.setDoImmediately(true);
return moveProcessAction.doAction().hasActionExecutionSucceeded();
}
} else if (targetFolder != null) {
if (targetFolder.getProcessNode() == srcNode.getFatherProcessNode()) { // Add process to folder;
AddToProcessFolder add = AddToProcessFolder.actionType.makeNewAction(srcNode, null, _browser.getEditor());
add.setDestination(targetFolder);
return add.doAction().hasActionExecutionSucceeded();
}
} else if (targetWKF != null) {
if (srcNode.getParentFolder() != null && srcNode.getParentFolder().getProcessNode() == null
&& srcNode.getFatherProcessNode() == null) {
RemoveFromProcessFolder remove = RemoveFromProcessFolder.actionType.makeNewAction(srcNode, null, _browser.getEditor());
return remove.doAction().hasActionExecutionSucceeded();
} else if (srcProcess.isAcceptableAsParentProcess(null)) {
MoveFlexoProcess moveProcessAction = MoveFlexoProcess.actionType.makeNewAction(srcProcess, null, _browser.getEditor());
moveProcessAction.setNewParentProcess(null);
moveProcessAction.setDoImmediately(true);
return moveProcessAction.doAction().hasActionExecutionSucceeded();
}
}
} else if (srcFolder != null) {
FlexoFolderContainerNode targetWKFNode = null;
if (targetNode != null) {
targetWKFNode = targetNode;
} else if (targetFolder != null) {
if (srcFolder.isAcceptableParentFolder(targetFolder)) {
targetWKFNode = targetFolder;
}
}
if (targetWKFNode != null) { // Move folder
FlexoProcess targetParentProcess = targetWKFNode.getProcessNode().getProcess();
if (canMoveFolder(srcFolder, targetParentProcess)) {
MoveProcessFolder move = MoveProcessFolder.actionType.makeNewAction(srcFolder, null, _browser.getEditor());
move.setDestination(targetWKFNode);
return move.doAction().hasActionExecutionSucceeded();
}
}
}
return false;
}
private boolean canMoveFolder(ProcessFolder srcFolder, FlexoProcess targetProcess) {
if (targetProcess == null || targetProcess.isImported()) {
return false;
}
boolean ok = true;
for (FlexoProcessNode node : srcFolder.getAllDirectSubProcessNodes()) {
ok &= node.getProcess().isAcceptableAsParentProcess(targetProcess);
}
return ok;
}
}