package buildings;
import java.awt.Graphics;
import java.awt.Polygon;
import java.awt.Rectangle;
import java.awt.geom.Point2D;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintStream;
import java.util.Iterator;
import java.util.LinkedList;
import action.CupActionBlock;
import action.CupActionDeleteBuilding;
import action.CupActionStack;
import javafx.application.Platform;
import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;
import map.MapLayer;
import markers.Marker;
import markers.MarkerList;
import overpass.OsmOverpass;
import utilities.MapCalc;
/**
* @author Ahcene Bounceur
* @version 1.0
*/
public class BuildingList extends Thread {
public static LinkedList<Building> buildings = null;
public BuildingList() {
buildings = new LinkedList<Building>();
}
public static void add(String str) {
Building building = new Building(str);
MapLayer.mapViewer.addMouseListener(building);
MapLayer.mapViewer.addKeyListener(building);
buildings.add(building);
}
public static void add(String [] str) {
for(int i=0; i<str.length; i++) {
buildings.add(new Building(str));
}
}
public static void add(Building building) {
buildings.add(building);
}
public void draw(Graphics g) {
for(int i=0; i<buildings.size(); i++) {
buildings.get(i).draw(g);
}
}
public static void init() {
if(buildings != null) {
for(Building building : buildings) {
MapLayer.mapViewer.removeMouseListener(building);
MapLayer.mapViewer.removeKeyListener(building);
building = null;
}
buildings = new LinkedList<Building>();
}
}
public static void loadFromOsm() {
if(MarkerList.markers.size()==2) {
Marker marker1 = MarkerList.markers.get(0);
Marker marker2 = MarkerList.markers.get(1);
double m1x = marker1.getLongitude();
double m1y = marker1.getLatitude();
double m2x = marker2.getLongitude();
double m2y = marker2.getLatitude();
OsmOverpass ovp = new OsmOverpass(m1x, m1y, m2x, m2y);
ovp.start();
}
else {
Platform.runLater(new Runnable() {
@Override
public void run() {
Alert alert = new Alert(AlertType.WARNING);
alert.setTitle("Markers");
alert.setHeaderText(null);
alert.setContentText("The number of markers must be 2!");
alert.showAndWait();
}
});
}
}
public static void save(String fileName) {
try {
PrintStream fos = new PrintStream(new FileOutputStream(fileName));
fos.print("# CupCarbon\n");
fos.print("# Buildings\n");
fos.print("# -----------------------\n");
fos.print("# -----------------------\n");
for (Building building : buildings) {
for(int i=0; i<building.getNPoints(); i++) {
fos.print(building.getXCoords(i)+" ");
fos.print(building.getYCoords(i)+" ");
}
fos.println();
}
fos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
public static void open(String fileName) {
init();
try {
BufferedReader br = new BufferedReader(new FileReader(fileName));
String line;
line = br.readLine();
line = br.readLine();
line = br.readLine();
line = br.readLine();
while ((line = br.readLine()) != null) {
BuildingList.add(line);
}
br.close();
MapLayer.repaint();
} catch (FileNotFoundException e) {
System.out.println("[BuildingList] No buildings.");
} catch (IOException e) {
e.printStackTrace();
}
}
public void deleteIfSelected() {
CupActionBlock block = new CupActionBlock();
Building building;
for (Iterator<Building> iterator = buildings.iterator(); iterator.hasNext();) {
building = iterator.next();
if (building.isSelected() && !building.isHide()) {
CupActionDeleteBuilding action = new CupActionDeleteBuilding(building);
block.addAction(action);
}
}
if(block.size()>0) {
CupActionStack.add(block);
CupActionStack.execute();
}
}
public static void delete(Building building) {
buildings.remove(building);
}
public static boolean intersect(Polygon p) {
for (int i=0; i<buildings.size(); i++) {
if (buildings.get(i).intersect(p))
return true;
}
return false;
}
public static int size() {
return buildings.size();
}
public void selectInsideRectangle(int cadreX1, int cadreY1, int cadreX2, int cadreY2) {
Point2D p1 = MapCalc.pixelPanelToPixelMap(cadreX1, cadreY1);
Point2D p2 = MapCalc.pixelPanelToPixelMap(cadreX2, cadreY2);
Building b = new Building(4);
b.setInt((int)p1.getX(), (int)p1.getY(), 0);
b.setInt((int)p2.getX(), (int)p1.getY(), 1);
b.setInt((int)p2.getX(), (int)p2.getY(), 2);
b.setInt((int)p1.getX(), (int)p2.getY(), 3);
Rectangle rec = new Rectangle((int)p1.getX(), (int)p1.getY(), (int)(p2.getX()-p1.getX()), (int)(p2.getY()-p1.getY()));
for (Building building : buildings) {
building.setSelection(false);
if(!building.isHide() && building.getPoly().intersects(rec))
building.setSelection(true);
}
}
public void setSelectionOfAllBuildings(boolean selection, boolean addSelect) {
for (Building building : buildings) {
if (!addSelect)
building.setSelection(false);
building.setSelection(selection);
}
MapLayer.repaint();
}
public static void deselectAll() {
for(Building building : buildings) {
building.setSelection(false);
}
}
public static void showHideBuildings() {
for(Building building : buildings) {
building.setHide(!building.isHide());
}
}
@Override
public String toString() {
String s = "";
for(Building building : buildings) {
s += building.toString() + " ";
}
return s;
}
}