// Path: cnctools/src/main/java/com/rvantwisk/cnctools/data/Project.java
// public class Project {
// 
//     private final StringProperty name = new SimpleStringProperty();
//     private final StringProperty description = new SimpleStringProperty();
//     private final ObservableList<TaskRunnable> milltasks = FXCollections.observableArrayList();
//     private ObjectProperty<CNCToolsPostProcessConfig> postProcessor = new SimpleObjectProperty<>();
// 
//     public Project() {
//     }
// 
//     public Project(String projectName, String description) {
//         this.name.set(projectName);
//         this.description.set(description);
//     }
// 
//     public Object readResolve() {
//         if (postProcessor == null) {
//             postProcessor = new SimpleObjectProperty<>();
//             postProcessorProperty().set(Factory.newPostProcessor());
//         }
//         return this;
//     }
// 
//     public String toString() {
//         return "Project{" +
//                 "name='" + name + '\'' +
//                 ", description='" + description + '\'' +
//                 ", has Operations='" + milltasks.size() + '\'' +
//                 '}';
//     }
// 
//     public ObservableList<TaskRunnable> millTasksProperty() {
//         return milltasks;
//     }
// 
//     public StringProperty nameProperty() {
//         return name;
//     }
// 
//     public StringProperty descriptionProperty() {
//         return description;
//     }
// 
//     public String getName() {
//         return name.get();
//     }
// 
//     public void setName(String name) {
//         this.name.set(name);
//     }
// 
//     public String getDescription() {
//         return description.get();
//     }
// 
//     public void setDescription(String description) {
//         this.description.set(description);
//     }
// 
//     public CNCToolsPostProcessConfig getPostProcessor() {
//         return postProcessor.get();
//     }
// 
//     public void setPostProcessor(CNCToolsPostProcessConfig postProcessor) {
//         this.postProcessor.set(postProcessor);
//     }
// 
//     public ObjectProperty<CNCToolsPostProcessConfig> postProcessorProperty() {
//         return postProcessor;
//     }
// 
//     public GCodeCollection getGCode(ToolDBManager toolDBManager) {
//         final CncToolsGCodegenerator gCodeGenerator = Factory.getProcessorDialect(postProcessor.get());
// 
//         gCodeGenerator.startProgram();
//         for (TaskRunnable t : milltasks) {
//             t.generateGCode(toolDBManager, gCodeGenerator);
//         }
//         gCodeGenerator.endProgram();
// 
//         return gCodeGenerator.getGCode();
//     }
// 
// }
// 
// Path: cnctools/src/main/java/com/rvantwisk/cnctools/data/interfaces/TaskModel.java
// public interface TaskModel extends Copyable<TaskModel> {
// 
//     void generateGCode(final ToolDBManager toolDBManager, final CncToolsGCodegenerator gCodeGenerator, final String taskId);
// }
// 
// Path: cnctools/src/main/java/com/rvantwisk/cnctools/operations/interfaces/MillTaskController.java
// public interface MillTaskController  {
//     public abstract void setModel(final TaskModel model);
//     public abstract void setProject(final Project project);
//     public abstract TaskModel getModel();
//     public abstract <T extends TaskModel> T createNewModel();
//     public abstract void destroy();
// }


import com.rvantwisk.cnctools.data.Project;
import com.rvantwisk.cnctools.data.TaskRunnable;
import com.rvantwisk.cnctools.data.interfaces.TaskModel;
import com.rvantwisk.cnctools.misc.AbstractController;
import com.rvantwisk.cnctools.operations.interfaces.MillTaskController;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.AnchorPane;
import javafx.util.Callback;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.ResourceBundle;
            FXMLLoader loader = new FXMLLoader(tasksController.getClass().getResource(taskRunnable.getFxmlFileName()));
            loader.setControllerFactory(new Callback<Class<?>, Object>() {
                @Override
                public Object call(Class<?> aClass) {
                    return tasksController;
                }
            });

            lbHeader.setText(taskRunnable.getName());
            AnchorPane aPane = (AnchorPane) loader.load();
            taskPane.getChildren().add(aPane);
            taskPane.setBottomAnchor(aPane, 0.0);
            taskPane.setTopAnchor(aPane, 0.0);
            taskPane.setRightAnchor(aPane, 0.0);
            taskPane.setLeftAnchor(aPane, 0.0);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    public TaskRunnable getTask() {
        tasksController.getModel();
        return currentTaskRunnable;
    }

    public ViewAs getViewAs() {
        return viewAs;
    }

    public void setViewAs(ViewAs viewAs) {
// Path: cnctools/src/main/java/com/rvantwisk/cnctools/data/Project.java
// public class Project {
// 
//     private final StringProperty name = new SimpleStringProperty();
//     private final StringProperty description = new SimpleStringProperty();
//     private final ObservableList<TaskRunnable> milltasks = FXCollections.observableArrayList();
//     private ObjectProperty<CNCToolsPostProcessConfig> postProcessor = new SimpleObjectProperty<>();
// 
//     public Project() {
//     }
// 
//     public Project(String projectName, String description) {
//         this.name.set(projectName);
//         this.description.set(description);
//     }
// 
//     public Object readResolve() {
//         if (postProcessor == null) {
//             postProcessor = new SimpleObjectProperty<>();
//             postProcessorProperty().set(Factory.newPostProcessor());
//         }
//         return this;
//     }
// 
//     public String toString() {
//         return "Project{" +
//                 "name='" + name + '\'' +
//                 ", description='" + description + '\'' +
//                 ", has Operations='" + milltasks.size() + '\'' +
//                 '}';
//     }
// 
//     public ObservableList<TaskRunnable> millTasksProperty() {
//         return milltasks;
//     }
// 
//     public StringProperty nameProperty() {
//         return name;
//     }
// 
//     public StringProperty descriptionProperty() {
//         return description;
//     }
// 
//     public String getName() {
//         return name.get();
//     }
// 
//     public void setName(String name) {
//         this.name.set(name);
//     }
// 
//     public String getDescription() {
//         return description.get();
//     }
// 
//     public void setDescription(String description) {
//         this.description.set(description);
//     }
// 
//     public CNCToolsPostProcessConfig getPostProcessor() {
//         return postProcessor.get();
//     }
// 
//     public void setPostProcessor(CNCToolsPostProcessConfig postProcessor) {
//         this.postProcessor.set(postProcessor);
//     }
// 
//     public ObjectProperty<CNCToolsPostProcessConfig> postProcessorProperty() {
//         return postProcessor;
//     }
// 
//     public GCodeCollection getGCode(ToolDBManager toolDBManager) {
//         final CncToolsGCodegenerator gCodeGenerator = Factory.getProcessorDialect(postProcessor.get());
// 
//         gCodeGenerator.startProgram();
//         for (TaskRunnable t : milltasks) {
//             t.generateGCode(toolDBManager, gCodeGenerator);
//         }
//         gCodeGenerator.endProgram();
// 
//         return gCodeGenerator.getGCode();
//     }
// 
// }
// 
// Path: cnctools/src/main/java/com/rvantwisk/cnctools/data/interfaces/TaskModel.java
// public interface TaskModel extends Copyable<TaskModel> {
// 
//     void generateGCode(final ToolDBManager toolDBManager, final CncToolsGCodegenerator gCodeGenerator, final String taskId);
// }
// 
// Path: cnctools/src/main/java/com/rvantwisk/cnctools/operations/interfaces/MillTaskController.java
// public interface MillTaskController  {
//     public abstract void setModel(final TaskModel model);
//     public abstract void setProject(final Project project);
//     public abstract TaskModel getModel();
//     public abstract <T extends TaskModel> T createNewModel();
//     public abstract void destroy();
// }


// Path: cnctools/src/main/java/com/rvantwisk/cnctools/controllers/TaskEditController.java
import com.rvantwisk.cnctools.data.Project;
import com.rvantwisk.cnctools.data.TaskRunnable;
import com.rvantwisk.cnctools.data.interfaces.TaskModel;
import com.rvantwisk.cnctools.misc.AbstractController;
import com.rvantwisk.cnctools.operations.interfaces.MillTaskController;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.AnchorPane;
import javafx.util.Callback;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.ResourceBundle;

            FXMLLoader loader = new FXMLLoader(tasksController.getClass().getResource(taskRunnable.getFxmlFileName()));
            loader.setControllerFactory(new Callback<Class<?>, Object>() {
                @Override
                public Object call(Class<?> aClass) {
                    return tasksController;
                }
            });

            lbHeader.setText(taskRunnable.getName());
            AnchorPane aPane = (AnchorPane) loader.load();
            taskPane.getChildren().add(aPane);
            taskPane.setBottomAnchor(aPane, 0.0);
            taskPane.setTopAnchor(aPane, 0.0);
            taskPane.setRightAnchor(aPane, 0.0);
            taskPane.setLeftAnchor(aPane, 0.0);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    public TaskRunnable getTask() {
        tasksController.getModel();
        return currentTaskRunnable;
    }

    public ViewAs getViewAs() {
        return viewAs;
    }

    public void setViewAs(ViewAs viewAs) {
        if (btnClose!=null) {