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.IResource; import ru.khasang.cachoeira.viewcontroller.MainWindowController; import ru.khasang.cachoeira.viewcontroller.contextmenus.ResourceContextMenu; import ru.khasang.cachoeira.viewcontroller.draganddrop.TableDragAndDrop; import ru.khasang.cachoeira.viewcontroller.tooltipfactory.ResourceTooltipFactory; import ru.khasang.cachoeira.viewcontroller.tooltipfactory.TooltipFactory; /** * Класс отвечающий за дополнительные фичи (контекстное меню, всплывающие подсказки, изменение порядка элементов с * помощью мышки) для каждой строки таблицы Ресурсов. */ public class ResourceTreeTableViewRowFactory implements Callback<TreeTableView<IResource>, TreeTableRow<IResource>> { private final MainWindowController controller; private final TableDragAndDrop dragAndDrop; public ResourceTreeTableViewRowFactory(MainWindowController controller, TableDragAndDrop dragAndDrop) { this.controller = controller; this.dragAndDrop = dragAndDrop; } @Override public TreeTableRow<IResource> call(TreeTableView<IResource> param) { TreeTableRow<IResource> row = new TreeTableRow<IResource>() { @Override protected void updateItem(IResource resource, boolean empty) { super.updateItem(resource, empty); if (empty) { this.setTooltip(null); } else { /* Tooltip & Context Menu */ TooltipFactory<IResource> tooltipFactory = new ResourceTooltipFactory(); ResourceContextMenu resourceContextMenu = new ResourceContextMenu(controller.getProject(), resource, controller); this.setTooltip(tooltipFactory.createTooltip(resource)); resourceContextMenu.initMenus(); this.setContextMenu(resourceContextMenu); } } }; /* 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().getResourcePropertiesTab()); } } }