From 31636e051aa767d4d239d69d465d8a99ef780601 Mon Sep 17 00:00:00 2001
From: Nimrod Abramovich <grumpydormin@gmail.com>
Date: Wed, 11 Mar 2020 15:38:41 +0000
Subject: [PATCH] neatened up

---
 bin/coursework/Cage.class               | Bin 5207 -> 5201 bytes
 bin/coursework/ConstraintsHandler.class | Bin 4379 -> 5128 bytes
 bin/coursework/GameState.class          | Bin 871 -> 871 bytes
 bin/coursework/Main.class               | Bin 22775 -> 22015 bytes
 src/coursework/ConstraintsHandler.java  |  28 ++
 src/coursework/Main.java                | 371 +++++++++++-------------
 6 files changed, 200 insertions(+), 199 deletions(-)

diff --git a/bin/coursework/Cage.class b/bin/coursework/Cage.class
index f93cf6cd92afb4721aa5581143ec6bcac4afbf0f..70a114efa9b35343e040b2214c124d1c0de03eb7 100644
GIT binary patch
delta 490
zcmcbvaZzK#9s%b-1{MZ>1_nkxtt|}V`&bq*uxtdeBCS~V*)iKLXZS41BBN&m5#rcq
z#?EZUww&RLB!?)Qo*ApODC>NNBa{CN=+>)<^2}n8*V@9MEXm2N$B`k)$)cBFB*L&@
z6T_ly3@es1l!|h*EMUN|Y~6AOKT+;k4633$Obc+EwsARwI!Kw4C=bg51{sj0>ey`E
z(!$0l$|lOb@V|Bo6Qhjm!vB1euL;`Kw=v9O=wz79Foj_b!&-*93>z5cG3;iT&v1od
z0mF5Mg$$1v7BT#0=woDM=w;+(Sk7R<z`zj1zyS&+21^Dj1_lOMh8GOm88{di8B7?C
zGwfjCU|?l%VA##DlYxzalfj)~3&So3HU=(+AcmC;yBRnbxEW#@<}vJH;9%fkNMd4`
zIeDs(Ib-zXvqCbgYHI%(lqbIvIvO0sz{0@Hz`!6P#gStp#Zh3(x`!*0S=v96MaF*v
x0|NsSgE<2O10Pt;Mg|s!O$;0io57A#0E>w*1cMyOz``KFa1-n}j>#M%{s1X5YWM&E

delta 450
zcmcbpab07>9s%c21{MZ>1_nkUtt|}V`&bq*uxtdeBCS~V*)iKLXZSA3BBN&m5#rcq
z#?EZUww&RHB!?)Qo*ApODC>NN6O;c7=+>)>^2}mT(AvVFEXm2NC%~2=$;qOZU?jq@
zU=zclZ44`xGgOFjvn*gBpl;oAh5%9SSqy5TJWLDln745`g9b>QvM3MB0tQ(vPPoOB
zHwa2{s<$vP%E&JK&o%jypj~}C!z_j_hS>~L8RjsoXPC>diD4eYUWWM$*BKTt++tYB
z@RVT@!+(Z8MoxxaMnQ(<3>FLw3_%PWpip73WUyjjV31{a!?2x!gMpF3gyA&94h9Ye
zRt5)#{R}%9*cdn&+!=N->|$VJ;9>}3Sj(`RfrEjYA(mkg!yX0>1|EhaCWg6_CkmM}
z#!NmbB*Ut%{+~f*@++aEf-wv%49pA+3}R9OY&kYk0&J7_3CpXpGHhbtV%Q9JgaSmK
WAsFNs237_^hMQnVa7|_s@dp6cDPoEM

diff --git a/bin/coursework/ConstraintsHandler.class b/bin/coursework/ConstraintsHandler.class
index 3925deed9d581baf2a3e504ec054b790a6711334..d80f886ace8cb45794c9249a022cb37de2a66d45 100644
GIT binary patch
delta 1883
zcmbQO)S<z3>ff$?3=9k=4Cgj-)w0(MCTFB3XNPCzIp^o4WR_&+=W#JGGHm8y*upT6
zk%12^>ztaCQ|wlnlLM04#>223Bqa)w%Fin<DN4-DD{(C<$}cMBWZ22Do1I}7BZELz
zVp*boPGVlVesE=RNop<+!ybmcj10{Ar6r6EqCQ~h%<z2ufTGO2lHih})WlqC4u<`V
z4D6Blr3&RBha6-$%+7F#kwF-u7)31)!x4scj124rAniGMj0~J5sTCz|nW;G`j0_5s
z9hnrA*%{av8Mu;Db8;Y#V`N~8j$&lsNCi1HEHQ_j;pF62_9#Yy$q(3N<Rteph-_sL
z(-M%}%OJ6pK}u^kgG}Uh2Dz;a@>&9to2585Gs;UbFf*_*Ffe#A+wNwFi`>qT;Kyvn
zx}3pOYYT&zG{@w(oO&!A3;&;<tiUCoslZ^!V9a2|V9H?3V8LL@V9%h>;K5+Qpvu6&
zU<WaVL5)G30R+4l{2BZh7#WxtJQ#`@0vVVXxELH5N*GERm>Coplo-kw${AP~cp0o2
zDj572SQ#oA7#MgM7$K@A`|-##s!z`2QJwsjt4#^7BSl#`GNdPe;M9h=^BA{$x&nh2
zgE50QgDHa#g9U>hgFS->g9k$(4tM%uac2uL?wstyqX>4Te*H=YW(F<>28QWcTNvbb
zGPE)>%wy<f^n>ua85yitmoqp@vhHN)XJk0QFx84hl4Tpi^hhhteP$fYX6(xuWF<L8
z+4aoWMA@V{GGr1KFmOt;_$_DPZDD5=Wf$dG`2P_|_iRRnS^szIZey5l#-a;0fMcH-
zJG0qjSzf1lFNP=vUxsLg0EP&LD28x`6ov$bEQUmeMusGY9)?7QX$-005C~%60J#(%
zQ`4a_#lSF~0TdQY415e742u{RGcYq~Fc>i`VOY$-!r;Ilz_66TkAaOLi$RBB8ABig
z3qvCVH&~37A(nw*@;zQ7MzP6)d@l7x49pD73=9m?%(lxJgtfLXD1kj?#LOJh!o(=U
zvGD)9jSLJ7%nT|F3=BdHEDQ_`84RopnG8Y<84OYk*<fcXK#YJpQyS__CI$&`l3@Z_
z%D~RR^oN0!k)MHyp@AWifssLwfuWuO(*ZIZ8PW+xEVvzz$H2;v&mhE*#~{T}h{FM(
z&;g}r91e(qIzW{Hivyq`zyc3}$#wi<SwajY3{ni`IP8PvARP8JL+!(69n`-F>m~_^
zSqU*zF-S4g;;;>$?<NNb#4$=vUN4YdF8~Q-h9Cwe21W)3263(J44Y;$2x)C+*gBJe
zdlSPBp?%vJ4j>|!4;+!*415fI3}Oruz_x>OIs=0^G;(9XiGfj!feBPdL(T7GU}9ip
zU|`S&l|+$NEc@(0sY$Y4l10YIM|&GXqEO~GhU{4ktjudbiAr|i{}(K4zy^U*l^9s>
zWCme|DGc%qQyCN)CNpR<%m7;svWI~|8)~^Q10TathGPtj;PfQI!2F+qkAan)fsuic
zk)7c<1A`C~0~4r*fViuk;T8iE11AFmgA*uW!yRS-aaW`jBuBC>XAqI(5M?tqV-;nc
z33enKqbQpw`@;XPq0YUC<Xkxhb_NE9ISj%Ka~aeb<}v6n%xBPJn9E?nFo(f`VKLa*
zkPMOT1b4S8!wH6y42%rw4D1Z27y=o<*^t48ffdCEiVO_@83Y+P*%=tw8BT-zqzLxe
cX$A&frvD6_2)`;aFfcGOoMB*KU}88601z2bfdBvi

delta 1053
zcmeCsn61Qh>ff$?3=9k=44XG{)v`}s#1X;BJNY+<442AY29d1{Vp;+!lNC9I8C5o$
za&Bf+mSJFKU}Iol@L{&y%@7y4ogu-G*^G5LgPGPA1~F*?whU3$$?JHuSq0b@{y#a{
zl3PAqk-?C`gu#fxjKP?}lEIY0fkB_ai@}0Hm4Si54q_IA8iP6m2>3AgGx#wuGB7cC
zF%&ZdGB7c4F*q@lFqASdGbl1BF_bZsGq5o5GT1UyF!(XBGE_1!Fz_%if>cf3&#lO)
zG5I0)YDK(m6lE1)o4kfc7wW>hJo1@}3|<T-4BiZ83_c8&41Np_3?2+#41qXY=!?aL
zEyTExp=I(xZh5d9RVT0F<x*Y6z|6qKz`!s=YYT(?PKH)ShItHqjD8SaHzR`;>v9IC
z$v1grc;zHHMcMVt*hJZ+1=uDt@`-Xklw{q>Fq@HK*8g3T75PHyy&0ky{1~Dc0vRG0
zq8Y*&QW+8$vKbN?ni!H8dKnTKrZc31{S(B%0kRPu;xnKj&cHB(0pv3#20n&PhD8jE
z8JHO~7>pT~Ff3+ZVQ^p&WLV1J$H2yr&7i}uj3JPLg`tUo8!X1k5X-<Y`3s*BqxfWX
zeizje24)6k1_lOMX4~ZqB3fG*lt9TsCc%iAIi!V&Q3jMU-c0V}7t0Z5$Y79R$OgMh
z0ip-)E?KC%m>8tMam@s>g@K)c=??=dqW}XFLjyx310#bV0|Nu5g)#zc8PW+xEXWq}
z34kojV~}Ae#9<-G`=F$U!@?Lm7Q%eUg6u=Eg(VC!4COd1gr#*H7B=It5avT<3;6`a
itb`e=7-Se~aaf4Yhm+$3;}}&Y?-fjEWnf@p*aQH&Z>i}3

diff --git a/bin/coursework/GameState.class b/bin/coursework/GameState.class
index 05a8e904dce51e954e51bf717fb058b235294275..7da95ce3340cd26d28aaa90c45379d71f8c06b7d 100644
GIT binary patch
delta 13
UcmaFP_MC0QOD0Ci$*-7d0V&M|i~s-t

delta 13
UcmaFP_MC0QOD0B@$*-7d0V)IqmjD0&

diff --git a/bin/coursework/Main.class b/bin/coursework/Main.class
index 7f230ff2765f64c4bfeaa4d51e685ceb5a8f0205..eebd54f556d3480d151a72b3fd5448dad7431061 100644
GIT binary patch
delta 10741
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
I^IHZ<0Dp`YH2?qr

delta 11594
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

diff --git a/src/coursework/ConstraintsHandler.java b/src/coursework/ConstraintsHandler.java
index 3eb2306..be56672 100644
--- a/src/coursework/ConstraintsHandler.java
+++ b/src/coursework/ConstraintsHandler.java
@@ -135,4 +135,32 @@ public class ConstraintsHandler {
 		}
 	}
 	
+	public void checkWinCondition() {
+		if (checkCellsFull() && checkConstraintErrors()) {
+			// win condition fulfilled
+			// animation and pop up
+			System.out.println("You won");
+		}
+	}
+	
+	private boolean checkCellsFull() {
+		for (TextField textField : gridNumbers) {
+			if (!textField.getText().equals("")) {
+				return false;
+			}
+		}
+		return true;
+	}
+	
+	private boolean checkConstraintErrors() {
+		for (boolean[] cellErrors : gridErrors) {
+			for (boolean errorVal : cellErrors) {
+				if (errorVal) {
+					return false;
+				}
+			}
+		}
+		return true;
+	}
+	
 }
diff --git a/src/coursework/Main.java b/src/coursework/Main.java
index 087ea75..3416de1 100644
--- a/src/coursework/Main.java
+++ b/src/coursework/Main.java
@@ -34,7 +34,7 @@ import javafx.stage.Stage;
 
 public class Main extends Application {
 	
-	final static public int N = 6;
+	final static public int N = 5;
 	final private double GRID_PERCENTAGE = 0.75;
 	
 	private Scene scene;
@@ -62,7 +62,7 @@ public class Main extends Application {
 	private Button undoButton;
 	private Button redoButton;
 	
-	
+	//////////////////////////////////////////////////////////////////////////////////
 	public static Square[] getGridSquares() {
 		return gridSquares;
 	}
@@ -86,11 +86,12 @@ public class Main extends Application {
 	public static boolean[][] getGridErrors() {
 		return gridErrors;
 	}
+	//////////////////////////////////////////////////////////////////////////////////
 	
 	private GridPane setupGrid() {
 		GridPane gridPane = new GridPane();
 		gridPane.setAlignment(Pos.CENTER);
-		double size = scene.getWidth() * GRID_PERCENTAGE / N;
+		double size = (scene.getWidth() * GRID_PERCENTAGE) / N;
 
 		for (int i = 0; i < N; i++) {
 			for (int j = 0; j < N; j++) {
@@ -124,45 +125,6 @@ public class Main extends Application {
 		return gridPane;
 	}
 	
-	private void textFieldClickEvent(int i, int j) {
-		if (!clearing && !undoing) {
-			undoStack.push(new GameState(GameState.getCurrentGameState(gridNumbers)));
-			if (undoButton.isDisabled()) {
-				undoButton.setDisable(false);
-			}
-		}
-		constraints.checkConstraints(j, i, showMistakes);;
-		checkWinCondition();
-	}
-	
-	private void checkWinCondition() {
-		if (checkCellsFull() && checkConstraintErrors()) {
-			// win condition fulfilled
-			// animation and pop up
-			System.out.println("You won");
-		}
-	}
-	
-	private boolean checkCellsFull() {
-		for (TextField textField : gridNumbers) {
-			if (!textField.getText().equals("")) {
-				return false;
-			}
-		}
-		return true;
-	}
-	
-	private boolean checkConstraintErrors() {
-		for (boolean[] cellErrors : gridErrors) {
-			for (boolean errorVal : cellErrors) {
-				if (errorVal) {
-					return false;
-				}
-			}
-		}
-		return true;
-	}
-	
 	private VBox setupGridVBox(Square square, int i, int j) {
 		VBox vbox = new VBox();
 		Label cageInfoLabel = new Label("");
@@ -213,27 +175,11 @@ public class Main extends Application {
 		topHBox.getChildren().addAll(loadGameFileButton, showMistakesCheck, loadGameTextInputButton);
 		
 		showMistakesCheck.selectedProperty().addListener((obs, oldVal, newVal) -> {
-			showMistakes = showMistakesCheck.isSelected();
-			constraints.highlightCells(showMistakes);
+			showMistakesCheckEvent(showMistakesCheck);
 		});
 		
 		loadGameFileButton.setOnAction(e -> {
-			try {
-				FileChooser fileChooser = new FileChooser();
-				fileChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter("Text Files", "*.txt"));
-				File selectedFile = fileChooser.showOpenDialog(stage);
-				BufferedReader file = new BufferedReader(new FileReader(selectedFile));
-				
-				String line;
-				while ((line = file.readLine()) != null) {
-					createNewCage(line);
-				}
-				file.close();
-			} catch (FileNotFoundException e1) {
-				e1.printStackTrace();
-			} catch (IOException e2) {
-				e2.printStackTrace();
-			}
+			loadFileButtonClickEvent();
 		});
 		
 		return topHBox;
@@ -275,29 +221,10 @@ public class Main extends Application {
 		redoButton = new Button("", new ImageView(new Image("file:Images/redo_icon.png")));
 		Button clearButton = new Button("Clear");
 		undoButton.setOnAction(e -> {
-			undoing = true;			
-			
-			redoStack.push(undoStack.pop());
-			updateGameState(undoStack.peek());
-			
-			if (!redoStack.empty()) {
-				redoButton.setDisable(false);
-			}
-			if (undoStack.size() == 1) {
-				undoButton.setDisable(true);
-			}
-			undoing = false;
+			undoButtonClickEvent();
 		});
 		redoButton.setOnAction(e -> {
-			GameState gameState = redoStack.pop();
-			updateGameState(gameState);
-			
-			if (!undoStack.empty()) {
-				undoButton.setDisable(false);
-			}
-			if (redoStack.empty()) {
-				redoButton.setDisable(true);
-			}
+			redoButtonClickEvent();
 		});
 		
 		undoButton.setDisable(true);
@@ -310,6 +237,147 @@ public class Main extends Application {
 		return bottomHBox;
 	}
 	
+	private VBox setupNumbersVBox() {
+		VBox vbox = new VBox();
+		for (int i = 1; i <= N; i++)  {
+			Button button = new Button(i + "");
+			double cellWidth = gridSquares[0].getRectangle().getWidth() / 2;
+			double fontSize = cellWidth * 0.4;
+			
+			button.setPrefSize(cellWidth, cellWidth);
+			button.setMaxSize(150, 150);
+			button.setStyle("-fx-font-size:"+fontSize+"pt");
+			button.setOnAction(e -> {
+				numbersButtonClickEvent(button);
+			});
+			vbox.getChildren().add(button);
+		}
+		vbox.setSpacing(10);
+		vbox.setAlignment(Pos.CENTER);
+		return vbox;
+	}
+	
+	private VBox setupFontSizeHBox() {
+		VBox vbox = new VBox();	
+		vbox.getChildren().addAll(setupButton("Tiny", 10), setupButton("Small", 14), setupButton("Medium", 18), setupButton("Large", 22), setupButton("Huge", 26));
+		vbox.setSpacing(10);
+		vbox.setAlignment(Pos.CENTER);
+		return vbox;
+	}
+	
+	private Button setupButton(String name, int size) {
+		Button button = new Button(name);
+		button.setStyle("-fx-font-size:" + size + "px;");
+		button.setOnAction(e -> {
+			changeFontSizeEvent(size);
+		});
+		return button;
+	}
+	
+	///////////////////////////////////////////////////////////
+	private void loadFileButtonClickEvent() {
+		try {
+			FileChooser fileChooser = new FileChooser();
+			fileChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter("Text Files", "*.txt"));
+			File selectedFile = fileChooser.showOpenDialog(stage);
+			BufferedReader file = new BufferedReader(new FileReader(selectedFile));
+			
+			String line;
+			while ((line = file.readLine()) != null) {
+				createNewCage(line);
+			}
+			file.close();
+		} catch (FileNotFoundException e1) {
+			e1.printStackTrace();
+		} catch (IOException e2) {
+			e2.printStackTrace();
+		}
+	}
+	
+	private void showMistakesCheckEvent(CheckBox showMistakesCheck) {
+		showMistakes = showMistakesCheck.isSelected();
+		constraints.highlightCells(showMistakes);
+	}
+	
+	private void undoButtonClickEvent() {
+		undoing = true;			
+		
+		redoStack.push(undoStack.pop());
+		updateGameState(undoStack.peek());
+		
+		if (!redoStack.empty()) {
+			redoButton.setDisable(false);
+		}
+		if (undoStack.size() == 1) {
+			undoButton.setDisable(true);
+		}
+		undoing = false;
+	}
+	
+	private void redoButtonClickEvent() {
+		GameState gameState = redoStack.pop();
+		updateGameState(gameState);
+		
+		if (!undoStack.empty()) {
+			undoButton.setDisable(false);
+		}
+		if (redoStack.empty()) {
+			redoButton.setDisable(true);
+		}
+	}
+	
+	private void numbersButtonClickEvent(Button button) {
+		if (previousSquare != null) {
+			for (int i = 0; i < gridSquares.length; i++) {
+				if (previousSquare.equals(gridSquares[i])) {
+					gridNumbers[i].setText(button.getText());
+				}
+			}
+		}
+	}
+	
+	private void changeFontSizeEvent(int size) {
+		fontSize = size;
+		for (TextField textField : gridNumbers) {
+			textField.setStyle("-fx-focus-color: transparent; -fx-text-box-border: transparent;"
+					+ "-fx-background-color: -fx-text-box-border, -fx-control-inner-background;"
+					+ "-fx-font-size:" + size*1.8 + ";");
+		}
+		for (Label label : cageLabels) {
+			label.setStyle("-fx-font-size:" + size*0.9 + ";");
+		}
+	}
+	
+	private void stageWidthResizeEvent(Stage stage, GridPane gridPane) {
+		stage.widthProperty().addListener((obs, oldVal, newVal) -> {
+			if (newVal.doubleValue() < stage.getHeight())  {
+				isWider = false;
+				resizeGrid(gridPane.getLayoutX(), gridPane.getLayoutY(), gridPane.getWidth());
+			}
+		});
+	}
+	
+	private void stageHeightResizeEvent(Stage stage, GridPane gridPane) {
+		stage.heightProperty().addListener((obs, oldVal, newVal) -> {
+			if (newVal.doubleValue() < stage.getWidth())  {
+				isWider = true;
+				resizeGrid(gridPane.getLayoutX(), gridPane.getLayoutY(), gridPane.getWidth());
+			}
+		});
+	}
+	
+	public void resizeGrid(double gridX, double gridY, double gridWidth) {
+		double newValue = isWider ? scene.getHeight() : scene.getWidth();
+		for (int i = 0; i < N; i++) {
+			for (int j = 0; j < N; j++) {
+				Rectangle rectangle = gridSquares[i*N + j].getRectangle();
+				rectangle.setWidth(newValue * GRID_PERCENTAGE / N);
+				rectangle.setHeight(newValue * GRID_PERCENTAGE  / N);
+				gridSquares[i*N + j].resizeLines(newValue * GRID_PERCENTAGE / N);
+			}
+		}
+	}
+	
 	private void paneClickSquareEvent(int i, int j, Square square) {
 		gridBoxes[i*N + j].addEventHandler(MouseEvent.MOUSE_CLICKED, e -> {
 			if (previousPane != null) {
@@ -372,6 +440,17 @@ public class Main extends Application {
 		});
 	}
 	
+	private void textFieldClickEvent(int i, int j) {
+		if (!clearing && !undoing) {
+			undoStack.push(new GameState(GameState.getCurrentGameState(gridNumbers)));
+			if (undoButton.isDisabled()) {
+				undoButton.setDisable(false);
+			}
+		}
+		constraints.checkConstraints(j, i, showMistakes);;
+		constraints.checkWinCondition();
+	}
+	
 	private boolean lastOperationClear() {
 		GameState gameState = undoStack.peek();
 		boolean emptyGrid = true;
@@ -383,123 +462,12 @@ public class Main extends Application {
 		return emptyGrid;
 	}
 	
-	private void stageWidthResizeEvent(Stage stage, GridPane gridPane) {
-		stage.widthProperty().addListener((obs, oldVal, newVal) -> {
-			if (newVal.doubleValue() < stage.getHeight())  {
-				isWider = false;
-				resizeGrid(gridPane.getLayoutX(), gridPane.getLayoutY(), gridPane.getWidth());
-			}
-		});
-	}
-	
-	private void stageHeightResizeEvent(Stage stage, GridPane gridPane) {
-		stage.heightProperty().addListener((obs, oldVal, newVal) -> {
-			if (newVal.doubleValue() < stage.getWidth())  {
-				isWider = true;
-				resizeGrid(gridPane.getLayoutX(), gridPane.getLayoutY(), gridPane.getWidth());
-			}
-		});
-	}
-	
-	public void resizeGrid(double gridX, double gridY, double gridWidth) {
-		double newValue = isWider ? scene.getHeight() : scene.getWidth();
-		for (int i = 0; i < N; i++) {
-			for (int j = 0; j < N; j++) {
-				Rectangle rectangle = gridSquares[i*N + j].getRectangle();
-				rectangle.setWidth(newValue * GRID_PERCENTAGE / N);
-				rectangle.setHeight(newValue * GRID_PERCENTAGE  / N);
-				gridSquares[i*N + j].resizeLines(newValue * GRID_PERCENTAGE / N);
-			}
-		}
-	}
-	
-	private HBox setupCenterHBox() {
-		HBox hbox = new HBox();
-		for (int i = 1; i <= N; i++)  {
-			Button button = new Button(i + "");
-			double cellWidth = gridSquares[0].getRectangle().getWidth() / 2;
-			double fontSize = cellWidth * 0.4;
-			
-			button.setPrefSize(cellWidth, cellWidth);
-			button.setMaxSize(150, 150);
-			button.setStyle("-fx-font-size:"+fontSize+"pt");
-			button.setOnAction(e -> {
-				numbersButtonClickEvent(button);
-			});
-			hbox.getChildren().add(button);
-		}
-		hbox.setSpacing(10);
-		hbox.setAlignment(Pos.CENTER);
-		return hbox;
-	}
-	
-	private void numbersButtonClickEvent(Button button) {
-		if (previousSquare != null) {
-			for (int i = 0; i < gridSquares.length; i++) {
-				if (previousSquare.equals(gridSquares[i])) {
-					gridNumbers[i].setText(button.getText());
-				}
-			}
-		}
-	}
-	
-	private HBox setupFontSizeHBox() {
-		HBox hbox = new HBox();
-		Button tiny = new Button("Tiny");
-		Button small = new Button("Small");
-		Button medium = new Button("Medium");
-		Button large = new Button("Large");
-		Button huge = new Button("Huge");
-		
-
-		
-		tiny.setStyle("-fx-font-size:12px;");
-		tiny.setOnAction(e -> {
-			changeFontSize(10);
-		});
-		
-		small.setStyle("-fx-font-size:16px;");
-		small.setOnAction(e -> {
-			changeFontSize(12);
-		});
-		
-		medium.setStyle("-fx-font-size:20px;");
-		medium.setOnAction(e -> {
-			changeFontSize(18);
-		});
-		
-		large.setStyle("-fx-font-size:24px;");
-		large.setOnAction(e -> {
-			changeFontSize(22);
-		});
-		
-		huge.setStyle("-fx-font-size:28px;");
-		huge.setOnAction(e -> {
-			changeFontSize(26);
-		});
-		
-		hbox.getChildren().addAll(tiny, small, medium, large, huge);
-		hbox.setSpacing(10);
-		hbox.setAlignment(Pos.CENTER);
-		return hbox;
-	}
-	
-	private void changeFontSize(int size) {
-		fontSize = size;
-		for (TextField textField : gridNumbers) {
-			textField.setStyle("-fx-focus-color: transparent; -fx-text-box-border: transparent;"
-					+ "-fx-background-color: -fx-text-box-border, -fx-control-inner-background;"
-					+ "-fx-font-size:" + size*1.8 + ";");
-		}
-		for (Label label : cageLabels) {
-			label.setStyle("-fx-font-size:" + size*0.9 + ";");
-		}
-	}
+	////////////////////////////////////////////////////////
 	
 	@Override
 	public void start(Stage stage) throws Exception {
 		VBox vBox = new VBox();
-		scene = new Scene(vBox,400+50*N,450+50*N);
+		scene = new Scene(vBox,500+50*N,500+50*N);
 		vBox.setSpacing(10);
 		vBox.setPadding(new Insets(20));
 		vBox.setAlignment(Pos.CENTER);
@@ -508,19 +476,24 @@ public class Main extends Application {
 		undoStack.push(new GameState(GameState.getCurrentGameState(gridNumbers)));
 		
 		fontSize = 18;
-		changeFontSize(fontSize);
-		HBox fontSizeHBox = setupFontSizeHBox();
+		changeFontSizeEvent(fontSize);
 		HBox topHBox = setupTopHBox();
-		HBox centerHBox = setupCenterHBox();
+		
+		VBox fontSizeVBox = setupFontSizeHBox();
+		VBox numbersVBox = setupNumbersVBox();
+		HBox gridHBox = new HBox();
+		gridHBox.getChildren().addAll(fontSizeVBox, gridPane, numbersVBox);
+		gridHBox.setSpacing(20);
+		
 		HBox bottomHBox = setupBottomHBox();
 		
-		vBox.getChildren().addAll(topHBox, gridPane, centerHBox, bottomHBox, fontSizeHBox);
+		vBox.getChildren().addAll(topHBox, gridHBox, bottomHBox);
 		
 		stageWidthResizeEvent(stage, gridPane);
 		stageHeightResizeEvent(stage, gridPane);
 		
 		stage.setMinWidth(500 + 50*N);
-		stage.setMinHeight(500 + 50*(N+1));
+		stage.setMinHeight(500 + 50*N);
 		stage.setScene(scene);
 		stage.setTitle("Mathdoku");
 		stage.show();
-- 
GitLab