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

public class Awindow5 extends Application  
{
    @Override
    public void start(Stage win) throws Exception 
    {
        win.setTitle("Window using nested layouts with external CSS");

        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 radioGroup = new ToggleGroup();                 //create a radio group
        radio1.setToggleGroup(radioGroup);                          //add radio button to radio group
        radio2.setToggleGroup(radioGroup);
        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 ");
 
        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);
        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);
        
//----- Setting 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");
        label2.getStyleClass().add("label");
        space1.getStyleClass().add("space");
        space2.getStyleClass().add("space");
        space3.getStyleClass().add("space");
//----- Setting up ID and Classes for external CSS --------------------
 
        Scene scene = new Scene(pane, 650, 350); 
        scene.getStylesheets().add("Awindow5.css");
        
        win.setScene(scene);
        win.show();
    }

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