package views;

import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ChoiceBox;
import javafx.scene.control.ComboBox;
import javafx.scene.control.ListView;
import javafx.scene.control.SelectionMode;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class ViewsDemo extends Application {
	
	// tableView Data
	final ObservableList<Person> data = FXCollections.observableArrayList(
		    new Person("Jacob", "Smith", "jacob.smith@example.com"),
		    new Person("Isabella", "Johnson", "isabella.johnson@example.com"),
		    new Person("Ethan", "Williams", "ethan.williams@example.com"),
		    new Person("Emma", "Jones", "emma.jones@example.com"),
		    new Person("Michael", "Brown", "michael.brown@example.com")
	);
	
    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) throws Exception {
    	// Set listView
    	ListView<String> listView = new ListView<>();
    	listView.getItems().add("Option 1");
    	listView.getItems().add("Option 2");
    	listView.getItems().addAll("Option 3", "Option 4");
        listView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);

    	//Button
        Button lvButton = new Button("Ok");
        lvButton.setOnAction(new EventHandler<ActionEvent>() {
			@Override
			public void handle(ActionEvent arg0) {
				String message = "Selected options:\n";
				
				ObservableList<String> selectedItems = listView.getSelectionModel().getSelectedItems();
				for(String m: selectedItems) {
		            message += m + "\n";
				}
				
		        System.out.println(message);
			}
        });

        //Layout
        VBox lvLayout = new VBox(10);
        lvLayout.setPadding(new Insets(20, 20, 20, 20));
        lvLayout.getChildren().addAll(listView, lvButton);
        
        //----------------------------------------------------
        // Set treeView
        TreeItem<String> rootItem = new TreeItem<String> ("Main Menu");
        rootItem.setExpanded(true);
        
        TreeItem<String> subItem1 = new TreeItem<String> ("Sub Menu 1");
        TreeItem<String> subItem2 = new TreeItem<String> ("Sub Menu 2");
        TreeItem<String> subItem3 = new TreeItem<String> ("Sub Menu 3");
        rootItem.getChildren().add(subItem1);
        rootItem.getChildren().add(subItem2);
        rootItem.getChildren().add(subItem3);
        
        TreeItem<String> subSubItem1 = new TreeItem<String> ("Sub Sub Menu 1");
        TreeItem<String> subSubItem2 = new TreeItem<String> ("Sub Sub Menu 2");
        subItem2.getChildren().add(subSubItem1);
        subItem2.getChildren().add(subSubItem2);
                
        TreeView<String> treeView = new TreeView<String> (rootItem); 
        treeView.getSelectionModel().selectedItemProperty().addListener((v, oldValue, newValue) -> {
            if (v != null)
                System.out.println("v = " + v.getValue());
            if (oldValue != null)
                System.out.println("oldValue = " + newValue.getValue());
            if (newValue != null)
                System.out.println("newValue = " + newValue.getValue());
        });
        
       	//Button
        Button tvButton = new Button("Ok");
        tvButton.setOnAction(new EventHandler<ActionEvent>() {
			@Override
			public void handle(ActionEvent arg0) {
				String message = "Selected options:\n";
				
				ObservableList<TreeItem<String>> selectedItems = treeView.getSelectionModel().getSelectedItems();
				for(TreeItem<String> m: selectedItems) {
		            message += m.getValue() + "\n";
				}
				
		        System.out.println(message);
			}
        });

        //Layout
        VBox tvLayout = new VBox(10);
        tvLayout.setPadding(new Insets(20, 20, 20, 20));
        tvLayout.getChildren().addAll(treeView, tvButton);
        
        //----------------------------------------------------
        // Set tableView
        TableColumn<Person, String> firstNameCol = new TableColumn<>("First Name");
        TableColumn<Person, String> lastNameCol = new TableColumn<>("Last Name");
        TableColumn<Person, String> emailCol = new TableColumn<>("Email");
        
        TableView<Person> tableView = new TableView<>();
        tableView.getColumns().addAll(firstNameCol, lastNameCol, emailCol);
        
        firstNameCol.setCellValueFactory(new PropertyValueFactory<>("firstName"));
        lastNameCol.setCellValueFactory(new PropertyValueFactory<>("lastName"));
        emailCol.setCellValueFactory(new PropertyValueFactory<>("email"));
        
        tableView.setItems(data);
        tableView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
        
        Button addButton = new Button("Add");
        addButton.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent e) {
            	// data.add(new Person("XXXXX", "XXXXX", "XXXXX@example.com"));
                tableView.getItems().add(new Person("YYYYY", "YYYYY", "YYYYY@example.com"));
            }
        });
        
        Button removeButton = new Button("Remove");
        removeButton.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent e) {
            	ObservableList<Person> selectedItems = tableView.getSelectionModel().getSelectedItems();

            	for(int i = selectedItems.size()-1; i>=0; i--) {
            		tableView.getItems().remove(selectedItems.get(i));
				}
            }
        });

        //Layout
        VBox tbvLayout = new VBox(10);
        tbvLayout.setPadding(new Insets(20, 20, 20, 20));
        tbvLayout.getChildren().addAll(tableView, addButton, removeButton);
        
        //----------------------------------------------------
        
        HBox layout = new HBox(20);
        layout.getChildren().add(lvLayout);
        layout.getChildren().add(tvLayout);
        layout.getChildren().add(tbvLayout);
        primaryStage.setTitle("Views Demo");
        primaryStage.setScene(new Scene(layout));
        primaryStage.show();
    }
}

