/*
 * 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.IlvManager;
import ilog.views.IlvManagerLayer;
import ilog.views.diagrammer.IlvDiagrammer;
import ilog.views.diagrammer.faces.IlvFacesDiagrammerUtil;
import ilog.views.faces.dhtml.IlvDHTMLConstants;
import ilog.views.faces.dhtml.event.FacesMethodBindingActionListener;
import ilog.views.sdm.IlvSDMView;
import ilog.views.sdm.model.IlvSDMNode;
import ilog.views.util.IlvResourceUtil;
import ilog.views.util.servlet.IlvMenuFactory;
import ilog.views.util.servlet.event.JavaScriptActionListener;
import ilog.views.util.servlet.model.IlvMenu;
import ilog.views.util.servlet.model.IlvMenuItem;
import ilog.views.util.servlet.model.IlvMenuSeparator;

import javax.servlet.ServletContext;

public class GalleryMenuFactory implements IlvMenuFactory {

  private ServletContext context;

  private static final String PAN_MENU_MODEL_ID = "pan";

  private static final String ZOOM_MENU_MODEL_ID = "zoom";

  private static final String SELECT_MENU_MODEL_ID = "select";

  
  /**
   * Create a menu item with the specified image and the specified 
   * javascript action.
   * @param label The menu item's label.
   * @param jsAction The Javascript action attached to this label.
   * @param image The image of this menu item.
   * @return The menu item created.
   */
  private IlvMenuItem createJSMenuItem(String label, String jsAction, String image) {
    return createJSMenuItem(label, jsAction, image, true);    
  }
  /**
   * Create a menu item with the specified image and the specified 
   * javascript action.
   * @param label The menu item's label.
   * @param jsAction The Javascript action attached to this label.
   * @param image The image of this menu item.
   * @param enabled The state of the menu item.
   * @return The menu item created.
   */
  private IlvMenuItem createJSMenuItem(String label, String jsAction, String image, boolean enabled) {
    
    JavaScriptActionListener eltAction = new JavaScriptActionListener();
    eltAction.setJsAction(jsAction);
    IlvMenuItem elt = new IlvMenuItem(label, eltAction, image, enabled);       
    return elt;
  }

  /**
   * Creates the interactors and zoom menu items.
   * @param root The root menu
   * @param menuModelId The menu model ID
   */
  public void createNavigationMenuItems(IlvMenu root, String menuModelId) {
    
    boolean enabled = !ZOOM_MENU_MODEL_ID.equals(menuModelId);    
    root.addChild(createJSMenuItem(IlvResourceUtil.getCurrentLocaleString(GalleryMenuFactory.class,"setZoomIt"), "zoomButton.doClick()", "images/zoomrect.gif", enabled));

    enabled = !PAN_MENU_MODEL_ID.equals(menuModelId);
    root.addChild(createJSMenuItem(IlvResourceUtil.getCurrentLocaleString(GalleryMenuFactory.class,"setPanIt"), "panButton.doClick()", "images/pan.gif", enabled));

    enabled = !SELECT_MENU_MODEL_ID.equals(menuModelId);
    root.addChild(createJSMenuItem(IlvResourceUtil.getCurrentLocaleString(GalleryMenuFactory.class,"setSelectIt"), "selectButton.doClick()", "images/arrow.gif", enabled));

    root.addChild(new IlvMenuSeparator());

    root.addChild(createJSMenuItem(IlvResourceUtil.getCurrentLocaleString(GalleryMenuFactory.class,"zoomInTooltip"), "diagrammer.zoomIn();", "images/zoom.gif"));

    root.addChild(createJSMenuItem(IlvResourceUtil.getCurrentLocaleString(GalleryMenuFactory.class,"zoomOutTooltip"), "diagrammer.zoomOut();", "images/unzoom.gif"));

    root.addChild(createJSMenuItem(IlvResourceUtil.getCurrentLocaleString(GalleryMenuFactory.class,"showallTooltip"), "diagrammer.showAll();", "images/zoomfit.gif"));

  }

  /**
   * Creates a submenu filled with properties of the specified node.
   * @param root The root menu
   * @param node The current SDM node.
   */
  private void createPropertyMenuItems(IlvMenu root, IlvSDMNode node) {

    String[] names = node.getPropertyNames();
    if (names.length > 0)
      for (int i = 0; i < names.length; i++) {
        if (names[i].indexOf("sdm:") != -1 ||
            "x".equalsIgnoreCase(names[i]) ||
             "y".equalsIgnoreCase(names[i]) ||
             "width".equalsIgnoreCase(names[i]) ||
             "height".equalsIgnoreCase(names[i]) ||
             "CSSclass".equalsIgnoreCase(names[i]) || 
             "".equals( node.getProperty(names[i]))) {
          continue;
        }
        String s = names[i] + " : " + node.getProperty(names[i]);
        root.addChild(new IlvMenuItem(s, null, "images/property.gif", true));
      }

  }

  /**
   * Create a menu item to show or hide the current layer.
   * @param layer The manager layer.
   * @return The menu item to show/hide layer.
   */
  private IlvMenuItem buildMenuItem(IlvManagerLayer layer) {

    IlvMenuItem item = new IlvMenuItem();
    String name = layer.getName();
    item.setLabel(name);

    return item;
  }

  public IlvMenu createMenu(Object graphicComponent, Object selectedObject, String menuModelId) {

    IlvMenu root = new IlvMenu("Root");

    createNavigationMenuItems(root, menuModelId);

    if (selectedObject != null) {

      IlvDiagrammer diagrammer = IlvFacesDiagrammerUtil
          .getDiagrammer((IlvSDMView) graphicComponent);

      if (diagrammer.getEngine().getGraphic(selectedObject, false) instanceof IlvManager) {

        IlvMenuItem item = new IlvMenuItem(
            IlvResourceUtil.getCurrentLocaleString(GalleryMenuFactory.class,"expandCollapse"), null,
                                           "images/arrowclick.gif");
        FacesMethodBindingActionListener l = 
            new FacesMethodBindingActionListener("#{galleryBean.expandCollapseSubGraph}");
        l.setInvocationContext(IlvDHTMLConstants.IMAGE_SERVLET_CONTEXT);
        item.setActionListener(l);
        root.addChild(item);

      }

      root.addChild(new IlvMenuSeparator());

      IlvMenu subMenu = new IlvMenu(IlvResourceUtil.getCurrentLocaleString(GalleryMenuFactory.class,"Properties"), "images/properties.gif");
      IlvSDMNode node = (IlvSDMNode) selectedObject;
      createPropertyMenuItems(subMenu, node);
      root.addChild(subMenu);

    }

    return root;
  }
  
}