diff options
Diffstat (limited to 'src/jcgp/gui/SettingsPane.java')
| -rw-r--r-- | src/jcgp/gui/SettingsPane.java | 253 | 
1 files changed, 241 insertions, 12 deletions
diff --git a/src/jcgp/gui/SettingsPane.java b/src/jcgp/gui/SettingsPane.java index f7e7767..594147f 100644 --- a/src/jcgp/gui/SettingsPane.java +++ b/src/jcgp/gui/SettingsPane.java @@ -1,37 +1,266 @@  package jcgp.gui; +import java.util.ArrayList;  import java.util.Iterator;  import java.util.Map;  import java.util.Map.Entry; +import javafx.event.ActionEvent; +import javafx.event.EventHandler; +import javafx.geometry.Insets; +import javafx.scene.Cursor; +import javafx.scene.control.CheckBox; +import javafx.scene.control.ComboBox; +import javafx.scene.input.MouseEvent; +import javafx.scene.layout.AnchorPane;  import javafx.scene.layout.VBox; +import javafx.scene.text.Font;  import javafx.scene.text.Text; +import jcgp.GUI;  import jcgp.JCGP; +import jcgp.function.FunctionSet; +import jcgp.gui.settings.GUIBooleanParameter; +import jcgp.gui.settings.GUIDoubleParameter;  import jcgp.gui.settings.GUIIntegerParameter; +import jcgp.gui.settings.GUIParameter; +import jcgp.modules.ea.EvolutionaryAlgorithm; +import jcgp.modules.fitness.FitnessFunction; +import jcgp.modules.mutator.Mutator; +import jcgp.parameters.BooleanParameter; +import jcgp.parameters.DoubleParameter;  import jcgp.parameters.IntegerParameter;  import jcgp.parameters.Parameter; -public class SettingsPane extends VBox { +public class SettingsPane extends AnchorPane { +	private VBox mainContainer, eas, mutators, ffs; +	private boolean dragging = false; +		  	public SettingsPane(JCGP cgp) {  		super(); -		setPrefSize(180, 500); +		setResizeListeners(); -		Text parameters = new Text("Parameters"); -		getChildren().add(parameters); +		//setStyle("-fx-border-width: 0 0 0 5; -fx-border-color: #D1D1D1"); -		Iterator<Entry<String, Parameter>> it = cgp.getResources().iterator(); -	    while (it.hasNext()) { -	    	Parameter p = (Parameter) ((Map.Entry<String, Parameter>) it.next()).getValue(); -	    	if (p instanceof IntegerParameter) { -	    		GUIIntegerParameter gip = new GUIIntegerParameter((IntegerParameter) p); -	    		getChildren().add(gip); -	    	} -	    } +		mainContainer = new VBox(); +		 +		AnchorPane.setTopAnchor(mainContainer, 0.0); +		AnchorPane.setBottomAnchor(mainContainer, 0.0); +		AnchorPane.setRightAnchor(mainContainer, 0.0); +		AnchorPane.setLeftAnchor(mainContainer, GUI.RESIZE_MARGIN); +		mainContainer.setPadding(new Insets(5, 0, 0, 0)); +		mainContainer.setSpacing(6); +		 +		setMinWidth(GUI.SETTINGS_WIDTH); +		setPrefWidth(GUI.SETTINGS_WIDTH); +		 +		makeBaseParameters(cgp); +		makeEAParameters(cgp); +		mainContainer.getChildren().add(eas);  +		 +		makeMutatorParameters(cgp); +		mainContainer.getChildren().add(mutators); +		makeFitnessFunctionParameters(cgp); +		mainContainer.getChildren().add(ffs); +		 +		makeNodeFunctionParameters(cgp); +				 +		getChildren().add(mainContainer); +	} + +	private void makeBaseParameters(JCGP cgp) { +		VBox vb = new VBox(); +		vb.setSpacing(2); +		 +		Text header = new Text("Base Parameters"); +		header.setFont(Font.font("Arial", 14)); +		header.setUnderline(true);	 +		 +		vb.getChildren().add(header); +		 +		ArrayList<GUIParameter> gp = new ArrayList<GUIParameter>(); +		 +		gp.add(new GUIIntegerParameter((IntegerParameter) cgp.getResources().getParameter("rows"))); +		gp.add(new GUIIntegerParameter((IntegerParameter) cgp.getResources().getParameter("columns"))); +		gp.add(new GUIIntegerParameter((IntegerParameter) cgp.getResources().getParameter("inputs"))); +		gp.add(new GUIIntegerParameter((IntegerParameter) cgp.getResources().getParameter("outputs"))); +		gp.add(new GUIIntegerParameter((IntegerParameter) cgp.getResources().getParameter("levelsBack"))); +		 +		gp.add(new GUIIntegerParameter((IntegerParameter) cgp.getResources().getParameter("popSize"))); +		gp.add(new GUIIntegerParameter((IntegerParameter) cgp.getResources().getParameter("generations"))); +		gp.add(new GUIIntegerParameter((IntegerParameter) cgp.getResources().getParameter("runs"))); +		 +		gp.add(new GUIIntegerParameter((IntegerParameter) cgp.getResources().getParameter("seed"))); +		gp.add(new GUIIntegerParameter((IntegerParameter) cgp.getResources().getParameter("report"))); +		gp.add(new GUIBooleanParameter((BooleanParameter) cgp.getResources().getParameter("debug"))); +		 +		vb.getChildren().addAll(gp); +		 +		mainContainer.getChildren().add(vb); +	} + +	private void makeEAParameters(JCGP cgp) { +		eas = new VBox(); +		eas.setSpacing(2); +		 +		Text header = new Text("EA"); +		header.setFont(Font.font("Arial", 14)); +		header.setUnderline(true); +		 +		eas.getChildren().add(header); +		 +		ComboBox<EvolutionaryAlgorithm> eab = new ComboBox<EvolutionaryAlgorithm>(); +		eab.getItems().addAll(cgp.getEvolutionaryAlgorithms()); +		eab.getSelectionModel().select(cgp.getEvolutionaryAlgorithm()); +		eab.prefWidthProperty().bind(mainContainer.widthProperty()); +		eas.getChildren().add(eab); +		 +		addParameters(cgp.getEvolutionaryAlgorithm().getLocalParameters().entrySet().iterator(), eas); +	} + +	private void makeMutatorParameters(JCGP cgp) { +		mutators = new VBox(); +		mutators.setSpacing(2); +		 +		Text header = new Text("Mutator"); +		header.setFont(Font.font("Arial", 14)); +		header.setUnderline(true); +		 +		mutators.getChildren().add(header); +		 +		ComboBox<Mutator> mb = new ComboBox<Mutator>(); +		mb.getItems().addAll(cgp.getMutators()); +		mb.getSelectionModel().select(cgp.getMutator()); +		mb.prefWidthProperty().bind(mainContainer.widthProperty()); +		mutators.getChildren().add(mb); +		 +		addParameters(cgp.getMutator().getLocalParameters().entrySet().iterator(), mutators); +	} +	 +	private void makeFitnessFunctionParameters(JCGP cgp) { +		ffs = new VBox(); +		ffs.setSpacing(2); +		 +		Text header = new Text("Fitness Function"); +		header.setFont(Font.font("Arial", 14)); +		header.setUnderline(true); +		 +		ffs.getChildren().add(header); +		 +		ComboBox<FitnessFunction> ff = new ComboBox<FitnessFunction>(); +		ff.getItems().addAll(cgp.getFitnessFunctions()); +		ff.getSelectionModel().select(cgp.getFitnessFunction()); +		ff.prefWidthProperty().bind(mainContainer.widthProperty()); +		ffs.getChildren().add(ff);  +		 +		addParameters(cgp.getFitnessFunction().getLocalParameters().entrySet().iterator(), ffs); +	} +	 +	private void makeNodeFunctionParameters(JCGP cgp) { +		VBox vb = new VBox(); +		vb.setSpacing(2); +		 +		Text header = new Text("Node Functions"); +		header.setFont(Font.font("Arial", 14)); +		header.setUnderline(true); +		 +		vb.getChildren().add(header); +		 +		ComboBox<FunctionSet> nf = new ComboBox<FunctionSet>(); +		nf.getItems().addAll(cgp.getResources().getFunctionSets()); +		nf.getSelectionModel().select(cgp.getResources().getFunctionSet()); +		nf.prefWidthProperty().bind(mainContainer.widthProperty()); +		vb.getChildren().add(nf); +		 +		// TODO make this function re-usable +		addFunctions(cgp.getResources().getFunctionSet(), vb); +		 +		mainContainer.getChildren().add(vb);   	} +	/** +	 * @param cgp +	 * @param vb +	 */ +	private void addParameters(Iterator<Entry<String, Parameter>> it, VBox vb) { +	    while (it.hasNext()) { +	        Parameter parameter = ((Map.Entry<String, Parameter>) it.next()).getValue(); +	        if (parameter instanceof IntegerParameter) { +	        	vb.getChildren().add(new GUIIntegerParameter((IntegerParameter) parameter)); +	        } else if (parameter instanceof DoubleParameter) { +	        	vb.getChildren().add(new GUIDoubleParameter((DoubleParameter) parameter)); +	        } else if (parameter instanceof BooleanParameter) { +	        	vb.getChildren().add(new GUIBooleanParameter((BooleanParameter) parameter)); +	        } +	    } +	} +	private void addFunctions(final FunctionSet fs, VBox vb) { +		CheckBox cb; +		for (int i = 0; i < fs.getTotalFunctionCount(); i++) { +			cb = new CheckBox(fs.getFunction(i).getName()); +			cb.setId(String.valueOf(i)); +			cb.setSelected(true); +			final int index = i; +			cb.setOnAction(new EventHandler<ActionEvent>() { +				@Override +				public void handle(ActionEvent event) { +					if (((CheckBox) event.getSource()).isSelected()) { +						fs.enableFunction(index); +					} else { +						fs.disableFunction(index); +					} +				} +			}); +			vb.getChildren().add(cb); +		} +	} +	private void setResizeListeners() { +		setOnMousePressed(new EventHandler<MouseEvent>() { +			@Override +			public void handle(MouseEvent event) { +		        if(isInDraggableZone(event)) { +			        dragging = true; +		        } +			} +		}); +		setOnMouseDragged(new EventHandler<MouseEvent>() { +			@Override +			public void handle(MouseEvent event) { +				if(dragging) { +					double newWidth = getWidth() - event.getX(); +					if (newWidth >= getMinWidth()) { +						setPrefWidth(newWidth); +					} else { +						setPrefWidth(getMinWidth()); +					} +				} +			} +		}); +		setOnMouseMoved(new EventHandler<MouseEvent>() { +			@Override +			public void handle(MouseEvent event) { +				if(isInDraggableZone(event) || dragging) { +		            setCursor(Cursor.H_RESIZE); +		        } +		        else { +		            setCursor(Cursor.DEFAULT); +		        } +			} +		}); +		setOnMouseReleased(new EventHandler<MouseEvent>() { +			@Override +			public void handle(MouseEvent event) { +				dragging = false; +		        setCursor(Cursor.DEFAULT); +			} +		}); +	} +	private boolean isInDraggableZone(MouseEvent event) { +        return event.getX() < (GUI.RESIZE_MARGIN); +    } +		  }  | 
