/*
 * Licensed Materials - Property of Rogue Wave Software, Inc. 
 * © Copyright Rogue Wave Software, Inc. 2014, 2015 
 * © Copyright IBM Corp. 2009, 2014
 * © Copyright ILOG 1996, 2009
 * All Rights Reserved.
 *
 * Note to U.S. Government Users Restricted Rights:
 * The Software and Documentation were developed at private expense and
 * are "Commercial Items" as that term is defined at 48 CFR 2.101,
 * consisting of "Commercial Computer Software" and
 * "Commercial Computer Software Documentation", as such terms are
 * used in 48 CFR 12.212 or 48 CFR 227.7202-1 through 227.7202-4,
 * as applicable.
 */
package demo.ice;

import ilog.views.IlvGraphic;
import ilog.views.IlvRect;
import ilog.views.IlvTransformer;
import ilog.views.diagrammer.IlvDiagrammer;
import ilog.views.diagrammer.faces.component.IlvFacesDiagrammerView;
import ilog.views.diagrammer.faces.dhtml.component.IlvFacesDHTMLDiagrammerView;
import ilog.views.faces.dhtml.interactor.IlvObjectSelectInteractor;
import ilog.views.sdm.IlvSDMEngine;
import ilog.views.sdm.IlvSDMView;
import ilog.views.sdm.model.IlvSDMNode;

import java.awt.Dimension;
import java.util.Iterator;

import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.event.ValueChangeEvent;

import com.icesoft.faces.context.effects.JavascriptContext;

/**
 * This bean contains the logic of the JSF Diagrammer Editing sample.
 */
public class DiagrammerBean {

        /**
         * The diagrammer view.
         */
        private IlvFacesDiagrammerView diagrammerView = new IlvFacesDHTMLDiagrammerView();

        /**
         * @return The diagrammer view used in this demo.
         */
        public IlvFacesDiagrammerView getDiagrammerView() {
                return diagrammerView;
        }

        /**
         * Sets the diagrammer view.
         * 
         * @param diagrammerView
         *            The new diagrammer view.
         */
        public void setDiagrammerView(IlvFacesDiagrammerView diagrammerView) {
                this.diagrammerView = diagrammerView;
        }

        private static String empty = "none";
        private String nodeTag = empty;
        private String nodeID = empty;

        /**
         * The tag of the selected node.
         */
        public String getNodeTag() {
                return nodeTag;
        }

        /**
         * The ID of the selected node;
         */
        public String getNodeID() {
                return nodeID;
        }

        /**
         * Selects the graphic object specified by this event.
         * 
         * @param event
         *            The value change event
         * @throws Exception
         */
        public void selectNodeOrLink(ValueChangeEvent event) throws Exception {
                Object node = event.getNewValue();
                if (node != null
                                && event.getSource() instanceof IlvObjectSelectInteractor) {
                        // The source of the event is the interactor
                        IlvObjectSelectInteractor source = (IlvObjectSelectInteractor) event
                                        .getSource();
                        // Retrieve the JSF view connected to the interactor
                        IlvFacesDiagrammerView jsfDiagrammer = (IlvFacesDiagrammerView) source
                                        .getView();
                        try {
                                // Retrieve the IlvDiagrammer wrapped by the JSF component.
                                IlvSDMView view = (IlvSDMView) jsfDiagrammer.getView();
                                // Select the clicked object
                                IlvSDMEngine engine = view.getSDMEngine();
                                engine.setAdjusting(true);
                                engine.deselectAllObjects();
                                engine.setSelected(node, true);
                                engine.setAdjusting(false);
                        } catch (Exception e) {
                                e.printStackTrace();
                        }
                        if (node instanceof IlvSDMNode) {
                                nodeTag = ((IlvSDMNode) node).getTag();
                                nodeID = ((IlvSDMNode) node).getID();
                        } else {
                                nodeTag = empty;
                                nodeID = empty;
                        }
                }
        }

        /**
         * Centers the selected node.
         * 
         * @param e
         *            Not used.
         */
        public void centerSelection(ActionEvent e) {
                IlvDiagrammer diagrammer = null;
                try {
                        diagrammer = diagrammerView.getDiagrammer();
                } catch (Exception e1) {
                        e1.printStackTrace();
                }

                if (diagrammer != null) {
                        Iterator it = diagrammer.getSelectedObjects();
                        Object selectedNode = null;
                        while (it.hasNext()) {
                                selectedNode = it.next();
                        }
                        IlvGraphic graphic = null;
                        IlvRect objBox = null;
                        if (selectedNode != null) {
                                graphic = diagrammer.getEngine()
                                                .getGraphic(selectedNode, false);
                                objBox = graphic.boundingBox();
                                IlvSDMView view = diagrammer.getView();
                                Dimension size = view.getSize();
                                IlvRect port = new IlvRect(0, 0, size.width, size.height);
                                IlvTransformer t = view.getTransformer();
                                if (t != null)
                                        t.inverse(port);
                                float left = objBox.x + objBox.width / 2 - port.width / 2;
                                float top = objBox.y + objBox.height / 2 - port.height / 2;
                                String instruction = "diagrammer.moveTo(" + left + "," + top
                                                + ");";
                                JavascriptContext.addJavascriptCall(FacesContext
                                                .getCurrentInstance(), instruction);
                        }
                }
        }
}