Skip to content

Instantly share code, notes, and snippets.

@msulima
Created September 23, 2012 11:37
Show Gist options
  • Save msulima/3769870 to your computer and use it in GitHub Desktop.
Save msulima/3769870 to your computer and use it in GitHub Desktop.
package pl.baza.gui.controllers.tasks;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.layout.AnchorPane;
import org.joda.time.DateTime;
import org.joda.time.Days;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Component;
import org.springframework.validation.Errors;
import pl.baza.domain.entities.Task;
import pl.baza.domain.entities.TaskType;
import pl.baza.domain.entities.User;
import pl.baza.gui.controllers.FXMLController;
import pl.baza.gui.controls.dialogs.FormErrorsDialog;
import pl.baza.gui.loaders.ModuleLoader;
import pl.baza.services.task.TaskService;
import pl.baza.settings.ApplicationSettings;
import java.net.URL;
import java.util.HashSet;
import java.util.ResourceBundle;
@Component
@Lazy
public class TasksController extends AnchorPane implements Initializable, FXMLController, InitializingBean {
@Autowired
private ModuleLoader moduleLoader;
@Autowired
private TaskService taskService;
@Autowired
private FormErrorsDialog formErrorsDialog;
@Autowired
private TaskForm taskForm;
@Autowired
private TaskDetails taskDetails;
@Autowired
private TasksList tasksList;
@FXML
private AnchorPane tasksListPane;
@FXML
private AnchorPane taskFormPane;
@Override
public void initialize(URL fxmlFileLocation, ResourceBundle resources) {
initializeTasksList();
initializeTaskForm();
initializeTaskDetails();
}
private void initializeTaskForm() {
taskForm.initializeAll();
setTaskFormToCreate();
switchToTaskForm();
}
private void initializeTasksList() {
tasksList.initializeAll();
tasksList.addSelectionClearedListener(createSelectionClearedListener());
tasksList.addSelectTaskListener(createSelectTaskListener());
tasksList.refreshAll();
tasksListPane.getChildren().add(tasksList);
}
private void initializeTaskDetails() {
taskDetails.initializeAll();
}
public void refresh() {
tasksList.refreshAll();
}
private ChangeListener<Task> createSelectionClearedListener() {
return new ChangeListener<Task>() {
@Override
public void changed(ObservableValue<? extends Task> ov, Task oldTask, Task selectedItem) {
setTaskFormToCreate();
}
};
}
public void showCreateNewTaskForm() {
tasksList.clearSelection();
}
private ChangeListener<Task> createSelectTaskListener() {
return new ChangeListener<Task>() {
@Override
public void changed(ObservableValue<? extends Task> ov, Task oldTask, Task selectedItem) {
if (userCanUpdateTask(selectedItem, ApplicationSettings.getLoggedUser())) {
setTaskFormToUpdate(selectedItem);
} else {
setTaskDetailsToShow(selectedItem);
}
}
};
}
private boolean userCanUpdateTask(Task task, User user) {
return (isTaskNotFinished(task) && isUserTaskAuthor(task, user)) || user.isAdmin();
}
private boolean isUserTaskAuthor(Task task, User user) {
return task.getAuthor().equals(user);
}
private boolean isTaskNotFinished(Task task) {
return task.getFinishDate() != null;
}
private void setTaskFormToCreate() {
switchToTaskForm();
taskForm.setEditedTask(createDefaultTask());
taskForm.setSaveListener(createTaskListener());
taskForm.setDeleteListener(null);
taskForm.setCloseListener(null);
}
private Task createDefaultTask() {
Task task = new Task();
task.setAuthor(ApplicationSettings.getLoggedUser());
task.setAddDate(DateTime.now());
task.setDueDate(DateTime.now().plus(Days.ONE));
task.setContent("");
task.setTaskType(TaskType.PUBLIC);
return task;
}
private void setTaskFormToUpdate(Task task) {
switchToTaskForm();
taskForm.setEditedTask(task);
taskForm.setSaveListener(updateTaskListener());
taskForm.setCloseListener(closeTaskListener());
taskForm.setDeleteListener(deleteTaskListener());
}
private void switchToTaskForm() {
taskFormPane.getChildren().clear();
taskFormPane.getChildren().add(taskForm);
}
private void setTaskDetailsToShow(Task task) {
switchToTaskDetails();
taskDetails.setShownTask(task);
}
private void switchToTaskDetails() {
taskFormPane.getChildren().clear();
taskFormPane.getChildren().add(taskDetails);
}
public TaskForm.TaskFormListener createTaskListener() {
return new TaskForm.TaskFormListener() {
@Override
public void changed() {
Task task = new Task();
updateTaskWithFormFields(task);
task.setAuthor(ApplicationSettings.getLoggedUser());
Errors errors = taskService.validate(task);
if (errors.hasErrors()) {
formErrorsDialog.show(errors);
} else {
taskService.saveTask(task);
tasksList.appendTaskAndSelect(task);
}
}
};
}
public TaskForm.TaskFormListener updateTaskListener() {
return new TaskForm.TaskFormListener() {
@Override
public void changed() {
Task task = tasksList.getSelectedTask();
if (task.getFinishDate() == null) {
updateTaskWithFormFields(task);
Errors errors = taskService.validate(task);
if (errors.hasErrors()) {
formErrorsDialog.show(errors);
} else {
taskService.updateTask(task);
tasksList.refreshAll();
}
}
}
};
}
private void updateTaskWithFormFields(Task task) {
task.setAddDate(taskForm.getAddDate());
task.setDueDate(taskForm.getDueDate());
task.setContent(taskForm.getContent());
task.setFinishDate(null);
task.setTaskType(taskForm.getVisibility());
if (taskForm.getVisibility() == TaskType.SHARED) {
task.setVisibleFor(taskForm.getSharedUsers());
}
}
public TaskForm.TaskFormListener deleteTaskListener() {
return new TaskForm.TaskFormListener() {
@Override
public void changed() {
Task task = tasksList.getSelectedTask();
task.setVisibleFor(new HashSet<User>());
taskService.deleteTask(task);
tasksList.removeTask(task);
if (tasksList.hasSelectedTask()) {
setTaskFormToCreate();
} else {
setTaskFormToUpdate(tasksList.getSelectedTask());
}
}
};
}
private TaskForm.TaskFormListener closeTaskListener() {
return new TaskForm.TaskFormListener() {
@Override
public void changed() {
Task task = tasksList.getSelectedTask();
task.setFinishDate(DateTime.now());
taskService.updateTask(task);
tasksList.refreshAll();
}
};
}
@Override
public void afterPropertiesSet() {
moduleLoader.loadModule(this);
}
@Override
public String getBackingFilePath() {
return "/gui/modules/tasks/TasksModule.fxml";
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment