1 /*
   2  * Copyright (c) 2010, 2017, 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 
  26 package hello;
  27 
  28 import javafx.application.Application;
  29 import javafx.beans.InvalidationListener;
  30 import javafx.beans.Observable;
  31 import javafx.collections.ListChangeListener;
  32 import javafx.event.ActionEvent;
  33 import javafx.event.Event;
  34 import javafx.event.EventHandler;
  35 import javafx.geometry.Insets;
  36 import javafx.geometry.NodeOrientation;
  37 import javafx.geometry.Side;
  38 import javafx.scene.Group;
  39 import javafx.scene.Scene;
  40 import javafx.scene.control.Button;
  41 import javafx.scene.control.ContextMenu;
  42 import javafx.scene.control.Label;
  43 import javafx.scene.control.MenuItem;
  44 import javafx.scene.control.Tab;
  45 import javafx.scene.control.TabPane;
  46 import javafx.scene.control.TextArea;
  47 import javafx.scene.control.TextField;
  48 import javafx.scene.control.ToggleButton;
  49 import javafx.scene.control.ToggleGroup;
  50 import javafx.scene.control.Tooltip;
  51 import javafx.scene.image.Image;
  52 import javafx.scene.image.ImageView;
  53 import javafx.scene.input.MouseEvent;
  54 import javafx.scene.layout.FlowPane;
  55 import javafx.scene.layout.Region;
  56 import javafx.scene.layout.StackPane;
  57 import javafx.scene.layout.HBox;
  58 import javafx.scene.layout.VBox;
  59 import javafx.scene.paint.Color;
  60 import javafx.scene.shape.Rectangle;
  61 import javafx.stage.Stage;
  62 
  63 
  64 public class HelloTabPane extends Application {
  65 
  66     private TabPane tabPane;
  67     private Tab tab1;
  68     private Tab tab2;
  69     private Tab tab3;
  70     private Tab emptyTab;
  71     private Tab internalTab;
  72     private Tab multipleTabs;
  73     private Tab tabForDragPolicy;
  74     private ContextMenu menu;
  75 
  76     private boolean showScrollArrows = false;
  77     private boolean showTabMenu = false;
  78 
  79     public static void main(String[] args) {
  80         Application.launch(args);
  81     }
  82 
  83     @Override public void start(Stage stage) {
  84         tabPane = new TabPane();
  85         tab1 = new Tab();
  86         tab2 = new Tab();
  87         tab3 = new Tab();
  88         emptyTab = new Tab();
  89         internalTab = new Tab();
  90         multipleTabs = new Tab();
  91         tabForDragPolicy = new Tab();
  92         setUpPopupMenu();
  93         stage.setTitle("Hello TabPane2");
  94         final Scene scene = new Scene(new Group(), 800, 800);
  95         scene.setFill(Color.GHOSTWHITE);
  96 
  97 
  98         tabPane.prefWidthProperty().bind(scene.widthProperty());
  99         tabPane.prefHeightProperty().bind(scene.heightProperty());
 100 
 101         tabPane.setRotateGraphic(false);
 102         tabPane.setTabClosingPolicy(TabPane.TabClosingPolicy.SELECTED_TAB);
 103         tabPane.setSide(Side.TOP);
 104 
 105         {
 106             tab1.setText("Tab 1");
 107             tab1.setTooltip(new Tooltip("Tab 1 Tooltip"));
 108             final Image image = new Image(getClass().getResourceAsStream("about_16.png"));
 109             final ImageView imageView = new ImageView();
 110             imageView.setImage(image);
 111             tab1.setGraphic(imageView);
 112             final VBox vbox = new VBox();
 113             vbox.setSpacing(10);
 114             vbox.setTranslateX(10);
 115             vbox.setTranslateY(10);
 116             {
 117                 final Button b = new Button("Toggle Tab Mode");
 118                 b.setOnAction(new EventHandler<ActionEvent>() {
 119                     @Override public void handle(ActionEvent e) {
 120                         toggleTabMode(tabPane);
 121                     }
 122                 });
 123                 vbox.getChildren().add(b);
 124             }
 125             {
 126                 final Button b = new Button("Toggle Tab Position");
 127                 b.setOnAction(new EventHandler<ActionEvent>() {
 128                     @Override public void handle(ActionEvent e) {
 129                         toggleTabPosition(tabPane);
 130                     }
 131                 });
 132                 vbox.getChildren().add(b);
 133             }
 134             {
 135                 final Button b = new Button("Switch to Empty Tab");
 136                 b.setOnAction(new EventHandler<ActionEvent>() {
 137                     @Override public void handle(ActionEvent e) {
 138                         tabPane.getSelectionModel().select(emptyTab);
 139                     }
 140                 });
 141                 vbox.getChildren().add(b);
 142             }
 143             {
 144                 final Button b = new Button("Switch to New Tab");
 145                 b.setOnAction(new EventHandler<ActionEvent>() {
 146                     @Override public void handle(ActionEvent e) {
 147                         Tab t = new Tab();
 148                         t.setText("Testing");
 149                         t.setContent(new Button("Howdy"));
 150                         tabPane.getTabs().add(t);
 151                         tabPane.getSelectionModel().select(t);
 152                     }
 153                 });
 154                 vbox.getChildren().add(b);
 155             }
 156             {
 157                 final Button b = new Button("Add Tab");
 158                 b.setOnAction(new EventHandler<ActionEvent>() {
 159                     @Override public void handle(ActionEvent e) {
 160                         Tab t = new Tab();
 161                         t.setText("New Tab");
 162                         t.setContent(new Region());
 163                         tabPane.getTabs().add(t);
 164                     }
 165                 });
 166                 vbox.getChildren().add(b);
 167             }
 168             {
 169                 final Button b = new Button("Toggle Popup on Empty Tab");
 170                 b.setOnAction(new EventHandler<ActionEvent>() {
 171                     @Override public void handle(ActionEvent e) {
 172                         if (emptyTab.getContextMenu() == null) {
 173                             emptyTab.setContextMenu(menu);
 174                         } else {
 175                             emptyTab.setContextMenu(null);
 176                         }
 177                     }
 178                 });
 179                 vbox.getChildren().add(b);
 180             }
 181             {
 182                 ToggleButton tb = new ToggleButton("Show scroll arrows");
 183                 tb.setSelected(showScrollArrows);
 184                 tb.selectedProperty().addListener(new InvalidationListener() {
 185                     public void invalidated(Observable ov) {
 186                         showScrollArrows = !showScrollArrows;
 187                     }
 188                 });
 189                 vbox.getChildren().add(tb);
 190             }
 191             {
 192                 ToggleButton tb = new ToggleButton("Show Tab Menu Button");
 193                 tb.setSelected(showTabMenu);
 194                 tb.selectedProperty().addListener(new InvalidationListener() {
 195                     public void invalidated(Observable ov) {
 196                         showTabMenu = !showTabMenu;
 197                     }
 198                 });
 199                 vbox.getChildren().add(tb);
 200             }
 201             tab1.setContent(vbox);
 202             tabPane.getTabs().add(tab1);
 203         }
 204         {
 205             tab2.setText("Longer Tab");
 206             final Image image = new Image(getClass().getResourceAsStream("folder_16.png"));
 207             final ImageView imageView = new ImageView();
 208             imageView.setImage(image);
 209             tab2.setGraphic(imageView);
 210             final VBox vbox = new VBox();
 211             vbox.setSpacing(10);
 212             vbox.setTranslateX(10);
 213             vbox.setTranslateY(10);
 214 
 215             final ToggleGroup closingPolicy = new ToggleGroup();
 216             for (TabPane.TabClosingPolicy policy: TabPane.TabClosingPolicy.values()) {
 217                 final ToggleButton button = new ToggleButton(policy.name());
 218                 button.setToggleGroup(closingPolicy);
 219                 button.selectedProperty().addListener(new InvalidationListener() {
 220                     public void invalidated(Observable ov) {
 221                         tabPane.setTabClosingPolicy(TabPane.TabClosingPolicy.valueOf(button.getText()));
 222                     }
 223                 });
 224                 vbox.getChildren().add(button);
 225             }
 226 
 227             final ToggleButton rotateGraphics = new ToggleButton("Rotate Graphics");
 228             rotateGraphics.selectedProperty().addListener(new InvalidationListener() {
 229                     public void invalidated(Observable ov) {
 230                     tabPane.setRotateGraphic(rotateGraphics.isSelected());
 231                 }
 232             });
 233             vbox.getChildren().add(rotateGraphics);
 234 
 235             tab2.setContent(vbox);
 236             tabPane.getTabs().add(tab2);
 237         }
 238         {
 239             tab3.setText("Tab 3");
 240             final Image image = new Image(getClass().getResourceAsStream("heart_16.png"));
 241             final ImageView imageView = new ImageView();
 242             imageView.setImage(image);
 243             tab3.setGraphic(imageView);
 244             final VBox vbox = new VBox();
 245             vbox.setSpacing(10);
 246             vbox.setTranslateX(10);
 247             vbox.setTranslateY(10);
 248             {
 249                 final ToggleButton tb = new ToggleButton("Show Labels");
 250                 tb.setSelected(true);
 251                 tb.selectedProperty().addListener(new InvalidationListener() {
 252                     public void invalidated(Observable ov) {
 253                         if (tb.isSelected()) {
 254                             tab1.setText("Tab 1");
 255                             tab2.setText("Tab 2");
 256                             tab3.setText("Tab 3");
 257                         } else {
 258                             tab1.setText("");
 259                             tab2.setText("");
 260                             tab3.setText("");
 261                         }
 262                     }
 263                 });
 264                 vbox.getChildren().add(tb);
 265             }
 266             {
 267                 final ToggleButton tb = new ToggleButton("Big Graphic 1");
 268                 tb.selectedProperty().addListener(new InvalidationListener() {
 269                     public void invalidated(Observable ov) {
 270                         Image image;
 271                         if (tb.isSelected()) {
 272                             image = new Image(getClass().getResourceAsStream("about_48.png"));
 273                         } else {
 274                             image = new Image(getClass().getResourceAsStream("about_16.png"));
 275                         }
 276                         ImageView imageView = new ImageView();
 277                         imageView.setImage(image);
 278                         tab1.setGraphic(imageView);
 279                     }
 280                 });
 281                 vbox.getChildren().add(tb);
 282             }
 283             {
 284                 final ToggleButton tb = new ToggleButton("Big Graphic 2");
 285                 tb.selectedProperty().addListener(new InvalidationListener() {
 286                     public void invalidated(Observable ov) {
 287                         Image image;
 288                         if (tb.isSelected()) {
 289                             image = new Image(getClass().getResourceAsStream("folder_48.png"));
 290                         } else {
 291                             image = new Image(getClass().getResourceAsStream("folder_16.png"));
 292                         }
 293                         ImageView imageView = new ImageView();
 294                         imageView.setImage(image);
 295                         tab2.setGraphic(imageView);
 296                     }
 297                 });
 298                 vbox.getChildren().add(tb);
 299             }
 300             {
 301                 final ToggleButton tb = new ToggleButton("Big Graphic 3");
 302                 tb.selectedProperty().addListener(new InvalidationListener() {
 303                     public void invalidated(Observable ov) {
 304                         Image image;
 305                         if (tb.isSelected()) {
 306                             image = new Image(getClass().getResourceAsStream("heart_48.png"));
 307                         } else {
 308                             image = new Image(getClass().getResourceAsStream("heart_16.png"));
 309                         }
 310                         ImageView imageView = new ImageView();
 311                         imageView.setImage(image);
 312                         tab3.setGraphic(imageView);
 313                     }
 314                 });
 315                 vbox.getChildren().add(tb);
 316             }
 317             tab3.setContent(vbox);
 318             tabPane.getTabs().add(tab3);
 319         }
 320         {
 321             tabForDragPolicy.setText("TabDragPolicy");
 322             tabForDragPolicy.setContent(setupDragPolicyTab());
 323             tabPane.getTabs().add(tabForDragPolicy);
 324         }
 325 
 326         emptyTab.setText("Empty Tab");
 327         emptyTab.setContent(new Region());
 328         tabPane.getTabs().add(emptyTab);
 329 
 330         emptyTab.setOnSelectionChanged(new EventHandler<Event>() {
 331             public void handle(Event t) {
 332                 System.out.println("Empty tab selected");
 333             }
 334         });
 335 
 336         emptyTab.setOnClosed(new EventHandler<Event>() {
 337             public void handle(Event t) {
 338                 System.out.println("Empty tab closed");
 339             }
 340         });
 341 
 342         internalTab.setText("Internal Tab");
 343         setupInternalTab();
 344         tabPane.getTabs().add(internalTab);
 345 
 346         multipleTabs.setText("Multiple Tabs");
 347         setupMultipleInteralTabs();
 348         tabPane.getTabs().add(multipleTabs);
 349 
 350         {
 351             Tab tab = new Tab();
 352             tab.setText("Tab 4");
 353             tab.setClosable(false);
 354             tab.setContent(new Region());
 355             tabPane.getTabs().add(tab);
 356         }
 357 
 358         for (int i = 5; i < 9; i++) {
 359             Tab tab = new Tab();
 360             tab.setText("Tab " + i);
 361             tab.setContent(new Region());
 362             tabPane.getTabs().add(tab);
 363         }
 364         ((Group)scene.getRoot()).getChildren().add(tabPane);
 365         stage.setScene(scene);
 366         stage.show();
 367     }
 368 
 369     private VBox setupDragPolicyTab() {
 370         Label indexErr = new Label("");
 371         Label angleErr = new Label("");
 372         VBox mainContent = new VBox();
 373         mainContent.setSpacing(20);
 374         mainContent.setMinSize(1000, 400);
 375 
 376         TabPane tabPane = new TabPane();
 377         tabPane.setMinSize(500, 400);
 378         tabPane.setTabClosingPolicy(TabPane.TabClosingPolicy.ALL_TABS);
 379         HBox tabs = new HBox();
 380         tabs.getChildren().add(tabPane);
 381         mainContent.getChildren().add(tabs);
 382 
 383         for (int i = 0; i < 7; ++i) {
 384             String text = i + "    ";
 385             HBox hb = new HBox();
 386             Tab tab = new Tab(text);
 387             TextArea ta = new TextArea("" + i + i + i + i);
 388             ta.setStyle("-fx-max-width: 300; -fx-max-height: 100;");
 389             hb.getChildren().add(ta);
 390             tab.setContent(hb);
 391             tabPane.getTabs().add(tab);
 392         }
 393 
 394         TextArea instructions = new TextArea(
 395             "**** INSTRUCTIONS ****\n\n" +
 396             "1. TabDragPolicy.FIXED : Default policy.\n" +
 397             "Click the FIXED button to set FIXED TabDragPolicy.\n" +
 398             "The tabs remain fixed & tab headers cannot be dragged to reorder.\n\n" +
 399             "2. TabDragPolicy.REORDER :\n" +
 400             "Click the REORDER button to set REORDER TabDragPolicy.\n" +
 401             "The tabs can be reordered with mouse press & drag action on tab header.\n\n" +
 402             "3. With each of the drag policy,\n" +
 403             "Choose different combinations of\n" +
 404             "sides (TOP or BOTTOM or LEFT or RIGHT),\n" +
 405             "node orientations, (LTR or RTL) and\n" +
 406             "different rotation angle.\n\n" +
 407             "4. Perform reordering and verify the correctness of the\n" +
 408             "printed Current order of tabs and permuted tabs.\n" +
 409             "And verify the navigation of tabs using left, right arrow keys.\n\n" +
 410             "5. Additionally, also verify the outputs with ADD, REMOVE\n" +
 411             "and REVERSE buttons."
 412             );
 413         tabs.getChildren().add(instructions);
 414 
 415         Label permuted = new Label("Permuted tabs :  ");
 416         Label outputPermutedTabs = new Label();
 417         Label added = new Label("Added :  ");
 418         Label outputAddedTabs = new Label();
 419         Label removed = new Label("Removed :  ");
 420         Label outputRemovedTabs = new Label();
 421         Label getTabs = new Label("Current order of Tabs :  ");
 422         Label outputListOfTabs = new Label();
 423         tabPane.setOnMousePressed(event -> {
 424             outputPermutedTabs.setText("");
 425             outputAddedTabs.setText("");
 426             outputRemovedTabs.setText("");
 427             outputListOfTabs.setText("");
 428             angleErr.setText("");
 429             indexErr.setText("");
 430         });
 431         VBox notifications = new VBox();
 432         notifications.setSpacing(15);
 433         notifications.setStyle("-fx-border-color: black");
 434         notifications.setPadding(new Insets(20));
 435         HBox permut = new HBox();
 436         permut.getChildren().addAll(permuted, outputPermutedTabs);
 437 
 438         HBox adds = new HBox();
 439         adds.getChildren().addAll(added, outputAddedTabs);
 440 
 441         HBox removes = new HBox();
 442         removes.getChildren().addAll(removed, outputRemovedTabs);
 443 
 444         HBox allTabs = new HBox();
 445         allTabs.getChildren().addAll(getTabs, outputListOfTabs);
 446         notifications.getChildren().addAll(permut, adds, removes, allTabs);
 447         mainContent.getChildren().add(notifications);
 448 
 449         tabPane.getTabs().addListener((ListChangeListener<Tab>) c -> {
 450             while (c.next()) {
 451                 String list = "";
 452                 outputPermutedTabs.setText("");
 453                 outputAddedTabs.setText("");
 454                 outputRemovedTabs.setText("");
 455                 for (int i = c.getFrom(); i < c.getTo(); i++) {
 456                     list += tabPane.getTabs().get(i).getText() + ", ";
 457                 }
 458 
 459                 if (c.wasPermutated()) {
 460                     outputPermutedTabs.setText(list);
 461                 } else if (c.wasAdded()) {
 462                     outputAddedTabs.setText(list);
 463                 } else if (c.wasRemoved()) {
 464                     list = "";
 465                     for (Tab t : c.getRemoved()) {
 466                         list += t.getText() + ", ";
 467                     }
 468                     outputRemovedTabs.setText(list);
 469                 }
 470                 list = "";
 471                 for (Tab t : tabPane.getTabs()) {
 472                     list += t.getText() + ", ";
 473                 }
 474                 outputListOfTabs.setText(list);
 475             }
 476         });
 477 
 478         HBox bottomBox = new HBox();
 479         bottomBox.setSpacing(15);
 480         bottomBox.setPadding(new Insets(20));
 481         bottomBox.setStyle("-fx-border-color: black");
 482 
 483         VBox addRemove = new VBox();
 484         addRemove.setSpacing(5);
 485         Button add = new Button("ADD");
 486         Button remove = new Button("REMOVE");
 487         HBox indexContainer = new HBox();
 488         Label indexLabel = new Label("Index: ");
 489         TextField indexTF = new TextField("0");
 490         indexTF.setMaxWidth(50);
 491         indexContainer.getChildren().addAll(indexLabel, indexTF);
 492         addRemove.getChildren().add(new Label("Add / Remove index"));
 493         addRemove.getChildren().add(indexContainer);
 494         addRemove.getChildren().add(add);
 495         addRemove.getChildren().add(remove);
 496         addRemove.getChildren().add(indexErr);
 497 
 498 
 499         add.setOnMouseClicked(event -> {
 500             try {
 501                 int index = Integer.parseInt(indexTF.getText());
 502                 if (index >= 0 && index < tabPane.getTabs().size()) {
 503                     tabPane.getTabs().add(index, new Tab(index + "--- "));
 504                     tabPane.requestFocus();
 505                 }
 506                 indexErr.setText("");
 507             } catch (Exception e) {
 508                 indexErr.setText("Incorrect Index");
 509             }
 510         });
 511         remove.setOnMouseClicked(event -> {
 512             try {
 513                 int index = Integer.parseInt(indexTF.getText());
 514                 if (index >= 0 && index < tabPane.getTabs().size()) {
 515                     tabPane.getTabs().remove(index);
 516                     tabPane.requestFocus();
 517                 }
 518                 indexErr.setText("");
 519             } catch (Exception e) {
 520                 indexErr.setText("Incorrect Index");
 521             }
 522         });
 523 
 524         bottomBox.getChildren().add(addRemove);
 525 
 526         ToggleGroup side = new ToggleGroup();
 527 
 528         ToggleButton top = new ToggleButton("TOP");
 529         top.setSelected(true);
 530         top.setUserData(Side.TOP);
 531         ToggleButton bottom = new ToggleButton("BOTTOM");
 532         bottom.setUserData(Side.BOTTOM);
 533         ToggleButton left = new ToggleButton("LEFT");
 534         left.setUserData(Side.LEFT);
 535         ToggleButton right = new ToggleButton("RIGHT");
 536         right.setUserData(Side.RIGHT);
 537 
 538         top.setToggleGroup(side);
 539         bottom.setToggleGroup(side);
 540         left.setToggleGroup(side);
 541         right.setToggleGroup(side);
 542 
 543         side.selectedToggleProperty().addListener(observable -> {
 544             if (side.getSelectedToggle() == null) {
 545                 tabPane.setSide(Side.TOP);
 546             } else {
 547                 tabPane.setSide((Side) side.getSelectedToggle().getUserData());
 548             }
 549             tabPane.requestFocus();
 550         });
 551 
 552         VBox sides = new VBox();
 553         sides.setSpacing(5);
 554         sides.getChildren().add(new Label("Sides"));
 555         sides.getChildren().add(top);
 556         sides.getChildren().add(bottom);
 557         sides.getChildren().add(left);
 558         sides.getChildren().add(right);
 559         bottomBox.getChildren().add(sides);
 560 
 561         ToggleGroup dragPolicy = new ToggleGroup();
 562         dragPolicy.selectedToggleProperty().addListener(observable -> {
 563             if (dragPolicy.getSelectedToggle() == null) {
 564                 tabPane.setTabDragPolicy(TabPane.TabDragPolicy.FIXED);
 565             } else {
 566                 tabPane.setTabDragPolicy((TabPane.TabDragPolicy) dragPolicy.getSelectedToggle().getUserData());
 567             }
 568             tabPane.requestFocus();
 569         });
 570 
 571         ToggleButton reorder = new ToggleButton("REORDER");
 572         reorder.setUserData(TabPane.TabDragPolicy.REORDER);
 573         reorder.setToggleGroup(dragPolicy);
 574         ToggleButton fixed = new ToggleButton("FIXED");
 575         fixed.setSelected(true);
 576         fixed.setUserData(TabPane.TabDragPolicy.FIXED);
 577         fixed.setToggleGroup(dragPolicy);
 578 
 579         VBox dragPolicies = new VBox();
 580         dragPolicies.setSpacing(5);
 581         dragPolicies.getChildren().add(new Label("Drag Policies"));
 582         dragPolicies.getChildren().add(reorder);
 583         dragPolicies.getChildren().add(fixed);
 584         bottomBox.getChildren().add(dragPolicies);
 585 
 586         ToggleGroup orientation = new ToggleGroup();
 587         orientation.selectedToggleProperty().addListener(observable -> {
 588             if (orientation.getSelectedToggle() == null) {
 589                 tabPane.setNodeOrientation(NodeOrientation.LEFT_TO_RIGHT);
 590             } else {
 591                 tabPane.setNodeOrientation((NodeOrientation) orientation.getSelectedToggle().getUserData());
 592             }
 593             tabPane.requestFocus();
 594         });
 595 
 596         ToggleButton ltr = new ToggleButton("LEFT TO RIGHT");
 597         ltr.setSelected(true);
 598         ltr.setUserData(NodeOrientation.LEFT_TO_RIGHT);
 599         ltr.setToggleGroup(orientation);
 600         ToggleButton rtl = new ToggleButton("RIGHT TO LEFT");
 601         rtl.setUserData(NodeOrientation.RIGHT_TO_LEFT);
 602         rtl.setToggleGroup(orientation);
 603         VBox orientations = new VBox();
 604         orientations.setSpacing(5);
 605         orientations.getChildren().add(new Label("Node Orientations"));
 606         orientations.getChildren().add(ltr);
 607         orientations.getChildren().add(rtl);
 608         bottomBox.getChildren().add(orientations);
 609 
 610         HBox angleContainer = new HBox();
 611         Label angleLabel = new Label("Angle: ");
 612         TextField angleTF = new TextField("0");
 613         angleTF.setMaxWidth(50);
 614         angleContainer.getChildren().addAll(angleLabel, angleTF);
 615         Label rotLabel = new Label("Rotate TabPane");
 616         Button rotate = new Button("ROTATE");
 617         rotate.setOnMouseClicked(event -> {
 618             try {
 619                 tabPane.setRotate(Float.parseFloat(angleTF.getText()));
 620                 angleErr.setText("");
 621             } catch (Exception e) {
 622                 angleErr.setText("Incorrect Angle");
 623             }
 624             tabPane.requestFocus();
 625         });
 626         VBox rotation = new VBox();
 627         rotation.setSpacing(5);
 628         rotation.getChildren().addAll(rotLabel, angleContainer, rotate, angleErr);
 629         bottomBox.getChildren().add(rotation);
 630 
 631         Label reverseLabel = new Label("Reverse order of tabs");
 632         Button reverse = new Button("REVERSE");
 633         reverse.setOnMouseClicked(event -> {
 634             tabPane.getTabs().sort((o1, o2) -> {
 635                 if (tabPane.getTabs().indexOf(o1) > tabPane.getTabs().indexOf(o2)) {
 636                     return -1;
 637                 } else {
 638                     return 1;
 639                 }
 640             });
 641             tabPane.requestFocus();
 642         });
 643         VBox revContainer = new VBox();
 644         revContainer.setSpacing(5);
 645         revContainer.getChildren().addAll(reverseLabel, reverse);
 646         bottomBox.getChildren().add(revContainer);
 647 
 648         bottomBox.setOnMousePressed(event -> {
 649             angleErr.setText("");
 650             indexErr.setText("");
 651         });
 652         mainContent.getChildren().add(bottomBox);
 653         return mainContent;
 654     }
 655 
 656     private void setupInternalTab() {
 657         StackPane internalTabContent = new StackPane();
 658 
 659         Rectangle r = new Rectangle(700, 500);
 660         r.setFill(Color.LIGHTSTEELBLUE);
 661         internalTabContent.getChildren().add(r);
 662 
 663         final TabPane internalTabPane = new TabPane();
 664         internalTabPane.getStyleClass().add(TabPane.STYLE_CLASS_FLOATING);
 665         internalTabPane.setSide(Side.LEFT);
 666         internalTabPane.setPrefSize(500, 500);
 667         {
 668             final Tab tab = new Tab();
 669             tab.setText("Tab 1");
 670             final VBox vbox = new VBox();
 671             vbox.setSpacing(10);
 672             vbox.setTranslateX(10);
 673             vbox.setTranslateY(10);
 674             {
 675                 Button b = new Button("Toggle Tab Position");
 676                 b.setOnAction(new EventHandler<ActionEvent>() {
 677                     @Override public void handle(ActionEvent e) {
 678                         toggleTabPosition(internalTabPane);
 679                     }
 680                 });
 681                 vbox.getChildren().add(b);
 682             }
 683             {
 684                 Button b = new Button("Toggle Tab Mode");
 685                 b.setOnAction(new EventHandler<ActionEvent>() {
 686                     @Override public void handle(ActionEvent e) {
 687                         toggleTabMode(internalTabPane);
 688                     }
 689                 });
 690                 vbox.getChildren().add(b);
 691             }
 692             tab.setContent(vbox);
 693             internalTabPane.getTabs().add(tab);
 694         }
 695         {
 696             final Tab tab = new Tab();
 697             tab.setText("Tab 2");
 698             final VBox vbox = new VBox();
 699             vbox.setSpacing(10);
 700             vbox.setTranslateX(10);
 701             vbox.setTranslateY(10);
 702             Button b = new Button("Button 2");
 703             vbox.getChildren().add(b);
 704             tab.setContent(vbox);
 705             internalTabPane.getTabs().add(tab);
 706         }
 707         {
 708             final Tab tab = new Tab();
 709             tab.setText("Tab 3");
 710             final VBox vbox = new VBox();
 711             vbox.setSpacing(10);
 712             vbox.setTranslateX(10);
 713             vbox.setTranslateY(10);
 714             Button b = new Button("Button 3");
 715             vbox.getChildren().add(b);
 716             tab.setContent(vbox);
 717             internalTabPane.getTabs().add(tab);
 718         }
 719         for (int i = 4; i < 10; i++) {
 720             Tab tab = new Tab();
 721             tab.setText("Tab " + i);
 722             tab.setContent(new Region());
 723             internalTabPane.getTabs().add(tab);
 724         }
 725         internalTabContent.getChildren().add(internalTabPane);
 726         internalTab.setContent(internalTabContent);
 727     }
 728 
 729     private void setupMultipleInteralTabs() {
 730         String tabStrings[] = { "Labrador", "Poodle", "Boxer"/*, "Great Dane"*/ };
 731         FlowPane flow = new FlowPane();
 732         flow.setHgap(20);
 733         flow.setVgap(20);
 734         flow.setPrefWrapLength(500);
 735 
 736         TabPane internalTabPane = new TabPane();
 737         for(String tabstring : tabStrings) {
 738             Tab tab = new Tab();
 739             tab.setText(tabstring);
 740             StackPane stack = new StackPane();
 741             Rectangle rect = new Rectangle(200,200, Color.LIGHTSTEELBLUE);
 742             stack.getChildren().addAll(rect, new Button(" A type of dog: "+tabstring));
 743             tab.setContent(stack);
 744             internalTabPane.getTabs().add(tab);
 745         }
 746         flow.getChildren().add(internalTabPane);
 747 
 748         internalTabPane = new TabPane();
 749         internalTabPane.setSide(Side.RIGHT);
 750         for(String tabstring : tabStrings) {
 751             Tab tab = new Tab();
 752             tab.setText(tabstring);
 753             StackPane stack = new StackPane();
 754             Rectangle rect = new Rectangle(200,200, Color.ANTIQUEWHITE);
 755             stack.getChildren().addAll(rect, new Button(" A type of dog: "+tabstring));
 756             tab.setContent(stack);                    internalTabPane.getTabs().add(tab);
 757         }
 758         flow.getChildren().add(internalTabPane);
 759 
 760         internalTabPane = new TabPane();
 761         internalTabPane.setSide(Side.BOTTOM);
 762         for(String tabstring : tabStrings) {
 763             Tab tab = new Tab();
 764             tab.setText(tabstring);
 765             StackPane stack = new StackPane();
 766             Rectangle rect = new Rectangle(200,200, Color.YELLOWGREEN);
 767             stack.getChildren().addAll(rect, new Button(" A type of dog: "+tabstring));
 768             tab.setContent(stack);                    internalTabPane.getTabs().add(tab);
 769         }
 770         flow.getChildren().add(internalTabPane);
 771 
 772         internalTabPane = new TabPane();
 773         internalTabPane.setSide(Side.LEFT);
 774         for(String tabstring : tabStrings) {
 775             Tab tab = new Tab();
 776             tab.setText(tabstring);
 777             StackPane stack = new StackPane();
 778             Rectangle rect = new Rectangle(200,200, Color.RED);
 779             stack.getChildren().addAll(rect, new Button(" A type of dog: "+tabstring));
 780             tab.setContent(stack);                    internalTabPane.getTabs().add(tab);
 781         }
 782         flow.getChildren().add(internalTabPane);
 783         multipleTabs.setContent(flow);
 784     }
 785 
 786     private void toggleTabPosition(TabPane tabPane) {
 787         Side pos = tabPane.getSide();
 788         if (pos == Side.TOP) {
 789             tabPane.setSide(Side.RIGHT);
 790         } else if (pos == Side.RIGHT) {
 791             tabPane.setSide(Side.BOTTOM);
 792         } else if (pos == Side.BOTTOM) {
 793             tabPane.setSide(Side.LEFT);
 794         } else {
 795             tabPane.setSide(Side.TOP);
 796         }
 797     }
 798 
 799     private void toggleTabMode(TabPane tabPane) {
 800         if (!tabPane.getStyleClass().contains(TabPane.STYLE_CLASS_FLOATING)) {
 801             tabPane.getStyleClass().add(TabPane.STYLE_CLASS_FLOATING);
 802         } else {
 803             tabPane.getStyleClass().remove(TabPane.STYLE_CLASS_FLOATING);
 804         }
 805     }
 806 
 807     private void setUpPopupMenu() {
 808         menu = new ContextMenu();
 809         menu.getItems().add(new MenuItem("Item 1"));
 810         menu.getItems().add(new MenuItem("Item 2"));
 811         menu.getItems().add(new MenuItem("Item 3"));
 812         menu.getItems().add(new MenuItem("Item 4"));
 813         menu.getItems().add(new MenuItem("Item 5"));
 814         menu.getItems().add(new MenuItem("Item 6"));
 815     }
 816 }
 817