package application.view;
import javafx.scene.input.MouseEvent;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Line;
import application.model.Kante;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;
import javafx.scene.control.Button;
import javafx.scene.control.ButtonBar.ButtonData;
import javafx.scene.control.ButtonType;
import javafx.scene.control.Menu;
import javafx.scene.control.MenuItem;
import javafx.scene.control.TextInputDialog;
import javafx.scene.effect.Light.Point;
import javafx.scene.layout.AnchorPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Line;
public class Handlungsreisender_1_Controller {
/*public Handlungsreisender_1_Controller(double xpos, double ypos, int CN, int KN, Color f, int Kreisanzahl) {
super(xpos, ypos, CN, KN, f, Kreisanzahl);
// TODO Auto-generated constructor stub
}*/
/* fx-Komponenten */
@FXML protected Button NeuesProblemButton;
@FXML protected Button loesungVergleichenButton;
@FXML protected Button loesungAnzeigenButton;
@FXML protected Menu programmMenu;
@FXML protected MenuItem neuesProblemMenuItem;
@FXML protected MenuItem beendenMenuItem;
@FXML protected Menu hilfeMenu;
@FXML protected MenuItem zielMenuItem;
@FXML protected MenuItem ueberMenueItem;
@FXML protected AnchorPane paneCircles;
// Zahlenkreise, die auf der Oberfläche gezeichnet werden
static final double RADIUS = 15; // Radius eines Zahlenkreises
// Liste mit Kreisen, die gezeichnet werden
public List<Kreis> kreise = new ArrayList<Kreis>();
public List<Kante> liste = new ArrayList<Kante>();
protected Kreis letzterKreis = null;
protected Kreis vorletzterKreis = null;
protected Kreis vorVorletzterKreis = null;
public static int Kreisnummer = 0;
protected boolean start = true;
public int anzahlKnoten;
/**
* Alert-Fenster mit Spielhinweis und Angabe von Knoten
*/
public void neuesProblem() {
TextInputDialog dialog = new TextInputDialog("");
dialog.setTitle ("Neues Problem");
dialog.setHeaderText("Spielhinweis: Grüner Punkt ist Start- und Zielknoten.");
dialog.setContentText("Wieviele Knoten möchten Sie verbinden?");
Optional<String> result = dialog.showAndWait();
result.ifPresent(anzahlKnoten -> System.out.println("Anzahl der Knoten " + anzahlKnoten));
anzahlKnoten = Integer.parseInt(result.get());
}
public void KnotenAnzahlAendern()
{
Alert alert = new Alert(AlertType.CONFIRMATION);
alert.setTitle("Auswahl von Anzahl der Knoten");
alert.setContentText("Möchten Sie die Anzahl der Knoten ändern?");
ButtonType buttonTypeJa = new ButtonType("Ja");
//ButtonType buttonTypeNein = new ButtonType("Nein",ButtonData.CANCEL_CLOSE);
Optional<ButtonType> result = alert.showAndWait();
if(result.get() == buttonTypeJa)
{
neuesProblem();
}
}
/**
* Handler für neuesProblemButton:
* Die Kreise verschwinden
* @param event
*/
@FXML
public void handleNeuesProblemButton(ActionEvent event) {
paneCircles.setDisable(false); // die Zeichenfläche wird (wieder) aktiv
// Kreise neu generieren und platzieren
if(start){
start = false;
neuesProblem();
}
else{
kreise.clear();
letzterKreis = null;
//KnotenAnzahlAendern();
// da nur die Kreise der Pane gehören, können wir alle Elemente entfernen
paneCircles.getChildren().removeAll(paneCircles.getChildren());
}
kreiseZeichnen();
}
/**
* Durchs Klicken sollen die Kreise in der Reihenfolge verbunden werden
* @param event
*/
@FXML
public void handleMouseClicked(MouseEvent event)
{
//int anzahl_klicks = 0;
// Anzahl der Klicks pro Knoten sollen gemerkt werden
for(Kreis kreis:kreise)
{
if(kreis.isClicked(event.getX(), event.getY()))
{
vorVorletzterKreis = vorletzterKreis;
vorletzterKreis = letzterKreis;
letzterKreis = kreis;
letzterKreis.setKreisnummer(Kreisnummer = Kreisnummer +1);
kreis.erhoeheCN();
System.out.println("Klickanzahl" + kreis.getKlickanzahl());
if(kreis.getKlickanzahl() == 1 )
{
System.out.println("blububuubub");
kreis.setFill(Color.BLUE);
kreis.setFarbe(Color.BLUE);
if( vorletzterKreis != null )
{
kreiseVerbinden(vorletzterKreis, letzterKreis);
if( (vorletzterKreis.getKantenanzahl() < 2) && (letzterKreis.getKantenanzahl() < 2))
{
vorletzterKreis.erhoeheKN();
letzterKreis.erhoeheKN();
}
}
break;
}
/*else if(anzahlKnoten == letzterKreis.getKreisnummer() && letzterKreis.getFarbe().equals(vorletzterKreis.getFarbe()))
{
System.out.println("verbunden");
kreiseVerbinden(letzterKreis, vorletzterKreis);
}*/
else
{
kreis.clearKlickanzahl() ;
//kreis.verringerKantenanzahlUm2());
kreis.setFill(Color.GREEN);
System.out.println(kreis.getKlickanzahl());
kanteLoeschen(kreis.getPath(), letzterKreis, vorletzterKreis);
}
break;
} // if END
/*if(Kante.isClickedKante(event.getX(), event.getY(), Line path )){
continue;
}*/
} // For END
} // handleMouseClicked
public void kanteLoeschen(Line path, Kreis letzterKreis, Kreis vorletzterKreis)
{
if (letzterKreis.getFarbe().equals(vorletzterKreis.getFarbe()) )
{
System.out.println("Lösche dich doch du line");
paneCircles.getChildren().remove(path);
letzterKreis.verringerKantenanzahl();
vorletzterKreis.verringerKantenanzahl();
}
}
/**
* Eine zufaellige und zulaessige Position eines Kreises wird zugewiesen
* @param Koordinaten, an die die Position uebergeben wird
*/
public void positionZuweisen(Point koord)
{
double x = (int) (Math.random() * (paneCircles.getPrefWidth() - 2*RADIUS -10) + RADIUS +5);
double y = (int) (Math.random() * (paneCircles.getPrefHeight() - 2*RADIUS -10) + RADIUS +5);
// pruefe, ob sich Kreise nicht ueberlappen, sonst neue Position
boolean newPosition = false;
while( !newPosition )
{
boolean newCheck = false;
for(Kreis kreis: kreise)
{
if( Math.abs(kreis.getCenterX() - x) < 40 && Math.abs(kreis.getCenterY() - y) < 40 )
{
if( Math.abs(kreis.getCenterX() - x) < 40 )
x = (int) (Math.random() * (paneCircles.getPrefWidth() - 2 * RADIUS) + RADIUS);
else
y = (int) (Math.random() * (paneCircles.getPrefHeight() - 2 * RADIUS) + RADIUS);
newCheck = true;
break;
}
}
newPosition = !newCheck;
}
// Wenn die Schleife beendet ist, gibt es eine zulaessige Position
koord.setX(x);
koord.setY(y);
}
/**
* platziere Kreise mit Zahlen
*/
void kreiseZeichnen()
{
for(int i = 1; i <= anzahlKnoten; i++)
{
// Mittel des Kreises
Point koord = new Point();
positionZuweisen(koord);
Kreis kreis = new Kreis( koord.getX(), koord.getY(), 0, 0, Color.GREEN, 0);
/* kreis.setOn.setOnMouseClicked(new EventHandler<MouseEvent>() {
public void handle(MouseEvent e) {
}
});*/
kreise.add(kreis);
}
// Kreise und Zahlen auf die Pane platzieren
paneCircles.getChildren().addAll(kreise);
//paneCircles.getChildren().addAll(zahlen);
}
/**
* Der zuletzt (richtig) angeklickte Kreis soll mit dem letzten verbunden werden
* @param letzter Kreis
* @param neuer Kreis
*/
public void kreiseVerbinden(Kreis letzterKreis, Kreis vorletzterKreis)
{
if(letzterKreis.getKantenanzahl() < 2 && vorletzterKreis.getKantenanzahl() < 2 && letzterKreis.getKlickanzahl() == 1 && vorletzterKreis.getKlickanzahl() == 1)
{
Line path = new Line(letzterKreis.getCenterX(), letzterKreis.getCenterY(), vorletzterKreis.getCenterX(), vorletzterKreis.getCenterY());
//Kante kant = new Kante(letzterKreis,vorletzterKreis);
path.setStrokeWidth(5.);
path.setStroke(Color.BLACK);
letzterKreis.setPath(path);
vorletzterKreis.setPath(path);
paneCircles.getChildren().add(path);
}
// kreise auf den Linien zeichnen
// Zuerst alle entfernen, dann alle hinzufuegen
//paneCircles.getChildren().removeAll(kreise);
paneCircles.getChildren().removeAll(kreise);
paneCircles.getChildren().addAll(kreise);
}
public Kreis getLetzterKreis(){
return letzterKreis;
}
public Kreis getVorLetzterKreis(){
return vorletzterKreis;
}
/**
* Innere Klasse zur Darstellung der Kreise mit Zahlen
* Sie erweitert die Klasse Circle (Shape)
*/
public class Kreis extends Circle {
static final double RADIUS = 15;
int kreisnummer = 0;
protected Line path;
protected Color farbe;
protected int klickanzahl=0;
protected int kantenanzahl =0;
//private boolean klicked = false;
public Kreis ( double xpos, double ypos, int CN , int KN, Color f, int Kreisanzahl){
// Von Superklasse Circle geerbt
this.setCenterX(xpos);
this.setCenterY(ypos);
this.setRadius(RADIUS);
this.setFill(Color.GREEN);
farbe = f;
klickanzahl = CN;
kantenanzahl = KN;
kreisnummer = Kreisanzahl;
/* Kreis.setOnMouseClicked(new EventHandler<MouseEvent>()
{
@Override
public void handle(MouseEvent t) {
Kreis.setFarbe(Color.RED);
}
});*/
}
public Color setFarbe(Color Farbe) {
return farbe = Farbe;
}
public Color getFarbe(){
return farbe;
}
public void setKreisnummer(int nr)
{
kreisnummer =nr;
}
public int getKreisnummer()
{
return kreisnummer;
}
public void erhoeheCN()
{
klickanzahl = klickanzahl + 1;
}
public void erhoeheKN(){
kantenanzahl = kantenanzahl + 1;
}
public void verringerKantenanzahl()
{
kantenanzahl = kantenanzahl -1;
}
public void verringerKantenanzahlUm2()
{
kantenanzahl = kantenanzahl -2;
}
public int getKlickanzahl()
{
return klickanzahl;
}
public int getKantenanzahl()
{
return kantenanzahl;
}
public void setKlickanzahl(int anzahl)
{
klickanzahl=anzahl;
}
public void setPath(Line Lpath){
path = Lpath;
}
public Line getPath()
{
return path;
}
public void clearKlickanzahl()
{
klickanzahl=0;
}
// Wurde der Kreis getroffen?
public boolean isClicked(double x, double y)
{
return Math.abs(x - this.getCenterX()) < RADIUS + 5. && Math.abs(y - this.getCenterY()) < RADIUS + 5;
}
}
}