// GraphTea Project: http://github.com/graphtheorysoftware/GraphTea
// Copyright (C) 2012 Graph Theory Software Foundation: http://GraphTheorySoftware.com
// Copyright (C) 2008 Mathematical Science Department of Sharif University of Technology
// Distributed under the terms of the GNU General Public License (GPL): http://www.gnu.org/licenses/
package graphtea.plugins.main.core.actions.vertex;

import graphtea.graph.atributeset.GraphAttrSet;
import graphtea.graph.event.VertexEvent;
import graphtea.graph.graph.GPoint;
import graphtea.graph.graph.GraphModel;
import graphtea.graph.graph.SubGraph;
import graphtea.platform.core.AbstractAction;
import graphtea.platform.core.BlackBoard;
import graphtea.plugins.main.select.Select;

/**
 * @author Ruzbeh
 */
public class VertexMoveEvent extends AbstractAction {
    public VertexMoveEvent(BlackBoard bb) {
        super(bb);
//        listen4Event(VertexDropData.event);
//        listen4Event(VertexMouseDraggingData.event);
        listen4Event(VertexEvent.EVENT_KEY);
    }

    GPoint oldPos;
    double x1;
    double y1;
    GraphModel g;
    
    
    public void track(){}

    public void performAction(String eventName, Object value) {
        g = blackboard.getData(GraphAttrSet.name);
        VertexEvent ve = blackboard.getData(VertexEvent.EVENT_KEY);
        //while resizing the vertex it shouldn't move it
        if (ve.eventType == VertexEvent.DRAGGING_STARTED) {
            vdd = blackboard.getData(VertexEvent.EVENT_KEY);
            drag();
        }
        if (ve.eventType == VertexEvent.DROPPED) {
            vdrod = blackboard.getData(VertexEvent.EVENT_KEY);
            drop();
        } else if (ve.eventType == VertexEvent.DRAGGING) {
            dragging();
        }
    }

    //it preserves the vertex selection consistent. if the vertex was selected before move it should be after and vice versa
    private boolean isVertexSelected;

    private void dragging() {
        VertexEvent vmd = blackboard.getData(VertexEvent.EVENT_KEY);
        GPoint point = new GPoint(vmd.mousePos);
        GPoint loc = vmd.v.getLocation();
        point.x += loc.x - x1;
        point.y += loc.y - y1;
        vmd.v.setLocation(point);
        //System.out.println(vmd.me.getX()  - x1);
    }

    VertexEvent vdrod;

    private void drop() {
        VertexMoveData vmd = new VertexMoveData();
        vmd.v = vdd.v;
        GPoint point = new GPoint(vdrod.mousePos);
        GPoint loc = vmd.v.getLocation();
        point.x += vdrod.mousePos.x + loc.x - x1;
        point.y += vdrod.mousePos.y + loc.y - y1;
        vmd.newPosition = point;
        blackboard.setData(VertexMoveData.EVENT_KEY, vmd);
        //it negatives the status of the vertex so , it will be negatived cause a vertex click will be fired after and the selection status will be negatived again, it's just a hack!
        //todo: the hack may cause problems for some one working with selections
        SubGraph SubGraph = Select.getSelection(blackboard);
        if (vmd.newPosition.x != oldPos.x && vmd.newPosition.y != oldPos.y) {
            if (isVertexSelected) {
                SubGraph.vertices.remove(vmd.v);
            } else
                SubGraph.vertices.add(vmd.v);
            blackboard.setData(Select.EVENT_KEY, SubGraph);
        }

    }

    VertexEvent vdd;

    private void drag() {
        oldPos = vdd.v.getLocation();// new Point(vdd.v.view.getX(), vdd.v.view.getY());
        //store the original position
        x1 = vdd.mousePos.x;
        y1 = vdd.mousePos.y;
        isVertexSelected = Select.getSelection(blackboard).vertices.contains(vdd.v);
    }
}

