/**
* Licensed under the GNU LESSER GENERAL PUBLIC LICENSE, Version 3, 29 June 2007;
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.gnu.org/licenses/lgpl-3.0.txt
*
* 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.
*/
/**
* Licensed under the GNU LESSER GENERAL PUBLIC LICENSE, Version 3, 29 June 2007;
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.gnu.org/licenses/lgpl-3.0.txt
*
* 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.
*/
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package org.kevoree.tools.ui.editor.listener;
import java.awt.*;
import java.awt.datatransfer.*;
import java.awt.event.MouseListener;
import java.io.*;
import java.net.*;
import java.util.*;
import org.kevoree.ContainerNode;
import org.kevoree.tools.ui.editor.KevoreeUIKernel;
import org.kevoree.tools.ui.editor.command.*;
import org.kevoree.tools.ui.framework.elements.*;
import java.awt.dnd.*;
import org.slf4j.*;
import scala.io.Source;
/**
* implementation of the target listener
*
* @author francoisfouquet
*/
public class ModelDragTargetListener extends DropTarget {
KevoreeUIKernel kernel;
ModelPanel target;
DataFlavor mimeDataFlavour;
DataFlavor urlDataFlavour;
DataFlavor uriStringDataFlavour;
Logger logger = LoggerFactory.getLogger(ModelDragTargetListener.class.getName());
/**
* constructor
*
* @param _kernel the table view panel
* @param _target the view of the component
*/
public ModelDragTargetListener(ModelPanel _target, KevoreeUIKernel _kernel) {
kernel = _kernel;
target = _target;
try {
mimeDataFlavour = new DataFlavor(DataFlavor.javaJVMLocalObjectMimeType);
urlDataFlavour = new DataFlavor("application/x-java-url;class=java.net.URL");
uriStringDataFlavour = new DataFlavor("text/uri-list;class=java.lang.String");
} catch (Exception e) {
e.printStackTrace();
}
}
private Boolean isDropAccept(Object o) {
if (o instanceof ChannelTypePanel) {
return true;
}
if (o instanceof GroupTypePanel) {
return true;
}
if (o instanceof NodeTypePanel) {
return true;
}
if (o instanceof NodePanel) {
//Only if accepted if node was previously in another node
for (ContainerNode node : kernel.getModelHandler().getActualModel().getNodes()) {
ContainerNode flightNode =(ContainerNode) kernel.getUifactory().getMapping().get(o);
if (node.getHosts().contains(flightNode)) {
return true;
}
}
return false;
}
//otherwise return false / no other type accepted
return false;
}
/**
* callback when DnD is finished
*
* @param arg0
*/
@Override
public void drop(DropTargetDropEvent arg0) {
try {
if (arg0.getTransferable().isDataFlavorSupported(mimeDataFlavour)) {
Object o = arg0.getTransferable().getTransferData(mimeDataFlavour);
if (isDropAccept(o)) {
if (o instanceof ChannelTypePanel) {
AddChannelCommand command = new AddChannelCommand();
command.setPoint(arg0.getLocation());
command.setKernel(kernel);
command.execute(o);
}
if (o instanceof NodeTypePanel) {
AddNodeCommand command = new AddNodeCommand();
command.setPoint(arg0.getLocation());
command.setKernel(kernel);
command.execute(o);
} else {
if ((o instanceof NodePanel)) {
NodePanel newnodepanel = (NodePanel) o;
kernel.getModelPanel().addNode(newnodepanel);
for (ContainerNode node : kernel.getModelHandler().getActualModel().getNodes()) {
if (node.getHosts().contains((ContainerNode) kernel.getUifactory().getMapping().get(newnodepanel))) {
node.removeHosts((ContainerNode) kernel.getUifactory().getMapping().get(newnodepanel));
}
}
newnodepanel.setLocation((int) (arg0.getLocation().x - newnodepanel.getPreferredSize().getWidth() / 2), (int) (arg0.getLocation().y - newnodepanel.getPreferredSize().getHeight() / 2));
DragSource dragSource = DragSource.getDefaultDragSource();
for (DragSourceMotionListener li : dragSource.getDragSourceMotionListeners()) {
if (li instanceof org.kevoree.tools.ui.editor.listener.NodeDragSourceListener) {
if (((NodeDragSourceListener) li).flightNode.equals(newnodepanel)) {
try {
dragSource.removeDragSourceListener((DragSourceListener) li);
dragSource.removeDragSourceMotionListener((DragSourceMotionListener) li);
((NodeDragSourceListener)li).dgr.resetRecognizer();
((NodeDragSourceListener)li).dgr.removeDragGestureListener((DragGestureListener) li);
newnodepanel.removeMouseListener((MouseListener)((NodeDragSourceListener)li).dgr);
} catch (Exception e){
e.printStackTrace();
}
}
}
}
kernel.getModelHandler().notifyChanged();
}
}
if (o instanceof GroupTypePanel) {
AddGroupCommand command = new AddGroupCommand();
command.setPoint(arg0.getLocation());
command.setKernel(kernel);
command.execute(o);
}
kernel.getModelPanel().repaint();
kernel.getModelPanel().revalidate();
arg0.dropComplete(true);
} else {
arg0.rejectDrop();
}
} else if (arg0.getTransferable().isDataFlavorSupported(uriStringDataFlavour)) {
logger.debug("Drop accepted with URL flavour.");
arg0.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);//Necessary because of drop from an external source
Object url = arg0.getTransferable().getTransferData(uriStringDataFlavour);
logger.debug("Url: " + url.toString().trim());
URI uri = new URI(url.toString().trim());
logger.debug("UriPath: " + uri.getPath());
if(uri.getPath().endsWith(".kev") || uri.getPath().endsWith(".jar")){
LoadNewLibCommand loadLib = new LoadNewLibCommand();
loadLib.setKernel(kernel);
loadLib.execute(uri.getPath());
}
if(uri.getPath().endsWith(".kevs")){
KevScriptCommand lcommand = new KevScriptCommand();
lcommand.setKernel(kernel);
lcommand.execute(Source.fromFile(uri.getPath(), "UTF-8").getLines().mkString("\n"));
}
arg0.dropComplete(true);
} else {
logger.debug("No matching flavour for this drop.");
logger.debug("Available Flavours:" + Arrays.toString(arg0.getTransferable().getTransferDataFlavors()));
arg0.rejectDrop();
}
} catch (UnsupportedFlavorException ex) {
logger.error("Flavour not supported.", ex);
arg0.rejectDrop();
} catch (IOException e) {
logger.error("IOException.", e);
arg0.rejectDrop();
} catch (URISyntaxException e) {
logger.error("URI Exception.", e);
arg0.rejectDrop();
}
}
/**
* not implemented
*
* @param dtde
*/
@Override
public void dragEnter(DropTargetDragEvent dtde) {
}
/**
* not implemented
*
* @param arg0
*/
@Override
public void dragExit(DropTargetEvent arg0) {
}
/**
* not implemented
*
* @param arg0
*/
@Override
public void dragOver(DropTargetDragEvent arg0) {
if (kernel.getModelPanel().getFlightObject() != null) {
kernel.getModelPanel().getFlightObject().setBounds(
(int) arg0.getLocation().getX() - (kernel.getModelPanel().getFlightObject().getWidth() / 2),
(int) arg0.getLocation().getY() - (kernel.getModelPanel().getFlightObject().getHeight() / 2),
kernel.getModelPanel().getFlightObject().getWidth(),
kernel.getModelPanel().getFlightObject().getHeight());
kernel.getModelPanel().repaint();
// kernel.getModelPanel().revalidate();
}
}
/**
* not implemented
*
* @param arg0
*/
@Override
public void dropActionChanged(DropTargetDragEvent arg0) {
}
}