From 60105002db08ee3d724cc3feaba21defca45e474 Mon Sep 17 00:00:00 2001
From: Nimrod Abramovich <grumpydormin@gmail.com>
Date: Wed, 11 Mar 2020 00:04:39 +0000
Subject: [PATCH] row/column constrains fixed & font sizes added

---
 bin/coursework/Cage.class   | Bin 2496 -> 5196 bytes
 bin/coursework/Main.class   | Bin 20740 -> 24809 bytes
 bin/coursework/Square.class | Bin 2338 -> 2594 bytes
 src/coursework/Cage.java    | 128 ++++++++++++++++--
 src/coursework/Main.java    | 255 +++++++++++++++++++++++++-----------
 src/coursework/Square.java  |   9 ++
 6 files changed, 310 insertions(+), 82 deletions(-)

diff --git a/bin/coursework/Cage.class b/bin/coursework/Cage.class
index 35378411b02a029b9347a545d98c2226b59dd351..cf42078f2a031fef67fad643a5262c83393bbbda 100644
GIT binary patch
literal 5196
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
GZUX=gNiBr{

delta 1691
zcmX@3aX^^s)W2Q(7#J8#7@8(>_49KjC#I+RBqpWi6f-i&MNj5olAZWX-&2@}fuBKy
zk%3u5GmMjgkwJ`yft7&`#FF4)U}xX}v7~qyI2pLO7-Sga*coIQ8Tga)ON)wA%kzt}
z^?egF^LQBK85AbxG3u!)@i1^R@PJgR@Gz({s4+6|rl*!TBiXE=p$W2E(L{rXftP`g
zi-D0ri-$oQ<OI&7(#)I`kYbRiE)RnqNR+!6Vt{8}TK?o3CMPbCqzMm$DTCSMAFT3h
zRtz@m4Azrn*<`tG8SEGtIDI_bJwhfsuqn$sFgUR@I5IK_BDpuXur#qKm50HZ!DVt2
zn~9wRgBuTnJA(@&18;F^iBD=;NpML~es(Gsg9C#n4}%v-hQBzq#3{d|BtI7+=flI`
z%iuEk3!ASiBLi=6Nn&!gZ(>16Vp2{jI|CaRLnK2qJ3|yBgFsedS)zVvNoJ0|V^L9J
zWiby!3_~m<150s!Q3)dht46e^W*9p|{Nx;V8MZ`*WOjz6$p*}#yeSN+j125$i8-aI
z{%MmZuuE~rF{FdyDua<hbn*js5uq>+hAc(~Mg=a0IEEY^hFpfc$yeB|P2(5}co+&9
ziWnI<O7eqCiZb)k85u-0G=0Dh$w|yh*N2E&b1{@Kl(93EGBQX_=3|m_=V2&k$Y5k(
zFHS89Nv$XWNmuePR54UDGH?~AmV{*%XC~#OGBU7eL}`XGGO*=l=7lBZFfuS@rZ6%v
z7v+~TGB79S=S)7sp~T2K`8|hbJqrUP13!ZR10#bV0|Ub(1||j;1_lN#t?dj#TH0F~
zM73nLGKg#GZe@_v+QA^bl|fN!2ZQof26e4%44PWo7<4u=FfcGN=rb@ds4;LdFfa%(
zurLTRa54xn@G%H82s4N<NHK^qC^CpKs4|E%XfjAJ7=X-&*ur2~&tSv=0$QLX&A<qj
zVrSrBU;?u^8Mqjj85lun58^<kPzDwTeg+0cA+0S8qWf4DFtBU{u_CQl_SrGpE@${I
z$s(g?0}<lbXU5KK#<rZ{h9rk5o1Ph~v?%L*h7-~|7>unrMOi@<SG^=Bi=HGGi(ZNu
zw<IUCo+KBuUWyry2!pvLuP8Uu0tQu4o>>eET3Z+tLDB+j86XV_Mj{O6n;0y&G1xC>
zs1W65A*jxEIYWRb_bdiAQ68oRNak6h8|bl|K?9^vS(Jxm0fQ_~i@hfs3QE+2!aa#W
zf`NfSnt_u+hJlMgjzN||p237cfx(JFk->pMiNT#gg&~MRl_8cvogs-qlOdNui=mxC
zo1u$AhhZv%F2i~TJ%&vT`V4y+3>dC67&6>qFk*PhV9fBJL7tJ5L5@+7!2%p-K@1$A
zfM+lSN0}_c8wS661`Y;B1`~$U4E_up46F<e4Eq@Z7}yv%8Qd9mFa$ENF>o;iF|1_(
zY2{{!Wmv=z%)r6G!;r)<mm!29l!2EajDdlnkb#ryKLalVD?0-t10y3lLpTG&e+Cf-
zPId-HMhG85GW=(VVc>&{GBR?36tgpgvonNG4iplp4~J=I`p>|LVjcq{sHlP@B8HO;
zEZ_uI0!k<QSe7twffzd&B0v-~IQghc8!;R0W{8W_+QJ~dgCSu%Lz+<LHim4iEew*|
z7_zr9<Zojr*4o0LE^WjDS65F+A@eqd3Q&e&24@&K26hGp25SaR1{($e23rPk20I3O
z2788d1_y>>21jt9i$NR;4RmpaScV#Kn1jNNnSoJ&ffH29Lj5&aL0H8ZlqC2Vm>C!t
wTo_mxTp73++`uL&fW^cZYC+M+z{()VPzN@Ni-Cs$6pu^{j0_D7pv>F|0A&d&2><{9

diff --git a/bin/coursework/Main.class b/bin/coursework/Main.class
index ae468b9521fc5d9f39ff9b1a989129e7ce984656..50b401ba1f7cfe454d8d9798e6a8f2ef4f8247e8 100644
GIT binary patch
literal 24809
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

literal 20740
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
NnYJ>mXI{l12>_}WRonmo

diff --git a/bin/coursework/Square.class b/bin/coursework/Square.class
index ef7b1b6f1ab6cf0ef440306e32c5b7b42af133f4..d244d5b2579894b681036730669ad911a3c75bf4 100644
GIT binary patch
literal 2594
zcmX^0Z`VEs1_l#`GIj<gMh3y;{L-T0)bjkIZ2jQE(!`=vb_Nzk27#=^vPAuy#JqHU
z|D>$c<Pt^(mg3B+R7M6y7e)roqSWM)#Ju#JR7M6lACS_t3jN~b)Vx&v;*7+CRQ({B
zyfq^Ob4h*yBZDM1Wj>jCsn(1PtVNmW86}JiY)SbgCHc9G3@kaRX(fydtm#Ghr3H)(
zBB*-ZL88`-3@pis>8Xqif<8!Ia867InaF07nU`5&$H>5<;i4JF$iU*9pOVVOz|0`V
z!yv>U&d9*5p&7=`Aj!xegyMRz(Oe7?3}T!Nj0`e7415gyAeI~tg8+jdh^4^8z{<eJ
z#lXm*#KWKrGKwXoD6yQ8fgj`<ztY^K)S{5YBv8l*`Q#@j=7c2{WrFxnL6(w?%wk3c
zVPr=`!rhvYfxS4j1mpuo1`!Qp1t2kNkU!YdVG4vbG%-}LGw3oh$e?%#EjqXubQttO
zL14hhz^>uq;^Lwi2J)2=4+A>`2PcCGgBd%6DI<dfiXjDwnRzAp&iOg{MLZ1V3>J(G
ztl=J>A+C%JQm8S5q|h2<l@$+zHG>VrUv8N>IgAXl8rXCMfGn`q3<K%0<6*F85N2fH
zD^4v5E-A{-P7TjYDal}GaAaf<M{yR!Z=hi3VsK#42l>N=hk=uU3&e8cVc>?aJa`y*
zAS^E)23`g(Q1trnF!(a~F*0z2!ZRZ?C#5JgkC8!DLlfq@<oukR)Z~)P{Jdg)|D@v7
zqB2k%`eYWDShF((Ffs_DxWq3%C6${Yh#`cXA()Xt5h{n<3?7D1hA>73w#1YaM^LDU
zX+(o9M$T~7no*1l9O<bg;55m|Ack-pB&UJJtr;13(o;*|`Hhi50bLy=nBXd`85y{X
zQbBnc6mrF&po`^Uhyw*VDEYbOr9^<l5_lLAL1LWXXh<w70gEQ{Fr<J)p(-OmD${rv
z(m`Tym641L?0Ko>!QkS8r#Q7FB)<R>lZ*^<8ZKa;!pjTfBm+tS4h(i6Lvwi;@<1sE
zVkjsTFfy=~gAxKG18XuUB|=h25UAvU8O~pvTH*vQLSQ1i#i=DescF!J#K^!EoL^d$
zoa&Yd%Aeeje5VJBE(S#gMh0dE1_llWCQt@vU|?VZWeG6N$-o7sxuG-<l;(xfd<^_x
zc>xAN1_lOh21W)U24Mz91`!4ZhBO9du(@(t+ZjZ)b~8vsZfB6%${?-9xRpUxOMNSY
zyw)}b#f@P7Dhvz^QVeVi3=F~yEDQn+{0xE&A`Bu7k_@5@vJ7GjstgPaVhl_S3=DD%
zY7FWOARq^JEh7UXg9d{p)J{7FCa@|tE$yugvIw)ez@m~2tPD~}X0gG|VgnU&3?Q?#
z7_^~g>4W(U46IsP7-ToVoyo?)$iToL3pR!a%w~le!w4!Bp_+ez1A~EKgVt^aok%`D
ztt|}lAiSMHZ!3eL))ofCO$^4{7%V|7zHJP)TDut>pvw5RGdOK!a0ZKjv>@qq+RESx
z7l+G%)w_em!D{&+CU|OXVUXU&;LWj@!9S82WKnP=i`Etf=io??mt2D**|fGWxCckF
zYi(ih4Bp8Q$ixti2r@MWP6h@BMFvp@B?fs0Wd?Ny6$VQNRfa$YHHJ(Eb%tsN4Tkj$
znn>ZW0Ui$F3=z<9Kn_G{^gz@>(u@eiNQNjZnhnu48(`HO4Nrbkp~=q?<Yo133^7_;
z7+lr2F~mb@7(WRV2vBi%^=%BPP(Dc96U0Xk5)%dv1~Uc$26F}p1`7rS1}g>)25SZb
z1{($o20I1^279o>AgR?68YB!1jtm(Lprpgdkjan*^<OvxGXo0)1A`#ciP<1pcN;?v
z!b(1H7II?XU~py-U~mB&tpFAigc~i$kPkMRfkBX=fWd-+nSqg^5UV91|AQ=X#b${+
z0|$c#g8+jk(UufpwFDH1AWPh_S>nUM!Qjgvz~D!;CB;}R0mTf+5>ITF1Tt_i1ThFO
N1QTsZ2{?O~0sspa@rwWe

literal 2338
zcmX^0Z`VEs1_l#`Jaz^qMh3y;{L-T0)bjkIZ2jQE(!`=vb_Nzk27#=^vPAuy#JqHU
z|D>$c<Pt^(mg3B+R7M6y7e)roqSWM)#Ju#JR7M6lACS_t3jN~b)Vx&v;*7+CRQ({B
zyfq^Ob4h*yBZDM1Wj>jCsn(1PtVNmW86}JiY)SbgCHc9G3@kaRX(fydtm#Ghr3H)(
zBB*-ZL88`-3~V-;d6^}4j0`LqE}CJC3@pz1DXClx%nTwt3<3<Ij10^gnqlk=;*1PJ
zC{6_H=VB0J5aDECWRT)v;A7wiv1E7{SQ*&37#JDkco^hC2C$?QC6+TX@PpjxSDKrY
zS`?C)1oE_yPkwS@PFP}5CWsFeWGTtWEM{a7_Q42JYjy@zMg|!aSD*zH7lR6eI>_A`
zj124=E-o%EnqeSEY4I?yGjMP+=rHK9Gw3ohNT3)}keHcQqVJralV8NcpwD2y$iN!z
z;Tht}$RLFpW=IOHK~@>@Fc>qKFfy<gr<S;7=HxIk$ZBBI5dgBlS~Co!$Bc);oI#M0
zfv-5VB)Fs~KRY!%Go>VhoxzfkK^(<d5Wj&!jf=s8K^^1|8y*Hu1}+fGj)#F8!gAnY
z;DNB5co=vYxIl5@!o%Ro;Ks<not|3aoROK6Qk0s<$e^mB33FX?eojtma!F=>Ua`J^
zQgLcg87K;TGK)*B*%>?-83a*W;+LP2%FW=#;KR<~&B&k#mBVcY4}&j*A0q=>VoHi5
zC{)BWqQMp;X9a7`C`Ja3^wbh?LSkePLpTnS2f*Uij0`;KsU`57z{sG0t_~7Ra23{!
z4BSPjpj-wDxnfYzh4L_jfr1<qO|E$<5g@S$9)?Je7$-Oy5{pW}qR~7IF(6T>%1DsP
zI39+0kQiKLBqIZRUTS$TI3x2Er<R1|7eHc?kwH$w1?*FJPDV~LpafvSU<NWYm4_h>
zlyV@3f>Hq^18X@bAuuwqCWBHUB!vWl@-)nF{^HaUCvfJ5iSQPumiVNmK@$=q16Oc<
zX;E^jTP7%baYITXJy3KpC^9fIFf%YPurn}$@+SiW0~07qfN4$!E-=jvrFoz<FO=qE
z;Adc90Hrzs20;c!1|bFphFAt>uz8YN+Zlwlb~A`YZfB6#${?wwzLh~*Ya4^?MzE0z
z3=9ln46F<c3_=Vn3<3=N48jZ|3?d8?45AE*U^ylR1_nt6B?e^%5Re2rj*)>8RCGYC
z`o+M_z{tSBut94#gGwYHpVk%zX%ODdpthAkQ)>%@<|YR1Z48DW7T-1oQ?1<$7Eon;
z+Zn93GFXE}Kw6OWT5V;pg^R=G!0PS6;$XFW5EC4=wlGL;V{qo!%itc#46-OVl0|C^
zgLQButJW3<+u%qxtt|}p!IA7*TNoUJcQSY~F@z&RK#hTufdTAiNd|caDF$^0X$DIM
z8HPXxS%ypoIfiNmd4}~23g8gof%p{~B8&|F3<1z^&}RUJ3j+hlM#&BE;AI1AP)5?s
z3fCOS5QIguCc0*IteS)2kv$a}*`Q#sR^P@D0`jx^HimF04dX|F0s$&+ufB~T7Rm>S
zJA(M=L88sT!Jx|^z@Wz<!JyBez+lLr!C=H-z+lW^!C=bZz+eV;m>2^nkvKwq#lYam
zkiY=)H6ueJLlV?~;S9_SEDQ_`f}mJY-^P#(qII`1q#&&111DHZ1`Y-*1_1_Zu+a)&
zF+sS|f(+?kqZt?k88R3Q7?>Ft88We2Vhgpz7Mmq@3>*yh3<3-eL|c-D)e=x3f_!3+
t%@St@4h9zn0R~s1Ey>1e2`FYjmN;Uw#Djr@!IMFN!HZ~1a=<Aw7XWXF#<Bna

diff --git a/src/coursework/Cage.java b/src/coursework/Cage.java
index c8db961..ac9a83f 100644
--- a/src/coursework/Cage.java
+++ b/src/coursework/Cage.java
@@ -1,8 +1,12 @@
 package coursework;
 
+import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
 
 import javafx.scene.control.Label;
+import javafx.scene.control.TextField;
 import javafx.scene.paint.Color;
 
 public class Cage {
@@ -11,16 +15,116 @@ public class Cage {
 	private int value;
 	private String operator;
 	private Square[] gridSquares;
-	private Label[][] cageLabels;
+	private TextField[] gridNumbers;
+	private Label[] cageLabels;
 	
 	public Cage(int[] squareIds, int value, String operator) {
 		this.squareIds = squareIds;
 		this.value = value;
 		this.operator = operator;
 		this.gridSquares = Main.getGridSquares();
+		this.gridNumbers = Main.getGridNumbers();
 		this.cageLabels = Main.getCageLabels();
 		buildCage();
 		setCageInfo();
+		setSquareCages();
+	}
+	
+	private boolean plusOperator() {
+		String gridValue;
+		int cageVal = 0;
+		for (int id : squareIds) {
+			gridValue = gridNumbers[id].getText();
+			if (!gridValue.equals("")) {
+				cageVal += Integer.parseInt(gridValue);
+			}
+			else {
+				return false;
+			}
+		}
+		if (cageVal == value) {
+			return false;
+		}
+		return true;
+	}
+	
+	private boolean multiplyOperator() {
+		String gridValue;
+		int cageVal = 1;
+		for (int id : squareIds) {
+			gridValue = gridNumbers[id].getText();
+			if (!gridValue.equals("")) {
+				cageVal *= Integer.parseInt(gridValue);
+			}
+			else {
+				return false;
+			}
+		}
+		if (cageVal == value) {
+			return false;
+		}
+		return true;
+	}
+	
+	private boolean subtractOperator() {
+		String gridValue;
+		List<Integer> sortedCageValues = new ArrayList<Integer>();
+		for (int id : squareIds) {
+			gridValue = gridNumbers[id].getText();
+			if (gridValue.equals("")) {
+				return true;
+			}
+			else {
+				sortedCageValues.add(Integer.parseInt(gridValue));
+			}
+		}
+		Collections.sort(sortedCageValues);
+		int cageVal = sortedCageValues.get(0);
+		for (int i = 1; i < sortedCageValues.size() - 1; i++) {
+			cageVal -= sortedCageValues.get(i);
+		}
+		if (cageVal == value) {
+			return false;
+		}
+		return true;
+	}
+	
+	private boolean divideOperator() {
+		String gridValue;
+		List<Integer> sortedCageValues = new ArrayList<Integer>();
+		for (int id : squareIds) {
+			gridValue = gridNumbers[id].getText();
+			if (gridValue.equals("")) {
+				return true;
+			}
+			else {
+				sortedCageValues.add(Integer.parseInt(gridValue));
+			}
+		}
+		Collections.sort(sortedCageValues);
+		int cageVal = sortedCageValues.get(0);
+		for (int i = 1; i < sortedCageValues.size() - 1; i++) {
+			cageVal /= sortedCageValues.get(i);
+		}
+		if (cageVal == value) {
+			return false;
+		}
+		return true;
+	}
+	
+	public boolean checkCageValues() {
+		switch (operator) {
+		case "+":
+			return plusOperator();
+		case "x":
+			return multiplyOperator();
+		case "-":
+			return subtractOperator();
+		case "�":
+			return divideOperator();
+		default:
+			return false;
+		}
 	}
 	
 	public void buildCage() {
@@ -39,16 +143,16 @@ public class Cage {
 					final double WIDTH = 2;
 					
 					if (rowDiff == -1 && colDiff == 0) {
-						gridSquares[aCoord[0]*Main.N + aCoord[1]].setRightStroke(WIDTH, Color.LIGHTGREY);
+						gridSquares[aCoord[0]*Main.N + aCoord[1]].setRightStroke(WIDTH, Color.GREY);
 					}
 					else if (rowDiff == 1 && colDiff == 0) {
-						gridSquares[aCoord[0]*Main.N + aCoord[1]].setLeftStroke(WIDTH, Color.LIGHTGREY);
+						gridSquares[aCoord[0]*Main.N + aCoord[1]].setLeftStroke(WIDTH, Color.GREY);
 					}
 					else if (rowDiff == 0 && colDiff == -1) {
-						gridSquares[aCoord[0]*Main.N + aCoord[1]].setBottomStroke(WIDTH, Color.LIGHTGREY);
+						gridSquares[aCoord[0]*Main.N + aCoord[1]].setBottomStroke(WIDTH, Color.GREY);
 					}
 					else if (rowDiff == 0 && colDiff == 1) {
-						gridSquares[aCoord[0]*Main.N + aCoord[1]].setTopStroke(WIDTH, Color.LIGHTGREY);
+						gridSquares[aCoord[0]*Main.N + aCoord[1]].setTopStroke(WIDTH, Color.GREY);
 					}
 				}
 			}
@@ -59,9 +163,7 @@ public class Cage {
 		if (squareIds.length > 1)
 			Arrays.sort(squareIds);
 		int minVal = squareIds[0];
-		cageLabels[minVal][0].setText(value + " " + operator);
-		cageLabels[minVal][1].setText(value + " " + operator);
-		cageLabels[minVal][1].setVisible(false);
+		cageLabels[minVal].setText(value + operator);
 	}
 	
 	public static int[] idToCoord(int id) {
@@ -69,5 +171,15 @@ public class Cage {
 		int col = id % Main.N;
 		return new int[] {row, col};
 	}
+	
+	public void setSquareCages() {
+		for (Square square : gridSquares) {
+			square.setCage(this);
+		}
+	}
+	
+	public int[] getCageIds() {
+		return squareIds;
+	}
 
 }
\ No newline at end of file
diff --git a/src/coursework/Main.java b/src/coursework/Main.java
index 09e4417..e068d7c 100644
--- a/src/coursework/Main.java
+++ b/src/coursework/Main.java
@@ -6,6 +6,7 @@ import java.io.FileNotFoundException;
 import java.io.FileReader;
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Stack;
 import java.util.Vector;
@@ -53,18 +54,19 @@ public class Main extends Application {
 	
 	
 	private static Square[] gridSquares = new Square[N*N];
-	private TextField[] gridNumbers = new TextField[N*N];
-	private static Label[][] cageLabels = new Label[N*N][2];
+	private static TextField[] gridNumbers = new TextField[N*N];
+	private static Label[] cageLabels = new Label[N*N];
 	private boolean[][] highlightedError = new boolean[N*N][3];
-	private HBox[] gridHBoxes = new HBox[N*N];
+	private VBox[] gridBoxes = new VBox[N*N];
 	private List<Cage> gridCages = new ArrayList<Cage>();
 	
 	private boolean isWider;
-	private HBox previousHBox = null;
+	private Pane previousPane = null;
 	private Square previousSquare = null;
 	private boolean clearing = false;
 	private boolean undoing = false;
 	private boolean showMistakes = false;
+	private int fontSize;
 	
 	private Stack<GameState> undoStack = new Stack<GameState>();
 	private Stack<GameState> redoStack = new Stack<GameState>();
@@ -88,14 +90,18 @@ public class Main extends Application {
 	private GridPane addToGridPane(GridPane gridPane, double size, int i, int j) {
 		Square square = setupGridSquare(size);
 		TextField textField = setupGridTextField(size);
-		HBox hbox = setupGridHBox(square, textField, i, j);
+		HBox hbox = new HBox(textField);
+		hbox.setAlignment(Pos.CENTER);
+		VBox vbox = setupGridVBox(square, i, j);
+		GridPane.setMargin(vbox, new Insets(2));
 		Group group = square.getGroup();
 		
 		gridSquares[i*N + j] = square;
 		gridNumbers[i*N + j] = textField;
-					
+		
 		gridPane.add(group, j, i);
 		gridPane.add(hbox, j, i);
+		gridPane.add(vbox, j, i);
 		
 		textField.textProperty().addListener((observable, oldValue, newValue) -> {
 			if (!clearing && !undoing) {
@@ -104,43 +110,71 @@ public class Main extends Application {
 					undoButton.setDisable(false);
 				}
 			}
-			checkConstraints(textField, j, i);
+			checkConstraints(j, i);
 		});
 		
 		square.getRectangle().toFront();
 		return gridPane;
 	}
 	
-	private void checkConstraints(TextField textField, int col, int row) {
-		String value = textField.getText();
-		boolean found = false;
+	private void checkConstraints(int col, int row) {
+		columnConstraint(row, col);
+		rowConstraint(row, col);
+		highlightCells();
+	}
+
+	private void rowConstraint(int row, int col) {
+		boolean repeat = false;
+		HashSet<String> rowValues = new HashSet<String>();
+		String number;
 		for (int i = 0; i < N; i++) {
-			if (!gridNumbers[row*N + i].getText().equals("")) {
-				if (gridNumbers[row*N + i].getText().equals(value) && i != col) {
-					highlightRow(row);
-					found = true;
-					break;
-				}
+			number = gridNumbers[row*N + i].getText();
+			if (rowValues.contains(number) && !number.equals("")) {
+				repeat = true;
+			}
+			else {
+				rowValues.add(number);
 			}
 		}
-		if (!found) {
+		
+		if (!repeat) {
 			clearRow(row);
 		}
-		
-		found = false;
+		else {
+			highlightRow(row);
+		}
+	}
+	
+	private void columnConstraint(int row, int col) {
+		boolean repeat = false;
+		HashSet<String> colValues = new HashSet<String>();
+		String number;
 		for (int i = 0; i < N; i++) {
-			if (!gridNumbers[i*N + col].getText().equals("")) {
-				if (gridNumbers[i*N + col].getText().equals(value) && i != row) {
-					highlightColumn(col);
-					found = true;
-					break;
-				}
+			number = gridNumbers[i*N + col].getText();
+			if (colValues.contains(number) && !number.equals("")) {
+				repeat = true;
+			}
+			else {
+				colValues.add(number);
 			}
 		}
-		if (!found) {
+		
+		if (!repeat) {
 			clearColumn(col);
 		}
-		highlightCells();
+		else {
+			highlightColumn(col);
+		}
+	}
+		
+	private void cageConstraint(int row, int col) {
+		if (gridCages.size() > 0) {
+			Cage cage = gridSquares[row*N + col].getCage();
+			boolean cageConstraintsValue = cage.checkCageValues();
+			for (int id : cage.getCageIds()) {
+				highlightedError[id][2] = cageConstraintsValue;
+			}
+		}
 	}
 	
 	private void clearRow(int row) {
@@ -170,51 +204,47 @@ public class Main extends Application {
 	private void highlightCells() {
 		for (int i = 0; i < N*N; i++) {
 			if ((highlightedError[i][0] || highlightedError[i][1] || highlightedError[i][2]) && showMistakes) {
-				gridHBoxes[i].setStyle("-fx-background-color: rgba(255,0,20,0.4);");
+				gridBoxes[i].setStyle("-fx-background-color: rgba(255,0,0,0.5);");
 			}
 			else {
-				gridHBoxes[i].setStyle("-fx-background-color: rgba(255,0,20,0);");
+				gridBoxes[i].setStyle("-fx-background-color: rgba(255,0,0,0);");
 			}
 		}
 	}
 	
-	private HBox setupGridHBox(Square square, TextField textField, int i, int j) {
-		HBox hbox = new HBox();
+	private VBox setupGridVBox(Square square, int i, int j) {
 		VBox vbox = new VBox();
 		Label cageInfoLabel = new Label("");
-		Label balanceLabel = new Label("");
 		
-		cageLabels[i*N + j][0] = cageInfoLabel;
-		cageLabels[i*N + j][1] = balanceLabel;
+		cageLabels[i*N + j] = cageInfoLabel;
 		
-		vbox.getChildren().addAll(cageInfoLabel, textField, balanceLabel);
-		vbox.setAlignment(Pos.CENTER);
-		hbox.getChildren().add(vbox);
-		hbox.setAlignment(Pos.CENTER);
-		gridHBoxes[i*N + j] = hbox;
-		hboxClickSquareEvent(i, j, square);
+		vbox.getChildren().addAll(cageInfoLabel);
+		vbox.setStyle("-fx-border-width: 0px;");
+		vbox.setPadding(new Insets(5));
+		gridBoxes[i*N + j] = vbox;
+		paneClickSquareEvent(i, j, square);
 
-		return hbox;
+		return vbox;
 	}
 	
 	private Square setupGridSquare(double size) {
+		final double WIDTH = 3;
 		Square square = new Square(size);
-		square.setTopStroke(3, Color.BLACK);
-		square.setBottomStroke(3, Color.BLACK);
-		square.setLeftStroke(3, Color.BLACK);
-		square.setRightStroke(3, Color.BLACK);
+		square.setTopStroke(WIDTH, Color.BLACK);
+		square.setBottomStroke(WIDTH, Color.BLACK);
+		square.setLeftStroke(WIDTH, Color.BLACK);
+		square.setRightStroke(WIDTH, Color.BLACK);
 		square.resizeLines(size);
 		return square;
 	}
 	
 	private TextField setupGridTextField(double size) {
-		final double PERCENT = 0.7;
 		TextField textField = new TextField();
 		textField.setMinWidth(size/4);
-		textField.setPrefSize(size*PERCENT, size*PERCENT);
+		textField.setPrefSize(size*0.9, size*0.9);
 		textField.setAlignment(Pos.CENTER);
-		textField.setStyle("-fx-focus-color: transparent;");
-		textField.setStyle("-fx-text-box-border: transparent;");
+		textField.setPadding(new Insets(5));
+		textField.setStyle("-fx-focus-color: transparent; -fx-text-box-border: transparent; -fx-background-color: -fx-text-box-border, -fx-control-inner-background;");
 		return textField;
 	}
 
@@ -233,7 +263,6 @@ public class Main extends Application {
 		
 		showMistakesCheck.selectedProperty().addListener((obs, oldVal, newVal) -> {
 			showMistakes = showMistakesCheck.isSelected();
-			System.out.println(showMistakes + ", " + showMistakesCheck.isSelected());
 			highlightCells();
 		});
 		
@@ -274,7 +303,8 @@ public class Main extends Application {
 		int value = Integer.parseInt(splitLine[0].substring(0, splitLine[0].length()- 1));
 		String operator = splitLine[0].substring(splitLine[0].length() - 1);
 		
-		new Cage(ids, value, operator);
+		Cage cage = new Cage(ids, value, operator);
+		gridCages.add(cage);
 	}
 	
 	
@@ -329,37 +359,36 @@ public class Main extends Application {
 		return bottomHBox;
 	}
 	
-	private void hboxClickSquareEvent(int i, int j, Square square) {
-		gridHBoxes[i*N + j].addEventHandler(MouseEvent.MOUSE_CLICKED, e -> {
-			if (previousHBox != null) {
-				int previousIndex = getIndexOf(previousHBox);
-				if (highlightedError[previousIndex][0] || highlightedError[previousIndex][1] || highlightedError[previousIndex][2]) {
-					previousHBox.setStyle("-fx-background-color: rgba(255,0,20,0.4); -fx-border-width:0px;");
+	private void paneClickSquareEvent(int i, int j, Square square) {
+		gridBoxes[i*N + j].addEventHandler(MouseEvent.MOUSE_CLICKED, e -> {
+			if (previousPane != null) {
+				int previousIndex = getIndexOf(previousPane);
+				if ((highlightedError[previousIndex][0] || highlightedError[previousIndex][1] || highlightedError[previousIndex][2]) && showMistakes) {
+					previousPane.setStyle("-fx-background-color: rgba(255,0,20,0.5); -fx-border-width: 0px;");
 				}
 				else {
-					previousHBox.setStyle("-fx-border-width:0px;");
+					previousPane.setStyle("-fx-background-color: rgba(255,0,20,0); -fx-border-width: 0px;");
 				}
 			}
-			
-			if (highlightedError[i*N + j][0] || highlightedError[i*N + j][1] || highlightedError[i*N + j][2]) {
-				gridHBoxes[i*N + j].setStyle("-fx-background-color: rgba(255,0,20,0.4); -fx-border-color: #0016CD; -fx-border-width:3px;");
+			if ((highlightedError[i*N + j][0] || highlightedError[i*N + j][1] || highlightedError[i*N + j][2]) && showMistakes) {
+				gridBoxes[i*N + j].setStyle("-fx-border-color: #2309FB; -fx-border-width: 2px; -fx-background-color: rgba(255,0,0,0.3);");
 			}
 			else {
-				gridHBoxes[i*N + j].setStyle("-fx-border-color: #0016CD; -fx-border-width:3px;");
+				gridBoxes[i*N + j].setStyle("-fx-border-color: #2309FB; -fx-border-width: 2px; -fx-background-color: rgba(255,0,0,0);");
 			}
 			
-			
-			previousHBox = gridHBoxes[i*N + j];
+			previousPane = gridBoxes[i*N + j];
 			previousSquare = square;
 			for (TextField textField : gridNumbers) {
 				textField.deselect();
 			}
+			gridNumbers[i*N + j].requestFocus();
 		});
 	}
 	
-	private int getIndexOf(HBox hbox) {
+	private int getIndexOf(Pane pane) {
 		for (int i = 0; i < N*N; i++) {
-			if (hbox.equals(gridHBoxes[i])) {
+			if (pane.equals(gridBoxes[i])) {
 				return i;
 			}
 		}
@@ -441,6 +470,7 @@ public class Main extends Application {
 			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);
@@ -460,8 +490,79 @@ public class Main extends Application {
 				}
 			}
 		}
-		else {
-			// Some message about selecting a cell first
+	}
+	
+	private HBox setupFontSizeHBox() {
+		HBox hbox = new HBox();
+		Button minus = new Button("-");
+		Button font12 = new Button("Tiny");
+		Button font16 = new Button("Small");
+		Button font20 = new Button("Medium");
+		Button font24 = new Button("Large");
+		Button font28 = new Button("Huge");
+		Button plus = new Button("+");
+		
+		plus.setStyle("-fx-font-size:28px;");
+		plus.setOnAction(e -> {
+			changeFontSize(fontSize + 1, minus, plus);
+		});
+		minus.setStyle("-fx-font-size:12px;");
+		minus.setOnAction(e -> {
+			changeFontSize(fontSize - 1, minus, plus);
+		});
+		
+		font12.setStyle("-fx-font-size:12px;");
+		font12.setOnAction(e -> {
+			changeFontSize(12, minus, plus);
+		});
+		
+		font16.setStyle("-fx-font-size:16px;");
+		font16.setOnAction(e -> {
+			changeFontSize(16, minus, plus);
+		});
+		
+		font20.setStyle("-fx-font-size:20px;");
+		font20.setOnAction(e -> {
+			changeFontSize(20, minus, plus);
+		});
+		
+		font24.setStyle("-fx-font-size:24px;");
+		font24.setOnAction(e -> {
+			changeFontSize(24, minus, plus);
+		});
+		
+		font28.setStyle("-fx-font-size:28px;");
+		font28.setOnAction(e -> {
+			changeFontSize(28, minus, plus);
+		});
+		
+		hbox.getChildren().addAll(minus, font12, font16, font20, font24, font28, plus);
+		hbox.setSpacing(10);
+		hbox.setAlignment(Pos.CENTER);
+		return hbox;
+	}
+	
+	private void changeFontSize(int size, Button minus, Button plus) {
+		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 + ";");
+		}
+		for (Label label : cageLabels) {
+			label.setStyle("-fx-font-size:" + size + ";");
+		}
+		if (fontSize == 10) {
+			minus.setDisable(true);
+		}
+		else if (fontSize > 10) {
+			minus.setDisable(false);
+		}
+		if (fontSize == 30) {
+			plus.setDisable(true);
+		}
+		else if (fontSize < 30) {
+			plus.setDisable(false);
 		}
 	}
 	
@@ -469,32 +570,38 @@ public class Main extends Application {
 		return gridSquares;
 	}
 	
-	public static Label[][] getCageLabels() {
+	public static Label[] getCageLabels() {
 		return cageLabels;
 	}
 	
+	public static TextField[] getGridNumbers() {
+		return gridNumbers;
+	}
+	
 	@Override
 	public void start(Stage stage) throws Exception {
 		VBox vBox = new VBox();
-		scene = new Scene(vBox,500 + 50*N,500 + 50*N);
+		scene = new Scene(vBox,400+50*N,450+50*N);
 		vBox.setSpacing(10);
-		vBox.setPadding(new Insets(20, 20, 20, 20));
+		vBox.setPadding(new Insets(20));
 		vBox.setAlignment(Pos.CENTER);
 		
 		GridPane gridPane = setupGrid();
 		undoStack.push(new GameState(GameState.getCurrentGameState(gridNumbers)));
 		
+		fontSize = (int) gridNumbers[0].getFont().getSize();
+		HBox fontSizeHBox = setupFontSizeHBox();
 		HBox topHBox = setupTopHBox();
 		HBox centerHBox = setupCenterHBox();
 		HBox bottomHBox = setupBottomHBox();
 		
-		vBox.getChildren().addAll(topHBox, gridPane, centerHBox, bottomHBox);
+		vBox.getChildren().addAll(topHBox, gridPane, centerHBox, bottomHBox, fontSizeHBox);
 		
 		stageWidthResizeEvent(stage, gridPane);
 		stageHeightResizeEvent(stage, gridPane);
 		
-		stage.setMinWidth(400 + 50*N);
-		stage.setMinHeight(400 + 50*N);
+		stage.setMinWidth(500 + 50*N);
+		stage.setMinHeight(500 + 50*(N+1));
 		stage.setScene(scene);
 		stage.setTitle("Mathdoku");
 		stage.show();
diff --git a/src/coursework/Square.java b/src/coursework/Square.java
index c441424..8aa589a 100644
--- a/src/coursework/Square.java
+++ b/src/coursework/Square.java
@@ -14,12 +14,21 @@ public class Square {
 	private Line bottom;
 	private Line left;
 	private Group group = new Group();
+	private Cage cage = null;
 	
 	public Square(double size) {
 		this.size = size;
 		draw();
 	}
 	
+	public void setCage(Cage cage) {
+		this.cage = cage;
+	}
+	
+	public Cage getCage() {
+		return cage;
+	}
+	
 	public void draw() {
 		rectangle = new Rectangle(0, 0, size, size);
 		rectangle.setFill(Color.WHITE);
-- 
GitLab