/** @param args the command line arguments */
  public static void main(String[] args) {
    JFrame frame = new JFrame("Editing and Mouse Menu Demo");
    SparseMultigraph<GraphElements.MyVertex, GraphElements.MyEdge> g =
        new SparseMultigraph<GraphElements.MyVertex, GraphElements.MyEdge>();
    // Layout<V, E>, VisualizationViewer<V,E>
    //        Map<GraphElements.MyVertex,Point2D> vertexLocations = new
    // HashMap<GraphElements.MyVertex, Point2D>();
    Layout<GraphElements.MyVertex, GraphElements.MyEdge> layout = new StaticLayout(g);
    layout.setSize(new Dimension(300, 300));
    VisualizationViewer<GraphElements.MyVertex, GraphElements.MyEdge> vv =
        new VisualizationViewer<GraphElements.MyVertex, GraphElements.MyEdge>(layout);
    vv.setPreferredSize(new Dimension(350, 350));
    // Show vertex and edge labels
    vv.getRenderContext().setVertexLabelTransformer(new ToStringLabeller());
    vv.getRenderContext().setEdgeLabelTransformer(new ToStringLabeller());
    // Create a graph mouse and add it to the visualization viewer
    EditingModalGraphMouse gm =
        new EditingModalGraphMouse(
            vv.getRenderContext(),
            GraphElements.MyVertexFactory.getInstance(),
            GraphElements.MyEdgeFactory.getInstance());
    // Set some defaults for the Edges...
    GraphElements.MyEdgeFactory.setDefaultCapacity(192.0);
    GraphElements.MyEdgeFactory.setDefaultWeight(5.0);
    // Trying out our new popup menu mouse plugin...
    PopupVertexEdgeMenuMousePlugin myPlugin = new PopupVertexEdgeMenuMousePlugin();
    // Add some popup menus for the edges and vertices to our mouse plugin.
    JPopupMenu edgeMenu = new MyMouseMenus.EdgeMenu(frame);
    JPopupMenu vertexMenu = new MyMouseMenus.VertexMenu();
    myPlugin.setEdgePopup(edgeMenu);
    myPlugin.setVertexPopup(vertexMenu);
    gm.remove(gm.getPopupEditingPlugin()); // Removes the existing popup editing plugin

    gm.add(myPlugin); // Add our new plugin to the mouse

    vv.setGraphMouse(gm);

    // JFrame frame = new JFrame("Editing and Mouse Menu Demo");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().add(vv);

    // Let's add a menu for changing mouse modes
    JMenuBar menuBar = new JMenuBar();
    JMenu modeMenu = gm.getModeMenu();
    modeMenu.setText("Mouse Mode");
    modeMenu.setIcon(null); // I'm using this in a main menu
    modeMenu.setPreferredSize(new Dimension(80, 20)); // Change the size so I can see the text

    menuBar.add(modeMenu);
    frame.setJMenuBar(menuBar);
    gm.setMode(ModalGraphMouse.Mode.EDITING); // Start off in editing mode
    frame.pack();
    frame.setVisible(true);
  }
  private void setMouseSettings() {
    // mouse interaction
    EditingModalGraphMouse<VertexNode, EdgeLink> gm =
        new EditingModalGraphMouse<VertexNode, EdgeLink>(getRenderContext(), vFactory, eFactory);

    // Trying out our new popup menu mouse plugin...
    PopupMousePlugin<VertexNode, EdgeLink> myPlugin = new PopupMousePlugin<VertexNode, EdgeLink>();

    gm.remove(gm.getPopupEditingPlugin()); // Removes the existing popup editing plugin
    gm.add(myPlugin); // Add our new plugin to the mouse

    // need an editing mouse that will notify when an edge is potentially created
    EditingNotifyingMousePlugin<VertexNode, EdgeLink> myEditor =
        new EditingNotifyingMousePlugin<VertexNode, EdgeLink>();

    gm.add(myEditor);

    setGraphMouse(gm);

    // menu bar
    JMenuBar bar = new JMenuBar();
    JMenu modeMenu = gm.getModeMenu();
    modeMenu.setText("Mouse Mode");
    modeMenu.setIcon(null); // I'm using this in a main menu
    modeMenu.setPreferredSize(new Dimension(200, 20)); // Change the size so I can see the text
    gm.setMode(ModalGraphMouse.Mode.EDITING); // Start off in editing mode

    JMenuItem refresh = new JMenuItem("Refresh Screen");
    refresh.addActionListener(
        new ActionListener() {
          public void actionPerformed(ActionEvent arg0) {
            stateChanged(null);
          }
        });

    bar.add(modeMenu);
    bar.add(refresh);
    add(bar);
  }
  @SuppressWarnings({"unchecked", "rawtypes"})
  public static void main(String[] args) {

    final EditingGraphViewer sgv = new EditingGraphViewer();

    // Layout<V, E>, VisualizationViewer<V,E>
    final Layout<Integer, String> layout = new StaticLayout<Integer, String>(g);
    layout.setSize(new Dimension(300, 300));
    final VisualizationViewer<Integer, String> vv =
        new VisualizationViewer<Integer, String>(layout);
    vv.setBackground(Color.white);
    vv.setPreferredSize(new Dimension(350, 350));

    Transformer<Integer, Paint> vertexPaint =
        new Transformer<Integer, Paint>() {
          public Paint transform(Integer i) {
            return (Paint) Color.WHITE;
          }
        };
    vv.getRenderContext()
        .setVertexFillPaintTransformer((Transformer<Integer, java.awt.Paint>) vertexPaint);

    // Show vertex and edge labels
    vv.getRenderContext().setVertexLabelTransformer(new ToStringLabeller<Integer>());
    vv.getRenderContext().setEdgeLabelTransformer(new ToStringLabeller<String>());

    // Create a graph mouse and add it to the visualization viewer
    // Our Vertices are going to be Integer objects so we need an Integer factory
    EditingModalGraphMouse gm =
        new EditingModalGraphMouse(vv.getRenderContext(), sgv.vertexFactory, sgv.edgeFactory);
    vv.setGraphMouse(gm);

    JFrame frame = new JFrame("Editing Graph");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().add(vv);

    // ===========================================================================
    // Menu for changing mouse modes

    JMenuBar menuBar = new JMenuBar();
    JMenu modeMenu = gm.getModeMenu();
    modeMenu.setText("Mode");
    modeMenu.setIcon(null);
    modeMenu.setPreferredSize(new Dimension(80, 20));
    menuBar.add(modeMenu);

    // ---------------------------------------------------------------------------
    // Menu Item to compute Centrality Measures

    JMenu centrality = new JMenu("Centrality");
    JMenuItem execB = new JMenuItem("Betweenness C.");
    execB.addActionListener(
        new ActionListener() {
          @Override
          public void actionPerformed(ActionEvent e) {
            Betweenness.compute(g);
          }
        });
    centrality.add(execB);

    JMenuItem execC = new JMenuItem("Closeness C");
    execC.addActionListener(
        new ActionListener() {
          @Override
          public void actionPerformed(ActionEvent e) {
            Closeness.compute(g);
          }
        });
    centrality.add(execC);

    menuBar.add(centrality);

    // ---------------------------------------------------------------------------
    // Menu Item to change Vertices Color
    colorArray.add(2);

    JMenu selColor = new JMenu("NodeColor");

    JMenuItem selBlack = new JMenuItem("black");
    selBlack.addActionListener(
        new ActionListener() {
          @Override
          public void actionPerformed(ActionEvent e) {

            colorArray.add(1);
            int v = g.getVertexCount();
            for (int j = 0; j < nodeArray.size(); j++) v = v - nodeArray.get(j);
            int vC = g.getVertexCount();
            nodeArray.add(v);
            SelectColor.choiceColor(1, vv, nodeArray, colorArray, vC);
          }
        });
    selColor.add(selBlack);

    JMenuItem selGray = new JMenuItem("gray");
    selGray.addActionListener(
        new ActionListener() {
          @Override
          public void actionPerformed(ActionEvent e) {

            colorArray.add(0);
            int v = g.getVertexCount();
            for (int j = 0; j < nodeArray.size(); j++) v = v - nodeArray.get(j);
            nodeArray.add(v);
            int vC = g.getVertexCount();
            SelectColor.choiceColor(0, vv, nodeArray, colorArray, vC);
          }
        });
    selColor.add(selGray);

    JMenuItem selWhite = new JMenuItem("white");
    selWhite.addActionListener(
        new ActionListener() {
          @Override
          public void actionPerformed(ActionEvent e) {

            colorArray.add(2);
            int v = g.getVertexCount();
            for (int j = 0; j < nodeArray.size(); j++) v = v - nodeArray.get(j);
            nodeArray.add(v);
            int vC = g.getVertexCount();
            SelectColor.choiceColor(2, vv, nodeArray, colorArray, vC);
          }
        });
    selColor.add(selWhite);

    JMenuItem selYellow = new JMenuItem("yellow");
    selYellow.addActionListener(
        new ActionListener() {
          @Override
          public void actionPerformed(ActionEvent e) {

            colorArray.add(3);
            int v = g.getVertexCount();
            for (int j = 0; j < nodeArray.size(); j++) v = v - nodeArray.get(j);
            nodeArray.add(v);
            int vC = g.getVertexCount();
            SelectColor.choiceColor(3, vv, nodeArray, colorArray, vC);
          }
        });
    selColor.add(selYellow);

    menuBar.add(selColor);

    // ------------------------------------------------------------------------------------
    // MenuItem to save the graph as jpeg ,or eps, or to save code generation graph

    JMenu saveImg = new JMenu("Save");

    JMenuItem saveJPG = new JMenuItem("Save as jpeg");
    saveJPG.addActionListener(
        new ActionListener() {

          @Override
          public void actionPerformed(ActionEvent e) {

            Save.saveJpeg(vv);
          }
        });

    saveImg.add(saveJPG);

    JMenuItem saveEPS = new JMenuItem("Save as eps");
    saveEPS.addActionListener(
        new ActionListener() {

          @Override
          public void actionPerformed(ActionEvent e) {

            Save.saveEps(vv);
          }
        });

    saveImg.add(saveEPS);

    JMenuItem saveCode = new JMenuItem("Save Graph Code");
    saveCode.addActionListener(
        new ActionListener() {

          @Override
          public void actionPerformed(ActionEvent e) {

            Save.saveCode(g, colorArray, nodeArray);
          }
        });

    saveImg.add(saveCode);

    menuBar.add(saveImg);

    // -------------------------------------------------------------------------------------

    frame.setJMenuBar(menuBar);
    gm.setMode(ModalGraphMouse.Mode.EDITING); // Start off in editing mode

    frame.pack();
    frame.setVisible(true);
  }