1 /*
   2  * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation. Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 package test.css.controls;
  26 
  27 import com.sun.javafx.collections.ObservableListWrapper;
  28 import javafx.css.CssMetaData;
  29 import com.sun.javafx.scene.control.skin.CellSkinBase;
  30 import com.sun.javafx.scene.control.skin.ColorPickerSkin;
  31 import com.sun.javafx.scene.control.skin.PaginationSkin;
  32 import com.sun.javafx.scene.control.skin.ProgressIndicatorSkin;
  33 import com.sun.javafx.scene.control.skin.TableColumnHeader;
  34 import com.sun.javafx.scene.control.skin.TextInputControlSkin;
  35 import com.sun.javafx.scene.control.skin.TreeCellSkin;
  36 import java.lang.reflect.Constructor;
  37 import java.lang.reflect.Method;
  38 import java.time.LocalDate;
  39 import java.time.Month;
  40 import java.util.*;
  41 import javafx.application.ConditionalFeature;
  42 import javafx.application.Platform;
  43 import javafx.beans.property.SimpleObjectProperty;
  44 import javafx.beans.value.ObservableValue;
  45 import javafx.collections.FXCollections;
  46 import javafx.collections.ObservableList;
  47 import javafx.css.Styleable;
  48 import javafx.geometry.HPos;
  49 import javafx.geometry.Pos;
  50 import javafx.scene.Node;
  51 import javafx.scene.chart.BarChart;
  52 import javafx.scene.chart.CategoryAxis;
  53 import javafx.scene.chart.LineChart;
  54 import javafx.scene.chart.NumberAxis;
  55 import javafx.scene.chart.PieChart;
  56 import javafx.scene.chart.XYChart;
  57 import javafx.scene.control.Accordion;
  58 import javafx.scene.control.Button;
  59 import javafx.scene.control.ButtonBuilder;
  60 import javafx.scene.control.CheckBox;
  61 import javafx.scene.control.CheckBoxBuilder;
  62 import javafx.scene.control.ChoiceBox;
  63 import javafx.scene.control.ColorPicker;
  64 import javafx.scene.control.ComboBox;
  65 import javafx.scene.control.Control;
  66 import javafx.scene.control.DatePicker;
  67 import javafx.scene.control.Hyperlink;
  68 import javafx.scene.control.HyperlinkBuilder;
  69 import javafx.scene.control.Label;
  70 import javafx.scene.control.LabelBuilder;
  71 import javafx.scene.control.ListView;
  72 import javafx.scene.control.Menu;
  73 import javafx.scene.control.MenuBar;
  74 import javafx.scene.control.MenuItem;
  75 import javafx.scene.control.Pagination;
  76 import javafx.scene.control.PasswordField;
  77 import javafx.scene.control.PasswordFieldBuilder;
  78 import javafx.scene.control.ProgressBar;
  79 import javafx.scene.control.ProgressBarBuilder;
  80 import javafx.scene.control.ProgressIndicator;
  81 import javafx.scene.control.ProgressIndicatorBuilder;
  82 import javafx.scene.control.RadioButton;
  83 import javafx.scene.control.RadioButtonBuilder;
  84 import javafx.scene.control.ScrollBar;
  85 import javafx.scene.control.ScrollBarBuilder;
  86 import javafx.scene.control.ScrollPane;
  87 import javafx.scene.control.Separator;
  88 import javafx.scene.control.SeparatorBuilder;
  89 import javafx.scene.control.Slider;
  90 import javafx.scene.control.SliderBuilder;
  91 import javafx.scene.control.SplitMenuButton;
  92 import javafx.scene.control.SplitMenuButtonBuilder;
  93 import javafx.scene.control.SplitPane;
  94 import javafx.scene.control.SplitPaneBuilder;
  95 import javafx.scene.control.Tab;
  96 import javafx.scene.control.TabPane;
  97 import javafx.scene.control.TableColumn;
  98 import javafx.scene.control.TableColumn.CellDataFeatures;
  99 import javafx.scene.control.TableView;
 100 import javafx.scene.control.TextField;
 101 import javafx.scene.control.TextFieldBuilder;
 102 import javafx.scene.control.TitledPane;
 103 import javafx.scene.control.ToggleButton;
 104 import javafx.scene.control.ToggleButtonBuilder;
 105 import javafx.scene.control.ToolBar;
 106 import javafx.scene.control.TreeItem;
 107 import javafx.scene.control.TreeView;
 108 import javafx.scene.image.Image;
 109 import javafx.scene.image.ImageView;
 110 import javafx.scene.layout.FlowPane;
 111 import javafx.scene.layout.HBox;
 112 import javafx.scene.layout.StackPaneBuilder;
 113 import javafx.scene.layout.TilePane;
 114 import javafx.scene.layout.VBox;
 115 import javafx.scene.paint.Color;
 116 import javafx.scene.shape.Circle;
 117 import javafx.scene.shape.Rectangle;
 118 import javafx.scene.text.Text;
 119 import javafx.util.Callback;
 120 import javafx.util.StringConverter;
 121 import java.time.format.DateTimeFormatter;
 122 import java.time.format.DateTimeFormatterBuilder;
 123 
 124 /**
 125  *
 126  * @author sergey.lugovoy@oracle.com
 127  */
 128 public enum ControlPage {
 129     Accordions(Accordion.getClassCssMetaData(), new ControlsCSSApp.ControlFactory() {
 130         public Node createControl() {
 131             TitledPane pane1 = new TitledPane();
 132             pane1.setText("title 1\nLong text long text");
 133             pane1.setContent(new Rectangle(100, 40, Color.SKYBLUE));
 134             pane1.setFocusTraversable(false);
 135             TitledPane pane2 = new TitledPane();
 136             pane2.setText("title 2\nLong text long text");
 137             pane2.setContent(new Rectangle(100, 40, Color.BLUEVIOLET));
 138             Accordion acc = new Accordion();
 139             acc.getPanes().addAll(pane1, pane2);
 140             acc.setExpandedPane(pane2);
 141             pane2.setAnimated(false);
 142             pane2.setFocusTraversable(false);
 143             acc.setFocusTraversable(false);
 144             return acc;
 145         }
 146     }, 200), Buttons(Button.getClassCssMetaData(), new ControlsCSSApp.ControlFactory() {
 147         public Control createControl() {
 148             return ButtonBuilder.create().text("Button the first line" + "\nthe sec long line" + "\nthe third line").focusTraversable(false).graphic(new Rectangle(10, 10, Color.RED)).build();
 149         }
 150     }, 200, 100), ChoiceBoxes(ChoiceBox.getClassCssMetaData(), new ControlsCSSApp.ControlFactory() {
 151         public Control createControl() {
 152             return new ChoiceBox() {
 153                 {
 154                     getItems().addAll(Arrays.asList("one", "two", "three"));
 155                     this.getSelectionModel().select(0);
 156                     setFocusTraversable(false);
 157                 }
 158             };
 159         }
 160     }), CheckBoxes(CheckBox.getClassCssMetaData(), new ControlsCSSApp.ControlFactory() {
 161         public Control createControl() {
 162             return CheckBoxBuilder.create().text("Check box the first line" + "\nthe sec long line" + "\nthe third line").graphic(new Rectangle(20, 20, Color.web("lightblue"))).focusTraversable(false).build();
 163         }
 164     }, 200, 100), ComboBoxes(ComboBox.getClassCssMetaData(), new ControlsCSSApp.ControlFactory() {
 165         @Override
 166         public Control createControl() {
 167             return new ComboBox() {
 168                 {
 169                     getItems().addAll(Arrays.asList("one", "two", "three"));
 170                     getSelectionModel().select(0);
 171                     setFocusTraversable(false);
 172                 }
 173             };
 174         }
 175     }), Hyperlinks(Hyperlink.getClassCssMetaData(), new ControlsCSSApp.ControlFactory() {
 176         public Control createControl() {
 177             return HyperlinkBuilder.create().text("Hyperlink the first line" + "\nthe sec long line" + "\nthe third line").focusTraversable(false).graphic(new Circle(10, Color.BLUE)).build();
 178         }
 179     }, 200, 100), Labels(new ArrayList<CssMetaData<? extends Styleable, ?>>(Label.getClassCssMetaData()) {
 180         {
 181             addAll(Text.getClassCssMetaData());
 182         }
 183     }, new ControlsCSSApp.ControlFactory() {
 184         public Control createControl() {
 185             return LabelBuilder.create().text("Label the first line" + "\nthe sec longlong line" + "\nthe third line").focusTraversable(false).graphic(new Rectangle(20, 20, Color.web("lightblue"))).build();
 186         }
 187     }, 200), ListViews(ListView.getClassCssMetaData(), new ControlsCSSApp.ControlFactory() {
 188         public Node createControl() {
 189             ListView list = new ListView();
 190             ObservableListWrapper<String> items = new ObservableListWrapper<String>(Arrays.asList("One", "Two", "Three", "Four", "Five", "Six", "long line long line long line long line"));
 191             list.setItems(items);
 192             list.setPrefWidth(100);
 193             list.setPrefHeight(100);
 194             list.setFocusTraversable(false);
 195             return list;
 196         }
 197     }, 150), PasswordFields(PasswordField.getClassCssMetaData(), new ControlsCSSApp.ControlFactory() {
 198         public Control createControl() {
 199             return PasswordFieldBuilder.create().promptText("Password box the first line" + "\nthe sec long line" + "\nthe third line").focusTraversable(false).build();
 200         }
 201     }), PressedToggleButtons(ToggleButton.getClassCssMetaData(), new ControlsCSSApp.ControlFactory() {
 202         public Control createControl() {
 203             return ToggleButtonBuilder.create().selected(true).text("Button the first line" + "\nthe sec long line" + "\nthe third line").focusTraversable(false).graphic(new Rectangle(10, 10, Color.RED)).build();
 204         }
 205     }, 200, 120), ProgressIndicators(new ArrayList<CssMetaData<? extends Styleable, ?>>(ProgressIndicator.getClassCssMetaData()) {
 206         {
 207             addAll(ProgressIndicatorSkin.getClassCssMetaData());
 208         }
 209     }, new ControlsCSSApp.ControlFactory() {
 210         public Node createControl() {
 211             return ProgressIndicatorBuilder.create().progress(0.85).prefHeight(100).prefWidth(100).focusTraversable(false).build();
 212         }
 213     }), ProgressBars(ProgressBar.getClassCssMetaData(), new ControlsCSSApp.ControlFactory() {
 214         public Node createControl() {
 215             return ProgressBarBuilder.create().progress(0.25).focusTraversable(false).build();
 216         }
 217     }, 200, 100), RadioButtons(RadioButton.getClassCssMetaData(), new ControlsCSSApp.ControlFactory() {
 218         public Control createControl() {
 219             return RadioButtonBuilder.create().text("Radio the first line" + "\nthe sec long line" + "\nthe third line").graphic(new Rectangle(20, 20, Color.web("lightblue"))).focusTraversable(false).build();
 220         }
 221     }, 200, 100), TextFields(new ArrayList<CssMetaData<? extends Styleable, ?>>(TextField.getClassCssMetaData()) {
 222         {
 223             addAll(TextInputControlSkin.getClassCssMetaData());
 224         }
 225     }, new ControlsCSSApp.ControlFactory() {
 226         public Control createControl() {
 227             return TextFieldBuilder.create().text("Text box the first line" + "\nthe sec long line" + "\nthe third line").focusTraversable(false).build();
 228         }
 229     }), Sliders(Slider.getClassCssMetaData(), new ControlsCSSApp.ControlFactory() {
 230         public Control createControl() {
 231             return SliderBuilder.create().min(0).max(100).value(20).focusTraversable(false).build();
 232         }
 233     }, 200), Separators(Separator.getClassCssMetaData(), new ControlsCSSApp.ControlFactory() {
 234         public Control createControl() {
 235             Separator sep = SeparatorBuilder.create().halignment(HPos.CENTER).build();
 236             sep.setPrefWidth(80);
 237             return sep;
 238         }
 239     }, 150), ScrollBars(ScrollBar.getClassCssMetaData(), new ControlsCSSApp.ControlFactory() {
 240         public Control createControl() {
 241             return ScrollBarBuilder.create().value(45).min(0).max(100).focusTraversable(false).build();
 242         }
 243     }, 150), ScrollPanes(ScrollPane.getClassCssMetaData(), new ControlsCSSApp.ControlFactory() {
 244         public Node createControl() {
 245             ScrollPane pane = new ScrollPane();
 246             HBox hbox = new HBox(30);
 247             VBox vbox1 = new VBox(10);
 248             vbox1.getChildren().addAll(new Label("one"), new Button("two"), new CheckBox("three"), new RadioButton("four"), new Label("five"));
 249             VBox vbox2 = new VBox(10);
 250             vbox2.getChildren().addAll(new Label("one"), new Button("two"), new CheckBox("three"), new RadioButton("four"), new Label("five"));
 251             hbox.getChildren().addAll(vbox1, vbox2);
 252             pane.setContent(hbox);
 253             pane.setFocusTraversable(false);
 254             return pane;
 255         }
 256     }, 150), UnPressedToggleButtons(ToggleButton.getClassCssMetaData(), new ControlsCSSApp.ControlFactory() {
 257         public Control createControl() {
 258             return ToggleButtonBuilder.create().selected(false).text("Button the first line" + "\nthe sec long line" + "\nthe third line").focusTraversable(false).graphic(new Rectangle(10, 10, Color.RED)).build();
 259         }
 260     }, 200, 120), Toolbars(ToolBar.getClassCssMetaData(), new ControlsCSSApp.ControlFactory() {
 261         public Node createControl() {
 262             ToolBar toolbar = new ToolBar();
 263             toolbar.getItems().addAll(new Button("One"), new Button("Two"), new Separator(), SplitMenuButtonBuilder.create().text("three").build());
 264             toolbar.setFocusTraversable(false);
 265             return toolbar;
 266         }
 267     }, 250, 150), Menubars(MenuBar.getClassCssMetaData(), new ControlsCSSApp.ControlFactory() {
 268         public Node createControl() {
 269             MenuBar menubar = new MenuBar();
 270             Menu firstMenu = new Menu("File");
 271             MenuItem firstMenuFirstItem = new MenuItem("Save");
 272             MenuItem firstMenuSecondItem = new MenuItem("Open");
 273             MenuItem firstMenuThirdItem = new MenuItem("Exit");
 274             firstMenu.getItems().addAll(firstMenuFirstItem, firstMenuSecondItem, firstMenuThirdItem);
 275             Menu secondMenu = new Menu("Edit");
 276             MenuItem secondMenuFirstItem = new MenuItem("Undo");
 277             MenuItem secondMenuSecondItem = new MenuItem("Cut");
 278             MenuItem secondMenuThirdItem = new MenuItem("Copy");
 279             secondMenu.getItems().addAll(secondMenuFirstItem, secondMenuSecondItem, secondMenuThirdItem);
 280             Menu thirdMenu = new Menu("Help");
 281             MenuItem thirdMenuFirstItem = new MenuItem("Help Contents");
 282             MenuItem thirdMenuSecondItem = new MenuItem("About");
 283             thirdMenu.getItems().addAll(thirdMenuFirstItem, thirdMenuSecondItem);
 284             menubar.getMenus().addAll(firstMenu, secondMenu, thirdMenu);
 285             menubar.setFocusTraversable(false);
 286             return menubar;
 287         }
 288     }, 250, 150), SplitMenuButtons(SplitMenuButton.getClassCssMetaData(), new ControlsCSSApp.ControlFactory() {
 289         public Node createControl() {
 290             SplitMenuButton smb = SplitMenuButtonBuilder.create().text("Split box the first line" + "\nthe sec long line" + "\nthe third line").items(new MenuItem("Split box the first line" + "\nthe sec long line" + "\nthe third line", new Rectangle(10, 10, Color.BLUE))).graphic(new Rectangle(10, 10, Color.RED)).build();
 291             smb.setFocusTraversable(false);
 292             return smb;
 293         }
 294     }, 200, 120), TabPanes(TabPane.getClassCssMetaData(), new ControlsCSSApp.ControlFactory() {
 295         public Node createControl() {
 296             TabPane pane = new TabPane();
 297             Tab tab = new Tab();
 298             tab.setText("tab 1");
 299             HBox content1 = new HBox(10);
 300             content1.getChildren().addAll(new Button("Button"), new Label("Label"), new Rectangle(40, 40, Color.TOMATO));
 301             tab.setContent(content1);
 302             Tab tab2 = new Tab();
 303             tab2.setText("tab 2");
 304             tab2.setContent(new Circle(40, Color.RED));
 305             pane.getTabs().addAll(tab, tab2);
 306             pane.setFocusTraversable(false);
 307             return pane;
 308         }
 309     }, 200), TitledPanes(TitledPane.getClassCssMetaData(), new ControlsCSSApp.ControlFactory() {
 310         public Node createControl() {
 311             TitledPane tpane = new TitledPane();
 312             tpane.setText("Title");
 313             VBox content = new VBox(5);
 314             content.getChildren().addAll(new Label("Label"), new Button("Button"), new CheckBox("Check box"));
 315             tpane.setContent(content);
 316             tpane.setAnimated(false);
 317             tpane.setFocusTraversable(false);
 318             return tpane;
 319         }
 320     }, 150), TableViews(new ArrayList<CssMetaData<? extends Styleable, ?>>(TableView.getClassCssMetaData()) {
 321         {
 322             addAll(CellSkinBase.getClassCssMetaData());
 323             addAll(TableColumnHeader.getClassCssMetaData());
 324         }
 325     }, new ControlsCSSApp.ControlFactory() {
 326         public Node createControl() {
 327             ObservableList<ControlsCSSApp.Person> items = FXCollections.observableArrayList();
 328             for (int i = 0; i < 10; i++) {
 329                 items.add(new ControlsCSSApp.Person("name " + i, "surname " + i));
 330             }
 331             TableColumn<ControlsCSSApp.Person, Node> column1 = new TableColumn<ControlsCSSApp.Person, Node>("First Name");
 332             column1.setCellValueFactory(new Callback<CellDataFeatures<ControlsCSSApp.Person, Node>, ObservableValue<Node>>() {
 333                 @Override
 334                 public ObservableValue<Node> call(final CellDataFeatures<ControlsCSSApp.Person, Node> p) {
 335                     SimpleObjectProperty<Node> text = new SimpleObjectProperty<Node>();
 336                     text.setValue(new Label(p.getValue().getFirstName()));
 337                     return text;
 338                 }
 339             });
 340             TableColumn<ControlsCSSApp.Person, Node> column2 = new TableColumn<ControlsCSSApp.Person, Node>("Last Name");
 341             column2.setCellValueFactory(new Callback<CellDataFeatures<ControlsCSSApp.Person, Node>, ObservableValue<Node>>() {
 342                 @Override
 343                 public ObservableValue<Node> call(final CellDataFeatures<ControlsCSSApp.Person, Node> p) {
 344                     SimpleObjectProperty<Node> text = new SimpleObjectProperty<Node>();
 345                     text.setValue(new Label(p.getValue().getLastName()));
 346                     return text;
 347                 }
 348             });
 349             TableView<ControlsCSSApp.Person> table = new TableView<ControlsCSSApp.Person>(items);
 350             table.getColumns().setAll(column1, column2);
 351             table.setPrefHeight(200);
 352             table.setFocusTraversable(false);
 353             return table;
 354         }
 355     }, 200, 250), TreeViews(new ArrayList<CssMetaData<? extends Styleable, ?>>(TableView.getClassCssMetaData()) {
 356         {
 357             addAll(TreeCellSkin.getClassCssMetaData());
 358         }
 359     }, new ControlsCSSApp.ControlFactory() {
 360         public Node createControl() {
 361             TreeItem<String> root = new TreeItem<String>("ROOT", new Rectangle(20, 20, Color.CHOCOLATE));
 362             root.setExpanded(true);
 363             TreeItem<String> firstBrunch = new TreeItem<String>("brunch 1");
 364             firstBrunch.setExpanded(true);
 365             firstBrunch.getChildren().addAll(new TreeItem<String>("first item"), new TreeItem<String>("second item", new Rectangle(20, 20, Color.DARKGREY)));
 366             root.getChildren().addAll(firstBrunch);
 367             TreeItem<String> secondBrunch = new TreeItem<String>("brunch 2");
 368             secondBrunch.getChildren().addAll(new TreeItem<String>("first item"), new TreeItem<String>("second item", new Rectangle(20, 20, Color.DARKGREY)));
 369             root.getChildren().addAll(secondBrunch);
 370             TreeView tree = new TreeView(root);
 371             tree.setFocusTraversable(false);
 372             tree.setMinSize(147, 127);
 373             tree.setPrefSize(160, 140);
 374             return tree;
 375         }
 376     }, 200, 300), SplitPanes(SplitPane.getClassCssMetaData(), new ControlsCSSApp.ControlFactory() {
 377         public Node createControl() {
 378             SplitPane pane = SplitPaneBuilder.create().items(StackPaneBuilder.create().children(new Rectangle(40, 40, Color.WHITESMOKE)).build(), StackPaneBuilder.create().children(new Rectangle(40, 40, Color.BLUE)).build(), StackPaneBuilder.create().children(new Rectangle(40, 40, Color.RED)).build()).prefWidth(150).prefHeight(150).build();
 379             pane.setDividerPositions(0.33, 0.67);
 380             pane.setFocusTraversable(false);
 381             return pane;
 382         }
 383     }, 250), Paginations(new ArrayList<CssMetaData<? extends Styleable, ?>>(Pagination.getClassCssMetaData()) {
 384         {
 385             addAll(PaginationSkin.getClassCssMetaData());
 386         }
 387     }, new ControlsCSSApp.ControlFactory() {
 388         public Node createControl() {
 389             Pagination node = new Pagination(47);
 390             node.setMaxPageIndicatorCount(5);
 391             node.getStyleClass().add(Pagination.STYLE_CLASS_BULLET);
 392             return node;
 393         }
 394     }, 350, 150), XYChars(new ArrayList<CssMetaData<? extends Styleable, ?>>(LineChart.getClassCssMetaData()) {
 395         {
 396             addAll(NumberAxis.getClassCssMetaData());
 397         }
 398     }, new ControlsCSSApp.ControlFactory() {
 399         public Node createControl() {
 400             XYChart node = new LineChart(new NumberAxis(0, 4, 1), new NumberAxis(0, 4, 1));
 401             node.setPrefSize(200, 200);
 402             XYChart.Series series = new XYChart.Series();
 403             series.getData().add(new XYChart.Data(0d, 0d));
 404             series.getData().add(new XYChart.Data(4d, 4d));
 405             XYChart.Series series2 = new XYChart.Series();
 406             series2.getData().add(new XYChart.Data(0d, 0d));
 407             series2.getData().add(new XYChart.Data(1d, 3d));
 408             XYChart.Series series3 = new XYChart.Series();
 409             series3.getData().add(new XYChart.Data(0d, 0d));
 410             series3.getData().add(new XYChart.Data(2d, 4d));
 411             node.getData().addAll(series, series2, series3);
 412             return node;
 413         }
 414     }, 300, 300), TilePanes(TilePane.getClassCssMetaData(), new ControlsCSSApp.ControlFactory() {
 415         public Node createControl() {
 416             TilePane tile = new TilePane();
 417             tile.setPrefSize(150, 150);
 418             tile.setTileAlignment(Pos.CENTER_LEFT);
 419             for (int i = 0; i < 15; i++) {
 420                 tile.getChildren().add(new Rectangle(20, 20, (i % 2 == 0) ? Color.RED : Color.BLUE));
 421             }
 422             return tile;
 423         }
 424     }, 200, 200), VBoxs(VBox.getClassCssMetaData(), new ControlsCSSApp.ControlFactory() {
 425         @Override
 426         public Node createControl() {
 427             VBox node = new VBox(10);
 428             node.setMinSize(150, 150);
 429             for (int i = 0; i < 4; i++) {
 430                 node.getChildren().add(new Rectangle(20, 20, (i % 2 == 0) ? Color.RED : Color.BLUE));
 431             }
 432             return node;
 433         }
 434     }, 200, 200), BarCharts(new ArrayList<CssMetaData<? extends Styleable, ?>>(BarChart.getClassCssMetaData()) {
 435         {
 436             addAll(CategoryAxis.getClassCssMetaData());
 437         }
 438     }, new ControlsCSSApp.ControlFactory() {
 439         public Node createControl() {
 440             CategoryAxis cAxis = new CategoryAxis();
 441             NumberAxis nAxis = new NumberAxis(0, 5, 1);
 442             BarChart node = new BarChart(cAxis, nAxis);
 443             XYChart.Series series = new XYChart.Series();
 444             series.getData().add(new XYChart.Data("1", 2));
 445             XYChart.Series series1 = new XYChart.Series();
 446             series1.getData().add(new XYChart.Data("2", 3));
 447             XYChart.Series series2 = new XYChart.Series();
 448             series2.getData().add(new XYChart.Data("2", 5));
 449             node.getData().addAll(series, series1, series2);
 450             node.setMaxSize(180, 180);
 451             return node;
 452         }
 453     }, 200, 200), ColorPickers(ColorPickerSkin.getClassCssMetaData(), new ControlsCSSApp.ControlFactory() {
 454         public Node createControl() {
 455             ColorPicker node = new ColorPicker();
 456             node.setPrefSize(100, 100);
 457             node.setStyle("-fx-color-label-visible:false;");
 458             return node;
 459         }
 460     }, 200, 200), FlowPanes(FlowPane.getClassCssMetaData(), new ControlsCSSApp.ControlFactory() {
 461         public Node createControl() {
 462             FlowPane node = new FlowPane();
 463             for (int i = 0; i < 6; i++) {
 464                 node.getChildren().add(new Rectangle(20, 20, (i % 2 == 0) ? Color.RED : Color.BLUE));
 465             }
 466             node.setColumnHalignment(HPos.CENTER);
 467             node.setPrefSize(100, 100);
 468             return node;
 469         }
 470     }, 200, 200), PieCharts(PieChart.getClassCssMetaData(), new ControlsCSSApp.ControlFactory() {
 471         public Node createControl() {
 472             ObservableList<PieChart.Data> pieChartData = FXCollections.observableArrayList(new PieChart.Data("", 13), new PieChart.Data("", 25), new PieChart.Data("", 10), new PieChart.Data("", 22), new PieChart.Data("", 30));
 473             PieChart chart = new PieChart(pieChartData);
 474             chart.setMaxSize(150, 150);
 475             return chart;
 476         }
 477     }, 300, 300), WebViews(getWebViewClassCssMetaData(), new ControlsCSSApp.ControlFactory() {
 478         public Node createControl() {
 479             Node node = null;
 480             try {
 481                 Class<?> webViewCl = Class.forName("javafx.scene.web.WebView");
 482                 Constructor<?> constructor = webViewCl.getConstructor();
 483                 constructor.setAccessible(true);
 484                 Object args = null;
 485                 node = (Node) constructor.newInstance();
 486                 Method setViewport = webViewCl.getDeclaredMethod("setPrefSize", double.class, double.class);
 487                 setViewport.invoke(node, 150, 150);
 488                 Method getEngine = webViewCl.getDeclaredMethod("getEngine");
 489                 Object engine = getEngine.invoke(node);
 490                 Method load = engine.getClass().getDeclaredMethod("load", String.class);
 491                 load.invoke(engine, ControlsCSSApp.class.getResource("/test/css/resources/index.html").toExternalForm());
 492             } catch (Exception ignored) {
 493             }
 494             return node;
 495         }
 496     }, 300, 300), HBoxs(HBox.getClassCssMetaData(), new ControlsCSSApp.ControlFactory() {
 497         public Node createControl() {
 498             HBox node = new HBox(10);
 499             node.setMinSize(150, 150);
 500             for (int i = 0; i < 4; i++) {
 501                 node.getChildren().add(new Rectangle(20, 20, (i % 2 == 0) ? Color.RED : Color.BLUE));
 502             }
 503             return node;
 504         }
 505     }, 300, 300), ImageViews(ImageView.getClassCssMetaData(), new ControlsCSSApp.ControlFactory() {
 506         public Node createControl() {
 507             ImageView view = new ImageView(new Image(ControlsCSSApp.class.getResource("/test/css/resources/placeholder.png").toExternalForm()));
 508             return view;
 509         }
 510     }, 300, 300), DatePickers(DatePicker.getClassCssMetaData(), new ControlsCSSApp.ControlFactory() {
 511         public Node createControl() {
 512             DatePicker picker = new DatePicker();
 513             picker.setValue(LocalDate.of(2042, Month.MAY, 27));
 514             picker.setConverter(new StringConverter<LocalDate>() {
 515 
 516                 DateTimeFormatter df = new DateTimeFormatterBuilder().parseLenient()
 517                         .appendPattern("M/dd/YYYY")
 518                         .toFormatter(Locale.ENGLISH)
 519                         .withLocale(Locale.ENGLISH);
 520 
 521                 @Override
 522                 public String toString(LocalDate localDate) {
 523                     return df.format(localDate);
 524                 }
 525 
 526                 @Override
 527                 public LocalDate fromString(String s) {
 528                     return LocalDate.parse(s, df);
 529                 }
 530             });
 531             //picker.setMinSize(100, 30);
 532             return picker;
 533         }
 534     }, 300, 300),
 535     Texts(Text.getClassCssMetaData(), new ControlsCSSApp.ControlFactory() {
 536         public Node createControl() {
 537             Text node = new Text("1234567890");
 538             return node;
 539         }
 540     }, 150, 150);
 541     public static final int DEFAULT_SLOTSIZE = 150;
 542     public static final int INNER_PANE_SHIFT = 20;
 543     public List<CssMetaData<? extends Styleable, ?>> keys;
 544     public ControlsCSSApp.ControlFactory factory;
 545     public int slotHeight;
 546     public int slotWidth;
 547 
 548     public static final String packageName = "functional";
 549 
 550     ControlPage(List<CssMetaData<? extends Styleable, ?>> keys, ControlsCSSApp.ControlFactory factory) {
 551         this(keys, factory, DEFAULT_SLOTSIZE);
 552     }
 553 
 554     ControlPage(List<CssMetaData<? extends Styleable, ?>> keys, ControlsCSSApp.ControlFactory factory, int slotSize) {
 555         this(keys, factory, slotSize, slotSize);
 556     }
 557 
 558     /**
 559      * Returns filtered enumeration values, this is required to support embedded
 560      * execution, cause currently JavaFX Embedded does not contain Web component
 561      * @return filtered enumeration values
 562      */
 563     public static ControlPage[] filteredValues(){
 564         Set<ControlPage> controls = EnumSet.allOf(ControlPage.class);
 565         if(!Platform.isSupported(ConditionalFeature.WEB))
 566             controls.remove(ControlPage.WebViews);
 567         return controls.toArray(new ControlPage[]{});
 568     }
 569 
 570     private ControlPage(List<CssMetaData<? extends Styleable, ?>> keys, ControlsCSSApp.ControlFactory factory, int slotWidth, int slotHeight) {
 571         this.keys = keys;
 572         this.factory = factory;
 573         this.slotHeight = slotHeight;
 574         this.slotWidth = slotWidth;
 575     }
 576 
 577     private static List<CssMetaData<? extends Styleable, ?>> getWebViewClassCssMetaData() {
 578         List<CssMetaData<? extends Styleable, ?>> arrayList = null;
 579         try {
 580             Class<?> webViewCl = Class.forName("javafx.scene.web.WebView");
 581             Method staticMethod = webViewCl.getDeclaredMethod("getClassCssMetaData");
 582             arrayList = (List<CssMetaData<? extends Styleable, ?>>) staticMethod.invoke(null);
 583         } catch (Exception ex) {
 584             arrayList = new ArrayList<CssMetaData<? extends Styleable,?>>();
 585         }
 586         return arrayList;
 587     }
 588 }