
import java.awt.*;
import java.util.*;
import simulatedAnnealing.*;

class MapComponent extends NonFlushingPanel {

  private static final Color FLIGHTS_DEFAULT_COLOR = new Color(0,51,51);
  private static final Color DEFAULT_FRAME_COLOR = Color.blue;
  private static final int DEFAULT_FRAME_WEIGHT=3;

  private Color flightsColor = FLIGHTS_DEFAULT_COLOR;
  private Color frameColor = DEFAULT_FRAME_COLOR;
  private int frameWeight = DEFAULT_FRAME_WEIGHT;

  private String mapFile;
  Image map;
  Vector cities = new Vector();
  int[] path;
  private boolean drawCities;
  private boolean drawPath=false;

  public MapComponent(String mapFile) {
    this.mapFile=mapFile;
  }

  public void drawingPathOn() {
    drawPath=true;
    repaint();
  }

  public void paintBackground(Graphics g) {
    map = getToolkit().getImage(mapFile);
    g.drawImage(map,0,0,this);
    g.setColor(frameColor);
    for (int i=0; i<frameWeight; i++)
      g.drawRect(i,i,size().width-2*i,size().height-2*i);
    }

  public void paintNoFlushes(Graphics g) {
    map = getToolkit().getImage(mapFile);
    g.drawImage(map,0,0,this);
    if (drawPath) {
      drawPath(g);
    }
    g.setColor(frameColor);
    for (int i=0; i<frameWeight; i++)
      g.drawRect(i,i,size().width-2*i,size().height-2*i);
  }

  protected void drawFlight(Graphics g,City c1, City c2) {
    g.setColor(flightsColor);
    int x1=(int)c1.getX();
    int y1=(int)c1.getY();
    int x2=(int)c2.getX();
    int y2=(int)c2.getY();
    g.drawLine(x1,y1,x2,y2);
  }

  private void drawPath(Graphics g) {
    int n = cities.size();
    if (n<=1)
      return;
    for (int i=0; i<n; i++) {
      City source = (City) cities.elementAt(path[i]);
      City dest = (City) cities.elementAt(path[(i+1)%n]);
      drawFlight(g,source,dest);
    }
  }

  public void addCities(String[] names,int[][] positions) {
    if (names.length!=positions.length)
      return;
    for (int i=0; i<positions.length; i++)
      cities.addElement(new City(names[i],positions[i][0],positions[i][1]));
    path=simplePermutation(positions.length);
  }

  static int[] simplePermutation(int n) {
    int[] permutation = new int[n];
    for (int i=0; i<n; i++)
      permutation[i]=i+1;
    return permutation;
  }

  public void setPath(int[] path) {
    this.path=path;
  }

  public int[] getPath() {
    return path;
  }

  public City[] getCities() {
    City[] temp = new City[cities.size()];
    cities.copyInto(temp);
    return temp;
  }
}

