/**
* Copyright 2013
*
* HAN University of Applied Sciences
* Maik Diepenbroek
* Wouter Konecny
* Sjoerd van den Top
* Teun van Vegchel
* Niek Versteege
*
* See the file MIT-license.txt for copying permission.
*/
package nl.han.ica.app.controllers;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.scene.Parent;
import javafx.scene.control.Control;
import javafx.scene.control.Label;
import javafx.scene.layout.GridPane;
import javafx.scene.web.WebView;
import nl.han.ica.app.models.CodeEditor;
import nl.han.ica.app.models.parameter.ParameterChangeListener;
import nl.han.ica.app.models.parameter.ParameterControlFactory;
import nl.han.ica.app.models.parameter.ParameterEvent;
import nl.han.ica.core.Delta;
import nl.han.ica.core.Parameter;
import javax.swing.event.EventListenerList;
import java.io.IOException;
import java.net.URL;
import java.util.Map;
import java.util.ResourceBundle;
import org.apache.log4j.Logger;
/**
* Handles the presentation of a single delta from a solution to an issue.
*/
public class IssueSolveDeltaController extends BaseController {
private Delta delta;
private Map<String, Parameter> parameters;
private CodeEditor editorBefore;
private CodeEditor editorAfter;
private EventListenerList parameterChangeListeners;
private ParameterControlFactory parameterControlFactory;
private Logger logger;
@FXML
protected WebView editorBeforeView;
@FXML
protected WebView editorAfterView;
@FXML
protected GridPane parametersContainer;
/**
* Instantiate a new IssueSolveDeltaController.
*
* @param delta The delta this controller handles.
* @param parameters The parameters used in the creation of the delta's solution.
*/
public IssueSolveDeltaController(Delta delta, Map<String, Parameter> parameters) {
this.delta = delta;
this.parameters = parameters;
parameterChangeListeners = new EventListenerList();
parameterControlFactory = new ParameterControlFactory();
logger = Logger.getLogger(getClass());
}
@Override
public void initialize(URL url, ResourceBundle resourceBundle) {
super.initialize(url, resourceBundle);
initializeEditors();
initializeParametersForm();
}
private void initializeParametersForm() {
parametersContainer.getChildren().clear();
int i = 0, row, col;
for (Parameter parameter : parameters.values()) {
Control control = parameterControlFactory.controlForParameter(parameter, new EventHandler<ParameterEvent>() {
@Override
public void handle(ParameterEvent event) {
triggerParameterChange(event);
}
});
Label label = new Label(parameter.getTitle());
label.setLabelFor(control);
row = (int) Math.floor(i / 2);
col = (i % 2 == 0) ? 0 : 2;
parametersContainer.add(label, col, row);
parametersContainer.add(control, col + 1, row);
i++;
}
}
/**
* Add a listener for the parameter changed event.
*
* @param listener Parameter change listener
*/
public void addParameterChangeListener(ParameterChangeListener listener) {
parameterChangeListeners.add(ParameterChangeListener.class, listener);
}
/**
* Remove a listener for the parameter changed event.
*
* @param listener Parameter change listener
*/
public void removeParameterChangeListener(ParameterChangeListener listener) {
parameterChangeListeners.remove(ParameterChangeListener.class, listener);
}
/**
* Trigger the parameter change event and notify all listeners.
*
* @param event The causing ParameterEvent
*/
protected void triggerParameterChange(ParameterEvent event) {
ParameterChangeListener[] listeners = parameterChangeListeners.getListeners(ParameterChangeListener.class);
for (ParameterChangeListener listener : listeners) {
listener.changed(event);
}
}
private void initializeEditors() {
editorBefore = new CodeEditor(editorBeforeView);
editorBefore.setValue(delta.getBefore());
editorAfter = new CodeEditor(editorAfterView);
editorAfter.setValue(delta.getAfter());
}
@Override
public Parent getView() {
try {
return buildView("/views/issue_solve_delta.fxml");
} catch (IOException e) {
logger.fatal("Could not build the view from the FXML document.", e);
return null;
}
}
}