package org.jabref.gui.keyboard; import javax.inject.Inject; import javafx.fxml.FXML; import javafx.scene.control.SelectionMode; import javafx.scene.control.SelectionModel; import javafx.scene.control.TreeItem; import javafx.scene.control.TreeTableColumn; import javafx.scene.control.TreeTableView; import org.jabref.gui.AbstractController; import org.jabref.gui.DialogService; import org.jabref.gui.IconTheme; import org.jabref.gui.util.RecursiveTreeItem; import org.jabref.gui.util.ViewModelTreeTableCellFactory; import org.jabref.preferences.PreferencesService; import org.fxmisc.easybind.EasyBind; public class KeyBindingsDialogController extends AbstractController<KeyBindingsDialogViewModel> { @FXML private TreeTableView<KeyBindingViewModel> keyBindingsTable; @FXML private TreeTableColumn<KeyBindingViewModel, String> actionColumn; @FXML private TreeTableColumn<KeyBindingViewModel, String> shortcutColumn; @FXML private TreeTableColumn<KeyBindingViewModel, String> resetColumn; @Inject private KeyBindingRepository keyBindingRepository; @Inject private DialogService dialogService; @Inject private PreferencesService preferences; @FXML private void initialize() { viewModel = new KeyBindingsDialogViewModel(keyBindingRepository, dialogService, preferences); keyBindingsTable.getSelectionModel().setSelectionMode(SelectionMode.SINGLE); viewModel.selectedKeyBindingProperty().bind( EasyBind.monadic(keyBindingsTable.selectionModelProperty()) .flatMap(SelectionModel::selectedItemProperty) .selectProperty(TreeItem::valueProperty) ); keyBindingsTable.setOnKeyPressed(evt -> viewModel.setNewBindingForCurrent(evt)); keyBindingsTable.rootProperty().bind( EasyBind.map(viewModel.rootKeyBindingProperty(), keybinding -> new RecursiveTreeItem<>(keybinding, KeyBindingViewModel::getChildren)) ); actionColumn.setCellValueFactory(cellData -> cellData.getValue().getValue().nameProperty()); shortcutColumn.setCellValueFactory(cellData -> cellData.getValue().getValue().shownBindingProperty()); resetColumn.setCellFactory(new ViewModelTreeTableCellFactory<KeyBindingViewModel, String>() .withGraphic(keyBinding -> keyBinding.getIcon().map(IconTheme.JabRefIcon::getGraphicNode).orElse(null)) .withOnMouseClickedEvent(keyBinding -> evt -> keyBinding.resetToDefault()) ); } @FXML private void closeDialog() { getStage().close(); } @FXML private void saveKeyBindingsAndCloseDialog() { viewModel.saveKeyBindings(); closeDialog(); } @FXML private void setDefaultBindings() { viewModel.resetToDefault(); } }