package husacct.define.presentation.draganddrop.customdroptargetlisterner;
import husacct.define.domain.services.stateservice.StateService;
import husacct.define.presentation.draganddrop.customtransferhandlers.ModuleTrasferhandler;
import husacct.define.presentation.moduletree.AnalyzedModuleTree;
import husacct.define.presentation.moduletree.ModuleTree;
import husacct.define.presentation.utils.DragAndDropHelper;
import husacct.define.task.DefinitionController;
import husacct.define.task.SoftwareUnitController;
import husacct.define.task.components.AbstractDefineComponent;
import husacct.define.task.components.AnalyzedModuleComponent;
import java.awt.Point;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.dnd.DropTarget;
import java.awt.dnd.DropTargetDragEvent;
import java.awt.dnd.DropTargetDropEvent;
import java.awt.dnd.DropTargetEvent;
import java.awt.dnd.DropTargetListener;
import java.io.IOException;
import java.util.ArrayList;
import javax.swing.tree.TreePath;
public class ModuleDropTarget implements DropTargetListener {
private ModuleTree tree;
private DropTarget target;
private DataFlavor currentFlavor = null;
private DataFlavor[] supportedDataFlavors = { DataFlavor.stringFlavor,
ModuleTrasferhandler.moduleFlavours[0] };
public ModuleDropTarget(ModuleTree tr) {
this.tree = tr;
this.target = new DropTarget(tree, this);
}
@Override
public void dragEnter(DropTargetDragEvent arg) {
arg.rejectDrag();
}
@Override
public void dragExit(DropTargetEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void dragOver(DropTargetDragEvent arg) {
try {
currentFlavor = null;
for (DataFlavor resultFlavor : arg.getCurrentDataFlavors()) {
for (DataFlavor supportedflavour : supportedDataFlavors) {
if (resultFlavor.equals(supportedflavour)) {
currentFlavor = supportedflavour;
}
}
}
Point p = arg.getLocation();
TreePath path = tree.getPathForLocation(p.x, p.y);
boolean isnull = path == null ? true : false;
if (!isnull && currentFlavor != null) {
arg.acceptDrag(1);
} else {
arg.rejectDrag();
}
} catch (Exception e) {
arg.rejectDrag();
}
}
@Override
public void drop(DropTargetDropEvent arg) {
if (currentFlavor == supportedDataFlavors[0]) {
changeSoftwareUnitLocation(arg);
} else if (currentFlavor == supportedDataFlavors[1]) {
addSoftwareUnits(arg);
}
}
private void addSoftwareUnits(DropTargetDropEvent arg) {
try {
AnalyzedModuleTree palo = (AnalyzedModuleTree) arg
.getTransferable().getTransferData(currentFlavor);
ArrayList<AnalyzedModuleComponent> tobesaved = new ArrayList<AnalyzedModuleComponent>();
for (TreePath pathe : palo.getSelectionPaths()) {
AnalyzedModuleComponent top = (AnalyzedModuleComponent) pathe
.getLastPathComponent();
String type = top.getType().toLowerCase();
boolean res = ((!type.equals("root")
&& !type.equals("application") && !type
.equals("externalpackage")));
if (res) {
AnalyzedModuleComponent referencedUnit = StateService
.instance().getAnalyzedSoftWareUnit(
top.getUniqueName());
if (!referencedUnit.isMapped()) {
tobesaved.add(referencedUnit);
}
}
}
SoftwareUnitController controller = new SoftwareUnitController(
getSelectedNode(arg).getModuleId());
controller.save(tobesaved);
DefinitionController.getInstance().notifyObservers();
} catch (UnsupportedFlavorException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
private void changeSoftwareUnitLocation(DropTargetDropEvent arg) {
try {
String result = ((String) arg.getTransferable().getTransferData(
currentFlavor));
Object[] namesAndTypes = DragAndDropHelper.interpretObjects(result);
ArrayList<String> names = (ArrayList<String>) namesAndTypes[0];
ArrayList<String> types = (ArrayList<String>) namesAndTypes[1];
SoftwareUnitController controller = new SoftwareUnitController(getSelectedNode(arg).getModuleId());
controller.changeSoftwareUnit(getSelectedNode(arg).getModuleId(),names);
} catch (Exception e) {
}
}
private AbstractDefineComponent getSelectedNode(DropTargetDropEvent arg) {
Point p = arg.getLocation();
TreePath path = tree.getPathForLocation(p.x, p.y);
AbstractDefineComponent selectedNode = (AbstractDefineComponent) path
.getLastPathComponent();
return selectedNode;
}
@Override
public void dropActionChanged(DropTargetDragEvent arg0) {
}
}