package ru.khasang.cachoeira.viewcontroller.rowfactories;
import javafx.scene.control.TreeTableRow;
import javafx.scene.control.TreeTableView;
import javafx.scene.input.MouseButton;
import javafx.scene.input.MouseEvent;
import javafx.util.Callback;
import ru.khasang.cachoeira.model.ITask;
import ru.khasang.cachoeira.viewcontroller.MainWindowController;
import ru.khasang.cachoeira.viewcontroller.contextmenus.TaskContextMenu;
import ru.khasang.cachoeira.viewcontroller.draganddrop.TableDragAndDrop;
import ru.khasang.cachoeira.viewcontroller.tooltipfactory.TaskTooltipFactory;
import ru.khasang.cachoeira.viewcontroller.tooltipfactory.TooltipFactory;
/**
* Класс отвечающий за дополнительные фичи (контекстное меню, всплывающие подсказки, изменение порядка элементов с
* помощью мышки) для каждой строки таблицы Задач.
*/
public class TaskTreeTableViewRowFactory implements Callback<TreeTableView<ITask>, TreeTableRow<ITask>> {
private final MainWindowController controller;
private final TableDragAndDrop dragAndDrop;
public TaskTreeTableViewRowFactory(MainWindowController controller, TableDragAndDrop dragAndDrop) {
this.controller = controller;
this.dragAndDrop = dragAndDrop;
}
@Override
public TreeTableRow<ITask> call(TreeTableView<ITask> param) {
TreeTableRow<ITask> row = new TreeTableRow<ITask>() {
@Override
protected void updateItem(ITask task, boolean empty) {
super.updateItem(task, empty);
if (empty) {
this.setTooltip(null);
this.setContextMenu(null);
} else {
/* Tooltip & Context Menu */
TooltipFactory<ITask> tooltipFactory = new TaskTooltipFactory();
TaskContextMenu taskContextMenu = new TaskContextMenu(controller.getProject(), task, controller);
this.setTooltip(tooltipFactory.createTooltip(task));
taskContextMenu.initMenus();
this.setContextMenu(taskContextMenu);
}
}
};
/* Drag & Drop */
row.setOnDragDetected(event -> dragAndDrop.dragDetected(event, row));
row.setOnDragOver(event -> dragAndDrop.dragOver(event, row));
row.setOnDragDropped(event -> dragAndDrop.dragDropped(event, row));
/* Properties double-click */
row.setOnMouseClicked(this::handleDoubleClick);
return row;
}
private void handleDoubleClick(MouseEvent event) {
if (event.getButton().equals(MouseButton.PRIMARY) && event.getClickCount() == 2) {
controller.getSidePanel().getSelectionModel().select(controller.getSidePanel().getTaskPropertiesTab());
}
}
}