From 98e02b48ea5b83fa6c3247869b841b0afd260a89 Mon Sep 17 00:00:00 2001
From: Eduardo Pedroni <e.pedroni91@gmail.com>
Date: Sun, 23 Nov 2014 16:06:59 +0000
Subject: Commented some new files, optimised some methods, moved as much
 setting up as possible into the GUIGene constructors - ChromosomePane is
 slightly tidier now.

---
 src/jcgp/gui/constants/Constants.java | 52 ++++++++++++++---------
 src/jcgp/gui/constants/Position.java  | 79 +++++++++++++++++++++++++++++++----
 2 files changed, 104 insertions(+), 27 deletions(-)

(limited to 'src/jcgp/gui/constants')

diff --git a/src/jcgp/gui/constants/Constants.java b/src/jcgp/gui/constants/Constants.java
index 350f8b1..d53b1ca 100644
--- a/src/jcgp/gui/constants/Constants.java
+++ b/src/jcgp/gui/constants/Constants.java
@@ -1,52 +1,62 @@
 package jcgp.gui.constants;
 
+import javafx.scene.paint.Paint;
+
 /**
  * Holds the constants used in the GUI.
  * 
  * @author Eduardo Pedroni
  *
  */
-public abstract class Constants {
+public final class Constants {
 
+	/**
+	 * Private constructor to prevent instantiation.
+	 */
+	private Constants(){}
+	
 	/* Colours */
 	/**
-	 * A string containing the hexadecimal colour used for representing neutrality.
+	 * A {@code Paint} containing the colour used for representing neutrality.
 	 */
-	public static final String NEUTRAL_COLOUR = "#FFFFFF";
+	public static final Paint NEUTRAL_COLOUR = Paint.valueOf("#FFFFFF");
 	/**
-	 * A string containing the hexadecimal colour used for representing a hard highlight.
+	 * A {@code Paint} containing the colour used for representing a hard highlight.
 	 * A "hard" select, for instance, happens when an output path is locked on the chromosome
 	 * pane.
 	 */
-	public static final String HARD_HIGHLIGHT_COLOUR = "#5496FF";
+	public static final Paint HARD_HIGHLIGHT_COLOUR = Paint.valueOf("#5496FF");
 	/**
-	 * A string containing the hexadecimal colour used for a medium highlight.
+	 * A {@code Paint} containing the colour used for a medium highlight.
 	 * One example of such a selection is the colour applied to a node
 	 * when it is hovered over.
 	 */
-	public static final String MEDIUM_HIGHLIGHT_COLOUR = "#75BAFF";
+	public static final Paint MEDIUM_HIGHLIGHT_COLOUR = Paint.valueOf("#75BAFF");
 	/**
-	 * A string containing the hexadecimal colour used for a soft highlight.
+	 * A {@code Paint} containing the colour used for a soft highlight.
 	 * When hovering over a node, its connections are soft-selected.
 	 */
-	public static final String SOFT_HIGHLIGHT_COLOUR = "#C7DFFF";
+	public static final Paint SOFT_HIGHLIGHT_COLOUR = Paint.valueOf("#C7DFFF");
 	/**
-	 * A string containing the hexadecimal colour used for representing a good selection.
+	 * A {@code Paint} containing the colour used for representing a good selection.
 	 * Ideally a shade of green, used for instance when a manual connection is valid.
 	 */
-	public static final String GOOD_SELECTION_COLOUR = "#38C25B";
+	public static final Paint GOOD_SELECTION_COLOUR = Paint.valueOf("#38C25B");
 	/**
-	 * A string containing the hexadecimal colour used for representing a neutral selection.
+	 * A {@code Paint} containing the colour used for representing a neutral selection.
 	 * Ideally a shade of yellow, used for instance when a manual connection is already the
 	 * current connection.
 	 */
-	public static final String NEUTRAL_SELECTION_COLOUR = "#FFEF73";
+	public static final Paint NEUTRAL_SELECTION_COLOUR = Paint.valueOf("#FFEF73");
 	/**
-	 * A string containing the hexadecimal colour used for representing a bad selection.
+	 * A {@code Paint} containing the colour used for representing a bad selection.
 	 * Ideally a shade of red, use for instance when a manual connection is not valid.
 	 */
-	public static final String BAD_SELECTION_COLOUR = "#FF5C5C";
-	
+	public static final Paint BAD_SELECTION_COLOUR = Paint.valueOf("#FF5C5C");
+	/**
+	 * A {@code Paint} containing the colour used for the gene sockets.
+	 */
+	public static final Paint SOCKET_COLOUR = Paint.valueOf("#FFFFFF");
 	
 	
 	/* Sizes and distances */
@@ -74,13 +84,15 @@ public abstract class Constants {
 	 */
 	public static final double SPACING = 15;
 	/**
-	 * The angle across which the node's sockets are evently distributed.
+	 * The margin between the genes and the edge of the chromosome pane.
+	 */
+	public static final double CHROMOSOME_PANE_MARGIN = 10;
+	/**
+	 * The angle across which the node's sockets are evenly distributed.
 	 */
 	public static final double THETA = Math.PI / 1.4;
 	/**
-	 * The radius of the connection sockets, calculated as a function of
-	 * NODE_RADIUS.
-	 * 
+	 * The radius of the connection sockets, calculated as a function of NODE_RADIUS.
 	 */
 	public static final double SOCKET_RADIUS = Math.sqrt(NODE_RADIUS) / 1.8;
 	/**
diff --git a/src/jcgp/gui/constants/Position.java b/src/jcgp/gui/constants/Position.java
index a13d21e..144ba6d 100644
--- a/src/jcgp/gui/constants/Position.java
+++ b/src/jcgp/gui/constants/Position.java
@@ -1,5 +1,6 @@
 package jcgp.gui.constants;
 
+import javafx.scene.shape.Circle;
 import javafx.scene.shape.Line;
 import jcgp.gui.GUI;
 import jcgp.gui.population.GUIGene;
@@ -7,34 +8,98 @@ import jcgp.gui.population.GUIInput;
 import jcgp.gui.population.GUINode;
 import jcgp.gui.population.GUIOutput;
 
+/**
+ * Abstracts the task of positioning GUI components.
+ * <br>
+ * Do not instantiate this class; instead, use the {@code public static} methods provided.
+ * 
+ * @author Eduardo Pedroni
+ *
+ */
 public final class Position {
 	
+	/**
+	 * Private constructor to prevent instantiation.
+	 */
+	private Position() {}
+	
+	/**
+	 * Sets the X and Y layouts of the specified input to the appropriate values, according to its index.
+	 * 
+	 * @param input the {@code GUIInput} instance to relocate.
+	 */
 	public static void place(GUIInput input) {
-		input.relocate(0,
-				input.getInput().getIndex() * (2 * Constants.NODE_RADIUS + Constants.SPACING));
+		// inputs are the first column, so we only worry about the margin and their index
+		input.relocate(Constants.CHROMOSOME_PANE_MARGIN,
+				input.getInput().getIndex() * (2 * Constants.NODE_RADIUS + Constants.SPACING) + Constants.CHROMOSOME_PANE_MARGIN);
 	}
 	
+	/**
+	 * Sets the X and Y layouts of the specified node to the appropriate values, according to its row and column values.
+	 * This also connects the start of every line with its respective socket. Therefore, this method should be called at least
+	 * once when the {@code GUINode} is instantiated.
+	 * 
+	 * @param node the {@code GUINode} instance to relocate.
+	 */
 	public static void place(GUINode node) {
-		// TODO cut down method calls
-		double xOffset = ((node.getNode().getColumn() + 1) * (2 * Constants.NODE_RADIUS + Constants.SPACING));
-		double yOffset = node.getNode().getRow() * (2 * Constants.NODE_RADIUS + Constants.SPACING);
+		// calculate x and y offsets, in relation to the layout origin
+		double xOffset = (node.getNode().getColumn() + 1) * (2 * Constants.NODE_RADIUS + Constants.SPACING) + Constants.CHROMOSOME_PANE_MARGIN;
+		double yOffset = node.getNode().getRow() * (2 * Constants.NODE_RADIUS + Constants.SPACING) + Constants.CHROMOSOME_PANE_MARGIN;
+		
+		// move node
 		node.relocate(xOffset, yOffset);
 		
+		// use the offset and the socket positions to connect the lines
 		for (int i = 0; i < GUI.resources.arity(); i++) {
 			node.getLine(i).setStartX(node.getSocket(i).getCenterX() + xOffset + Constants.NODE_RADIUS + Constants.SOCKET_RADIUS);
 			node.getLine(i).setStartY(node.getSocket(i).getCenterY() + yOffset + Constants.NODE_RADIUS);
 		}
 	}
 	
+	/**
+	 * Sets the X and Y layouts of the specified output to the appropriate values, according to its index.
+	 * This also connects the start of the output's single line to its single input socket.Therefore,
+	 * this method should be called at least once when the {@code GUIOutput} is instantiated.
+	 * 
+	 * @param output the {@code GUIOutput} instance to relocate.
+	 */
 	public static void place(GUIOutput output) {
-		output.relocate(((GUI.resources.columns() + 1) * (2 * Constants.NODE_RADIUS + Constants.SPACING)),
-				output.getOutput().getIndex() * (2 * Constants.NODE_RADIUS + Constants.SPACING));
+		// the output's position is a function of the number of columns and its own index
+		output.relocate(((GUI.resources.columns() + 1) * (2 * Constants.NODE_RADIUS + Constants.SPACING)) + Constants.CHROMOSOME_PANE_MARGIN,
+				output.getOutput().getIndex() * (2 * Constants.NODE_RADIUS + Constants.SPACING) + Constants.CHROMOSOME_PANE_MARGIN);
 		output.getLine().setStartX(output.getLayoutX() - Constants.NODE_RADIUS);
 		output.getLine().setStartY(output.getLayoutY());
 	}
 	
+	
+	
+	/**
+	 * Connects the end of a specified line to the specified gene.
+	 * 
+	 * @param line the line to connect.
+	 * @param target the target gene to connect to.
+	 */
 	public static void connect(Line line, GUIGene target) {
+		// set line ends based on the layout position of the target
 		line.setEndX(target.getLayoutX() + Constants.NODE_RADIUS);
 		line.setEndY(target.getLayoutY());
 	}
+
+	/**
+	 * Relocates the given socket to the appropriate position given the 
+	 * socket's index.
+	 * 
+	 * @param index the socket index.
+	 * @param socket the {@code Circle} instance to relocate.
+	 */
+	public static void placeSocket(int index, Circle socket) {
+		// calculate the angle with respect to the x-axis
+		double angle = (((index + 1) / ((double) (GUI.resources.arity() + 1))) * Constants.THETA) - (Constants.THETA / 2);
+		// convert to cartesian form
+		double xPos = -Math.cos(angle) * Constants.NODE_RADIUS;
+		double yPos = Math.sin(angle) * Constants.NODE_RADIUS;
+		// set centre
+		socket.setCenterX(xPos);
+		socket.setCenterY(yPos);
+	}
 }
-- 
cgit v1.2.3