@Override public void mouseClicked(MouseEvent event, StateRenderer2D source) { if (event.getButton() == MouseEvent.BUTTON3) { JPopupMenu popup = new JPopupMenu(); popup .add("Generate plans locally") .addActionListener( new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { solve(); } }); popup .add("Clear polygon") .addActionListener( new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { pe = null; vertexCount = 0; } }); popup .add("Settings") .addActionListener( new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { PropertiesEditor.editProperties(AreaCoveragePlanner.this, getConsole(), true); } }); popup.show(source, event.getX(), event.getY()); } else if (pe == null) { LocationType l = source.getRealWorldLocation(event.getPoint()); pe = new PathElement( MapGroup.getMapGroupInstance(getConsole().getMission()), new MapType(), l); pe.setMyColor(Color.green.brighter()); pe.setShape(true); pe.setFinished(true); pe.setStroke(new BasicStroke(2.0f)); pe.addPoint(0, 0, 0, false); vertexCount = 1; } else { LocationType l = source.getRealWorldLocation(event.getPoint()); double[] offsets = l.getOffsetFrom(pe.getCenterLocation()); pe.addPoint(offsets[1], offsets[0], 0, false); vertexCount++; } }