/*
 * 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.gallery;

import ilog.views.diagrammer.IlvDiagrammer;
import ilog.views.diagrammer.faces.IlvFacesDiagrammerUtil;
import ilog.views.diagrammer.faces.component.IlvFacesDiagrammerView;
import ilog.views.diagrammer.faces.dhtml.component.IlvFacesDHTMLDiagrammerView;
import ilog.views.faces.dhtml.event.FacesViewActionEvent;
import ilog.views.sdm.IlvSDMEngine;
import ilog.views.sdm.IlvSDMView;
import ilog.views.sdm.model.IlvSDMNode;
import ilog.views.sdm.renderer.IlvRendererUtil;
import ilog.views.sdm.renderer.IlvSubGraphRenderer;
import ilog.views.servlet.IlvImageMapAreaGenerator;

import javax.faces.event.ValueChangeEvent;

/**
 * This class defines the logic of the JViews Diagrammer Faces Gallery sample.
 * <br/>This beans provides a customized handle of the select node or link
 * interactor to select the node and create a data model filled with its properties
 * to be displayed in a data table.</li>
 * </ul>
 * all
 */
public class GalleryBean {

  // JV-6638, forces sub graphers to update its positions once expanded. 
  static {
    IlvSubGraphRenderer.setDefaultUpdatingPositionsOnExpand(true);
  }

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

  /** The image map generator */
  private IlvImageMapAreaGenerator imapGenerator = new GalleryImageMapGenerator();

  /** The contextual pop-up menu factory */
  private GalleryMenuFactory menuFactory = new GalleryMenuFactory();
  
  /** The selection property accessor **/
  private GalleryPropertyAccessor propertyAccessor = new GalleryPropertyAccessor();

  /**
   * Expand or collase a subgraph.<br/>
   * @param event The value change event.
   */
  public void expandCollapseSubGraph(ValueChangeEvent event) throws Exception {
    IlvDiagrammer diagrammer = diagrammerView.getDiagrammer();
    expandCollapseSubGraph(diagrammer, (IlvSDMNode) event.getNewValue());
  }

  /**
   * Expand or collase a subgraph.<br/>
   * @param event The view action event
   */
  public void expandCollapseSubGraph(FacesViewActionEvent event) throws Exception {
    IlvDiagrammer diagrammer = IlvFacesDiagrammerUtil.getDiagrammer((IlvSDMView) event
        .getGraphicComponent());
    expandCollapseSubGraph(diagrammer, (IlvSDMNode) event.getObject());
  }

  /**
   * Expand or collase a subgraph.<br/>
   * @param diagrammer The diagrammer
   * @param node The node to expand or collapse.
   */
  private void expandCollapseSubGraph(IlvDiagrammer diagrammer, IlvSDMNode node) {
    if (diagrammer != null && node != null) {
      IlvSDMEngine engine = diagrammer.getEngine();
      IlvSubGraphRenderer renderer = (IlvSubGraphRenderer) IlvRendererUtil
          .getRenderer(engine, IlvRendererUtil.SubGraph);
      renderer.setExpanded(engine, node, !renderer.isExpanded(engine, node), false);

    }
  }

  public IlvImageMapAreaGenerator getImapGenerator() {
    return imapGenerator;
  }

  public void setImapGenerator(IlvImageMapAreaGenerator imapGenerator) {
    this.imapGenerator = imapGenerator;
  }

  public GalleryMenuFactory getMenuFactory() {
    return menuFactory;
  }

  public void setMenuFactory(GalleryMenuFactory menuFactory) {
    this.menuFactory = menuFactory;
  }

  public GalleryPropertyAccessor getPropertyAccessor() {
    return propertyAccessor;
  }
}