/*************************************************************************************
* Handle action for a full screen, using lambda functions and eventHandler function 
**************************************************************************************/
import javafx.application.Application;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.layout.*;
import javafx.scene.control.*;
import javafx.scene.text.*;                             //for Text class
import javafx.collections.*;                            //for ObservableList
import javafx.geometry.*;                               //for VPos and HPos
import javafx.event.*;                                  //for catching an event

public class HandleAction2a extends Application  
{
    @Override
    public void start(Stage win) throws Exception 
    {
        win.setTitle("Handle Button Click");

        Text title = new Text("   My Application   ");

        MenuBar  menus = new MenuBar();                             //create a menu bar
        Menu     menu1 = new Menu("File");                          //create a menu
        MenuItem open  = new MenuItem("Open");                      //create a menu item
        MenuItem save  = new MenuItem("Save");
        MenuItem print = new MenuItem("Print");
        MenuItem exit  = new MenuItem("Exit");
        Menu     menu2 = new Menu("Edit");
        MenuItem find  = new MenuItem("Find");
        MenuItem rplc  = new MenuItem("Replace");
        MenuItem copy  = new MenuItem("Copy");
        MenuItem paste = new MenuItem("Paste");
                
        menu1.getItems().addAll(open,save,print,exit);              //add menu items in menu
        menu2.getItems().addAll(find,rplc,copy,paste);
        menus.getMenus().addAll(menu1,menu2);                       //add menus in menu bar

        Label     label1 = new Label("Enter Name ");                //create a label
        TextField field1 = new TextField("Sam Sultan");             //create a textfield with initial value                
        Label     label2 = new Label("Comment ");
        TextArea  field2 = new TextArea("line1 \n line2");          //create a textarea with initial values            

        RadioButton radio1 = new RadioButton("Male");               //create a radio buttoon
        RadioButton radio2 = new RadioButton("Female");
        ToggleGroup radios = new ToggleGroup();                     //create a radio group
        radio1.setToggleGroup(radios);                              //add radio button to radio group
        radio2.setToggleGroup(radios);
        radio1.setSelected(true);
        
        CheckBox check1 = new CheckBox("Red");                      //create a check box
        CheckBox check2 = new CheckBox("Blue");
        check1.setSelected(true);

        ChoiceBox<String> select = new ChoiceBox<String>();         //single dropdown select list
        select.getItems().add("High School");
        select.getItems().add("Bachelor");
        select.getItems().add("Master");
        select.getItems().add("PHD");
        select.getSelectionModel().select(0);
 
        ListView<String> mSelect = new ListView<String>();          //multiple scrollable select list
        String[] animals = {"Dogs","Cats","Birds","Fish","Turtles","Other"};
        ObservableList<String> list = FXCollections.observableArrayList(animals);
        mSelect.setItems(list);
        mSelect.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);

        Button submit = new Button(" Submit ");
        Button cancel = new Button(" Cancel ");
        
        Label label3  = new Label("You entered:");
              label3.setVisible(false);
        Label output  = new Label();                    //for output
 
        Region vSpace = new Region();                   //create a region
        Region space1 = new Region();                   //width/height will be set external CSS
        Region space2 = new Region();                   
        Region space3 = new Region();
 
        HBox row3 = new HBox(7);                        //create an HBox layout
        row3.getChildren().addAll(radio1,radio2);       //with 7 spaces between components
        row3.getChildren().add(space1);
        row3.getChildren().addAll(check1,check2);
        row3.getChildren().add(space2);
        row3.getChildren().add(select);
        row3.getChildren().add(space3);
        row3.getChildren().add(mSelect);
        
        HBox row4 = new HBox(10);
        row4.getChildren().addAll(submit,cancel);

        GridPane pane = new GridPane();       
        pane.add(menus,  0,0);                          //add components to layout manager
        pane.add(title,  1,0);                          //component,col,row,colspan,colspan
        pane.add(vSpace, 0,1);                           
        pane.add(label1, 0,2);                        
        pane.add(field1, 1,2);                        
        pane.add(label2, 0,3);                     
        pane.add(field2, 1,3);
        pane.add(row3,   1,4);                          //nest HBox layout in a GridPane layout 
        pane.add(row4,   1,5);
        pane.add(label3, 0,6);
        pane.add(output, 1,6);
        GridPane.setValignment(label1, VPos.TOP);       //force the label to the top & right
        GridPane.setHalignment(label1, HPos.RIGHT);
        GridPane.setValignment(label2, VPos.TOP);      
        GridPane.setHalignment(label2, HPos.RIGHT);
        GridPane.setValignment(label3, VPos.TOP);      
        
//----- Set up ID and Classes for external CSS --------------------
        pane.setId("pane");
        title.setId("title");
        vSpace.setId("vSpace");
        row3.setId("row3");
        select.setId("select");
        mSelect.setId("mSelect");
        submit.setId("submit");
        cancel.setId("cancel");
        label1.getStyleClass().add("label");
        label1.getStyleClass().add("label");
        space1.getStyleClass().add("space");
        space2.getStyleClass().add("space");
        space3.getStyleClass().add("space");
 
//----- Set up Event Handlers -------------------------------------
        open.setOnAction(event   -> output.setText("Requesting Open")    );
        save.setOnAction(event   -> output.setText("Requesting Save")    );
        print.setOnAction(event  -> output.setText("Requesting Print")   );
        exit.setOnAction(event   -> output.setText("Requesting Exit")    );
        find.setOnAction(event   -> output.setText("Requesting Find")    );
        rplc.setOnAction(event   -> output.setText("Requesting Replace") );
        copy.setOnAction(event   -> output.setText("Requesting Copy")    );
        paste.setOnAction(event  -> output.setText("Requesting Paste")   );
        cancel.setOnAction(event -> {output.setText(null); label3.setVisible(false);} );

        EventHandler<ActionEvent> handleSubmit = event -> 
            { String chosen = "";
              chosen += field1.getText() + "\n" + field2.getText() + "\n";              //get value from text fields
              RadioButton selected = (RadioButton) radios.getSelectedToggle();          //radio buttons
              chosen += selected.getText() + "\t";
              if (check1.isSelected()) chosen += check1.getText()+" ";                  //checkboxes
              if (check2.isSelected()) chosen += check2.getText()+" ";
              chosen += " \t" + select.getValue();                                      //single select 
              ObservableList items = mSelect.getSelectionModel().getSelectedItems();    //multiple select
              chosen += " \t" + items.toString();                                       //array of selected items
              label3.setVisible(true);
              output.setText(chosen);
            };  

        submit.setOnAction(handleSubmit);

//----- End Event Handlers ----------------------------------------

        Scene scene = new Scene(pane, 650, 430); 
        scene.getStylesheets().add("Awindow5.css");         //link to CSS 
        
        win.setScene(scene);
        win.show();
    }

    public static void main(String[] args) 
    {
        Application.launch(args);
    }
}