#
package view;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.Component.*;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import model.*;
import controller.*;
import java.applet.Applet;
public class GameDesign extends Applet{
private GameDesign window;
private World world;
private int cellSize;
private int winWidth;
private int winHeight;
private int paneWidth;
private int paneHeight;
private int insetL;
private int insetR;
private int insetT;
private int insetB;
private Dimension screenResolution = Toolkit.getDefaultToolkit().getScreenSize();
private int menuBarHeight;
private JFrame frame;
private MyJPanel panel;
private ToolBar toolbar;
private String txtFile;
public GameDesign(World world) {
this.world = world;
// Zellengröße initialisieren, standardmäßig 10 x 10 Px
this.cellSize = 10;
//JFrame.setDefaultLookAndFeelDecorated(true);
this.frame = new JFrame("Spiel des Lebens Gruppe 8");
BorderLayout layout;
// Layout erstellen, dass Spielfeld in Zellen und Toolbar trennt
layout = new BorderLayout();
this.frame.setLayout(layout);
// Frame (sonstige Einstellungen)
this.frame.setLocationByPlatform(true);
this.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// Toolbar
this.toolbar = new ToolBar(this.frame, this.world);
// Zellen
this.panel = new MyJPanel(this.world, this.frame, this.cellSize);
this.frame.add(this.panel, BorderLayout.CENTER);
// Listener hinzufügen (bspw. für Resize des Fensters durch User)
ComponentListener listen = new GuiComponentListener(this.frame);
this.frame.addComponentListener(listen);
// Mouse-Listener bspw. für Klick auf eine Zelle
MouseListener listenMouse = new GuiMouseEventListener(this.frame, this.panel);
this.frame.addMouseListener(listenMouse);
// Fenster auf Größe Hälfte des Bildschirms setzen
this.winWidth = screenResolution.width / 2;
this.winHeight = screenResolution.height / 2;
// Fenster anzeigen
// Zugriff auf getInsets() möglich
this.frame.setVisible(true);
// Framegröße anpassen und Fenster positionieren
setFrameSize(this.frame, this.winWidth, this.winHeight);
}
// Konstruktor beim Starten der GUI
public GameDesign() {
}
// wird aufgerufen, nachdem vom User eine gültige Txt-Datei eingelesen wurde
public void setGameDesignAfterGettingTxt(World world) {
this.world = world;
this.panel.setWorld(this.world);
// aktuelle Anzahl der Zellen
int numberCellsX = this.winWidth / this.cellSize;
int numberCellsY = this.winHeight / this.cellSize;
// Wenn Anzahl der Zellen in Textdatei größer als Standardwert
// Dann Spielfeld auf x und y-Werte aus Txt-Datei anpassen
if (this.world.countCols() > numberCellsX) this.winWidth = this.world.countCols() * this.cellSize;
if (this.world.countRows() > numberCellsY) this.winHeight = this.world.countRows() * this.cellSize;
// Framegröße anpassen und Fenster positionieren
setFrameSize(this.frame, this.winWidth, this.winHeight);
this.frame.repaint();
}
public void createFrame() {
}
// setzt Größe des Fensters in Konstruktor
public void setFrameSize(JFrame frame, int width, int height) {
// Anzahl der Zellen horizontal und Vertikal
// überflüssigen Platz wegschneiden (Zellen sollen 100% des Frames füllen)
int numberCellsX = width / this.cellSize;
int numberCellsY = height / this.cellSize;
int remainder = width % this.cellSize;
int newWinWidth = width - remainder + frame.getInsets().left + frame.getInsets().right + 1;
remainder = height % this.cellSize;
int newWinHeight = height - remainder + frame.getInsets().top + frame.getInsets().bottom + 1;
// Fenster positionieren: genau in der Mitte des Bildschirms
frame.setBounds((screenResolution.width - newWinWidth) / 2,
(screenResolution.height - newWinHeight) / 2,
newWinWidth, newWinHeight);
}
// setzt Größe des Fensters in MyJPanel-Klasse
public static void setFrameSize(JFrame frame, int width, int height, int cellSize) {
// Anzahl der Zellen horizontal und Vertikal
// überflüssigen Platz wegschneiden (Zellen sollen 100% des Frames füllen)
Dimension screenResolution = Toolkit.getDefaultToolkit().getScreenSize();
int numberCellsX = width / cellSize;
int numberCellsY = height / cellSize;
int remainder = width % cellSize;
int newWinWidth = width - remainder + frame.getInsets().left + frame.getInsets().right + 1;
remainder = height % cellSize;
int newWinHeight = height - remainder + frame.getInsets().top + frame.getInsets().bottom + 1 + 47;
frame.setSize(newWinWidth, newWinHeight);
}
// bekommt GameDesign-Objekt aus View direkt nach Erzeugung übergeben (ist aktuelles GameDesign-Objekt)
public void passDesignObj(GameDesign window) {
this.window = window;
}
// übergibt GameDesign-Objekt an ToolBar
// von dort wird es dann an die Listener übergeben
public void passDesignObjToToolbar(GameDesign window) {
// GameDesign-Objekt übergeben
this.toolbar.passDesignObj(this.window);
// ActionListener starten
this.toolbar.setActionListeners();
}
public void passObjsToToolbar(GameDesign window, World world) {
this.window = window;
// GameDesign-Objekt übergeben
this.toolbar.passDesignObj(this.window);
this.toolbar.passModelObj(world);
// Action-Listener starten
this.toolbar.setActionListeners();
}
// updated das Model-Objekt (wird aus ToolBar bzw. Listener-Klassen heraus ausgeführt)
public void setWorld(World world) {
this.world = world;
this.frame.repaint();
}
// setzt Größe der Zellen
public void setCellSize(int newCellSize) {
// Zellengröße in GameDesign-Klasse updaten
this.cellSize = newCellSize;
// Zellengröße in MyJPanel-Klasse updaten
this.panel.setCellSize(this.cellSize);
// Panel neu zeichnen
this.frame.repaint();
}
// gibt zellengröße zurück
public int getCellSize() {
return this.cellSize;
}
// speichert vom User per Open-Button geladenes TXT-File
// siehe OpenActionListener
public void setTxtFile(String txtFile) {
this.txtFile = txtFile;
}
// gibt Name des eingelesenes Txt-Files zurück
public String getTxtFile() {
return this.txtFile;
}
// gibt Zustand der Welt zurück (rund oder flach)
public boolean getShape() {
return this.world.getShape();
}
// gibt Anzahl der Generationen zurück
public int getGenerations() {
return this.world.getNumberOfGenerations();
}
// gibt Frame zurück
public JFrame getFrame() {
return this.frame;
}
// gibt Panel zurück
public MyJPanel getPanel() {
return this.panel;
}
public void init() {
Controller controller = new Controller();
controller.passContrObjToController(controller);
}
public static void main(String[] args) {
// GUI-Objekt erzeugen
Controller controller = new Controller();
controller.passContrObjToController(controller);
}
}