All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.intuit.karate.ui.DirectoryPanel Maven / Gradle / Ivy

There is a newer version: 1.4.1
Show newest version
package com.intuit.karate.ui;

import javafx.event.EventHandler;
import javafx.scene.Node;
import javafx.scene.control.ScrollPane;
import javafx.scene.control.TreeCell;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeView;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.BorderPane;
import javafx.scene.text.Text;
import javafx.stage.Stage;
import org.slf4j.LoggerFactory;

import java.io.File;

import static com.intuit.karate.ui.App.PADDING_INSET;
import org.slf4j.Logger;

public class DirectoryPanel extends BorderPane {

    private static final Logger logger = LoggerFactory.getLogger(DirectoryPanel.class);
    
    private final TreeView treeView = new TreeView();
    private final ScrollPane scrollPane = new ScrollPane();
    private final App app ;
    private final String envString ;
    private final Stage stage;    


    EventHandler mouseEventHandle = (MouseEvent event) -> {
        handleMouseClicked(event);
    };

    public DirectoryPanel(App app, String envString, Stage primaryStage) {
        this.app = app;
        this.envString = envString;
        this.stage = primaryStage;
    }

    private void handleMouseClicked(MouseEvent event) {
        Node node = event.getPickResult().getIntersectedNode();
        if (node instanceof Text || (node instanceof TreeCell && ((TreeCell) node).getText() != null)) {
            final TreeItem selectedItem = treeView.getSelectionModel().getSelectedItem();
            if(selectedItem instanceof DirectoryFileItem) {
                File file = openFeatureFile(selectedItem);
                logger.info("Node click: " + file.getName());
            }
        }
    }

    private File openFeatureFile(TreeItem selectedItem) {
        File file = ((DirectoryFileItem) selectedItem).getFile();
        if(file.getName().endsWith(".feature")) {
            this.app.initUi(file, this.envString, this.stage);
        }
        return file;
    }

    public void init(File choice) {
        this.setPadding(PADDING_INSET);
        treeView.setRoot(getNodesForDirectory(choice));
        treeView.addEventHandler(MouseEvent.MOUSE_CLICKED, mouseEventHandle);

        treeView.addEventHandler(KeyEvent.KEY_PRESSED, e -> {
                    if (e.getCode().equals(KeyCode.ENTER)) {
                        final TreeItem selectedItem = treeView.getSelectionModel().getSelectedItem();
                        if (selectedItem instanceof DirectoryFileItem) {
                            openFeatureFile(selectedItem);
                        } else {
                            selectedItem.setExpanded(true);
                        }
                    }
                }
        );

        scrollPane.setContent(treeView);
        this.setCenter(scrollPane);
        scrollPane.setFitToWidth(true);
    }

    public TreeItem getNodesForDirectory(File directory) {
        TreeItem root = new TreeItem(directory.getName());
        for(File file : directory.listFiles()) {
            System.out.println("Loading " + file.getName());
            if(file.isDirectory()) {
                root.getChildren().add(getNodesForDirectory(file));
            } else {
                final DirectoryFileItem treeItem = new DirectoryFileItem(file);
                root.getChildren().add(treeItem);
            }
        }
        return root;
    }

    public class DirectoryFileItem extends TreeItem {
        private final File file;

        public DirectoryFileItem(File file) {
            super(file.getName());
            this.file = file;
        }

        public File getFile() {
            return file;
        }

    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy