Package com.mxgraph.examples.swing.editor

Source Code of com.mxgraph.examples.swing.editor.EditorMenuBar$AnalyzeGraph

package com.mxgraph.examples.swing.editor;

import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;

import javax.swing.AbstractAction;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.SwingUtilities;
import javax.swing.TransferHandler;
import javax.swing.UIManager;

import com.mxgraph.analysis.StructuralException;
import com.mxgraph.analysis.mxGraphProperties.GraphType;
import com.mxgraph.analysis.mxAnalysisGraph;
import com.mxgraph.analysis.mxGraphProperties;
import com.mxgraph.analysis.mxGraphStructure;
import com.mxgraph.analysis.mxTraversal;
import com.mxgraph.costfunction.mxCostFunction;
import com.mxgraph.examples.swing.editor.EditorActions.AlignCellsAction;
import com.mxgraph.examples.swing.editor.EditorActions.AutosizeAction;
import com.mxgraph.examples.swing.editor.EditorActions.BackgroundAction;
import com.mxgraph.examples.swing.editor.EditorActions.BackgroundImageAction;
import com.mxgraph.examples.swing.editor.EditorActions.ColorAction;
import com.mxgraph.examples.swing.editor.EditorActions.ExitAction;
import com.mxgraph.examples.swing.editor.EditorActions.GridColorAction;
import com.mxgraph.examples.swing.editor.EditorActions.GridStyleAction;
import com.mxgraph.examples.swing.editor.EditorActions.HistoryAction;
import com.mxgraph.examples.swing.editor.EditorActions.ImportAction;
import com.mxgraph.examples.swing.editor.EditorActions.KeyValueAction;
import com.mxgraph.examples.swing.editor.EditorActions.NewAction;
import com.mxgraph.examples.swing.editor.EditorActions.OpenAction;
import com.mxgraph.examples.swing.editor.EditorActions.PageBackgroundAction;
import com.mxgraph.examples.swing.editor.EditorActions.PageSetupAction;
import com.mxgraph.examples.swing.editor.EditorActions.PrintAction;
import com.mxgraph.examples.swing.editor.EditorActions.PromptPropertyAction;
import com.mxgraph.examples.swing.editor.EditorActions.PromptValueAction;
import com.mxgraph.examples.swing.editor.EditorActions.SaveAction;
import com.mxgraph.examples.swing.editor.EditorActions.ScaleAction;
import com.mxgraph.examples.swing.editor.EditorActions.SelectShortestPathAction;
import com.mxgraph.examples.swing.editor.EditorActions.SelectSpanningTreeAction;
import com.mxgraph.examples.swing.editor.EditorActions.SetLabelPositionAction;
import com.mxgraph.examples.swing.editor.EditorActions.SetStyleAction;
import com.mxgraph.examples.swing.editor.EditorActions.StyleAction;
import com.mxgraph.examples.swing.editor.EditorActions.StylesheetAction;
import com.mxgraph.examples.swing.editor.EditorActions.ToggleAction;
import com.mxgraph.examples.swing.editor.EditorActions.ToggleConnectModeAction;
import com.mxgraph.examples.swing.editor.EditorActions.ToggleCreateTargetItem;
import com.mxgraph.examples.swing.editor.EditorActions.ToggleDirtyAction;
import com.mxgraph.examples.swing.editor.EditorActions.ToggleGridItem;
import com.mxgraph.examples.swing.editor.EditorActions.ToggleOutlineItem;
import com.mxgraph.examples.swing.editor.EditorActions.TogglePropertyItem;
import com.mxgraph.examples.swing.editor.EditorActions.ToggleRulersItem;
import com.mxgraph.examples.swing.editor.EditorActions.WarningAction;
import com.mxgraph.examples.swing.editor.EditorActions.ZoomPolicyAction;
import com.mxgraph.model.mxIGraphModel;
import com.mxgraph.swing.mxGraphComponent;
import com.mxgraph.swing.util.mxGraphActions;
import com.mxgraph.util.mxConstants;
import com.mxgraph.util.mxPoint;
import com.mxgraph.util.mxResources;
import com.mxgraph.view.mxGraph;
import com.mxgraph.view.mxGraphView;

public class EditorMenuBar extends JMenuBar
{

  /**
   *
   */
  private static final long serialVersionUID = 4060203894740766714L;

  public enum AnalyzeType
  {
    IS_CONNECTED, IS_SIMPLE, IS_CYCLIC_DIRECTED, IS_CYCLIC_UNDIRECTED, COMPLEMENTARY, REGULARITY, COMPONENTS, MAKE_CONNECTED, MAKE_SIMPLE, IS_TREE, ONE_SPANNING_TREE, IS_DIRECTED, GET_CUT_VERTEXES, GET_CUT_EDGES, GET_SOURCES, GET_SINKS, PLANARITY, IS_BICONNECTED, GET_BICONNECTED, SPANNING_TREE, FLOYD_ROY_WARSHALL
  }

  public EditorMenuBar(final BasicGraphEditor editor)
  {
    final mxGraphComponent graphComponent = editor.getGraphComponent();
    final mxGraph graph = graphComponent.getGraph();
    mxAnalysisGraph aGraph = new mxAnalysisGraph();

    JMenu menu = null;
    JMenu submenu = null;

    // Creates the file menu
    menu = add(new JMenu(mxResources.get("file")));

    menu.add(editor.bind(mxResources.get("new"), new NewAction(), "/com/mxgraph/examples/swing/images/new.gif"));
    menu.add(editor.bind(mxResources.get("openFile"), new OpenAction(), "/com/mxgraph/examples/swing/images/open.gif"));
    menu.add(editor.bind(mxResources.get("importStencil"), new ImportAction(), "/com/mxgraph/examples/swing/images/open.gif"));

    menu.addSeparator();

    menu.add(editor.bind(mxResources.get("save"), new SaveAction(false), "/com/mxgraph/examples/swing/images/save.gif"));
    menu.add(editor.bind(mxResources.get("saveAs"), new SaveAction(true), "/com/mxgraph/examples/swing/images/saveas.gif"));

    menu.addSeparator();

    menu.add(editor.bind(mxResources.get("pageSetup"), new PageSetupAction(), "/com/mxgraph/examples/swing/images/pagesetup.gif"));
    menu.add(editor.bind(mxResources.get("print"), new PrintAction(), "/com/mxgraph/examples/swing/images/print.gif"));

    menu.addSeparator();

    menu.add(editor.bind(mxResources.get("exit"), new ExitAction()));

    // Creates the edit menu
    menu = add(new JMenu(mxResources.get("edit")));

    menu.add(editor.bind(mxResources.get("undo"), new HistoryAction(true), "/com/mxgraph/examples/swing/images/undo.gif"));
    menu.add(editor.bind(mxResources.get("redo"), new HistoryAction(false), "/com/mxgraph/examples/swing/images/redo.gif"));

    menu.addSeparator();

    menu.add(editor.bind(mxResources.get("cut"), TransferHandler.getCutAction(), "/com/mxgraph/examples/swing/images/cut.gif"));
    menu.add(editor.bind(mxResources.get("copy"), TransferHandler.getCopyAction(), "/com/mxgraph/examples/swing/images/copy.gif"));
    menu.add(editor.bind(mxResources.get("paste"), TransferHandler.getPasteAction(), "/com/mxgraph/examples/swing/images/paste.gif"));

    menu.addSeparator();

    menu.add(editor.bind(mxResources.get("delete"), mxGraphActions.getDeleteAction(), "/com/mxgraph/examples/swing/images/delete.gif"));

    menu.addSeparator();

    menu.add(editor.bind(mxResources.get("selectAll"), mxGraphActions.getSelectAllAction()));
    menu.add(editor.bind(mxResources.get("selectNone"), mxGraphActions.getSelectNoneAction()));

    menu.addSeparator();

    menu.add(editor.bind(mxResources.get("warning"), new WarningAction()));
    menu.add(editor.bind(mxResources.get("edit"), mxGraphActions.getEditAction()));

    // Creates the view menu
    menu = add(new JMenu(mxResources.get("view")));

    JMenuItem item = menu.add(new TogglePropertyItem(graphComponent, mxResources.get("pageLayout"), "PageVisible", true,
        new ActionListener()
        {
          /**
           *
           */
          public void actionPerformed(ActionEvent e)
          {
            if (graphComponent.isPageVisible() && graphComponent.isCenterPage())
            {
              graphComponent.zoomAndCenter();
            }
            else
            {
              graphComponent.getGraphControl().updatePreferredSize();
            }
          }
        }));

    item.addActionListener(new ActionListener()
    {
      /*
       * (non-Javadoc)
       * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
       */
      public void actionPerformed(ActionEvent e)
      {
        if (e.getSource() instanceof TogglePropertyItem)
        {
          final mxGraphComponent graphComponent = editor.getGraphComponent();
          TogglePropertyItem toggleItem = (TogglePropertyItem) e.getSource();

          if (toggleItem.isSelected())
          {
            // Scrolls the view to the center
            SwingUtilities.invokeLater(new Runnable()
            {
              /*
               * (non-Javadoc)
               * @see java.lang.Runnable#run()
               */
              public void run()
              {
                graphComponent.scrollToCenter(true);
                graphComponent.scrollToCenter(false);
              }
            });
          }
          else
          {
            // Resets the translation of the view
            mxPoint tr = graphComponent.getGraph().getView().getTranslate();

            if (tr.getX() != 0 || tr.getY() != 0)
            {
              graphComponent.getGraph().getView().setTranslate(new mxPoint());
            }
          }
        }
      }
    });

    menu.add(new TogglePropertyItem(graphComponent, mxResources.get("antialias"), "AntiAlias", true));

    menu.addSeparator();

    menu.add(new ToggleGridItem(editor, mxResources.get("grid")));
    menu.add(new ToggleRulersItem(editor, mxResources.get("rulers")));

    menu.addSeparator();

    submenu = (JMenu) menu.add(new JMenu(mxResources.get("zoom")));

    submenu.add(editor.bind("400%", new ScaleAction(4)));
    submenu.add(editor.bind("200%", new ScaleAction(2)));
    submenu.add(editor.bind("150%", new ScaleAction(1.5)));
    submenu.add(editor.bind("100%", new ScaleAction(1)));
    submenu.add(editor.bind("75%", new ScaleAction(0.75)));
    submenu.add(editor.bind("50%", new ScaleAction(0.5)));

    submenu.addSeparator();

    submenu.add(editor.bind(mxResources.get("custom"), new ScaleAction(0)));

    menu.addSeparator();

    menu.add(editor.bind(mxResources.get("zoomIn"), mxGraphActions.getZoomInAction()));
    menu.add(editor.bind(mxResources.get("zoomOut"), mxGraphActions.getZoomOutAction()));

    menu.addSeparator();

    menu.add(editor.bind(mxResources.get("page"), new ZoomPolicyAction(mxGraphComponent.ZOOM_POLICY_PAGE)));
    menu.add(editor.bind(mxResources.get("width"), new ZoomPolicyAction(mxGraphComponent.ZOOM_POLICY_WIDTH)));

    menu.addSeparator();

    menu.add(editor.bind(mxResources.get("actualSize"), mxGraphActions.getZoomActualAction()));

    // Creates the format menu
    menu = add(new JMenu(mxResources.get("format")));

    populateFormatMenu(menu, editor);

    // Creates the shape menu
    menu = add(new JMenu(mxResources.get("shape")));

    populateShapeMenu(menu, editor);

    // Creates the diagram menu
    menu = add(new JMenu(mxResources.get("diagram")));

    menu.add(new ToggleOutlineItem(editor, mxResources.get("outline")));

    menu.addSeparator();

    submenu = (JMenu) menu.add(new JMenu(mxResources.get("background")));

    submenu.add(editor.bind(mxResources.get("backgroundColor"), new BackgroundAction()));
    submenu.add(editor.bind(mxResources.get("backgroundImage"), new BackgroundImageAction()));

    submenu.addSeparator();

    submenu.add(editor.bind(mxResources.get("pageBackground"), new PageBackgroundAction()));

    submenu = (JMenu) menu.add(new JMenu(mxResources.get("grid")));

    submenu.add(editor.bind(mxResources.get("gridSize"), new PromptPropertyAction(graph, "Grid Size", "GridSize")));
    submenu.add(editor.bind(mxResources.get("gridColor"), new GridColorAction()));

    submenu.addSeparator();

    submenu.add(editor.bind(mxResources.get("dashed"), new GridStyleAction(mxGraphComponent.GRID_STYLE_DASHED)));
    submenu.add(editor.bind(mxResources.get("dot"), new GridStyleAction(mxGraphComponent.GRID_STYLE_DOT)));
    submenu.add(editor.bind(mxResources.get("line"), new GridStyleAction(mxGraphComponent.GRID_STYLE_LINE)));
    submenu.add(editor.bind(mxResources.get("cross"), new GridStyleAction(mxGraphComponent.GRID_STYLE_CROSS)));

    menu.addSeparator();

    submenu = (JMenu) menu.add(new JMenu(mxResources.get("layout")));

    submenu.add(editor.graphLayout("verticalHierarchical", true));
    submenu.add(editor.graphLayout("horizontalHierarchical", true));

    submenu.addSeparator();

    submenu.add(editor.graphLayout("verticalPartition", false));
    submenu.add(editor.graphLayout("horizontalPartition", false));

    submenu.addSeparator();

    submenu.add(editor.graphLayout("verticalStack", false));
    submenu.add(editor.graphLayout("horizontalStack", false));

    submenu.addSeparator();

    submenu.add(editor.graphLayout("verticalTree", true));
    submenu.add(editor.graphLayout("horizontalTree", true));

    submenu.addSeparator();

    submenu.add(editor.graphLayout("placeEdgeLabels", false));
    submenu.add(editor.graphLayout("parallelEdges", false));

    submenu.addSeparator();

    submenu.add(editor.graphLayout("organicLayout", true));
    submenu.add(editor.graphLayout("circleLayout", true));

    submenu = (JMenu) menu.add(new JMenu(mxResources.get("selection")));

    submenu.add(editor.bind(mxResources.get("selectPath"), new SelectShortestPathAction(false)));
    submenu.add(editor.bind(mxResources.get("selectDirectedPath"), new SelectShortestPathAction(true)));

    submenu.addSeparator();

    submenu.add(editor.bind(mxResources.get("selectTree"), new SelectSpanningTreeAction(false)));
    submenu.add(editor.bind(mxResources.get("selectDirectedTree"), new SelectSpanningTreeAction(true)));

    menu.addSeparator();

    submenu = (JMenu) menu.add(new JMenu(mxResources.get("stylesheet")));

    submenu.add(editor.bind(mxResources.get("basicStyle"),
        new StylesheetAction("/com/mxgraph/examples/swing/resources/basic-style.xml")));
    submenu.add(editor.bind(mxResources.get("defaultStyle"), new StylesheetAction(
        "/com/mxgraph/examples/swing/resources/default-style.xml")));

    // Creates the options menu
    menu = add(new JMenu(mxResources.get("options")));

    submenu = (JMenu) menu.add(new JMenu(mxResources.get("display")));
    submenu.add(new TogglePropertyItem(graphComponent, mxResources.get("buffering"), "TripleBuffered", true));

    submenu.add(new TogglePropertyItem(graphComponent, mxResources.get("preferPageSize"), "PreferPageSize", true, new ActionListener()
    {
      /**
       *
       */
      public void actionPerformed(ActionEvent e)
      {
        graphComponent.zoomAndCenter();
      }
    }));

    // TODO: This feature is not yet implemented
    //submenu.add(new TogglePropertyItem(graphComponent, mxResources
    //    .get("pageBreaks"), "PageBreaksVisible", true));

    submenu.addSeparator();

    submenu.add(editor.bind(mxResources.get("tolerance"), new PromptPropertyAction(graphComponent, "Tolerance")));

    submenu.add(editor.bind(mxResources.get("dirty"), new ToggleDirtyAction()));

    submenu = (JMenu) menu.add(new JMenu(mxResources.get("zoom")));

    submenu.add(new TogglePropertyItem(graphComponent, mxResources.get("centerZoom"), "CenterZoom", true));
    submenu.add(new TogglePropertyItem(graphComponent, mxResources.get("zoomToSelection"), "KeepSelectionVisibleOnZoom", true));

    submenu.addSeparator();

    submenu.add(new TogglePropertyItem(graphComponent, mxResources.get("centerPage"), "CenterPage", true, new ActionListener()
    {
      /**
       *
       */
      public void actionPerformed(ActionEvent e)
      {
        if (graphComponent.isPageVisible() && graphComponent.isCenterPage())
        {
          graphComponent.zoomAndCenter();
        }
      }
    }));

    menu.addSeparator();

    submenu = (JMenu) menu.add(new JMenu(mxResources.get("dragAndDrop")));

    submenu.add(new TogglePropertyItem(graphComponent, mxResources.get("dragEnabled"), "DragEnabled"));
    submenu.add(new TogglePropertyItem(graph, mxResources.get("dropEnabled"), "DropEnabled"));

    submenu.addSeparator();

    submenu.add(new TogglePropertyItem(graphComponent.getGraphHandler(), mxResources.get("imagePreview"), "ImagePreview"));

    submenu = (JMenu) menu.add(new JMenu(mxResources.get("labels")));

    submenu.add(new TogglePropertyItem(graph, mxResources.get("htmlLabels"), "HtmlLabels", true));
    submenu.add(new TogglePropertyItem(graph, mxResources.get("showLabels"), "LabelsVisible", true));

    submenu.addSeparator();

    submenu.add(new TogglePropertyItem(graph, mxResources.get("moveEdgeLabels"), "EdgeLabelsMovable"));
    submenu.add(new TogglePropertyItem(graph, mxResources.get("moveVertexLabels"), "VertexLabelsMovable"));

    submenu.addSeparator();

    submenu.add(new TogglePropertyItem(graphComponent, mxResources.get("handleReturn"), "EnterStopsCellEditing"));

    menu.addSeparator();

    submenu = (JMenu) menu.add(new JMenu(mxResources.get("connections")));

    submenu.add(new TogglePropertyItem(graphComponent, mxResources.get("connectable"), "Connectable"));
    submenu.add(new TogglePropertyItem(graph, mxResources.get("connectableEdges"), "ConnectableEdges"));

    submenu.addSeparator();

    submenu.add(new ToggleCreateTargetItem(editor, mxResources.get("createTarget")));
    submenu.add(new TogglePropertyItem(graph, mxResources.get("disconnectOnMove"), "DisconnectOnMove"));

    submenu.addSeparator();

    submenu.add(editor.bind(mxResources.get("connectMode"), new ToggleConnectModeAction()));

    submenu = (JMenu) menu.add(new JMenu(mxResources.get("validation")));

    submenu.add(new TogglePropertyItem(graph, mxResources.get("allowDanglingEdges"), "AllowDanglingEdges"));
    submenu.add(new TogglePropertyItem(graph, mxResources.get("cloneInvalidEdges"), "CloneInvalidEdges"));

    submenu.addSeparator();

    submenu.add(new TogglePropertyItem(graph, mxResources.get("allowLoops"), "AllowLoops"));
    submenu.add(new TogglePropertyItem(graph, mxResources.get("multigraph"), "Multigraph"));

    // Creates the window menu
    menu = add(new JMenu(mxResources.get("window")));

    UIManager.LookAndFeelInfo[] lafs = UIManager.getInstalledLookAndFeels();

    for (int i = 0; i < lafs.length; i++)
    {
      final String clazz = lafs[i].getClassName();
     
      menu.add(new AbstractAction(lafs[i].getName())
      {
        /**
         *
         */
        private static final long serialVersionUID = 7588919504149148501L;

        public void actionPerformed(ActionEvent e)
        {
          editor.setLookAndFeel(clazz);
        }
      });
    }

    // Creates a developer menu
    menu = add(new JMenu("Generate"));
    menu.add(editor.bind("Null Graph", new InsertGraph(GraphType.NULL, aGraph)));
    menu.add(editor.bind("Complete Graph", new InsertGraph(GraphType.COMPLETE, aGraph)));
    menu.add(editor.bind("Grid", new InsertGraph(GraphType.GRID, aGraph)));
    menu.add(editor.bind("Bipartite", new InsertGraph(GraphType.BIPARTITE, aGraph)));
    menu.add(editor.bind("Complete Bipartite", new InsertGraph(GraphType.COMPLETE_BIPARTITE, aGraph)));
    menu.add(editor.bind("Knight's Graph", new InsertGraph(GraphType.KNIGHT, aGraph)));
    menu.add(editor.bind("King's Graph", new InsertGraph(GraphType.KING, aGraph)));
    menu.add(editor.bind("Petersen", new InsertGraph(GraphType.PETERSEN, aGraph)));
    menu.add(editor.bind("Path", new InsertGraph(GraphType.PATH, aGraph)));
    menu.add(editor.bind("Star", new InsertGraph(GraphType.STAR, aGraph)));
    menu.add(editor.bind("Wheel", new InsertGraph(GraphType.WHEEL, aGraph)));
    menu.add(editor.bind("Friendship Windmill", new InsertGraph(GraphType.FRIENDSHIP_WINDMILL, aGraph)));
    menu.add(editor.bind("Full Windmill", new InsertGraph(GraphType.FULL_WINDMILL, aGraph)));
    menu.add(editor.bind("Knight's Tour", new InsertGraph(GraphType.KNIGHT_TOUR, aGraph)));
    menu.addSeparator();
    menu.add(editor.bind("Simple Random", new InsertGraph(GraphType.SIMPLE_RANDOM, aGraph)));
    menu.add(editor.bind("Simple Random Tree", new InsertGraph(GraphType.SIMPLE_RANDOM_TREE, aGraph)));
    menu.addSeparator();
    menu.add(editor.bind("Reset Style", new InsertGraph(GraphType.RESET_STYLE, aGraph)));

    menu = add(new JMenu("Analyze"));
    menu.add(editor.bind("Is Connected", new AnalyzeGraph(AnalyzeType.IS_CONNECTED, aGraph)));
    menu.add(editor.bind("Is Simple", new AnalyzeGraph(AnalyzeType.IS_SIMPLE, aGraph)));
    menu.add(editor.bind("Is Directed Cyclic", new AnalyzeGraph(AnalyzeType.IS_CYCLIC_DIRECTED, aGraph)));
    menu.add(editor.bind("Is Undirected Cyclic", new AnalyzeGraph(AnalyzeType.IS_CYCLIC_UNDIRECTED, aGraph)));
    menu.add(editor.bind("BFS Directed", new InsertGraph(GraphType.BFS_DIR, aGraph)));
    menu.add(editor.bind("BFS Undirected", new InsertGraph(GraphType.BFS_UNDIR, aGraph)));
    menu.add(editor.bind("DFS Directed", new InsertGraph(GraphType.DFS_DIR, aGraph)));
    menu.add(editor.bind("DFS Undirected", new InsertGraph(GraphType.DFS_UNDIR, aGraph)));
    menu.add(editor.bind("Complementary", new AnalyzeGraph(AnalyzeType.COMPLEMENTARY, aGraph)));
    menu.add(editor.bind("Regularity", new AnalyzeGraph(AnalyzeType.REGULARITY, aGraph)));
    menu.add(editor.bind("Dijkstra", new InsertGraph(GraphType.DIJKSTRA, aGraph)));
    menu.add(editor.bind("Bellman-Ford", new InsertGraph(GraphType.BELLMAN_FORD, aGraph)));
    menu.add(editor.bind("Floyd-Roy-Warshall", new AnalyzeGraph(AnalyzeType.FLOYD_ROY_WARSHALL, aGraph)));
    menu.add(editor.bind("Get Components", new AnalyzeGraph(AnalyzeType.COMPONENTS, aGraph)));
    menu.add(editor.bind("Make Connected", new AnalyzeGraph(AnalyzeType.MAKE_CONNECTED, aGraph)));
    menu.add(editor.bind("Make Simple", new AnalyzeGraph(AnalyzeType.MAKE_SIMPLE, aGraph)));
    menu.add(editor.bind("Is Tree", new AnalyzeGraph(AnalyzeType.IS_TREE, aGraph)));
    menu.add(editor.bind("One Spanning Tree", new AnalyzeGraph(AnalyzeType.ONE_SPANNING_TREE, aGraph)));
    menu.add(editor.bind("Make tree directed", new InsertGraph(GraphType.MAKE_TREE_DIRECTED, aGraph)));
    menu.add(editor.bind("Is directed", new AnalyzeGraph(AnalyzeType.IS_DIRECTED, aGraph)));
    menu.add(editor.bind("Indegree", new InsertGraph(GraphType.INDEGREE, aGraph)));
    menu.add(editor.bind("Outdegree", new InsertGraph(GraphType.OUTDEGREE, aGraph)));
    menu.add(editor.bind("Is cut vertex", new InsertGraph(GraphType.IS_CUT_VERTEX, aGraph)));
    menu.add(editor.bind("Get cut vertices", new AnalyzeGraph(AnalyzeType.GET_CUT_VERTEXES, aGraph)));
    menu.add(editor.bind("Get cut edges", new AnalyzeGraph(AnalyzeType.GET_CUT_EDGES, aGraph)));
    menu.add(editor.bind("Get sources", new AnalyzeGraph(AnalyzeType.GET_SOURCES, aGraph)));
    menu.add(editor.bind("Get sinks", new AnalyzeGraph(AnalyzeType.GET_SINKS, aGraph)));
    menu.add(editor.bind("Is biconnected", new AnalyzeGraph(AnalyzeType.IS_BICONNECTED, aGraph)));

    // Creates the help menu
    menu = add(new JMenu(mxResources.get("help")));

    item = menu.add(new JMenuItem(mxResources.get("aboutGraphEditor")));
    item.addActionListener(new ActionListener()
    {
      /*
       * (non-Javadoc)
       * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
       */
      public void actionPerformed(ActionEvent e)
      {
        editor.about();
      }
    });
  }

  /**
   * Adds menu items to the given shape menu. This is factored out because
   * the shape menu appears in the menubar and also in the popupmenu.
   */
  public static void populateShapeMenu(JMenu menu, BasicGraphEditor editor)
  {
    menu.add(editor.bind(mxResources.get("home"), mxGraphActions.getHomeAction(), "/com/mxgraph/examples/swing/images/house.gif"));

    menu.addSeparator();

    menu.add(editor.bind(mxResources.get("exitGroup"), mxGraphActions.getExitGroupAction(), "/com/mxgraph/examples/swing/images/up.gif"));
    menu.add(editor.bind(mxResources.get("enterGroup"), mxGraphActions.getEnterGroupAction(),
        "/com/mxgraph/examples/swing/images/down.gif"));

    menu.addSeparator();

    menu.add(editor.bind(mxResources.get("group"), mxGraphActions.getGroupAction(), "/com/mxgraph/examples/swing/images/group.gif"));
    menu.add(editor.bind(mxResources.get("ungroup"), mxGraphActions.getUngroupAction(),
        "/com/mxgraph/examples/swing/images/ungroup.gif"));

    menu.addSeparator();

    menu.add(editor.bind(mxResources.get("removeFromGroup"), mxGraphActions.getRemoveFromParentAction()));

    menu.add(editor.bind(mxResources.get("updateGroupBounds"), mxGraphActions.getUpdateGroupBoundsAction()));

    menu.addSeparator();

    menu.add(editor.bind(mxResources.get("collapse"), mxGraphActions.getCollapseAction(),
        "/com/mxgraph/examples/swing/images/collapse.gif"));
    menu.add(editor.bind(mxResources.get("expand"), mxGraphActions.getExpandAction(), "/com/mxgraph/examples/swing/images/expand.gif"));

    menu.addSeparator();

    menu.add(editor.bind(mxResources.get("toBack"), mxGraphActions.getToBackAction(), "/com/mxgraph/examples/swing/images/toback.gif"));
    menu.add(editor.bind(mxResources.get("toFront"), mxGraphActions.getToFrontAction(),
        "/com/mxgraph/examples/swing/images/tofront.gif"));

    menu.addSeparator();

    JMenu submenu = (JMenu) menu.add(new JMenu(mxResources.get("align")));

    submenu.add(editor.bind(mxResources.get("left"), new AlignCellsAction(mxConstants.ALIGN_LEFT),
        "/com/mxgraph/examples/swing/images/alignleft.gif"));
    submenu.add(editor.bind(mxResources.get("center"), new AlignCellsAction(mxConstants.ALIGN_CENTER),
        "/com/mxgraph/examples/swing/images/aligncenter.gif"));
    submenu.add(editor.bind(mxResources.get("right"), new AlignCellsAction(mxConstants.ALIGN_RIGHT),
        "/com/mxgraph/examples/swing/images/alignright.gif"));

    submenu.addSeparator();

    submenu.add(editor.bind(mxResources.get("top"), new AlignCellsAction(mxConstants.ALIGN_TOP),
        "/com/mxgraph/examples/swing/images/aligntop.gif"));
    submenu.add(editor.bind(mxResources.get("middle"), new AlignCellsAction(mxConstants.ALIGN_MIDDLE),
        "/com/mxgraph/examples/swing/images/alignmiddle.gif"));
    submenu.add(editor.bind(mxResources.get("bottom"), new AlignCellsAction(mxConstants.ALIGN_BOTTOM),
        "/com/mxgraph/examples/swing/images/alignbottom.gif"));

    menu.addSeparator();

    menu.add(editor.bind(mxResources.get("autosize"), new AutosizeAction()));

  }

  /**
   * Adds menu items to the given format menu. This is factored out because
   * the format menu appears in the menubar and also in the popupmenu.
   */
  public static void populateFormatMenu(JMenu menu, BasicGraphEditor editor)
  {
    JMenu submenu = (JMenu) menu.add(new JMenu(mxResources.get("background")));

    submenu.add(editor.bind(mxResources.get("fillcolor"), new ColorAction("Fillcolor", mxConstants.STYLE_FILLCOLOR),
        "/com/mxgraph/examples/swing/images/fillcolor.gif"));
    submenu.add(editor.bind(mxResources.get("gradient"), new ColorAction("Gradient", mxConstants.STYLE_GRADIENTCOLOR)));

    submenu.addSeparator();

    submenu.add(editor.bind(mxResources.get("image"), new PromptValueAction(mxConstants.STYLE_IMAGE, "Image")));
    submenu.add(editor.bind(mxResources.get("shadow"), new ToggleAction(mxConstants.STYLE_SHADOW)));

    submenu.addSeparator();

    submenu.add(editor.bind(mxResources.get("opacity"), new PromptValueAction(mxConstants.STYLE_OPACITY, "Opacity (0-100)")));

    submenu = (JMenu) menu.add(new JMenu(mxResources.get("label")));

    submenu.add(editor.bind(mxResources.get("fontcolor"), new ColorAction("Fontcolor", mxConstants.STYLE_FONTCOLOR),
        "/com/mxgraph/examples/swing/images/fontcolor.gif"));

    submenu.addSeparator();

    submenu.add(editor.bind(mxResources.get("labelFill"), new ColorAction("Label Fill", mxConstants.STYLE_LABEL_BACKGROUNDCOLOR)));
    submenu.add(editor.bind(mxResources.get("labelBorder"), new ColorAction("Label Border", mxConstants.STYLE_LABEL_BORDERCOLOR)));

    submenu.addSeparator();

    submenu.add(editor.bind(mxResources.get("rotateLabel"), new ToggleAction(mxConstants.STYLE_HORIZONTAL, true)));

    submenu.add(editor.bind(mxResources.get("textOpacity"), new PromptValueAction(mxConstants.STYLE_TEXT_OPACITY, "Opacity (0-100)")));

    submenu.addSeparator();

    JMenu subsubmenu = (JMenu) submenu.add(new JMenu(mxResources.get("position")));

    subsubmenu.add(editor.bind(mxResources.get("top"), new SetLabelPositionAction(mxConstants.ALIGN_TOP, mxConstants.ALIGN_BOTTOM)));
    subsubmenu.add(editor.bind(mxResources.get("middle"),
        new SetLabelPositionAction(mxConstants.ALIGN_MIDDLE, mxConstants.ALIGN_MIDDLE)));
    subsubmenu.add(editor.bind(mxResources.get("bottom"), new SetLabelPositionAction(mxConstants.ALIGN_BOTTOM, mxConstants.ALIGN_TOP)));

    subsubmenu.addSeparator();

    subsubmenu.add(editor.bind(mxResources.get("left"), new SetLabelPositionAction(mxConstants.ALIGN_LEFT, mxConstants.ALIGN_RIGHT)));
    subsubmenu.add(editor.bind(mxResources.get("center"),
        new SetLabelPositionAction(mxConstants.ALIGN_CENTER, mxConstants.ALIGN_CENTER)));
    subsubmenu.add(editor.bind(mxResources.get("right"), new SetLabelPositionAction(mxConstants.ALIGN_RIGHT, mxConstants.ALIGN_LEFT)));

    submenu.addSeparator();

    submenu.add(editor.bind(mxResources.get("wordWrap"), new KeyValueAction(mxConstants.STYLE_WHITE_SPACE, "wrap")));
    submenu.add(editor.bind(mxResources.get("noWordWrap"), new KeyValueAction(mxConstants.STYLE_WHITE_SPACE, null)));

    submenu.addSeparator();

    submenu.add(editor.bind(mxResources.get("hide"), new ToggleAction(mxConstants.STYLE_NOLABEL)));

    menu.addSeparator();

    submenu = (JMenu) menu.add(new JMenu(mxResources.get("line")));

    submenu.add(editor.bind(mxResources.get("linecolor"), new ColorAction("Linecolor", mxConstants.STYLE_STROKECOLOR),
        "/com/mxgraph/examples/swing/images/linecolor.gif"));

    submenu.addSeparator();

    submenu.add(editor.bind(mxResources.get("orthogonal"), new ToggleAction(mxConstants.STYLE_ORTHOGONAL)));
    submenu.add(editor.bind(mxResources.get("dashed"), new ToggleAction(mxConstants.STYLE_DASHED)));

    submenu.addSeparator();

    submenu.add(editor.bind(mxResources.get("linewidth"), new PromptValueAction(mxConstants.STYLE_STROKEWIDTH, "Linewidth")));

    submenu = (JMenu) menu.add(new JMenu(mxResources.get("connector")));

    submenu.add(editor.bind(mxResources.get("straight"), new SetStyleAction("straight"),
        "/com/mxgraph/examples/swing/images/straight.gif"));

    submenu.add(editor.bind(mxResources.get("horizontal"), new SetStyleAction(""), "/com/mxgraph/examples/swing/images/connect.gif"));
    submenu.add(editor.bind(mxResources.get("vertical"), new SetStyleAction("vertical"),
        "/com/mxgraph/examples/swing/images/vertical.gif"));

    submenu.addSeparator();

    submenu.add(editor.bind(mxResources.get("entityRelation"), new SetStyleAction("edgeStyle=mxEdgeStyle.EntityRelation"),
        "/com/mxgraph/examples/swing/images/entity.gif"));
    submenu.add(editor.bind(mxResources.get("arrow"), new SetStyleAction("arrow"), "/com/mxgraph/examples/swing/images/arrow.gif"));

    submenu.addSeparator();

    submenu.add(editor.bind(mxResources.get("plain"), new ToggleAction(mxConstants.STYLE_NOEDGESTYLE)));

    menu.addSeparator();

    submenu = (JMenu) menu.add(new JMenu(mxResources.get("linestart")));

    submenu.add(editor.bind(mxResources.get("open"), new KeyValueAction(mxConstants.STYLE_STARTARROW, mxConstants.ARROW_OPEN),
        "/com/mxgraph/examples/swing/images/open_start.gif"));
    submenu.add(editor.bind(mxResources.get("classic"), new KeyValueAction(mxConstants.STYLE_STARTARROW, mxConstants.ARROW_CLASSIC),
        "/com/mxgraph/examples/swing/images/classic_start.gif"));
    submenu.add(editor.bind(mxResources.get("block"), new KeyValueAction(mxConstants.STYLE_STARTARROW, mxConstants.ARROW_BLOCK),
        "/com/mxgraph/examples/swing/images/block_start.gif"));

    submenu.addSeparator();

    submenu.add(editor.bind(mxResources.get("diamond"), new KeyValueAction(mxConstants.STYLE_STARTARROW, mxConstants.ARROW_DIAMOND),
        "/com/mxgraph/examples/swing/images/diamond_start.gif"));
    submenu.add(editor.bind(mxResources.get("oval"), new KeyValueAction(mxConstants.STYLE_STARTARROW, mxConstants.ARROW_OVAL),
        "/com/mxgraph/examples/swing/images/oval_start.gif"));

    submenu.addSeparator();

    submenu.add(editor.bind(mxResources.get("none"), new KeyValueAction(mxConstants.STYLE_STARTARROW, mxConstants.NONE)));
    submenu.add(editor.bind(mxResources.get("size"), new PromptValueAction(mxConstants.STYLE_STARTSIZE, "Linestart Size")));

    submenu = (JMenu) menu.add(new JMenu(mxResources.get("lineend")));

    submenu.add(editor.bind(mxResources.get("open"), new KeyValueAction(mxConstants.STYLE_ENDARROW, mxConstants.ARROW_OPEN),
        "/com/mxgraph/examples/swing/images/open_end.gif"));
    submenu.add(editor.bind(mxResources.get("classic"), new KeyValueAction(mxConstants.STYLE_ENDARROW, mxConstants.ARROW_CLASSIC),
        "/com/mxgraph/examples/swing/images/classic_end.gif"));
    submenu.add(editor.bind(mxResources.get("block"), new KeyValueAction(mxConstants.STYLE_ENDARROW, mxConstants.ARROW_BLOCK),
        "/com/mxgraph/examples/swing/images/block_end.gif"));

    submenu.addSeparator();

    submenu.add(editor.bind(mxResources.get("diamond"), new KeyValueAction(mxConstants.STYLE_ENDARROW, mxConstants.ARROW_DIAMOND),
        "/com/mxgraph/examples/swing/images/diamond_end.gif"));
    submenu.add(editor.bind(mxResources.get("oval"), new KeyValueAction(mxConstants.STYLE_ENDARROW, mxConstants.ARROW_OVAL),
        "/com/mxgraph/examples/swing/images/oval_end.gif"));

    submenu.addSeparator();

    submenu.add(editor.bind(mxResources.get("none"), new KeyValueAction(mxConstants.STYLE_ENDARROW, mxConstants.NONE)));
    submenu.add(editor.bind(mxResources.get("size"), new PromptValueAction(mxConstants.STYLE_ENDSIZE, "Lineend Size")));

    menu.addSeparator();

    submenu = (JMenu) menu.add(new JMenu(mxResources.get("alignment")));

    submenu.add(editor.bind(mxResources.get("left"), new KeyValueAction(mxConstants.STYLE_ALIGN, mxConstants.ALIGN_LEFT),
        "/com/mxgraph/examples/swing/images/left.gif"));
    submenu.add(editor.bind(mxResources.get("center"), new KeyValueAction(mxConstants.STYLE_ALIGN, mxConstants.ALIGN_CENTER),
        "/com/mxgraph/examples/swing/images/center.gif"));
    submenu.add(editor.bind(mxResources.get("right"), new KeyValueAction(mxConstants.STYLE_ALIGN, mxConstants.ALIGN_RIGHT),
        "/com/mxgraph/examples/swing/images/right.gif"));

    submenu.addSeparator();

    submenu.add(editor.bind(mxResources.get("top"), new KeyValueAction(mxConstants.STYLE_VERTICAL_ALIGN, mxConstants.ALIGN_TOP),
        "/com/mxgraph/examples/swing/images/top.gif"));
    submenu.add(editor.bind(mxResources.get("middle"), new KeyValueAction(mxConstants.STYLE_VERTICAL_ALIGN, mxConstants.ALIGN_MIDDLE),
        "/com/mxgraph/examples/swing/images/middle.gif"));
    submenu.add(editor.bind(mxResources.get("bottom"), new KeyValueAction(mxConstants.STYLE_VERTICAL_ALIGN, mxConstants.ALIGN_BOTTOM),
        "/com/mxgraph/examples/swing/images/bottom.gif"));

    submenu = (JMenu) menu.add(new JMenu(mxResources.get("spacing")));

    submenu.add(editor.bind(mxResources.get("top"), new PromptValueAction(mxConstants.STYLE_SPACING_TOP, "Top Spacing")));
    submenu.add(editor.bind(mxResources.get("right"), new PromptValueAction(mxConstants.STYLE_SPACING_RIGHT, "Right Spacing")));
    submenu.add(editor.bind(mxResources.get("bottom"), new PromptValueAction(mxConstants.STYLE_SPACING_BOTTOM, "Bottom Spacing")));
    submenu.add(editor.bind(mxResources.get("left"), new PromptValueAction(mxConstants.STYLE_SPACING_LEFT, "Left Spacing")));

    submenu.addSeparator();

    submenu.add(editor.bind(mxResources.get("global"), new PromptValueAction(mxConstants.STYLE_SPACING, "Spacing")));

    submenu.addSeparator();

    submenu.add(editor.bind(mxResources.get("sourceSpacing"), new PromptValueAction(mxConstants.STYLE_SOURCE_PERIMETER_SPACING,
        mxResources.get("sourceSpacing"))));
    submenu.add(editor.bind(mxResources.get("targetSpacing"), new PromptValueAction(mxConstants.STYLE_TARGET_PERIMETER_SPACING,
        mxResources.get("targetSpacing"))));

    submenu.addSeparator();

    submenu.add(editor.bind(mxResources.get("perimeter"), new PromptValueAction(mxConstants.STYLE_PERIMETER_SPACING,
        "Perimeter Spacing")));

    submenu = (JMenu) menu.add(new JMenu(mxResources.get("direction")));

    submenu.add(editor.bind(mxResources.get("north"), new KeyValueAction(mxConstants.STYLE_DIRECTION, mxConstants.DIRECTION_NORTH)));
    submenu.add(editor.bind(mxResources.get("east"), new KeyValueAction(mxConstants.STYLE_DIRECTION, mxConstants.DIRECTION_EAST)));
    submenu.add(editor.bind(mxResources.get("south"), new KeyValueAction(mxConstants.STYLE_DIRECTION, mxConstants.DIRECTION_SOUTH)));
    submenu.add(editor.bind(mxResources.get("west"), new KeyValueAction(mxConstants.STYLE_DIRECTION, mxConstants.DIRECTION_WEST)));

    submenu.addSeparator();

    submenu.add(editor.bind(mxResources.get("rotation"), new PromptValueAction(mxConstants.STYLE_ROTATION, "Rotation (0-360)")));

    menu.addSeparator();

    menu.add(editor.bind(mxResources.get("rounded"), new ToggleAction(mxConstants.STYLE_ROUNDED)));

    menu.add(editor.bind(mxResources.get("style"), new StyleAction()));
  }

  /**
   *
   */
  public static class InsertGraph extends AbstractAction
  {

    /**
     *
     */
    private static final long serialVersionUID = 4010463992665008365L;

    /**
     *
     */
    protected GraphType graphType;

    protected mxAnalysisGraph aGraph;

    /**
     * @param aGraph
     *
     */
    public InsertGraph(GraphType tree, mxAnalysisGraph aGraph)
    {
      this.graphType = tree;
      this.aGraph = aGraph;
    }

    /**
     *
     */
    public void actionPerformed(ActionEvent e)
    {
      if (e.getSource() instanceof mxGraphComponent)
      {
        mxGraphComponent graphComponent = (mxGraphComponent) e.getSource();
        mxGraph graph = graphComponent.getGraph();

        // dialog = new FactoryConfigDialog();
        String dialogText = "";
        if (graphType == GraphType.NULL)
          dialogText = "Configure null graph";
        else if (graphType == GraphType.COMPLETE)
          dialogText = "Configure complete graph";
        else if (graphType == GraphType.NREGULAR)
          dialogText = "Configure n-regular graph";
        else if (graphType == GraphType.GRID)
          dialogText = "Configure grid graph";
        else if (graphType == GraphType.BIPARTITE)
          dialogText = "Configure bipartite graph";
        else if (graphType == GraphType.COMPLETE_BIPARTITE)
          dialogText = "Configure complete bipartite graph";
        else if (graphType == GraphType.BFS_DIR)
          dialogText = "Configure BFS algorithm";
        else if (graphType == GraphType.BFS_UNDIR)
          dialogText = "Configure BFS algorithm";
        else if (graphType == GraphType.DFS_DIR)
          dialogText = "Configure DFS algorithm";
        else if (graphType == GraphType.DFS_UNDIR)
          dialogText = "Configure DFS algorithm";
        else if (graphType == GraphType.DIJKSTRA)
          dialogText = "Configure Dijkstra's algorithm";
        else if (graphType == GraphType.BELLMAN_FORD)
          dialogText = "Configure Bellman-Ford algorithm";
        else if (graphType == GraphType.MAKE_TREE_DIRECTED)
          dialogText = "Configure make tree directed algorithm";
        else if (graphType == GraphType.KNIGHT_TOUR)
          dialogText = "Configure knight's tour";
        else if (graphType == GraphType.GET_ADJ_MATRIX)
          dialogText = "Configure adjacency matrix";
        else if (graphType == GraphType.FROM_ADJ_MATRIX)
          dialogText = "Input adjacency matrix";
        else if (graphType == GraphType.PETERSEN)
          dialogText = "Configure Petersen graph";
        else if (graphType == GraphType.WHEEL)
          dialogText = "Configure Wheel graph";
        else if (graphType == GraphType.STAR)
          dialogText = "Configure Star graph";
        else if (graphType == GraphType.PATH)
          dialogText = "Configure Path graph";
        else if (graphType == GraphType.FRIENDSHIP_WINDMILL)
          dialogText = "Configure Friendship Windmill graph";
        else if (graphType == GraphType.INDEGREE)
          dialogText = "Configure indegree analysis";
        else if (graphType == GraphType.OUTDEGREE)
          dialogText = "Configure outdegree analysis";
        GraphConfigDialog dialog = new GraphConfigDialog(graphType, dialogText);
        dialog.configureLayout(graph, graphType, aGraph);
        dialog.setModal(true);
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        Dimension frameSize = dialog.getSize();
        dialog.setLocation(screenSize.width / 2 - (frameSize.width / 2), screenSize.height / 2 - (frameSize.height / 2));
        dialog.setVisible(true);
      }
    }
  }

  /**
   *
   */
  public static class AnalyzeGraph extends AbstractAction
  {
    /**
     *
     */
    private static final long serialVersionUID = 6926170745240507985L;

    mxAnalysisGraph aGraph;

    /**
     *
     */
    protected AnalyzeType analyzeType;

    /**
     * Examples for calling analysis methods from mxGraphStructure
     */
    public AnalyzeGraph(AnalyzeType analyzeType, mxAnalysisGraph aGraph)
    {
      this.analyzeType = analyzeType;
      this.aGraph = aGraph;
    }

    public void actionPerformed(ActionEvent e)
    {
      if (e.getSource() instanceof mxGraphComponent)
      {
        mxGraphComponent graphComponent = (mxGraphComponent) e.getSource();
        mxGraph graph = graphComponent.getGraph();

        if (analyzeType == AnalyzeType.IS_CONNECTED)
        {
          boolean isConnected = mxGraphStructure.isConnected(aGraph);

          if (isConnected)
          {
            System.out.println("The graph is connected");
          }
          else
          {
            System.out.println("The graph is not connected");
          }
        }
        else if (analyzeType == AnalyzeType.IS_SIMPLE)
        {
          boolean isSimple = mxGraphStructure.isSimple(aGraph);

          if (isSimple)
          {
            System.out.println("The graph is simple");
          }
          else
          {
            System.out.println("The graph is not simple");
          }
        }
        else if (analyzeType == AnalyzeType.IS_CYCLIC_DIRECTED)
        {
          boolean isCyclicDirected = mxGraphStructure.isCyclicDirected(aGraph);

          if (isCyclicDirected)
          {
            System.out.println("The graph is cyclic directed");
          }
          else
          {
            System.out.println("The graph is acyclic directed");
          }
        }
        else if (analyzeType == AnalyzeType.IS_CYCLIC_UNDIRECTED)
        {
          boolean isCyclicUndirected = mxGraphStructure.isCyclicUndirected(aGraph);

          if (isCyclicUndirected)
          {
            System.out.println("The graph is cyclic undirected");
          }
          else
          {
            System.out.println("The graph is acyclic undirected");
          }
        }
        else if (analyzeType == AnalyzeType.COMPLEMENTARY)
        {
          graph.getModel().beginUpdate();

          mxGraphStructure.complementaryGraph(aGraph);

          mxGraphStructure.setDefaultGraphStyle(aGraph, true);
          graph.getModel().endUpdate();
        }
        else if (analyzeType == AnalyzeType.REGULARITY)
        {
          try
          {
            int regularity = mxGraphStructure.regularity(aGraph);
            System.out.println("Graph regularity is: " + regularity);
          }
          catch (StructuralException e1)
          {
            System.out.println("The graph is irregular");
          }
        }
        else if (analyzeType == AnalyzeType.COMPONENTS)
        {
          Object[][] components = mxGraphStructure.getGraphComponents(aGraph);
          mxIGraphModel model = aGraph.getGraph().getModel();

          for (int i = 0; i < components.length; i++)
          {
            System.out.print("Component " + i + " :");

            for (int j = 0; j < components[i].length; j++)
            {
              System.out.print(" " + model.getValue(components[i][j]));
            }

            System.out.println(".");
          }

          System.out.println("Number of components: " + components.length);

        }
        else if (analyzeType == AnalyzeType.MAKE_CONNECTED)
        {
          graph.getModel().beginUpdate();

          if (!mxGraphStructure.isConnected(aGraph))
          {
            mxGraphStructure.makeConnected(aGraph);
            mxGraphStructure.setDefaultGraphStyle(aGraph, false);
          }

          graph.getModel().endUpdate();
        }
        else if (analyzeType == AnalyzeType.MAKE_SIMPLE)
        {
          mxGraphStructure.makeSimple(aGraph);
        }
        else if (analyzeType == AnalyzeType.IS_TREE)
        {
          boolean isTree = mxGraphStructure.isTree(aGraph);

          if (isTree)
          {
            System.out.println("The graph is a tree");
          }
          else
          {
            System.out.println("The graph is not a tree");
          }
        }
        else if (analyzeType == AnalyzeType.ONE_SPANNING_TREE)
        {
          try
          {
            graph.getModel().beginUpdate();
            aGraph.getGenerator().oneSpanningTree(aGraph, true, true);
            mxGraphStructure.setDefaultGraphStyle(aGraph, false);
            graph.getModel().endUpdate();
          }
          catch (StructuralException e1)
          {
            System.out.println("The graph must be simple and connected");
          }
        }
        else if (analyzeType == AnalyzeType.IS_DIRECTED)
        {
          boolean isDirected = mxGraphProperties.isDirected(aGraph.getProperties(), mxGraphProperties.DEFAULT_DIRECTED);

          if (isDirected)
          {
            System.out.println("The graph is directed.");
          }
          else
          {
            System.out.println("The graph is undirected.");
          }
        }
        else if (analyzeType == AnalyzeType.GET_CUT_VERTEXES)
        {
          Object[] cutVertices = mxGraphStructure.getCutVertices(aGraph);

          System.out.print("Cut vertices of the graph are: [");
          mxIGraphModel model = aGraph.getGraph().getModel();

          for (int i = 0; i < cutVertices.length; i++)
          {
            System.out.print(" " + model.getValue(cutVertices[i]));
          }

          System.out.println(" ]");
        }
        else if (analyzeType == AnalyzeType.GET_CUT_EDGES)
        {
          Object[] cutEdges = mxGraphStructure.getCutEdges(aGraph);

          System.out.print("Cut edges of the graph are: [");
          mxIGraphModel model = aGraph.getGraph().getModel();

          for (int i = 0; i < cutEdges.length; i++)
          {
            System.out.print(" " + Integer.parseInt((String) model.getValue(aGraph.getTerminal(cutEdges[i], true))) + "-"
                + Integer.parseInt((String) model.getValue(aGraph.getTerminal(cutEdges[i], false))));
          }

          System.out.println(" ]");
        }
        else if (analyzeType == AnalyzeType.GET_SOURCES)
        {
          try
          {
            Object[] sourceVertices = mxGraphStructure.getSourceVertices(aGraph);
            System.out.print("Source vertices of the graph are: [");
            mxIGraphModel model = aGraph.getGraph().getModel();

            for (int i = 0; i < sourceVertices.length; i++)
            {
              System.out.print(" " + model.getValue(sourceVertices[i]));
            }

            System.out.println(" ]");
          }
          catch (StructuralException e1)
          {
            System.out.println(e1);
          }
        }
        else if (analyzeType == AnalyzeType.GET_SINKS)
        {
          try
          {
            Object[] sinkVertices = mxGraphStructure.getSinkVertices(aGraph);
            System.out.print("Sink vertices of the graph are: [");
            mxIGraphModel model = aGraph.getGraph().getModel();

            for (int i = 0; i < sinkVertices.length; i++)
            {
              System.out.print(" " + model.getValue(sinkVertices[i]));
            }

            System.out.println(" ]");
          }
          catch (StructuralException e1)
          {
            System.out.println(e1);
          }
        }
        else if (analyzeType == AnalyzeType.PLANARITY)
        {
          //TODO implement
        }
        else if (analyzeType == AnalyzeType.IS_BICONNECTED)
        {
          boolean isBiconnected = mxGraphStructure.isBiconnected(aGraph);

          if (isBiconnected)
          {
            System.out.println("The graph is biconnected.");
          }
          else
          {
            System.out.println("The graph is not biconnected.");
          }
        }
        else if (analyzeType == AnalyzeType.GET_BICONNECTED)
        {
          //TODO implement
        }
        else if (analyzeType == AnalyzeType.SPANNING_TREE)
        {
          //TODO implement
        }
        else if (analyzeType == AnalyzeType.FLOYD_ROY_WARSHALL)
        {
         
          ArrayList<Object[][]> FWIresult = new ArrayList<Object[][]>();
          try
          {
            //only this line is needed to get the result from Floyd-Roy-Warshall, the rest is code for displaying the result
            FWIresult = mxTraversal.floydRoyWarshall(aGraph);

            Object[][] dist = FWIresult.get(0);
            Object[][] paths = FWIresult.get(1);
            Object[] vertices = aGraph.getChildVertices(aGraph.getGraph().getDefaultParent());
            int vertexNum = vertices.length;
            System.out.println("Distances are:");

            for (int i = 0; i < vertexNum; i++)
            {
              System.out.print("[");

              for (int j = 0; j < vertexNum; j++)
              {
                System.out.print(" " + Math.round((Double) dist[i][j] * 100.0) / 100.0);
              }

              System.out.println("] ");
            }

            System.out.println("Path info:");

            mxCostFunction costFunction = aGraph.getGenerator().getCostFunction();
            mxGraphView view = aGraph.getGraph().getView();

            for (int i = 0; i < vertexNum; i++)
            {
              System.out.print("[");

              for (int j = 0; j < vertexNum; j++)
              {
                if (paths[i][j] != null)
                {
                  System.out.print(" " + costFunction.getCost(view.getState(paths[i][j])));
                }
                else
                {
                  System.out.print(" -");
                }
              }

              System.out.println(" ]");
            }

            try
            {
              Object[] path = mxTraversal.getWFIPath(aGraph, FWIresult, vertices[0], vertices[vertexNum - 1]);
              System.out.print("The path from " + costFunction.getCost(view.getState(vertices[0])) + " to "
                  + costFunction.getCost((view.getState(vertices[vertexNum - 1]))) + " is:");

              for (int i = 0; i < path.length; i++)
              {
                System.out.print(" " + costFunction.getCost(view.getState(path[i])));
              }

              System.out.println();
            }
            catch (StructuralException e1)
            {
              System.out.println(e1);
            }
          }
          catch (StructuralException e2)
          {
            System.out.println(e2);
          }
        }
      }
    }
  };
};
TOP

Related Classes of com.mxgraph.examples.swing.editor.EditorMenuBar$AnalyzeGraph

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.